zondag 24 juni 2012

Arduino, RFID, en hoe het er nou uiteindelijk allemaal uit ziet.

Ik heb al een keer eerder gepost over arduino, en over RFID technologie, maar deze keer is het dan zo ver, de code en alles er om heen.

om te beginnen zal ik hier de code posten, omdat ik er gewoon donders trots op ben, het was een kreng om te schrijven, en dit is versie 3.4 (!), de eerste volledig werkende:


int RFIDResetPin = 13;

char tag1[13] = "060097889A83";
char tag2[13] = "060097889F86"; //dit zijn de tag nummers

#include <Servo.h>
Servo myservo;
Servo myservo1; // het koppelen van de servo's



void setup(){
  Serial.begin(9600); //dit is de taal (serial 9600) waarmee de RFID reader communiceert

  pinMode(RFIDResetPin, OUTPUT);
  digitalWrite(RFIDResetPin, HIGH);

  myservo.attach(10);
  myservo1.attach(9);


}

void loop(){
  char tagString[13];
  int index = 0;
  boolean reading = false;
 
 myservo.write(0);
 myservo1.write(0); // de servo's hadden nog wel eens problemen met het vinden van de beginstand
 
  while(Serial.available()){

    int readByte = Serial.read(); //read next available byte

    if(readByte == 2) reading = true; //begining of tag
    if(readByte == 3) reading = false; //end of tag

    if(reading && readByte != 2 && readByte != 10 && readByte != 13){
      //store the tag
      tagString[index] = readByte;
      index ++;
      Serial.println(tagString); // het hele bovenstaande is de code die de tag leest, en dus bepaald of hij in het systeem staat
    }
  }

  checkTag(tagString); //Check if it is a match
  clearTag(tagString); //Clear the char of all value
  resetReader(); //reset the RFID reader
}

void checkTag(char tag[]){
  ///////////////////////////////////
  //Check the read tag against known tags
  ///////////////////////////////////

  if(strlen(tag) == 0) return; //empty, no need to contunue

  if(compareTag(tag, tag1)){ // if matched tag1, do this
    Drop1(10);

  }else if(compareTag(tag, tag2)){ //if matched tag2, do this
    Drop2(9);

  }else{
    Serial.println(tag); //read out any unknown tag
  }

}

void Drop1(int pin){ // dan de Drop commands, die de servo aansturen en dus het balletje droppen
  Serial.println(pin);
 
  myservo.write(90);
  delay(400);
  myservo.write(0);
  delay(1000);
 }

void Drop2(int pin){
  Serial.println(pin);
 
  myservo1.write(90);
  delay(400);
  myservo1.write(0);
  delay(1000);
}

void resetReader(){
  ///////////////////////////////////
  //Reset the RFID reader to read again.
  ///////////////////////////////////
  digitalWrite(RFIDResetPin, LOW);
  digitalWrite(RFIDResetPin, HIGH);
  delay(500);
}

void clearTag(char one[]){
  ///////////////////////////////////
  //clear the char array by filling with null - ASCII 0
  //Will think same tag has been read otherwise
  ///////////////////////////////////
  for(int i = 0; i < strlen(one); i++){
    one[i] = 0;
  }
}

boolean compareTag(char one[], char two[]){
  ///////////////////////////////////
  //compare two value to see if same,
  //strcmp not working 100% so we do this
  ///////////////////////////////////

  if(strlen(one) == 0) return false; //empty

  for(int i = 0; i < 12; i++){
    if(one[i] != two[i]) return false;
  }

  return true; //no mismatches
}


En om te bewijzen dat het werkt:















dit is 1 van de 1e tests, met nog LED's in plaats van servo's
helaas is het filmpje van de voledige setup nog in bezit van mijn groepsgenoot Jamy...


Geen opmerkingen:

Een reactie posten