RC CAR mit RFID starten

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!

Wenn Du das long byteweise füllen willst, musst Du *256 anstelle von *10 rechnen.

Gruß Tommy

Meinst du den Part, mit dem int Code? Da wird eigentlich alles korrekt durchlaufen und der unter Long ids angegebene RFID Code erkannt. Oder sehe ich da etwas nicht? Habe den Code vom RFID Chip von der Funduino Seite.

Auf jeden Fall wird boolean e nach Einlesen des RFID Chips richtig auf true gesetzt, sodass sich das Programm dann ja eigentlich in der ersten if-Schleife im loop befinden sollte. Und hier kommt es halt irgendwie zu falschen Werten (die im ersten Code noch korrekt waren) und zu starken Verzögerungen.

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!!");
}

Ist es möglich den RFID Chip einmalig und nicht ständig in einem loop auszulesen?

Das geht nur in der Loop.
Woher soll denn der Reader sonst wissen, das da ein Tag vor gehalten wird ?

HotSystems:
Das geht nur in der Loop.
Woher soll denn der Reader sonst wissen, das da ein Tag vor gehalten wird ?

Das habe ich mir schon gedacht.
Wie kann die starke Verzögerung beim Empfangen und das Empfangen von falschen Werten der gesendeten Bluetooth-Werte zustande kommen? :confused:

Zu deinem Hauptproblem:
So wie ich es sehe, wird dein Sketch immer kompletter durchlaufen.
Das solltest du aufteilen.
Eine Funktion für den RFID. Erst wenn der aktiviert ist, wird der Rest durchlaufen. Dann muss ja nicht immer der RFID geprüft werden.
Damit wird das sicherlich auch übersichtlicher.

Ich verstehe den Code so, dass Erneutes Einlesen des RFID Die Variable e wieder umschaltet, also der Sketch auf standby geht. Dafür muss natürlich der mfrc522 auch im laufenden Betrieb gelesen werden...

Dass das 2 sec dauern soll, kommt mir allerdings seltsam vor, und sollte man mal separat testen.

Also bei mir dauert das auslesen eines RFID Cip inkl, vergleich mit 20 gespeicherten zuläsigen Karten-Codes, auslesen und evt. Parsen des Namens auf der Chipkarte inkl senden des Namens an ein LCD keine 2 Sekunden.
Arbeite ebenfalls mit nem mrfc522 Modul. Da reicht in der regel 'Kurz über den Sensor drüberwischen um die Karte zu lesen und auszuwerten. Als controler ist da zurzeit och ,in Arduino Mega im Einsatz, wird aber bald auf nen Nano portiert.

Dies nur als Hinweis, dass das Kartenlesen keinesfalls 2 Sekunden dauert.

LG Stefan

Moin,

also ich bin gerade dabei das Einlesen des RFID Chips in Form einer Funktion ausserhalb des Loops zu platzieren. Bin ich da auf dem richtigen Weg? Es sei noch angemerkt, dass ich erst vor kurzem damit angefangen habe mich mit Arduinos auseinanderzusetzen.

Des Weiteren habe ich mich scheinbar ein bisschen ungeschickt ausgedrückt. Das Auslesen des RFID Chips geht schnell von statten und macht keine Probleme. Was Probleme macht, sind die Werte, die von der RoboRemo App über Bluetooth an den Arduino gesendet und von diesem verarbeitet werden.

Folgende Werte übermittel ich:
Zum einen ein PWM-Signal von -255 bis 255, für eine stufenlose Regelung der Geschwindigkeit vor und zurück.
Zum anderen die Neigung vom Handy über den accelerometer.

Im erst genannten Code wird alle 20 ms der Neigungswert ausgelesen, da dieser ständig übermittelt wird. Das PWM Signal wird nur ausgelesen, wenn ein Schieberegler in der App betätigt wird und somit ein Wert übermittelt wird.

Wenn ich nun den Code für den RFID-Chip eingepflegt habe, wird das PWM Signal (=Geschwindigkeit) gar nicht mehr übertragen und das Neigung-Signal (=Servo) nur noch spärlich.

Ich habe mal Bilder von dem Monitor angefügt, damit deutlich wird was ich genau meine.

Grüße

Problem_Richtig.PNG

Problem.PNG

Könnte es sein, dass Du das arme Ding einfach per BT zumüllst, so dass es nicht mehr mit Auswerten und langsam (9600) Serial schreiben hinterher kommt?

Gruß T&ommy