1. В сообществе нашего форума Вконтакте создан раздел по продаже электронных компонентов.
    Каждый может продать в нем свои залежавшиеся детали. Подробности здесь.

Решено Автоматические ворота на RFID метке

Тема в разделе "Arduino", создана пользователем лёха, 1 июн 2015.

  1. лёха

    лёха Частый гость

    Сообщения:
    67
    Симпатии:
    10
    Доброго времени суток! У меня есть код для дуни уно есть оборудование дуня, RC522 RFID, серво SG90, 2 реле с опторазвязкой и 2 кнопки. мне необходима система на гаражные ворота. принцип работы такой; я провожу ключом по считывателю серво открывает замок и включается первое реле запуская эл. двигатель который открывает ворота до той поры пока не будет нажата первая кнопка затем идёт настраиваемая пауза и запускается второе реле которое работает пока не будет нажата 2 кнопка. Вопрос что не так с этим кодом?
    PHP:
    #include <Servo.h>
    Servo dimkaservo;

    #include <SPI.h>
    #include <MFRC522.h> // это скачанная библиотека "RFID".

    /*
    подключение для Arduino Uno и Mega, производится к разным Pin!
    ----------------------------------------------------- Nicola Coppola
    * Pin layout should be as follows:
    * Signal     Pin              Pin               Pin
    *            Arduino Uno      Arduino Mega      MFRC522 board
    * ------------------------------------------------------------
    * Reset      9                5                 RST
    * SPI SS     10               53                SDA
    * SPI MOSI   11               51                MOSI
    * SPI MISO   12               50                MISO
    * SPI SCK    13               52                SCK

    */

    // два Pin (SS и RST) допускают произвольное подключение и конфигурируются в коде.
    // !(SS - он же - SDA).
    #define SS_PIN 10
    #define RST_PIN 9
    MFRC522 mfrc522(SS_PINRST_PIN);  // объект MFRC522C / reate MFRC522 instance.
    unsigned long uidDecuidDecTemp;  // для отображения номера карточки в десятичном формате


    //*************************************************************
    // Массив 2 Светодиодов, для визуального контроля.
    //*************************************************************
    byte ledPins[] = {6,8,};
    byte LedPinSindex// индекс, для массива Светодиодов.
    byte Relay1Pin 4;   //Изменить на свои пины реле
    byte Relay2Pin 5;
    byte but1Pin 3;     // Изменить на свои пины кнопок(подключить между пином и GND)
    byte but2Pin 2
    int pause 1000;    // Изменить на время задержки в мс
    void setup() {

      
    Serial.begin(9600);     // Initialize serial communications with the PC.
      
    Serial.println("Prilozhite kartu / Waiting for card...");
    pinMode(Relay1Pin,OUTPUT);
    pinMode(Relay2Pin,OUTPUT);
    pinMode(but1Pin,INPUT_PULLUP);
    pinMode(but2Pin,INPUT_PULLUP);
      
    SPI.begin();  //  инициализация SPI / Init SPI bus.
      
    mfrc522.PCD_Init();     // инициализация MFRC522 / Init MFRC522 card.

      
    dimkaservo.attach(7); // servo подключён к 7 Pin.
      
    dimkaservo.write(10); // устанавливаем положение servo, в момент подачи питания.

      // весь массив светодиодов делаем OUTPUT.
      
    for(LedPinSindex 0LedPinSindex <= 3LedPinSindex++)
      {
        
    pinMode(ledPins[LedPinSindex],OUTPUT);
      }
    }


    void loop() {
      
    // Поиск новой карточки / Look for new cards.
      
    if ( ! mfrc522.PICC_IsNewCardPresent()) {
        return;
      }

      
    // Выбор карточки / Select one of the cards.
      
    if ( ! mfrc522.PICC_ReadCardSerial()) {
        return;
      }

      
    uidDec 0;

      
    // Выдача серийного номера карточки "UID".
      
    for (byte i 0mfrc522.uid.sizei++)
      {
        
    uidDecTemp mfrc522.uid.uidByte;
        
    uidDec uidDec*256+uidDecTemp;
      }
      
    Serial.println("Serijnyj nomer karty / Card UID: ");
      
    Serial.println(uidDec);

      
    // ------------------------

      // начинаем сравнивать номер "UID", поднесённой к ридеру карты,
      // с записанным номером "UID" карты в sketch.

      // замените!!! "UID" № "422455350", на номер "UID" № вашей карты.
      
    if (uidDec == 422455350// если "UID" номер совпал.
      
    {
        
    // включим светодиод.
        
    digitalWrite(ledPins[0], HIGH);

        
    // Печатаем в Serial монитор .
        
    Serial.println("Hi Dmitry");
        
    digitalWrite(Relay1Pin,HIGH);
       while(
    digitalRead(but1Pin)){Serial.println("........forward pressing button 1");}
        
    delay(pause);
        
    digitalWrite(Relay1Pin,LOW);
        
    digitalWrite(Relay2Pin,HIGH);
        while(
    digitalRead(but2Pin)){Serial.println("........forward pressing button 2");}
        
    digitalWrite(Relay2Pin,LOW);
        
    // поворачиваем servo на 170 градусов.
        
    dimkaservo.write(170);
      
    delay(10000); // пауза 10 секунды.
      
    dimkaservo.write(10); // возвращаем servo обратно.
      // и выключим все светодиоды.
      
    for(LedPinSindex 0LedPinSindex <= 3LedPinSindex++)digitalWrite(ledPins[LedPinSindex],LOW);
      }
      else  
    // если "UID" номер карты не совпал.
      
    {
        
    // включим все светодиоды.
        
    for(LedPinSindex 0LedPinSindex <= 3LedPinSindex++)digitalWrite(ledPins[LedPinSindex],HIGH);
        
    Serial.println("Neizvestnaja karta / unknown card");
      }
    почему когда я его загружаю провожу ключом у меня срабатывает только одна реле нет не какой реакции на кнопки и отключаться по истечению 1000 мс.??
    Последнее редактирование: 4 июн 2015
     
    : include, define
  2. Alex

    Alex В доску свой

    Сообщения:
    191
    Симпатии:
    13
    кнопки то как подключены? По Вашей логике кнопка должна быть включена между "ногой" и "землей" и с нормально замкнутыми контактами.
  3. radioengineer

    radioengineer Администратор Команда форума

    Сообщения:
    3.582
    Симпатии:
    355
    Адрес:
    Алматы
    @Alex правильно говорит, входа кнопок настроены как входа с подтяжкой к питанию, если у вас кнопки замыкают на землю, то соответственно они работают неправильно, т.к. while(digitalRead(but1Pin)) цикл сразу же завершается без нажатия, вот и получается сквозной loop() без какой-либо реакции. Если же у вас кнопки замыкают на питание, то просто инициализируйте входа по другому:
    PHP:
    pinMode(but1Pin,INPUT);
    digitalWrite(but1PinLOW);
  4. Alex

    Alex В доску свой

    Сообщения:
    191
    Симпатии:
    13
    Схему бы глянуть, и лог с терминала. Может там вообще проблема в другом. Виснет или перегружается контроллер после того как мотор включается.
  5. лёха

    лёха Частый гость

    Сообщения:
    67
    Симпатии:
    10
    Спасибо что отозвались! я сейчас на работе после шести сфотографирую как что подключёно и выложу. ещё раз спасибо))
  6. лёха

    лёха Частый гость

    Сообщения:
    67
    Симпатии:
    10
  7. лёха

    лёха Частый гость

    Сообщения:
    67
    Симпатии:
    10
    добрый день! итак что у нас получилось.
    Код:
    #include <Servo.h>
    Servo dimkaservo;
    
    #include <SPI.h>
    #include <MFRC522.h> // это скачанная библиотека "RFID".
    
    /*
    подключение для Arduino Uno и Mega, производится к разным Pin!
    ----------------------------------------------------- Nicola Coppola
    * Pin layout should be as follows:
    * Signal     Pin              Pin               Pin
    *            Arduino Uno      Arduino Mega      MFRC522 board
    * ------------------------------------------------------------
    * Reset      9                5                 RST
    * SPI SS     10               53                SDA
    * SPI MOSI   11               51                MOSI
    * SPI MISO   12               50                MISO
    * SPI SCK    13               52                SCK
    */
    
    // два Pin (SS и RST) допускают произвольное подключение и конфигурируются в коде.
    // !(SS - он же - SDA).
    #define SS_PIN 10
    #define RST_PIN 9
    MFRC522 mfrc522(SS_PIN, RST_PIN);  // объект MFRC522C / reate MFRC522 instance.
    unsigned long uidDec, uidDecTemp;  // для отображения номера карточки в десятичном формате
    
    
    //*************************************************************
    // Массив 4 Светодиодов, для визуального контроля.
    //*************************************************************
    int ledPins[] = {
      6,8,};
    int LedPinSindex; // индекс, для массива Светодиодов.
    int Relay1Pin = 4;   //Изменить на свои пины реле
    int Relay2Pin = 5;
    int but1Pin = 3;     // Изменить на свои пины кнопок(подключить между пином и GND)
    int but2Pin = 2;    
    int pause = 1000;    // Изменить на время задержки в мс
    void setup() {
    
      Serial.begin(9600);     // Initialize serial communications with the PC.
      Serial.println("Prilozhite kartu / Waiting for card...");
    pinMode(Relay1Pin,INPUT);
    pinMode(Relay2Pin,INPUT);
    pinMode(but1Pin,INPUT_PULLUP);
    pinMode(but2Pin,INPUT_PULLUP);
      SPI.begin();  //  инициализация SPI / Init SPI bus.
      mfrc522.PCD_Init();     // инициализация MFRC522 / Init MFRC522 card.
    
      dimkaservo.attach(7); // servo подключён к 7 Pin.
      dimkaservo.write(10); // устанавливаем положение servo, в момент подачи питания.
    
      // весь массив светодиодов делаем OUTPUT.
      for(LedPinSindex = 0; LedPinSindex <= 3; LedPinSindex++)
      {
        pinMode(ledPins[LedPinSindex],OUTPUT);
      }
    }
    
    
    void loop() {
      // Поиск новой карточки / Look for new cards.
      if ( ! mfrc522.PICC_IsNewCardPresent()) {
        return;
      }
    
      // Выбор карточки / Select one of the cards.
      if ( ! mfrc522.PICC_ReadCardSerial()) {
        return;
      }
    
      uidDec = 0;
    
      // Выдача серийного номера карточки "UID".
      for (byte i = 0; i < mfrc522.uid.size; i++)
      {
        uidDecTemp = mfrc522.uid.uidByte[i];
        uidDec = uidDec*256+uidDecTemp; 
      } 
      Serial.println("Serijnyj nomer karty / Card UID: ");
      Serial.println(uidDec);
    
      // ------------------------
    
      // начинаем сравнивать номер "UID", поднесённой к ридеру карты,
      // с записанным номером "UID" карты в sketch.
    
      // замените!!! "UID" № "422455350", на номер "UID" № вашей карты.
      if (uidDec == 619903086) // если "UID" номер совпал.
      {
        // включим светодиод.
        digitalWrite(ledPins[0], HIGH);
    
        // Печатаем в Serial монитор . 
        Serial.println("Hi Dmitry");
        digitalWrite(Relay1Pin,HIGH);
       while(digitalRead(but1Pin)){}
        delay(pause);
        digitalWrite(but1Pin, LOW);
        digitalWrite(Relay2Pin,HIGH);
        while(digitalRead(but2Pin)){}
        digitalWrite(Relay2Pin,LOW);
        // поворачиваем servo на 170 градусов.
        dimkaservo.write(170); 
      }
    
    
      // также и с другими номерами карт.
      else if (uidDec == 959884118)
      {
        digitalWrite(ledPins[1], HIGH);
        Serial.println("Hi Sergey");
            digitalWrite(Relay1Pin,HIGH);
       while(digitalRead(but1Pin)){}
        delay(pause);
        digitalWrite(Relay1Pin,LOW);
        digitalWrite(Relay2Pin,HIGH);
        while(digitalRead(but2Pin)){}
        digitalWrite(Relay2Pin,LOW);
        dimkaservo.write(170);  
      }
    
    
      else if (uidDec == 695670870)
      {
        digitalWrite(ledPins[2], HIGH);
        Serial.println("Hi Peter");
            digitalWrite(Relay1Pin,HIGH);
       while(digitalRead(but1Pin)){}
        delay(pause);
        digitalWrite(Relay1Pin,LOW);
        digitalWrite(Relay2Pin,HIGH);
        while(digitalRead(but2Pin)){}
        digitalWrite(Relay2Pin,LOW);
        dimkaservo.write(170);  
      }
    
    
      else if (uidDec == 695670614)
      {
        digitalWrite(ledPins[3], HIGH);
        Serial.println("Hi Vasily");
            digitalWrite(Relay1Pin,HIGH);
       while(digitalRead(but1Pin)){}
        delay(pause);
        digitalWrite(Relay1Pin,LOW);
        digitalWrite(Relay2Pin,HIGH);
        while(digitalRead(but2Pin)){}
        digitalWrite(Relay2Pin,LOW);
        dimkaservo.write(170);  
      }
    
    
      else  // если "UID" номер карты не совпал.
      {
        // включим все светодиоды.
        for(LedPinSindex = 0; LedPinSindex <= 3; LedPinSindex++)digitalWrite(ledPins[LedPinSindex],HIGH);
        Serial.println("Neizvestnaja karta / unknown card"); 
      }
    
      Serial.println("=====================================");
    
      delay(10000); // пауза 10 секунды.
      dimkaservo.write(10); // возвращаем servo обратно.
      // и выключим все светодиоды.
      for(LedPinSindex = 0; LedPinSindex <= 3; LedPinSindex++)digitalWrite(ledPins[LedPinSindex],LOW); 
    }
    система работает не правильно при подаче питания дуня грузиться и щёлкает релюшками (тем самым на будущем электродвигателе получиться замыкание) далее после загрузки она включает обе реле (тем самым на будущем электродвигателе получиться замыкание) при использовании ключа в мониторе порта выводиться приветствие отключается одно реле поворачивается серво и через заданное время возвращается обратно и реле снова включается на кнопки не какой реакции(кнопки подключёны пин 3,2,+5в и через сопротивление на землю.
  8. radioengineer

    radioengineer Администратор Команда форума

    Сообщения:
    3.582
    Симпатии:
    355
    Адрес:
    Алматы
    Можно все-таки схемку, чтобы не насоветовать сейчас чего-нибудь неправильного?
  9. лёха

    лёха Частый гость

    Сообщения:
    67
    Симпатии:
    10
    я даже не представляю как её начать рисовать)))) может видио снять и на ютюб залить?
  10. лёха

    лёха Частый гость

    Сообщения:
    67
    Симпатии:
    10
    ну както так

    IMG_20150603_161245.jpg
    Последнее редактирование модератором: 3 июн 2015
  11. radioengineer

    radioengineer Администратор Команда форума

    Сообщения:
    3.582
    Симпатии:
    355
    Адрес:
    Алматы
    Можно попробовать во fritzing накидать схемку, там все просто и легко, или вот тут.
  12. radioengineer

    radioengineer Администратор Команда форума

    Сообщения:
    3.582
    Симпатии:
    355
    Адрес:
    Алматы
    Начнем с setup:
    Код:
    pinMode(but1Pin,INPUT);
    pinMode(but2Pin,INPUT);
    
    Вот такая должна быть инициализация кнопок.
    Попробуем проанализировать, что происходит здесь, буду писать комментарии по ходу
    PHP:
    if (uidDec == 619903086// если "UID" номер совпал.
      
    {
        
    // включим светодиод.
        
    digitalWrite(ledPins[0], HIGH);

        
    // Печатаем в Serial монитор .
        
    Serial.println("Hi Dmitry"); // Здесь все ясно
        
    digitalWrite(Relay1Pin,HIGH);   // Включается первое реле
       
    while(digitalRead(but1Pin)){}   // Пока кнопка нажата ничего не происходит, соответственно, если она отжата, то цикл игнорируется
        
    delay(pause);  // задержка на pause
        
    digitalWrite(but1PinLOW);   // Кнопке присваивается низкий уровень. Зачем? Так не делается. Уже стоят резисторы на землю, если кнопка отжата
        
    digitalWrite(Relay2Pin,HIGH);    // включается второе реле
        
    while(digitalRead(but2Pin)){}   // та же ситуация только со второй кнопкой
        
    digitalWrite(Relay2Pin,LOW);   // выключается второе реле
        // поворачиваем servo на 170 градусов.
        
    dimkaservo.write(170);  // понятно
      
    }
    Думаю, что-то должно проясниться;)
  13. лёха

    лёха Частый гость

    Сообщения:
    67
    Симпатии:
    10
    система всё равно не реагирует на кнопки она на автомате закрывается где то в коде ошибка и как я уже говорил реле постоянно включены а это означает замыкание. я уже в отчаянии.
  14. radioengineer

    radioengineer Администратор Команда форума

    Сообщения:
    3.582
    Симпатии:
    355
    Адрес:
    Алматы
    Код:
    while(!digitalRead(but1Pin))
    попробуй так, должно сработать нормально. Если так не пойдет, то вот так:
    Код:
    while(digitalRead(but1Pin) == 0) { }
  15. лёха

    лёха Частый гость

    Сообщения:
    67
    Симпатии:
    10
    единственное отличие что серва стала срабатывать на пару секунд позже
  16. лёха

    лёха Частый гость

    Сообщения:
    67
    Симпатии:
    10
    ладно мужики не заморачивайтесь. открывал всю жизнь в ручную и дальше буду открывать. Всем спасибо за помощь!
  17. radioengineer

    radioengineer Администратор Команда форума

    Сообщения:
    3.582
    Симпатии:
    355
    Адрес:
    Алматы
    Ну нет, так нельзя оставлять, прикрепи скетч, я попробую отладить. Желательно еще название библиотек, которые использовал.
  18. лёха

    лёха Частый гость

    Сообщения:
    67
    Симпатии:
    10
    #include <Servo.h>
    Servo dimkaservo;

    #include <SPI.h>
    #include <MFRC522.h> // это скачанная библиотека "RFID".

    /*
    подключение для Arduino Uno и Mega, производится к разным Pin!
    ----------------------------------------------------- Nicola Coppola
    * Pin layout should be as follows:
    * Signal Pin Pin Pin
    * Arduino Uno Arduino Mega MFRC522 board
    * ------------------------------------------------------------
    * Reset 9 5 RST
    * SPI SS 10 53 SDA
    * SPI MOSI 11 51 MOSI
    * SPI MISO 12 50 MISO
    * SPI SCK 13 52 SCK

    */

    // два Pin (SS и RST) допускают произвольное подключение и конфигурируются в коде.
    // !(SS - он же - SDA).
    #define SS_PIN 10
    #define RST_PIN 9
    MFRC522 mfrc522(SS_PIN, RST_PIN); // объект MFRC522C / reate MFRC522 instance.
    unsigned long uidDec, uidDecTemp; // для отображения номера карточки в десятичном формате


    //*************************************************************
    // Массив 4 Светодиодов, для визуального контроля.
    //*************************************************************
    int ledPins[] = {
    6,8,};
    int LedPinSindex; // индекс, для массива Светодиодов.
    int Relay1Pin = 4; //Изменить на свои пины реле
    int Relay2Pin = 5;
    int but1Pin = 3; // Изменить на свои пины кнопок(подключить между пином и GND)
    int but2Pin = 2;
    int pause = 1000; // Изменить на время задержки в мс
    void setup() {

    Serial.begin(9600); // Initialize serial communications with the PC.
    Serial.println("Prilozhite kartu / Waiting for card...");
    pinMode(Relay1Pin,INPUT);
    pinMode(Relay2Pin,INPUT);
    pinMode(but1Pin,INPUT);
    pinMode(but2Pin,INPUT);
    SPI.begin(); // инициализация SPI / Init SPI bus.
    mfrc522.PCD_Init(); // инициализация MFRC522 / Init MFRC522 card.

    dimkaservo.attach(7); // servo подключён к 7 Pin.
    dimkaservo.write(10); // устанавливаем положение servo, в момент подачи питания.

    // весь массив светодиодов делаем OUTPUT.
    for(LedPinSindex = 0; LedPinSindex <= 3; LedPinSindex++)
    {
    pinMode(ledPins[LedPinSindex],OUTPUT);
    }
    }


    void loop() {
    // Поиск новой карточки / Look for new cards.
    if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
    }

    // Выбор карточки / Select one of the cards.
    if ( ! mfrc522.PICC_ReadCardSerial()) {
    return;
    }

    uidDec = 0;

    // Выдача серийного номера карточки "UID".
    for (byte i = 0; i < mfrc522.uid.size; i++)
    {
    uidDecTemp = mfrc522.uid.uidByte;
    uidDec = uidDec*256+uidDecTemp;
    }
    Serial.println("Serijnyj nomer karty / Card UID: ");
    Serial.println(uidDec);

    // ------------------------

    // начинаем сравнивать номер "UID", поднесённой к ридеру карты,
    // с записанным номером "UID" карты в sketch.

    // замените!!! "UID" № "422455350", на номер "UID" № вашей карты.
    if (uidDec == 619903086) // если "UID" номер совпал.
    {
    // включим светодиод.
    digitalWrite(ledPins[0], HIGH);

    // Печатаем в Serial монитор .
    Serial.println("Hi Dmitry"); // Здесь все ясно
    digitalWrite(Relay1Pin,HIGH); // Включается первое реле
    while(digitalRead(but1Pin) == 0) { } // Пока кнопка нажата ничего не происходит, соответственно, если она отжата, то цикл игнорируется
    delay(pause); // задержка на pause
    digitalWrite(but1Pin, LOW); // Кнопке присваивается низкий уровень. Зачем? Так не делается. Уже стоят резисторы на землю, если кнопка отжата
    digitalWrite(Relay2Pin,HIGH); // включается второе реле
    while(digitalRead(but2Pin)){} // та же ситуация только со второй кнопкой
    digitalWrite(Relay2Pin,LOW); // выключается второе реле
    // поворачиваем servo на 170 градусов.
    dimkaservo.write(170); // понятно
    }


    // также и с другими номерами карт.
    else if (uidDec == 959884118)
    {
    digitalWrite(ledPins[1], HIGH);
    Serial.println("Hi Sergey");
    digitalWrite(Relay1Pin,HIGH);
    while(digitalRead(but1Pin)){}
    delay(pause);
    digitalWrite(Relay1Pin,LOW);
    digitalWrite(Relay2Pin,HIGH);
    while(digitalRead(but2Pin)){}
    digitalWrite(Relay2Pin,LOW);
    dimkaservo.write(170);
    }


    else if (uidDec == 695670870)
    {
    digitalWrite(ledPins[2], HIGH);
    Serial.println("Hi Peter");
    digitalWrite(Relay1Pin,HIGH);
    while(digitalRead(but1Pin)){}
    delay(pause);
    digitalWrite(Relay1Pin,LOW);
    digitalWrite(Relay2Pin,HIGH);
    while(digitalRead(but2Pin)){}
    digitalWrite(Relay2Pin,LOW);
    dimkaservo.write(170);
    }


    else if (uidDec == 695670614)
    {
    digitalWrite(ledPins[3], HIGH);
    Serial.println("Hi Vasily");
    digitalWrite(Relay1Pin,HIGH);
    while(digitalRead(but1Pin)){}
    delay(pause);
    digitalWrite(Relay1Pin,LOW);
    digitalWrite(Relay2Pin,HIGH);
    while(digitalRead(but2Pin)){}
    digitalWrite(Relay2Pin,LOW);
    dimkaservo.write(170);
    }


    else // если "UID" номер карты не совпал.
    {
    // включим все светодиоды.
    for(LedPinSindex = 0; LedPinSindex <= 3; LedPinSindex++)digitalWrite(ledPins[LedPinSindex],HIGH);
    Serial.println("Neizvestnaja karta / unknown card");
    }

    Serial.println("=====================================");

    delay(10000); // пауза 10 секунды.
    dimkaservo.write(10); // возвращаем servo обратно.
    // и выключим все светодиоды.
    for(LedPinSindex = 0; LedPinSindex <= 3; LedPinSindex++)digitalWrite(ledPins[LedPinSindex],LOW);
    }

    здесь библиотеки https://yadi.sk/d/nx7ZJKSOh4D7m
  19. radioengineer

    radioengineer Администратор Команда форума

    Сообщения:
    3.582
    Симпатии:
    355
    Адрес:
    Алматы
    Ок, после работы посижу поотлаживаю.
  20. лёха

    лёха Частый гость

    Сообщения:
    67
    Симпатии:
    10
    Спасибо.

Поделиться этой страницей