🛠 Flux de capteur analogique vers Android

Arduino Mega ADK (Rev3) · intermediaire · Schéma : IMG-mega-adk-intermediaire-2-mega-adk-flux-capteur-android.svg — Potentiomètre sur A0, trames envoyées au téléphone Android via le port USB-A host, jauge de mesure à l'écran

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

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

  1. 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.
  2. Oublier Usb.Task entre deux SndData : les transferts USB ne progressent plus, la jauge se fige.
  3. Bombardement sans contrôle : au-delà du débit utile, les envois échouent silencieusement ; vérifiez la valeur de retour de SndData.
  4. 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.
  5. 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.
  6. 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

← Retour à la fiche 🛠 Tous les tutoriels