Avr-duino ethshild r7 nem továbbaitja az rfid olvasó adatait

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Válasz küldése
Avatar
tobyasz
Újonc
Újonc
Hozzászólások: 8
Csatlakozott: 2010. február 18. csütörtök, 7:00

Avr-duino ethshild r7 nem továbbaitja az rfid olvasó adatait

Hozzászólás Szerző: tobyasz »

Sziasztok!

Készítek a munkahelyemre (iskola) egy munkaidő-nyilvántartót. Úgy nézne ki a dolog, hogy a kollégák bejönnek a tanáriba és a falon elhelyezett arduino+rfid olvasó+ethernet modul-on elhúzzák az rfid-s kulcstartójukat. Az rfid tag-et egy webszerver dolgozza fel az alábbi link meghívásával: www.myhost.hu/index.php?rfid=1234567890
Az rfid azonosítóját és az olvasás dátumát egy ideiglenes táblában tárolom.
A szerver minden nap kiválogatja az első és utolsó leolvasásokat és elmenti őket egy mysql táblába.
A probléma a következő. Az enc28j60 chip-hez talált web kliens példa jól működik. Ha a fenti linket beadom neki akkor a megadott időközönként GET kérést intéz a szerver felé. A parallax rfid író/olvasó példakódja is működik. Azonban, ha a kettőt összefésülöm már nem. Az rfid olvasáskor a fenti link segítségével kellene átadni az rfid tag azonosítóját.
Soros monitorra kiíratom azonosítót, és az jó, de a szerveren már nem látom az azonosítót. Ja és nem a php kód rossz, mert a fenti linket böngészőbe másolva működik.
Nagyon megköszönném, ha tudna valaki segíteni.
Itt a kód:

Kód: Egész kijelölése

#include "etherShield.h"
#include "icrmacros.h"
#include "NewSoftSerial.h"

//ethernet beáálítás
//client
static uint8_t mymac[6] = {0x54,0x55,0x58,0x10,0x00,0x33}; 
static uint8_t myip[4] = {192,168,1,104};
static uint16_t my_port = 1200;
static char client_ip[] = "192.168.1.104";
// server
static uint8_t dest_ip[4]={192,168,1,66};
static uint8_t dest_mac[6];

//RFID 
#define txPin 9
#define rxPin 8
#define RFID_LEGACY 0x0F
NewSoftSerial mySerial(rxPin, txPin);
int  val = 0; 
char code[11];     //Note this is 11 for the extra null char?
String code2 = "";
int bytesread = 0;


enum CLIENT_STATE
{  
   IDLE, ARP_SENT, ARP_REPLY, SYNC_SENT
 };
 
static CLIENT_STATE client_state;

static uint8_t client_data_ready;

static uint8_t syn_ack_timeout = 0;


#define BUFFER_SIZE 500
static uint8_t buf[BUFFER_SIZE+1];

EtherShield es=EtherShield();


void setup(){
    Serial.begin(9600);
    //RFID setup
    mySerial.begin(9600);
    pinMode(2, OUTPUT);
    pinMode(4, OUTPUT);
    pinMode(txPin, OUTPUT);     //pin 6
    pinMode(rxPin, INPUT);      //pin 8
    Serial.println("RFID Read/Write Test");
    pinMode(13, OUTPUT);
   //initialize enc28j60
   es.ES_enc28j60Init(mymac);
   es.ES_enc28j60clkout(2); // change clkout from 6.25MHz to 12.5MHz
   delay(10);

	es.ES_enc28j60PhyWrite(PHLCON,0x880);
	delay(500);

	es.ES_enc28j60PhyWrite(PHLCON,0x990);
	delay(500);

	es.ES_enc28j60PhyWrite(PHLCON,0x880);
	delay(500);

	es.ES_enc28j60PhyWrite(PHLCON,0x990);
	delay(500);

        es.ES_enc28j60PhyWrite(PHLCON,0x476);
      	delay(100);
              
        //init the ethernet/ip layer:
        es.ES_init_ip_arp_udp_tcp(mymac,myip,80);
        
        // intialize varible;
        syn_ack_timeout =0;
        client_data_ready = 0;
        client_state = IDLE;
 
}


void loop(){
  Serial.begin(9600);
  mySerial.print("!RW");
  mySerial.write(byte(RFID_LEGACY));
  //mySerial.print(32, BYTE);
  if(mySerial.available() > 0) {          
    if((val = mySerial.read()) == 10) {  
      bytesread = 0; 
      while(bytesread<10) {               
        if( mySerial.available() > 0) { 
          val = mySerial.read(); 
          if((val == 10)||(val == 13)) {  
            break;                        
            } 
          code[bytesread] = val;                    
          bytesread++;                    
        } 
      } 
        if(bytesread == 10) {              // if 10 digit read is complete 
          Serial.print("TAG code is: ");   // possibly a good TAG 
          Serial.println(code);            // print the TAG code 
          digitalWrite(13, HIGH);
          delay(1000);
          digitalWrite(13, LOW);
//Ethernet  
     if(client_data_ready==1){
          	client_process();
          client_data_ready=0;
          delay(1000);  	
        }
        else{
           delay(1000);
           client_data_ready=1;
       }
              
        } 
      bytesread = 0;
      code2 = code;
      delay(500);
      } 
  }
}

ISR(INT1_vect) {
  client_data_ready= 1;
}


uint16_t gen_client_request(uint8_t *buf )
{
	uint16_t plen;
	byte i;
        
	plen= es.ES_fill_tcp_data_p(buf,0, PSTR ( "GET http://local.hu/index.php?id=" ) );
        for(i=0; code[i]!='\0'; i++){
            buf[TCP_DATA_P+plen]=code[i];
            plen++;
        }    
        plen= es.ES_fill_tcp_data_p(buf, plen, PSTR ( " HTTP/1.0\r\n" ));
	plen= es.ES_fill_tcp_data_p(buf, plen, PSTR ( "Host: 192.168.1.66\r\n" ));
	plen= es.ES_fill_tcp_data_p(buf, plen, PSTR ( "User-Agent: AVR ethernet\r\n" ));
        plen= es.ES_fill_tcp_data_p(buf, plen, PSTR ( "Accept: text/html\r\n" ));
	plen= es.ES_fill_tcp_data_p(buf, plen, PSTR ( "Keep-Alive: 300\r\n" ));
	plen= es.ES_fill_tcp_data_p(buf, plen, PSTR ( "Connection: keep-alive\r\n\r\n" ));

	return plen;
}

void client_process ( void )
{
    uint16_t plen;
	uint8_t i;

    if (client_data_ready == 0)  return;     // nothing to send

	if(client_state == IDLE){   // initialize ARP
       es.ES_make_arp_request(buf, dest_ip);
	   
	   client_state = ARP_SENT;
	   return;
	}
     
		
	if(client_state == ARP_SENT){
        
        plen = es.ES_enc28j60PacketReceive(BUFFER_SIZE, buf);

		// destination ip address was found on network
        if ( plen!=0 )
        {
            if ( es.ES_arp_packet_is_myreply_arp ( buf ) ){
                client_state = ARP_REPLY;
				syn_ack_timeout=0;
				return;
            }
		
		}
	        delay(10);
		syn_ack_timeout++;
		
		
		if(syn_ack_timeout== 100) {  //timeout, server ip not found
			client_state = IDLE;
			client_data_ready =0;
			syn_ack_timeout=0;
			return;
		}	
    }

   

 // send SYN packet to initial connection
	if(client_state == ARP_REPLY){
		// save dest mac
		for(i=0; i<6; i++){
			dest_mac[i] = buf[ETH_SRC_MAC+i];
		}
	
        es.ES_tcp_client_send_packet (
                       buf,
                       80,
                       1200,
                       TCP_FLAG_SYN_V,                 // flag
                       1,                                              // (bool)maximum segment size
                       1,                                              // (bool)clear sequence ack number
                       0,                                              // 0=use old seq, seqack : 1=new seq,seqack no data : new seq,seqack with data
                       0,                                              // tcp data length
		      dest_mac,
		      dest_ip
                       );
		
		client_state = SYNC_SENT;
	}
  // get new packet
  if(client_state == SYNC_SENT){
    plen = es.ES_enc28j60PacketReceive(BUFFER_SIZE, buf);

       // no new packet incoming
    if ( plen == 0 )
    {
        return;
    }

       // check ip packet send to avr or not?
       // accept ip packet only
    if ( es.ES_eth_type_is_ip_and_my_ip(buf,plen)==0){
		return;
    }

       // check SYNACK flag, after AVR send SYN server response by send SYNACK to AVR
    if ( buf [ TCP_FLAGS_P ] == ( TCP_FLAG_SYN_V | TCP_FLAG_ACK_V ) )
    {

               // send ACK to answer SYNACK

               es.ES_tcp_client_send_packet (
                       buf,
                       80,
                       1200,
                       TCP_FLAG_ACK_V,                 // flag
                       0,                                              // (bool)maximum segment size
                       0,                                              // (bool)clear sequence ack number
                       1,                                              // 0=use old seq, seqack : 1=new seq,seqack no data : new seq,seqack with data
                       0,                                              // tcp data length
						dest_mac,
						dest_ip
                       );
               // setup http request to server
               plen = gen_client_request( buf );
               // send http request packet
               // send packet with PSHACK
               es.ES_tcp_client_send_packet (
                                       buf,
                                       80,                                             // destination port
                                       1200,                                   // source port
                                       TCP_FLAG_ACK_V | TCP_FLAG_PUSH_V,                        // flag
                                       0,                                              // (bool)maximum segment size
                                       0,                                              // (bool)clear sequence ack number
                                       0,                                              // 0=use old seq, seqack : 1=new seq,seqack no data : >1 new seq,seqack with data
                                       plen,                           // tcp data length
                                       dest_mac,
									   dest_ip
									   );
               return;
       }
       // after AVR send http request to server, server response by send data with PSHACK to AVR
       // AVR answer by send ACK and FINACK to server
       if ( buf [ TCP_FLAGS_P ] == (TCP_FLAG_ACK_V|TCP_FLAG_PUSH_V) )
       {
               plen = es.ES_tcp_get_dlength( (uint8_t*)&buf );

               // send ACK to answer PSHACK from server
               es.ES_tcp_client_send_packet (
                                       buf,
                                       80,                                             // destination port
                                       1200,                                   // source port
                                       TCP_FLAG_ACK_V,                  // flag
                                       0,                                              // (bool)maximum segment size
                                       0,                                              // (bool)clear sequence ack number
                                       plen,                                           // 0=use old seq, seqack : 1=new seq,seqack no data : >1 new seq,seqack with data
                                       0,                              // tcp data length
				      dest_mac,
				      dest_ip
               );;
               // send finack to disconnect from web server

               es.ES_tcp_client_send_packet (
                                       buf,
                                       80,                                             // destination port
                                       1200,                                   // source port
                                       TCP_FLAG_FIN_V|TCP_FLAG_ACK_V,                  // flag
                                       0,                                              // (bool)maximum segment size
                                       0,                                              // (bool)clear sequence ack number
                                       0,                                           // 0=use old seq, seqack : 1=new seq,seqack no data : >1 new seq,seqack with data
                                       0,
										dest_mac,
										dest_ip
				);

               return;
               
       }
       // answer FINACK from web server by send ACK to web server
       if ( buf [ TCP_FLAGS_P ] == (TCP_FLAG_ACK_V|TCP_FLAG_FIN_V) )
       {
               // send ACK with seqack = 1
               es.ES_tcp_client_send_packet(

                                       buf,
                                       80,                                             // destination port
                                       1200,                                   // source port
                                       TCP_FLAG_ACK_V,                 // flag
                                       0,                                              // (bool)maximum segment size
                                       0,                                              // (bool)clear sequence ack number
                                       1,                                              // 0=use old seq, seqack : 1=new seq,seqack no data : >1 new seq,seqack with data
                                       0,
									   dest_mac,
									   dest_ip
				);
			client_state = IDLE;		// return to IDLE state
			client_data_ready =0;		// client data sent
		}
  }       
}
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Első tipp: softserial.
Adatod beér az AVR-be?
Lezárása OK?
Kiiratni kitudod? debugokat ha berakod, hogy merre jár a program?
A lekérést ha fox adattal teszed meg?

Sok helyen lehet hiba:
- RFID olvasás -> soros adatfigyelés,
- adatátadás -> soros debug,
- EthCsomag hiba -> ethereal/wiresharkkal hallgatod

Milyen AVR-t használsz? Igaz nem atmega168-at?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Softserial 9600 bps - háát.... 2400-nak már örülhetsz ha megy:(
Avatar
fodor99
DrótVégénSzéndarab
Hozzászólások: 23
Csatlakozott: 2012. március 24. szombat, 6:00

Hozzászólás Szerző: fodor99 »

client_data_ready nem volatile? mivel megszakitasban van hasznalva....
Avatar
tobyasz
Újonc
Újonc
Hozzászólások: 8
Csatlakozott: 2010. február 18. csütörtök, 7:00

Hozzászólás Szerző: tobyasz »

Róbert : Az rfid olvasáskor kiíratom a soros monitorra a kártya azonosítóját. Azt jól olvassa. Az ethernet kártya sárga led-je a utp kábel csatlakozónál felvillan, gondolom történik valamilyen kommunikáció. De a szerverhez nem jut el, vagy csak nem az minek kellene ?
Atmega168-at használok. Az a baj hogy annyira nem értek hozzá, hogy az ethernet modul programozását megértsem. Ha a két kód működik külön külön akkor együtt miért nem?
Este kiiratom hol tart a program. Ha Wiznet-es chipet használok azzal könnyebb dolgom lenne?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

M168: memóriád elfogyott és felülírás van benne...
A freemem() parancssal meg tudod lesni, hogy nem e fogyott el...

ATMega328 kellene bele....


Wiznet: kisebb erőforrásigény, de a memóriaigényt nem úszod meg (szerintem).


Eth figyelés/ellenőrzés:
- HUB + ethjerreal szoftver (switch nem jó, mert a csomagot nem tudod vizsgálni)
- debug soroson: mikormelyik változóban milyen adat van (tényleg azt küldöm? küldöm-e egyáltalán?)
Avatar
tobyasz
Újonc
Újonc
Hozzászólások: 8
Csatlakozott: 2010. február 18. csütörtök, 7:00

Hozzászólás Szerző: tobyasz »

Köszönöm a segítséget. Este megnézem, ha nálam lesz a kütyü.
Sajnos nincs sok időm a megvalósításra. Jövőhétre működnie kellene.

Róbert, szerinted ha vennék egy sd kártya olvasós modult amin van óra is akkor egyszerűbb lenne e az sd-kártyán tárolni ez rfid olvasó azonosítóját és az aktuális időt egy txt fájlba?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

168-as chippel nem. Nem férsz bele (kicsi az 1k SRAM).

A hálózaton tárolás azért jó, mert
- WEB-es felületen szűrhetsz, listázhatsz,
- grafikonozhatsz,
- más is hozzáférhet, jogosultságot lekezeled...


Ha csak a RFID-k lementése a cél, akkor az SD egyszerűbb...
Kérdés: mi a pontos feladatod?:)
Avatar
tobyasz
Újonc
Újonc
Hozzászólások: 8
Csatlakozott: 2010. február 18. csütörtök, 7:00

Hozzászólás Szerző: tobyasz »

A feladat az lenne, hogy a tanároknak van egy rfid-s kulcstartójuk. Amikor bejön az iskolába blokkol, amikor hazamegy blokkol. Közben bármikor blokkolhat, de nekünk az első és az utolsó blokkolás dátuma kell. Ha web szerverre menteném az adatokat akkor egy ideiglenes táblában trolnám a blokkolt azonosítókat a dátummal és idővel. Majd este egy script megnézi tábla tartalmát megkeresi az azonosítóhoz tartalmazó első és utolsó dátumot és azt menti a munkaidő-nyilvántartó táblába. Az ideiglenes tároló tábla tartalmát pedig törli.
Ha SD kártyára történne a mentés akkor hetente feltölteném a txt fájl tartalmát és egy php script feldolgozná azt.
Nem tudom hogy mondjuk az alábbi linken található leírással működne e a projekt ( http://garagelab.com/profiles/blogs/tut ... th-arduino ).
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Mi van ha a SD sérül?
Mi van ha nincs adatrögzítésed?

Ami én csinálnék:
- ethernetes holmi és I2C EEPROMban a vészmentés FIFO tárban az utolsó 2-3 munkanap adataival...
A feladatot megoldani és nem elfedni kell:)

Hülye tipp:
- PC nincs?
- arra RFID olvasó, és az sorosan jön be. Így a PC feldolgozza/adatot küld....
Avatar
tobyasz
Újonc
Újonc
Hozzászólások: 8
Csatlakozott: 2010. február 18. csütörtök, 7:00

Hozzászólás Szerző: tobyasz »

Pc-t ki kellene hagyni. Bár amíg nem oldom meg problémát addig lehet hogy ideiglenesen rákötöm egy pc-re.
Addig is megnézem, hogy miért nem érkezik meg az adat.
Az eeprom elgondolkodtató. Ha működik minden akkor hozzáteszem azt is.
Válasz küldése