DIP коммутаторы арқылы сервопривод

Мен сондай-ақ Ардуино және бағдарламалау үшін өте жаңа. Мен DIP коммутаторы арқылы сервопрограммадан тазартқым келеді. Қазіргі уақытта мен DIP коммутаторының 4 позициясын қолданамын. Қосқыштардың әрқайсысына, мен сервопроның жұмыс істеу санын бірнеше рет орнатқым келеді. Мысалы, DIP коммутаторының Pos 1-і 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 - Егер мен ON (0) және OFF (1) дереу қоссам, серво 5 рет сыпырады. Түйменің қосқышы сияқты көп жұмыс істейді. Егер мен ҚОСУЛЫ және ӨШІРУЛІ (бірден) қайта қоссам, қайтадан 5 рет қайтадан алмаймын. Бірақ, қосқышты 1-ден қалдырсам, шаңсор 5 рет қалмайды 2) 2-қосқыш арқылы сервистік басқару: Егер қосылсам, серво 10 есеге жетеді және менің қызығушылығыма байланысты тоқтатылады. Бірақ, қосқышты 0 және 1-ге қайта ауыстырсам, дәйектілік басталмайды. Іс жүзінде басқа қосқыш жұмыс істемейді. Бағдарламаны қайта іске қосу үшін Ардуиноны өшіру керек. 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
қосылды

Егер скриптті кодты орнату функциясына қойсаңыз, ол бір рет орындалады (setup() тек бір рет шақырылғандықтан) және күткеніңізді көресіз.

Loop() функциясындағыдай, loop() функциясын орындаған сайын орындалады - бұл loop() функциясының нүктесі. Басқа альтернатива ретінде шексіз немесе мәңгілік ілмекті қоюға болады

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

loop() функциясының соңында оны қайтаруға және қайта шақыруға жол бермеу үшін. Қалай болғанда да, Сіз кодты қадамдар арқылы бір ғана өтуді көресіз.

0
қосылды

Қосқыштың 2 коды келесі сервер кодын жұмыс істеуге кедергі келтіретін myservo.detach() қамтиды.

Егер сіз 1 кодын тек бір рет орындауды қаласаңыз, block myservo.detach() қосуға болады.

Сіз коммутаторды өшірсеңіз, сәйкесінше рет қайта өңдеуді қалайтын сияқтысыз. Ол үшін барлық қосқыштар ашық болғанда myservo.attach (9) қосқыңыз келуі мүмкін.

Сондай-ақ, detach() және attach() функциясын бір шартты күйге орнатып, оны шартты түрде орнатып, қосқыштар ашық болғанда тазартыңыз.

Мысалға:

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

   if (armed & s1state == LOW) {    //read the stored input pin value
       armed = 0;
       ...
0
қосылды