Sono arrivato al punto di connettere l'Ublox M8T ad Arduino. La connessione, come nel suo fratello minore, e' banale perche' basta connettere Vcc (in questo caso 5V), GND e Tx al D2 di Arduino
Lo sketch e' una banale modifica dell'esempio di SoftwareSerial
------------------------------------------
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // RX,TX
void setup()
{
Serial.begin(9600);
mySerial.begin(9600);
}
void loop()
{
if (mySerial.available())
Serial.write(mySerial.read());
}
------------------------------------------
Il problema e' che sulla porta seriale UART1 di Ublox di default vengono trasmessi solo i dati NMEA ed anche abilitando i messaggi UBX questi si vedono passare sulla porta USB e non sulla UART1
Cio' deriva dal fatto che i messaggi UBX su UART1 devono essere esplicitamente abilitati da U-Center andando nel menu Configuration View (CTRL+F9), MSG, dalla tendina si selezione RXM-RAWX, si spunta la UART1 e si preme SEND
A questo punto si vedranno i messaggi raw UBX anche sulla porta seriale
venerdì 4 marzo 2016
giovedì 3 marzo 2016
Arduino Xbee Shield + USB Shield ???
Sto provando a mettere insieme un sistema un minimo complicato utilizzando Arduino ed al momento di montarlo mi sono accorto che non e' possibile accoppiare insieme lo shield USB e lo Shield XBee,
Normalmente gli shield si connettono alla Arduino di base utilizzando il connettore ISCP 3x2 pint che si trova all'estrema destra della foto superiore tra i pin D0 ed A5
Questo connettore, oltre a replicare i pin D13,D12,D11 e D10 della porta SPI porta anche i contatti Vcc, Gnd e reset.
In Shield come il Solar Shield il conettore e' passante, nel senso che i contatti dal basso vengono portati sopra la scheda per metterli a disposizione di un altro shield
Il problema e' che l'USB shield non replica verso l'alto tali contatti. Si vede chiaramente l'assenza nella foto sottostante. Poco male si dira' perche' comunque vengono replicati verso l'alto tutti i contatti sulle due strisce laterali (compresi quindi anche D13,D12,D11,D10 Vcc e Gnd)
Il problema che lo Xbee Shield non ha contatti nella zona di potenza (quindi nei pin da IREF a Vin) e l'unica sorgente di alimentazione deriva dal connettore ISCP
Anche invertendo l'ordine, mettendo prima lo Xbee Shield e poi in alto l'USB Shield, la situazione non migliora perche' Xbee shield non espone verso l'alto nessun contatto di alimentazione
In conclusione non risulta possibile, a meno di non fare una patch volante, utilizzare contemporaneamente Xbee Shield e USB Shield su Arduino
Normalmente gli shield si connettono alla Arduino di base utilizzando il connettore ISCP 3x2 pint che si trova all'estrema destra della foto superiore tra i pin D0 ed A5
Questo connettore, oltre a replicare i pin D13,D12,D11 e D10 della porta SPI porta anche i contatti Vcc, Gnd e reset.
In Shield come il Solar Shield il conettore e' passante, nel senso che i contatti dal basso vengono portati sopra la scheda per metterli a disposizione di un altro shield
Solar Shield |
Il problema e' che l'USB shield non replica verso l'alto tali contatti. Si vede chiaramente l'assenza nella foto sottostante. Poco male si dira' perche' comunque vengono replicati verso l'alto tutti i contatti sulle due strisce laterali (compresi quindi anche D13,D12,D11,D10 Vcc e Gnd)
USB Shield |
Anche invertendo l'ordine, mettendo prima lo Xbee Shield e poi in alto l'USB Shield, la situazione non migliora perche' Xbee shield non espone verso l'alto nessun contatto di alimentazione
In conclusione non risulta possibile, a meno di non fare una patch volante, utilizzare contemporaneamente Xbee Shield e USB Shield su Arduino
mercoledì 2 marzo 2016
PL2303 falsificato : error code 10
Mi sono comprato su un e-commerce cinese un paio di cavi USB to 232TTL PL2303HX (avevo bisogno della doppia tensione a 5V e 3.3 V) al prezzo ridicolo 1.33 euro l'uno
Il dispositivo inserito in una Linux Box si mostra come segue e funziona correttamente
--------------------------------------------------
Mar 1 14:04:53 luca-ThinkPad-X201 kernel: [ 623.298691] usb 2-1.2: new full-speed USB device number 10 using ehci-pci
Mar 1 14:04:53 luca-ThinkPad-X201 kernel: [ 623.392179] usb 2-1.2: New USB device found, idVendor=067b, idProduct=2303
Mar 1 14:04:53 luca-ThinkPad-X201 kernel: [ 623.392184] usb 2-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
Mar 1 14:04:53 luca-ThinkPad-X201 kernel: [ 623.392188] usb 2-1.2: Product: USB-Serial Controller
Mar 1 14:04:53 luca-ThinkPad-X201 kernel: [ 623.392191] usb 2-1.2: Manufacturer: Prolific Technology Inc.
Mar 1 14:04:53 luca-ThinkPad-X201 mtp-probe: checking bus 2, device 10:"/sys/devices/pci0000:00/0000: 00:1d.0/usb2/2-1/2-1.2"
Mar 1 14:04:53 luca-ThinkPad-X201 mtp-probe: bus: 2, device: 10 was notan MTP device
Mar 1 14:04:54 luca-ThinkPad-X201 kernel: [ 624.422524] usbcore:registered new interface driver pl2303
Mar 1 14:04:54 luca-ThinkPad-X201 kernel: [ 624.422561] usbserial: USB Serial support registered for pl2303
Mar 1 14:04:54 luca-ThinkPad-X201 kernel: [ 624.422589] pl2303 2-1.2:1.0: pl2303 converter detected
Mar 1 14:04:54 luca-ThinkPad-X201 kernel: [ 624.424404] usb 2-1.2: pl2303 converter now attached to ttyUSB1
--------------------------------------------------
mentre una volta inserito in un PC Windows, una volta installato il driver scaricato dalla Prolific, all'inserimento del dispositivo, viene generato un Error Code 10.
Dopo aver frugato un po' su Internet ho scoperto che si tratta di un problema relativo a chip Porolific contraffatti. La Prolific, per evitare questo problema, distribuisce dei driver che sono in grado di verificare l'originalita' del dispositivo ed in caso contrario ne impedisce l'uso (su Linux il problema ovviamente non esiste perche' il driver non e' svilutppato da Prolific)
L' unica soluzione e' quella di non installare l'ultima versione del driver ma ricorrere a versioni vecchiotte (che comunque funzionano)
Il dispositivo inserito in una Linux Box si mostra come segue e funziona correttamente
--------------------------------------------------
Mar 1 14:04:53 luca-ThinkPad-X201 kernel: [ 623.298691] usb 2-1.2: new full-speed USB device number 10 using ehci-pci
Mar 1 14:04:53 luca-ThinkPad-X201 kernel: [ 623.392179] usb 2-1.2: New USB device found, idVendor=067b, idProduct=2303
Mar 1 14:04:53 luca-ThinkPad-X201 kernel: [ 623.392184] usb 2-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
Mar 1 14:04:53 luca-ThinkPad-X201 kernel: [ 623.392188] usb 2-1.2: Product: USB-Serial Controller
Mar 1 14:04:53 luca-ThinkPad-X201 kernel: [ 623.392191] usb 2-1.2: Manufacturer: Prolific Technology Inc.
Mar 1 14:04:53 luca-ThinkPad-X201 mtp-probe: checking bus 2, device 10:"/sys/devices/pci0000:00/0000:
Mar 1 14:04:53 luca-ThinkPad-X201 mtp-probe: bus: 2, device: 10 was notan MTP device
Mar 1 14:04:54 luca-ThinkPad-X201 kernel: [ 624.422524] usbcore:registered new interface driver pl2303
Mar 1 14:04:54 luca-ThinkPad-X201 kernel: [ 624.422561] usbserial: USB Serial support registered for pl2303
Mar 1 14:04:54 luca-ThinkPad-X201 kernel: [ 624.422589] pl2303 2-1.2:1.0: pl2303 converter detected
Mar 1 14:04:54 luca-ThinkPad-X201 kernel: [ 624.424404] usb 2-1.2: pl2303 converter now attached to ttyUSB1
--------------------------------------------------
mentre una volta inserito in un PC Windows, una volta installato il driver scaricato dalla Prolific, all'inserimento del dispositivo, viene generato un Error Code 10.
Dopo aver frugato un po' su Internet ho scoperto che si tratta di un problema relativo a chip Porolific contraffatti. La Prolific, per evitare questo problema, distribuisce dei driver che sono in grado di verificare l'originalita' del dispositivo ed in caso contrario ne impedisce l'uso (su Linux il problema ovviamente non esiste perche' il driver non e' svilutppato da Prolific)
L' unica soluzione e' quella di non installare l'ultima versione del driver ma ricorrere a versioni vecchiotte (che comunque funzionano)
lunedì 29 febbraio 2016
Esperimento di video 3D con Nintendo 3DS su Youtube
La Nintendo 3DS e' un giocattolo (indicativamente bambini piccoli a vedere il parco giochi) ma e' anche un oggetto per la presenza di uno schermo in auto stereoscopia
E' anche interessante la presenza di una coppia di fotocamere che permette di realizzare stereocoppie in modo semplice e con una geometria non modificabile. Aggiornando il firmware e' possibile, oltre alle stereocoppie, realizzare anche video stereo
I dati sono salvati nella SD Card del dispositivo e sono in formato MJPG (estensione del file .AVI). Per visualizzare i video su Youtube si deve prima installare il codec MPJPG da SourceForge
Dopo l'installazione si apre VFW Configuratione e si abilita il Decoder MJPEG portandolo a libavcodec
Si installa quindi Stereo Movie Maker e si apre il file .avi precedentemente salvato
non c'e' bisogno di allineare le due semimeta' dello schermo perche' sono gia' sincronizzate
Si salva il file mettendo il flag in Side-by-Side e definendo il codec di compressione (questa ultima fase e' in po' a prove per trovare quello giusto)
Effettuando l'upload su Youtube viene riconosciuto il formato ma si puo' comunque indicare che si tratta di un filmato 3D. In Youtube versione desktop il filmato viene visualizzato come anaglifo (da visualizzare con gli occhialini a lenti rosse e blu) mentre su Android lo schermo viene diviso in due meta' per poter essere visualizzato con Google Cardboard
Lo stesso risultato si puo' ottenere con ffmpeg ma e' piu' macchinoso
martedì 23 febbraio 2016
Mini Tennis su Arduino
Sono abbastanza vecchio da aver giocato a Pong sulle consolle di fine anni 70-inizio anni 80 (in particolare alla versione Polistil) ed avendo una mezz'ora libera ed un schermo oled SSD1306 (32x128 pixel) ho voluto provare a farmi la mia versione di Pong con Arduino
Questo progettino e' fatto soltanto per divertirsi e per imparare ad usare l'SSD1306, non c'e' nessuna pretesa di giocabilita'
Come sul pong originale il controllo della racchetta avviene mediante un potenziometro.
Via via che il gioco va avanti la velocita' della palla aumenta
// -------------------------------------------------------------------------------------
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
int x;
int y;
int dx = 2;
int dy = 2;
int yb = 0;
int punteggio;
int contatore;
int ritardo;
#if (SSD1306_LCDHEIGHT != 32)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
void setup() {
Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.display();
delay(200);
punteggio = 48; //codice ASCII per il numero zero
x = 64;
y = random(30);
contatore = 0;
ritardo = 40;
randomSeed(analogRead(0));
}
void loop() {
x = x + dx;
y = y + dy;
display.clearDisplay();
// disegna il punto
display.drawPixel(x, y, WHITE);
//disegna il punteggio
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(120,0);
display.write(punteggio);
//display.display();
//legge il potenziometro
int pot = analogRead(A2);
Serial.println(pot);
yb = round(pot/25);
// disegna il rettangolo
display.fillRect(1, yb, 2, 7, 1);
display.display();
// se trova una parete rimbalza
if (x >= 127) dx = -dx;
if (y >= 31) dy = -dy;
//if (x <= 1) dx = -dx;
if (y <= 1) dy = -dy;
// se e' sulla parete di destra controlla la posizione
// della barra
// se rimbalza inverte la direzione
if (x < 7)
{
if ((y >= yb) && (y <= yb+7))
{
dx = -dx;
// dopo 10 rimbalzi consecutivi il gioco si fa piu' veloce
contatore = contatore + 1;
if (contatore == 3)
{
contatore = 0;
ritardo = ritardo = ritardo - 3;
}
}
else
{
punteggio = punteggio + 1;
delay(500);
x = 64;
y = random(30);
dx = 2;
dy = 2;
ritardo = 40;
contatore = 0;
}
}
delay(ritardo);
}
Pong della Polistil |
Questo progettino e' fatto soltanto per divertirsi e per imparare ad usare l'SSD1306, non c'e' nessuna pretesa di giocabilita'
Come sul pong originale il controllo della racchetta avviene mediante un potenziometro.
Via via che il gioco va avanti la velocita' della palla aumenta
// -------------------------------------------------------------------------------------
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
int x;
int y;
int dx = 2;
int dy = 2;
int yb = 0;
int punteggio;
int contatore;
int ritardo;
#if (SSD1306_LCDHEIGHT != 32)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
void setup() {
Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.display();
delay(200);
punteggio = 48; //codice ASCII per il numero zero
x = 64;
y = random(30);
contatore = 0;
ritardo = 40;
randomSeed(analogRead(0));
}
void loop() {
x = x + dx;
y = y + dy;
display.clearDisplay();
// disegna il punto
display.drawPixel(x, y, WHITE);
//disegna il punteggio
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(120,0);
display.write(punteggio);
//display.display();
//legge il potenziometro
int pot = analogRead(A2);
Serial.println(pot);
yb = round(pot/25);
// disegna il rettangolo
display.fillRect(1, yb, 2, 7, 1);
display.display();
// se trova una parete rimbalza
if (x >= 127) dx = -dx;
if (y >= 31) dy = -dy;
//if (x <= 1) dx = -dx;
if (y <= 1) dy = -dy;
// se e' sulla parete di destra controlla la posizione
// della barra
// se rimbalza inverte la direzione
if (x < 7)
{
if ((y >= yb) && (y <= yb+7))
{
dx = -dx;
// dopo 10 rimbalzi consecutivi il gioco si fa piu' veloce
contatore = contatore + 1;
if (contatore == 3)
{
contatore = 0;
ritardo = ritardo = ritardo - 3;
}
}
else
{
punteggio = punteggio + 1;
delay(500);
x = 64;
y = random(30);
dx = 2;
dy = 2;
ritardo = 40;
contatore = 0;
}
}
delay(ritardo);
}
lunedì 22 febbraio 2016
Validazione UBlox M8T
Tempo fa avevo provato a validare il modulo GPS di Adafruit (con pessimi risultati) usando un punto trigonometrico di coordinate conosciute
Stavolta e' stato il turno dell'UBlox M8T
Il sistema e' stato messo in registrazione dei dati in modalita' binaria e poi i dati sono stati postprocessati mediante RTKPost di RTKLib in modo differenziale con la registrazione dell'antenna dell'ex Provincia di Firenze (i dati sono scaricabili da qui, in formato Rinex compresso e aggiornati ogni ora con passo a 30 secondi)
Come si vede si ottiene il fix del punto differenziale dopo circa 5 minuti di registrazione (il che corrisponde a circa 10 misure visto il passo a 30 secondi)
Una volta ottenuto il fix la posizione e' molto stabile (dell'ordine del centimetro)
2016/02/18 09:21:00.000 43.833049301 11.307061053 203.6658 1 7 0.0016 0.0011 0.0027 0.0006 -0.0005 -0.0013 0.00 22.2
Visto che l'antenna della Provincia ha una posizione conosciuta si puo' tentare anche il posizionamento assoluto del punto di misura dell'Ublox
Secondo quanto riportato dal calcolo di post processing la posizione incognita risulta essere
Lat = 43.8330496301
Long = 11.307061053
(conversione effettuata mediante questo servizio online)
che corrisponde in coordinate metriche Gauss Boaga Fuso Ovest a
N = 1685517.05
E = 4855934.20
secondo quanto riportato dalla scheda del punto trigonometrico (fonte Regione Toscana) la posizione del punto in coordinate metriche e'
N = 1685517.43
E = 4855934.06
in conclusione la differenza di posizione e' di circa 38 cm su N e 14 cm su E. In realta', come si vede dalla figura, l'antenna non era posizionata esattamente al centro del chiodo ma spostata di circa 20 cm e si deve tenere conto anche dell'incertezza sulla conversione)
Si puo' dire che l'Ublox M8T e' validato con postprocessing per precisione alla decina di centimetri
Stavolta e' stato il turno dell'UBlox M8T
Il sistema e' stato messo in registrazione dei dati in modalita' binaria e poi i dati sono stati postprocessati mediante RTKPost di RTKLib in modo differenziale con la registrazione dell'antenna dell'ex Provincia di Firenze (i dati sono scaricabili da qui, in formato Rinex compresso e aggiornati ogni ora con passo a 30 secondi)
Come si vede si ottiene il fix del punto differenziale dopo circa 5 minuti di registrazione (il che corrisponde a circa 10 misure visto il passo a 30 secondi)
Una volta ottenuto il fix la posizione e' molto stabile (dell'ordine del centimetro)
2016/02/18 09:21:00.000 43.833049301 11.307061053 203.6658 1 7 0.0016 0.0011 0.0027 0.0006 -0.0005 -0.0013 0.00 22.2
Secondo quanto riportato dal calcolo di post processing la posizione incognita risulta essere
Lat = 43.8330496301
Long = 11.307061053
(conversione effettuata mediante questo servizio online)
che corrisponde in coordinate metriche Gauss Boaga Fuso Ovest a
N = 1685517.05
E = 4855934.20
N = 1685517.43
E = 4855934.06
in conclusione la differenza di posizione e' di circa 38 cm su N e 14 cm su E. In realta', come si vede dalla figura, l'antenna non era posizionata esattamente al centro del chiodo ma spostata di circa 20 cm e si deve tenere conto anche dell'incertezza sulla conversione)
Si puo' dire che l'Ublox M8T e' validato con postprocessing per precisione alla decina di centimetri
Disabilitare video su Raspberry
Spesso uso la Raspberry in modalita' headless.
Adesso visto che lavoro ad un progetto in cui e' necessario risparmiare energia ho voluto provare a vedere se e' possibile disabilitare l'output da HDMI e da Video-Out (il connettore giallo) e se cio' diminuisce i consumi
Senza modifiche il consumo di Raspberry e' di circa 330 mA.
Mediante il comando
/opt/vc/bin/tvservice --off
e' possibile disabilitare completamente l'output video. In questa modalita' il consumo passa a circa 300 mA con un risparmio di circa il 10%. Non tantissimo ma puo' valere la pena di usare questa funzionalita' in caso di alimentazione a batteria
Adesso visto che lavoro ad un progetto in cui e' necessario risparmiare energia ho voluto provare a vedere se e' possibile disabilitare l'output da HDMI e da Video-Out (il connettore giallo) e se cio' diminuisce i consumi
Senza modifiche il consumo di Raspberry e' di circa 330 mA.
Mediante il comando
/opt/vc/bin/tvservice --off
e' possibile disabilitare completamente l'output video. In questa modalita' il consumo passa a circa 300 mA con un risparmio di circa il 10%. Non tantissimo ma puo' valere la pena di usare questa funzionalita' in caso di alimentazione a batteria
Iscriviti a:
Post (Atom)
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...
-
In questo post viene indicato come creare uno scatterplot dinamico basato da dati ripresi da un file csv (nel dettaglio il file csv e' c...
-
Questo post e' a seguito di quanto gia' visto nella precedente prova Lo scopo e' sempre il solito: creare un sistema che permet...
-
La scheda ESP32-2432S028R monta un Esp Dev Module con uno schermo TFT a driver ILI9341 di 320x240 pixels 16 bit colore.Il sito di riferiment...