Хочу управлять сервоприводом с помощью кнопки

Тема в разделе "Arduino & Shields", создана пользователем abubakar, 22 авг 2017.

  1. abubakar

    abubakar Нерд

    Код (C++):
    // mcureen 4
    /* 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 RED_LED 4
    #define GREEN_LED 5
    Servo servo;
    размыкается.



    RFID rfid(SS_PIN, RST_PIN);

    const unsigned char master[][5]={
      {227,197,145,117,194},
      { 90, 63, 99, 3, 5},
      {90,132,142,3,83},
      {250,229,196,3,216},
      {10,101,141,4,230},
      {250,191,109,3,43},
      {10,88,184,4,238},
      {250,243,195,3,201},
      {74,151,2,4,219},
      {5,219,213,209,218,} // тут вы что то накосячили, я убрал число 10 и остаток кодов. проверьте список
    };// allowed card

    const int master_size = sizeof(master)/sizeof(master[0]);

    bool compare_nums(
      const unsigned char a[5],
      const unsigned char b[5]
    ) {
        for(char i = 5; 0 <= --i; )
        {
          if( a[i] != b[i] ) return false;
        }
        return true;
    }

    bool check_num(
      const unsigned char a[5]
    ){
      for( int i = master_size; 0 <= --i; ){
        if(compare_nums(a, master[i])) return true;
      }
      return false;
    }

    void indication(int led);
    void allow();
    void denied();

    void setup()
    {
      Serial.begin(9600);

      SPI.begin();
      rfid.init();
      pinMode(RED_LED, OUTPUT);
      pinMode(GREEN_LED, OUTPUT);
      servo.attach(6);
      servo.write(0);


    }


    void loop() {




        if (rfid.isCard())
        {
            digitalWrite(GREEN_LED, LOW);
            if (rfid.readCardSerial())
            {
                    /* Reading card */
                    Serial.println(" ");
                    Serial.println("Card found");
                    Serial.println("Cardnumber:");
                    for (char i = 0; i < 5; i++)
                    {
                      Serial.print(rfid.serNum[i]);
                      Serial.print(" ");
                    }
                    Serial.println();
                    //verification
                    if(check_num(rfid.serNum))
                    {
                      allow();
                    }
                    else
                    {
                      denied();
                    }
             }
        }
        else
        {
          digitalWrite(GREEN_LED, HIGH);


        }
    }

    void allow()
    {

       Serial.println("Access accept!"); //доступ получен
       servo.write(90);
       digitalWrite(GREEN_LED, HIGH);
       delay(200);
       digitalWrite(GREEN_LED, LOW);
       tone(8, 2500, 200);
       delay(200);
       digitalWrite(GREEN_LED, HIGH);
       delay(200);
       digitalWrite(GREEN_LED, LOW);
       tone(8, 2500, 200);
       delay(200);
       digitalWrite(GREEN_LED, HIGH);
       delay(200);
       digitalWrite(GREEN_LED, LOW);
       tone(8, 2500, 200);
       delay(200);
       digitalWrite(GREEN_LED, HIGH);
       delay(200);
       digitalWrite(GREEN_LED, LOW);
       tone(8, 2500, 200);
       delay(5000);
       servo.write(0);
       digitalWrite(RED_LED, HIGH);
       tone(8, 550, 450);
       delay(500);
       tone(8, 550, 450);
       digitalWrite(RED_LED, HIGH);
         delay(300);
       digitalWrite(RED_LED, LOW);
    }

    void denied()
    {
       Serial.println("Access denied!"); //доступ закрыт
       digitalWrite(RED_LED, HIGH);
       tone(8, 550, 250);
       delay(300);
       digitalWrite(RED_LED, LOW);
       delay(300);
       digitalWrite(RED_LED, HIGH);
       tone(8, 550, 250);
       delay(300);
       digitalWrite(RED_LED, LOW);
       delay(300);
          digitalWrite(RED_LED, HIGH);
       tone(8, 550, 250);
       delay(300);
       digitalWrite(RED_LED, LOW);
       delay(300);
       digitalWrite(RED_LED, HIGH);
       tone(8, 550, 250);
       delay(300);
       digitalWrite(RED_LED, LOW);
       delay(300);
    }
     
    Расскажу в кратце, хочу сделать rfid замок, все работает. Но я бы хотел, чтобы когда дверь захлопывается только тогда сервопривод двигал шпингалет. Я сам пробовал делать прогу, но ничего не получилось. Сервопривод самопроизвольно двигается не знаю что делать.
    P.S. Нужен концевик.
    За рабочую программу могу дать 100 рублей.
     
    Последнее редактирование: 22 авг 2017
  2. Alexandrsvoi

    Alexandrsvoi Нуб

    День добрый, в чем проблема концевик опрашивать ?
     
  3. Alexandrsvoi

    Alexandrsvoi Нуб

    Логика реле у вас инверсная, ничего не обычного в этом нет.
     
  4. abubakar

    abubakar Нерд

    И...
    Нужно добавить функцию кнопки
     
  5. Alexandrsvoi

    Alexandrsvoi Нуб

    Кнопки или концевика, сформулируйте полноценную идею.
     
  6. abubakar

    abubakar Нерд

    кнопки
     
  7. qwone

    qwone Гик

    А писал такую программу, работает. Но народу нужна своя хренотеть. Так что я пас.
     
  8. abubakar

    abubakar Нерд

    Я сделал. но он то поднимался потом медленно опускался.
     
  9. qwone

    qwone Гик

    В каком смысле. Скорость движения сервы зависит только от самой сервы и все. Вот только закрывать сервой замок надо тогда, когда закрыта дверь. Иначе толку в замке на двери не будет не будет.
    Код (C++):
    /*
      //#1
      светодиод -> 8 (Led_pin) 0 горит/ 1 нет
           GND ->  GND
      серва  -> 5 (servo_pin)
      геркон -> A3 (gercon_pin) 0 дверь закрыта / 1 нет
      //#2
      кнопка1 -> A1 (btm1_pin) 0 нажата/ 1 нет
           GND ->  GND
      кнопка2 -> A2 (btm2_pin) 0 нажата/ 1 нет
           GND ->  GND
      //#3               Arduino Uno
      RFID_RC522 RST -> 9 (RST_pin)
            SDA(SS)-> 10 (SDA_pin)
            MOSI   -> 11 (MOSI_pin)
            MISO   -> 12 (MISO_pin)
            SCK    -> 13 (SCK_pin)
            3,3В   -> 3,3В
            GND    -> GND

            Card UID: E6 38 FE 13  брелок
            Card UID: 5A 5D 39 D5  пластик
    */

    //#1
    const int Led_pin = 8 ; // нога светодиода
    uint8_t Led ;
    const int interval = 2000 ; // интервал после нажатия клавиши 2 сек

    #include <Servo.h>
    Servo myservo;
    const int servo_pin = 5  ; // нога серво
    const int servo_OFF = 0; // серва закрыта
    const int servo_ON = 90; // серва открыта
    const int gercon_pin = A3  ; // нога геркона
    uint8_t gercon ;
    //#2
    const int btm1_pin = A1  ; // нога кнопки
    const int btm2_pin = A2  ; // нога кнопки
    //#3
    uint32_t Card;
    uint32_t Card1 = 0xE638FE13;
    uint32_t Card2 = 0x5A5D39D5;
    //byte uidCard1[4] = {0xE6, 0x38, 0xFE, 0x13};
    //byte uidCard2[4] = {0x5A, 0x5D, 0x39, 0xD5};
    #include <SPI.h>
    #include <MFRC522.h>
    const int SDA_pin = 10;
    const int RST_pin = 9;

    MFRC522 rfid(SDA_pin, RST_pin); // Instance of the class

    void setup() {
      //#1
      pinMode(Led_pin, OUTPUT);
      digitalWrite(Led_pin, Led = 0);
      myservo.attach(servo_pin);
      pinMode(gercon_pin, INPUT_PULLUP);
      //#2
      pinMode(btm1_pin, INPUT_PULLUP);
      pinMode(btm2_pin, INPUT_PULLUP);
      //#3
      SPI.begin(); // Init SPI bus
      rfid.PCD_Init(); // Init MFRC522
    }

    void loop() {
      static uint32_t MILLIS ;
      MILLIS = millis() ;
      //#1
      static uint32_t past_1 = 0 ;
      gercon = digitalRead(gercon_pin); // опрос состояния двери
      if (!gercon && !Led && (MILLIS - past_1 >= interval)) { // убеждаемся что дверь закрыта и подошло время закрывать на замок
        digitalWrite(Led_pin, Led = 1);
        myservo.write(servo_OFF);  // закрываем
      }
      //#2
      if (!digitalRead(btm1_pin)) { // первая открывающая кнопка
        digitalWrite(Led_pin, Led = 0);
        past_1 = millis();
        myservo.write(servo_ON);
      }
      if (!digitalRead(btm2_pin)) { // вторая открывающая кнопка
        digitalWrite(Led_pin, Led = 0);
        past_1 = millis();
        myservo.write(servo_ON);
      }
      //#3
      static uint32_t past_3 = 0 ;
      if (MILLIS - past_3 >= 1000)   {
        past_3 = MILLIS ;
        if ( rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) {
          Card = ((rfid.uid.uidByte[0] * 0x100 + rfid.uid.uidByte[1]) * 0x100 + rfid.uid.uidByte[2]) * 0x100 + rfid.uid.uidByte[3];
          //      if (rfid.uid.uidByte[0] == uidCard1[0] ||
          //          rfid.uid.uidByte[1] == uidCard1[1] ||
          //          rfid.uid.uidByte[2] == uidCard1[2] ||
          //          rfid.uid.uidByte[3] == uidCard1[3] ) {
          if (Card == Card1) {
            digitalWrite(Led_pin, Led = 0);
            past_1 = millis();
            myservo.write(servo_ON);
          }
          if (Card == Card2) {
            //      if (rfid.uid.uidByte[0] == uidCard2[0] ||
            //          rfid.uid.uidByte[1] == uidCard2[1] ||
            //          rfid.uid.uidByte[2] == uidCard2[2] ||
            //          rfid.uid.uidByte[3] == uidCard2[3] ) {
            digitalWrite(Led_pin, Led = 0);
            past_1 = millis();
            myservo.write(servo_ON);
          }
        }
      }
    }
     
    Последнее редактирование: 22 авг 2017
  10. qwone

    qwone Гик

    Код (C++):
    /*
      светодиод -> 8 (Led_pin) 0 горит/ 1 нет
           GND ->  GND
      серва  -> 5
      геркон -> 3  0 дверь закрыта / 1 нет
      кнопка -> 2  0 нажата/ 1 нет
           GND ->  GND

      RFID_RC522 RST -> 9 (RST_pin)
            SDA(SS)-> 10 (SDA_pin)
            MOSI   -> 11 (MOSI_pin)
            MISO   -> 12 (MISO_pin)
            SCK    -> 13 (SCK_pin)
            3,3В   -> 3,3В
            GND    -> GND
    */

    unsigned long mill;//переменная millis()
    //-------Cl_Lock---------------------------------------
    // класс Cl_Lock дверной замок - серво,геркон в дверях,светодиод индикация
    #include <Servo.h>
    const int servo_OFF = 0; // серва закрыта
    const int servo_ON = 90; // серва открыта
    class Cl_Lock {
        const byte servoPin;
        const byte gerconPin;
        const byte ledPin;
        unsigned long time, past;
        Servo myservo;
        bool doorOpen;// 1 дверь открыта
      public:
        /*конструктор Cl_Lock
          описание    создать объект
          ввод        _servoPin: нога на серве
                      _gerconPin: нога на герконе
          вывод       нет
        */

        Cl_Lock(byte _servoPin, byte _gerconPin, byte _ledPin, unsigned long _time)
          : servoPin(_servoPin), gerconPin(_gerconPin), ledPin(_ledPin), time(_time) {}
        /*функция     setup
          описание    иницилизация
          ввод        нет
          вывод       нет
        */

        void setup() {
          pinMode(ledPin, OUTPUT);
          digitalWrite(ledPin, 0);
          myservo.attach(servoPin);
          pinMode(gerconPin, INPUT_PULLUP);
          if (!digitalRead(gerconPin))myservo.write(servo_OFF);
          doorOpen = 1;
        }
        /*функция     loop
          описание    для нормальной работы вставить в тело loop()
          ввод        нет
          вывод       нет
        */

        void loop() {
          if (doorOpen && mill - past >= time && !digitalRead(gerconPin)) { // убеждаемся что дверь закрыта и подошло время закрывать на замок
            doorOpen = 0;
            digitalWrite(ledPin, 1);
            myservo.write(servo_OFF);  // закрываем
          }
        }
        /*функция     open
          описание    открыть дверь
          ввод        нет
          вывод       нет
        */

        void open() {
          doorOpen = 1;
          past = mill;
          digitalWrite(ledPin, 0);
          myservo.write(servo_ON);
        }
    };
    //---------Cl_Btn-------------------------------------------------
    // класс кнопка
    class Cl_Btn {
        const byte pin;
        void (*Do)();
        bool btn, oldBtn = 1;
        bool bounce = 0;
        unsigned long past;
      public:
        /*конструктор Cl_Btn
          описание    создать объект
          ввод        _pin: нога кнопки
                      _Do: обработчик кнопки
          вывод       нет
        */

        Cl_Btn(byte _pin, void (_Do)()): pin(_pin), Do(_Do) {}
        /*функция     setup
          описание    иницилизация
          ввод        нет
          вывод       нет
        */

        void setup() {
          pinMode(pin, INPUT);
          btn = digitalRead(pin);
        }
        /*функция     loop
          описание    для нормальной работы вставить в тело loop()
          ввод        нет
          вывод       нет
        */

        void loop() {
          bool newBtn = digitalRead(pin);
          if (bounce && newBtn != btn) {
            bounce = 1;
          }
          if (!bounce && mill - past >= 10) {
            past = mill;
            bounce = 0;
            oldBtn = btn;
            btn = newBtn;
            if (!btn && oldBtn) (*Do)();
          }
        }
    };
    //---------Cl_MFRC522-------------------------------------------------
    // класс MFRC522 кнопка на RFID
    #include <SPI.h>
    #include <MFRC522.h>
    struct sCard {
      struct sCard *next;
      unsigned long Card;
    };
    class Cl_MFRC522 {
        MFRC522 rfid;
        void (*Do)(); // обработчик кнопки
        unsigned long past;
        struct sCard *start = NULL;
      public:
        /*конструктор Cl_Btn
          описание    создать объект
          ввод        sdaPin: нога SDA
                      rstPin: нога RST
                      _Do: обработчик кнопки RFID
          вывод       нет
        */

        Cl_MFRC522(byte sdaPin, byte rstPin, void (_Do)())
          : rfid(sdaPin, rstPin), Do(_Do) {}
        /*функция     setup
          описание    иницилизация
          ввод        нет
          вывод       нет
        */

        void setup() {
          SPI.begin();
          rfid.PCD_Init();
        }
        /*функция     loop
          описание    для нормальной работы вставить в тело loop()
          ввод        нет
          вывод       нет
        */

        void loop() {
          if (mill - past >= 1000) {
            past = mill;
            if ( rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) {
              uint32_t Card = ((rfid.uid.uidByte[0] * 0x100 + rfid.uid.uidByte[1]) * 0x100 + rfid.uid.uidByte[2]) * 0x100 + rfid.uid.uidByte[3];
              Serial.println(Card);
              for (struct sCard *ii = start; ii != NULL; ii = ii->next) {
                if (Card == ii->Card) (*Do)();
              }
            }
          }
        }
        /*функция     AddCard
          описание    добавить новую карту
          ввод        _Card:код новой карты
          вывод       нет
        */

        void AddCard(uint32_t _Card) {
          struct sCard *newCard = new struct sCard;
          newCard->next = start;
          newCard->Card = _Card;
          start = newCard;
        }
    };
    //-----Компоновка-----------------------------------------
    const unsigned time_3s = 3000;
    Cl_Lock Lock(/*пин на серво*/5,/*пин на герконе*/3,/*пин индик*/8,/*врямя*/time_3s);
    void Do_Btn() {
      Lock.open();
    }
    Cl_Btn Btn(/*пин*/2,/*обработчик*/Do_Btn);
    Cl_MFRC522 MFRC522(/*пин SDA*/10,/*пин RST*/9,/*обработчик*/Do_Btn);
    //-----main()-----------------------------------------
    void setup() {
      Serial.begin(9600);
      Lock.setup();
      Btn.setup();
      MFRC522.setup();
      MFRC522.AddCard(4294966803);// добавить карту 4294966803
      MFRC522.AddCard(14805)     ;// добавить карту 14805
    }

    void loop() {
      mill = millis();
      Lock.loop();
      Btn.loop();
      MFRC522.loop();
    }
    /*Скетч использует 7062 байт (21%) памяти устройства. Всего доступно 32256 байт.
      Глобальные переменные используют 298 байт (14%) динамической памяти, оставляя 1750 байт для локальных переменных. Максимум: 2048 байт.
    */
    Код карточки вписывайте тот что программа кидает в Serial