Управління сервоприводом за допомогою DIP-перемикача

Я дуже новинка в програмі Arduino та програмування. Я хочу підмітати сервопривід за допомогою DIP-перемикача. У даний момент я використовую 4-позиційний DIP-перемикач. Для кожного з перемикачів я хочу встановити кількість разів, коли сервопривід повинен запустити. Наприклад, Позиція 1 DIP-перемикача говорить, що розгортка проводиться 5 разів. Позиція 2 говорить, розмиває 10 разів і т. Д.

Я написав такий код:

#include 

Servo myservo;  
int pos = 0; 
int count = 0;  //might need later
int runXTimes = 0;

#define S1 2
#define S2 3
#define S3 4
#define S4 5

int s1state = HIGH;
int s2state = HIGH;
int s3state = HIGH;
int s4state = HIGH;


void setup() {
   myservo.attach(9);
   pinMode(S1, INPUT_PULLUP);
   pinMode(S2, INPUT_PULLUP);
   pinMode(S3, INPUT_PULLUP);
   pinMode(S4, INPUT_PULLUP);
   pinMode(9, OUTPUT);
}

void loop() {

   s1state = digitalRead(S1);
   s2state = digitalRead(S2);
   s3state = digitalRead(S3);
   s4state = digitalRead(S4);


  //Servo control through Switch 1
   if (s1state == LOW) {    //read the input pin
      for (int runXTimes = 0; runXTimes < 5; runXTimes++) {   //Servo to     sweep for 5 times
         for (pos = 0; pos <= 80; pos += 1) //goes from 0 degrees to 80 degrees in steps of  degree

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

         for(pos = 80; pos>=0; pos-=1)    //goes from 80 degrees to 0 degrees
         {                               
            myservo.write(pos);             //tell servo to go to position in variable 'pos'
            delay(5);
         }

      }

   }

  //Servo control through Switch 2. Used servo detach here
   else if (s2state == LOW) { //read the input pin
      for (int runXTimes = 0; runXTimes < 10; runXTimes++) { //Servo to sweep for 10 times
         for (pos = 0; pos <= 80; pos += 1) //goes from 0 degrees to 80 degrees in steps of  degree
         {                                  
            myservo.write(pos);             //tell servo to go to position in variable 'pos'
            delay(5); 
         }

         for(pos = 80; pos>=0; pos-=1)    //goes from 80 degrees to 0 degrees
         {                               
            myservo.write(pos);             //tell servo to go to position in variable 'pos'
            delay(5);  
         }

      }
      myservo.detach();
   }

  //Servo control through Switch 3
   else if (s3state == LOW) { //read the input pin
      for (pos = 0; pos <= 80; pos += 1) //goes from 0 degrees to 80 degrees in steps of  degree
      {                                 //
         myservo.write(pos);             //tell servo to go to position in variable 'pos'
         delay(5); 
      }

      for(pos = 80; pos>=0; pos-=1)    //goes from 80 degrees to 0 degrees
      {                               
         myservo.write(pos);             //tell servo to go to position in variable 'pos'
         delay(5);  
      }
   }

  //Servo control through Switch 4
   else if (s4state == LOW) { //read the input pin
      for (pos = 0; pos <= 80; pos += 1) //goes from 0 degrees to 80 degrees  in steps of  degree
      {                                 
         myservo.write(pos);             //tell servo to go to position in variable 'pos'

         delay(5); 
      }

      for(pos = 80; pos>=0; pos-=1)    //goes from 80 degrees to 0 degrees
      {                               
         myservo.write(pos);             //tell servo to go to position in variable 'pos'
         delay(5);  
      }

   }
}

Дії, які відбуваються з наведеним вище кодом, є: 1) Управління сервоприводом через перемикач 1 - Якщо я вмикаю ввімкнений (0), а потім вимкнений (1) негайно, сервопривод викидається 5 разів. Працює більше як перемикач кнопки. Якщо я знову увімкнув і вимкнув (негайно), я зможу знову зсунути 5 разів. Але, якщо я вийду з перемикача в 1, розгортка не зупиниться після 5 разів 2) Управління сервоприводом через перемикач 2: Якщо я увімкнув, сервопривод витискає 10 разів і зупиняється відповідно до моїх інтересів. Але, якщо знову змінити перемикач на 0 і 1, послідовність не розпочнеться. Фактично, жоден інший комутатор не працює. Мені потрібно вимкнути Arduino, щоб запустити програму знову. 3) Управління сервоприводом через перемикач 3 (= перемикач 4): якщо мій перемикач 1, то сервоусилювач розмиває. Якщо мій перемикач 0, сервопривід зупиняється.

Не могли б ви запропонувати: 1) Як написати код так, щоб мій сервосвітлювач міняв лише встановлену кількість разів, навіть коли перемикач увімкнено завжди або коли я перемикаюсь між 0 і 1? 2) Я не хочу використовувати послідовний зв'язок (або, як правило, ПК). Чи можна інтерфейс 7-сегмент або РК-дисплей, щоб відобразити кількість завершених чи залишкових значень.

Спасибі заздалегідь.

1

3 Відповіді

Це фантазія, оскільки я не можу перевірити це в даний момент, але не соромтеся запитати, чи є щось неправильним.

int readswitch()
{
 int S1,S2,S3,S4;
 uint8_t data = 255;
 data |= digitalRead(S4)<<3;
 data |= digitalRead(S3)<<2;
 data |= digitalRead(S2)<<1;
 data |= digitalRead(S1)<<0;

  if (data==0b11111110) return 1; else
  if (data==0b11111101) return 2; else
  if (data==0b11111011) return 3; else
  if (data==0b11110111) return 4; else
  //add another condition here if you want
  return 0;
}

int laststate = 0;
int state = 0;
int rotation;

void setup()
{
  //setup here, including LCD initialization
  //..
  //..
  //..
}

void updateLCD(int x,int y)
{
  lcd.clear();
  //displaying pin status
  lcd.print("dip : ");
  lcd.print(x,DEC);
  lcd.print(" rot : ");
  lcd.print(y,DEC); 
}

void loop()
{
  state = readswitch();
  if (state!=laststate)
  {
    if (state == 1) 
    {
      rotation = 5;
      for (int i = 0; i< rotation; i++)
        {
         //update lcd
         updateLCD(state,(rotation-i));

         //.. servo rotation
         //..
        }
      //...
    } else

    if (state == 2) 
    {
      //do what you want here if switch 2 == LOW
      //...
    } else

    if (state == 3) //switch 1 == LOW
    {
      //do what you want here if switch 3 == LOW
      //...
    } else

    if (state == 4) //switch 1 == LOW
    {
      //do what you want here if switch 4 == LOW
      //...
    } 
  }
  laststate = state;

}

For more information about LCD, you can refer to this documentation

1
додано

Якщо ви помістіть код sweep в функцію налаштування, він буде виконуватися один раз (оскільки налаштування() викликається лише один раз), і ви побачите те, що ви очікували.

Але, як і в функції loop (), він виконується кожного разу, коли виконує функцію loop() - це точка функції циклу (). Як іншу альтернативу, ви можете поставити нескінченну або вічну цикл

for(;;)
   ;   //program hangs here forever

в кінці функції циклу (), щоб запобігти його поверненню та повторному дзвінку. У будь-якому випадку, ви побачите один прохід за кроками, які ви закодовали.

0
додано

Код вашого перемикача 2 включає myservo.detach() в кінці, що перешкоджає роботу будь-якого додаткового коду сервера.

Якщо ви хочете, щоб код 1 перемикача виконувався лише один раз, ви можете додати myservo.detach() до блоку.

Схоже, ви хочете переробляти належну кількість разів, якщо очистите перемикач. Для цього ви можете захотіти myservo.attach (9), коли всі комутатори відкриті.

З іншого боку, ви можете уникнути від'єднання() і прикріплення (), додавши прапорець одноразового прапорця до умовних умов, встановіть його всередині умовного та очистьте його, коли перемикачі будуть очищені.

Наприклад:

   if (!s1state & !s2state & !s3state & !s4state) armed = 1;
   ...

   if (armed & s1state == LOW) {    //read the stored input pin value
       armed = 0;
       ...
0
додано