KY-023 Joystick Modul (XY-Achsen)
Aus Linkerkit.de
Inhaltsverzeichnis
Bild
Technische Daten / Kurzbeschreibung
X und Y Position des Joysticks, werden als analoge Spannung auf den Ausgangspins ausgegeben.
In diesem Joystick wurde für die X-Achse, sowie für die Y-Achse, ein eigenes Potentiometer verbaut. Diese ergeben einen Spannungsteiler, wie dieser im folgendem Bild aufgezeigt wird
Im Ruhezustand befindet sich das Potentiometer in der Mitte, so dass Widerstand1=Widerstand2, womit auch die angelegte Spannung sich gleichmäßig auf beide verteilt - z.B Messwert Bei +V=5V -> 2.5V. Wird jetzt die Position von der z.B. X-Achse verändert, so ändern sich die jeweiligen Widerstände abhängig zur aktuellen Position - z.B. geht es in die eine Richtung so wird Widerstand 1 kleiner und Widerstand 2 größer, geht es in die andere Richtung, so wird dann Widerstand 1 größer und Widerstand 2 kleiner. Je nachdem wie sich die Widerstände untereinander aufteilen, resultiert dieses in einen jeweiligen Spannungswert, den man zwischen den Widerständen (beim Potentiometer sog. Schleifer) messen und somit die Position der Achse bestimmen kann. |
Pin-Belegung
Codebeispiel Arduino
Das Programm liest die aktuellen Werte der Eingang-Pins, konvertiert diese in eine Spannung (0-1023 -> 0V-5V) und gibt diese auf der seriellen Ausgabe aus.
// Deklaration und Initialisierung der Eingang-Pins int JoyStick_X = A0; // X-Achse-Signal int JoyStick_Y = A1; // Y-Achse-Signal int Button = 3; // Knopf void setup () { pinMode (JoyStick_X, INPUT); pinMode (JoyStick_Y, INPUT); pinMode (Button, INPUT); // Da der Knopf das Signal beim druecken auf Masse zieht, // schalten wir hiermit den PullUp-Widerstand ein digitalWrite(Button, HIGH); Serial.begin (9600); // Serielle Ausgabe mit 9600 bps } // Das Programm liest die aktuellen Werte der Eingang-Pins // und gibt diese auf der seriellen Ausgabe aus void loop () { float x, y; int Knopf; //Aktuelle Werte werden ausgelesen, auf den Spannungswert konvertiert... x = analogRead (JoyStick_X) * (5.0 / 1023.0); y = analogRead (JoyStick_Y) * (5.0 / 1023.0); Knopf = digitalRead (Button); //... und an dieser Stelle ausgegeben Serial.print ("X-Achse:"); Serial.print (x, 4); Serial.print ("V, "); Serial.print ("Y-Achse:"); Serial.print (y, 4); Serial.print ("V, "); Serial.print ("Knopf:"); if(Knopf==1) { Serial.println (" nicht gedrueckt"); } else { Serial.println (" gedrueckt"); } delay (200); }
Anschlussbelegung Arduino:
Knopf | = | [Pin 3] |
Y-Position | = | [Pin A1] |
X-Position | = | [Pin A0] |
Sensor +V | = | [Pin 5V] |
Sensor GND | = | [Pin GND] |
Beispielprogramm Download
Codebeispiel Raspberry Pi
!! Achtung !! Analoger Sensor !! Achtung !!
Der Raspberry Pi besitzt im Gegensatz zum Arduino keine analogen Eingänge bzw. es ist kein ADC (analog digital Converter) im Chip des Raspberry Pi's integriert. Dies schränkt den Raspberry Pi ein, wenn man Sensoren einsetzen möchte, wo nicht digital Werte ausgegeben werden [Spannungswert überschritten -> digital EIN | Spannungswert unterschritten -> digital AUS | Beispiel: Knopf gedrückt [EIN] Knopf losgelassen [AUS]], sondern es sich hier um einen kontinuierlichen veränderlichen Wert handeln sollte (Beispiel: Potentiometer -> Andere Position = Anderer Spannungswert)
Um diese Problematik zu umgehen, besitzt unser Sensorkit X40 mit dem KY-053 ein Modul mit 12 Bit genauen ADC, welches Sie am Raspberry nutzen können, um diesen um 4 analoge Eingänge erweitern zu können. Dieses wird per I2C an den Raspberry Pi angeschlossen, übernimmt die analoge Messung und gibt den Wert digital an den Raspberry Pi weiter.
Somit empfehlen wir, bei analogen Sensoren dieses Sets das KY-053 Modul mit dem besagten ADC dazwischenzuschalten. Nähere Informationen finden Sie auf der Informationsseite zum KY-053 Analog Digital Converter
!! Achtung !! Analoger Sensor !! Achtung !!
# #!/usr/bin/python # coding=utf-8 ############################################################################################################# ### Copyright by Joy-IT ### Published under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License ### Commercial use only after permission is requested and granted ### ### KY-023 Joystick Module - Raspberry Pi Python Code Example ### ############################################################################################################# # Dieser Code nutzt die ADS1115 und die I2C Python Library fuer den Raspberry Pi # Diese ist unter folgendem Link unter der BSD Lizenz veroeffentlicht # [https://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code] from Adafruit_ADS1x15 import ADS1x15 from time import sleep # Weitere benoetigte Module werden importiert und eingerichtet import time, signal, sys, os import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) # Benutzte Variablen werden initialisiert delayTime = 0.2 # Adresszuweisung ADS1x15 ADC ADS1015 = 0x00 # 12-bit ADC ADS1115 = 0x01 # 16-bit # Verstaerkung (Gain) wird ausgewaehlt gain = 4096 # +/- 4.096V # gain = 2048 # +/- 2.048V # gain = 1024 # +/- 1.024V # gain = 512 # +/- 0.512V # gain = 256 # +/- 0.256V # Abtasterate des ADC (SampleRate) wird ausgewaehlt # sps = 8 # 8 Samples pro Sekunde # sps = 16 # 16 Samples pro Sekunde # sps = 32 # 32 Samples pro Sekunde sps = 64 # 64 Samples pro Sekunde # sps = 128 # 128 Samples pro Sekunde # sps = 250 # 250 Samples pro Sekunde # sps = 475 # 475 Samples pro Sekunde # sps = 860 # 860 Samples pro Sekunde # ADC-Channel (1-4) wird ausgewaehlt x_adc_channel = 0 # Channel 0 für die x-Achse y_adc_channel = 1 # Channel 1 für die y-Achse # adc_channel = 2 # Channel 2 # adc_channel = 3 # Channel 3 # Hier wird der ADC initialisiert - beim KY-053 verwendeten ADC handelt es sich um einen ADS1115 Chipsatz adc = ADS1x15(ic=ADS1115) Button_PIN = 24 GPIO.setup(Button_PIN, GPIO.IN, pull_up_down = GPIO.PUD_UP) ############################################################################################################# # ######## # Hauptprogrammschleife # ######## # Das Programm liest die aktuellen Werte der Eingang-Pins # und gibt diese in der Konsole aus try: while True: #Aktuelle Werte werden aufgenommen x = adc.readADCSingleEnded(x_adc_channel, gain, sps) y = adc.readADCSingleEnded(y_adc_channel, gain, sps) # Ausgabe auf die Konsole if GPIO.input(Button_PIN) == True: print "X-Achse:", x,"mV, ","Y-Achse:", y,"mV, Button: nicht gedrückt" else: print "X-Achse:", x, "mV, ", "Y-Achse:", y, "mV, Button: gedrückt" print "---------------------------------------" # Reset + Delay button_pressed = False time.sleep(delayTime) except KeyboardInterrupt: GPIO.cleanup()
Anschlussbelegung Raspberry Pi:
Sensor KY-039
Knopf | = | GPIO24 | [Pin 18 (RPi)] |
Y-Position | = | Analog 1 | [Pin A1 (ADS1115 - KY-053)] |
X-Position | = | Analog 0 | [Pin A0 (ADS1115 - KY-053)] |
+V | = | 3,3V | [Pin 1 (RPi)] |
GND | = | Masse | [Pin 6 (RPi)] |
ADS1115 - KY-053:
VDD | = | 3,3V | [Pin 01] |
GND | = | Masse | [Pin 09] |
SCL | = | GPIO03 / SCL | [Pin 05 (RPi)] |
SDA | = | GPIO02 / SDA | [Pin 03 (RPi)] |
A0 | = | s.o. | [Sensor: X-Position (KY-023)] |
A1 | = | s.o. | [Sensor: Y-Position (KY-023)] |
Beispielprogramm Download
Zu starten mit dem Befehl:
sudo python SensorTest_RPi.py