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

immagine

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

immagine

Lo screenshot mostra che il nodo i2c-1 esiste in /dev

gpio readall

Ecco l'output di

sudo gpio readall

immagine

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

immagine

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.

immagine

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

immagine

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

immagine

La schermata mostra che non esistono nodi i2c in /dev.

gpio readall

Ecco l'output di

sudo gpio readall

immagine

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

immagine

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

immagine

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

immagine