Labortagebuch - Arduino - Raspberry Pi
22.06.2021 - Arduino Car - gesteuert mit dem Arduino Shield V.1 - Nokia 5110
Das Joystick Shield V.1 - Nokia 5110
Das Joystick Shield V.1 - Nokia 5110
In diesem Beispiel soll ein 4WD Car mit einem Joystick Shield gesteuert werden. Beim Joystick Shield handelt es sich um das Nokia 5110. Die Installation des Shields ist einfach. Es wird einfach auf das Arduino Board aufgesteckt. Mit Hilfe eines Schiebeschalters unten links kann man zwischen einer 3,3V oder einer 5V Spannung variieren. Bei einer Spannung von 5V erhält man für die Lage des Joystick die Zahlenwerte 0-1024(bzw. 1023). Stellt man 3,3 V ein, so bewegen sich die Zahlenwerte zwischen 0-692. Dies gilt sowohl für die X- als auch für die Y-Achse.

Um zu überprüfen, ob alle Buttons und der Joystick richtig eingerichtet wurden, gibt es den folgenden Sketch, der die entsprechenden Werte der unterschiedlichen Buttons im Seriellen Monitor anzeigt.
Pinbelegung
A=Taster A
Pin Digital D2
B=Taster B
Pin Digital D3
C=Taster C
Pin Digital D4
D=Taster D
Pin Digital D5
E=Taster E
Pin Digital D6
F=Taster F
Pin Digital D7
K=Joystick Taste K (Joystick von oben drücken)
Pin Digital D8
X=Joystick X-Axis
Analog A0
Y=Joystick Y-Axis
Analog A1
// Joystick Shield Beispiel Programm

int const UP_BTN =2;
int const DOWN_BTN =4;
int const LEFT_BTN =5;
int const RIGHT_BTN =3;
int const E_BTN =6;
int const F_BTN =7;
int const JOYSTICK_BTN =8;
int const JOYSTICK_AXIS_X =A0;
int const JOYSTICK_AXIS_Y =A1;
int buttons[] = {UP_BTN,DOWN_BTN,LEFT_BTN,RIGHT_BTN,
E_BTN,F_BTN,JOYSTICK_BTN};

void setup(){
// Set all button pins as inputs with internal pullup resistors enabled.
for (int i;i<7; i++) pinMode(buttons[i],INPUT_PULLUP);
Serial.begin(9600);
}
void loop(){
// Check each button input and print the status to the Serial Monitor Window
Serial.print(”Up= ”);Serial.println(digitalRead(UP_BTN);
Serial.print(”Down= ”);Serial.println(digitalRead(DOWN_BTN);
Serial.print(”Left= ”);Serial.println(digitalRead(LEFT_BTN);
Serial.print(”Right= ”);Serial.println(digitalRead(RIGHT_BTN);
Serial.print(”E= ”);Serial.println(digitalRead(E_BTN);
Serial.print(”F= ”);Serial.println(digitalRead(F_BTN);
Serial.print(”JOYSTICK BTN= ”);Serial.println(digitalRead(JOYSTICK_BTN);
// Print the full X/Y joystick values (0 – 1023)
Serial.print(”X= ”);Serial.println(analogRead(JOYSTICK_AXIS_X));
Serial.print(”Y= ”);Serial.println(analogRead(JOYSTICK_AXIS_Y));
Serial.print(” ”);
delay(1000);
}

Ausgabe der Buttonwerte im Seriellen Monitor
Verbindung- Arduino - L298N
Arduino Uno L298N
GND GND
VCC 5V/12V
D3 IN1
D4 IN2
D5 IN3
D6 IN4
Verbindung- Arduino - nRF24L01
Arduino Uno nRF24L01
3,3V VCC
GND GND
10 CSN
9 CE
13 SCK
11 MOSI
12 MISO
Vorbereitung
Bevor die eigentlichen Sketche für die Steuerung des 4WD Cars aufgespielt werden, habe ich die Verbindung mit dem Funkmodul nRF24L01 und die Funktionsweise des Motor-Shields L298N überprüft.

1. Ansteuerung der Motoren mit Hilfe des Motor-Shields L298N
Die Ansteuerung der Motoren geschieht ohne PMW, d.h. die Geschwindigkeit der Motoren kann nicht verändert werden. Die Verkabelung zwischen Arduino und dem Motor-Shield L298N ist der Tabelle zu entnehmen.

Sketch für die Überprüfung

int motor1pin1 = 3;
int motor1pin2 = 4;
int motor2pin1 = 5;
int motor2pin2 = 6;

void setup(){
pinMode(motor1pin1,OUTPUT);
pinMode(motor1pin2,OUTPUT);
pinMode(motor2pin1,OUTPUT);
pinMode(motor2pin2,OUTPUT);
}
void loop(){
digitalWrite(motor1pin1,HIGH);
digitalWrite(motor1pin2,LOW);
digitalWrite(motor2pin1,HIGH);
digitalWrite(motor2pin2,LOW);
delay(1000);

digitalWrite(motor1pin1,LOW);
digitalWrite(motor1pin2,HIGH);
digitalWrite(motor2pin1,LOWIGH);
digitalWrite(motor2pin2,HIGH);
delay(1000);
}

Aufbau des 4WD Cars

Der Sketch überprüft, ob das Motor-Shield L298N richtig angeschlossen ist. Außerdem sieht man gleichzeitig, ob die Motoren auch anspringen.
2. Als nächstes wird überprüft, ob die Verbindung über die nRF24L01-Module funktioniert. Dazu benötigt man sowohl einen Sketch für den Sender als auch für den Empfänger.
Sketch für den Sender

// mRF24L01 – Sender
#include
#include "nRF24L01.h"
#include "RF24.h"
#define PIN_CE 9
#define PIN_CSN 10
RF24 radio(PIN_CE, PIN_CSN)
// definiert ein Objekt um nRF24L01 zu kontrollieren
byte adresses[][6]= {"007","001"};
int data[3] = {0,512,512};

void setup() {
Serial.begin(9600);
// Initialisieren radio
radio.begin(); // Initialisieren von nRF24L01
radio.setRetries(0,15);
// Festlegen der Wiederholungszeit
radio.setPALevel(RF24_PA_HIGH);
// Power festgelegt
radio.openWritingPipe(adresses[1]);
// Öffnen des Übertragungskanal
radio.openReadingPipe[1,adresses[0]);
radio.stopListening();
delay(1000);}

void loop() {
for (int=0, i< 255;i++){
Serial.print("Senden: ");
Serial.println(i);
data[0] = i;
// schreibt die aktuellen integer-Zahlen ins Übertragungs-Array
radio.write(data, sizeof(data),0); // senden des Array
delay(1000); // 1 Sekunde warten
}






Sketch für den Empfänger

d // mRF24L01 – Empfänger (Receiver)
#include
#include "nRF24L01.h"
#include "RF24.h"
#define PIN_CE 7
#define PIN_CSN 8
RF24 radio(PIN_CE, PIN_CSN)
byte adresses[][6]= {"007","001"};
#define SIZE 5
int data[SIZE];

void setup() {
Serial.begin(9600);
delay(2000);
Serial.println("init.rf");
radio.begin(); // Initialisieren von nRF24L01
radio.setRetries(0,15);
// Festlegen der Wiederholungszeit
radio.setPALevel(RF24_PA_HIGH);
// Power festgelegt
radio.openWritingPipe(adresses[1]);
// Öffnen des Übertragungskanal
radio.openReadingPipe[1,adresses[0]);
radio.stopListening();
delay(1000);}

void loop() {
// Daten-Empfang
receiveData();}
void receiveData() {
if (radio.available()) { // wenn Daten empfangen werden
// Lesen der Daten
while (radio.available()){
Serial.print("Empfangen = ");
Serial.println(data[0]);}
}
else{Serial.print(„Kein Empfang ");
// Nur um zu testen ob irgendetwas passiert
}
}
3. Zum Schluss benötigt man einen Sketch für das Joystick Shield und einen für das Auto.
Code für das Joystick Shield

#include
#include
#include
#define CE_PIN 9
#define CSN_PIN 10
int up_button = 2; // Boton Amarillo - A
int down_button = 4; // Boton Amarillo - C
int left_button = 5; // Boton Azul - D
int right_button = 3; // Boton Azul - B
int start_button = 6; // Boton F
int select_button = 7; // Boton E
int analog_button = 8; //
int x_axis = A0;
int y_axis = A1;
int buttons[]={up_button, down_button,left_button, right_button, start_button, select_button, analog_button};
const uint64_t pipe = 0xE8E8F0F0E1LL;
RF24 radio(CE_PIN,CSN_PIN);
char msg[20] = "";

void setup(){
for(int i; i <7 ; i++) { pinMode(buttons[i],INPUT);
digitalWrite(buttons[i],HIGH); }
Serial.begin(9600);
radio.begin();
radio.openWritingPipe(pipe); }

void loop(){ if(digitalRead(up_button)==LOW)
{ char msg[]="up";
radio.write(&msg,sizeof(msg));
delay(300);
Serial.println("UP Button Pressed"); }
if(digitalRead(down_button)==LOW)
{ char msg[]="down";
radio.write(&msg,sizeof(msg));
delay(300);
Serial.println("Down Button Pressed"); }
if(digitalRead(left_button)==LOW)
{ char msg[]="left";
radio.write(&msg,sizeof(msg));
delay(300);
Serial.println("Left Button Pressed"); }
if(digitalRead(right_button)==LOW)
{ char msg[]="right";
radio.write(&msg,sizeof(msg));
delay(300);
Serial.println("Rigth Button Pressed"); }
if(digitalRead(start_button)==LOW)
{ char msg[]="start";
radio.write(&msg,sizeof(msg));
delay(300);
Serial.println("Start Button Pressed"); }
if(digitalRead(select_button)==LOW)
{ char msg[]="select";
radio.write(&msg,sizeof(msg));
delay(300);
Serial.println("Select Button Pressed"); }
if(digitalRead(analog_button)==LOW)
{ char msg[]="analgobut";
radio.write(&msg,sizeof(msg));
delay(300);
Serial.println("Analog Button Pressed"); }
Serial.print("\n X ="),Serial.print(analogRead(x_axis)),Serial.print(" \n Y = "), Serial.print(analogRead(y_axis));
Serial.print(" "); delay(500); }
Code für das Auto

#include
#include
#include
#include
#define CE_PIN 9
#define CSN_PIN 10
const int RightMotorF= 3;
const int RightMotorB= 4;
const int LeftMotorF= 5;
const int LeftMotorB= 6;
char data[20]="";
RF24 radio(CE_PIN,CSN_PIN);
const uint64_t pipe = 0xE8E8F0F0E1LL;

void setup() {
pinMode(RightMotorF,OUTPUT);
pinMode(RightMotorB,OUTPUT);
pinMode(LeftMotorF,OUTPUT);
pinMode(LeftMotorB,OUTPUT);
Serial.begin(9600);
radio.begin();
radio.openReadingPipe(1,pipe);
radio.startListening(); }

void loop(){
String msg="";
if ( radio.available() ) {
radio.read( data,sizeof(data) );
Serial.println(data); msg=data;
if(msg=="up") {
digitalWrite(RightMotorB,LOW);
digitalWrite(LeftMotorB,LOW);
digitalWrite(RightMotorF,HIGH);
digitalWrite(LeftMotorF,HIGH);
Serial.println("Motor forward"); }
else if(msg=="down")
{ digitalWrite(RightMotorB,HIGH);
digitalWrite(LeftMotorB,HIGH);
digitalWrite(RightMotorF,LOW);
digitalWrite(LeftMotorF,LOW);
Serial.println("Motor Back"); }
else if(msg=="left")
{ digitalWrite(RightMotorB,LOW);
digitalWrite(LeftMotorB,HIGH);
digitalWrite(RightMotorF,HIGH);
digitalWrite(LeftMotorF,LOW);
Serial.println("Left");
delay(300);
digitalWrite(RightMotorB,LOW);
digitalWrite(LeftMotorB,LOW);
digitalWrite(RightMotorF,LOW);
digitalWrite(LeftMotorF,LOW); }
{ digitalWrite(RightMotorB,HIGH);
digitalWrite(LeftMotorB,LOW);
digitalWrite(RightMotorF,LOW);
digitalWrite(LeftMotorF,HIGH);
Serial.println("right");
delay(300);
digitalWrite(RightMotorB,LOW);
digitalWrite(LeftMotorB,LOW);
digitalWrite(RightMotorF,LOW);
digitalWrite(LeftMotorF,LOW); }
else if(msg=="analgobut")

digitalWrite(LeftMotorB,LOW);
digitalWrite(RightMotorF,LOW);
digitalWrite(LeftMotorF,LOW);
Serial.println("STOP it"); } }
}