Analoge input met de MCP3008

Soms is het wat frustrerend dat de Raspberry Pi niet van analoge ingangen voorzien is. Daardoor kun je een aantal sensoren niet zo gemakkelijk met een Raspberry PI verbinden. Voorbeelden hiervan zijn de licht afhankelijke weerstand (LDR) , de analoge temperatuur sensor (LM35) of de precisie Celsius temperatuursensor (TMP36).

Gelukkig is het vrij eenvoudig om deze analoge functie toe te voegen door een analoog-naar-digitaal omzetter (ADC) aan te sluiten op je Raspberry Pi. Hiervoor maken we gebruik van een MCP3008, een 10bit 8-kanaals analoog / digitaal-omzetter. De MCP3008 maakt via de SPI-bus verbinding met de Raspberry Pi.

De AD-converter
Een analoog-digitaal omzetter of AD-converter (ADC) zet een analoog signaal, bijvoorbeeld een spanningswaarde, om in een digitaal signaal. De MCP-chip zet een analoog voltage om in een getal tussen de 0 en 1023 (210 bit stappen). De MCP3008 heeft 8 analoge ingangen en is met een SPI interface uit te lezen op de Raspberry Pi.

De MCP3008 wordt als volgt met de Raspberry Pi verbonden.

Samplerate
Een A/D converter neemt van het analoge signaal een sample (monster), dit gebeurt duizenden keren (rate) per seconde. Des te hoger de samplerate, des te beter de digitale kwaliteit (resolutie). In onderstaande grafiek zie je een analoog signaal (golf), een steeds hoger wordende samplerate en daaronder een steeds betere digitale versie van de aangeboden sinus.

Samplerate instelling
Bij een VDD = 5V is de maximale samplerate 200 ksps.
Bij een VDD = 2.7V is de maximale samplerate 75 ksps.
Een VDD van 3,3V levert een samplerate van tussen de 75 en 200 ksps. Dat is voor dit project voldoende.

Electrische specificaties
Hieronder zie je het spanningsbereik van CH0 en CH1 in single-ended mode.

Single-ended mode = de eenvoudigste en meest gebruikte methode voor de overdracht van elektrische signalen over draden. De ene draad draagt ​​een variërende spanning die het signaal vertegenwoordigt, terwijl de andere draad is verbonden met een referentiespanning, meestal aarde.

De tabel geeft de minimale en maximale waardes aan. Voor dit project gebruiken wij een VREF van 3,3V. Daarmee is de maximale input dus ook maximaal 3.3V. Met andere woorden: Het bereik van 0 tot 3.3V wordt door de ADC in 1023 stappen verdeeld.

Het schema
Als input verbinden we een licht gevoelige weerstand (LDR) – R2. Hiermee kunnen we lichtsterkte meten.

De LDR
– Bij normaal licht is de LDR weerstand R2 ongeveer 10 Kohm, terwijl dit in het donker meer dan 2Mohm wordt, waardoor de uitgangsspanning toeneemt naar 3,3V.
– Als er veel licht is, heeft de LDR een lage weerstand, waardoor de uitgangsspanning richting 0V daalt.

In dit project wordt een LDR gebruikt, maar elk component dat zijn weerstand wijzigt kan gebruikt en aangesloten worden aan de MCP3008 om digitaal uitgelezen te worden. Het output voltage gaat naar CH0 op de ADC.

De layout
Hieronder is de lay-out voor het breadboard. Sluit de LDR aan op CH0 (pin 1) van de A/D-converter. Het maakt niet uit of je een oud of nieuw Raspberry Pi model gebruikt. De gebruikteGPIO-pinnen zijn hetzelfde.

De A/D converter omzetting
De ADC is 10-bits, zodat het een bereik van nummers van 0 tot 1023 (210) kan rapporteren. Een aflezing van 0 betekent dat de invoer 0 V is en een waarde van 1023 betekent dat de invoer 3,3 V is. Ons 0 – 3.3V bereik zou gelijk zijn aan een 0 – 10000 Lux-bereik.

System update/upgrade en bibliotheek (spidev) laden
Voordat we met de code opstarten, willen we eerste dat het systeem up-to-date is met:
sudo apt-get update

Nu nog even alles upgraden met:
sudo apt-get upgrade

Nu nog python-dev installeren met:
sudo apt-get install python-dev

Zet in de config de SPI interface aan
sudo raspi-config

Is het spi-device beschikbaar?
ls /dev/spi*
Als het zegt: no such file or directory! Dan is SPI niet geactiveerd!

Controleer of raspi-config zijn werk heeft gedaan:
grep -i 'dtparam' /boot/config.txt

Zie je dtparam=spi=on staan? Zo niet? Ga dan weer naar de config met:
sudo raspi-config en zet de SPI-interface aan.

Start vervolgens de Raspberry Pi opnieuw op
sudo reboot

Note: Voor de reboot kreeg ik onderstaande melding, daarna was het weg:
spi.open(0,0) IOError: Errno 2 No such file or directory
In het forum vond ik de oplossing:
https://www.raspberrypi.org/forums/viewtopic.php?p=1103454#p1103454

Python script – ldr1.py
Maak een map mcp3008 aan, open de nano editor en plak onderstaande code erin. Sla vervolgens het python script als ldr1.py op.

Het resultaat
Voer het bovenstaande script uit met sudo python ldr.py en je zult ongeveer de volgende waarden moeten zien. Bedek de LDR en laat een fel licht op de LDR schijnen om de waarde te veranderen.

Note: Bij de laatste waarde is de LDR uit het breadboard gehaald. De waarde is dan maximaal.

Python script – ldr2.py
Het onderstaande python script is in principe hetzelfde als hierboven, maar wijkt iets af omdat de gelezen waarden van het maximum afgetrokken wordt.

Resultaat van ldr2.py

Note: Bij de laatste waarde is de LDR uit het breadboard gehaald. De waarde is nu minimaal.

Have A Nice Day!