🛠 Flux de capteur analogique vers Android
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
- 1 × Arduino Mega ADK + fuente de alimentación externa de 7–12 V, 1,5 A (presupuesto: 750 mA para el teléfono + placa, 750 mA para sensores/actuadores)
- 1 × potenciómetro de 10 kΩ: extremos en 5 V y GND, cursor en A0
- 1 × teléfono Android + cable USB-A → micro-USB/USB-C
- Biblioteca: USB Host Shield 2.0 (clase ADK)
- Pin 7 dejado libre (RST del MAX3421E)
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
- 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.
- Olvidar Usb.Task entre dos SndData: las transferencias USB dejan de avanzar, el indicador se congela.
- Envío masivo sin control: por encima del caudal útil, los envíos fallan silenciosamente; verifique el valor de retorno de SndData.
- 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.
- 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.
- 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
clignotante.inoArduinobouton-led.inoArduinoscan-hote-usb.inoArduinoadk-chat-android.inoArduinoadk-telemetrie.inoArduinohote-clavier-usb.inoArduino