.. note::
Hallo, willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Community auf Facebook!
Tauchen Sie tiefer in Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten ein.
**Warum beitreten?**
- **Expertenunterstützung**: Lösen Sie Probleme nach dem Kauf und technische Herausforderungen mit Hilfe unserer Community und unseres Teams.
- **Lernen & Teilen**: Tauschen Sie Tipps und Tutorials aus, um Ihre Fähigkeiten zu verbessern.
- **Exklusive Vorschauen**: Erhalten Sie frühzeitigen Zugriff auf neue Produktankündigungen und exklusive Einblicke.
- **Spezielle Rabatte**: Genießen Sie exklusive Rabatte auf unsere neuesten Produkte.
- **Festliche Aktionen und Giveaways**: Nehmen Sie an Verlosungen und Feiertagsaktionen teil.
👉 Bereit, mit uns zu forschen und zu kreieren? Klicken Sie auf [|link_sf_facebook|] und treten Sie noch heute bei!
.. _2.1.9_c_mcp3008:
2.1.9 Joystick (MCP3008)
==========================
.. 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 lernen wir, wie ein Joystick funktioniert.
Wir bewegen den Joystick und zeigen die Ergebnisse auf dem Bildschirm an.
Benötigte Komponenten
-------------------------------
Für dieses Projekt benötigen wir folgende Komponenten.
.. image:: ../img/image317-copy.png
Es ist definitiv bequem, ein komplettes Kit zu kaufen, hier ist der Link:
.. list-table::
:widths: 20 20 20
:header-rows: 1
* - Name
- ELEMENTE IN DIESEM KIT
- LINK
* - Raphael Kit
- 337
- |link_Raphael_kit|
Sie können die Teile auch einzeln über die folgenden Links kaufen.
.. list-table::
:widths: 30 20
:header-rows: 1
* - KOMPONENTENBESCHREIBUNG
- KAUFLINK
* - :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_mcp3008`
- \-
Schaltplan
-----------------
Beim Auslesen der Joystick-Daten gibt es Unterschiede zwischen den Achsen:
Die Daten der X- und Y-Achse sind analog und müssen mit dem MCP3008 in digitale Werte umgewandelt werden.
Die Daten der Z-Achse sind digital, sodass Sie diese direkt über ein GPIO auslesen können (oder auch über den ADC).
.. image:: ../img/schematic_2.1.9_joystick_mcp3008.png
.. list-table::
:widths: 30 30 30 30
:header-rows: 1
* - T-Board-Name
- physikalisch
- WiringPi
- BCM
* - SPICE0
- pin24
- 10
- 8
* - SPIMOSI
- pin19
- 12
- 10
* - SPIMISO
- pin21
- 13
- 9
* - SPISCLK
- pin23
- 14
- 11
* - GPIO22
- pin15
- 3
- 22
Experimentelle Verfahren
-------------------------------------------------
**Schritt 1:** Schließen Sie den Stromkreis an.
.. image:: ../img/july24_2.1.9_joystick_mcp3008.png
**Schritt 2:** Gehen Sie in den Code-Ordner.
.. raw:: html
.. code-block::
cd ~/raphael-kit/c/2.1.9-2/
**Schritt 3:** Kompilieren Sie den Code.
.. raw:: html
.. code-block::
gcc 2.1.9_Joystick.c -o joystick -lwiringPi
**Schritt 4:** Führen Sie die ausführbare Datei aus.
.. raw:: html
.. code-block::
./joystick
Nach dem Start des Programms bewegen Sie den Joystick.
Die entsprechenden Werte von x, y und Btn werden auf dem Bildschirm angezeigt.
.. note::
Wenn es nach dem Ausführen nicht funktioniert oder die Fehlermeldung „wiringPi.h: No such file or directory“ angezeigt wird, lesen Sie bitte :ref:`install_wiringpi`.
**Code**
.. code-block:: c
#include
#include
#include
#define SPI_CHANNEL 0
#define SPI_SPEED 1000000 // 1 MHz
#define BtnPin 3 // WiringPi 3 = BCM GPIO22
// Auslesen vom MCP3008-Kanal (0–7)
int read_ADC(int channel) {
if (channel < 0 || channel > 7) return -1;
unsigned char buffer[3];
buffer[0] = 1; // Startbit
buffer[1] = (8 + channel) << 4; // Kanalkonfiguration
buffer[2] = 0;
wiringPiSPIDataRW(SPI_CHANNEL, buffer, 3);
int result = ((buffer[1] & 0x03) << 8) | buffer[2];
return result;
}
int main(void) {
if (wiringPiSetup() == -1) {
printf("WiringPi setup failed!\n");
return 1;
}
if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) {
printf("SPI setup failed!\n");
return 1;
}
pinMode(BtnPin, INPUT);
pullUpDnControl(BtnPin, PUD_UP);
while (1) {
int x_val = read_ADC(0); // VRX an CH0
int y_val = read_ADC(1); // VRY an CH1
int btn_val = digitalRead(BtnPin); // SW-Taste
printf("x = %d, y = %d, btn = %d\n", x_val, y_val, btn_val);
delay(100);
}
return 0;
}
**Code-Erklärung**
#. Dieser Abschnitt initialisiert die für GPIO- und SPI-Kommunikation benötigten Bibliotheken.
.. code-block:: c
#include
#include
#include
#define SPI_CHANNEL 0
#define SPI_SPEED 1000000 // 1 MHz
#define BtnPin 3 // WiringPi 3 = BCM GPIO22
#. Definiert eine Funktion ``read_ADC()``, um analoge Daten vom MCP3008 auszulesen.
Die Kommunikation erfolgt über SPI, um Daten von einem bestimmten Kanal (0–7) anzufordern und die Antwort zu einem 10-Bit-ADC-Wert zu verarbeiten.
.. code-block:: c
int read_ADC(int channel) {
if (channel < 0 || channel > 7) return -1;
unsigned char buffer[3];
buffer[0] = 1;
buffer[1] = (8 + channel) << 4;
buffer[2] = 0;
wiringPiSPIDataRW(SPI_CHANNEL, buffer, 3);
int result = ((buffer[1] & 0x03) << 8) | buffer[2];
return result;
}
#. Die Hauptfunktion initialisiert WiringPi und die SPI-Schnittstelle, konfiguriert den Button-Pin des Joysticks und liest kontinuierlich die Joystick-Werte aus, die auf der Konsole ausgegeben werden.
.. code-block:: c
int main(void) {
if (wiringPiSetup() == -1) {
printf("WiringPi setup failed!\n");
return 1;
}
if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) {
printf("SPI setup failed!\n");
return 1;
}
pinMode(BtnPin, INPUT);
pullUpDnControl(BtnPin, PUD_UP);
while (1) {
int x_val = read_ADC(0); // VRX an CH0
int y_val = read_ADC(1); // VRY an CH1
int btn_val = digitalRead(BtnPin); // SW an GPIO22
printf("x = %d, y = %d, btn = %d\n", x_val, y_val, btn_val);
delay(100);
}
return 0;
}
#. In diesem Programm:
- VRX des Joysticks ist an CH0 des MCP3008 angeschlossen.
- VRY ist an CH1 angeschlossen.
- Die Taste (SW) ist an GPIO22 (WiringPi-Pin 3) angeschlossen.
- Die Funktion ``read_ADC()`` wird verwendet, um analoge Werte von VRX und VRY zu lesen.
- Der digitale Wert der Joystick-Taste wird mit ``digitalRead()`` ausgelesen.
- Alle Werte werden alle 100 Millisekunden kontinuierlich ausgegeben.