Servobesturing met DIP-schakelaar

Ik ben vrij nieuw voor Arduino en ook programmeer. Ik wil een servo vegen met de DIP-schakelaar. Op dit moment gebruik ik DIP-schakelaar met 4 standen. Aan elk van de schakelaars wil ik het aantal keren instellen dat de servo moet worden uitgevoerd. Bijv., Pos 1 van de DIP-schakelaar zegt, veeg voor 5 keer. Pos 2 zegt, veegt voor 10 keer etc.

Ik schreef de volgende code:

#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);  
      }

   }
}

De acties die plaatsvinden met de bovenstaande code zijn: 1) Servosturing via schakelaar 1 - Als ik onmiddellijk AAN (0) en vervolgens UIT (1) schakel, veegt de servo vijf keer. Werkt meer als een knopschakelaar. Als ik ON (onmiddellijk) weer AAN en UIT schakel, kan ik 5 keer opnieuw vegen. Maar als ik de schakelaar in 1 laat staan, stopt de sweep niet na 5 keer.
2) Servobesturing via schakelaar 2: als ik AAN ga, veegt de servo 10 keer en stopt volgens mijn interesse. Maar als ik de schakelaar opnieuw verander in 0 en 1, start de reeks niet. In feite werkt geen enkele andere schakelaar. Ik moet de Arduino UIT zetten om het programma opnieuw uit te voeren. 3) Servobesturing via schakelaar 3 (= schakelaar 4): als mijn schakelaar 1 is, veegt de servo. Als mijn schakelaar 0 is, stopt de servo.

Kun je alsjeblieft voorstellen: 1) Hoe de code zo te schrijven dat mijn servo slechts gedurende het ingestelde aantal keren veegt, zelfs wanneer de schakelaar altijd in 1 staat of wanneer ik wissel tussen 0 en 1? 2) Ik wil geen seriële communicatie gebruiken (of meestal een pc). Is het mogelijk om een ​​7-segments of LCD-interface te koppelen om het aantal uitgevoerde sweeps weer te geven of nog te verlaten.

Dank u bij voorbaat.

1

3 antwoord

Dit is gebaseerd op de verbeelding, omdat ik het zelf niet op dit moment kan testen, maar voel je vrij om te vragen of iets niet klopt.

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
toegevoegd

Als je de sweep-code in de setup-functie zet, zou deze één keer worden uitgevoerd (omdat setup() slechts één keer wordt aangeroepen) en je zou zien wat je verwachtte.

Maar zoals het is in de loop() functie, wordt het uitgevoerd elke keer dat de lus() functie wordt uitgevoerd - dat is het punt van de lus() functie. Als een ander alternatief zou je een oneindige- of voor altijd-lus kunnen plaatsen

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

aan het einde van de lus() functie om te voorkomen dat deze terugkeert en opnieuw wordt gebeld. Hoe dan ook, je ziet een enkele passage over de stappen die je hebt gecodeerd.

0
toegevoegd

Uw switch 2-code bevat aan het einde een myservo.detach() die voorkomt dat er nog meer servercode wordt uitgevoerd.

Als u de code van switch 1 slechts één keer wilt uitvoeren, kunt u een myservo.detach() aan het blok toevoegen.

U lijkt ook het gewenste aantal keren te willen recyclen als u de schakelaar wist. Hiervoor wilt u misschien myservo.attach (9) wanneer alle switches open zijn.

U kunt ook afhechten() en attach() vermijden door een one-shot-vlag toe te voegen aan de conditionals, deze binnen de conditional te plaatsen en te wissen wanneer de schakelaars leeg zijn.

Bijvoorbeeld:

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

   if (armed & s1state == LOW) {    //read the stored input pin value
       armed = 0;
       ...
0
toegevoegd