RFID en Ethernetshield werken niet samen.

Arduino specifieke Software
Berichten: 10
Geregistreerd: 06 Jan 2016, 20:05

RFID en Ethernetshield werken niet samen.

Berichtdoor ArduinoMega123 » 17 Feb 2016, 19:30

Hallo,

Ik heb een probleem met het tegelijkertijd aansturen van mijn RFID en Ethernetshield.

Ze werken elk appart, maar telkens wanneer ik de SPI pinnen van de RFID aansluit, wil de ethernetshield geen gegevens meer verzenden.
Ik werk met een Arduino Mega. Volgens mij is het probleem dat de ICSP en SPI pinnen onderling verbonden zijn, en ze daardoor niet willen samenwerken. ( Is maar een veronderstelling )
Iemand enige idee hoe ik dit probleem kan verhelpen??

MVG

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: RFID en Ethernetshield werken niet samen.

Berichtdoor nicoverduin » 17 Feb 2016, 21:09

Er zijn in het verleden al meer problemen geweest met de W5100 (ethernet shield) en andere SPI apparaten (zoals de SD kaart). Maar ik dacht dat die inmiddels zijn opgelost zouden zijn. Maar zet anders je code hier neer dan kunnen we kijken of het aan iets anders ligt. Het ligt niet aan de ICSP omdat dat loshangende pinnen zijn die verder niets doen tenzij de chip geflashed moet worden buiten de standaard USB verbinding.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 4079
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: RFID en Ethernetshield werken niet samen.

Berichtdoor shooter » 17 Feb 2016, 22:56

gebruiken de beide shields toevallig 1 of meer pinnen van elkaar.
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: RFID en Ethernetshield werken niet samen.

Berichtdoor nicoverduin » 17 Feb 2016, 23:10

shooter schreef:gebruiken de beide shields toevallig 1 of meer pinnen van elkaar.
Dat verwacht ik ook. Mogelijk dubbel gebruik van de CS. Die moeten verschillend zijn. Daarom vroeg ik al om zijn sketch hier neer te zetten
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 10
Geregistreerd: 06 Jan 2016, 20:05

Re: RFID en Ethernetshield werken niet samen.

Berichtdoor ArduinoMega123 » 18 Feb 2016, 20:19

Beste,


Bij deze de sketches die ik gebruik.

cpp code
#include "SPI.h"
#include "Ethernet.h"
#include "sha1.h "
#include "mysql.h"

#include <MFRC522.h>

byte mac_addr[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress server_addr(...,...,...,...);

Connector my_conn;
char user[] = "***";
char password[] = "***";

char INSERT_SQL[] =
"INSERT INTO `***`.`***` (***`) VALUES (***)";
void setup() {
Ethernet.begin(mac_addr);
Serial.begin(9600);
pinMode(53, OUTPUT);
digitalWrite(53, HIGH);
while (!Serial);

delay(1000);
Serial.println("Bezig met verbinden");
if (my_conn.mysql_connect(server_addr, 3306, user, password)){
Serial.println("Verbonden!");
my_conn.cmd_query(INSERT_SQL);
Serial.println("Data toegevoegd.");
} else {
Serial.println("Connecteren mislukt.");
}
}
void loop() {
}






cpp code
#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>
#include <Wire.h>


#define SS_PIN 48
#define RST_PIN 45

MFRC522 mfrc522_1(SS_PIN, RST_PIN); // Maak RC522 instantie aan.

Servo servo1; // Servo toegang

void setup()
{

Serial.begin(9600); // Seriële communicatie met computer
while (!Serial); // Als er geen verbinding is, doe niets
SPI.begin(); // Initialiseer SPI
mfrc522_1.PCD_Init(); // Initialiseer de RFID'S
}

void loop() {
check_reader(mfrc522_1, 1); // Contoleer of er een TAG voor de scanner is

delay(50); // Vertraging zodat ik niet teveel gegevens binnenkrijg
}

void check_reader(MFRC522 reader, int id)
{

if ( ! reader.PICC_IsNewCardPresent() || ! reader.PICC_ReadCardSerial() )
{
return;
}


unsigned int hex_num; // Maak int aan voor code van TAG

hex_num = reader.uid.uidByte[0];
hex_num += reader.uid.uidByte[1];
hex_num += reader.uid.uidByte[2];
hex_num += reader.uid.uidByte[3];

Serial.println();

Serial.print(F("Tagnummer: ")); Serial.println(hex_num); // toont de hex waarde van de TAG op het scherm
if ( hex_num == 526)
{
servo1.write(45); // Doe toegangspoort open
delay(2000); // Wacht 2 seconden zodat mensen kunnen doorlopen
servo1.write(140); // Sluit toeganspoort
}

}


MVG & bij voorbaat dank!

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: RFID en Ethernetshield werken niet samen.

Berichtdoor nicoverduin » 18 Feb 2016, 21:17

Als ik dit lees: http://electronics.stackexchange.com/qu ... net-shield
Dan lijkt het sterk op jouw probleem. Je kan het evt. testen of de ethernet blijft draaien door de SS pin (=Slave Select) van de RFID ff aan GND te houden en kijken of de ethernet het dan blijft doen. Zo ja dan vrees ik dat een van de libraries niet helemaal correct omgaat met de slave select functie. waardoor beide kaarten op de bus komen en dat gaat meestal niet goed. Wie het van de 2 is, is nog maar de vraag. Ik werk vrijwel nooit met de W5100 of uberhaupt nog met Ethernet (geen noodzaak meer toe) en werk steeds meer met de ESP8266 E12. Dan heb ik geen Arduino meer nodig.

@edit: Dit schijnt wel te werken : https://www.youtube.com/watch?v=iYqVH9iIy3g
Met deze code:
cpp code
#include <SPI.h>
#include <Ethernet.h>
#include <RFID.h>
#include <LiquidCrystal.h>

void make_request(String& id); // make a badge request
void time(); // make a time request to be displayed on the lcd

// CONFIG ethernet
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
byte ip[] = {192, 168, 1, 141}; // static arduino IP
byte server[] = {192, 168, 1, 201}; // static server IP
EthernetClient client;

// CONFIG RFID
#define SS_PIN 9
#define RST_PIN 8
RFID rfid(SS_PIN, RST_PIN);

// CONFIG LCD
LiquidCrystal lcd(A0, A1, A2, A3, A4, A5);

// delay
unsigned long previousMillis = 0, currentMillis = 0;

void setup()
{ Serial.begin(9600);
SPI.begin();
rfid.init();
lcd.begin(16, 2);

lcd.setCursor(0, 0);
lcd.print(F("Device setup.."));

// disable rfid
pinMode(9, OUTPUT);
digitalWrite(9, HIGH);

// disable sd card
pinMode(4, OUTPUT);
digitalWrite(4, HIGH);

// enable ethernet
pinMode(10, OUTPUT);
digitalWrite(10, LOW);

// setup buzzer (pin 7)
pinMode(3, OUTPUT);
digitalWrite(3, HIGH);
pinMode(7, OUTPUT);
digitalWrite(7, HIGH);

// acquiring ip without dhcp
Ethernet.begin(mac, ip);
delay(1000);
lcd.setCursor(14, 0);
lcd.print(F("OK"));
delay(1000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(F(" ICAS94 "));
lcd.setCursor(0, 1);
lcd.print(F("Waiting server.."));
}

void loop()
{ // if a card is read, then get the id from the card and call make_request() for validation
if (rfid.isCard())
{ if (rfid.readCardSerial())
{ String id = "";
id += rfid.serNum[0];
id += rfid.serNum[1];
id += rfid.serNum[2];
id += rfid.serNum[3];
id += rfid.serNum[4];
//lcd.setCursor(0, 0);
//lcd.print(id);
//delay(7000);
make_request(id);
lcd.setCursor(0, 0);
lcd.print(F(" ICAS94 "));
lcd.setCursor(0, 1);
}
}

currentMillis = millis();

// fix the currentMillis overflow problem
if(currentMillis<previousMillis)
previousMillis = currentMillis;

// if a certain amount of time has passed (2 seconds), calculate the time to be displayed on the lcd calling time()
if(currentMillis-previousMillis >= 2000)
{ previousMillis = currentMillis;
time();
lcd.setCursor(0, 0);
lcd.print(F(" ICAS94 "));
}
}

void make_request(String& id)
{ if (client.connect(server, 80))
{ // enable buzzer
digitalWrite(7, LOW);

// create the request pointing to the page under the path apache2/htdocs/index.php (in my case)
String richiesta = "GET /Timb/index.php?code=";
richiesta += id;
richiesta += " HTTP/1.0";
client.println(richiesta);
client.println();
delay(50);

/* create the answer (it's not the best solution, but for my little project is perfect):
- after the request has been sent to the server, index.php gets dynamically populated with the content of the database
- all of the strings to be displayed on the lcd will be created with the structure "XXXanswer;" if i have to display an error, or "XXXanswer." if the request was ok
- i have to look inside the idex.php for the first occurrance of XXX
- start reading and storing the chars in the 'answer' variable till ';' or '.' is found
*/

String risposta = ""; // answer variable
int contatore = 0;
char c = 'a';
char c_prec = 'a';
while(true)
{ if (client.available())
{ c = client.read();
if(contatore >=3)
risposta += c;
else
{ if(c == 'X')
{ if(c_prec == 'X')
contatore++;
else
{ contatore = 1;
c_prec = c;
}
}
else if(c != 'X' && contatore < 3)
{ contatore = 0;
c_prec = c;
}
}
}
// if there isn't anything left to be read from the server display the message
if (!client.connected())
{ client.stop();
/* read the last character of the string:
- if i read ';' there must have been and error, then the red led is turned on (on pin 6)
- if i read '.' everything is ok and the green led is turned on (on pin 5)
*/
risposta.trim();
if(risposta.lastIndexOf(';')>0)
{ risposta.replace(';', '\0');
digitalWrite(6, HIGH);
}
else
digitalWrite(5, HIGH);

// print on the display
lcd.clear();
lcd.print(risposta.substring(0, risposta.lastIndexOf('.')));
lcd.setCursor(0, 1);
lcd.print(risposta.substring(risposta.lastIndexOf('.')+1));
delay(1500);

// turn off the leds and the buzzer
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
lcd.clear();
break;
}
}
}
}

void time(void)
{ lcd.setCursor(0, 1);
if (client.connect(server, 80))
{ /* same logic of the make_request(), but what i get is the time from server
setting in the request "time=1" is interpreted from the server like 'give me the actual time'
*/
client.println("GET /Timb/index.php?time=1 HTTP/1.0");
client.println();
delay(50);
String risposta = "";
int contatore = 0;
char c = 'a';
char c_prec = 'a';
while(true)
{ if (client.available())
{ c = client.read();
if(contatore >=3)
risposta += c;
else
{ if(c == 'X')
{ if(c_prec == 'X')
contatore++;
else
{ contatore = 1;
c_prec = c;
}
}
else if(c != 'X' && contatore < 3)
{ contatore = 0;
c_prec = c;
}
}
}
if (!client.connected())
{ client.stop();
lcd.print(risposta);
break;
}
}
}
/* if the server cannot be reached (server down or cable unplugged), the leds start blinkin and the lcd displays 'waiting server'
until the communication with the server is restored. at that point the time is diplayed
*/
else
{ lcd.print(F("Waiting server.."));
for(int i=0; i<10; i++)
{ digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
delay(100);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
delay(100);
}
}
}
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 10
Geregistreerd: 06 Jan 2016, 20:05

Re: RFID en Ethernetshield werken niet samen.

Berichtdoor ArduinoMega123 » 19 Feb 2016, 20:22

Beste

Heb de sketch hierboven eens proberen laden, maar hij doet het niet... ( maar zeker bedankt voor de info ;) )

Als ik mijn RFID sketch laad en alle pinnen ( SDA,MISO,MOSI,RST & SCH) aansluit werkt het RFID programma perfect!
Het probleem komt als ik alle pinnen ( SDA,MISO,MOSI,RST & SCH) in laat zitten en dan de Ethernet sketch laad.
De sketch wil dan niet werken, tenzij ik de MISO loskoppel. Dan werkt de sketch plots wel...

MVG

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: RFID en Ethernetshield werken niet samen.

Berichtdoor nicoverduin » 19 Feb 2016, 21:09

Wat gebruik jij precies voor arduino en andere shields? Ik ben ff los met wat je nu opschrijft.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 10
Geregistreerd: 06 Jan 2016, 20:05

Re: RFID en Ethernetshield werken niet samen.

Berichtdoor ArduinoMega123 » 20 Feb 2016, 13:22

Beste

Was idd wat verwarrend geschreven!
Ik gebruik een Arduino Mega 2560 met een RC522(RFID) en W5100(Ethernetshield)

MVG

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: RFID en Ethernetshield werken niet samen.

Berichtdoor nicoverduin » 20 Feb 2016, 15:40

Jij hebt het over een SDA pin, maar die hebben die boards toch niet? Het is toch beide SPI bus? SDA hoort bij I2C
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: ojitaqoduhi en 24 gasten