🛠 Contrôler une LED depuis Android
Objetivos
Invertir el sentido del flujo: un control deslizante de luminosidad en la aplicación Android controla en directo un LED mediante PWM en la Mega ADK. Es el esquema de control del antiguo DemoKit oficial (tramas [comando][pin][valor]) que reducimos a lo esencial. Repasamos los 15 canales PWM (pines 2 a 13 y 44 a 46) y la puesta en estado seguro cuando el teléfono se desconecta.
Material
- 1 × Arduino Mega ADK + fuente de alimentación externa de 7–12 V, se recomienda 1,5 A
- 1 × LED + resistencia de 220 Ω en el pin 9 (PWM válido)
- 1 × teléfono Android + cable USB-A → micro-USB/USB-C
- Biblioteca: USB Host Shield 2.0 (clase ADK)
- Pin 7 prohibido (RST del MAX3421E)
Código completo
Lado de la placa (recepción de órdenes PWM):
// mega-adk-controle-led-android.ino — Board: "Arduino Mega ADK"
#include <Usb.h>
#include <usbhub.h>
#include <adk.h>
USB Usb;
USBHub hub0(&Usb);
ADK adk(&Usb, "AtelierADK", "PilotageLED", "LED PWM broche 9",
"1.0", "http://example.org", "SN000003");
const byte LED = 9; // PWM : broches 2-13 et 44-46
void setup {
Serial.begin(115200);
pinMode(LED, OUTPUT);
if (Usb.Init == -1) { Serial.println(F("OSCOKIRQ failed to assert")); while (1); }
}
void loop {
Usb.Task;
if (!adk.isReady) { analogWrite(LED, 0); return; } // état sûr
uint8_t trame[3]; uint16_t len = sizeof(trame);
// trame [0x02][LED][0..255] envoyée par l'application
if (adk.RcvData(&len, trame) == 0 && len == 3 && trame[0] == 0x02) {
analogWrite(trame[1], trame[2]);
Serial.print(F("PWM broche ")); Serial.print(trame[1]);
Serial.print(F(" = ")); Serial.println(trame[2]);
}
delay(5);
}
Lado Android (control deslizante SeekBar 0–255):
// PilotageActivity.java (extrait) — SeekBar -> trame [0x02][9][valeur]
SeekBar curseur = findViewById(R.id.curseurLuminosite);
curseur.setMax(255);
curseur.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener {
@Override public void onProgressChanged(SeekBar s, int valeur, boolean parUtilisateur) {
if (!parUtilisateur || out == null) return;
try {
byte[] trame = { 0x02, 9, (byte) valeur };
out.write(trame); // FileOutputStream sur l'accessoire
} catch (IOException deconnexion) { etatDeconnecte; }
}
@Override public void onStartTrackingTouch(SeekBar s) { }
@Override public void onStopTrackingTouch(SeekBar s) { }
});
// L'activité gère aussi ACTION_USB_ACCESSORY_DETACHED pour griser le curseur.
Verificación esperada
El control deslizante hace variar la luminosidad del LED sin latencia perceptible (trama de 3 bytes en cada cambio). Cuando se retira el cable, el LED se apaga (estado seguro analogWrite(LED, 0)) y la aplicación deshabilita el control deslizante. La consola muestra cada orden recibida con su valor.
Errores frecuentes
- LED en un pin no PWM (por ejemplo, 14): analogWrite no produce ningún efecto — verificar la lista 2-13 y 44-46.
- Estado seguro olvidado: sin el restablecimiento a 0 cuando adk.isReady es falso, el LED permanece encendido con la última consigna tras la desconexión.
- Inversión de los bytes de la trama entre el código Java y el código Arduino: probar primero con un valor fijo (128) antes de conectar el control deslizante.
- Reinicio de la consigna en cada Usb.Task: no reescribir analogWrite en bucle con un valor por defecto, de lo contrario el control deslizante «no obedece».
- Inundar el enlace con una escritura por píxel del control deslizante: sin drenar Usb.Task con suficiente frecuencia, las escrituras se acumulan; mantener el delay(5) en el lado de la placa o limitar la cadencia en el lado de la aplicación.
- Permiso USB no concedido al reconectar: la aplicación debe volver a solicitar el permiso después de ACTION_USB_ACCESSORY_ATTACHED, de lo contrario el flujo permanece null.
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