lunedì 19 ottobre 2015

DIY Homekit con Arduino

Dopo un primo esperimento con DIY HomeKit (a questo post) non ero particolarmente contento perche' comunque i costi di Raspberry e la gestione in generale non erano ottimali ed ho provato a replicare la cosa su Arduino


Per il modulo Bluetooth ho usato un modulo Bluetooth LE HM-10 del costo di circa 5 euro (qui). Attenzione, non tutti i moduli BT per Arduino supportano BT4 LE. Il modulo riporta sul retro la scritta AC-BT-V4 ed al comando AT+NAME? risponde con HMSoft

Il modulo si comanda tramite stringhe AT (per l'elenco completo dei comandi si puo' leggere qui il manuale di istruzioni)

Cio' che interessa e' la sequenza di comando
AT+ROLE1
AT+IMME1
AT+DISI?

all'ultimo comando il dispositivo risponde in questo modo
---------------------------------------------------------
OK+DISIS
OK+DISC:4C000215:B9407F30F5F8466EAFF925556B57FE6D:71884DF6B6:F1A84DF67188:-086
OK+DISC:00000000:00000000000000000000000000000000:0000000000:C493974F69E2:-084
OK+DISC:4C000215:B9407F30F5F8466EAFF925556B57FE6D:DB2A91AEB6:D81691AEDB2A:-084
OK+DISCE
---------------------------------------------------------
Sono stati avvistati 3 beacons (due Estimote ed un Eddystone riconoscibile da tutti zeri perche' il protocollo non e' riconosciuto)

Prendendo la riga evidenziata in giallo
iBeacon ID = B9407F30F5F8466EAFF925556B57FE6D
Major = 7188
Minor = 4DF6
Measured power (182 decimale) =B6
Mac Address = F1A84DF67188
RSSI = -86

Passando quindi ad Arduino

I collegamenti sono banali (verra' usata la Seriale Software di Arduino)
BT VCC +3.3V Arduino
BT GND GND Arduino
BT RXD D2 Arduino
BT TXD D3 Arduino

Nello sketch seguente se viene individuato il beacon con minor AEB6 viene attivato il pin D13 in modo da aprire il contatto su un rele'; se per piu' di 50 secondi non viene piu' messo in lista il beacon con minor AEB6 il pin D13 va Low e si chiude il rele (il codice si commenta da solo)

--------------------------------------------------------------------------------------
#include <SoftwareSerial.h>

SoftwareSerial mySerial(3, 2); 
char risposta[115];
int conta;
int rele = 13;
long tempo;

void setup()  
{
  Serial.begin(9600);
  mySerial.begin(9600);
  mySerial.write("AT+ROLE1");
  mySerial.write("AT+IMME1");
  if (mySerial.available())
     {
       while (mySerial.available()>0){
       }
     }
     
  pinMode(rele, OUTPUT);
  tempo = 0; 
}

void loop() 
{
  mySerial.write("AT+DISI?");
  if (mySerial.available())
     {
       conta = 0;
       while (mySerial.available()>0){
         risposta[conta] = mySerial.read();
         conta = conta + 1;
       }
     }   
  if ((risposta[56] == 'A') && (risposta[57] == 'E') && (risposta[58] == 'B') && (risposta[59] == '6')) 
    {
      //Serial.println("ATTENZIONE");
      digitalWrite(rele, HIGH);
      tempo = 0;
    }
  delay(500);
  tempo = tempo + 1;
  if (tempo > 100)
        {
          digitalWrite(rele, LOW);
          tempo = 101;
        }
  
}

venerdì 9 ottobre 2015

Confronto tra moduli GPS per Arduino

Per riprendere il discorso che avevo iniziato qui con Android, mi sono comprato un paio di moduli GPS Breakout da interfacciare ad Arduino

Avevo quindi la necessita' di comprare due moduli GPS uguali e mi sono orientato sul GPS Breakout di Adafruit. Ho fatto l'errore pero' di comprarne un modulo su Aliexpress ed uno su RobotItaly



Indicativamente i due moduli sembrano identici ma si osservi  che quello acquistato da RobotItaly riporta sulla faccia la sigla Adafruit mentre quello comprato in Cina non ha la sigla sul davanti mentre sul retro riporta Deek-Robot. A parte cio' la disposizione dei componenti e' simile a parte il fatto che il led del Fix e' rosso su Adafruit e' rosso mentre e' verde su Deek-Robot (a livello di prezzo sono quasi simili, 40 Euro per Adafruit contro circa 25 Euro per Deek-Robot)

Entrambi sono dichiarati avere in chipset MTK3339 (22 satelliti su 66 canali) abilitati a ricevere correzione SBAS/WAAS

Oltre  al livello hardware, ho potuto notare alcune differenze penso a livello di firmware. Il modello DeekRobot e' estremamente veloce nel fare il fix del punto ed ad acquisire il fix del DPGS oltre a ricevere un elevato numero di satelliti al contrario del modello Adafruit  a cui occorrono anche minuti per fare il fix normale ed il fix DGPS. Peraltro quando il componente DeekRoboto ha ottenuto il fix GPS non lampeggia il led mentre quello Adafruit continua ad accendere il led anche a fix acquisito

Messi a confronto con una acquisizione in parallelo in condizioni ottimali di visibilita' del cielo (da 7 a 8 satelliti visibili) si osserva il comportamento completamente differente dei dati registrati


I dati di Adafruit (in blu) sono molto raggruppati attorno a quello che e' il punto vero di misura (peraltro il valore medio della misura corrisponde alla posizione reale) mentre i dati di Deek-Robot (in verde) mostrano una deriva del segnale anche molto lontano dal punto reale di misure (i due GPS erano ubicati affiancati a distanza di 40 cm con un tempo di acquisizione di oltre 15 minuti)

I due punti gialli sono il baricentro delle due serie di misura. Il baricentro della serie verde e' esterno alla nuvola dei punti mentre quello della serie blu si trova al centro della propria nuvola dei punti

Da questa prova i risultati dei due componenti sono totalmente differenti e non correlabili.

La stessa prova e' stata fatta anche in ambiente urbano con una visibilita' del cielo limitata dalla presenza di alti palazzi (in genere erano visibili solo 5 satelliti)


In questo caso la distribuzione dei dati e' molto piu' spargliata (come prevedibile). C'e' pero da osservare un dettaglio; plottando Lat_GPS1 contro Lat_GPS2 e Lon_GPS1 contro Lon_GPS2 si osserva un tracciato che mostra una curiosa similarita' (i punti di medesimo colore sono relativi allo stesso minuto di acquisizione)

Correlazione Latitudine
Correlazione Longitudine
Plottando la distanza tra i punti dei due GPS (mettendo insieme dati ad uguale orario) si continua ad osservare una correlazione (seppure variabile nel tempo)


In conclusione, nonostante la somiglianza dei due componenti, questi si comportano in modo differenti e non e'stato possibile ripetere l'esperienza fatta con i due telefoni Android. Da un punto di vista della scelta, il componente Adafruit, nonostante la lentezza nell'effettuare il fix gps ed il fix dgps e nonostante la difficolta' ad agganciare un alto numero di satelliti sembra ottenere le prestazioni migliori in condizioni di cielo aperto e prestazioni simili ad Deek Robot in ambiente urbano




mercoledì 7 ottobre 2015

Copia ricorsiva con Bash

In alcuni casi, per esempio copiare tutti i file mp3 da una collezione, puo' essere utile un comando che cerchi in automatico tutti i file con una determinata estensione e li metta tutti in una directory senza rispettare l'albero delle directory originario.
Tale operazione puo' essere fatta con un solo comando


find . -name "*.mp3" -type f -exec cp {} ../destinazione/ \;

(attenzione allo spazio tra l'ultima slash e backslah)

martedì 6 ottobre 2015

Ibernazione Xbee


In questo esempio viene mostrato come impostare la modalita' di ibernazione di un modulo Xbee utilizzando un pin comandato da Arduino


Per prima cosa si deve procedere ad una modifica hardware sullo shield Xbee saldando un connettore da piedino 9 dello Xbee e portandolo dentro la porta D9 di Arduino
Se il pin 9 di Xbee si trova nello stato low (ground) viene abilitata la trasmissione/ricezione del modulo, se il pin 9 si trova nello stato high (che per Xbee vuol dire 3.3 V !!) la radio viene spenta

Visto che su Arduino le uscite digitali sono a 5 V (e contrariamente a quello che viene citato qui che non ci sono problemi ad alimentare un piedino a 3.3V con un tensione da 5V) lo sketch Arduino utilizza la modalita' PWM del pin D9 di Arduino per impostare un corrente di 3.3 V

Dal punto di vista software bisogna configurare XBee con XCTU a funzionare come End Device (si puo' fare questa modificando solo modificando il firmware mediante Update Firmware) e modificando i valori di Serial Interfacing/D7 DIO7 Configuration su 0 Disable ed impostando SM ad 1 (Pin Wake Mode)


----------------------------------------------------------------------
#define XBEE_SLEEP 9

void setup() {
  //setta il pin 9 come controllo dello sleep di XBEE
  pinMode(XBEE_SLEEP,OUTPUT);
  analogWrite(XBEE_SLEEP,0);
}

void loop() { 
analogWrite(XBEE_SLEEP,168); //spenge XBEE, 3.3V PWM  
delay(sleep_time); //tempo di standby
analogWrite(XBEE_SLEEP,0); //risveglia XBEE
}
----------------------------------------------------------------------

In trasmissione l'assorbimento di corrente arriva fino a 50 mA (compreso il microcontrollore Arduino) mentre a radio spenta si hanno valori intorno ai 10 mA

lunedì 5 ottobre 2015

Configurazione moduli XBee

Per impostare un modulo Xbee si possono utilizzare vari dispositivi.
Il primo passo e' pero' trovare un socket che permetta di connettere il modulo Xbee. A causa della distanza dei piedini non e' possibile inserire Xbee su una breadboard standard

Utilizzo di Arduino
Si puo' utilizzare una Arduino come programmatore di XBee ponticellando i pin RST e GND (cio' esclude il collegamento del processore a bordo dell'Arduino) e collegando i pin TX-TX ed RX-RX tra Arduino e Xbee (di solito si usa collegare incrociando TX ed RX ma in questo caso e' giusto cosi')




FOCA Board
Una soluzione a basso costo (meno di 10 euro) e' quello di utilizzare una FOCA Board . Da notare l'orientamento del modulo con l'antenna in direzione della USB (sulla schedina non sono riportate indicazioni molto chiari su quale sia la numerazione dei pin). Importante: prima di connettere la corrente sincerarsi che l'interruttore/selettore bianco sulla Foca Board sia impostato su 3.3 V


XBee Explorer Usb
Simile alla FOCA Board ma decisamente piu' costosa (circa 30 euro) c'e' la XBee Explorer. Le indicazioni dei pin sono molto chiare

Funduino Xbee
Per terminare c'e' il modulo Xbee di Funduino (che sul mercato cinese si trova anche a 5 euro)
Per orientare la Xbee basta seguire il disegno stampato sulla piastra (l'antenna e' dalla parte opposta alla porta USB)


Leggere la porta seriale da Linux

Alcune volte puo' essere utile leggere il flusso da una porta seriale in Linux direttamente da shell senza passare da Minicom o simili

Per esempio si puo' leggere il flusso seriale da una Arduino (che di solito e'configurata come 9600 8N1)
Per prima cosa si devono impostare le giuste configurazione per la porta seriale (una Arduino collegata via USB ad una Linux Box di solito si presenta su /dev/ttyACM0

stty -F /dev/ttyACM0 raw ispeed 9600 ospeed 9600 cs8 -ignpar -cstopb -echo
dopo di cio' e' sufficiente 

cat /dev/ttyACM0

per vedere il flusso dati

venerdì 2 ottobre 2015

Soddisfazioni

Quando un amico/cliente ti manda un SMS come quello sotto riportato ti rendi conto che il tuo lavoro non e' proprio inutile (sorvoliamo sull'italiano....)


Debugger integrato ESP32S3

Aggiornamento In realta' il Jtag USB funziona anche sui moduli cinesi Il problema risiede  nell'ID USB della porta Jtag. Nel modulo...