Joystick aansturing Raspberry Pi

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)
view raw joystick.py hosted with ❤ by GitHub

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.

Een reactie plaatsen

%d bloggers liken dit: