.. note::
Hallo und willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Community auf Facebook! Tauche tiefer in Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten ein.
**Warum beitreten?**
- **Expertenunterstützung**: Löse Probleme nach dem Kauf und technische Herausforderungen mit Hilfe unserer Community und unseres Teams.
- **Lernen & Teilen**: Tausche Tipps und Tutorials aus, um deine Fähigkeiten zu verbessern.
- **Exklusive Vorschauen**: Erhalte frühzeitigen Zugang zu neuen Produktankündigungen und Vorschauen.
- **Sonderrabatte**: Genieße exklusive Rabatte auf unsere neuesten Produkte.
- **Festliche Aktionen und Verlosungen**: Nimm an Verlosungen und Feiertagsaktionen teil.
👉 Bereit, mit uns zu entdecken und zu erschaffen? Klicke auf [|link_sf_facebook|] und tritt noch heute bei!
.. _2.1.6_js_pi5_mcp3008:
2.1.6 Joystick (MCP3008)
========================
Einführung
----------
In diesem Projekt lernen wir, wie ein Joystick funktioniert.
Wir steuern den Joystick und zeigen die Ergebnisse auf dem Bildschirm an.
Benötigte Komponenten
---------------------
In diesem Projekt benötigen wir die folgenden Komponenten.
.. image:: ../img/image317-copy.png
Schaltplan
----------
Wenn die Daten des Joysticks gelesen werden, gibt es einige 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 du sie direkt über GPIO lesen kannst – oder optional ebenfalls über den ADC.
.. .. image:: ../img/image319.png
* - T-Board-Name
- Physical
- WiringPi
- BCM
* - SPICE0
- pin24
- 10
- 8
* - SPIMOSI
- pin19
- 12
- 10
* - SPIMISO
- pin21
- 13
- 9
* - SPISCLK
- pin23
- 14
- 11
* - GPIO22
- pin15
- 3
- 22
.. image:: ../img/schematic_2.1.9_joystick_mcp3008_js.png
Experimentelle Schritte
-----------------------
**Schritt 1:** Baue die Schaltung auf.
.. image:: ../img/2.1.9_Joystick_js.png
**Schritt 2:** Gehe in den Code-Ordner.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/nodejs/
**Schritt 3:** Führe den Code aus.
.. raw:: html
.. code-block::
sudo node joystick-2.js
Nachdem der Code gestartet wurde, bewege den Joystick – die entsprechenden Werte von x, y und Btn werden auf dem Bildschirm angezeigt.
**Code**
.. code-block:: js
const Gpio = require('pigpio').Gpio;
const mcpadc = require('mcp-spi-adc');
// Öffne Kanal 1 (X-Achse)
const xChannel = mcpadc.openMcp3008(1, { speedHz: 1350000 }, (err) => {
if (err) {
console.error('Fehler beim Öffnen des X-Kanals:', err);
process.exit(1);
}
});
// Öffne Kanal 2 (Y-Achse)
const yChannel = mcpadc.openMcp3008(2, { speedHz: 1350000 }, (err) => {
if (err) {
console.error('Fehler beim Öffnen des Y-Kanals:', err);
process.exit(1);
}
});
// Tastereingang an GPIO22 mit Pull-up
const btn = new Gpio(22, {
mode: Gpio.INPUT,
pullUpDown: Gpio.PUD_UP,
});
// Lese-Schleife
setInterval(() => {
xChannel.read((errX, xReading) => {
if (errX) {
console.error('Fehler beim Lesen des X-Kanals:', errX);
return;
}
yChannel.read((errY, yReading) => {
if (errY) {
console.error('Fehler beim Lesen des Y-Kanals:', errY);
return;
}
const x_val = Math.round(xReading.value * 1023);
const y_val = Math.round(yReading.value * 1023);
const btn_val = btn.digitalRead();
console.log(`x = ${x_val}, y = ${y_val}, btn = ${btn_val}\n`);
});
});
}, 100);
**Code-Erklärung**
.. code-block:: js
const mcpadc = require('mcp-spi-adc');
Diese Zeile importiert das Modul ``mcp-spi-adc``, das die Kommunikation mit dem MCP3008-ADC über die Hardware-SPI-Schnittstelle des Raspberry Pi ermöglicht.
.. code-block:: js
const xChannel = mcpadc.openMcp3008(1, { speedHz: 1350000 }, ...);
const yChannel = mcpadc.openMcp3008(2, { speedHz: 1350000 }, ...);
Diese Zeilen öffnen die analogen Eingangskanäle 1 und 2 des MCP3008 zum Lesen der X- und Y-Achsen-Signale des Joysticks.
Die SPI-Kommunikationsgeschwindigkeit wird auf 1,35 MHz gesetzt.
.. code-block:: js
const btn = new Gpio(22, {
mode: Gpio.INPUT,
pullUpDown: Gpio.PUD_UP,
});
Initialisiert GPIO-Pin 22 als digitalen Eingang mit internem Pull-up-Widerstand.
Dieser Pin wird verwendet, um den Zustand eines Tasters zu lesen.
.. code-block:: js
setInterval(() => {
xChannel.read(...);
yChannel.read(...);
}, 100);
Diese Funktion wird alle 100 Millisekunden ausgeführt.
Sie liest die Werte der X- und Y-Achse des Joysticks über die MCP3008-Kanäle 1 und 2 via SPI.
Die Gleitkommawerte (Bereich 0,0–1,0) werden in 10-Bit-Ganzzahlen (0–1023) umgewandelt.
Zusätzlich wird der Tasterzustand über ``digitalRead()`` an GPIO22 gelesen – Rückgabewert 0, wenn gedrückt, und 1, wenn nicht gedrückt.
Alle Werte werden in der Konsole ausgegeben.