🛠 Flux de capteur analogique vers Android
Objectifs
Faire remonter en continu la valeur d'un capteur analogique (potentiomètre sur A0) vers un mini tableau de bord Android : la carte envoie des trames binaires compactes, l'application les décode et affiche une jauge. On met en pratique les 16 entrées analogiques 10 bits de l'ATmega2560 et les deux endpoints bulk du protocole AOA. Choix d'un format de trame : 3 octets [0x80][poids fort][poids faible] par mesure, plus simple à décoder côté Java qu'un flux ASCII sans délimiteur.
Matériel
- 1 × Arduino Mega ADK + alimentation externe 7–12 V, 1,5 A (budget : 750 mA pour téléphone + carte, 750 mA pour capteurs/actionneurs)
- 1 × potentiomètre 10 kΩ : extrémités sur 5 V et GND, curseur sur A0
- 1 × téléphone Android + câble USB-A → micro-USB/USB-C
- Bibliothèque : USB Host Shield 2.0 (classe ADK)
- Broche 7 laissée libre (RST du MAX3421E)
Code complet
Côté carte (émission de trames à 10 Hz) :
// mega-adk-flux-capteur-android.ino — Board: "Arduino Mega ADK"
#include <Usb.h>
#include <usbhub.h>
#include <adk.h>
USB Usb;
USBHub hub0(&Usb);
ADK adk(&Usb, "AtelierADK", "FluxCapteur", "Trames capteur A0",
"1.0", "http://example.org", "SN000002");
const byte CANAL = A0;
void setup {
Serial.begin(115200);
if (Usb.Init == -1) { Serial.println(F("OSCOKIRQ failed to assert")); while (1); }
}
void loop {
Usb.Task;
if (!adk.isReady) return;
int v = analogRead(CANAL); // 0..1023
uint8_t trame[3] = { 0x80, (uint8_t)(v >> 8), (uint8_t)(v & 0xFF) };
if (adk.SndData(3, trame) != 0) { // échec d'envoi : téléphone parti
Serial.println(F("Telephone debranche"));
}
delay(100); // 10 Hz
}
Côté Android (décodage + jauge) :
// FluxActivity.java (extrait) — lit les trames [0x80][hi][lo]
private void boucleFlux {
byte[] entete = new byte[1];
byte[] corps = new byte[2];
try {
while (in.read(entete) == 1) {
if (entete[0] != (byte) 0x80) continue; // resynchronisation
if (in.read(corps) != 2) break;
final int valeur = ((corps[0] & 0xFF) << 8) | (corps[1] & 0xFF);
runOnUiThread( -> {
jauge.setProgress(valeur); // ProgressBar max=1023
texte.setText("Capteur A0 : " + valeur + " / 1023");
});
}
} catch (IOException deconnexion) { /* câble retiré */ }
}
// En cas de trame coupée (téléphone en veille), on resynchronise sur 0x80 :
// un en-tête unique 0x80 est rare dans les données 0-1023 (hi vaut 0 ou 3 max).
Vérification attendue
La jauge Android suit le potentiomètre en quasi temps réel (10 mesures/s). En débranchant le câble, l'application ne plante pas : la lecture lève une IOException et l'interface se met à l'état « déconnecté ». La valeur affichée reste cohérente avec la console série si vous ajoutez un Serial.println de contrôle.
Erreurs fréquentes
- Envoyer des entiers ASCII sans délimiteur : le récepteur ne peut pas retrouver les limites de trame — préférez le binaire à longueur fixe ou terminez chaque ligne par \n.
- Oublier Usb.Task entre deux SndData : les transferts USB ne progressent plus, la jauge se fige.
- Bombardement sans contrôle : au-delà du débit utile, les envois échouent silencieusement ; vérifiez la valeur de retour de SndData.
- Téléphone en veille profonde qui coupe l'alimentation USB : la carte doit détecter la déconnexion (isReady faux) et repasser en attente sans redémarrer.
- Budget d'alimentation dépassé : sans alimentation externe ≥ 1,5 A, la charge du téléphone + la carte saturent les 500 mA disponibles sur l'USB et le lien tombe par intermittence.
- Le polyfuse 500 mA du port host se déclenche si un périphérique externe est en court-circuit : le port reste mort quelques secondes, puis se réarme tout seul.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.inoArduinobouton-led.inoArduinoscan-hote-usb.inoArduinoadk-chat-android.inoArduinoadk-telemetrie.inoArduinohote-clavier-usb.inoArduino