
Als je bij een Raspberry Pi Pico het hex-adres van een I2C-apparaat wilt uitlezen gaat dat anders dan bij zijn grotere broer de Raspberry Pi. Er is voor de Pico een basisscript in micropython beschikbaar waarbij je in het script de GP-nummers van de Pico ingeeft waarmee het I2C-apparaat verbonden is. Je draait het script en het adres wordt getoond. Het script werkt prima, maar als je meerdere I2C-apparaten aangesloten hebt of vaak hex-adressen wilt uitlezen, wil je liever dat het sneller en automatisch gaat.
Toen ik een tijd geleden bezig was een digitale barometer op basis van een Pico te bouwen overkwam het me dat ik voor de BME280-, de SSD1306- en de RTC DS3231-module de hex-adressen moest weten. Wat een gedoe was dat. Het kostte me best wat tijd om van de drie I2C-apparaten de hex-adressen te herleiden.
Geboren uit frustratie heb ik het algemeen beschikbare basisscript omgebouwd naar een I2C-poortscanner waarbij het programma kijkt óf en hoeveel I2C-apparaten er op een GP-setje aangesloten zijn en welke hex-adressen de aangesloten I2C-apparaten hebben.
# Basisscript - Uitlezen hex-adres van I2C apparaat
import machine
sda=machine.Pin(0)
scl=machine.Pin(1)
i2c=machine.I2C(0,sda=sda, scl=scl, freq=400000)
print('I2C address:')
print(i2c.scan(),' (decimal)')
print(hex(i2c.scan()[0]), ' (hex)')
De enige eis voor het gebruik van de scansoftware is dat de I2C-apparaten per GP-setje aangesloten moeten worden. Hiermee bedoel ik dat een apparaat bijv. met GP0 & GP1 of GP10 & GP11 of GP26 & GP27, enz. verbonden dient te worden.
De scanner leest zowel de I2C-controller I2C0 als I2C1. Deze markering vind je terug als SDA0/SCL0 en SDA1/SCL1 op de poortaanduiding van het Pico datablad.
Daar gaan we!
Thonny
Ik ga er van uit dat je weet hoe Thonny werkt en hoe je de Raspberry Pi Pico ermee verbindt. Weet je dit niet of twijfel je? Kijk dan hier waar ik uitleg hoe je het moet doen.
Start Thonny op en verbindt de Pico ermee. Om een succesvolle test te kunnen doen moeten er wel I2C-apparaten met de Pico verbonden zijn. De scanner laat ook weten of het I2C-apparaat mogelijk defect of verkeerd aangesloten is. Op de betreffende GP zal dan geen I2C-apparaat gevonden worden.
- Klik in Thonny op [Nieuw]. Er opent zich een leeg bestand.
- Kopieer onderstaand script en plak het in het lege bestand.
- Sla het script op de Pico op onder de naam ‘I2Cscanner.py’.
- Klik vervolgens op [Uitvoeren] of [F5] om het script te starten.
Het script (I2Cscanner.py)
# Importeer bibliotheken
import machine
import array
x=-1 # standaard arraywaarde = -1
p=1 # p waarde is om I2C-controller I2C0 of I2C1 te gebruiken
print('\nRaspberry Pi Pico - I2C scanner')
print('===============================')
while True:
# sda en scl GP-poorten
sda = array.array('i',[0,2,4,6,8,10,12,14,16,18,20,26])
scl = array.array('i',[1,3,5,7,9,11,13,15,17,19,21,27])
x=x+1
print('\nGP',sda[x],'= (SDA)')
print('GP',scl[x],'= (SCL)')
# Initialiseer de SDA (Serial Data Line) pin voor I2C communicatie
sdaPIN = machine.Pin(sda[x])
# Initialiseer de SCL (Serial Clock Line) pin voor I2C communicatie
sclPIN = machine.Pin(scl[x])
# Initialiseer de I2C interface met de specifieke GP-pin en frequentie
# p = I2C0 of I2C1
p=(p+1) % 2 # wisselt p tussen I2C0 en I2C1
i2c = machine.I2C(p, sda=sdaPIN, scl=sclPIN, freq=400000)
# Scan voor apparaten die met de I2C bus verbonden zijn
devices = i2c.scan()
# Controleer of er apparaten gevonden zijn
if len(devices) == 0:
# Als er geen apparaten gevonden zijn, toon bericht
print('\033[31mNo I2C devices found!\033[0m')
else:
# Als er apparaten gevonden zijn, toon het apparaatnummer
print('\033[32mI2C devices found:\033[0m', len(devices))
# Toon voor elk gevonden apparaat het hexadecimale adress
for device in devices:
print("\033[32mHexadecimal address:\033[0m", hex(device))
if scl[x]==27:
print('\n===========')
print('Einde scan!\n')
Het programma eindigt met de melding: IndexError: array index out of range. Dit heeft te maken dat de array niet netjes stopt als alle waarden uitgelezen zijn. Laat maar weten als jij dit opgelost hebt, dan zal ik dit verwerken op deze pagina.
Het resultaat
Als alles goed gegaan is zie je in Thonny, in de Shell het volgende resultaat. In dit voorbeeld zijn er twee I2C-apparaten zichtbaar.
Raspberry Pi Pico - I2C scanner
=================================
GP 0 = (SDA)
GP 1 = (SCL)
No I2C devices found!
GP 2 = (SDA)
GP 3 = (SCL)
No I2C devices found!
GP 4 = (SDA)
GP 5 = (SCL)
I2C devices found: 1
Hexadecimal address: 0x76
GP 6 = (SDA)
GP 7 = (SCL)
No I2C devices found!
GP 8 = (SDA)
GP 9 = (SCL)
No I2C devices found!
GP 10 = (SDA)
GP 11 = (SCL)
No I2C devices found!
GP 12 = (SDA)
GP 13 = (SCL)
I2C devices found: 1
Hexadecimal address: 0x3c
GP 14 = (SDA)
GP 15 = (SCL)
No I2C devices found!
GP 16 = (SDA)
GP 17 = (SCL)
No I2C devices found!
GP 18 = (SDA)
GP 19 = (SCL)
No I2C devices found!
GP 20 = (SDA)
GP 21 = (SCL)
No I2C devices found!
GP 26 = (SDA)
GP 27 = (SCL)
No I2C devices found!
===========
Einde scan!
Conclusie
De I2C-scanner scant in een fractie van een seconde alle GP-poorten van de Pico. Dit bespaart tijd en frustratie in vergelijk met het handmatig vaststellen van het hex-adres van I2C-apparaten. Een ideale tool om in je gereedschapskist te bewaren.
Heb je nog tips of opmerkingen t.a.v. deze tutorial, laat dan hieronder een reactie achter.
Have A Nice Day!
Laat een reactie achter