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

Тема в разделе "Закажу проект", создана пользователем 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;
    // Часто модуль реле имеет неожиданную логику. На LOW - замыкается, на HIGH размыкается.
    // Укажите уровни пина RELAY1 для открытого и закрытого состояния.
    #define RCLOSE HIGH
    #define ROPEN LOW
     
    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 рублей.
     
  2. ostrov

    ostrov Гуру

    Поставить концевик, отслеживать его состояние. Когда оно меняется с открытого на закрытое дергать шпингалет. То же самое происходит при поднесении метки, только наоборот.
     
  3. ostrov

    ostrov Гуру

    Но если подсказки мало (а ее могло бы и хватить), то можно сделать на возмездной основе, как и принято в этом разделе.
     
  4. Готов помочь тоже, если подсказки ostrov не хватило.
     
    abubakar нравится это.
  5. abubakar

    abubakar Нерд

    Код (C++):
    #include <Servo.h>
    #define SERVO_PIN              9     // пин, к которому подключена серва (желтый провод)
    #define BUTTON_PIN             2     // пин, к которому подключена кнопка. Второй вывод кнопки подключен к GND
    const unsigned int angle_min = 20;    // начальный угол поворота сервы
    const unsigned int angle_max = 90;  // конечный угол поворота сервы
    Servo myservo;

    void setup()
    {
      pinMode(BUTTON_PIN, INPUT_PULLUP);
    }

    void loop()
    {
      static boolean buttonReleased = true;
      if (!digitalRead(BUTTON_PIN) && buttonReleased)
      {
        myservo.attach(SERVO_PIN);
        myservo.write(myservo.read() ? angle_min : angle_max);
        delay(500);
        myservo.detach();
      }
      buttonReleased = digitalRead(BUTTON_PIN);
    }
    Я написал скетч. Только я хочу чтобы он был на двух кнопках. Ну чтобы одна кнопка открывала а другая закрывала. Получится так?
     
  6. Тимати

    Тимати Нерд

    Зачем это все мудрить??? Можно все проще сделать!!!
     
  7. Тимати

    Тимати Нерд

    Я готов рабочую программу вам предоставить за 200₽! Сам проверил! Все работает
     
  8. Тимати

    Тимати Нерд

    Если согласны пишите в личку