Archivi tag: programmazione

CubieBoard. GPIO e che fatica!

Per realizzare un progettino di cui parlerò tra qualche tempo, mi sono imbattuto nella necessità di lavorare con il GPIO della Cubieboard2. Alcune considerazioni:

  • la documentazione è pessima, questo riguarda tutto il progetto. Quindi, nessuna nuova!
  • Le GPIO sono a passo 2mm davvero scomode.

La mia CB monta un sistema operativo Debian 8.3 MainLine, come descritto QUI. Pertanto

The Allwinner-specific script.bin isn’t needed anymore.

L’accesso alla GPIO si effettua direttametne da SYSFS, solo che occorre “pescare” il PIN giusto. Per fare questo innanzitutto si individua il PIN FISICO sul quale vogliamo operare: io ho scelto il pin 17 del connettore U15 (ponendo la scheda con la alimentazione in basso, è il connettore sulla destra). Il PIN17 si chiama CSI1-D6. Guardando su questo schematico (è per la CB con A10 ma non cambia molto a quanto pare), si scopre che questo PIN fa capo al segnale PG10 del System On Chip. Pertanto si può applicare la formuletta trovata qui, per capire come referenziare correttamente il PIN: G-> 7a lettera dell’alfabeto

(numero_lettera_alfabeto – 1) * 32+(numero_pin) —> (7-1)*32+10=202

Per abilitare il PIN occorre digitare:

/bin/echo 202 > /sys/class/gpio/export
/bin/echo in > /sys/class/gpio/gpio202/direction

In qeusto modo, con il comando cat si può ricavare il valore del PIN:

root@cubieboard:~# cat /sys/class/gpio/gpio202/value
1
root@cubieboard:~#

Semplice vero? No. Ho impiegato DUE ore a capire questa cosa.

Maledetti!

Raspberry PI e i2c

Per acquisire dei dati meteo, ho realizzato una piccola schedina figlia che si basa sue due sensori: SHT21 della Sensirion e MPL3115 della Freescale.

Nell’interfacciamento del primo sensore non ci sono state particolari difficoltà, anche per il fatto che il codice è piuttosto diffuso e ben funzionante, sia in pyhton che in c.

Qualche grattacapo in più è arrivato dal dispositivo Freescale. In effetti il sisitema riconosce il dispositivo ma non riesce ad accedere ai dati. Pertanto anche se il comando i2cdetect -y 1 consente di visualizzare correttamente il dispositivo, una successiva lettura dei dati fallisce. Leggendo il datasheet è possibile notare come lo scambio dati richieda una condizione di “repeated start” per l’accesso al bus I2C. Peccato che questo non sia supportato dalla corrente implementazione del Kernel su Raspberry Pi:

As part of guaranteeing reliability, mostly in a multi-master setup, SMBus requires the use of I2C’s repeated starts for read operations. The I2C master driver for Linux on the Raspberry Pi does not support this

Fantastico. Fortunatamente Jovian Jackowski ha sviluppato un hack per questo problema. informazioni possono essere reperite qui e qui. Il codice per il dispositivo mpl3115 lo si può trovare qui e restituisce questo output:
root@raspbeacon:~/weather/mpl3115# ./mpl3115_comma
WhoAmI:c4
Status Register: 0
---- PRESSURE FUNCTION ----
Press RT: M:62 C:39 L:30
Press Integer Complete: 188e4 100580
Complete: 1005.00
Final Value 1005.75
---- END PRESSURE ----
---- TEMPERATURE FUNCTION ----
Temp RT: M:15 L:70
Temp Decimal Integer Part: 21
Tcomplete 21.4375
---- END TEMPERATURE ----
---- ALTITUDE FUNCTION ----
Alt RT: M:0 C:3f L:80
alt  Integer Complete: 3f 63
Complete: 63.00
Final Value 63.50
---- END ALTITUDE ----
1005.75,63.50,21.44

A presto!