.. 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_js_pi5_mcp3008:
2.1.9 Joystick (MCP3008)
==========================
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 die folgenden 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 Komponenten 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 GPIO auslesen können oder ebenfalls den ADC verwenden können.
.. .. image:: ../img/image319.png
* - T-Board Name
- Physikalisch
- WiringPi
- BCM
* - SPICE0
- Pin 24
- 10
- 8
* - SPIMOSI
- Pin 19
- 12
- 10
* - SPIMISO
- Pin 21
- 13
- 9
* - SPISCLK
- Pin 23
- 14
- 11
* - GPIO22
- Pin 15
- 3
- 22
.. image:: ../img/schematic_2.1.9_joystick_mcp3008_js.png
Experimentelle Verfahren
-------------------------------------
**Schritt 1:** Bauen Sie den Stromkreis auf.
.. image:: ../img/2.1.9_Joystick_js.png
**Schritt 2:** Wechseln Sie in den Code-Ordner.
.. raw:: html
.. code-block::
cd ~/raphael-kit/nodejs/
**Schritt 3:** Führen Sie den Code aus.
.. raw:: html
.. code-block::
sudo node joystick-2.js
Nach dem Start des Codes bewegen Sie den Joystick, und 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 auf GPIO22 mit Pull-Up-Widerstand
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 unter Verwendung der SPI-Hardware-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, um die Signale der X- und Y-Achse des Joysticks auszulesen.
Die SPI-Kommunikationsgeschwindigkeit ist auf 1,35 MHz eingestellt.
.. code-block:: js
const btn = new Gpio(22, {
mode: Gpio.INPUT,
pullUpDown: Gpio.PUD_UP,
});
Initialisiert den GPIO-Pin 22 als digitalen Eingang mit internem Pull-Up-Widerstand.
Dieser Pin wird verwendet, um den Status eines Tasters zu lesen.
.. code-block:: js
setInterval(() => {
xChannel.read(...);
yChannel.read(...);
}, 100);
Diese Funktion wird alle 100 Millisekunden ausgeführt. Sie liest die X- und Y-Achsenwerte des Joysticks über die MCP3008-Kanäle 1 und 2 per SPI aus.
Die Gleitkommawerte (Bereich 0,0–1,0) werden in 10-Bit-Ganzzahlen (0–1023) umgerechnet.
Außerdem wird der Tasterstatus mit ``digitalRead()`` auf GPIO22 gelesen, der 0 zurückgibt, wenn er gedrückt ist, und 1, wenn er losgelassen wird.
Alle Werte werden auf der Konsole ausgegeben.