De GPIO’s zijn een geweldige eigenschap van de Raspberry Pi, waarmee je allerlei elektronische componenten kunt aansturen. Meestal doe je dat met Python-software, maar wat als je in een bash-script of manueel op de commandline snel één specifieke GPIO wilt aansturen? We leggen in dit artikel uit hoe je dat doet.

Voor bovenstaand probleem komt het programma pigs (http://abyz.me.uk/rpi/piGPIO/pigs.html) van pas. Het maakt deel uit van de bibliotheek pigpio, die normaal standaard op Raspbian is geïnstalleerd. Indien dit niet het geval is, installeer dit dan met:

sudo apt install pigpio

Start daarna de pigpio-bibliotheek als daemon:

sudo pigpiod

Nu kun je met pigs bijvoorbeeld GPIO26 op hoog (1) zetten:

pigs w 26 1

Als je op GPIO26 een LED hebt aangesloten, dan gaat die nu aan. Je kunt ook meerdere opdrachten tegelijk aan pigs doorgeven. Zo zet je GPIO26 bijvoorbeeld op hoog, pauzeer je een seconde en zet je dezelfde GPIO dan op laag:

pigs w 26 1 mils 1000 w 26 0

Als je nu de LED wilt laten knipperen, doe je dat in bash met een while-loop:

while true; do pigs w 26 1 mils 1000 w 26 0 mils 1000; done

Overigens kun je met pulsbreedtemodulatie (PWM) verschillende helderheden voor je LED simuleren. Probeer de volgende opdrachten maar eens uit en bekijk het verschil in helderheid van de LED:

pigs p 26 255
pigs p 26 128
pigs p 26 64
pigs p 26 32
pigs p 26 16
pigs p 26 0

Je kunt ook de waarde van een GPIO-pin inlezen, bijvoorbeeld als er een sensor aanhangt:

pigs r 26

Bekijk zeker de webpagina van pigs, want de mogelijkheden zijn zeer uitgebreid. Zo kun je ook gewaarschuwd worden bij een verandering in specifieke GPIO’s en kun je zelfs aangesloten I²C-apparatuur aanspreken.

USB-apparaten op de Raspberry Pi in- en uitschakelen
Op sommige USB-hubs kun je de stroom naar de USB-poorten individueel in- en uitschakelen. Het programma hub-ctrl (https://github.com/codazoda/hub-ctrl.c) doet dat. Hiermee kun je ook de interne USB-hub van de Raspberry Pi in- en uitschakelen. Helaas werkt dat op de Pi alleen voor alle USB-poorten tegelijkertijd en dus niet voor specifieke poorten.

Maar in sommige gevallen is dat wel interessant. Wat als je een apparaat met je Pi wilt in- en uitschakelen, maar je de GPIO’s niet kunt of wilt gebruiken? Dan gebruik je gewoon USB. Door de USB-hub in- en uit te schakelen, schakel je alle aangesloten USB-apparaten in en uit. Denk maar aan een USB-ventilator. Je kunt er zelfs elektronische schakelingen mee aansturen. Dan steek je een USB-kabel in een van de poorten en knip je het uiteinde van de kabel eraf. In de kabel zitten vier draden: 5V (rood), GND (zwart) en twee datadraden. Met een weerstand en een LED schakel je zo eenvoudig een LED zonder daarbij van de GPIO’s gebruik te moeten maken. Installeer de benodigdheden voor hub-ctrl:

sudo apt update
sudo apt install git gcc libUSB-dev

Download de software met:
git clone https://github.com/codazoda/hub-ctrl.c.git

Ga daarna in de directory van het project en compileer het programma:

cd hub-ctrl.c
gcc -o hub-ctrl hub-ctrl.c -lUSB

Nu kun je de USB-poorten van je Pi uitschakelen met:

sudo ./hub-ctrl -h 0 -P 2 -p 0

En terug inschakelen doe je met:

sudo ./hub-ctrl -h 0 -P 2 -p 1

Overigens werkt dit niet bij alle modellen van de Raspberry Pi. We hebben dit uitgeprobeerd en kwamen tot de volgende vaststellingen:

·         Pi Zero en Pi Zero W: werkt niet, want deze modellen hebben geen interne USB-hub.

·         Pi 1 Model B: werkt niet.

·         Pi 1 Model B+, 2 en 3B : werkt.

·         Pi 3B+: werkt, maar je dient de optie -h 1 in plaats van -h 0 te gebruiken.

Let op: je schakelt alle USB-poorten tegelijkertijd uit, dus als je een toetsenbord of een WiFi-adapter hebt aangesloten, schakel je die ook uit. En zorg dat je niet per ongeluk de optie -P 1 in plaats van -P 2 gebruikt, want dan schakel je de ethernetpoort uit, die immers ook op de interne USB-hub is aangesloten…

Met hub-ctrl schakel je de USB-poorten van de Raspberry Pi aan en uit.

Udev-regels voor Arduino

Elk serieel USB-apparaat dat je op je pc aansluit, krijgt in Linux een apparaatpad, zoals /dev/ttyUSB0 of /dev/ttyUSB1. Als je meerdere Arduino’s tegelijk aansluit, krijgt het eerste apparaatpad /dev/ttyUSB0, de tweede /dev/ttyUSB1, enzovoorts. Maar wat als je een specifieke Arduino een apparaatpad als /dev/arduino_nano wilt geven? Dat kan…

Sluit eerst je Arduino aan en kijk met lsusbvóór en nadat je de Arduino aansluit wat het vendor ID en product ID is. Dat zie je in de uitvoer van lsusb in de vorm 0403:6001, waarbij 0403 het vendor ID en 6001 het product ID is. Dat is in dit geval van een officiële Arduino Nano. Gebruik je een Chinese kloon, dan zullen de waardes verschillen. Als je meerdere Arduino’s van hetzelfde type ook wilt onderscheiden, dien je hun serienummer te weten. Dat vraag je op met:

sudo -v -d0403:6001

Het serienummer krijg je na iSerial te zien en dit is het tweede getal.

Nu ken je alle informatie, die je nodig hebt om een specifieke Arduino een eigen apparaatpad te geven. Creëer een bestand /etc/udev/rules.d/90-arduino.rules en plaats daarin voor elke Arduino de volgende regel:

SUBSYSTEMS==”USB”, ATTRS{idVendor}==”0403″, ATTRS{idProduct}==”6001″, SYMLINK+=”arduino_nano_$attr{serial}”

Als je nu je Arduino Nano aansluit, krijgt die als apparaatpad /dev/arduino_nano_serienummer.

FTDI EEPROM van de Arduino flashen

De USB FTDI-chip van een Arduino, die je gebruikt om firmware naar te flashen, heeft EEPROM dat je met de tool ftdi_eeprom kunt beschrijven. Hiermee kun je zelf het vendor ID, product ID, de beschrijving van de fabrikant en het product- en het serienummer aanpassen. Dat kan handig zijn als je zowel originele Arduino’s als Chinese klonen hebt en je ze allemaal op dezelfde manier wilt kunnen identificeren, bijvoorbeeld via een udev-regel.

Installeer het programma met:

sudo apt install ftdi-eeprom

Creëer dan voor de te flashen Arduino een bestand arduino_ftdi_USB.conf met de volgende inhoud (pas deze aan je situatie aan):

vendor_id=0x0403
product_id=0x6001

max_power=250 # Max. power consumption: value * 2 mA.

manufacturer=”Arduino”
product=”Arduino Nano”
serial=”A700fmiq”
use_serial=true

Daarna flash je deze gegevens naar de USB FTDI EEPROM van de Arduino met:

sudo ftdi_eeprom –flash-eeprom arduino_ftdi_usb.conf

Overigens kun je met dezelfde tool ook het EEPROM van de Arduino uitlezen en naar een bestand schrijven. Dat gaat als volgt:

sudo ftdi_eeprom –read-eeprom arduino_ftdi_usb.conf

In het configuratiebestand zet je dan een regel met de bestandsnaam, waarin het EEPROM moet worden geschreven:

filename=arduino_nano_ftdi_eeprom.img

Bekijk zeker ook de man-pagina van ftdi_eeprom voor de betekenis van de verschillende parameters in het configuratiebestand.

Wat als je een apparaat met je Pi wilt in- en uitschakelen, maar je de GPIO’s niet kunt of wilt gebruiken? Dan gebruik je gewoon USB.