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 Potenziometer verbaut. Diese ergeben einen Spannungsteiler, wie dieser, welcher im folgenden Bild aufgezeigt ist.

Im Ruhezustand befindet sich das Potenziometer in der Mitte, sodass Widerstand1=Widerstand2 ist, 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 Potenziometer sog. Schleifer) messen und somit die Position der Achse bestimmen kann.

Pin-Belegung

Codebeispiel Arduino

Anschlussbelegung Arduino

Arduino Sensor
5V +V
Masse GND
Pin A1 VRy
Pin A0 VRx
Pin 3 Knopf

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);
}

Beispielprogramm Download

KY023-Arduino.zip

Codebeispiel Raspberry Pi

Anschlussbelegung Raspberry Pi

Raspberry Pi Sensor
GPIO 24 [Pin 18] Knopf
3,3V [Pin 1] +V
Masse [Pin 6] GND
KY-053 A1 VRy
KY-053 A0 VRx
Sensor KY-053
VRy A1
VRx A0
Raspberry Pi KY-053
GPIO 3 [Pin 5] SCL
Gpio 2 [Pin 3] SDA
+V 3,3V [Pin 17]
GND Masse [Pin 14]

Analoger Sensor, daher muss folgendes beachtet werden

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 16 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

Das Programm nutzt zur Ansteuerung des ADS1115 ADC die entsprechenden ADS1x15 und I2C Python-Libraries von Adafruit. Diese wurden unter dem folgenden Link https://github.com/adafruit/Adafruit_CircuitPython_ADS1x15 unter der MIT-Lizenz veröffentlicht. Die benötigten Libraries sind nicht im unteren Download-Paket enthalten.

Installation der Bibliothek

Diese Bibliothek können Sie mit den folgenden Befehl installieren:

sudo pip3 install adafruit-circuitpython-ads1x15

Damit der Raspberry Pi mit dem Sensor auf dem I2C-Bus kommunizieren kann, muss vorab die I2C-Funktion beim Raspberry Pi aktiviert werden. Hierzu müssen folgende Zeilen am Ende der Datei "/boot/config.txt" hinzugefügt werden:

dtparam=i2c_arm=on

Die Datei kann mit folgenden Befehl editiert werden:

sudo nano /boot/config.txt

Führen Sie nach dem abspeichern einen Neustart des System aus, damit I²C richtig aktiviert wird:

sudo reboot

Mit der Tastenfolge [Strg+X -> Y -> Enter] kann die Datei, nach dem hinzufügen der Zeile am unteren Ende, gespeichert und geschlossen werden.

Außerdem werden zusätzliche Bibliotheken benötigt, um I2C innerhalb Python nutzen zu können. Um diese zu installieren muss folgender Befehl in die Konsole eingegeben werden:

sudo apt-get install python-smbus i2c-tools -y

Nach der Installation kann das folgende Python-Code Beispiel verwendet werden.

Das Programm liest die aktuellen Werte der Eingang-Pins und gibt diese in der Konsole als Wert in [mV] aus.

Bitte beachten Sie das Sie vor der benutzung dieses Beispiels I2C auf ihrem Raspberry Pi aktivieren müssen.

#!/usr/bin/python
# coding=utf-8

import time
import board
import busio
import adafruit_ads1x15.ads1115 as ADS
from adafruit_ads1x15.analog_in import AnalogIn
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

Button_PIN = 24
GPIO.setup(Button_PIN, GPIO.IN, pull_up_down = GPIO.PUD_UP)

delayTime = 0.2
# Create the I2C bus
i2c = busio.I2C(board.SCL, board.SDA)

# Create the ADC object using the I2C bus
ads = ADS.ADS1115(i2c)

# Create single-ended input on channels
chan0 = AnalogIn(ads, ADS.P0)
chan1 = AnalogIn(ads, ADS.P1)
chan2 = AnalogIn(ads, ADS.P2)
chan3 = AnalogIn(ads, ADS.P3)


while True:
                #Aktuelle Werte werden aufgenommen
                x = '%.2f' % chan0.voltage
                y = '%.2f' % chan1.voltage
 
                # Ausgabe auf die Konsole
                if GPIO.input(Button_PIN) == True:
                        print ("X-Achse:", x,"V, ","Y-Achse:", y,"V, Button: nicht gedrückt")
                else:
                        print ("X-Achse:", x, "V, ", "Y-Achse:", y, "V, Button: gedrückt")
                print ("---------------------------------------")
 
                # Reset + Delay
                button_pressed = False
                time.sleep(delayTime)

Beispielprogramm Download

KY023-RPi.zip

Zu starten mit dem Befehl:

sudo python3 KY023.py

Codebeispiel Micro:Bit

Anschlussbelegung Micro:Bit:

Micro:Bit Sensor
3V +V
Masse GND
Pin 2 VRx
Pin 1 VRy
Pin 0 Knopf

Hierbei handelt es sich um ein MakeCode Beispiel für Micro:Bit welches essenziel das gleiche macht wie die Beispiele der anderen beiden Varianten. Jedoch ist dieses Beispiel eher näher an das Beispiel des Raspberry Pi angelehnt als an das Beispiel des Arduino.

Beispielprogramm Download

microbit-KY-023