Far comunicare Arduino e Android tramite USB è davvero un gioco da ragazzi con la libreria usb-serial-for-android!

Questa è una libreria che contiene dei driver per CDC, FTDI, Arduino e altri dispositivi!
Quindi permette una comunicazione tramite porta USB su android, a partire dalla dalla versione 3.1+ di Android.

Non è richiesto l’accesso di root, ADK o altri speciali driver del kernel; Tutti i driver necessari sono già implementati in Java. Quel che otterremo alla fine sarà un accesso grezzo alla porta seriale attraverso le funzioni read(), write() ed altre funzioni di base.

Iniziamo

Quel che andremo a realizzare è una comunicazione fra la nota board di prototipazione, Arduino. E uno smartphone (o tablet che si voglia), equipaggiato con sistema operativo Android!

Il progetto di oggi, si scompone in quello che è il collegamento fisico fra i due dispositivi e la parte software per stabilire una comunicazione.

Il collegamento vero e proprio

Il collegamento dei due device avviene in modo semplicissimo, attraverso un cavo USB OTG. Solitamente venduto a pochi euro. E’ un cavetto che ha da un lato un connettore micro USB maschio, e dall’altro lato un’uscita USB femmina.

connessione usb arduino e android

Il software di comunicazione

La parte software per stabilire la comunicazione si affida ad una libreria esterna!
La libreria di cui parliamo è gratuitamente disponibile su github. Attualmente è giunta alla versione v0.1.0. E’ presente pure un google group ufficiale dedicato.

Realizzare l’app Android

Se vogliamo far comunicare Arduino con Android, è bene iniziare un nuovo progetto per la creazione di un App, utilizzando l’IDE che più ci aggrada (Eclipse ADT oppure Android Studio).
Si presuppone di avere già un minimo di familiarità con lo sviluppo di app android.
Il passo successivo alla creazione di un nuovo progetto consiste nel linkare le librerie al progetto, da Eclipse:

1. Selezioniamo il progetto –> Import –> Existing Projects Into Workspace:

usb arduino android 1

2. Navigate fino a usb-serial-for-android/ e continuate:

usb arduino android 2

3. Ctrl+click sulla vostra app e selezionate “Properties”, dopo “Build Path”.

4. Nella scheda “Projects”, aggiungete “UsbSerialLibrary”:

usb arduino android 3

5. Nella scheda “Order and Export”, assicuratevi che ci sia la spunta sulla voce “UsbSerialLibrary”:

usb arduino android 4

6. Ora cliccate sul pannello di sinistra su “Android” e nella sezione Librerie, schiacciate il pulsante Add, e aggiungete UsbSerialLibrary:

usb arduino android 5

L’import è adesso completato!

Il prossimo passo

Il passo successivo consiste nel copiare il file device_filter.xml nella cartella res/xml/ del vostro progetto!

Il file device_filter.xml è questo:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- 0x0403 / 0x6001: FTDI FT232R UART -->
    <usb-device vendor-id="1027" product-id="24577" />
 
    <!-- 0x2341 / Arduino -->
    <usb-device vendor-id="9025" />
 
    <!-- 0x16C0 / 0x0483: Teensyduino  -->
    <usb-device vendor-id="5824" product-id="1155" />
 
    <!-- 0x10C4 / 0xEA60: CP210x UART Bridge -->
    <usb-device vendor-id="4292" product-id="60000" />
 
</resources>

Configuriamo il manifesto di Android

Configuriamo l’AndroidManifest.xml per notificare all’app quando un dispositivo viene collegato (Guardate la documentazione ufficiale sugli Host USB per delucidazioni).

<activity
    android:name="..."
    ...>
  <intent-filter>
    <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
  </intent-filter>
  <meta-data
      android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" 
      android:resource="@xml/device_filter" />
</activity>

Pronti all’utilizzo!

Le fasi di configurazione iniziale sono complete.

Qui di seguito un pezzo di codice che legge qualche dato da seriale e stampa le informazioni sulla console di Android:

// Find all available drivers from attached devices.
UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
List<UsbSerialDriver> availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager);
if (availableDrivers.isEmpty()) {
  return;
}
 
// Open a connection to the first available driver.
UsbSerialDriver driver = availableDrivers.get(0);
UsbDeviceConnection connection = manager.openDevice(driver.getDevice());
if (connection == null) {
  // You probably need to call UsbManager.requestPermission(driver.getDevice(), ..)
  return;
}
 
// Read some data! Most have just one port (port 0).
UsbSerialPort port = driver.getPort(0);
port.open(connection);
try {
  port.setBaudRate(115200);
  byte buffer[] = new byte[16];
  int numBytesRead = port.read(buffer, 1000);
  Log.d(TAG, "Read " + numBytesRead + " bytes.");
} catch (IOException e) {
  // Deal with error.
} finally {
  port.close();
}

Se invece volete provare qualcosa di più funzionale, consigliamo questo progetto d’esempio già pronto all’uso.

Con il relativo Sketch per Arduino:

// Esempio di sketch per Arduino, da usare con usb-serial-for-android.
// Stampa un counter ad incremento continuo, e scrive indietro qualsiasi cosa riceva.
 
static int counter = 0;
void setup() {
  Serial.begin(115200);
}
 
void loop() {
  Serial.print("Tick #");
  Serial.print(counter++, DEC);
  Serial.print("\n");
 
  if (Serial.peek() != -1) {
    Serial.print("Read: ");
    do {
      Serial.print((char) Serial.read());
    } while (Serial.peek() != -1);
    Serial.print("\n");
  }
  delay(1000);
}

Dispositivi Compatibili

Di seguito alcuni link e informazioni utili sui dispositivi compatibili (sia smartphone che chip seriali):

– Chip Seriali compatibili: FT232R, CDC/ACM (esempio. Arduino Uno) e potenzialmente molti altri, tenete d’occhio la pagina ufficiale sui dispositivi seriali compatibili.

– Tablet e Smartphone Android compatibili: Nexus 7, Motorola Xoom, e molti altri. Ecco una lista dei dispositivi la cui compatibilità è accertata.

usb-serial-for-android è scritto e mantenuto da Mike Wakerly