Voor besturing of het maken van een selectie kan het in sommige gevallen handig zijn om over een joystick besturing te beschikken. De meeste joysticks die beschikbaar zijn op de markt werken analoog. Willen we een analoge joystick kunnen gebruiken op een Raspberry Pi dan moeten we het analoge signaal converteren naar een digitaal signaal.
Analoge joysticks hebben twee assen, waardoor een bepaalde spanning door twee potentiometers kan gaan (instelbare weerstand). Om de positie van joystick digitaal uit te kunnen lezen op de Raspberry Pi, gebruiken we een MCP3008.
Gebruikte componenten
Klik op een component voor gedetailleerde info:
• Analoge Joystick module KY-023
• MCP3008 IC Analog/Digital converter
• Breadboard
• Dupont kabels (male/female)
• 10kΩ Weerstand
Raspberry Pi 3 model B
Raspbian Strech (November 2018 kernel 4.14)
Aansluitschema
Aansluitingen Raspberry Pi/MCP3008
Raspberry Pi | MCP3008 |
---|---|
Pin #1 (3.3V) | Pin #16 (VDD) |
Pin #1 (3.3V) | Pin #15 (VREF) |
Pin #6 (GND) | Pin #14 (AGND) |
Pin #23 (SCLK) | Pin #13 (CLK) |
Pin #21 (MISO) | Pin #12 (DOUT) |
Pin #19 (MOSI) | Pin #11 (DIN) |
Pin #24 (CE0) | Pin #10 (CS/SHDN) |
Pin #6 (GND) | Pin #9 (DGND) |
Aansluitingen joystick module
RPi / MCP3008 | Joystick |
---|---|
Raspberry Pin #6 (GND) | GND |
Raspberry Pin #1 (3.3V) | +5V |
MCP3008 Pin #1 (CH0) | SW |
MCP3008 Pin #2 (CH1) | VRx |
MCP3008 Pin #3 (CH2) | VRy |
De MCP3008 is een 10-bits analoog naar digitaal converter, waarmee 1024 stappen kunnen worden gemeten. Bij een ingangsspanning van 3.3V worden de stappen dus per 3.2mV gemeten (3.3V /1024).
Pin 1 tot en met 8 op de MCP3008 zijn analoge ingangen. Voor het aansluiten van een Joystick hebben we maar drie kanalen nodig (x,y en switch). Pin 10 tot 13 zijn digitale uitgangen (SPI).
Op de joystick module wordt vaak een ingangsspanning aangegeven van 5V, deze modules werken echter ook zonder problemen op 3.3V. Dit is belangrijk omdat de GPIO’s van de Raspberry Pi en de MCP3008 ook op 3.3V werken, hierdoor hoeven we 5V niet terug te brengen naar 3.3V.
De SW pin van de joystick module is voor de drukknop (actie bevestiging). Om hiervoor een waarde van 0 of 1023 te ontvangen (al dan niet ingedrukt) plaatsen we een weerstand van 10 kΩ die aan VCC wordt gekoppeld. Zonder deze weerstand worden ongeldige waarden ontvangen bij het indrukken van de knop.
SPI activeren
In het script maken we gebruik van de SpiDev-library, deze is standaard aanwezig in Raspbian Stretch (volledige versie). Om the kunnen communiceren met de SPI interface van de Raspberry Pi moet deze geactiveerd zijn. Hiervoor gebruik je raspi-config
.
sudo raspi-config
Ga in het menu naar ‘Advanced Options’, selecteer de optie ‘SPI’ en activeer de interface.
Herstart hierna je Raspberry Pi:
sudo reboot -h 0
Joystick test-script
#!/usr/bin/python | |
import spidev | |
import time | |
import os | |
spi = spidev.SpiDev() | |
spi.open(0,0) | |
spi.max_speed_hz=1000000 | |
def spiChannel(channel): | |
adc = spi.xfer2([1,(8+channel)<<4,0]) | |
data = ((adc[1]&3) << 8) + adc[2] | |
return data | |
while True: | |
button = spiChannel(0) | |
xas = spiChannel(1) | |
yas = spiChannel(2) | |
print("X-as: {} Y-as: {} Button: {}".format(xas,yas,button)) | |
time.sleep(0.5) |
Je kunt het bovenstaande script downloaden met behulp van:
wget https://raspberrytips.nl/joystick.py
Start het script met:
python joystick.py
De MCP3008 geeft een waarde tussen 0 en 1023. Als de joystick zich in het midden bevindt, wordt er een waarde van ongeveer 512 ontvangen van de MCP3008. Aan het begin van de X en Y-as ontvangen de we waarde 0 en op het uiteinde van de assen 1023
Start het script en beweeg de joystick in een positie. Het script laat de individuele waarden van de X-as, Y-as en de drukknop zien.
Bedankt hiervoor! Wat doet die “spiChannel” functie precies?