.. note::
Hallo und willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Gemeinschaft auf Facebook! Tauchen Sie tiefer ein in die Welt von Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten.
**Warum beitreten?**
- **Expertenunterstützung**: Lösen Sie Nachverkaufsprobleme und technische Herausforderungen mit Hilfe unserer Gemeinschaft und unseres Teams.
- **Lernen & Teilen**: Tauschen Sie Tipps und Anleitungen aus, um Ihre Fähigkeiten zu verbessern.
- **Exklusive Vorschauen**: Erhalten Sie frühzeitigen Zugang zu neuen Produktankündigungen und exklusiven Einblicken.
- **Spezialrabatte**: Genießen Sie exklusive Rabatte auf unsere neuesten Produkte.
- **Festliche Aktionen und Gewinnspiele**: Nehmen Sie an Gewinnspielen und Feiertagsaktionen teil.
👉 Sind Sie bereit, mit uns zu erkunden und zu erschaffen? Klicken Sie auf [|link_sf_facebook|] und treten Sie heute bei!
2.1.6 Joystick
==============
.. note::
.. image:: img/mcp3008_and_adc0834.jpg
:width: 25%
:align: left
Je nach deiner Kit-Version überprüfe bitte, ob du **ADC0834** oder **MCP3008** hast, und fahre mit dem entsprechenden Abschnitt fort.
Einführung
------------
In diesem Projekt lernen wir, wie der Joystick funktioniert. Wir manipulieren den Joystick und zeigen die Ergebnisse auf dem Bildschirm an.
Komponenten
--------------------
.. image:: media/image317.png
Prinzip
---------
**Joystick**
Die Grundidee eines Joysticks besteht darin, die Bewegung eines Sticks in elektronische Informationen umzuwandeln, die ein Computer verarbeiten kann.
Um dem Computer einen vollständigen Bewegungsbereich zu übermitteln, muss ein Joystick die Position des Sticks auf zwei Achsen messen - der X-Achse (von links nach rechts) und der Y-Achse (nach oben und unten). Genau wie in der Grundgeometrie bestimmen die XY-Koordinaten genau die Position des Sticks.
Um die Position des Steuerknüppels zu bestimmen, überwacht das Joystick-Steuerungssystem einfach die Position jeder Welle. Das herkömmliche analoge Joystick-Design macht dies mit zwei Potentiometern oder variablen Widerständen.
Der Joystick verfügt außerdem über einen digitalen Eingang, der beim Herunterdrücken des Joysticks betätigt wird.
.. image:: media/image318.png
Schematische Darstellung
---------------------------------
Wenn die Daten des Joysticks gelesen werden,
gibt es einige Unterschiede zwischen den Achsen: Die Daten der X- und Y-Achse sind analog.
Daher muss ADC0834 verwendet werden, um den Analogwert in einen Digitalwert umzuwandeln.
Die Daten der Z-Achse sind digital,
sodass Sie den GPIO direkt zum Lesen oder den ADC zum Lesen verwenden können.
.. image:: media/image319.png
.. image:: media/image320.png
Experimentelle Verfahren
----------------------------------
Schritt 1: Bauen Sie die Schaltung auf.
.. image:: media/image193.png
:width: 800
Für Benutzer in C-Sprache
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Schritt 2: Gehen Sie zum Ordner der Kode.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/c/2.1.6/
Schritt 3: Kompilieren Sie die Kode.
.. raw:: html
.. code-block::
gcc 2.1.6_Joystick.c -lwiringPi
Schritt 4: Führen Sie die ausführbare Datei aus.
.. raw:: html
.. code-block::
sudo ./a.out
Nachdem die Kode ausgeführt wurde, drehen Sie den Joystick, und die entsprechenden Werte von x, y, Btn werden auf dem Bildschirm angezeigt.
**Code**
.. code-block:: c
#include
#include
#include
typedef unsigned char uchar;
typedef unsigned int uint;
#define ADC_CS 0
#define ADC_CLK 1
#define ADC_DIO 2
#define BtnPin 3
uchar get_ADC_Result(uint channel)
{
uchar i;
uchar dat1=0, dat2=0;
int sel = channel > 1 & 1;
int odd = channel & 1;
pinMode(ADC_DIO, OUTPUT);
digitalWrite(ADC_CS, 0);
// Start bit
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
//Single End mode
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
// ODD
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,odd); delayMicroseconds(2);
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
//Select
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,sel); delayMicroseconds(2);
digitalWrite(ADC_CLK,1);
digitalWrite(ADC_DIO,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,1); delayMicroseconds(2);
for(i=0;i<8;i++)
{
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,0); delayMicroseconds(2);
pinMode(ADC_DIO, INPUT);
dat1=dat1<<1 | digitalRead(ADC_DIO);
}
for(i=0;i<8;i++)
{
dat2 = dat2 | ((uchar)(digitalRead(ADC_DIO))< 1 & 1;
int odd = channel & 1;
pinMode(ADC_DIO, OUTPUT);
digitalWrite(ADC_CS, 0);
// Start bit
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
//Single End mode
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
......
Der Arbeitsprozess der Funktion ist in in :ref:`pot` beschrieben.
.. code-block:: c
while(1){
x_val = get_ADC_Result(0);
y_val = get_ADC_Result(1);
btn_val = digitalRead(BtnPin);
printf("x = %d, y = %d, btn = %d\n", x_val, y_val, btn_val);
delay(100);
}
VRX und VRY des Joysticks sind mit CH0 bzw. CH1 des ADC0834 verbunden.
Daher wird die Funktion ``getResult()`` aufgerufen, um die Werte von CH0 und CH1 zu lesen.
Dann sollten die gelesenen Werte in den Variablen ``x_val`` und ``y_val`` gespeichert werden.
Lesen Sie außerdem den Wert von SW des Joysticks und speichern Sie ihn in der Variablen ``btn_val``.
Schließlich sollen die Werte von ``x_val``, ``y_val`` und ``btn_val`` mit der Funktion ``print()`` gedruckt werden.
Für Python-Sprachbenutzer
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Schritt 2: Gehen Sie zum Ordner der Kode.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/python/
Schritt 3: Ausführen.
.. raw:: html
.. code-block::
sudo python3 2.1.6_Joystick.py
Nachdem die Kode ausgeführt wurde, drehen Sie den Joystick, und die entsprechenden Werte von x, y, btn werden auf dem Bildschirm angezeigt.
**Code**
.. note::
Sie können den folgenden Code **Ändern/Zurücksetzen/Kopieren/Ausführen/Stoppen** . Zuvor müssen Sie jedoch zu einem Quellcodepfad wie ``davinci-kit-for-raspberry-pi/python`` gehen.
.. raw:: html
.. code-block:: python
import RPi.GPIO as GPIO
import ADC0834
import time
BtnPin = 22
def setup():
# Set the GPIO modes to BCM Numbering
GPIO.setmode(GPIO.BCM)
GPIO.setup(BtnPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
ADC0834.setup()
def destroy():
# Release resource
GPIO.cleanup()
def loop():
while True:
x_val = ADC0834.getResult(0)
y_val = ADC0834.getResult(1)
Btn_val = GPIO.input(BtnPin)
print ('X: %d Y: %d Btn: %d' % (x_val, y_val, Btn_val))
time.sleep(0.2)
if __name__ == '__main__':
setup()
try:
loop()
except KeyboardInterrupt: # When 'Ctrl+C' is pressed, the program destroy() will be executed.
destroy()
**Code Erklärung**
.. code-block:: python
def loop():
while True:
x_val = ADC0834.getResult(0)
y_val = ADC0834.getResult(1)
Btn_val = GPIO.input(BtnPin)
print ('X: %d Y: %d Btn: %d' % (x_val, y_val, Btn_val))
time.sleep(0.2)
VRX und VRY des Joysticks sind mit CH0 bzw. CH1 des ADC0834 verbunden.
Daher wird die Funktion ``getResult()`` aufgerufen, um die Werte von CH0 und CH1 zu lesen.
Dann sollten die gelesenen Werte in den Variablen ``x_val`` und ``y_val`` gespeichert werden.
Lesen Sie außerdem den Wert von SW des Joysticks und speichern Sie ihn in der Variablen ``btn_val``.
Schließlich sollen die Werte von ``x_val``, ``y_val`` und ``btn_val`` mit der Funktion ``print()`` gedruckt werden.
Phänomen Bild
------------------
.. image:: media/image194.jpeg