venerdì 20 marzo 2015

Arduino Tutorial 20: Lettore di tessere RFID


Cos'è un RFID?
Si tratta di un Radio Frequency Identification; per capirlo facilmente diciamo che sto parlando del vostro badge dell'ufficio, del tesserino dell'abbonamento ai mezzi pubblici, e di qualunque tessera funzioni solo "appoggiandola" su di un lettore... ma sto anche parlando dei chip dei cani, degli adesivi antitaccheggio etc.
Ci concentriamo però solo sulla prima tipologia in questo post.




Premesso che i piedi siano come in foto qui sopra dall'alto in basso
RFID RC522 | ARDUINO
SDA                10
SCK                13
MOSI              11
MISO              12
IRQ                 non collegato
GND               GND
RST                9
3.3V                3.3V


Il codice:

/*
 * MFRC522 - Library to use ARDUINO RFID MODULE KIT 13.56 MHZ WITH TAGS SPI W AND R BY COOQROBOT.
 * The library file MFRC522.h has a wealth of useful info. Please read it.
 * The functions are documented in MFRC522.cpp.
 *
 * Based on code Dr.Leong   ( WWW.B2CQSHOP.COM )
 * Created by Nicola Pison (webingenerale.com), Jen 2014.
 * Released into the public domain.
 *
 * Sample program showing how to read data from a PICC using a MFRC522 reader on the Arduino SPI interface.
 *----------------------------------------------------------------------------- empty_skull 
 * add pin configuration for arduino mega
 * http://www.webingenerale.com
 ----------------------------------------------------------------------------- Nicola Pison
 * Pin layout should be as follows:
 * Signal     Pin              Pin               Pin
 *            Arduino Uno      Arduino Mega      MFRC522 board
 * ------------------------------------------------------------
 * Reset      7                5                 RST
 * SPI SS     6                53                SDA
 * SPI MOSI   11               52                MOSI
 * SPI MISO   12               51                MISO
 * SPI SCK    13               50                SCK
 *
 * The reader can be found on eBay for around 5 dollars. Search for "mf-rc522" on ebay.com. 
 */

#include <SPI.h>
#include <MFRC522.h>
 /*modifico i pin dei ss e rst*/
#define SS_PIN 10
#define RST_PIN 9

MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance.

long previousMillis = 0;
long interval = 10;
int rele = 5;  //pin relè

String uidRFID[] = {"944e26eb"/*,"codeRFID_B","codeRFID_C","codeRFID_D"*/};

void setup() {
     
        
        Serial.begin(9600); // Initialize serial communications with the PC
    SPI.begin();        // Init SPI bus
    mfrc522.PCD_Init(); // Init MFRC522 card
        pinMode(rele, OUTPUT); 
    Serial.println("Avvicina il tag RFID");
        Serial.println("(numero rfid registrati) "+String(sizeof(uidRFID)/sizeof(String)));
        Serial.println("In attesa di lettura...");
       
}

void loop() {

  unsigned long currentMillis = millis();
    
  if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;  
     
      // Look for new cards
    if ( ! mfrc522.PICC_IsNewCardPresent()) {
        return;
    }

    // Select one of the cards
    if ( ! mfrc522.PICC_ReadCardSerial()) {
        return;
    }

String uid_s = "";

if (!mfrc522.PICC_IsNewCardPresent() && !mfrc522.PICC_ReadCardSerial()) {
   
    for (byte i = 0; i < mfrc522.uid.size; i++) {
         
        String uid_a = String(mfrc522.uid.uidByte[i] < 0x10 ? "0" : "");
        String uid_b = String(mfrc522.uid.uidByte[i], HEX);
           
        uid_s = uid_s+uid_a+uid_b;
          

    } 
  } 
   
  Serial.print("RFID UID rivelato --> ");
  Serial.println(uid_s);

  Serial.println("");
  boolean controllo = false;
  for (int i = 0; i < sizeof(uidRFID)/sizeof(String); i++){
   
    if(uidRFID[i] == uid_s){
      
            Serial.println("tag portachiavi blu");
            openDoor();
            controllo = true;
            break;
             
      }
    }
      
   if(!controllo){
   Serial.println("rilevato tag errato");
   digitalWrite(rele, HIGH);
   delay(100);
   digitalWrite(rele, LOW);
   delay(100);
    digitalWrite(rele, HIGH);
   delay(100);
   digitalWrite(rele, LOW);
   delay(100);
    digitalWrite(rele, HIGH);
   delay(100);
   digitalWrite(rele, LOW);
      
   delay(1000);
   } 
    
   Serial.println();
   Serial.println("In attesa di lettura...");
    
  }
}

void openDoor(){

  digitalWrite(rele, HIGH);
  Serial.println("Rele' ON");
  delay(500);
  digitalWrite(rele, LOW);
  Serial.println("Rele' OFF");
   
}


tramite il  Monitor Seriale (CTRL+SHIFT+M) riconosce quali siano i Tag posti in prossimità del lettore mostrando il loro numero di ID appunto. Questo numero posso poi confrontarlo con una serie di altri che ho inserito nel software, se corrisponde allora compie un'azione, in questo caso attiva un relè o più semplicemente fa emettere un beep lungo (tre brevi se il tag è errato).

La libreria potete scaricarla da quì

Se avete dei problemi a far funzionare il circuito commentate o scrivete sul forum.

martedì 22 luglio 2014

Arduino Tutorial 19: programmare arduino mini pro 5v 328p

vediamo come programmare arduino mini con il convertitore pl 2303 rs232/usb                                             


Arduino pro mini pin:
per prima cosa bisogna individuare i pin da collegare tra arduino e il convertitore


Convertitore:

il nostro convertitore potrebbe presentarsi così o in altro modo non importa.


 ciò che importa è individuare i pin necessari alla programmazione della nostra scheda....

i pin che ci servono sono:                                                                                                                                
  • 5V (+)
  • GND (-)
  • TX
  • RX
  • DTR
adesso che abbiamo individuato i pin necessari alla programmazione di arduino mini pro, dobbiamo saldare un filo nel pin DTR del nostro convertitore, gli altri dovrebbero esserci già altrimenti eseguite la stessa operazione anche per gli atri pin


Adesso colleghiamo arduino mini pro al convertitore USB, nel seguente modo.


 come potete vedere dall'immagine in basso, i pin dal basso verso l'alto ci sono i primi due pin GND, il terzo VCC 5V, il quarto RX, il quinto TX e il sesto DTR molto importante ai fini della programmazione senza questo pin l'IDE di arduino restituisce un errore.



Convertitore             Arduino PRO Mini Bootloader
VCC  —————– VCC (5)
RXD —————– TXO (TXD)
TXD —————— RXI (RXD)
DTR —————— RESET (this is the pad lable as “GRN”)
RTS —————— NC (Not Connected), ignore this pin
GND —————— GND
il pin RX convertitore va incrociato con il TX di arduino e TX convertitore con RX arduino, il Pin DTR convertitore collegato al pin RESET
Per poter utilizzare il convertitore bisogna installare i driver  per windows.
scompattate il file zip e installate il driver tramite il file .exe 
successivamente verificate la corretta installazione e riconoscimento da parte del pc del convertitore appena installato:
Pannello di controllo-------Sistema--------Hardware---------Gestione Periferiche---------port COM & LPT.
vedremo il nome del driver e laporta su cui è collegato questo sarà molto utile dopo...

Adesso che abbiamo collegato arduino con il convertitore ed installato i driver, apriamo l'ide di arduino:
Strumenti------Tipo di arduino scegliamo il nostro arduino pro mini 5v 16Mhz 328.
poi Strumenti-------porta seriale quella indicata nella finestra "Gestione periferiche".
adesso caricate uno sketch ad esempio un blink con delay 100 o quello che volete.



Se avete dei problemi a far funzionare il circuito commentate o scrivete sul forum.

giovedì 10 luglio 2014

Arduino Tutorial 18: Controllare un Motore DC con un ponte H (L293D)

con il componente L293D è possibile controllare fino a due motori in corrente continua ad una tensione che va da 4,5v a 36v.
La prima operazione da fare è collegare un interruttore al pin 2 di arduino come in figura 1.



Come funziona un ponte H?

L'L293NE/SN754410 é un ponte-H molto semplice. E' costituito da due "ponti", uno sul lato sinistro del chip ed uno sul lato destro, e può controllare 2 motori. Può controllare dino ad 1 ampere di corrente, e funziona tra i 4.5 V e i 36 V.
I pin del ponte H:
  • Pin 1 (1,2EN) attiva/disattiva il nostro motore a seconda che sia HIGH o LOW
  • Pin 2 (1A) é un pin logico per il nostro motore (ppuò essere HIGH o LOW)
  • Pin 3 (1Y) é uno dei due poin a cui metteremo il motore (motor terminals)
  • Pin 4-5 sono per la massa (GND)
  • Pin 6 (2Y) é per l'altro motor terminal
  • Pin 7 (2A)é un pin logico per il nostro motore (ppuò essere HIGH o LOW)
  • Pin 8 (VCC2) é l'alimentazione per il nostor motore, a cui dovremmo dare il voltaggio giusto per il nostro motore
  • Pin 9-11 non sono utilizzati (stiamo controllando solo un motore in questa lezione)
  • Pin 12-13sono per la massa (GND)
  • Pin 14-15 non sono connessi
  • Pin 16 (VCC1) é connesso a 5V
Qui sotto c'é un diagramma sui pin che useremo e su come li useremo nel nostro esempio. Nella tabella sottostante potete vedere il comportamento del motore seconda si come vengono settati i pin dell'integrato (controllati da Arduino).
Per questa lezione controlleremo l'EN pin del chip con un pin digitale di Arduino: settandolo HIGH o LOW accennderemo o spegneremo il motore. anche i pin logici del chip saranno connessi a dei pin digitali di Arduino, in modo da andare in una direzione con HIGH e LOW, nella direzione opposta con LOW e HIGH. L'alimentazione del motore é comunemente esterna. Seil motore che usate può andare a 5V e a meno di 500 mA potete usare i 5V di Arduino. Questo é molto raro.


Connettiamo il motore al Ponte H

Se avete bisogno di un'alimentazione esterna, potete usare una fonte di energia 9 - 15V (se compatibile con il vostro motore).
Attaccate un alimentazion esterna ad Arduino. Potete mantenere l'Arduino attaccato via USb al computer per riprogrammare velocemente il microcontrollore. Qualunque motore usiate, assicuratevi che sia compatibile con l'alimentazione (e.g. non usate batterie da 9V con un motore sa 3V!). Il pin Vin restituisce il valore dell'alimentazione esterna.
Se notate che il vostro microcontrollore va in reset quando il motore si accende, aggiungete in condensatore tra alimentazione e massa vicino al motore. Il condensatore spianerà lo sbalzo elettrico che avviene quando il motore si accende. 


Alimentazione Esterna



Il codice:

controlla il motore tramite l'interruttore

const int switchPin = 2;    // switch input
  const int motor1Pin = 3;    // H-bridge leg 1 (pin 2, 1A)
  const int motor2Pin = 4;    // H-bridge leg 2 (pin 7, 2A)
  const int enablePin = 9;    // H-bridge enable pin
  const int ledPin = 13;      // LED
  
  void setup() {
    // set the switch as an input:
    pinMode(switchPin, INPUT);
  
    // set all the other pins you're using as outputs:
    pinMode(motor1Pin, OUTPUT);
    pinMode(motor2Pin, OUTPUT);
    pinMode(enablePin, OUTPUT);
    pinMode(ledPin, OUTPUT);
  
    // set enablePin high so that motor can turn on:
    digitalWrite(enablePin, HIGH);
  
    // blink the LED 3 times. This should happen only once.
    // if you see the LED blink three times, it means that the module
    // reset itself,. probably because the motor caused a brownout
    // or a short.
    blink(ledPin, 3, 100);
  }
  
  void loop() {
    // if the switch is high, motor will turn on one direction:
    if (digitalRead(switchPin) == HIGH) {
      digitalWrite(motor1Pin, LOW);   // set leg 1 of the H-bridge low
      digitalWrite(motor2Pin, HIGH);  // set leg 2 of the H-bridge high
    }
    // if the switch is low, motor will turn in the other direction:
    else {
      digitalWrite(motor1Pin, HIGH);  // set leg 1 of the H-bridge high
      digitalWrite(motor2Pin, LOW);   // set leg 2 of the H-bridge low
    }
  }
  
  /*
    blinks an LED
   */
  void blink(int whatPin, int howManyTimes, int milliSecs) {
    int i = 0;
    for ( i = 0; i < howManyTimes; i++) {
      digitalWrite(whatPin, HIGH);
      delay(milliSecs/2);
      digitalWrite(whatPin, LOW);
      delay(milliSecs/2);
    }
  }

Codice test motori via seriale

Controllo motore tramite monitor seriale digitando: "H", "J", "L"
Usando analogWrite() sul pin 9, il pin di attivazione (Enable) del chip e potrete variare la velocità del motore.
Codice:
// testing motors
//
  
  
const int motor1Pin = 3;    // H-bridge leg 1 (pin 2, 1A)
const int motor2Pin = 4;    // H-bridge leg 2 (pin 7, 2A)
const int enablePin = 9;    // H-bridge enable pin
const int ledPin = 13;      // LED
  
int incomingByte;      // a variable to read incoming serial data into
  
  
void setup() {
  Serial.begin(9600); // open serial port to receive data
  
  
  // set all the other pins you're using as outputs:
  pinMode(motor1Pin, OUTPUT);
  pinMode(motor2Pin, OUTPUT);
  pinMode(enablePin, OUTPUT);
  pinMode(ledPin, OUTPUT);
  
  // set enablePin high so that motor can turn on:
  digitalWrite(enablePin, LOW);
  
}
  
void loop() {
  // see if there's incoming serial data:
  if (Serial.available() > 0) {
    // read the oldest byte in the serial buffer:
    incomingByte = Serial.read();
    // if it's a capital H (ASCII 72), turn on the LED:
    if (incomingByte == 'H') {
      digitalWrite(enablePin, HIGH);  // accende  il motore
      digitalWrite(motor1Pin, LOW);   // set leg 1 of the H-bridge low
      digitalWrite(motor2Pin, HIGH);  // set leg 2 of the H-bridge high
    }
    else if (incomingByte == 'J') {
      digitalWrite(enablePin, HIGH);  // accende il motore,
      digitalWrite(motor1Pin, HIGH);   // set leg 1 of the H-bridge low
      digitalWrite(motor2Pin, LOW);  // set leg 2 of the H-bridge high
    }    
    else if (incomingByte == 'L') {
      digitalWrite(enablePin, LOW);  // spegne il motore
    }
  
  }
  
}

modificando "HIGH" con un valore che va da 0 a 255 si può agire sulla velocità
digitalWrite(enablePin, HIGH);
adesso non vi resta che sperimentare ed adattarlo alle vostre esigenze.

Se avete dei problemi a far funzionare il circuito commentate o scrivete sul forum.