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
Consolle seriale su Raspberry
La possibilita' di amministrare una Raspberry via porta seriale e' particolarmente utile nel caso di una Pi Zero, vista l'assenza di una scheda di rete preinstallata.
La Raspberry dispone di una porta seriale TTL (in /dev/ttyAMA0) sui pin GPIO 8 (TX) ed 10 (RX) a cui si puo' connettere un modulo FTDI (attenzione, deve essere a 3.3 V pena il rischio di bruciare la porta). Attenzione: deve essere connesso anche il GND, l'alimentazione non e' obbligatoria ed e' necessaria solo se la Raspberry non ha nessuna altra alimentazione
Normalmente su questa porta seriale (115200, 8N1) vengono dirottati i messaggi di boot del kernel ma in Raspbian, tramite raspi-config (Avanzato,opzione A8) e' possibile ottenere una shell collegandosi via seriale
Dal PC, per connettersi alla Raspberry si utilizza il comando screen
screen /dev/ttyUSB0 115200
Ovviamente se e' impostata questa funzione la porta seriale non sara' disponibile per altri usi, come per esempio interfacciarsi con una Arduino. In questo caso dovranno essere disabilitati, oltre alla shell mediante raspi-config, anche i messaggi di boot modificando il file in /boot/cmdline.txt
La Raspberry dispone di una porta seriale TTL (in /dev/ttyAMA0) sui pin GPIO 8 (TX) ed 10 (RX) a cui si puo' connettere un modulo FTDI (attenzione, deve essere a 3.3 V pena il rischio di bruciare la porta). Attenzione: deve essere connesso anche il GND, l'alimentazione non e' obbligatoria ed e' necessaria solo se la Raspberry non ha nessuna altra alimentazione
Normalmente su questa porta seriale (115200, 8N1) vengono dirottati i messaggi di boot del kernel ma in Raspbian, tramite raspi-config (Avanzato,opzione A8) e' possibile ottenere una shell collegandosi via seriale
![]() |
| Schermata di raspi-config |
screen /dev/ttyUSB0 115200
Ovviamente se e' impostata questa funzione la porta seriale non sara' disponibile per altri usi, come per esempio interfacciarsi con una Arduino. In questo caso dovranno essere disabilitati, oltre alla shell mediante raspi-config, anche i messaggi di boot modificando il file in /boot/cmdline.txt
giovedì 18 febbraio 2016
RTKLib su Raspberry
Allo scopo di usare una attrezzatura piu' leggera e di maggiore durata di batteria ho provato ad accoppiare l'UBlox M8T ad una Raspberry B alimentando il tutto con un power bank da 10000 mAh
Per fare cio' era necessario compilare le RTKLib sulla Raspbian. La compilazione e' avvenuta senza nessuna modifica rispetto a quella che si esegue su desktop e rtkrcv funziona correttamente anche su Raspberry (ovviamente ci vuole molta pazienza per compilare i sorgenti data la velocita' del processore)
Per scaricare i dati e' stato sufficiente abilitare l'SFTP e connettersi con un cavo cross da portatile
Per fare cio' era necessario compilare le RTKLib sulla Raspbian. La compilazione e' avvenuta senza nessuna modifica rispetto a quella che si esegue su desktop e rtkrcv funziona correttamente anche su Raspberry (ovviamente ci vuole molta pazienza per compilare i sorgenti data la velocita' del processore)
Per scaricare i dati e' stato sufficiente abilitare l'SFTP e connettersi con un cavo cross da portatile
giovedì 11 febbraio 2016
RTKLib postprocessing base e rover
Viene qui descritta una prova di post processing i dati di un Ublox M8T mediante il software RTKLib
L'attrezzatura e' costituita da una base Leica 500 ed un modulo Ublox M8T in acquisizione raw collegato ad un pc Debian
L'attrezzatura e' costituita da una base Leica 500 ed un modulo Ublox M8T in acquisizione raw collegato ad un pc Debian
Il Leica 500 era configurato per una acquisizione al secondo (come l'Ublox) e permette la registrazione di L1+L2 mentre l'M8T acquisisce solo L1
Entrambi i dispositivi erano statici al momento dell'acquisizione
Questa e' la mappa dei punti derivati da una acquisizione senza post processing
Come si vede i dati sono distribuiti su un'area di raggio di circa 3 m. (la zona di acquisizione aveva alberi e non era particolarmente ben esposta)
I dati del Leica 500 sono stati esportati in Rinex mediante il proprio software mentre i dati binari dell'Ublox sono stati convertiti in Rinex con RTKLib
L'elaborazione del dato e' stata effettuata con RTKPost sotto Windows e mostra come i dati dell'Ublox risultino migliori con fluttuazioni di circa +/- 20 cm rispetto al punto medio
--------------------------------------------------------
Se non si ha una stazione base si puo' sfruttare lo stesso principio per migliorare le misure basandosi su stazioni di misura che distribuiscono dati su Internet come la rete RING (nel mio caso la stazione piu' vicina e' quella di Carmignano di Prato). I dati vengono distribuiti in directory che hanno come nome il giorno progressivo dell'anno .... per esempio il giorno 8 febbraio 2016 si trovera' nella cartella 039 e cosi' via
I dati si possono scaricare il giorno successivo a quello dell'acquisizione e sono in formato Rinex compatto (CRinex). Per poterlo usare con RTKPost deve essere convertito in Rinex standard mediante il software crx2rnx che e' incluso nel pacchetto di RTKLib
Questi sono i risultati di una prova. In questo caso ci sono oltre 20 chilometri tra l'Ublox e la stazione remota (che risulta essere dalla scheda anagrafica un Leica 1200) ed il passo di campionamento e' differente perche' la stazione remota registra dati solo ogni 30 secondi
La distribuzione dei punti senza correzione e' molto migliore del caso precedente perche' l'antenna GPS M8T e' stata montata su un tetto; comunque i punti sono compresi in un cerchio di +/- 1 m rispetto al punto medio
Per migliorare il dato, oltre ai file Rinex, si possono scaricare da qui i dati relativi alle effemeridi dei satelliti . I dati sono organizzati in directory secondo il criterio settimana_gps_numero del giorno. Per esempio il giorno 10 febbraio 2016 corrisponde alla cartella 1883 (ovvero la 1883° settimana GPS) ed il giorno mercoledi' corrisponde al codice 3 (0=domenica). Le effemeridi sono nel file .sp3 e sono divise in 4 file di 6 ore ciascuno (per i dati delle ore 10 si deve scarica il file igu18833_06.sp3).
Lo stesso si puo' fare per i dati del modello della ionosfera da ftp://ems.estesc.esa.int/pub/ dove sono distribuiti file .ems sempre con il formato del giorno progressivo (in questo caso mercoledi' 10 febbraio corrisponde alla directory d041 in cui i dati sono poi divisi per ora)
Nelle opzioni deve essere scelto il passo di campionamento piu' lento (in questo caso quello della base a 30 secondi)
Anche in questo caso e' visibile un miglioramento del dato grezzo (gia' peraltro buono) con una incertezza dell'ordine di 20 cm
mercoledì 10 febbraio 2016
RTKLib e Ublox M8T su Debian
RTKLib e' un software per gestire dati GPS in modalita' avanzata. Viene fornita una versione gia' compilata per Windows ma e' possibile farlo funzionare anche su Linux compilando i sorgenti (su Linux non e' prevista l'interfaccia grafica ma solo i programmi a linea di comando)
Si parte scaricando il pacchetto da GitHub (questo perche' e' disponibile una versione piu' avanzata rispetto a quella linkata sul sito.
Prima di iniziare si devono soddisfare le dipendenze
sudo apt-get install build-essential
sudo apt-get install automake
sudo apt-get install checkinstall
sudo apt-get install liblapack3gf
sudo apt-get install libblas3gf
dopo aver scompattato il pacchetto di GitHub si entra nella directory app e si lancia la compilazione con
makeall.sh
in questo modo si compila la versione 2.4.2 p11, ho avuto invece problemi con la 2.4.3
Connettendo la USB dell'Ublox M8T questo viene riconosciuto come seriale virtuale su /dev/ttyACM0
il programma per effettuare l'acquisizione dati si chiama rtkrcv e si configura mediante un file testo (io ho un po' barato nel senso che prima ho creato un file di configurazione con RTKNavi su Windows e poi lo ho importato, ovviamente modificando alcune parti, sulla Linux box)
Il file compilato si trova in RTKLIB-master/app/rtkrcv/gcc
File M8T.conf
--------------------------------------------------------
# RTKNAVI options (2016/02/08 17:25:54, v.2.4.3 b8)pos1-posmode =single # (0:single,1:dgps,2:kinematic,3:static,4:movingbase,5:fixed,6:ppp-kine,7:ppp-static,8:ppp-fixed)
pos1-frequency =l1 # (1:l1,2:l1+l2,3:l1+l2+l5,4:l1+l5)
pos1-soltype =forward # (0:forward,1:backward,2:combined)
pos1-elmask =15 # (deg)
pos1-snrmask_r =off # (0:off,1:on)
pos1-snrmask_b =off # (0:off,1:on)
pos1-snrmask_L1 =0,0,0,0,0,0,0,0,0
pos1-snrmask_L2 =0,0,0,0,0,0,0,0,0
pos1-snrmask_L5 =0,0,0,0,0,0,0,0,0
pos1-dynamics =off # (0:off,1:on)
pos1-tidecorr =off # (0:off,1:on,2:otl)
pos1-ionoopt =brdc # (0:off,1:brdc,2:sbas,3:dual-freq,4:est-stec,5:ionex-tec,6:qzs-brdc,7:qzs-lex,8:stec)
pos1-tropopt =saas # (0:off,1:saas,2:sbas,3:est-ztd,4:est-ztdgrad,5:ztd)
pos1-sateph =brdc # (0:brdc,1:precise,2:brdc+sbas,3:brdc+ssrapc,4:brdc+ssrcom)
pos1-posopt1 =off # (0:off,1:on)
pos1-posopt2 =off # (0:off,1:on)
pos1-posopt3 =off # (0:off,1:on,2:precise)
pos1-posopt4 =off # (0:off,1:on)
pos1-posopt5 =off # (0:off,1:on)
pos1-posopt6 =off # (0:off,1:on)
pos1-exclsats = # (prn ...)
pos1-navsys =1 # (1:gps+2:sbas+4:glo+8:gal+16:qzs+32:comp)
pos2-armode =continuous # (0:off,1:continuous,2:instantaneous,3:fix-and-hold)
pos2-gloarmode =off # (0:off,1:on,2:autocal)
pos2-bdsarmode =off # (0:off,1:on)
pos2-arthres =3
pos2-arthres1 =0.9999
pos2-arthres2 =0.25
pos2-arthres3 =0.1
pos2-arthres4 =0.05
pos2-arlockcnt =0
pos2-arelmask =0 # (deg)
pos2-arminfix =10
pos2-armaxiter =1
pos2-elmaskhold =0 # (deg)
pos2-aroutcnt =5
pos2-maxage =30 # (s)
pos2-syncsol =off # (0:off,1:on)
pos2-slipthres =0.05 # (m)
pos2-rejionno =30 # (m)
pos2-rejgdop =30
pos2-niter =1
pos2-baselen =0 # (m)
pos2-basesig =0 # (m)
out-solformat =llh # (0:llh,1:xyz,2:enu,3:nmea)
out-outhead =off # (0:off,1:on)
out-outopt =off # (0:off,1:on)
out-timesys =gpst # (0:gpst,1:utc,2:jst)
out-timeform =hms # (0:tow,1:hms)
out-timendec =3
out-degform =deg # (0:deg,1:dms)
out-fieldsep =
out-height =ellipsoidal # (0:ellipsoidal,1:geodetic)
out-geoid =internal # (0:internal,1:egm96,2:egm08_2.5,3:egm08_1,4:gsi2000)
out-solstatic =all # (0:all,1:single)
out-nmeaintv1 =0 # (s)
out-nmeaintv2 =0 # (s)
out-outstat =off # (0:off,1:state,2:residual)
stats-eratio1 =100
stats-eratio2 =100
stats-errphase =0.003 # (m)
stats-errphaseel =0.003 # (m)
stats-errphasebl =0 # (m/10km)
stats-errdoppler =1 # (Hz)
stats-stdbias =30 # (m)
stats-stdiono =0.03 # (m)
stats-stdtrop =0.3 # (m)
stats-prnaccelh =10 # (m/s^2)
stats-prnaccelv =10 # (m/s^2)
stats-prnbias =0.0001 # (m)
stats-prniono =0.001 # (m)
stats-prntrop =0.0001 # (m)
stats-prnpos =0 # (m)
stats-clkstab =5e-12 # (s/s)
ant1-postype =llh # (0:llh,1:xyz,2:single,3:posfile,4:rinexhead,5:rtcm)
ant1-pos1 =90 # (deg|m)
ant1-pos2 =0 # (deg|m)
ant1-pos3 =-6335367.6285 # (m|m)
ant1-anttype =
ant1-antdele =0 # (m)
ant1-antdeln =0 # (m)
ant1-antdelu =0 # (m)
ant2-postype =llh # (0:llh,1:xyz,2:single,3:posfile,4:rinexhead,5:rtcm)
ant2-pos1 =90 # (deg|m)
ant2-pos2 =0 # (deg|m)
ant2-pos3 =-6335367.6285 # (m|m)
ant2-anttype =
ant2-antdele =0 # (m)
ant2-antdeln =0 # (m)
ant2-antdelu =0 # (m)
misc-timeinterp =off # (0:off,1:on)
misc-sbasatsel =0 # (0:all)
misc-rnxopt1 =
misc-rnxopt2 =
misc-pppopt =
file-satantfile =
file-rcvantfile =
file-staposfile =
file-geoidfile =
file-ionofile =
file-dcbfile =
file-eopfile =
file-blqfile =
file-tempdir =C:\Temp
file-geexefile =
file-solstatfile =
file-tracefile =
file-cmdfile1 =ubx_m8t_glo_raw_1hz.cmd
#
inpstr1-type =serial # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,7:ntripcli,8:ftp,9:http)
inpstr2-type =off # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,7:ntripcli,8:ftp,9:http)
inpstr3-type =off # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,7:ntripcli,8:ftp,9:http)
inpstr1-path =ttyACM0:9600:8:n:1:off
inpstr2-path =
inpstr3-path =
inpstr1-format =ubx # (0:rtcm2,1:rtcm3,2:oem4,3:oem3,4:ubx,5:ss2,6:hemis,7:skytraq,8:gw10,9:javad,10:nvs,11:binex,12:rt17,15:sp3)
inpstr2-format =rtcm2 # (0:rtcm2,1:rtcm3,2:oem4,3:oem3,4:ubx,5:ss2,6:hemis,7:skytraq,8:gw10,9:javad,10:nvs,11:binex,12:rt17,15:sp3)
inpstr3-format =rtcm2 # (0:rtcm2,1:rtcm3,2:oem4,3:oem3,4:ubx,5:ss2,6:hemis,7:skytraq,8:gw10,9:javad,10:nvs,11:binex,12:rt17,15:sp3)
inpstr2-nmeareq =off # (0:off,1:latlon,2:single)
inpstr2-nmealat =0 # (deg)
inpstr2-nmealon =0 # (deg)
outstr1-type =file # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,6:ntripsvr)
outstr2-type =off # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,6:ntripsvr)
outstr1-path =./soluzioni.txt
outstr2-path =
outstr1-format =llh # (0:llh,1:xyz,2:enu,3:nmea)
outstr2-format =llh # (0:llh,1:xyz,2:enu,3:nmea)
logstr1-type =file # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,6:ntripsvr)
logstr2-type =off # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,6:ntripsvr)
logstr3-type =off # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,6:ntripsvr)
logstr1-path =./raw_data.ubx
logstr2-path =
logstr3-path =
misc-svrcycle =10 # (ms)
misc-timeout =10000 # (ms)
misc-reconnect =10000 # (ms)
misc-nmeacycle =5000 # (ms)
misc-buffsize =32768 # (bytes)
misc-navmsgsel =all # (0:all,1:rover,2:base,3:corr)
misc-proxyaddr =
misc-fswapmargin =30 # (s)
--------------------------------------------------------
Per abilitare la trasmissione dei pacchetti Ublox si deve chiamare il file ubx_mt8_glow_raw_1hz.cmd. Nella directory data di RTKLib sono presenti anche altri file a diversi passi di campionamento (5Hz e 10Hz) e da differenti impostazioni (ubx_m8t_bds_raw_1hz.cmd). Il file ubx_raw_1hz.cmd serve solo per cambiare il passo di campionamento ed e' sostanzialmente inutile
I dati vengono salvati in due file
soluzioni.txt e' un semplice file testo in cui vengono salvati i dati della posizione gia' elaborati (sono presenti anche le colonne sdn,sde,sdu,sdne,sdeu,sdun che sono rispettivamente la standard deviation nelle componenti Nord, Est, Z e quelle sulla componente Nord-Est, Est-Z e Z-Nord ). Questo fase e' sostanzialmente inutile per il postprocessing
In raw_data.ubx vengono salvati tutti i dati in uscita dalla seriale senza elaborazione ovvero le stringhe NMEA ed i pacchetti UBX binari. Questi ultimi possono essere utilizzati per il postprocessing convertendo i dati in Rinex mediante il programma convbin.
./convbin -od -os -oi -ot -f 1 data.ubx
Una volta creato il file M8T.conf si lancia ./rtkrcv e si apre una shell (altrimenti ./rtkrcv -o M8T.conf) . Si digita
load M8T.conf
restart
il sensore entra in acquisizione
per vedere l'avanzamento si puo' digitare status. Altrimenti si puo' digitare solution per vedere l'aggiornamento del punto GPS con i relativi errori. Spesso aggiungendo un numero alla fine del comando si setta il tempo di refresh del comando per esempio solution 1 aggiorna la posizione una volta al secondo
Per terminare il comando e' shutdown
Con questa soluzione e' possibile evitare di usare U-Center e Windows
![]() |
| Sistema di acquisizione Toughbook CF-18 con Debian collegato a Ublox M8T |
Si parte scaricando il pacchetto da GitHub (questo perche' e' disponibile una versione piu' avanzata rispetto a quella linkata sul sito.
Prima di iniziare si devono soddisfare le dipendenze
sudo apt-get install build-essential
sudo apt-get install automake
sudo apt-get install checkinstall
sudo apt-get install liblapack3gf
sudo apt-get install libblas3gf
dopo aver scompattato il pacchetto di GitHub si entra nella directory app e si lancia la compilazione con
makeall.sh
in questo modo si compila la versione 2.4.2 p11, ho avuto invece problemi con la 2.4.3
Connettendo la USB dell'Ublox M8T questo viene riconosciuto come seriale virtuale su /dev/ttyACM0
il programma per effettuare l'acquisizione dati si chiama rtkrcv e si configura mediante un file testo (io ho un po' barato nel senso che prima ho creato un file di configurazione con RTKNavi su Windows e poi lo ho importato, ovviamente modificando alcune parti, sulla Linux box)
Il file compilato si trova in RTKLIB-master/app/rtkrcv/gcc
File M8T.conf
--------------------------------------------------------
# RTKNAVI options (2016/02/08 17:25:54, v.2.4.3 b8)pos1-posmode =single # (0:single,1:dgps,2:kinematic,3:static,4:movingbase,5:fixed,6:ppp-kine,7:ppp-static,8:ppp-fixed)
pos1-frequency =l1 # (1:l1,2:l1+l2,3:l1+l2+l5,4:l1+l5)
pos1-soltype =forward # (0:forward,1:backward,2:combined)
pos1-elmask =15 # (deg)
pos1-snrmask_r =off # (0:off,1:on)
pos1-snrmask_b =off # (0:off,1:on)
pos1-snrmask_L1 =0,0,0,0,0,0,0,0,0
pos1-snrmask_L2 =0,0,0,0,0,0,0,0,0
pos1-snrmask_L5 =0,0,0,0,0,0,0,0,0
pos1-dynamics =off # (0:off,1:on)
pos1-tidecorr =off # (0:off,1:on,2:otl)
pos1-ionoopt =brdc # (0:off,1:brdc,2:sbas,3:dual-freq,4:est-stec,5:ionex-tec,6:qzs-brdc,7:qzs-lex,8:stec)
pos1-tropopt =saas # (0:off,1:saas,2:sbas,3:est-ztd,4:est-ztdgrad,5:ztd)
pos1-sateph =brdc # (0:brdc,1:precise,2:brdc+sbas,3:brdc+ssrapc,4:brdc+ssrcom)
pos1-posopt1 =off # (0:off,1:on)
pos1-posopt2 =off # (0:off,1:on)
pos1-posopt3 =off # (0:off,1:on,2:precise)
pos1-posopt4 =off # (0:off,1:on)
pos1-posopt5 =off # (0:off,1:on)
pos1-posopt6 =off # (0:off,1:on)
pos1-exclsats = # (prn ...)
pos1-navsys =1 # (1:gps+2:sbas+4:glo+8:gal+16:qzs+32:comp)
pos2-armode =continuous # (0:off,1:continuous,2:instantaneous,3:fix-and-hold)
pos2-gloarmode =off # (0:off,1:on,2:autocal)
pos2-bdsarmode =off # (0:off,1:on)
pos2-arthres =3
pos2-arthres1 =0.9999
pos2-arthres2 =0.25
pos2-arthres3 =0.1
pos2-arthres4 =0.05
pos2-arlockcnt =0
pos2-arelmask =0 # (deg)
pos2-arminfix =10
pos2-armaxiter =1
pos2-elmaskhold =0 # (deg)
pos2-aroutcnt =5
pos2-maxage =30 # (s)
pos2-syncsol =off # (0:off,1:on)
pos2-slipthres =0.05 # (m)
pos2-rejionno =30 # (m)
pos2-rejgdop =30
pos2-niter =1
pos2-baselen =0 # (m)
pos2-basesig =0 # (m)
out-solformat =llh # (0:llh,1:xyz,2:enu,3:nmea)
out-outhead =off # (0:off,1:on)
out-outopt =off # (0:off,1:on)
out-timesys =gpst # (0:gpst,1:utc,2:jst)
out-timeform =hms # (0:tow,1:hms)
out-timendec =3
out-degform =deg # (0:deg,1:dms)
out-fieldsep =
out-height =ellipsoidal # (0:ellipsoidal,1:geodetic)
out-geoid =internal # (0:internal,1:egm96,2:egm08_2.5,3:egm08_1,4:gsi2000)
out-solstatic =all # (0:all,1:single)
out-nmeaintv1 =0 # (s)
out-nmeaintv2 =0 # (s)
out-outstat =off # (0:off,1:state,2:residual)
stats-eratio1 =100
stats-eratio2 =100
stats-errphase =0.003 # (m)
stats-errphaseel =0.003 # (m)
stats-errphasebl =0 # (m/10km)
stats-errdoppler =1 # (Hz)
stats-stdbias =30 # (m)
stats-stdiono =0.03 # (m)
stats-stdtrop =0.3 # (m)
stats-prnaccelh =10 # (m/s^2)
stats-prnaccelv =10 # (m/s^2)
stats-prnbias =0.0001 # (m)
stats-prniono =0.001 # (m)
stats-prntrop =0.0001 # (m)
stats-prnpos =0 # (m)
stats-clkstab =5e-12 # (s/s)
ant1-postype =llh # (0:llh,1:xyz,2:single,3:posfile,4:rinexhead,5:rtcm)
ant1-pos1 =90 # (deg|m)
ant1-pos2 =0 # (deg|m)
ant1-pos3 =-6335367.6285 # (m|m)
ant1-anttype =
ant1-antdele =0 # (m)
ant1-antdeln =0 # (m)
ant1-antdelu =0 # (m)
ant2-postype =llh # (0:llh,1:xyz,2:single,3:posfile,4:rinexhead,5:rtcm)
ant2-pos1 =90 # (deg|m)
ant2-pos2 =0 # (deg|m)
ant2-pos3 =-6335367.6285 # (m|m)
ant2-anttype =
ant2-antdele =0 # (m)
ant2-antdeln =0 # (m)
ant2-antdelu =0 # (m)
misc-timeinterp =off # (0:off,1:on)
misc-sbasatsel =0 # (0:all)
misc-rnxopt1 =
misc-rnxopt2 =
misc-pppopt =
file-satantfile =
file-rcvantfile =
file-staposfile =
file-geoidfile =
file-ionofile =
file-dcbfile =
file-eopfile =
file-blqfile =
file-tempdir =C:\Temp
file-geexefile =
file-solstatfile =
file-tracefile =
file-cmdfile1 =ubx_m8t_glo_raw_1hz.cmd
#
inpstr1-type =serial # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,7:ntripcli,8:ftp,9:http)
inpstr2-type =off # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,7:ntripcli,8:ftp,9:http)
inpstr3-type =off # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,7:ntripcli,8:ftp,9:http)
inpstr1-path =ttyACM0:9600:8:n:1:off
inpstr2-path =
inpstr3-path =
inpstr1-format =ubx # (0:rtcm2,1:rtcm3,2:oem4,3:oem3,4:ubx,5:ss2,6:hemis,7:skytraq,8:gw10,9:javad,10:nvs,11:binex,12:rt17,15:sp3)
inpstr2-format =rtcm2 # (0:rtcm2,1:rtcm3,2:oem4,3:oem3,4:ubx,5:ss2,6:hemis,7:skytraq,8:gw10,9:javad,10:nvs,11:binex,12:rt17,15:sp3)
inpstr3-format =rtcm2 # (0:rtcm2,1:rtcm3,2:oem4,3:oem3,4:ubx,5:ss2,6:hemis,7:skytraq,8:gw10,9:javad,10:nvs,11:binex,12:rt17,15:sp3)
inpstr2-nmeareq =off # (0:off,1:latlon,2:single)
inpstr2-nmealat =0 # (deg)
inpstr2-nmealon =0 # (deg)
outstr1-type =file # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,6:ntripsvr)
outstr2-type =off # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,6:ntripsvr)
outstr1-path =./soluzioni.txt
outstr2-path =
outstr1-format =llh # (0:llh,1:xyz,2:enu,3:nmea)
outstr2-format =llh # (0:llh,1:xyz,2:enu,3:nmea)
logstr1-type =file # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,6:ntripsvr)
logstr2-type =off # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,6:ntripsvr)
logstr3-type =off # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,6:ntripsvr)
logstr1-path =./raw_data.ubx
logstr2-path =
logstr3-path =
misc-svrcycle =10 # (ms)
misc-timeout =10000 # (ms)
misc-reconnect =10000 # (ms)
misc-nmeacycle =5000 # (ms)
misc-buffsize =32768 # (bytes)
misc-navmsgsel =all # (0:all,1:rover,2:base,3:corr)
misc-proxyaddr =
misc-fswapmargin =30 # (s)
--------------------------------------------------------
Per abilitare la trasmissione dei pacchetti Ublox si deve chiamare il file ubx_mt8_glow_raw_1hz.cmd. Nella directory data di RTKLib sono presenti anche altri file a diversi passi di campionamento (5Hz e 10Hz) e da differenti impostazioni (ubx_m8t_bds_raw_1hz.cmd). Il file ubx_raw_1hz.cmd serve solo per cambiare il passo di campionamento ed e' sostanzialmente inutile
I dati vengono salvati in due file
soluzioni.txt e' un semplice file testo in cui vengono salvati i dati della posizione gia' elaborati (sono presenti anche le colonne sdn,sde,sdu,sdne,sdeu,sdun che sono rispettivamente la standard deviation nelle componenti Nord, Est, Z e quelle sulla componente Nord-Est, Est-Z e Z-Nord ). Questo fase e' sostanzialmente inutile per il postprocessing
In raw_data.ubx vengono salvati tutti i dati in uscita dalla seriale senza elaborazione ovvero le stringhe NMEA ed i pacchetti UBX binari. Questi ultimi possono essere utilizzati per il postprocessing convertendo i dati in Rinex mediante il programma convbin.
./convbin -od -os -oi -ot -f 1 data.ubx
Una volta creato il file M8T.conf si lancia ./rtkrcv e si apre una shell (altrimenti ./rtkrcv -o M8T.conf) . Si digita
load M8T.conf
restart
il sensore entra in acquisizione
per vedere l'avanzamento si puo' digitare status. Altrimenti si puo' digitare solution per vedere l'aggiornamento del punto GPS con i relativi errori. Spesso aggiungendo un numero alla fine del comando si setta il tempo di refresh del comando per esempio solution 1 aggiorna la posizione una volta al secondo
![]() |
| file .ubx con le stringhe NMEA e pacchetti binari UBX |
![]() |
| status |
![]() |
| satellite |
![]() |
| solution |
Per terminare il comando e' shutdown
Con questa soluzione e' possibile evitare di usare U-Center e Windows
lunedì 8 febbraio 2016
Linux su PS2
Correva l'anno 2002 (lavoravo ancora come tecnico informatico all'universita') quando usci la notizia che era possibile comprare un dev kit per modificare la PS2 per utilizzare Linux. La curiosita' per me era tanta ma il prezzo non trascurabile di una PS2 e la pessima distribuzione del kit (sostanzialmente Giappone e USA) hanno contribuito a non farmi mai provare la PS2 come computer
Di recente mi e' stata regalata una PS2 slim e non ho potuto esimermi dal provare Black Rhino, una distribuzione live DVD per Linux PS2 (questo e' un approccio molto differente dal Dev Kit per il quale era previsto una espansione con hard disk ed un connettore VGA ma si deve precisare che il DevKit era fatto esclusivamente per la PS2 prima generazione "Fat PS2" e non compatibile con la mia Slim PS2)
Dato che la mia PS2 non ha il modchip ed e' PAL ho scaricato il file ps2linux_live_v3_pal_large_no_modchip.7z
Per prima cosa bisogna avere una scheda di memoria di espansione di PS2 con installato Free MCBoot. Agli inizi del 2000 era piuttosto comune trovarla ed avendone una si poteva replicare su schede vuote. Oggi invece e' introvabile e sono riuscito a reperirne una su un e-commerce cinese al prezzo di circa 7 euro
Inserita l'espansione di memoria si accende la PS2 lasciando lo sportellino del CDRom aperto (altrimenti parte il disco all'interno) e si accede al menu dell'immagine soprastante. Si seleziona Free MCBoot e si arriva a questa schermata (si richiude lo sportellino)
Si preme cerchio sul joypad per andare avanti.
A questo punto si deve avere preparato una chiavetta USB con i file
Kloader.elf
initrd.gz (il ramdisk)
vmlinux (il kernel)
si selezione il file Kloader.elf ed il sistema cerca di fare il boot automatico
peccato che si blocchi con questo errore
si deve caricare a mano il kernel ed il ramdisk riprendendoli dalla chiavetta USB
Si effettua il boot con i nuovi parametri e si vede partire il kernel
(qui ho dovuto provare a masterizzare 3 DVD perche' i primi due venivano visti con errori dalla PS2 mentre era leggibili per il PC, non so se si e' degradato il lettore della PS2 o gli restano antipatici i dischi masterizzati)
e qui c'e' una trappola che mi ha bloccato per un giorno intero. Il sistema mostra un errore di montaggio del filesystem sul DVD. Il primo istinto e' resettare e ripartire ma la soluzione giusta e' aspettare. Non si tratta di errore critico e basta aspettare . (Il boot completo richiede almeno 5 minuti!!!)
Una volta giunto X ci si trova davanti a Fluxbox con alcune applicazioni preinstallate
ci si deve pero' ricordare che l'hardware ha appena 32 Mb di ram disponibile quindi il live DVD sara' estremamente lento anche perche' non c'e' partizione di swap (con un po' di pazienza si puo' attaccare un disco esterno usb e configurarlo per il sistema operativo ma cio' va al di la' di quanto volevo provare)
Togliendo la chiavetta ed inserendo mouse e tastiera ci si trova di fronte ad una PS2 convertito in un PC (lentissimo) con cui si puo' giocare con GIMP 1.2
![]() |
| Gimp in PS2 Linux |
Dato che la mia PS2 non ha il modchip ed e' PAL ho scaricato il file ps2linux_live_v3_pal_large_no_modchip.7z
Per prima cosa bisogna avere una scheda di memoria di espansione di PS2 con installato Free MCBoot. Agli inizi del 2000 era piuttosto comune trovarla ed avendone una si poteva replicare su schede vuote. Oggi invece e' introvabile e sono riuscito a reperirne una su un e-commerce cinese al prezzo di circa 7 euro
Inserita l'espansione di memoria si accende la PS2 lasciando lo sportellino del CDRom aperto (altrimenti parte il disco all'interno) e si accede al menu dell'immagine soprastante. Si seleziona Free MCBoot e si arriva a questa schermata (si richiude lo sportellino)
Si preme cerchio sul joypad per andare avanti.
A questo punto si deve avere preparato una chiavetta USB con i file
Kloader.elf
initrd.gz (il ramdisk)
vmlinux (il kernel)
si selezione il file Kloader.elf ed il sistema cerca di fare il boot automatico
peccato che si blocchi con questo errore
si deve caricare a mano il kernel ed il ramdisk riprendendoli dalla chiavetta USB
Si effettua il boot con i nuovi parametri e si vede partire il kernel
(qui ho dovuto provare a masterizzare 3 DVD perche' i primi due venivano visti con errori dalla PS2 mentre era leggibili per il PC, non so se si e' degradato il lettore della PS2 o gli restano antipatici i dischi masterizzati)
e qui c'e' una trappola che mi ha bloccato per un giorno intero. Il sistema mostra un errore di montaggio del filesystem sul DVD. Il primo istinto e' resettare e ripartire ma la soluzione giusta e' aspettare. Non si tratta di errore critico e basta aspettare . (Il boot completo richiede almeno 5 minuti!!!)
Una volta giunto X ci si trova davanti a Fluxbox con alcune applicazioni preinstallate
ci si deve pero' ricordare che l'hardware ha appena 32 Mb di ram disponibile quindi il live DVD sara' estremamente lento anche perche' non c'e' partizione di swap (con un po' di pazienza si puo' attaccare un disco esterno usb e configurarlo per il sistema operativo ma cio' va al di la' di quanto volevo provare)
Togliendo la chiavetta ed inserendo mouse e tastiera ci si trova di fronte ad una PS2 convertito in un PC (lentissimo) con cui si puo' giocare con GIMP 1.2
venerdì 5 febbraio 2016
Raw data da Ublox M8T
Per migliorare il mio sistema GPS portatile ho deciso che le antenne a basso costo non raggiungono i risultati attesi e mi sono comprato un UBlox M8T che, pur essendo ancora un dispositivo L1, permette di ottenere i dati raw della fase
Il costo del dispositivo, compreso di antenna e' sui 100 euro (in particolare ho comprato questo modello)
L'interfaccia con il software U-Center funziona perfettamente senza l'installazione dei driver (peraltro il dispositivo e' giunto senza nessuna indicazione ne' scritta ne' su supporto informatico) via Usb anche se e' disponibile una serie TTL per l'uso con Arduino.
Una volta lanciato il programma si deve collegare la seriale premendo il primo pulsante a sinistra nella seconda toolbar (dal menu a tendina si deve prima scegliere la COM)
A questo punto inizia il collegamento. Di default il GPS spedisce dati NMEA. Per abilitare la trasmissione dei pacchetti binari UBX, dove sono contenute le informazioni si deve cliccare sul quarto pulsante da sinistra (si vedra' una finestra Enable con una progressbar ed i messaggi che abilitano l'UBX)
Con il tasto F6 si apre la finestra di visualizzazione dei pacchetti ricevuti (Packet Console) mentre con F7 si vede il dettaglio del contenuto del pacchetto (ovviamente essendo i pacchetti UBX binari sara' poco chiaro il significato)
In questo momento sono mischiati i pacchetti binari UBX ed i pacchetti NMEA (stringhe). Per vedere solo i dati UBX si clicca F9 (Message View), poi si clicca destra sulla radice NMEA e Disable Child Message.
I pacchetti dei dati raw sono inclusi nel pacchetto UBX-RXM-RAWX
Da dentro U-Center si puo' attivare la registrazione dei dati su file mediante il pulsante Save (il cerchio rosso nella seconda toolbar)
A questo punto si deve passare, per il postprocessing, dal formato UBX a Rinex. Per fare cio' si deve usare il programma RTKLib facendo attenzione ad utilizzare la versione beta 2.4.3 (scaricabile da qui) perche' le precedenti versioni stable non leggono l'attuale formato UBX.
La conversione si fare a riga di comando con convbin.exe oppure con la GUI mediante rtkconv.exe
il risultato finale in Rinex e' il seguente
-----------------------------------------------
2.10 OBSERVATION DATA M (MIXED) RINEX VERSION / TYPE
RTKCONV 2.4.3 b8 20160204 132837 UTC PGM / RUN BY / DATE
log: C:\Documents and Settings\l.innocenti\Desktop\rtkli\b COMMENT
format: u-blox COMMENT
MARKER NAME
MARKER NUMBER
OBSERVER / AGENCY
REC # / TYPE / VERS
ANT # / TYPE
4523854.9454 898262.0665 4390882.1912 APPROX POSITION XYZ
0.0000 0.0000 0.0000 ANTENNA: DELTA H/E/N
1 1 WAVELENGTH FACT L1/2
4 C1 L1 D1 S1 # / TYPES OF OBSERV
2016 2 4 10 46 37.0000000 GPS TIME OF FIRST OBS
2016 2 4 11 2 34.0000000 GPS TIME OF LAST OBS
END OF HEADER
16 2 4 10 46 37.0000000 0 6G 9G 6G23G 2G 3G16
20353149.445 31374.2421 -629.648 48.250
21171326.688 101805.5401 -2189.004 42.000
21715976.480 221495.1331 -4711.816 50.750
22754433.179 -230913.3121 5015.303 39.500
23778302.177 352639.2231 -7537.764 42.000
24278781.122 -34942.1271 2639.141 29.250
Il costo del dispositivo, compreso di antenna e' sui 100 euro (in particolare ho comprato questo modello)
![]() |
| Diametro circa 10 cm |
L'interfaccia con il software U-Center funziona perfettamente senza l'installazione dei driver (peraltro il dispositivo e' giunto senza nessuna indicazione ne' scritta ne' su supporto informatico) via Usb anche se e' disponibile una serie TTL per l'uso con Arduino.
Una volta lanciato il programma si deve collegare la seriale premendo il primo pulsante a sinistra nella seconda toolbar (dal menu a tendina si deve prima scegliere la COM)
A questo punto inizia il collegamento. Di default il GPS spedisce dati NMEA. Per abilitare la trasmissione dei pacchetti binari UBX, dove sono contenute le informazioni si deve cliccare sul quarto pulsante da sinistra (si vedra' una finestra Enable con una progressbar ed i messaggi che abilitano l'UBX)
Con il tasto F6 si apre la finestra di visualizzazione dei pacchetti ricevuti (Packet Console) mentre con F7 si vede il dettaglio del contenuto del pacchetto (ovviamente essendo i pacchetti UBX binari sara' poco chiaro il significato)
In questo momento sono mischiati i pacchetti binari UBX ed i pacchetti NMEA (stringhe). Per vedere solo i dati UBX si clicca F9 (Message View), poi si clicca destra sulla radice NMEA e Disable Child Message.
I pacchetti dei dati raw sono inclusi nel pacchetto UBX-RXM-RAWX
![]() |
| Esempio dei pacchetti UBX |
Da dentro U-Center si puo' attivare la registrazione dei dati su file mediante il pulsante Save (il cerchio rosso nella seconda toolbar)
A questo punto si deve passare, per il postprocessing, dal formato UBX a Rinex. Per fare cio' si deve usare il programma RTKLib facendo attenzione ad utilizzare la versione beta 2.4.3 (scaricabile da qui) perche' le precedenti versioni stable non leggono l'attuale formato UBX.
La conversione si fare a riga di comando con convbin.exe oppure con la GUI mediante rtkconv.exe
il risultato finale in Rinex e' il seguente
-----------------------------------------------
2.10 OBSERVATION DATA M (MIXED) RINEX VERSION / TYPE
RTKCONV 2.4.3 b8 20160204 132837 UTC PGM / RUN BY / DATE
log: C:\Documents and Settings\l.innocenti\Desktop\rtkli\b COMMENT
format: u-blox COMMENT
MARKER NAME
MARKER NUMBER
OBSERVER / AGENCY
REC # / TYPE / VERS
ANT # / TYPE
4523854.9454 898262.0665 4390882.1912 APPROX POSITION XYZ
0.0000 0.0000 0.0000 ANTENNA: DELTA H/E/N
1 1 WAVELENGTH FACT L1/2
4 C1 L1 D1 S1 # / TYPES OF OBSERV
2016 2 4 10 46 37.0000000 GPS TIME OF FIRST OBS
2016 2 4 11 2 34.0000000 GPS TIME OF LAST OBS
END OF HEADER
16 2 4 10 46 37.0000000 0 6G 9G 6G23G 2G 3G16
20353149.445 31374.2421 -629.648 48.250
21171326.688 101805.5401 -2189.004 42.000
21715976.480 221495.1331 -4711.816 50.750
22754433.179 -230913.3121 5015.303 39.500
23778302.177 352639.2231 -7537.764 42.000
24278781.122 -34942.1271 2639.141 29.250
Iscriviti a:
Post (Atom)
LLama3 Anita
A seguito di questo post ho provato a vedere ho provato a vedere cosa accadeva ad utilizzare un modello specifico per la lingua italiana in...
-
Aggiornamento questo e' la risposta degli sviluppatori First of all, almost all operating systems on both mobile and laptop/desktop n...
-
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...
-
Questo post e' a seguito di quanto gia' visto nella precedente prova Lo scopo e' sempre il solito: creare un sistema che permet...
















































