Für einige Anwendungen wie Spiele kann ein Joystick sinnvoll oder gar nötig erscheinen. Da diese aber meist rein analog funktionieren muss das Signal umgewandelt werden, was wir mittels des MCP3008 Bausteins machen. Der Aufbau und das auslesen eines Joysticks wird in diesem Tutorial gezeigt.
Diese analogen Joysticks haben zwei Achsen, welche durch zwei Potentiometer (verstellbarer Widerstand) eine gewisse Spannung durchlassen. Damit die Position auch digital am Raspberry ausgelesen werden kann wird der MCP3008 benötigt. Das Schema dieses Bausteins ist folgendermaßen:
Auf der linken Seite sind 8 analoge Eingänge, wovon wir allerdings nur 3 brauchen.
Auf der rechten Seite sind die digitalen Ausgänge, wobei die Übertragung über DIN und DOUT stattfindet.
Der MCP3008 Baustein ist ein 10 Bit Anlog-Digital Wandler. Das bedeutet, dass er maximal 2^10 also 1024 Bitkombinationen erreichen kann, also die Werte von 0 bis 1023. Bei einer Eingangsspannung von 3.3V sind das ca. 3.2mV Schritte, die verwertet werden können (3.3V / 1024).
Zubehör
- Joystick (analog)
- MCP3008 IC (Analog-Digital Wandler)
- Breadboard
- Male – Female Jumper Kabel
- einen 10kΩ Widerstand
Aufbau
Obwohl auf dem Joystick 5V Eingangsspannung steht, funktioniert es auch ohne Probleme mit 3.3V, was bei der Nutzung des MCP3008 sogar wichtig ist. Die Bezeichnung SW ist für den Button, der betätigt wird, wenn man den Joystick drückt. Damit dieser entweder 0 oder 1023 ist (gedrückt oder nicht gedrückt) wird ein 10kΩ Widerstand an VCC gehängt. Ohne diesen Widerstand werden ungültige Zahlen ausgegeben, die nicht eindeutig zuzuweisen sind.
Die Pin Belegung des Raspberrys sieht folgendermaßen aus:
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) |
Folgend noch der Anschluss an den Joystick:
RPi / MCP3008 | Joystick |
---|---|
Raspberry Pin 6 (GND) | GND |
Raspberry Pin 1 (3.3V) | +5V |
Pin 1 (CH0) | SW |
Pin 2 (CH1) | VRx |
Pin 3 (CH2) | VRy |
Testen
In meinem Skript benutze ich die SpiDev Bibliothek. Falls du diese noch nicht installiert hast, solltest du das tun, bevor du den Joystick testest.
Wie bereits erwähnt wird durch den MCP3008 ein Wert zwischen 0 und 1023 zurückgegeben. Ist der Joystick im „Ruhezustand“, also mittig, wird ungefähr 512 zurückgegeben. Am einen Ende einer Achse wird 0 zurückgegeben, am anderen 1023 (an welchem Ende ist abhängig, wie man auf den Joystick schaut).
Du kannst die Testdatei runterladen
wget http://www.tutorials-raspberrypi.de/wp-content/uploads/scripts/joystick_test.py
oder selbst erstellen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
#!/usr/bin/python import spidev import os import time # Definiere Achsen Channels # (channel 3 bis 7 koennen für weitere Tasten/Joysticks # vergeben werden) swt_channel = 0 vrx_channel = 1 vry_channel = 2 # Zeitverzoegerung, alle wie viel Sekunden ausgelesen wird delay = 0.5 # Spi oeffnen spi = spidev.SpiDev() spi.open(0,0) spi.max_speed_hz=1000000 # Funktion zum auslesen des MCP3008 # channel zwischen 0 und 7 def readChannel(channel): val = spi.xfer2([1,(8+channel)<<4,0]) data = ((val[1]&3) << 8) + val[2] return data # Endlosschleife while True: # Position bestimmen vrx_pos = readChannel(vrx_channel) vry_pos = readChannel(vry_channel) # SW bestimmen swt_val = readChannel(swt_channel) # Ausgabe print("VRx : {} VRy : {} SW : {}".format(vrx_pos,vry_pos,swt_val)) # Warten time.sleep(delay) |
Anschließend kannst du mittels
sudo python joystick_test.py
das Skript starten und den Joystick bewegen. Du wirst feststellen, dass 1024 Schritte höchstwahrscheinlich zu viel sind, da so eine Genauigkeit mit dem Finger auf einem kleinen Joystick kaum erreicht werden kann. Daher würde ich dazu raten in einer Anwendung Bereiche festzulegen und nicht auf einzelne Werte (abgesehen von 0 / 1023) zu testen.
31 Kommentare
Wenn ich das Tutorial für „MCP3008 Analog-Digital Wandler“ anklicke lande ich hier beim Joysticktutorial. Kannst Du bitte den Link reparieren um auch dieses Tutorial einsehbar zu machen 🙂
Vielen Dank
Von wo hast du den Link denn geklickt? Hier ist der Direktlink:
http://tutorials-raspberrypi.de/raspberry-pi-mcp3008-analoge-signale-auslesen/
Hey Felix,
beim Versuch, SpiDev zu installieren, fragt er beim letzten Schritt immer nach einer Readme und einem Changelog, und bricht dementsprechend den Prozess ab. Also hab ich die Zeile einfach mal auskommentiert, danach lief der Prozess durch, aber wenn ich dann das Joystick Script starten will, kann er die SpiDev nicht importieren, weil er sie nicht findet…
Hast du ne Idee, was das sein könnte?
Danke schonmal, und deine Seite ist echt großartig 😀
Johannes
Das klingt danach, dass SpiDev nicht richtig installiert ist. Kannst du mal die genaue Fehlermeldung posten?
Hey Felix, danke für die schnelle Antwort, hab ich gar nicht gesehen.
Wenn ich das Script ausführen will, gibt er folgenden Fehler aus:
Traceback (most recent call last):
File „joystick.py“, line 3, in
import spidev
ImportError: No module named ’spidev‘
also ich vermute mal, dass bei der Installation ein Fehler war, aber ich weis nicht, wie ich es lösen könnte.
Danke für die Hilfe, Johannes
Hast du all Schritte aus dem Handbuch ausgeführt? Kamen da Fehlermeldungen? SpiDev muss natürlich korrekt installiert sein.
Hey Felix,
beim Versuch, SpiDev zu installieren, fragt er beim letzten Schritt immer nach einer Readme und einem Changelog, und bricht dementsprechend den Prozess ab. Also hab ich die Zeile einfach mal auskommentiert, danach lief der Prozess durch, aber wenn ich dann das Joystick Script starten will, kann er die SpiDev nicht importieren, weil er sie nicht findet…
Hast du ne Idee, was das sein könnte?
Danke schonmal, und deine Seite ist echt großartig 😀
Johannes
Das klingt danach, dass SpiDev nicht richtig installiert ist. Kannst du mal die genaue Fehlermeldung posten?
Hey Felix, danke für die schnelle Antwort, hab ich gar nicht gesehen.
Wenn ich das Script ausführen will, gibt er folgenden Fehler aus:
Traceback (most recent call last):
File „joystick.py“, line 3, in
import spidev
ImportError: No module named ’spidev‘
also ich vermute mal, dass bei der Installation ein Fehler war, aber ich weis nicht, wie ich es lösen könnte.
Danke für die Hilfe, Johannes
Hast du all Schritte aus dem Handbuch ausgeführt? Kamen da Fehlermeldungen? SpiDev muss natürlich korrekt installiert sein.
Hey Felix …
Wollte SpiDev installieren aber gleich am Anfang bei
„You need to be sure that SPI is enabled in your system (disabled by default because rarely
used). Open a new terminal and enter:
sudo nano /etc/modprobe.d/raspi-blacklist.conf“ kommt es zu Problemen.
This will open a text editor. You should see a line like this in this file:
spi-bcm2708 ……….und genau der Text kommt nicht…. was mach ich falsch? der Text Editor geht auf aber ohne Inhalt ^^
Ist SPI aktiviert (
sudo raspi-config
-> SPI)?Hey Felix …
Wollte SpiDev installieren aber gleich am Anfang bei
„You need to be sure that SPI is enabled in your system (disabled by default because rarely
used). Open a new terminal and enter:
sudo nano /etc/modprobe.d/raspi-blacklist.conf“ kommt es zu Problemen.
This will open a text editor. You should see a line like this in this file:
spi-bcm2708 ……….und genau der Text kommt nicht…. was mach ich falsch? der Text Editor geht auf aber ohne Inhalt ^^
Ist SPI aktiviert (
sudo raspi-config
-> SPI)?Danke für deine schnelle Antwort,
Sollte aktiviert sein, bin unter (sudo raspi-config) ->
[ 5 Interfacing Options Configure connections to peripherals ] ->
[ P4 SPI Enable/Disable automatic loading of SPI kernel module (needed for e.g. PiFace) ]
gegangen
und dann sagt er mir das ich SPI aktiviert habe !
Aktuell ist es unter „7. Advanced Option“ > „A6 SPI“.
mh ,
Habe den Raspberry eigentlich auf der aktuellen Version, dennoch wen ich unter
7. Advanced Options Configure advanced settings
gehe ist
A6. GL Driver Enable/Disable
und kein SPI vorhanden !?
Habe dir mal die Fehlermeldung raus gesucht hoffe du kannst mir anhand der sagen was ich falsch mache.
Traceback (most recent call last):
File „setup.py“, line 29, in
long_description= open(‚README.md‘).read() + „n“ + open(‚CHANGELOG.md‘).read(),
IOError: [Errno 2] No such file or directory: ‚README.md‘
Kommentier einfach mal das Ende von Zeile 29 aus, das den Fehler verursacht. Oder du erstellst du README.md Datei.
Danke für deine schnelle Antwort,
Sollte aktiviert sein, bin unter (sudo raspi-config) ->
[ 5 Interfacing Options Configure connections to peripherals ] ->
[ P4 SPI Enable/Disable automatic loading of SPI kernel module (needed for e.g. PiFace) ]
gegangen
und dann sagt er mir das ich SPI aktiviert habe !
Aktuell ist es unter „7. Advanced Option“ > „A6 SPI“.
mh ,
Habe den Raspberry eigentlich auf der aktuellen Version, dennoch wen ich unter
7. Advanced Options Configure advanced settings
gehe ist
A6. GL Driver Enable/Disable
und kein SPI vorhanden !?
Habe dir mal die Fehlermeldung raus gesucht hoffe du kannst mir anhand der sagen was ich falsch mache.
Traceback (most recent call last):
File „setup.py“, line 29, in
long_description= open(‚README.md‘).read() + „n“ + open(‚CHANGELOG.md‘).read(),
IOError: [Errno 2] No such file or directory: ‚README.md‘
Kommentier einfach mal das Ende von Zeile 29 aus, das den Fehler verursacht. Oder du erstellst du README.md Datei.
Hallo felix
ich habe das problem das ich soweit alles richtig verdrahtet habe und ich als ausgabe ohne den joystick zu berühren solche ausgaben bekomme
VRx : 799 VRy : 799 SW : 799
VRx : 0 VRy : 0 SW : 0
VRx : 255 VRy : 0 SW : 0
VRx : 0 VRy : 0 SW : 0
VRx : 255 VRy : 0 SW : 0
VRx : 0 VRy : 0 SW : 0
VRx : 255 VRy : 0 SW : 0
an was kann das liegen
vielen dank für deine bemühungen
mfg
Schade das ich keine Antwort bekomme
Das kann leider unterschiedliche Gründe haben 🙁
Hallo Felix,
vielen Dank für deine Hilfestellung zum Joystick und MCP3008. Mein Programm läuft, jedoch werden lediglich nur Nullen ausgegeben für die VRx bzw. VRy – Positionen, so als würde der Pi gar nichts erst messen.
Muss man die PINs vom Pi erstmal auf einen bestimmten Modus setzen?
Normalerweise muss man ja immer erstmal
gpio.setmode(gpio.BCM)
und dann den einzelnen PINs vom Pi einen Input / Output zuweisen mit
gpio.setup(PIN, gpio.OUT oder gpio.IN)
Woran kann es sonst liegen, dass nur 0 ausgeben wird?
Beste Grüße,
Niklas
Muss die Pin Belegung genauso sein? Gaebe es eventuell eine Moeglichkeit mehrere Joysticks anzuschliessen?
Hallo Felix,
bei mir erscheint wenn ich sudo nano /etc/modprobe.d/raspi-blacklist.conf eingebe nicht spi-bcm2708. Wenn ich lsmod eingebe kommt statt spi_bcm2708 der Eintrag spi.bcm2835.
Hast du eine Idee was ich machen muss?
Habe mir Raspbian auch mal neu aufgesetzt und finde seit dem mein Python 2 Idle nicht mehr obwohl laut python -v Python 2.7 installiert ist.