Raspberry Pi Hardware en I/OPs: dit is de hardware pagina, zie ook mijn algemene Raspberry Pi pagina! 2012: de Raspberry Pi, de $25 Linux computer? OK, de zaak ligt iets genuanceerder, maar het is toch een heel interessant project. Oorspronkelijk is dit project in de UK opgezet om kinderen op scholen weer in aanraking te laten komen met 'echte computers' in plaats van kant-en-klare kastjes. En, juist om ook weer met hardware te kunnen spelen is de Raspberry Pi heel geschikt. Deze pagina laat wat mogelijkheden zien van I/O van de originele Raspberry, zoals de 26-pins P1 uitbreidingsconnector van de originele RaspberryPi B. Zie ook het officiële schema van de Raspberry Pi (en de errata). De latere versies van de Raspberry hebben extra pinnen; even opletten dus welke versie je hebt. Ik heb ondertussen ook een Raspberry 3B+, maar heb deze pagina daar niet volledig op aangepast (werk in uitvoering). Voor de 40-pins connector op de 3B kan je kijken op de eLinux RPi Low-level peripherals pagina's. Let op, er zijn subtiele verschillen! Er zijn een aantal 'general-purpose I/O' pinnen (GPIO's) die je als input of als output vrij kunt programmeren, plus een aantal pinnen met speciale functies (die je overigens ook als general purpose kunt gebruiken). De pinnen met speciale functies maken het mogelijk complexere modules aan te sturen, bijvoorbeeld via I2C: een 2-draads (plus 2 voor voeding) bus-systeem om bijvoorbeeld temperatuursensors, lcd's en zo aan te sturen. Welke versie?Er zijn verschillende revisies van de Raspberry, met verschillen in de
I/O!!! Deze pagina is voor de Raspberry Pi 1 model B, revisie 1 (van voor oktober 2012) met
maar 256 MB geheugen. Ondertussen is er ook een B+ versie met extra I/O, en zelfs al een quad-core Raspberry Pi 2B en Raspberry Pi 3B+, voor dezelfde prijs. Je kan de general-purpose I/O pinnen op de header P1 op diverse manieren benaderen, zoals vanuit C of Python, of zelfs als files vanuit bash scripts. De header P1 is te zien in de linkerbovenhoek van de foto hiernaast. Er zijn kant-en-klare printjes voor te koop om er op aan te sluiten en makkelijk te kunnen experimenteren, zoals het officiëuze GertBoard en deze goedkope prototype-bordjes, maar ik heb even zelf een printje gemaakt waarop ik de belangrijkste pinnen op aparte connectoren heb gezet (gpio, i2c, serial; zie de foto verderop). Raspberry 1B: I/O connector P1Hier als referentie de 26-polige pin-out van de P1 connector op de originele 256 MB
B-versie (zie deze eLinux pagina voor de 40-polige versie), met zowel de Broadcom
datasheet namen (BCM) als de Raspberry Pi namen. Meer details op de eLinux RPi BCM2835 GPIO pagina. Let op: hoewel er een +5 Volt
pin op de connector zit, zijn alle I/O's 3.3 Volt, en kunnen niet tegen 5 Volt!! Max stroom
per pin is blijkbaar instelbaar van 2 tot 16 mA, maar kan de details niet vinden. GPIO pinnummering
(BCM of Raspberry) is afhankelijk van je programmeertaal, zie onderstaande tabel.
(*1): I2C1_SDA/GPIO2 en I2C1_SCL/GPIO3
op revisie-2 borden! Raspberry 3: Extra pinnen
GPIO low-level aansturenGPio vanuit andere talen?Op deze RPi Low-level peripherals pagina ook voorbeelden van GPIO vanuit andere talen, zoals Perl, C, C#, Java en Ruby Ook op die pagina een hulpprogramma om vanuit bash op een meer praktische manier met de gpio om te kunnen gaan. GPIO vanaf de bash promptAls allereerste experiment: een simpel voorbeeld van GPIO aansturing vanuit bash-scripts. Ik heb hiervoor een LED op GPIO 1 aangesloten met een serie-weerstand van 680 Ohm tussen pin P1-12 (gpio-1) en P1-6 (ground). GPIO 1 (volgens de Raspberry nummering, gpio18 volgens de BCM nummering) kan ik zo hoog en laag te maken, en zo de LED aan en uit zetten. Lezen kan op een vergelijkbare manier (met b.v. cat). Let op: gebruik hierbij de pinnummering zoals Broadcom ze voor de BCM aangeeft! kees@raspberrypi ~ $ sudo -i; # niet nodig voor
nieuwere Raspberries GPIO vanuit PythonEerst éénmalig installeren van de python headers en de gpio library (download van PiPy): sudo apt-get install python-dev Dan kan je vervolgens in een python-script of vanaf de prompt de gpio aan, voorbeeld: kees@raspberrypi ~ $ sudo python I2CLet op!Er zijn twee I2C bussen op de BCM2835 chip, op een revisie-1 B-board is bus 0 de bus op de P1 connector. Op een revisie-2 bord en op de PI 2 en 3, is dit bus 1!! En: 'I2C clock stretching' is niet goed ondersteund op de BCM283x chips (dus voor alle Raspberries), zie hier en hier!!! Op de Raspberry zit (zoals op zo veel systemen) een I2C bus (vergelijkbaar met de SMB bus). Op deze 2-pins (plus ground/voeding...) bus kan je ook je eigen hardware aansluiten (tot max 128 I2C chips). Het is een ideale manier om bijvoorbeeld extra I/O pinnen te krijgen met behulp van een PCF8574A chip (8 extra I/O pinnen). Ook bijvoorbeeld LCD displays, temperatuursensors, real-time clock, A/D converters en dergelijken kunnen via I2C worden aangesloten. Plus, je kan voor speciale taken je 'eigen I2C-chips' maken voor een paar Euro's, bijvoorbeeld voor stappenmotoren aan te sturen. De (1K8) pull-up weerstanden voor I2C zitten al op de Raspberry, hoeven dus niet extern te worden aangesloten. Voor de Raspberry Pi 1: I²C aansturen is in het begin wat lastig, omdat
de I2C modules niet
standaard in Raspbian geladen zijn. De i2c-bcm2708 module is blacklisted in
Voor de Rasperry Pi 3 kan je met PCF8574 voor extra I/OIk heb het hiernaast staande schema'tje met een PCF8574A (kost zo'n € 2) op een stukje
gaatjesprint gemaakt, en met een flatcable aangesloten op de I2C-pinnen van de Raspberry. Op de
print zitten ook twee LEDs en een switch. Het was nog even lastig de PCF te 'vinden' op de bus; het
adres op de bus was een bit naar rechts verschoven t.o.v. de documentatie van de PCF8574A; dus
kees@raspberrypi ~ $ i2cdetect -l
Standaard is de I²C-poort niet voor iedereen toegankelijk (kan hardware aansturen die de werking
van het systeem kan verstoren, zoals op een PC). Hier hebben we de I2C-bus zelf in de hand, dus om
niet steeds sudo voor een commando te moeten zetten is het handig de poort world-access te
geven: while [ "0xfe" = `i2cget -y 0 0x38 0xfe` ]; do sleep 1; i2cget -y 0 0x38 0xfd; sleep 1; done Temperatuursensor LM75Een ander leuk I2C blokje is de temperatuursensor LM75. Ik heb de low-cost NXP LM75BD, met een resolutie van 1/8 graad (11-bit) en een maximum onnauwkeurigheid van ±2 ºC van -25ºC tot +100ºC, en de mogelijkheid iets aan en uit te schakelen op instelbare temperatuurpunten via een aparte uitgang. Nauwkeurigheid wordt wat groter door calibratie; in ijswater wisselde dit bij mij tussen de 0 °C en de 0.375 °C (met chips uit dezelfde serie) dus zeg max een halve graad afwijking. De LM75BD zit in een SO8-behuizing (5x5 mm). Dit is zo'n beetje de kleinste die ik nog zo aan kan om uit de hand te solderen. 5 dunne draadjes aangesoldeerd plus een 100 nF condensator over Vcc (3.3 .. 5V) en aarde. De draden door een stukje isolatie geregen (van een andere draad gestript) samen met een stukje dun enkel-kern draad voor de mechanische stevigheid, en ik had de montage zoals hiernaast op mijn vingertop vergroot te zien is. Hier is later nog een druppel twee-componentenlijm omheen gegaan voor bescherming. I2C in PythonEen project dat een I2C-library voor Python gemaakt heeft is Quick2wire, een voorbeeldtoepassing is deze temperatuursensor en A/D Bij het aan aarde leggen van de 3 adrespinnen A0..A2 meldt de chip zich keurig met
Hieronder een grafiekje van de temperatuur in de kamer (meting per kwartier), waarbij in de loop van de week de buitentemperatuur flink naar beneden ging.De eerste dagen was het zonnig, en daalde de temperatuur zelfs 's nachts nauwelijks onder de 20 graden. Daarna snel kouder, overdag hield de verwarming de zaak op 20 graden (thermostaat aan andere kant van de kamer) afgezien van wat werkzaamheden waarbij de deur veel open moest, 's nachts koelde het snel af omdat het buiten maar iets boven de nul was. De hakkeltjs zijn wat eigenaardig: soms lijkt het of de LM75BD niet helemaal goed uitleest, en een update van de waarde doet tussen het lezen van de high- en de low-byte in... Heb ik later in software aangepast.
En nog een plaatje van meer recente datum, geplukt van de webview waarmee ik de resultaten op afstand kan bekijken (gebruik makend van Google Charts). Data is over 25 uur, met metingen om het uur. Aan subtiele veranderingen in de temperatuur kan je heel wat aflezen: bijvoorbeeld de kamertemperatuur is mooi constant, maar je ziet iets variatie
Als je dit weet, en je weet het leefritme, kan je hier weer je systeem op laten reageren. Specifieke PCF8574 driver werkt niet?LM75BD sensor list
De PCF8574 zou controle nog eenvoudiger moeten maken... Helaas lukt het niet de driver voor de
PCF8574 te laden omdat deze niet standaard in de compiler is meegecompileerd (
Seriële poortBoot-voortgang en ConsoleOp de P1 connector zit ook een seriële poort, dat wil zeggen een RxD en TxD pin (receive en transmit data, respectievelijk pin 10 en pin 8). Deze pinnen zijn niet compatibel met een RS-232 seriële poort op een PC/laptop, maar zijn geïnverteerd en slechts 3.3 Volt (in plaats van de plus en min 5 .. 25 Volt van een echte RS232). Ik wilde hem toch aan de pC hangen om te testen, en had nog een FTDI serieel-naar-USB converter liggen (niet precies die, maar ok), die dat aan kan; alternatief kan je bijvoorbeeld met een MAX232 naar echte RS-232 signalen (klassieke serial port) over gaan voor oudere computers. Door nu op de PC met bijvoorbeeld GtkTerm de verbinding op te zetten (met mijn
FTDI-oplossing, poort Poort in eigen programma'sMaar wat nu als je de seriële poort voor iets anders wilt gebruiken, bijvoorbeeld voor
aansturing van een serieel home control system? Hoe koppel je de poort los van de console-software?
Dit staat beschreven op "Using the Raspberry
Pi’s serial port". In het kort twee stappen, aanpassen van Minicom commandsDe basis-commando's: sudo apt-get install minicom ; Raspberry Pi 1, al
OK voor 3 Met mijn serial-naar-USB converter op mijn PC aangesloten en daar GtkTerm gestart
( Serial port op de raspberry Pi 3Helaas is de Raspberry Pi 3 wat ingewikkelder. Dit komt omdat standaard de
Uiteraard werkt nu Bluetooth niet meer, maar op dit moment is voor mij de seriële poort
belangrijker. De software UART heeft ook als nadeel dat bij verandering van de kloksnelheid van het
videoblok (bijvoorbeeld als de Raspberry warm wordt) de UART klok ook verandert, waarmee je dus je
verbinding kwijt raakt. Ook dit is weer te corrigeren,
bijvoorbeeld door de kloksnelheid vast te zetten (en
Ps: uitschakelen van BT en/of Wifi wordt in deze post behandeld: How to disable the Pi3's WLAN & Bluetooth ? Raspberry Temperatuur-sensorDe Raspberry heeft overigens ook een ingebouwde temperatuursensor, en ook spanningssensoren etc; uit te lezen met de VideoCore driver VCHIQ. sudo /opt/vc/bin/vcgencmd measure_temp; # geeft b.v.:
temp=45.6'C (rust, 18°C kamer) Hier meer informatie over beschikbare vcgencmd commando's. Om dit ook als gewone gebruiker te kunnen doen moet je wat extra instellingen doen (en een reset): sudo echo 'SUBSYSTEM=="vchiq",GROUP="video",MODE="0660"' >
/etc/udev/rules.d/10-vchiq-permissions.rules |
op mijn site |