Hallo,
für ein Projekt soll ich einen "Fahrbaren Roboter mit RFID" bauen. Da es das erste mal ist, dass ich etwas mit einem Arduino mache, bleibe ich öfters wahrscheinlich an eigentlich offensichtlichen Sachen hängen.
Am Ende des Projekts, soll man den Arduino per Bluetooth über das Handy steuern können und es soll eine Wegfahrsperre mittels RFID geben. Zudem soll das RFID als Nutzerspeicherung (Fahrzeit)verwendet werden und die Nutzerzeit soll dann an einem LC Display angezeigt werden. Alles bis auf das LC Display habe ich bereits zusammengebaut und es funktioniert auch halbwegs.
So kann ich Ihn bereits per Bluetooth steuern und sperren/entsperren per RFID. Mein Problem ist allerdings, dass es nicht zusammen funktioniert. Soll heißen ich kann Ihn zwar per RFID entsperren, aber er lässt sich dann nicht steuern (zeigt auch gar nicht mehr an, das etwas empfangen wird). Lasse ich hingegen alles weg, was mit dem RFID zu tun hat, funktioniert die Steuerung per Bluetooth wieder.
Außerdem habe ich versucht es so zu machen, das man Ihn mit der selben RFID Karte sperren und entsperren kann. Problem dabei ist allerdings, dass ich es nur so hinbekommen habe, das man den Chip kurz drauf hält, dann entsperrt er sich, hält man diesen zu lange darauf sperrt er sich wieder. Dafür würde ich auch eine elegantere Lösung suchen, bisher habe ich allerdings noch nichts gefunden.
Habe hier mal meinen Code, den ich bisher habe. Ich habe versucht möglichst alles zu kommentieren, vielleicht fällt euch ja daran schon auf, ob ich vielleicht etwas falsch verstanden habe. Ich habe zudem dazu geschrieben, wie ich alles aktuell mit dem Arduino verkabelt habe.
/*H-Bruecke (L298N): Bluetooth Modul (HC-06): RFID (RC522): KontrollLED:
ENA 6 VCC 5V SDA 10 + 8
IN1 4 GND GND SCK 13 - GND
IN2 3 TXD RX(0) MOSI 11
IN3 2 RXD TX(1) MISO 12
IN4 7 IRQ nicht verbunden
ENB 5 GND GND
RST 9
OUT1/1 Motor links 3,3V 3,3V
Out3/4 Motor rechts
12V + Batterie
GND - Batterie
*/
/*Chipnummer = 2534620
Kartennummer = 89130
*/
#include <SoftwareSerial.h>
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);
int MLV=3; //Motorlinksvorwaerts
int MLR=4; //Motorlinksrueckwaerts
int MLG=6; //Motorlinksgeschwindigkeit
int MRV=2; //Motorrechtsvorwaerts
int MRR=7; //Motorrechtsrueckwaerts
int MRG=5; //Motorrechtsgeschwindigkeit
int state = 0;
int led = 8;
int gesperrt=1;
unsigned long Startzeit=0;
unsigned long Gesamtzeit=0;
void setup() {
Serial.begin(9600);
SPI.begin();
mfrc522.PCD_Init();
pinMode(led, OUTPUT);
pinMode(MLV, OUTPUT);
pinMode(MLR, OUTPUT);
pinMode(MLG, OUTPUT);
pinMode(MRV, OUTPUT);
pinMode(MRR, OUTPUT);
pinMode(MRG, OUTPUT);
Serial.begin(9600); // Verbindung zum Bluetoothmodul
}
void loop() {
if ( ! mfrc522.PICC_IsNewCardPresent()) //nach neuer Karte wird gesucht
{
return;
}
if ( ! mfrc522.PICC_ReadCardSerial()) //Kartennumer wird gelesen
{
return;
}
long code=0;
for (byte i = 0; i < mfrc522.uid.size; i++)
{
code=((code+mfrc522.uid.uidByte[i])*10); //Nummer wird auf variable code gespeichert
}
Serial.print("Die Kartennummer lautet:"); //Ausgabe des Texts im Seriellen Monitor
Serial.println(code); //Ausgabe der Nummer im Seriellen Monitor
if(code==2534620) //genehmigte Karte entsperrt Arduino
{
gesperrt++; //dadurch laesst er sich mit der selben Karte wieder sperren, falls er bereits entsperrt ist
delay(500);
}
if(code!=2534620) //bei jeder anderen Karte wird er wieder gesperrt
{
gesperrt=1;
}
if (gesperrt%2==0) //wenn die Karte genehmigt ist und der Arduino gesperrt war, ist der Wert gerade und er laesst sich dann an dieser Stelle steuern
{
Startzeit=millis(); //merkt sich Startzeit, damit man später die Fahrzeit anzeigen lassen kann
digitalWrite(led, HIGH); //zeigt an das entsperrt wurde
if(Serial.available() > 0)
{
state = Serial.read(); //Wert wird auf Variable state gespeichert
Serial.println((char)state); //Wert wird im seriellen Monitor ausgegeben
}
switch(state)
{
//Arduino faehrt vorwaerts
case '1':
digitalWrite(MLV, HIGH);
digitalWrite(MRV, HIGH);
digitalWrite(MLR, LOW);
digitalWrite(MRR, LOW);
analogWrite(MLG, 255);
analogWrite(MRG, 255);
delay(100);
break;
//Arduino faehrt rueckwaerts
case '2':
digitalWrite(MLV, LOW);
digitalWrite(MRV, LOW);
digitalWrite(MLR, HIGH);
digitalWrite(MRR, HIGH);
analogWrite(MLG, 255);
analogWrite(MRG, 255);
delay(100);
break;
//Arduino faehrt nach links
case '3':
digitalWrite(MLV, HIGH);
digitalWrite(MRV, LOW);
digitalWrite(MLR, LOW);
digitalWrite(MRR, HIGH);
analogWrite(MLG, 255);
analogWrite(MRG, 255);
delay(100);
break;
//Arduino faehrt nach rechts
case '4':
digitalWrite(MLV, LOW);
digitalWrite(MRV, HIGH);
digitalWrite(MLR, HIGH);
digitalWrite(MRR, LOW);
analogWrite(MLG, 255);
analogWrite(MRG, 255);
delay(100);
break;
default:
digitalWrite(MLV, LOW);
digitalWrite(MRV, LOW);
digitalWrite(MLR, LOW);
digitalWrite(MRR, LOW);
analogWrite(MLG, 0);
analogWrite(MRG, 0);
delay(100);
break;
}
}
//Karte wird im entsperrten Zustand erkannt, sperrt die Steuerung wieder
else
{
digitalWrite(led,LOW);
digitalWrite(MLV, LOW);
digitalWrite(MRV, LOW);
digitalWrite(MLR, LOW);
digitalWrite(MRR, LOW);
analogWrite(MLG, 0);
analogWrite(MRG, 0);
Gesamtzeit+=millis()-Startzeit;
Serial.print("Fahrzeit: ");
Serial.print(Gesamtzeit/3600000); //Stunden
Serial.print(":");
Serial.print((Gesamtzeit%3600000)/60000); //Minuten
Serial.print(":");
Serial.print(((Gesamtzeit%3600000)%60000)/1000); //Sekunden
Serial.print(":");
Serial.println(((Gesamtzeit%3600000)%60000)%1000); //Milliekunden
Serial.println("");
}
}
Das ganze mit der Nutzerzeit speichern, habe ich versucht umzusetzen, dabei ist allerdings das Problem, das er ja die Fahrzeit jedesmal addiert, wenn etwa die falsche Karte an den RFID Reader gehalten wird. Er dürfte die Zeit also jedes mal nur einmal addieren und zwar nur dann wenn der Arduino gesperrt wird und sonst nicht. Leider weiß ich auch dabei nicht, wie ich das am besten mache.
Hoffe Ihr könnt mir bei meinen Problemen helfen.Ich bin auf jeden Fall für jede Hilfe dankbar. Falls euch irgendwie sonst auffällt was man besser machen könnte, wäre ich auch dafür dankbar.
Schon mal im Voraus Danke
Fantoka