Berry Good: GPS en Sensors voor Raspberry Pi & Co.
op
Dankzij I2C en SPI vervalt het grootste deel van de signaalconditionering die anders nodig is om sensoren op microcontrollers aan te sluiten. Moderne kant-en-klare sensoren leveren hun gegevens kant-en-klaar aan via een gestandaardiseerde seriële bus. Het enige probleem vormen de kleine behuizingen, aangezien veel van deze sensoren bedoeld zijn voor gebruik in smartphones en andere handheld en wearable apparaten. Als gevolg daarvan worden zij verpakt in BGA- of andere minuscule behuizingen, die moeilijk met de hand zijn te assembleren (zie kader Het probleem met BGA's). In het geval van productie in kleine series zou het oneconomisch zijn om gebruik te maken van kant-en-klare evaluatiekaarten die een hoofdcontroller plus alle sensortechnologie bevatten. In plaats daarvan zijn uitbreidingskaarten, zoals de Berryverzameling, een aantrekkelijk alternatief.
Het probleem met BGA's |
Tam Hanna gebruikte onlangs een HDC2010 van Texas Instruments, een piepkleine BGA-vochtsensor. Zelfs de meest ervaren contractfabrikanten hebben soms problemen met de precieze plaatsing en soldering van dergelijke componenten. Van een partij van vijf printen waarin deze chip werd gebruikt, waren er bij aankomst drie defect en moesten voor herbewerking terug naar China. Het is daarom aan te bevelen de fabrikant om een extra röntgencontrole te vragen. Dit kost meestal iets meer, maar dat is doorgaans goed besteed door de tijdsbesparing die het oplevert. |
Welkom bij de Berry-familie!
De Berry boards zijn een volwassen serie boards van de fabrikant OzzMaker. Hier kijken we naar de inertial measurement unit (IMU) producten BerryIMU en BerryGPS-IMU. Figuur 1 toont beide boards.
Moderne sensorchips zijn -om zo min mogelijk pinnen te gebruiken- gewoonlijk slechts adresseerbaar op een beperkt aantal I2C-adressen. De sensoren op de BerryIMU -vermeld in tabel 1- bieden gewoonlijk twee verschillende adresopties.
Tabel 1: Boards en functiesBoard | Sensors |
LSM6DSL | Versnellingsmeter en gyroscoop |
LIS3MDL | Magnetometer |
BMP388 | Druk- en temperatuursensor |
Dankzij de jumpers aan de onderzijde van de boards (figuur 2) kunnen de I2C-adressen worden geconfigureerd met een klein druppeltje soldeer. De printen werken zowel met de 3,3 V voeding van een Raspberry Pi als met de 5 V van de Arduinowereld. BerryIMU V3 is een speciaal geval omdat die niet alleen via I2C communiceert, maar met een jumper ook kan worden omgeschakeld naar SPI interface .
Ik vond de aansluitoplossing in figuur 3, waarmee het IMU-board op een Raspberry Pi kan worden aangesloten, eigenlijk best grappig. Berry boards zijn nogal recalcitrant als het aankomt op Raspberry Pi interfacing. Ik wilde een Model 4B gebruiken omdat die op dat moment op mijn bureau stond. Bij het aansluiten van de BerryIMU moet je er goed op letten dat het kleine adapterbordje zo op de header wordt geplaatst dat de socketopening voor de kabelaansluiting van de Raspberry Pi af wijst.
Testen
Om op het LAN naar een Raspberry Pi te zoeken is het een goed idee om nmap te gebruiken. Het commando nmap -sP 192.168.1.1/2 vindt Raspberry Pi's die met het netwerk zijn verbonden, zelfs zonder dat er schermen op zijn aangesloten.
De volgende stap is om de sensoren te activeren. De Berry boards zijn goed gedocumenteerd, evenals hun gebruik in verschillende scenario's. Zoals vaak het geval is, kan de voorbeeldcode worden gevonden op GitHub. Aangezien de huidige versies van Raspbian de git-client bevatten, wordt het volgende commando gebruikt om de code uit de repository te halen:
pi@raspberrypi:~ $ git clone http://github.com/ozzmaker/BerryIMU.git
Voor een eerste poging om data te lezen, is python-BerryIMU-gyro-accel-compass een goede keuze. Voer het volgende commando in:
pi@raspberrypi:~/BerryIMU/python-BerryIMU-gyro-accel-compass $ python3 berryIMU-simple.py
Zo ziet een karakteristieke respons eruit:
Found BerryIMUv3 (LSM6DSL and LIS3MDL)
Loop Time 0.02 # ACCX Angle 173.62 ACCY Angle 179.06 # # GRYX Angle 0.08 GYRY Angle -0.03 GYRZ Angle 0.02 # # CFangleX Angle 104.20 CFangleY Angle 107.43 # # HEADING 303.92 tiltCompensatedHeading 313.31 #
Als u het hoofdwerkbestand van het programma opent, vindt u de hardware-specifieke ondersteuningsbibliotheek:
IMU.detectIMU()
if(IMU.BerryIMUversion == 99):
print(" No BerryIMU found... exiting ")
sys.exit()
IMU.initIMU()
De evaluatie van de gegevens vindt plaats in een eindeloze lus waarin functies worden aangeroepen die worden geleverd door de IMU-software. Variabelen slaan de resultaten aanvankelijk op voor later gebruik:
while True:
ACCx = IMU.readACCx()
ACCy = IMU.readACCy()
ACCz = IMU.readACCz()
GYRx = IMU.readGYRx()
GYRy = IMU.readGYRy()
GYRz = IMU.readGYRz()
MAGx = IMU.readMAGx()
MAGy = IMU.readMAGy()
MAGz = IMU.readMAGz()
Met het geopende bibliotheekbestand kunt u zien dat de voorbeeldcode een schoolvoorbeeld is van hoe een Pythontoepassing gemodulariseerd kan worden. In de header wordt de SMBus-module gebruikt die verantwoordelijk is voor de interactie met de I2C-bus op het Raspberry Pi platform:
import smbus
bus = smbus.SMBus(1)
from LSM9DS0 import *
from LSM9DS1 import *
from LSM6DSL import *
from LIS3MDL import *
import time
Sensoren
Ik heb vaak ervaren dat de interactie met dergelijke sensoren maar een betrekkelijk klein deel van het werk is. Maar als je eenmaal de datasheets van sensoren van andere fabrikanten hebt doorgespit, zijn nieuwe chips snel te begrijpen. Lastiger is de gegevensverwerking op een hoger niveau.
Gelukkig is BerryIMU bijzonder goed gedocumenteerd. Er wordt optimaal gebruik gemaakt van wat mogelijk is met een Raspberry Pi, zoals het gebruik van de gratis versie van Wolfram Mathematica analyse software. Omwille van de ruimte is het aan te bevelen ook een kijkje te nemen op de Ozzmaker website, waar ook figuur 4 vandaan komt.
De website bevat onder meer grafieken die laten zien welke invloed de verplaatsing van hard en zacht ijzer heeft op het kompas. Dit resulteert in een verschuiving van de gegevens of van het middelpunt van de puntenwolk. Hard Iron Distortions (HID's) worden veroorzaakt door magnetische objecten die permanent in de buurt van het object zijn. Soft Iron Distortions (SID's) daarentegen zijn ferromagnetische en andere verstoringen, zoals worden veroorzaakt door het magnetisch veld van de aarde. HID's verschuiven alleen het middelpunt, terwijl SID's de normaal ronde vorm van de veldplot vervormen. Zoals u ziet biedt de website heel wat achtergrondinformatie.
Drone sensor
De BerryIMU is minder geschikt voor gebruik in drones omdat de verbinding met de adapter (figuur 3) niet trillingsbestendig kan worden uitgevoerd. Het tweede probleem is dat dit bord geen GPS-gegevens levert, terwijl dat voor veel toepassingen belangrijk is.
Er is echter een alternatief board: de BerryGPS-IMU. Om die te gebruiken moet eerst een tien-pins header worden gesoldeerd. Met een beetje soldeerervaring is dit niet al te moeilijk, ondanks de nabijheid van twee SMD ontkoppelcondensatoren (zie ook Waarom handmatig solderen?).
Waarom handmatig solderen? |
---|
Pin headers en de bijbehorende female headers zijn componenten die enorme problemen opleveren voor geautomatiseerde assemblage machines. Zelfs MicroChip zou hiermee problemen hebben gehad toen zij Arduino-compatibele producten aan hun assortiment toevoegden. |
Vier sets schroeven en moeren worden meegeleverd voor de mechanische aansluiting. De gaten op de printplaat zijn bedoeld voor de Raspbery Pi Zero. Bij gebruik met een Raspbery Pi 4 blijven twee gaten ongebruikt, zoals te zien in figuur 5.
Nadat je hem hebt aangesloten (terwijl hij uit staat), kun je het systeem aanzetten en een scan uitvoeren naar de print met i2cdetect. Dit zou dezelfde resultaten moeten opleveren als de BerryIMU, aangezien deze dezelfde sensoren heeft.
Het BerryGPS-IMU board bevat een u-blox GPS-module, waardoor het zich onderscheidt van de kleinere BerryIMU. De GPS kan gebruikmaken van de geïntegreerde, of van een externe antenne, te configureren met een schakelaar. Het ronde, zilveren object dat eruitziet als een batterij is een supercondensator ter ondersteuning van de tussentijdse korte-termijn opslag van efemeridegegevens van satellietposities. Deze informatie helpt de GPS-ontvanger om sneller op te starten en positiegegevens te leveren na een korte periode van uitschakeling.
De eigenlijke communicatie tussen de GPS-module en de hostcomputer vindt plaats via een seriële poort. Met de Raspberry Pi is dit enigszins problematisch vanwege van tijd tot tijd optredende kleine inconsistenties van de kernel. U moet daarom het Raspberry Pi OS als volgt updaten voordat u dit board gebruikt:
pi@raspberrypi ~ $ sudo apt-get update
pi@raspberrypi ~ $ sudo apt-get upgrade
pi@raspberrypi ~ $ sudo reboot
De seriële poort wordt geconfigureerd via raspi-config. De optie Interface Options en vervolgens Serial worden dan geselecteerd. Het resultaat moet zijn dat de seriële poort niet langer een login-console biedt.
In de volgende stap vraagt het programma of de hardware voor de seriële poort moet worden ingeschakeld - hier is het antwoord een duidelijk ja. De bevestiging in figuur 6 verschijnt dan. Nu is alleen nog een reboot nodig om de nieuwe hardwareconfiguratie te effectueren.
Opbouw van GPS Data
Door het volgende commando in te voeren, zal de Raspberry Pi de door de GPS-module geleverde gegevens naar de opdrachtregel uitvoeren:
pi@raspberrypi:~ $ cat /dev/serial0
$GPGSV,1,1,00*79
$GLGSV,1,1,00*65
$GNGLL,,,,,,V,N*7A
$GNTXT,01,01,01,NMEA unknown msg*46
De gegevens, in NMEA-formaat, zijn niet zo ingewikkeld. Als je alle informatie uit de GPS-datastroom wilt halen zou je je eigen parser kunnen bouwen. Maar omdat Linux al lang met succes wordt gebruikt als OS voor procescomputers en controllers is er een uitgebreide infrastructuur voor het verwerken van geo-data. Wie een GPS-module integreert kan gebruikmaken van toepassingen van derden om de gegevens snel en gemakkelijk te verwerken.
Om de data-pipeline op te zetten, heb je eerst een groep van packages nodig. Vooral belangrijk is gpsd (gpsdaemon). Deze software, die op de achtergrond draait, stuurt de GPS informatie door naar andere software:
pi@raspberrypi:~ $ sudo apt-get install gpsd-clients gpsd -y
Nadat de download is voltooid, moet het configuratiebestand worden gewijzigd in een teksteditor (hier wordt pico gebruikt):
pi@raspberrypi:~ $ sudo pico /etc/default/gpsd
Belangrijkste is het blok Devices:
# Devices gpsd should collect to at boot time.
# They need to be read/writeable, either by user gpsd or the group dialout.
DEVICES=""
- - - - -
# Devices gpsd should collect to at boot time.
# They need to be read/writeable, either by user gpsd or the group dialout.
DEVICES="/dev/serial0"
Op dit punt kan de werking van de pipeline worden gecontroleerd met bijvoorbeeld gpsmon. Het resultaat is een grafisch aantrekkelijk overzicht van de NMEA-gegevens:
pi@raspberrypi:~ $ gpsmon
Eenvoudige Sensing en Locatiebepaling
Ongeacht wat je bouwt, het aansluiten van versnellingsmeters, magnetometers en andere sensoren is voor microcontrollerontwikkelaars een tijdsinvestering waarvan je nooit spijt krijgt. De boards van OzzMaker zijn niet alleen ideaal voor experimenten, maar vergemakkelijken ook het praktische gebruik, dankzij de uitgebreide documentatie.
De boards zijn ook zeer geschikt voor productie in kleine series, omdat ze in kleine hoeveelheden goedkoper zijn dan zelf produceren. Al met al zijn ze zeer aan te bevelen!
Vragen of opmerkingen?
Heeft u vragen of opmerkingen naar aanleiding van dit artikel? Stuur dan een e-mail naar de auteur op tamhan@tamoggemon.com of naar Elektor op editor@elektor.com.
Bijdragen van:
Auteur: Tam Hanna
Redacteur: Dr. Thomas Scherer
Layout: Giel Dols
Vertaling: Jelle Aarnoudse
Discussie (0 opmerking(en))