Inschakelen en controleren van I2C op de Raspberry Pi via de opdrachtregel voor uw eigen scripts
De meeste mensen weten dat je de I2C poort kunt inschakelen met raspi-config.
raspi-config biedt ook een niet-interactieve modus, waarin u de functionaliteit kunt sturen met behulp van opdrachtregelparameters.
Uitlezen van de huidige status van de I2C poort op de Raspberry Pi
Hier is hoe je de huidige status van de I2C poort kunt lezen:
sudo raspi-config nonint get_i2c
Dit commando zal terugkomen:
- 1 als de poort is uitgeschakeld
- 0 als de poort is ingeschakeld
Let op: in dit geval is de logica bash scripting! "0 betekent waar of geen fout, en alle andere getallen betekenen een foutcode". Dit had me eerst te pakken!
Opmerking: nonint staat voor "niet-interactief"
Inschakelen van I2C op de Raspberry Pi met één eenvoudig commando
Opnieuw kunnen we met raspi-config de toestand van de I2C poort instellen. Het gebruik van raspi-config heeft het voordeel dat het veel bijkomende dingen voor je regelt, en zou upwards compatibel moeten zijn. Achter de schermen zal raspi-config bijvoorbeeld /boot/config.txt voor je bewerken, en ook de device tree bijwerken.
Hier staat hoe u de I2C-poort kunt inschakelen:
sudo raspi-config nonint do_i2c 0
Nogmaals, merk op dat 0 betekent waar / op hier!
Hier staat hoe u de I2C-poort kunt uitschakelen:
sudo raspi-config nonint do_i2c 1
1 betekent "vals" of uit voor dit doel.
Controleren of I2C is ingeschakeld
raspi-config in niet-interactieve modus
zoals hierboven vermeld, kunt u de toestand van de I2C-poort lezen met
sudo raspi-config nonint get_i2c
De schermafbeelding toont de uitvoer wanneer de I2C poort is ingeschakeld (0 = true)
I2C apparaatknooppunt
Wanneer I2C is ingeschakeld op de Raspberry Pi, zult u ook een /dev node hiervoor zien:
ls /dev/i2*
/dev/i2c-1
Opmerking: op de eerste Raspberry Pi modellen was de I2C poort blootgesteld aan gebruikers I2C 0, dus zou men /dev/i2c-0 verwachten
De schermafbeelding toont dat het i2c-1 knooppunt bestaat in /dev
gpio readall
Hier is de uitvoer van
sudo gpio readall
Voor BCM 2 en 3, zie je "SDA1" (I2C data) en "SCL1" (I2C klok) onder Name. Ook de modus is ALT0, wat overeenkomt met de I2C functie op deze specifieke pennen (GPIO2, GPIO3).
Merk op dat BCM 2 en 3 de Broadcom nummering is, niet de GPIO pinout. De GPIO pin positie is de eerste kolom in "Physical" (pinnen 3 en 5).
(U kunt dit document raadplegen, blz. 102voor een overzicht van de verschillende GPIO pin modes als u geïnteresseerd bent)
lsmod
lsmod zal je I2C modules tonen die geladen zijn:
lsmod | grep i2c
i2c_bcm2835 16384 0
i2c_dev 20480 0
dus geen verschil als I2C is uitgeschakeld.
i2cdetect:
Een laatste test is om i2cdetect te draaien om het adresbereik te scannen. Voor moderne Pis moet je 1 specificeren als de poort:
sudo i2cdetect -y 1
dit zal een tabel weergeven van de huidig gedetecteerde I2C apparaten.
opmerking: omdat in mijn geval geen I2C-apparaten waren aangesloten, verschijnen er ook geen I2C-apparaten - deze uitvoer wordt verwacht.
Controleren of I2C is uitgeschakeld
raspi-config in niet-interactieve modus
zoals hierboven vermeld, kunt u de toestand van de I2C-poort lezen met
sudo raspi-config nonint get_i2c
De schermafbeelding toont de uitvoer wanneer de I2C poort is uitgeschakeld (1 = false)
I2C apparaatknooppunt
Als I2C op de Raspberry Pi is uitgeschakeld, zult u geen /dev node zien:
ls /dev/i2*
ls: geen toegang tot '/dev/i2*': No such file or directory
De schermafbeelding laat zien dat er geen i2c nodes bestaan in /dev.
gpio readall
Hier is de uitvoer van
sudo gpio readall
Voor BCM 2 en 3, ziet u "SDA1" (I2C data) en "SCL1" (I2C klok) onder Name.
In tegenstelling tot de ingeschakelde versie (zie hierboven) is de modus echter IN, de pen is nu een GPIO ingang.
Merk op dat BCM 2 en 3 de Broadcom nummering is, niet de GPIO pinout.
(U kunt dit document raadplegen, blz. 102voor een overzicht van de verschillende GPIO pin modes als u geïnteresseerd bent)
lsmod
lsmod zal je I2C modules tonen die geladen zijn:
lsmod | grep i2c
i2c_bcm2835 16384 0
i2c_dev 20480 0
dus geen verschil als I2C wordt ingeschakeld - u kan niet gebruik dit als een test.
i2cdetect:
Een laatste test is om i2cdetect te draaien om het adresbereik te scannen. Voor moderne Pis moet je 1 specificeren als de poort:
sudo i2cdetect -y 1
als I2C is uitgeschakeld, zal dit een fout geven:
Error: Kon bestand `/dev/i2c-1′ of `/dev/i2c/1′ niet openen: No such file or directory
Valkuilen & Problemen met de I2C poort, FAQ
Is een reboot nodig om de I2C poort in te schakelen?
Vanuit mijn perspectief is een reboot niet nodig. Ik heb gekeken naar de code van raspi-config, en ze vragen om reboot voor andere poorten (b.v. UART), maar niet voor de I2C poort.
Ook kunt u bij het dynamisch in- en uitschakelen van de I2C-status controleren of het apparaatknooppunt is gemaakt en het I2C-bereik kan worden gescand met i2cdetect zonder opnieuw te hoeven opstarten.
Als al het andere faalt, ga je gang en probeer opnieuw op te starten - het zou kunnen helpen met sommige andere voorwaarden.
zijn er meer mogelijkheden om raspi-config aan te sturen, voor b.v. de UART en SPI poorten, voor SSH, etc.?
Zeker - raspi-config ondersteunt een groot aantal verschillende opties in de niet-interactieve modus.
al deze commando's worden uitgevoerd met
raspi-config nonint
U kunt een kijkje nemen op de raspi-config broncodeof verwijzen naar dit nuttige bericht in het Raspberry Pi forum.
nogmaals, let op de (voor sommige ontwikkelaars verwarrende) conventie dat 0 = waar / aan en 1 = onwaar / uit
i2cdetect kan niet scannen
Als u de volgende foutmelding krijgt:
Error: Kon bestand `/dev/i2c-1′ of `/dev/i2c/1′ niet openen: No such file or directory
I2C is waarschijnlijk uitgeschakeld. Probeer het in te schakelen, met de how-to in dit artikel of met raspi-config, en probeer dan de I2C poort opnieuw te scannen.
U kunt de in dit artikel beschreven methoden gebruiken om de toestand van de I2C-poort op uw Raspberry Pi te controleren.
gpio readall kan type bord niet bepalen
als u dit bericht krijgt wanneer u gpio readall probeert uit te voeren op een Raspberry Pi 4:
13:01:19 pi@Avalon:/dev $ sudo gpio readall
Oeps - niet in staat om board type te bepalen... model: 17
U moet een nieuwere versie van wiringpi van de auteur installeren (deze staat nog niet in de upstream repositories). Dit artikel beschrijft hoe je het moet doen.
Hier is de korte versie:
cd /tmp
wget https://project-downloads.drogon.net/wiringpi-latest.deb
sudo dpkg -i wiringpi-latest.deb