ATTEZIONE: un avvertimento importante. La Intel Edison lavora a 1.8V. Nell'Arduino Kit sono installati molti shift level per venire incontro ai dispositivi a 5V e 3.3V che si usano con Arduino. Il MiniBreakout non dispone degli shift level ed ha connessioni dirette con i piedini del processore con la ovvia conseguenza che una sovratensione distrugge il processore
Ho avuto modo di provare la Intel Edison (collegata alla scheda di sviluppo Edison Kit per Arduino).
Il modulo Edison di per se' e' microscopico, poco piu' grande di una moneta da 2 euro, ma monta un processore Atom dual core con 1Gb DDR e 4 Gb di Flash Ram con connettivita' Bluetooth Le e WiFI.
Per lo sviluppo la sola Edison non riesce a vivere da sola e deve essere accoppiata all'Edison kit per Arduino (scelta piu' costosa ma ottimale) oppure all'Edison Kit BreakOut
La Edison viene alimentata tramite un connettore microUsb vicino alla sigla J16 ma viene fortemente consigliato di accoppiare un trasformatore da 220V a (7-15V) con polo centrale positivo. Altrimenti si puo' alimentare con una LiPo usando il connettore J2
Il collegamento tra il vero e proprio modulo Edison e la scheda di sviluppo avviene con un socket (credo proprietario) ed impossibile da saldare in proprio
L'unico sistema di svincolare la Edison dalla scheda di sviluppo e' quello di utilizzare i moduli Blocks di SparkFun, tipo questo che monta LSM9DS0 9DOF IMU
Prima cosa importante: non c'e' uscita video e non c'e' installato X (quindi niente possibilita' di montare VNC). Il sistema operativo e' ridotto all'osso .. anche di piu'.
Il consumo della Edison collegata ad un Arduino Kit ha una punta in fase di boot di circa 130 mA ma si stabilizza in idle a circa 80 mA
Per comunicare con la Edison si puo' usare una connessione seriale connettendo un cavo USB nella microUsb piu' vicina allo spigolo della scheda (accanto al simbolo J3) e digitando
screen /dev/ttyUSB1 115200
(ovviamente /dev/ttyUSBx puo' variare a seconda della configurazione del client)
altrimenti ci si puo' collegare via SSH in WiFi. Ovviamente prima di fare cio' bisogna collegare la Edison all'access point e cio' si effettua con il comando
configure_edison --wifi (per dettagli vedi qui)
cambiando gli switch del comando si puo' cambiare il nome del dispositivo oppure anche effettuare un setup completo compreso riflashare il firmware
Il sistema operativo di default e' Yocto Linux, una versione sostanzialmente embedded, che ha come packet manager opkg (lo stesso di Yun/Linino) . I pacchetti disponibili nel repository Intel di opkg non sono moltissimi e sono quasi tutti strumenti di sviluppo (gcc, python, git, automake, wget etc). Per esempio manca una versione pacchettizzata di Midnight Commander che e' gia' pronta per OpenWrt (e' comunque possibile compilarlo da sorgenti senza nessun problema)
Di fatto c'e' solo l'utente root configurato ed in modo curioso la sua home e' in /home/root invece che in /root
Per quanto i connettori (riferimento):
SW1 : permette di selezionare la modalita Host e Device del dispositivo.In Host mode si possono connettere alla porta USB Type A i dispositivi come mouse e tastiere Usb. In modalita' Device il dispositivo deriva corrente dalla porta USB
J2 : connettore per una LiPo (possibilita' di ricaricare la batteria se e' disponibile corrente da J3)
J3 : FTDI to serial. Connessione per il terminale seriale
J16 : USB OTG. Questa e' la porta per la programmazione Arduino
SW1 UI5 : reset
SW1 UI1 : reset dello shield
giovedì 12 maggio 2016
Abilitare il core dump su gcc
Quando invece si sta sviluppando un programma e' molto utile avere a disposizione un core dump. Si puo' abilitare con il comando
ulimit -c unlimited
per debuggare il core dump si usa
gdb nome_programma nome_core_dump
con subito dopo il comando di backtrace
bt
mercoledì 11 maggio 2016
Passaggio di Mercurio del 9 maggio
cronaca di un fallimento.....
Lunedi' 9 maggio nel pomeriggio Mercurio era in transito davanti al Sole ed avevo letto che non era possibile vederlo ad occhio nudo (previa protezione) ma era possibile con binocolo o con piccoli telescopi
Fortunatamente le nuvole per le 13 erano scomparse ed ho provato se riuscivo ad osservare il transito. L'immagine, peraltro abbastanza sgranata, sottostante rende l'idea di cio' stavo (non osservando)
Certo la mia attrezzatura era un po' (troppo artigianale)..un binocolo da campagna con un oculare oscurato ed un altro a cui erano stati messi due filtri da saldatore (una non era sufficiente) in entrata (i filtri devono essere messi in entrata allo strumento ottico...non tra lo strumento e l'occhio)
Deluso mi sono messo a guardare il live streaming della Nasa...da notare il confronto tra il piccolo cerchietto nero (Mercurio) e la curvatura del Sole
Per rendere l'idea ancora meglio delle differenza di dimensioni angolari questo e' tutto il disco solare con sovraimpresso il disco di Mercurio
Non si vede ??? E' il puntino nero poco al di sotto dell'equatore circa sulla meta' verticale del disco solare
Dire che era possibile vederlo con un binocolo era diciamo di un estremo ottimismo...
Lunedi' 9 maggio nel pomeriggio Mercurio era in transito davanti al Sole ed avevo letto che non era possibile vederlo ad occhio nudo (previa protezione) ma era possibile con binocolo o con piccoli telescopi
Fortunatamente le nuvole per le 13 erano scomparse ed ho provato se riuscivo ad osservare il transito. L'immagine, peraltro abbastanza sgranata, sottostante rende l'idea di cio' stavo (non osservando)
Certo la mia attrezzatura era un po' (troppo artigianale)..un binocolo da campagna con un oculare oscurato ed un altro a cui erano stati messi due filtri da saldatore (una non era sufficiente) in entrata (i filtri devono essere messi in entrata allo strumento ottico...non tra lo strumento e l'occhio)
Deluso mi sono messo a guardare il live streaming della Nasa...da notare il confronto tra il piccolo cerchietto nero (Mercurio) e la curvatura del Sole
Per rendere l'idea ancora meglio delle differenza di dimensioni angolari questo e' tutto il disco solare con sovraimpresso il disco di Mercurio
Non si vede ??? E' il puntino nero poco al di sotto dell'equatore circa sulla meta' verticale del disco solare
Dire che era possibile vederlo con un binocolo era diciamo di un estremo ottimismo...
martedì 10 maggio 2016
Arduino YUN e Centos 7
In modo un po' curioso Centos 7 non riesce a risolvere l'indirizzo arduino.local (default di Yun) usando Avahi/Bonjour
Dopo un po' di tentativi, in modo molto pragamatico, ho preferito effettuare un ping sweep con nmap per trovare l'indirizzo ip della Yun tramite
nmap -sP 192.168.43.1/24
(di solito uso l'hotspot di Android come access point il cui DHCP stranamente non distribuisce gli ip in modo sequenziale, per esempio il telefono e' 192.168.43.1, Centos aveva preso 192.168.43.4 mentre la Yun l'ho trovata su 192.168.43.174)
Un altro piccolo dettaglio: tentando di aprire minicom dall'interno di una sessione SSH compare l'errore
Cannot find termcap entry for 'xterm-256color'
TERM=xterm screen
Dopo un po' di tentativi, in modo molto pragamatico, ho preferito effettuare un ping sweep con nmap per trovare l'indirizzo ip della Yun tramite
nmap -sP 192.168.43.1/24
(di solito uso l'hotspot di Android come access point il cui DHCP stranamente non distribuisce gli ip in modo sequenziale, per esempio il telefono e' 192.168.43.1, Centos aveva preso 192.168.43.4 mentre la Yun l'ho trovata su 192.168.43.174)
Un altro piccolo dettaglio: tentando di aprire minicom dall'interno di una sessione SSH compare l'errore
che si risolve digitando
NTP Server con GPS Seriale e Arduino YUN
Nel precedente post avevo utilizzato i dati derivati da un modulo GPS collegato via USB ad una Arduino YUN come fonte dati per un server NTP
Questa configurazione e' un po' costosa ed occupa la porta USB della YUN. Usando un modulo GPS con una seriale TTL con una connessiona a soli tre fili (VCC, GND e GPS-Tx collegato ad Arduino, il cavo GPS-Rx non e' necessaria perche' la comunicazione e' a senso unico) si puo' ottenere lo stesso risultato risparmiando un po'
Per prima cosa si deve configuare la YUN modificando il file /etc/inittab e commentando la terza riga (quella che inizia con ttyATH0...) e si riavvia il dispositivo
si collega poi il pin TX del GPS al pin D8 dell'Arduino e si carica lo sketch che semplicemente prende i dati dalla SoftSeriale e li spedisce sulla Serial1 (che e' quella di collegamento tra Linino ed Arduino)
-------------------------------------------------------
#include <SoftwareSerial.h>
SoftwareSerial mySerial(8, 3); // RX, TX
void setup() {
delay(150000); //questo serve a non inviare dati sulla seriale in fase di boot altrimenti si blocca tutto
Serial1.begin(115200);
Serial.begin(115200);
mySerial.begin(9600);
}
void loop() {
if (mySerial.available()) {
char c = mySerial.read();
Serial1.write(c);
Serial.write(c);
}
}
---------------------------------------------------
Questa configurazione e' un po' costosa ed occupa la porta USB della YUN. Usando un modulo GPS con una seriale TTL con una connessiona a soli tre fili (VCC, GND e GPS-Tx collegato ad Arduino, il cavo GPS-Rx non e' necessaria perche' la comunicazione e' a senso unico) si puo' ottenere lo stesso risultato risparmiando un po'
Per prima cosa si deve configuare la YUN modificando il file /etc/inittab e commentando la terza riga (quella che inizia con ttyATH0...) e si riavvia il dispositivo
si collega poi il pin TX del GPS al pin D8 dell'Arduino e si carica lo sketch che semplicemente prende i dati dalla SoftSeriale e li spedisce sulla Serial1 (che e' quella di collegamento tra Linino ed Arduino)
-------------------------------------------------------
#include <SoftwareSerial.h>
SoftwareSerial mySerial(8, 3); // RX, TX
void setup() {
delay(150000); //questo serve a non inviare dati sulla seriale in fase di boot altrimenti si blocca tutto
Serial1.begin(115200);
Serial.begin(115200);
mySerial.begin(9600);
}
void loop() {
if (mySerial.available()) {
char c = mySerial.read();
Serial1.write(c);
Serial.write(c);
}
}
---------------------------------------------------
A questo punto doveva essere tutto facile e si dovevano solo replicare i passi del precedente post...in realta', nonostante fosse possibile visualizzare il flusso seriale mediante minicom, il demone di gpsd non riusciva ad agganciarlo. Dopo varie prove ho messo il Serial1 a 115200 e installato stty con il comando
opkg update
opkg update
opkg install coreutils-stty
a questo punto ho forzato il riconoscimento della velocita' della seriale con stty
a questo punto ho forzato il riconoscimento della velocita' della seriale con stty
venerdì 6 maggio 2016
NTP Server con Ublox M8T e Arduino Yun
Avevo gia' fatto qualcosa di simile, ma in questo esempio mostrero' come usare una Arduino Yun ed un modulo Ublox M8T per creare un server NTP che utilizza il segnale GPS per avere l'informazione del tempo
Prima di tutto si deve collegare l'Ublox alla Yun mediante la porta USB. Se si effettua tale operazione da dmesg si vede che il dispositivo e' riconosciuto ma non viene creata la porta seriale corrispondente. Questo e' dovuto al fatto che Linino e' un sistema Linux ridotto all'osso e pochi moduli del kernel sono montati di default
Si deve quindi scaricare il pacchetto kmod.usb-acm mediante le seguenti istruzioni
opkg update
opkg install kmod-usb-serial kmod-usb-acm
a questo punto viene creata una porta seriale virtuale in /dev/ttyACM0
opkg update
opkg install gpsd gpsd-clients ntpdate
per verificare se il flusso dati proveniente dal GPS e' interpretato in modo corretto si puo' digitare
Prima di tutto si deve collegare l'Ublox alla Yun mediante la porta USB. Se si effettua tale operazione da dmesg si vede che il dispositivo e' riconosciuto ma non viene creata la porta seriale corrispondente. Questo e' dovuto al fatto che Linino e' un sistema Linux ridotto all'osso e pochi moduli del kernel sono montati di default
Si deve quindi scaricare il pacchetto kmod.usb-acm mediante le seguenti istruzioni
opkg update
opkg install kmod-usb-serial kmod-usb-acm
a questo punto viene creata una porta seriale virtuale in /dev/ttyACM0
Si scarica e si installa quindi il demone gpsd
opkg update
opkg install gpsd gpsd-clients ntpdate
e si attiva mediante il comando
gpsd /dev/ttyACM0 -n -F /var/run/gpsd.sockper verificare se il flusso dati proveniente dal GPS e' interpretato in modo corretto si puo' digitare
e si modifica il file di configurazione in /etc/ntp.conf aggiungendo queste linee
-----------------------------------------
server 127.127.28.0 minpoll 4 maxpoll 4
fudge 127.127.28.0 time1 0.0 refid GPS
server 127.127.28.1 minpoll 4 maxpoll 4 prefer
fudge 127.127.28.1 refid PPS
-----------------------------------------
-----------------------------------------
e si lancia il servizio
/etc/init.d/sysntpd disable
/etc/init.d/ntpd enable
/etc/init.d/ntpd start
a questo punto digitando
ntpq -p
si vedra' apparire il GPS tra la sorgente delle fonti dati (e visto che sara' anche con quello di minor latenza) sara' il preferito. La Yun e' preconfigurata per usare il tempo UTC (come quello del GPS) e non ha di default configurate le timezone
/etc/init.d/sysntpd disable
/etc/init.d/ntpd enable
/etc/init.d/ntpd start
a questo punto digitando
ntpq -p
si vedra' apparire il GPS tra la sorgente delle fonti dati (e visto che sara' anche con quello di minor latenza) sara' il preferito. La Yun e' preconfigurata per usare il tempo UTC (come quello del GPS) e non ha di default configurate le timezone
martedì 3 maggio 2016
Fixed point math e Mandelbrot
Un esempio di utilizzo della matematica a virgola fissa, un metodo di rappresentazione dei numeri reali con un numero prefissato di cifre decimali utilizzato in particolar modo per calcolatori privi di coprocessore matematico (per esempio il software Fractint usava questo tipo di approccio per il calcolo di frattali su processori 386 e 486 all'inizio degli anni 90)
Per effettuare un calcolo dell'insieme di Mandelbrot si puo' usare attualmente la libreria FIXEDPTC (Fixed Point Math Library for C) (rispetto ad altre librerie, come FPMLib o LibFoixMath , e' possibile settare il proprio formato dati secondo le proprie necessita')
Visto che il calcolo e' tutto compreso per valori inferiori a 8 puo' essere utile, per massimizzare la precisione, usare una rappresentazione 4.28 (4 digit per la parte intera e 28 per la parte frazionaria) su un calcolatore a 32 bit. In questo modo il piu' piccolo numero calcolabile e' 0.00000000372529. Per la rappresentazione grafica e' stata usata la libreria PngWriter gia' usata qui
L'uso della libreria e' abbastanza autoesplicativo...l'unico aspetto un po' confuso e' che per effettuare dei confronti in un ciclo if...then si deve convertire il dato da formato a virgola fissa in float.
mand.c
------------------------------------------------------
#include <pngwriter.h>
#define FIXEDPT_WBITS 4
#define WIDTH 640
#define HEIGHT 480
#include "fixedptc.h"
int main() {
int j,k,i;
float test;
fixedpt Re,Im,DRe,DIm;
fixedpt X,Y,DUE;
fixedpt XN,YN,YNN;
fixedpt A,B;
pngwriter png(WIDTH,HEIGHT,0,"mandelbrot.png");
Re = fixedpt_rconst(-2.00390625); //finestra reale tra -2 e +0.5
Im = fixedpt_rconst(-1.205); //finestra immaginaria tra -1.2 e 1.2
DRe = fixedpt_rconst(0.00390625); //2.5/640
DIm = fixedpt_rconst(0.005); // 2.4/480
DUE = fixedpt_rconst(2.0);
A = Re;
for (j=0;j<WIDTH;j++)
{
A = fixedpt_add(A,DRe);
B = Im;
for (k=0;k<HEIGHT;k++)
{
B = fixedpt_add(B,DIm);
X = fixedpt_rconst(0.0);
Y = fixedpt_rconst(0.0);
for (i=0;i<=255;i++)
{
XN=fixedpt_sub(fixedpt_mul(X,X),fixedpt_mul(Y,Y))+A; // (x*x) - (y*y) + A
YN=fixedpt_mul(X,Y); // x*y
YNN=fixedpt_mul(DUE,YN); // 2*x*y
YN=YNN + B; // 2*x*y*+B
test = fixedpt_tofloat(fixedpt_mul(XN,XN) + fixedpt_mul(YN,YN)); //(XN*XN)+(YN*YN)
if (test > 4.0)
{
png.plot(j,k,1.0,1.0,1.0);
break;
}
X = XN;
Y = YN;
}
}
}
png.close();
}
------------------------------------------------------
Per compilare il sorgente si puo' usare i seguenti comandi
------------------------------------------------------
rm mandelbrot.png
g++ mand.c -o mand -I/usr/local/include -L/usr/local/lib -lpng -lpngwriter
./mand
display mandelbrot.png
------------------------------------------------------
Per effettuare un calcolo dell'insieme di Mandelbrot si puo' usare attualmente la libreria FIXEDPTC (Fixed Point Math Library for C) (rispetto ad altre librerie, come FPMLib o LibFoixMath , e' possibile settare il proprio formato dati secondo le proprie necessita')
Visto che il calcolo e' tutto compreso per valori inferiori a 8 puo' essere utile, per massimizzare la precisione, usare una rappresentazione 4.28 (4 digit per la parte intera e 28 per la parte frazionaria) su un calcolatore a 32 bit. In questo modo il piu' piccolo numero calcolabile e' 0.00000000372529. Per la rappresentazione grafica e' stata usata la libreria PngWriter gia' usata qui
L'uso della libreria e' abbastanza autoesplicativo...l'unico aspetto un po' confuso e' che per effettuare dei confronti in un ciclo if...then si deve convertire il dato da formato a virgola fissa in float.
mand.c
------------------------------------------------------
#include <pngwriter.h>
#define FIXEDPT_WBITS 4
#define WIDTH 640
#define HEIGHT 480
#include "fixedptc.h"
int main() {
int j,k,i;
float test;
fixedpt Re,Im,DRe,DIm;
fixedpt X,Y,DUE;
fixedpt XN,YN,YNN;
fixedpt A,B;
pngwriter png(WIDTH,HEIGHT,0,"mandelbrot.png");
Re = fixedpt_rconst(-2.00390625); //finestra reale tra -2 e +0.5
Im = fixedpt_rconst(-1.205); //finestra immaginaria tra -1.2 e 1.2
DRe = fixedpt_rconst(0.00390625); //2.5/640
DIm = fixedpt_rconst(0.005); // 2.4/480
DUE = fixedpt_rconst(2.0);
A = Re;
for (j=0;j<WIDTH;j++)
{
A = fixedpt_add(A,DRe);
B = Im;
for (k=0;k<HEIGHT;k++)
{
B = fixedpt_add(B,DIm);
X = fixedpt_rconst(0.0);
Y = fixedpt_rconst(0.0);
for (i=0;i<=255;i++)
{
XN=fixedpt_sub(fixedpt_mul(X,X),fixedpt_mul(Y,Y))+A; // (x*x) - (y*y) + A
YN=fixedpt_mul(X,Y); // x*y
YNN=fixedpt_mul(DUE,YN); // 2*x*y
YN=YNN + B; // 2*x*y*+B
test = fixedpt_tofloat(fixedpt_mul(XN,XN) + fixedpt_mul(YN,YN)); //(XN*XN)+(YN*YN)
if (test > 4.0)
{
png.plot(j,k,1.0,1.0,1.0);
break;
}
X = XN;
Y = YN;
}
}
}
png.close();
}
------------------------------------------------------
Per compilare il sorgente si puo' usare i seguenti comandi
------------------------------------------------------
rm mandelbrot.png
g++ mand.c -o mand -I/usr/local/include -L/usr/local/lib -lpng -lpngwriter
./mand
display mandelbrot.png
------------------------------------------------------
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...