RFID-RC522 + Сервопривод+DFPlayer = контроль прохода с приветствием

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем Храпундель, 6 май 2018.

  1. Здравствуйте форумчане великого и полезного сайта Амперка!
    Помогите, пожалуйста в решении проблемы.
    В наличие:
    - Arduino Uno
    - Servo Tower Pro SG5010
    - RFID-RC522
    - DFPLayer
    - Корявый скетч
    Задача:
    Хочу сделать Контроль доступа по картам с воспроизведением приветственной речи.
    Сам в программировании не понимаю.
    Во вложении схема. Помогите дописать скетч.
    На просторах интернета нашел такой скетч. А как вставить в него плеер не знаю. После долгих попыток сделать что-то самому ничего не получилось. помогите пожалуйста.
    RFID+ cervo.jpg

    Код (C++):
    //RFID
    #include <SPI.h>
    #include <MFRC522.h>
    #include <Servo.h>
    #define SS_PIN 10
    #define RST_PIN 9
    #define LED_G 4 //define green LED pin
    #define LED_R 5 //define red LED
    #define BUZZER 2 //buzzer pin
    MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance.
    Servo myServo; //define servo name
    void setup()
    {
      Serial.begin(9600);   // Initiate a serial communication
      SPI.begin();      // Initiate  SPI bus
      mfrc522.PCD_Init();   // Initiate MFRC522
      myServo.attach(3); //servo pin
      myServo.write(0); //servo start position
      pinMode(LED_G, OUTPUT);
      pinMode(LED_R, OUTPUT);
      pinMode(BUZZER, OUTPUT);
      noTone(BUZZER);
      Serial.println("Put your card to the reader...");
      Serial.println();

    }
    void loop()
    {
      // Look for new cards
      if ( ! mfrc522.PICC_IsNewCardPresent())
      {
        return;
      }
      // Select one of the cards
      if ( ! mfrc522.PICC_ReadCardSerial())
      {
        return;
      }
      //Show UID on serial monitor
      Serial.print("UID tag :");
      String content= "";
      byte letter;
      for (byte i = 0; i < mfrc522.uid.size; i++)
      {
         Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
         Serial.print(mfrc522.uid.uidByte[i], HEX);
         content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
         content.concat(String(mfrc522.uid.uidByte[i], HEX));
      }
      Serial.println();
      Serial.print("Message : ");
      content.toUpperCase();
      if (content.substring(1) == "50 A2 68 A4") //change here the UID of the card/cards that you want to give access
      {
        Serial.println("Authorized access");
        Serial.println();
        delay(500);
        digitalWrite(LED_G, HIGH);
        tone(BUZZER, 500);
        delay(300);
        noTone(BUZZER);
        myServo.write(5);
        delay(5000);
        myServo.write(95);
        digitalWrite(LED_G, LOW);
      }
    else   {
        Serial.println(" Access denied");
        digitalWrite(LED_R, HIGH);
        tone(BUZZER, 300);
        delay(1000);
        digitalWrite(LED_R, LOW);
        noTone(BUZZER);
      }
    }
     
  2. Airbus

    Airbus Радиохулиган Модератор

    В чем заключались Ваши попытки?Что должен делать скетч если карта та?Если не та?Сразу скажу не совсем удачный скетч скопипастили.
     
  3. Пример: Иван Иванович с номером карты 11111. прикладывает карту и голосовое приветствие "Здравствуйте, Иван Иванович! Проходите" если карта не та, то " Вы не можете пройти" или что-то в этом роде.
    Мои попытки были "впилить" в этот скетч плеер.
    библиотека <DFPlayer_Mini_Mp3.h>
     
  4. ostrov

    ostrov Гуру

    Уже обсуждалось, что эта библиотека кривая как турецкая сабля. Кстати, ТХ этому плееру не нужен, ничего он не сообщает. Тем более через резистор. А вот светодиодам резисторы бы не помешали. А серве конденсатор.
     
  5. Airbus

    Airbus Радиохулиган Модератор

    Да и скетч-говнокод.Могу дать свой-вполне рабочий только Вам надо будет его немного допилить под Ваши цели.Справитесь?
     
  6. Боюсь что ума не хватит. в программировании полный "ноль". Я с Arduino работаю копируя проекты, а тут решил своё сделать-что-то и сел не вставая(((
    Я понимаю работа займет время Ваше, но в пределах разумного можем договориться)))
     
  7. b707

    b707 Гуру

    А научится - никак?
     
    Храпундель и Airbus нравится это.
  8. Airbus

    Airbus Радиохулиган Модератор

    Вот код.Рабочий.Вам только надо подправить действия в функциях allow() и void denied().Я не знаю как управляется Ваш плеер и как работает Серва я с ними дело не имею поэтому Вам лучше заглянуть в ВИКИ.
    Код (C++):
    /*Распиновка
    * MOSI: Pin 11 / ICSP-4
    * MISO: Pin 12 / ICSP-1
    * SCK: Pin 13 / ISCP-3
    * SS: Pin 10
    * RST: Pin 9
    */

    #include <SPI.h>
    #include <RFID.h>
    #include <Servo.h>
    #define SS_PIN 10
    #define RST_PIN 9
    #define player 12 //на плеер
    #define LED_G 4 //зелёный LED да!
    #define LED_R 5 //красный LED ноу!
    RFID rfid(SS_PIN, RST_PIN);
    Servo myServo; //define servo name
    unsigned char reading_card[5]; //5 блоков ID для чтения
    unsigned char master[5] = {160,112,85,128,5}; // карта открывашка с ID
    unsigned char i;
    void allow();
    void denied();

    void setup()
    {
      Serial.begin(9600);
      SPI.begin();
      rfid.init();
      myServo.attach(3); //лепим Серву на пин 3
      myServo.write(0); //серву в Старт позишн
      pinMode(player, OUTPUT);//пин 12 выход на плеер
      pinMode(LED_G, OUTPUT); //пин 4 выход да
      pinMode(LED_R, OUTPUT); //пин 5 выход нет
      digitalWrite(player, HIGH); //выкл
      digitalWrite(LED_G, HIGH);  //выкл
      digitalWrite(LED_R, HIGH);  //выкл

    }

    void loop()
    {
       if (rfid.isCard())
       {
        if (rfid.readCardSerial())
         {
            //читаем карту номер выводим в порт.
            Serial.println(" ");
            Serial.println("Card found");//карта найдена
            Serial.println("Cardnumber:");//номер карты
            for (i = 0; i < 5; i++)
            {
               Serial.print(rfid.serNum[i]);
               Serial.print(" ");
               reading_card[i] = rfid.serNum[i];
            }
            Serial.println();
            //сравниваем та ли карта?
            for (i = 0; i < 5; i++)
            {
               if (reading_card[i]!=master[i])
               {
                  break;
               }
            }
            if (i == 5)
            {
               allow();
             }
            else
            {
               denied();
            }
         }
      }
       rfid.halt();

    }
    //если та что то делаем
    void allow()
    {
      Serial.println("Access accept!"); //доступ получен
      //здесь можно написать кучу кода в зависимости от цели
      digitalWrite(LED_G, HIGH);   //мигнём зелёным
      delay(1000);            
      digitalWrite(LED_G, LOW);
      digitalWrite(player, HIGH);   //дёргаем плеер
      delay(500);
      digitalWrite(player, LOW);
      myServo.write(5); //и крутим серву
      delay(5000);
      myServo.write(95);
    }
    //если не та всё равно что то делаем
    void denied()
    {
      Serial.println("Access denied!"); //доступ закрыт
      //здесь можно написать кучу кода в зависимости от цели
      digitalWrite(LED_R, HIGH);   //мигнём красным
      delay(1000);            
      digitalWrite(LED_R, LOW);
    }
    А ещё лучше конечно
    И будет Вам Щастье!
     
    Храпундель нравится это.
  9. Спасибо большое! Последую совету и буду учиться) Идей много и хочется их реализовать) Спасибо еще раз! Буду пробовать