Abilitare e controllare I2C sul Raspberry Pi usando la linea di comando per i propri script
La maggior parte delle persone sa che si può abilitare la porta I2C usando raspi-config.
raspi-config offre anche una modalità non interattiva, in cui è possibile guidare la sua funzionalità utilizzando parametri della riga di comando.
Leggere lo stato attuale della porta I2C sul Raspberry Pi
Ecco come leggere lo stato attuale della porta I2C:
sudo raspi-config nonint get_i2c
Questo comando restituirà:
- 1 se la porta è disabilitata
- 0 se la porta è abilitata
Attenzione: in questo caso la logica è lo scripting bash! "0 significa vero o nessun errore, e tutti gli altri numeri significano un codice di errore". Questo mi ha preso all'inizio!
Nota: nonint sta per "non interattivo".
Abilitare I2C sul Raspberry Pi usando un semplice comando
Sempre usando raspi-config possiamo impostare lo stato della porta I2C. Usare raspi-config ha il vantaggio di prendersi cura di molte cose aggiuntive per voi, e dovrebbe essere compatibile verso l'alto. Dietro le quinte, raspi-config modificherà /boot/config.txt per voi, per esempio, e aggiornerà anche l'albero dei dispositivi.
Ecco come abilitare la porta I2C:
sudo raspi-config nonint do_i2c 0
Di nuovo, notate che 0 significa vero / qui!
Ecco come disattivare la porta I2C:
sudo raspi-config nonint do_i2c 1
1 significa "falso" o spento per questo scopo.
Controllare che I2C sia abilitato
raspi-config in modalità non interattiva
come detto sopra, potete leggere lo stato della porta I2C con
sudo raspi-config nonint get_i2c
La schermata mostra l'uscita quando la porta I2C è abilitata (0 = true)
Nodo del dispositivo I2C
Quando I2C è abilitato sul Raspberry Pi, vedrete anche un nodo /dev per esso:
ls /dev/i2*
/dev/i2c-1
Nota: sui primi modelli di Raspberry Pi la porta I2C esposta agli utenti era I2C 0, quindi ci si aspetterebbe /dev/i2c-0
Lo screenshot mostra che il nodo i2c-1 esiste in /dev
gpio readall
Ecco l'output di
sudo gpio readall
Per BCM 2 e 3, vedi "SDA1" (dati I2C) e "SCL1" (clock I2C) sotto Name. Anche la modalità è ALT0, che corrisponde alla funzione I2C su questi particolari pin (GPIO2, GPIO3).
Notate che BCM 2 e 3 è la numerazione Broadcom, non il pinout GPIO. La posizione del pin GPIO è la prima colonna in "Physical" (pin 3 e 5).
(Potete fare riferimento a questo documento, pagina 102, per una panoramica delle diverse modalità di pin GPIO se siete interessati)
lsmod
lsmod vi mostrerà i moduli I2C che sono caricati:
lsmod | grep i2c
i2c_bcm2835 16384 0
i2c_dev 20480 0
quindi non c'è differenza con l'I2C disattivato.
i2cdetect:
Un test finale è quello di eseguire i2cdetect per scansionare l'intervallo di indirizzi. Per i Pis moderni, dovrete specificare 1 come porta:
sudo i2cdetect -y 1
questo produrrà una tabella dei dispositivi I2C attualmente rilevati.
nota: poiché, nel mio caso, nessun dispositivo I2C era collegato, nessun dispositivo I2C appare - questo output è previsto.
Controllare che I2C sia disabilitato
raspi-config in modalità non interattiva
come detto sopra, potete leggere lo stato della porta I2C con
sudo raspi-config nonint get_i2c
La schermata mostra l'uscita quando la porta I2C è disabilitata (1 = falso)
Nodo del dispositivo I2C
Quando I2C è disabilitato sul Raspberry Pi, non vedrete un nodo /dev per esso:
ls /dev/i2*
ls: impossibile accedere a '/dev/i2*': No such file or directory
La schermata mostra che non esistono nodi i2c in /dev.
gpio readall
Ecco l'output di
sudo gpio readall
Per BCM 2 e 3, si vede "SDA1" (dati I2C) e "SCL1" (clock I2C) sotto Name.
A differenza della versione abilitata, però (vedi sopra), la modalità è IN, il pin è ora un ingresso GPIO.
Si noti che BCM 2 e 3 è la numerazione Broadcom, non il pinout GPIO.
(Potete fare riferimento a questo documento, pagina 102, per una panoramica delle diverse modalità di pin GPIO se siete interessati)
lsmod
lsmod vi mostrerà i moduli I2C che sono caricati:
lsmod | grep i2c
i2c_bcm2835 16384 0
i2c_dev 20480 0
quindi non c'è differenza con l'abilitazione di I2C - si non può Usare questo come test.
i2cdetect:
Un test finale è quello di eseguire i2cdetect per scansionare l'intervallo di indirizzi. Per i Pis moderni, dovrete specificare 1 come porta:
sudo i2cdetect -y 1
se I2C è disabilitato, questo mostrerà un errore:
Errore: Could not open file `/dev/i2c-1′ or `/dev/i2c/1′: No such file or directory
Trappole e problemi con la porta I2C, FAQ
è necessario un riavvio per abilitare la porta I2C?
Dal mio punto di vista un reboot è non necessario. Ho guardato il codice di raspi-config, e chiedono il riavvio per altre porte (per esempio UART), ma non per la porta I2C.
Inoltre, quando si commuta dinamicamente lo stato I2C on/off, sarete in grado di verificare che il nodo del dispositivo sia creato e che l'intervallo I2C possa essere scansionato usando i2cdetect senza un riavvio.
Se tutto il resto fallisce, comunque, vai avanti e prova a riavviare - potrebbe aiutare con alcune altre condizioni.
ci sono più possibilità di pilotare raspi-config, per esempio per le porte UART e SPI, per SSH, ecc.
Certo - raspi-config supporta una vasta gamma di opzioni diverse nella modalità non interattiva.
tutti questi comandi sono eseguiti usando
raspi-config nonint
Potete dare un'occhiata al codice sorgente di raspi-config, o fare riferimento a questo utile post nel forum Raspberry Pi.
di nuovo, notate la (per alcuni sviluppatori confusa) convenzione che 0 = vero / on e 1 = falso / off
i2cdetect non è in grado di eseguire la scansione
Se ottenete il seguente errore:
Errore: Could not open file `/dev/i2c-1′ or `/dev/i2c/1′: No such file or directory
I2C è molto probabilmente disabilitato. Prova ad abilitarlo, usando il how-to in questo articolo o usando raspi-config, e poi prova a scansionare di nuovo la porta I2C.
Potete usare i metodi presentati in questo articolo per verificare lo stato della porta I2C sul vostro Raspberry Pi.
gpio readall incapace di determinare il tipo di scheda
se si ottiene questo messaggio quando si cerca di eseguire gpio readall su un Raspberry Pi 4:
13:01:19 pi@Avalon:/dev $ sudo gpio readall
Oops - incapace di determinare il tipo di scheda... modello: 17
Devi installare una versione più recente di wiringpi dall'autore (non è ancora nei repository upstream). Questo articolo descrive come farlo.
Ecco la versione breve:
cd /tmp
wget https://project-downloads.drogon.net/wiringpi-latest.deb
sudo dpkg -i wiringpi-latest.deb