.. 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.9_c:
2.1.9 Joystick
===============
.. note::
.. image:: ../img/mcp3008_and_adc0834.jpg
:width: 25%
:align: left
Abhängig von Ihrer Kit-Version identifizieren Sie bitte, ob Sie **ADC0834** oder **MCP3008** haben, und fahren Sie mit dem entsprechenden Abschnitt fort.
Einführung
----------
In diesem Projekt werden wir lernen, wie ein Joystick funktioniert. Wir bedienen den Joystick und zeigen die Ergebnisse auf dem Bildschirm an.
Benötigte Komponenten
---------------------
Für dieses Projekt benötigen wir die folgenden Komponenten.
.. image:: ../img/image317.png
Es ist definitiv praktisch, ein ganzes Set zu kaufen, hier ist der Link:
.. list-table::
:widths: 20 20 20
:header-rows: 1
* - Name
- ARTIKEL IN DIESEM KIT
- LINK
* - Raphael Kit
- 337
- |link_Raphael_kit|
Sie können diese auch einzeln über die untenstehenden Links kaufen.
.. list-table::
:widths: 30 20
:header-rows: 1
* - KOMPONENTENBESCHREIBUNG
- KAUF-LINK
* - :ref:`cpn_gpio_board`
- |link_gpio_board_buy|
* - :ref:`cpn_breadboard`
- |link_breadboard_buy|
* - :ref:`cpn_wires`
- |link_wires_buy|
* - :ref:`cpn_resistor`
- |link_resistor_buy|
* - :ref:`cpn_joystick`
- \-
* - :ref:`cpn_adc0834`
- \-
Schaltplan
---------------------
Wenn die Daten des Joysticks gelesen werden, gibt es Unterschiede zwischen den Achsen: Die Daten der X- und Y-Achse sind analog und müssen mit ADC0834 in einen digitalen Wert umgewandelt werden. Die Daten der Z-Achse sind digital, sodass sie direkt mit dem GPIO gelesen werden können oder auch mit ADC.
.. image:: ../img/image319.png
.. image:: ../img/image320.png
Experimentelle Verfahren
------------------------
**Schritt 1:** Bauen Sie den Schaltkreis.
.. image:: ../img/image193.png
**Schritt 2:** Wechseln Sie in das Verzeichnis des Codes.
.. raw:: html
.. code-block::
cd ~/raphael-kit/c/2.1.9/
**Schritt 3:** Kompilieren Sie den Code.
.. raw:: html
.. code-block::
gcc 2.1.9_Joystick.c -lwiringPi
**Schritt 4:** Führen Sie die ausführbare Datei aus.
.. raw:: html
.. code-block::
sudo ./a.out
Nachdem der Code ausgeführt wurde, drehen Sie den Joystick. Die entsprechenden Werte von x, y, Btn werden auf dem Bildschirm angezeigt.
.. note::
Falls es nach dem Ausführen nicht funktioniert oder die Fehlermeldung "wiringPi.h: No such file or directory" angezeigt wird, beziehen Sie sich bitte auf :ref:`install_wiringpi`.
**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;
digitalWrite(ADC_CLK, 1);
delayMicroseconds(2);
digitalWrite(ADC_CLK, 0);
delayMicroseconds(2);
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);
delayMicroseconds(2);
digitalWrite(ADC_CLK,0);
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);
......
Die Funktionsweise der Funktion ist im Abschnitt 2.1.7 Potentiometer detailliert 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 jeweils mit CH0 und CH1 des ADC0834 verbunden. Daher wird die Funktion getResult() aufgerufen, um die Werte von CH0 und CH1 auszulesen. Die ausgelesenen Werte sollten dann in den Variablen x_val und y_val gespeichert werden. Zusätzlich wird der Wert von SW des Joysticks ausgelesen und in der Variable Btn_val gespeichert. Schließlich werden die Werte von x_val, y_val und Btn_val mit der Funktion print() ausgegeben.
Phänomen-Bild
----------------
.. image:: ../img/image194.jpeg