Moin,
mein aktuelles Projekt umfasst ein RC Car, welches über Bluetooth mit dem Handy (RoboRemo-App) stufenlos (Lenkwinkel und Geschwindigkeit) gesteuert werden soll. Das habe ich soweit hinbekommen - siehe folgenden Code:
#define SteeringEnable 3
#define ENA 6
#define IN1 5
#define IN2 7
#define bluetooth Serial
#include <Servo.h> // servo library
Servo Lenkservo; // servo name
int geschwindigkeit = 0;
char cmd[100];
int cmdIndex;
void exeCmd() {
if(cmd[0]=='s' && cmd[1]==' ') {
int geschwindigkeit = atoi(cmd+2);
Serial.print("geschwindigkeit=");
Serial.println(geschwindigkeit);
if(geschwindigkeit>=0) {
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
analogWrite(ENA, geschwindigkeit);
} else {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
analogWrite(ENA, -geschwindigkeit);
}
}
if(cmd[0]=='x' && cmd[1]==' ') {
float val = atof(cmd+2);
val = val/9.8;
val = val*500;
int servoMicroseconds = 1500+val;
Lenkservo.writeMicroseconds(servoMicroseconds);
Serial.print("Servo=");
Serial.println(servoMicroseconds);
}
}
void setup() {
Serial.begin(9600);
pinMode(ENA , OUTPUT);
pinMode(IN1 , OUTPUT);
pinMode(IN2 , OUTPUT);
pinMode(SteeringEnable , OUTPUT);
Lenkservo.attach(9);
}
void loop() {
if(bluetooth.available()) {
char c = (char)bluetooth.read();
if(c=='\n') {
cmd[cmdIndex] = 0;
exeCmd();
cmdIndex = 0;
} else {
cmd[cmdIndex] = c;
if(cmdIndex<99) cmdIndex++;
}
}
}
Nun aber mein Problem: Eine weitere Anforderung an das Projekt ist, dass ein RFID Chip die Rolle eines Autoschlüssels einnehmen soll - bedeutet, erst wenn der richtige RFID Chip eingelesen wurde, soll das Auto fahrbereit sein. Wenn ich mein obiges Programm um den Programmteil für den RFID Chip erweitere, werden, nachdem der RFID Chip eingelesen wurde, zum einen falsche Werte ausgegeben und zum anderen kommen diese nur spärlich an. Vorher hat der Arduino alle 20 ms einen Wert bekommen, nun jedoch noch nicht mal alle 2 Sekunden. Hier der Code:
#define SteeringEnable 3
#define ENA 6
#define IN1 5
#define IN2 7
#define bluetooth Serial
#include <Servo.h>
Servo Lenkservo;
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);
long ids[] = {1857442};
boolean e = false;
int g = 0;
char cmd[100];
int cmdIndex;
void exeCmd() {
if(cmd[0]=='s' && cmd[1]==' ') {
int g = atoi(cmd+2);
Serial.print("geschwindigkeit=");
Serial.println(g);
if(g>=0) {
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
analogWrite(ENA, g);
} else {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
analogWrite(ENA, -g);
}
}
if(cmd[0]=='x' && cmd[1]==' ') {
float val = atof(cmd+2);
val = val/9.8;
val = val*500;
int servoMicroseconds = 1500+val;
Lenkservo.writeMicroseconds(servoMicroseconds);
Serial.print("Servo=");
Serial.println(servoMicroseconds);
}
}
void setup() {
Serial.begin(9600);
pinMode(ENA , OUTPUT);
pinMode(IN1 , OUTPUT);
pinMode(IN2 , OUTPUT);
pinMode(SteeringEnable , OUTPUT);
Lenkservo.attach(8);
SPI.begin();
mfrc522.PCD_Init();
lcd.init();
}
void loop() {
if (e == true) {
if(bluetooth.available()) {
char c = (char)bluetooth.read();
if(c=='\n') {
cmd[cmdIndex] = 0;
exeCmd();
cmdIndex = 0;
} else {
cmd[cmdIndex] = c;
if(cmdIndex<99) cmdIndex++;
}
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("RC CAR");
lcd.setCursor(0, 1);
lcd.print("Willkommen!");
}
}
else if (e == false) {
lcd.noBacklight();
lcd.setCursor(0, 0);
lcd.print("RC CAR");
lcd.setCursor(0, 1);
lcd.print("!!Standby!!");
}
if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) {
long code=0;
for (byte i = 0; i < mfrc522.uid.size; i++)
{
code=((code+mfrc522.uid.uidByte[i])*10);
}
Serial.print("Die Kartennummer lautet:");
Serial.println(code);
int counter = 0;
for (counter = 0; counter < sizeof(ids) - 1; counter++) {
if (code == ids[counter]) {
e = !e;
break;
}
else if (code != ids[counter]) {
break;
}
}
}
}
Könnte es an der ständigen Abfrage liegen, ob ein RFID Chip und Empfänger ausgewählt ist?
Vielleicht hat jemand einen guten Hinweis.
Grüße!

