Skocz do zawartości

Arduino sterowanie kilkoma serwami pilotem IR


bowman007

Pomocna odpowiedź

Hej,
To mój pierwszy post, więc mam nadzieję, że umieszczam go w dobrym dziale. Jednocześnie liczę na wyrozumiałość, problem jest w sposobie mojego myślenia i proszę o jakąś wskazówkę ułatwiającą rozwiązanie problemu. Jestem szczęśliwym posiadaczem Arduino. Zamierzam za pomocą pilota IR sterować 5 serwami następujący sposób. Naciskam 1 wybieram serwo 1, Naciskam 2 wybieram serwo 2, Naciskam 3 wybieram serwo 3 itp. po wybraniu konkretnego serwa po naciśnięciu + lub - na pilocie orczyk obraca się w prawo albo w lewo. Napisałem program, który po wybraniu konkretnego serwa uruchamia orczyk, obraca się o 180 stopni w prawo, a potem w lewo. Nie wiem, gdzie umieścić linijki kodu warunkujące + - tak by, program niejako "poczekał" na kolejne naciśnięcie przycisku. Umieszczam jedną z wersji programu, wymagającą przekształcenia.

#include <IRremote.h>
#include <Servo.h>

#define trigger 2
#define echo 8
#define irPin 11

IRrecv irrecv(irPin);
decode_results results;

Servo myservo1;
Servo myservo2;
Servo myservo3;
Servo myservo4;
Servo myservo5;
int pos1 = 0;
int pos2 = 0;
int pos3 = 0;
int pos4 = 0;
int pos5 = 0;

int i;

void setup() {
 // put your setup code here, to run once:
pinMode(trigger, OUTPUT);
pinMode(echo, INPUT);
Serial.begin(9600);
irrecv.enableIRIn();
 myservo1.attach(3);
 myservo2.attach(5);
 myservo3.attach(6);
 myservo4.attach(9);
 myservo5.attach(10);
}

void loop() {
/* int czas,dist=0;
 digitalWrite(trigger, HIGH);
 delayMicroseconds(1000);
 digitalWrite(trigger, LOW);
 czas=pulseIn(echo, HIGH);
 dist=(czas/2)/29.1;
 // put your main code here, to run repeatedly:
 if (dist>0)
{Serial.print(dist);
 Serial.println(" cm");}
 delay(1000);*/



if (irrecv.decode(&results)) {
Serial.print("0x");
    Serial.println(results.value, HEX);
     delay(250);
     irrecv.resume();
   switch (results.value) {


     case 0xFF30CF:
    // if (results.value==0xFFE01F)
       for (pos1 = 0; pos1 < 180; pos1 += 1)
       {
         myservo1.write(pos1);
         delay(15);
       }
    //   break;

   //   if (results.value==0xFFA857)
      for (pos1 = 180; pos1 >= 1; pos1 -= 1)
       {
         myservo1.write(pos1);
         delay(15);
       }
      break;


     case 0xFF18E7:
       for (pos2 = 0; pos2 < 180; pos2 += 1)
       {
         myservo2.write(pos2);
         delay(15);
       }
       for (pos2 = 180; pos2 >= 1; pos2 -= 1)
       {
         myservo2.write(pos2);
         delay(15);
       }
       break;
     case 0xFF7A85:
       for (pos3 = 0; pos3 < 180; pos3 += 1)
       {
         myservo3.write(pos3);
         delay(15);
       }
       for (pos3 = 180; pos3 >= 1; pos3 -= 1)
       {
         myservo3.write(pos3);
         delay(15);
       }
       break;
     case 0xFF10EF:
       for (pos4 = 0; pos4 < 180; pos4 += 1)
       {
         myservo4.write(pos4);
         delay(15);
       }
       for (pos4 = 180; pos4 >= 1; pos4 -= 1)
       {
         myservo4.write(pos4);
         delay(15);
       }
       break;
     case 0xFF38C7:
       for (pos5 = 0; pos5 < 180; pos5 += 1)
       {
         myservo5.write(pos5);
         delay(15);
       }
       for (pos5 = 180; pos5 >= 1; pos5 -= 1)
       {
         myservo5.write(pos5);
         delay(15);
       }
   }
   irrecv.resume();
 }



}
Link do komentarza
Share on other sites

Na logikę może być tak:

jesli kod="1" to serwo=1
jesli kod="2" to serwo=2
jesli kod="3" to serwo=3
jesli kod="4" to serwo=4
jesli kod="5" to serwo=5
jesli kod="+" to 
 jesli serwo=1 to ++poz1
 jesli serwo=2 to ++poz2
 jesli serwo=3 to ++poz3
 jesli serwo=4 to ++poz4
 jesli serwo=5 to ++poz5
jesli kod = "-" to
 jesli serwo=1 to --poz1
 jesli serwo=2 to --poz2
 jesli serwo=3 to --poz3
 jesli serwo=4 to --poz4
 jesli serwo=5 to --poz5

myservo1.write(pos1)
myservo2.write(pos2)
myservo3.write(pos3)
myservo4.write(pos4)
myservo5.write(pos5)

zamiast if;ów możesz oczywiście switch case

no i oczywisice warunki dodac zeby przy dodawaniu nie wyjść powyżej max a przy odejmowaniu nie zejść poniżej min.

Jeszcze prościej by było jakby zrobić tablicę z 5 rakordami do każdego serwa ale to już na deser sobie zostaw.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.