Сервокіравання з дапамогай DIP-пераключальніка

Я даволі новы для Arduino і праграмавання таксама. Я хачу, каб падмятаць сервопривод з дапамогай DIP-пераключальніка. На дадзены момант, я выкарыстоўваю 4 пазіцыйны перамыкач DIP. Для кожнага з перамыкачоў, я хачу, каб усталяваць колькасць разоў сервопривод павінен працаваць. Напрыклад., Pos 1 DIP перамыкач кажа, разгорткі па 5 разоў. Pos 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) Упраўленне Servo праз камутатар 2: Калі я ўключаю, сервопривод мяце па 10 разоў і спыняецца на мой цікавасць. Але, калі я зноў змяніць перамыкач у становішча 0 і 1, то паслядоўнасць не запускаецца. На самай справе, ніякай іншай перамыкач не працуе. Мне трэба, каб выключыць Arduino, каб запусціць праграму зноў. 3) кантроль сервопривода праз перамыкач 3 (= перамыкач 4): Калі мой перамыкач 1, сервопривод свип. Калі мой перамыкач 0, сервопривод спыняецца.

Не маглі б вы прапанаваць: 1) Як напісаць код так, што мае серво падмятае толькі для устаноўленага колькасці раз, нават калі перамыкач знаходзіцца ў 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
дададзена

Калі змясціць стрэлападобнасцю-код у функцыі налады, то выкананне будзе адзін раз (таму што ўстаноўка() выклікаецца толькі адзін раз), і вы ўбачыце, што вы чакалі.

Але, як гэта ў функцыі цыклу (), ён выконвае кожны раз, калі функцыя цыклу() выконвае - гэта значыць кропка функцыі контуру (). У якасці іншай альтэрнатывы, вы можаце пакласці бесконечномерную ці назаўжды пятлю

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

у канцы функцыі цыклу (), каб прадухіліць яго вяртанне і выклікаўся зноў. У любым выпадку, вы ўбачыце адзін праход праз крокі, якія вы закадаваныя.

0
дададзена

Ваш код перамыкача 2 ўключае ў сябе myservo.detach() у канцы, які прадухіляе любы далейшы код сервера ад аперацыйных.

Калі вы хочаце, каб код перамыкача 1, каб выканаць толькі адзін раз, вы можаце дадаць myservo.detach() да блока.

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

З іншага боку, вы можаце avoide на адлучэнні() і прымацаваць (), дадаўшы сцяг адзін стрэлу ва ўмоўных, ўсталюйце яго ва ўмоўным, і ачысціць яго, калі перамыкачы зразумелыя.

Напрыклад:

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

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