RFID + bluetooth deurslot

algemene C code
Berichten: 4
Geregistreerd: 25 Dec 2016, 21:10

RFID + bluetooth deurslot

Berichtdoor chimaerion » 25 Dec 2016, 21:21

Hallo,

Ik ben bezig met de deur van mijn slaapkamer te voorzien van een elektronisch deurslot via een servomotor en 3D-geprinte onderdelen voor het slot.
Ik heb een arduino nano met daaraan gekoppeld een HC-05 bluetooth module en een MFRC522 RFID lezer.
Ik heb beide apart getest en ik kan het slot openen en sluiten.
Maar als ik beide codes bij elkaar voeg, lukt het niet.

Kan er iemand naar mijn code kijken wat er fout is en verbeteren?

Dit zijn mijn programma's:

Mijn code voor bluetooth die werkt:
Code: Alles selecteren
#include <Servo.h>
 
Servo servo;  // create servo object to control a servo
                // a maximum of eight servo objects can be created
const int servoPin = 3;
int pos = 0;    // variable to store the servo position

 
void setup()
{   
  servo.attach(servoPin);
  Serial.begin(9600);  // initialize serial: 
 
 
  Serial.print("Arduino control Servo Motor Connected OK");
  Serial.print("\n");
}
 
void loop()

  // if there's any serial available, read it:
  while (Serial.available() > 0) {
   
    // look for the next valid integer in the incoming serial stream:
   
    pos = Serial.parseInt();
   
    // look for the newline. That's the end of your  sentence:
    if (Serial.read() == '\n') {
               
       servo.write(pos);              // tell servo to go to position in variable 'pos'
       delay(15);                       // waits 15ms for the servo to reach the position
     
 



RFID code die werkt:
Code: Alles selecteren
#include <SPI.h>

#include <MFRC522.h>
#include <Servo.h>
#define RST_PIN         9           // Configurable, see typical pin layout above
#define SS_PIN          10          // Configurable, see typical pin layout above

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

String read_rfid;
String ok_rfid_1="909987ab"; //add as many as you need.
String ok_rfid_2="85aaba5";
String ok_rfid_3="13d4b228";
String ok_rfid_4="9ab7b97f";
String ok_rfid_5="33578aa7";
String ok_rfid_6="b2bc71d";


Servo myservo;  // create servo object to control a servo
int posClosed = 0;    // variable to store the servo position for locked
int posOpen = 360;    //same for open...


/*
 * Initialize.
 */
void setup() {
    Serial.begin(9600);         // Initialize serial communications with the PC

    while (!Serial);            // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
    SPI.begin();                // Init SPI bus
    mfrc522.PCD_Init();         // Init MFRC522 card

    myservo.attach(3);  // attaches the servo on pin 3 to the servo object
}

/*
 * Helper routine to dump a byte array as hex values to Serial.
 */
void dump_byte_array(byte *buffer, byte bufferSize) {
    read_rfid="";
    for (byte i = 0; i < bufferSize; i++) {
        read_rfid=read_rfid + String(buffer[i], HEX);
    }
}

void open_lock() {
 
 
  //Use this routine when working with Servos.
 myservo.write(90);
 delay(2000);
myservo.write(0);
}

void loop() {

   
      // Look for new cards
    if ( ! mfrc522.PICC_IsNewCardPresent())
        return;

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

    dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
    Serial.println(read_rfid);
   
    if ((read_rfid==ok_rfid_1)||(read_rfid==ok_rfid_2)||(read_rfid==ok_rfid_3)||(read_rfid==ok_rfid_4)||(read_rfid==ok_rfid_5)||(read_rfid==ok_rfid_6))  {
    open_lock();
 
  }}





De code die bluetooth en RFID bevat, maar niet werkt:
Code: Alles selecteren

#include <SPI.h>

 

#include <MFRC522.h>
#include <Servo.h>
#define RST_PIN         9           // Configurable, see typical pin layout above
#define SS_PIN          10          // Configurable, see typical pin layout above
 
MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance.
 
String read_rfid;
String ok_rfid_1="909987ab"; //add as many as you need.
String ok_rfid_2="85aaba5";
String ok_rfid_3="13d4b228";
String ok_rfid_4="9ab7b97f";
String ok_rfid_5="33578aa7";

String ok_rfid_6="b2bc71d";

const int servoPin = 3;

int pos = 0;    // variable to store the servo position


Servo myservo;  // create servo object to control a servo

int posClosed = 0;    // variable to store the servo position for locked

int posOpen = 360;    //same for open...


/*
 * Initialize.
 */

void setup() {

    Serial.begin(9600);         // Initialize serial communications with the PC

    Serial.print("Arduino control Servo Motor Connected OK");
Serial.print("\n");

    while (!Serial);            // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)

    SPI.begin();                // Init SPI bus

    mfrc522.PCD_Init();         // Init MFRC522 card

    myservo.attach(3);  // attaches the servo on pin 3 to the servo object

}

/*

 * Helper routine to dump a byte array as hex values to Serial.
 */

void dump_byte_array(byte *buffer, byte bufferSize) {

    read_rfid="";
    for (byte i = 0; i < bufferSize; i++) {

        read_rfid=read_rfid + String(buffer[i], HEX);

    }

}

void open_lock() {

  //Use this routine when working with Servos.

 myservo.write(90);

 delay(2000);

myservo.write(0);

}

void loop() {

 // if there's any serial available, read it:
  if (Serial.available() > 0) {
    // look for the next valid integer in the incoming serial stream:

    pos = Serial.parseInt();

    // look for the newline. That's the end of your  sentence:

    if (Serial.read() == '\n') {

       myservo.write(pos);              // tell servo to go to position in variable 'pos'

       delay(15);                       // waits 15ms for the servo to reach the position
     
      // Look for new cards

    if ( ! mfrc522.PICC_IsNewCardPresent())
        return;

    // Select one of the cards

    if ( ! mfrc522.PICC_ReadCardSerial())

        return;

    dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);

    Serial.println(read_rfid);

    if ((read_rfid==ok_rfid_1)||(read_rfid==ok_rfid_2)||(read_rfid==ok_rfid_3)||(read_rfid==ok_rfid_4)||(read_rfid==ok_rfid_5)||(read_rfid==ok_rfid_6))  {

    open_lock();

}  }}}



Het probleem bij de laatste code is dat hij maar sporadig de servomotor doet draaien en het bluetooth stuk doet gewoon niks. Hij reageert niet op commands.

Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: RFID + bluetooth deurslot

Berichtdoor Koepel » 26 Dec 2016, 13:43

Kun je het wat netter maken ? Zorg dat de layout van de code (de tekst) op orde is, zoals het inspringen en de haakjes. Je kunt beginnen met op Ctrl+T te drukken.
Wanneer dit onderaan staat:
Code: Alles selecteren
}  }}}
dan lijkt het alsof je zelf niet weet hoe de structuur van je code is :o

Je gebruikt een combinatie van Serial.available() en kijkt of Serial.read() een LineFeed is en vervolgens nog een Serial.parseInt(). Dat gaat niet goed met elkaar.

De Serial.parseInt() leest zelf de bytes en zet dat zelf om naar een getal, en stopt als er een timeout is of als er iets binnenkomt dat niet bij een getal hoort (zoals een LineFeed of CarriageReturn).
De Serial.available() en de Serial.read() zijn bedoeld om ieder byte te lezen. Dan zul je in de sketch die bytes naar een getal moeten omzetten.

Je schrijft dat het werkt bij alleen Bluetooth, dus mogelijk werkt het toevallig goed. De echte fout zie ik niet meteen, dan kan iets anders zijn.

Wat komt er eigenlijk binnen via de seriële poort ? Kun je dat goed beschrijven ? Komt daar altijd een LineFeed achter ?

Gebruikers-avatar
Berichten: 631
Geregistreerd: 15 Nov 2015, 11:54

Re: RFID + bluetooth deurslot

Berichtdoor Gij Kieken » 26 Dec 2016, 16:03

En hoe zit het met de voeding van de schakeling ?

Berichten: 4
Geregistreerd: 25 Dec 2016, 21:10

Re: RFID + bluetooth deurslot

Berichtdoor chimaerion » 26 Dec 2016, 17:44

Ik heb de code wat netter gemaakt:

Code: Alles selecteren

#include <SPI.h>

 

#include <MFRC522.h>
#include <Servo.h>
#define RST_PIN         9           // Configurable, see typical pin layout above
#define SS_PIN          10          // Configurable, see typical pin layout above
 
MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance.
 
String read_rfid;
String ok_rfid_1="909987ab"; //add as many as you need.
String ok_rfid_2="85aaba5";
String ok_rfid_3="13d4b228";
String ok_rfid_4="9ab7b97f";
String ok_rfid_5="33578aa7";

String ok_rfid_6="b2bc71d";

const int servoPin = 3;

int pos = 0;    // variable to store the servo position


Servo myservo;  // create servo object to control a servo

int posClosed = 0;    // variable to store the servo position for locked

int posOpen = 360;    //same for open...


/*
 * Initialize.
 */

void setup()
{

    Serial.begin(9600);         // Initialize serial communications with the PC

    Serial.print("Arduino control Servo Motor Connected OK");
    Serial.print("\n");

    while (!Serial);            // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)

    SPI.begin();                // Init SPI bus

    mfrc522.PCD_Init();         // Init MFRC522 card

    myservo.attach(3);  // attaches the servo on pin 3 to the servo object

}

/*

 * Helper routine to dump a byte array as hex values to Serial.
 */

void dump_byte_array(byte *buffer, byte bufferSize)
{

    read_rfid="";
    for (byte i = 0; i < bufferSize; i++)
    {

        read_rfid=read_rfid + String(buffer[i], HEX);

    }

}

void open_lock()
{

  //Use this routine when working with Servos.

 myservo.write(90);

 delay(2000);

myservo.write(0);

}


void loop()
{

 // if there's any serial available, read it:
  if (Serial.available() > 0)
  {
    // look for the next valid integer in the incoming serial stream:

    pos = Serial.parseInt();
   }

    // look for the newline. That's the end of your  sentence:

    if (Serial.read() == '\n')
    {

       myservo.write(pos);              // tell servo to go to position in variable 'pos'

       delay(15);                       // waits 15ms for the servo to reach the position

     }
     
      // Look for new cards

    if ( ! mfrc522.PICC_IsNewCardPresent())
        return;

    // Select one of the cards

    if ( ! mfrc522.PICC_ReadCardSerial())

        return;

    dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);

    Serial.println(read_rfid);

    if ((read_rfid==ok_rfid_1)||(read_rfid==ok_rfid_2)||(read_rfid==ok_rfid_3)||(read_rfid==ok_rfid_4)||(read_rfid==ok_rfid_5)||(read_rfid==ok_rfid_6)) 
    {

    open_lock();
    }
}



Hmm ik ben meer een hardwareguy en heb enkel slechts basiskennis van programmeren, ik snap de algemene logica erachter, maar wat bepaalde functies zoals die serial.parse doen, begrijp ik niet helemaal.
De de situatie voor de bluetooth zit zo: ik heb een HC-05 bluetooth module aan een arduino nano gehangen.
de Rx van de module is verbonden met de Tx vd arduino nano en Tx van de module met de Rx van de arduino nano. Dus een hardwareserial en geen softwareserial.
Ik gebruik een bluetooth app met een serial monitor (de app noemt bluetooth terminal) en met die app kun je met behulp van een slider of een rotating dial of vaste waarden zoals 0,45,90 en 180 doorgeven.
De Hc-05 module (eenmaal gepaired) leest die waarden en geeft ze door aan de arduino. De arduino op zijn beurt krijgt de waarden van de bluetooth module en hij doet afhankelijk van de waarde
de servomotor naar een bepaalde hoek verdraaien. Bij mij doet de waarde "0" de servomotor helemaal naar links draaien (slot is open) en de waarde "90" doet de servomotor naar het midden draaien (slot is toe).
De code die ik tot nu toe gebruik, werkt perfect en deze heb ik zelf niet geschreven, maar gevonden op het net.
En ik twijfel vast en zeker niet aan uw kennis, het kan goed zijn dat dit niet de juiste manier is. Hoe zou jij dit dan doen hetgene ik hierboven beschreven heb:
een servomotor draaien naar een bepaalde positie afhankelijk van de waarde die de bluetooth module binnen krijgt?

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

Re: RFID + bluetooth deurslot

Berichtdoor nicoverduin » 26 Dec 2016, 18:27

Als je een functie niet begrijpt heb je google?
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 4
Geregistreerd: 25 Dec 2016, 21:10

Re: RFID + bluetooth deurslot

Berichtdoor chimaerion » 26 Dec 2016, 20:14

Gij Kieken schreef:En hoe zit het met de voeding van de schakeling ?

De servomotor wordt apart gevoed met een 5V usb adapter, de arduino ook apart via een usb. De servo shared wel een ground met de arduino.

Berichten: 4
Geregistreerd: 25 Dec 2016, 21:10

Re: RFID + bluetooth deurslot

Berichtdoor chimaerion » 26 Dec 2016, 21:53

Ik heb nu werkend gekregen.

The problem were the lines:
Code: Alles selecteren
// Look for new cards

  if ( ! mfrc522.PICC_IsNewCardPresent())

      return;

  // Select one of the cards

  if ( ! mfrc522.PICC_ReadCardSerial())

      return;

Het is niet logisch om te kijken als er GEEN kaart aanwezig is en de info te dumpen als er GEEN readcardserial is. De returns zorgden ervoor dat de functie eindigde
en de bluetooth communicatie geen kans kreeg.
Ik heb het veranderd naar als er WEL een kaart aanwezig, dump de info en open het slot. ANDERS als er GEEN kaart aanwezig is, luister naar de bluetooth communicatie.

Code: Alles selecteren
#include <SPI.h>

#include <MFRC522.h>
#include <Servo.h>
#define RST_PIN         9           // Configurable, see typical pin layout above
#define SS_PIN          10          // Configurable, see typical pin layout above

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

String read_rfid;
String ok_rfid_1="909987ab"; //add as many as you need.
String ok_rfid_2="85aaba5";
String ok_rfid_3="13d4b228";
String ok_rfid_4="9ab7b97f";
String ok_rfid_5="33578aa7";
String ok_rfid_6="b2bc71d";

const int servoPin = 3;
int pos = 0;    // variable to store the servo position

Servo myservo;  // create servo object to control a servo
int posClosed = 0;    // variable to store the servo position for locked
int posOpen = 360;    //same for open...


/*
 * Initialize.
 */
void setup()
{
    Serial.begin(9600);         // Initialize serial communications with the PC
    Serial.print("Arduino control Servo Motor Connected OK");
     Serial.print("\n");
 
    while (!Serial);            // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
    SPI.begin();                // Init SPI bus
    mfrc522.PCD_Init();         // Init MFRC522 card

    myservo.attach(3);  // attaches the servo on pin 3 to the servo object
}

/*
 * Helper routine to dump a byte array as hex values to Serial.
 */
void dump_byte_array(byte *buffer, byte bufferSize)
{
    read_rfid="";
    for (byte i = 0; i < bufferSize; i++)
    {
        read_rfid=read_rfid + String(buffer[i], HEX);
    }
}

void open_lock()
{
 
  //Use this routine when working with Servos.
  myservo.write(0);
  delay(2000);
}

void loop()
{

 
      // Look for new cards
    if (mfrc522.PICC_IsNewCardPresent())
    {
       

    // Select one of the cards
    if (mfrc522.PICC_ReadCardSerial())
     {   

    dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
    Serial.println(read_rfid);
   
    }
    if ((read_rfid==ok_rfid_1)||(read_rfid==ok_rfid_2)||(read_rfid==ok_rfid_3)||(read_rfid==ok_rfid_4)||(read_rfid==ok_rfid_5)||(read_rfid==ok_rfid_6)) 
    {
    open_lock();
    }
    }
      else
    {
      if (!mfrc522.PICC_IsNewCardPresent())
      // if there's any serial available, read it:
      if (Serial.available() > 0)
      {
   
        // look for the next valid integer in the incoming serial stream:
   
        pos = Serial.parseInt();
       }
   
          // look for the newline. That's the end of your  sentence:
         if (Serial.read() == '\n')
        {
               
           myservo.write(pos);              // tell servo to go to position in variable 'pos'
           delay(15);                       // waits 15ms for the servo to reach the position
        }
    }

   
}

Met dit stukje code werken zowel bluetooth als rfid tegelijk en ik kan de servomotor roteren.

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 15 gasten