🛠 Contrôler une LED depuis Android

Arduino Mega ADK (Rev3) · intermediaire · Schéma : IMG-mega-adk-intermediaire-3-mega-adk-controle-led-android.svg — Curseur de luminosité sur le téléphone, commandes PWM reçues par la Mega ADK, LED sur la broche 9

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

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

  1. LED en un pin no PWM (por ejemplo, 14): analogWrite no produce ningún efecto — verificar la lista 2-13 y 44-46.
  2. 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.
  3. 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.
  4. 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».
  5. 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.
  6. 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

← Volver a la ficha 🛠 Todos los tutoriales