Fernbedienungen mit Joystick

Nach ersten Erfahrungen mit dem robusten Robot Car und unserer Fernbedienung mit dem LCD-Keypad Shield, bei dem wir den gesendeten Code auf dem Display angezeigt bekommen, möchte ich in dieser Folge weitere Möglichkeiten für eine selbst gebaute Fernsteuerung mit unseren Micro Controllern und elektronischen Bauteilen zeigen. Dabei kommt zunächst wieder der 433 MHz-Transceiver HC-12 zum Einsatz.

Bei den Vorüberlegungen in der letzten Folge hatten wir bereits berücksichtigt, dass wir auch einen analogen Joystick anschließen wollen und dann den Code aus den Werten für die x- und y-Achse berechnen. Dabei liegen die Werte bei einem 10-Bit-Analogeingang zwischen 0 und 1023 mit jeweils ca. 511 in der Mittelposition. Für die y-Richtung (später Vorwärts- und Rückwärtsfahrt) teilen wir diesen Wert durch 100 und erhalten so 11 Fahrtstufen von 0 bis 10 mit Stillstand bei 5. Grundsätzlich liefert die x-Achse neben der Mittelposition bei 5 ebenfalls jeweils 5 Stufen je Richtung. Wie wir den Code in Fahrtbefehle umsetzen, ist Teil des Sketches für das Robot Car.

Benötigte Hardware

Anzahl Bauteil
1 Mikrocontroller Board mit ATmega328P, ATmega16U2, kompatibel mit Arduino UNO R3
oder Nano V3.0 mit Atmega328 CH340! 100% Arduino kompatibel mit Nano V3
oder Nano V3.0 mit FT232RL Chip und ATmega328! 100% Arduino Nano V3 kompatibel
2 433 MHz Sender/Empfängermodul HC-12 (leider nicht mehr im Sortiment)
1 PS2 Joystick Shield Game Pad Keypad V2.0 für Arduino
oder KY-023 Joystick Modul für Arduino UNO R3 u.a. MCUs
Breadboard, Jumper Kabel, Kleinmaterial
ggf. Gehäuse aus dem 3D-Drucker


Im ersten Schritt werden wir unter Verwendung der HC-12 Module aus dem letzten Blog das LCD-Keypad Shield durch einen Joystick ersetzen. Dabei hat man in Abhängigkeit vom verwendeten Micro Controller die Wahl zwischen dem Joystick Shield für Arduino Uno und kompatible MCs und dem Joystick-Modul, das für alle Micro Controller mit mind. zwei analogen Eingängen geeignet ist.

Das Joystick Shield für alle Uno kompatiblen Micro Controller hat ein sehr wohl überlegtes Design mit vielen Tastern, dem Joystick und vielen Anschlussmöglichkeiten.  Insbesondere sind auch die üblichen Anschlüsse zugänglich. Oben links im Bild sieht man Steckplätze für den nRF24 Transceiver, den wir beim nächsten Mal verwenden werden. Zunächst benutzen wir jedoch die Anschlüsse 3V3, GND, D13 und D12 für unseren 433 MHz Sender HC-12. 

Bild 1: Joystick Shield für Uno und Pin-kompatible Micro Controller

Achtung: Die Beschriftung verleitet zu der Annahme, dass man hier auch das Nokia5110-Display direkt anschließen kann. Hier muss man die genaue Pin-Belegung prüfen. Mein Display konnte ich nicht direkt einstecken, sondern musste es mit Jumper-Kabeln anschließen.

Aber wir wollen hier ja das HC-12-Modul anschließen. Wer große Reichweiten benötigt, sollte das HC-12 mit 5V Betriebsspannung versorgen, aber im Nahbereich einer Fernsteuerung für Robot Cars genügen die 3,3V, also einfach einstecken und den Code vom letzten Mal wegen der geänderten Pin-Belegung von SoftwareSerial anpassen. Die Zeile lautet dann

SoftwareSerial mySerial(12, 13);   //RX, TX


Und der Teil mit der Berechnung des Codes für die Fernsteuerung ist bei Verwendung des Joysticks sehr viel knapper als bei unserer Lösung mit dem Keypad. Von der Pin-Belegung des Shields:
Taster A = Digital D2
Taster B = Digital D3
Taster C = Digital D4
Taster D = Digital D5
Taster E = Digital D6
Taster F = Digital D7
Joystick Taste (Joystick von oben drücken) = Digital D8
Joystick x-Axis =Analog A0
Joystick y-Axis = Analog A1

benötigen wir zunächst nur die analogen Eingänge A0 und A1.

Eine Anmerkung noch zu der von mir eingefügten Konstanten faktor. Beim Joystick Shield gibt es - im Bild unten links erkennbar - einen Schiebeschalter, an dem man die Spannung für den Joystick zwischen 3,3V und 5 V verändern kann. Bei 3,3V (wie von mir verwendet) ist der faktor=1.5. Bei 5V ist der faktor=1.
Wenn jemand den Sketch mit einer anderen MCU mit einem 12-bit-Analog-Digital-Wandler benutzt, wird der faktor=0.25 gesetzt.

Bild 2: Micro Controller mit Joystick Shield und HC-12 Transceiver

 

Hier der Sketch für die Fernsteuerung:

 

/*
Joystick als Motor Controller, Stillstand = 505
je 5 Stufen vor/zurück, je 5 Stufen rechts/links
*/

#include <SoftwareSerial.h>

//Anschlussbelegung für den HC-12 Transceiver
SoftwareSerial mySerial(12, 13); //RX, TX

int x = 5; // x-Achse = links/rechts
int y = 5; // y-Achse = vor/zurück
int joybutton = 8; // Joystick button
float faktor = 1.5; // für Anpassung bei unterschiedlicher Spannung oder ADC

void setup() {
  pinMode(joybutton,INPUT_PULLUP);
  Serial.begin(115200);
  mySerial.begin(9600);
}

void sendcode() {
  mySerial.println(100*y + x);//send code for motor
  delay(100); // little delay for next button press
}

void loop() {
  float A0 = faktor * analogRead (0);
  float A1 = faktor * analogRead (1);
  bool button = digitalRead(joybutton);

  Serial.print("x-Achse: ");
  Serial.print(A0);
  Serial.print("y-Achse: ");
  Serial.print(A1);
  Serial.print(" Button pressed ");
  Serial.print(button);

  x = int(A1/100);
  y = int(A0/100);

  Serial.print(" Code = ");
  Serial.println(100*y + x);
  sendcode();
}
 

Ein kleiner Tipp zwischendurch: Wenn  das Robot Car auf die Signale nicht reagiert, stellt sich oft die Frage, liegt es dann an der Fernsteuerung (mit Sender) und am Empfänger? Die Fernsteuerung können wir auch ganz leicht mit einem HC-12-Modul am PC überprüfen.

Ich hatte noch einen USB-Serial-Adapter vom Typ CP2102 Breakout. Kurzerhand VCC, GND und TX/RX über Kreuz verbinden, neue Instanz der Arduino IDE starten, COM Port vorwählen und Serial Monitor mit 9600 Baud öffnen. Wenn dort der Code 505 bzw. ein Wert zwischen 0 und 1010 angezeigt wird, ist zumindest die Fernbedienung in Ordnung.

Bild 3: HC-12 an USB-Serial-Adapter

Vom Prinzip die gleiche Fernsteuerung kann man auch mit dem Joystick-Modul realisieren. Für die zwei Achsen werden zwei analoge Eingänge und für den Joystick-Button wird ein digitaler Eingang am Micro Controller benötigt. Geeignet sind also die Micro Controller der Arduino-Familie mit sämtlichen kompatiblen MCUs, ESP32 und - unter Zuhilfenahme eines Analog-Digital-Wandlers - auch die Raspberry Pis und die Boards mit ESP8266 (der ja von Haus aus nur einen analogen Eingang besitzt). Ich entscheide mich diesmal für den Nano, der in Bezug auf die Versorgungsspannung weniger anspruchsvoll ist.

Bild 4: Joystick-Modul mit Kontaktleiste

Meine Schaltung:

Bild 5: Nano auf Steckbrett (half breadboard) mit HC-12 Transceiver und Joystick-Modul

 

Sketch Fernbedienung Nano_Joystick_HC12

/*
Joystick als MotorController, Stillstand = 505
je 5 Stufen vor/zurück, je 5 Stufen rechts/links
*
*/

#include <SoftwareSerial.h>

//Anschlussbelegung für den HC-12 Transceiver
SoftwareSerial mySerial(2, 3); //RX, TX

int x = 5; // x-Achse = links/rechts
int y = 5; // y-Achse = vor/zurück
int code = 505;
int joybutton = 4; // Joystick button
float faktor = 1.0; // für Anpassung bei unterschiedlicher Spannung oder ADC

void setup() {
  pinMode(joybutton,INPUT_PULLUP);
  Serial.begin(115200);
  mySerial.begin(9600);
} //end of setup

void sendcode() {
  mySerial.println(100*y + x);//send code for motor
  delay(100); // little delay for next button press
} // end of endcode

void loop() {
  float A6 = faktor * analogRead (6);
  float A7 = faktor * analogRead (7);
  bool button = digitalRead(joybutton);

  Serial.print("x-Achse: ");
  Serial.print(A6);
  Serial.print("y-Achse: ");
  Serial.print(A7);
  Serial.print(" Button pressed ");
  Serial.print(button);

  x = int(A6/100);
  y = int(A7/100);
  code = 100*y + x;
  Serial.print(" Code = ");
  Serial.println(code);
  sendcode();

} //end of loop

 

 

Zum Schluss möchte ich Ihnen zeigen, wie Ihr Robot Car auch mit einem Nano, dem HC-12 und einem „nackten“ Motor-Treiber-IC L293D fahren kann.

Bei dem Versuch, das Schaltbild in Fritzing zu erstellen, bin ich gescheitert. Das wird genauso unübersichtlich wie das Bild des fertigen Aufbaus. Deshalb habe ich mich für eine Tabelle mit der Anschlussbelegung entschieden. Wenn Sie hier Änderungen vornehmen, müssen Sie wie immer den Sketch anpassen.

Bild 6: Pinbelegung des Motortreiber-ICs L293D

ENABLE 1 1 Nano Pin 7 Nano 5V 16 Vss
INPUT 1 2 Nano Pin 5 Nano Pin 10 15 INPUT 4
OUTPUT 1 3 linker Motor rechter Motor 14 OUTPUT 4
GND 4 13 GND
GND 5 Batterie - Nano GND 12 GND
OUTPUT 2 6 linker Motor rechter Motor 11 OUTPUT 3
INPUT 2 7 Nano Pin 6 Nano Pin 9 10 INPUT 3
Vs 8 Batterie + Nano Pin 8 9 ENABLE 2

Tabelle 1: Anschlussbelegung des Motortreiber-ICs L293D

Bild 7: Pinbelegung des 433 MHz-Transceivers HC-12

HC-12 Nano
SET not connected
TXD Nano Pin 12 SoftwareSerial RX
RXD Nano Pin 11 SoftwareSerial TX
GND Nano GND
VCC Nano 3,3V oder 5V (größere Reichweite)

Tabelle 2: Anschlussbelegung des 433 MHz-Transceivers HC-12

Wenn die Programmierung abgeschlossen und der USB-Stecker gezogen ist, kann auch der Nano über Vin mit an die Spannungsversorgung der Motoren wie auf dem folgenden Bild gezeigt angeschlossen werden.

Bild 8: zweimotoriges Robot Car mit Nano, L293D und HC-12

An der Verkabelung erkennt man deutlich, wie viel angenehmer die Benutzung eines Motor-Treiber-Shields ist; die meisten Kontakte werden dann durch Einstecken des Micro Controllers vorgenommen.

Beim nächsten Mal werde ich die HC-12 Module, die leider nicht mehr im Sortiment sind, durch die nRF24L01-Module ersetzen. Auch diese Bauteile sind programmgesteuert sowohl als Sender als auch als Empfänger zu nutzen. Daher kommt der Begriff Transceiver als Kombination aus Transmitter und Receiver.

AmatorialefunkPer arduino

Einen Kommentar hinterlassen

Alle Kommentare werden vor der Veröffentlichung moderiert

Post di blog consigliati

  1. Installa ESP32 ora dal gestore del consiglio di amministrazione
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. OTA - Over the Air - Programmazione ESP tramite WLAN