🛠 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

Objetivos

Enviar continuamente el valor de un sensor analógico (potenciómetro en A0) a un mini panel de control Android: la placa envía tramas binarias compactas, la aplicación las decodifica y muestra un indicador. Se ponen en práctica las 16 entradas analógicas de 10 bits del ATmega2560 y los dos endpoints bulk del protocolo AOA. Elección de un formato de trama: 3 bytes [0x80][byte más significativo][byte menos significativo] por medición, más fácil de decodificar en Java que un flujo ASCII sin delimitador.

Material

Código completo

En la placa (emisión de tramas a 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
}

En Android (decodificación + indicador):

// 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).

Verificación esperada

El indicador de Android sigue al potenciómetro casi en tiempo real (10 mediciones/s). Al desconectar el cable, la aplicación no se bloquea: la lectura lanza una IOException y la interfaz pasa al estado «desconectado». El valor mostrado permanece coherente con la consola serie si se añade un Serial.println de control.

Errores frecuentes

  1. Enviar enteros en ASCII sin delimitador: el receptor no puede encontrar los límites de la trama — prefiera el formato binario de longitud fija o termine cada línea con \n.
  2. Olvidar Usb.Task entre dos SndData: las transferencias USB dejan de avanzar, el indicador se congela.
  3. Envío masivo sin control: por encima del caudal útil, los envíos fallan silenciosamente; verifique el valor de retorno de SndData.
  4. El teléfono en modo de suspensión profunda que corta la alimentación USB: la placa debe detectar la desconexión (isReady falso) y volver a esperar sin reiniciarse.
  5. Presupuesto de alimentación superado: sin una fuente externa ≥ 1,5 A, la carga del teléfono + la placa satura los 500 mA disponibles en el USB y el enlace falla intermitentemente.
  6. El fusible autorrearmable de 500 mA del puerto host se dispara si un dispositivo externo está en cortocircuito: el puerto permanece inactivo unos segundos, luego se rearma solo.

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales