Hallo Leute!
Ich verzweifel schon sehr an diesem Projekt. Zuerst mal was mein Projekt überhaupt ist: Ich will mittels dem RFID-Modul die ID der Magnetkarte auslesen und dann mit dem Ethernetshield via UDP auf eine Software zu Visual Studio auf meinen PC senden.
Wenn ich beides separat laufen lasse, sprich das RFID-Modul zum auslesen der ID und das Ethernshield zum Senden eines String auf meinen PC funktioniert alles einwandfrei.
Das Problem ist jetzt wenn ich beides an meinem Arduino angesteckt habe und versuche die ausgelesene ID via UDP zu versenden funktioniert es nicht mehr. Das Auslesen der ID funktioniert jedoch.
Habe im INternet sehr viel gelesen jedoch konnte mir nichts weiterhelfen.. das einzige was ich verstanden habe ist dass das Ethernetshield durch die Pins 50-53 mit dem Arduino kommuniziert und da ist aber mein Kartenlesemodul angesteckt.
Ich hoffe mir kann jemand helfen
SPI ist ein Bus. MOSI/MISO/SCK kannst Du für alle nehmen, CS (manchmak auch SS genannt) braucht jeder Teilnehmer seinen eigenen Pin, den Du auch in der Software ändern musst.
Ohne Links zu den Modulen/Shields und deine Sketche (bitte in Codetags </> oben links im Forumseditor) werden wir Dir da nicht viel helfen können.
Tommy56:
SPI ist ein Bus. MOSI/MISO/SCK kannst Du für alle nehmen, CS (manchmak auch SS genannt) braucht jeder Teilnehmer seinen eigenen Pin, den Du auch in der Software ändern musst.
Ohne Links zu den Modulen/Shields und deine Sketche (bitte in Codetags </> oben links im Forumseditor) werden wir Dir da nicht viel helfen können.
So nun mein Sketch: In diesem Sketch sind beide Module angeschlossen.
Das RFID-Modul habe ich an auf dem EthernetShield angeschlossen. Sprich an pin 11-13.
Der Code:
#include <SPI.h> // needed for Arduino versions later than 0018
#include <Ethernet2.h>
#include <EthernetUdp2.h> // UDP library from: bjoern@cs.stanford.edu 12/30/2008
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
0x90, 0xA2, 0xDA, 0x11, 0x2E, 0x46
};
IPAddress ip(192, 168, 1, 177);
unsigned int localPort = 8888; // local port to listen on
// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
char ReplyBuffer[] = "AntwortString "; // a string to send back
// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;
//MFRC522
#include <MFRC522.h>
constexpr uint8_t RST_PIN = 6;
constexpr uint8_t SS_PIN = 2;
MFRC522 mfrc522(SS_PIN, RST_PIN);
void setup() {
// start the Ethernet and UDP:
Ethernet.begin(mac, ip);
Udp.begin(localPort);
SPI.begin();
mfrc522.PCD_Init();
Serial.begin(9600);
Serial.println("Setup fertig");
}
void loop() {
String content;
// put your main code here, to run repeatedly:
// Prepare key - all keys are set to FFFFFFFFFFFFh at chip delivery from the factory.
MFRC522::MIFARE_Key key;
for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF;
int packetSize = Udp.parsePacket();
if (packetSize)
{
int i = 0;
//String von VisualStudio empfangen
IPAddress remote = Udp.remoteIP();
Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
Serial.println(packetBuffer);
for (byte i = 0; i < mfrc522.uid.size; i++) {
content.concat(String(mfrc522.uid.uidByte[i] <0x10 ? "0" : " "));
content.concat(String(mfrc522.uid.uidByte[i],HEX));
}
content.toUpperCase();
String UID= content.substring(1);
Serial.println(UID);
//Antwort zurücksenden
Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
Udp.write(ReplyBuffer);
Udp.endPacket();
}
delay(10);
}
Die Ausgabe der seriellen Schnittstelle ist beim Starten jene:
Setup fertig
BEREIT (Das ist der String den mein C#-Programm an den Arduino sendet)
Funktioniert also alles bis zum Auslesen der ID der Magnetkarte.
Hoffe ihr könnt mit dieser Antwort eineiges mehr anfangen und mir helfen.
Mfg Felix
Die RFID-Library die ich verwende schreibt vor den Sonsor über die Pins 50-53 zu verbinden.. jedoch dachte ich dass dies eventuell der Fehler ist wenn das Shield mit dem Arduino über diese Pins kommuniziert..
Ich werde das morgen direkt ausprobieren, meint ihr dass das dann funktionieren sollte oder das nicht der Fehler sein könnte?
Das ist die Pinangabe meiner Library.. Jedoch habe ich den RST auf Pin 5 und den SS auf Pin 31 in meinem Sketch. Habe ich das RFID-Modul so angeschlossen + dem EthernetShield bekomme ich nicht einmal den String von dem C# Programm..
Ja, ein digitalWrite(SS,HIGH) würde den Pullup aktivieren.
Wenn nichts angeschlossen ist, reicht das.
Mein Tipp ist weiterhin: Mache ihn zum Output!
Denn als Input ist er nicht zu gebrauchen, da er dann nie LOW werden darf, ohne dass die Hardware SPI in den Slave Modus schaltet.
Als Output, darfst du ihn für beliebige Zwecke verwenden. Ohne jedes Hemmnis.
combie:
Ja, ein digitalWrite(SS,HIGH) würde den Pullup aktivieren.
Wenn nichts angeschlossen ist, reicht das.
Mein Tipp ist weiterhin: Mache ihn zum Output!
Denn als Input ist er nicht zu gebrauchen, da er dann nie LOW werden darf, ohne dass die Hardware SPI in den Slave Modus schaltet.
Als Output, darfst du ihn für beliebige Zwecke verwenden. Ohne jedes Hemmnis.
Habe den Pin jetzt mit einem digitalWrite(53,HIGH) auf high gesetzt.
Nun bekomm ich den String meines c#-Programms, jedoch passiert an der Stelle wo eigentlich die ID auf den COM-Port ausgegeben werden soll nichts mehr.
#include <SPI.h> // needed for Arduino versions later than 0018
#include <Ethernet2.h>
#include <EthernetUdp2.h> // UDP library from: bjoern@cs.stanford.edu 12/30/2008
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
0x90, 0xA2, 0xDA, 0x11, 0x2E, 0x46
};
IPAddress ip(192, 168, 1, 177);
unsigned int localPort = 8888; // local port to listen on
// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
char ReplyBuffer[] = "AntwortString "; // a string to send back
// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;
//MFRC522
#include <MFRC522.h>
constexpr uint8_t RST_PIN = 5;
constexpr uint8_t SS_PIN = 31;
MFRC522 mfrc522(SS_PIN, RST_PIN);
void setup() {
// start the Ethernet and UDP:
Ethernet.begin(mac, ip);
Udp.begin(localPort);
SPI.begin();
mfrc522.PCD_Init();
digitalWrite(53,HIGH);
Serial.begin(9600);
Serial.println("Setup fertig");
}
void loop() {
String content;
// put your main code here, to run repeatedly:
// Prepare key - all keys are set to FFFFFFFFFFFFh at chip delivery from the factory.
MFRC522::MIFARE_Key key;
for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF;
int packetSize = Udp.parsePacket();
if (packetSize)
{
int i = 0;
//String von VisualStudio empfangen
IPAddress remote = Udp.remoteIP();
Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
Serial.println(packetBuffer);
// HIER hängt sich der Sketch dann auf bzw. tut es nichts mehr
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return;
}
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial()) {
return;
}
for (byte i = 0; i < mfrc522.uid.size; i++) {
content.concat(String(mfrc522.uid.uidByte[i] <0x10 ? "0" : " "));
content.concat(String(mfrc522.uid.uidByte[i],HEX));
}
content.toUpperCase();
String UID= content.substring(1);
Serial.println(UID);
//Antwort zurücksenden
Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
Udp.write(ReplyBuffer);
Udp.endPacket();
}
delay(10);
}
Bin erleichtert das dass jetzt schon mal funktioniert. Sobald ich die folgenden Zeilen Code entferne
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return;
}
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial()) {
return;
}
geht es wie gewohnt mit Reply und response zwischen asoftware und arduino hin und her.
Habe den Pin jetzt mit einem digitalWrite(53,HIGH) auf high gesetzt.
Das geht ja in die richtige Richtung.
Immerhin...
Aber warum du meiner Empfehlung nicht folgen willst, ist mir ein Rätsel.
Ich wiederhole mich nochmal, dieses mal mit noch anderen Worten...
Mal angenommen, und ich hätte recht, dass SPI nur funktioniert, wenn der Pin 53 des Mega High, oder ein Output, ist.
Dann sage mir doch mal, warum du den Pullup des Pins erst nach dem mfrc522.PCD_Init() auf High setzt...
Wenn mfrc522.PCD_Init(); selber schon SPI nutzt, dann wird der init versagen.
Und so geschieht es dir hier!
Bitte mehr Sorgfalt!
Die Reihenfolge der Initialisierungen ist durchaus wichtig!
Also:
void setup()
{
Serial.begin(9600);
Serial.println("Setup Start");
pinMode(SS,OUTPUT); // ab jetzt kann SPI zuverlässig im Master Mode bleiben
SPI.begin(); // ab jetzt können die einzelnen SPI Geräte initialisiert werden
// start the Ethernet and UDP:
Ethernet.begin(mac, ip);
Udp.begin(localPort);
mfrc522.PCD_Init();
Serial.println("Setup fertig");
}
Ja, beides separat tut genau so wie es soll. Ich versuche heute noch einmal einen neuen Sketch zu schreiben wo einfach nur die ID versendet wird, und der PIN 53 ein OUTPUT ist.Vielleicht hat sich ein schlampigkeitsfehler eingeschlichen.. denke ich aber nicht. Werde dann einen Reply schreiben mit den PINS,Library usw. habe leider übersehen dass der Beitrag schon eine zweite Seite hat und die Alerts waren aus.
Mit freundlichen Grüßen Felix
combie:
Funktionieren denn die Beispiele?
Kenne die Lib nicht....
Bin jetzt nochmal alles sehr sorgfältig durchgegangen und bin mir sicher den Fehler gefunden zu haben! Jedoch weiß ich nicht wie ich diesen beheben kann.
Der Tipp von dir mit dem pinMode(SS,OUTPUT) war schon einmal grandios und hat mich weitergebracht.
Ich kann nun die UDP-Connection verwenden mit dem angeschlossenen RC522 Modul!
Jedoch geht es im Sketch nicht weiter wenn ich versuche eine Karte zu finden.. Bis zu jenem Punkt wo die IF-Bedingung mit der suche der Karte ist funkt alles. Wenn ich diesen Teil vom Code auskommentiere funktioniert alles wie es soll. Das Shield sowie das RC522-Modul wird initialisiert und ich bekomme einen String von meiner Software und sende an diese meine Antwort zurück.
Der Code sieht wiefolgt aus:
#include <SPI.h> // needed for Arduino versions later than 0018
#include <Ethernet2.h>
#include <EthernetUdp2.h> // UDP library from: bjoern@cs.stanford.edu 12/30/2008
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
0x90, 0xA2, 0xDA, 0x11, 0x2E, 0x46
};
IPAddress ip(192, 168, 1, 177);
unsigned int localPort = 8888; // local port to listen on
// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
char ReplyBuffer[] = "String von meinem Arduino"; // a string to send back
// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;
//MFRC522
#include <MFRC522.h>
constexpr uint8_t RST_PIN = 5;
constexpr uint8_t SS_PIN = 7;
MFRC522 mfrc522(SS_PIN, RST_PIN);
void setup() {
Serial.begin(9600);
Serial.println("Setup Start");
pinMode(SS,OUTPUT);
SPI.begin();
// start the Ethernet and UDP:
Ethernet.begin(mac, ip);
Udp.begin(localPort);
mfrc522.PCD_Init();
Serial.println("Setup fertig");
}
int i =0;
void loop() {
// if there's data available, read a packet
int packetSize = Udp.parsePacket();
if (packetSize)
{
Serial.print("Received packet of size ");
Serial.println(packetSize);
Serial.print("From ");
IPAddress remote = Udp.remoteIP();
for (int i = 0; i < 4; i++)
{
Serial.print(remote[i], DEC);
if (i < 3)
{
Serial.print(".");
}
}
Serial.print(", port ");
Serial.println(Udp.remotePort());
// read the packet into packetBufffer
Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
// Serial.println("Contents:");
Serial.println(packetBuffer);
GetUID();
// send a reply, to the IP address and port that sent us the packet we received
Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
Udp.write(ReplyBuffer);
Udp.endPacket();
}
delay(10);
}
void GetUID()
{
String content;
MFRC522::MIFARE_Key key;
for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF;
//for( i; i<1;i++)
//{
//// Look for new cards
// if ( ! mfrc522.PICC_IsNewCardPresent()) {
// return;
// }
//
// // Select one of the cards
// if ( ! mfrc522.PICC_ReadCardSerial()) {
// return;
// }
for (byte i = 0; i < mfrc522.uid.size; i++) {
content.concat(String(mfrc522.uid.uidByte[i] <0x10 ? "0" : " "));
content.concat(String(mfrc522.uid.uidByte[i],HEX));
}
content.toUpperCase();
String UID= content.substring(1);
Serial.println(UID);
}
}
Die serielle Ausgabe sieht dann so aus:
Setup Start
Setup fertig
BEREIT (der String den ich von C# erhalte)
Und nach diesem BEREIt sollte dann die UID der angehaltenen Karte ausgegeben werden.
Muss ich da vielleicht dem SPI irgendwie klar machen dass nun der Kartenleser an der Reihe ist? oder bin ihc da mit meiner Vermutung ganz danaben?