Skocz do zawartości

Sterowanie serwem , modyfikacja programu Arduino, PWM


Pomocna odpowiedź

Napisano

Witam. Mój problem dotyczy programu do sterowania serwem. Jestem na etapie gdzie za pomocą pilota jestem w stanie ustawić serwo w dwóch podanych położeniach które są zawarte w programie.

Chciałbym aby program był bardziej uniwersalny tak wiec chciałbym żeby po naciśnięciu przycisku pilota serwo przekręciło się o kilka stopni w jedną stronę a potem za pomocą drugiego przycisku o tyle samo lecz w przeciwną strone. Przycisk ma realizować przesunięcie o np + 5 stopni a drugi przycisk - 5 stopni.

Szukałem w necie i starałem się to wykonać mniej wiecej jakbym sterował jasnością diody ale w akcie w desperacji prosze o pomoc

symulacja tinkercard :

symulacja arduino

do symulacji użyj przycisk góra i dół

mój kod :

#include <Servo.h>
#include <IRremote.h>
#define irPin 2

Servo servol;

IRrecv irrecv(irPin);
decode_results results;





void setup() {
  Serial.begin(9600);
   irrecv.enableIRIn();

servol.attach(3);



}

void loop() {
  if (irrecv.decode(&results)) {

     switch (results.value) {

        case 0xFD50AF:
       Serial.println("A");
        servol.write(120);
        delay(250);
        break;

       case 0xFD10EF:
       Serial.println("B");
       servol.write(10);
       delay(250);
       break;

  }
     irrecv.resume();
}
}

Dziękuję za odpowiedź. Akurat jestem początkujący i nie za bardzo wiem jakby ten kod miałby ogólnie wyglądać. Często sięgam do wszelkich kursów ale to czasem malo mi mówi. Byłbym wdzięczny za parę linijek kodu.

Dzięki za zdeterminowanie do pracy, posiedziałem troche nad tym i w symulacji wszystko ładnie chodzi. Zmieniony kod jedynie przy funkcji określonego kodu z pilota. :->

jakby ktoś się dokopał i potrzebował :

Zmienne kurs Arduino

[ Dodano: 26-08-2017, 17:59 ]

Ale mam jeszcze pytanie żeby udoskonalić program. Co zmiennić aby to było płynne. Naciskam przycisk i przeskakuje o okreslony kąt. Chciałbym żeby przytrzymując przycisk cały czas był w ruchu. Jakaś podpowiedź ?

#include <Servo.h>
#include <IRremote.h>
#define irPin 2
int pozycja = 90;
int zmiana = 15;
Servo servol;

IRrecv irrecv(irPin);
decode_results results;





void setup() {
  Serial.begin(9600);
   irrecv.enableIRIn();

servol.attach(3);



}

void loop() {
  if (irrecv.decode(&results)) {

     switch (results.value) {

        case 0xFD50AF:
       Serial.println("RIGHT");
      if (pozycja < 180) { 
         servol.write(pozycja);}
       pozycja = pozycja + zmiana; 
        delay(250);
        break;

       case 0xFD10EF:
       Serial.println("LEFT");
       if (pozycja > 0){
          servol.write(pozycja); }
         pozycja = pozycja - zmiana;
       delay(250);
        break;



  }
     irrecv.resume();
}
}

Przytrzymywanie przycisku w pilotach zazwyczaj działa tak, że jest wysyłany osobny kod "jeszcze raz to samo". Musiałbyś zapamiętywać w którym kierunku ostatnio serwo się ruszało i na ten kod poruszać je w tym samym kierunku.

Możesz na przykład zrobić zmienną "kierunek" do której przypiszesz 1 gdy zwiększasz pozycję, a -1 gdy zmniejszasz. I dodać jeszcze jeden case na kod powtórzenia (nie wiem jaki jest w twoim pilocie, musiałbyś sprawdzić), który do pozycji dodaje kierunek.

Dziękuje za podpowiedź 😉 przydało się. Mam jeszcze jedno pytanie. Gdy obracam serwem np w lewo i następnie zmieniam obroty na przeciwny kierunek to serwowykonuje jedną sekwencje w lewo a następnie w przeciwną. Wykonuje symulacje w tinkercard wiec nie wiem czy to kwestia symulacji czy w programie jest coś nie tak.

tinkercard

int pozycja = 90;
int zmiana = 10;

#include <Servo.h>
Servo SERVO_1;

void setup()
{


SERVO_1.attach(3);
pinMode(1, INPUT_PULLUP);
pinMode(2, INPUT_PULLUP);

}
void loop()
{
 if (digitalRead(1) == LOW) {

   (pozycja > 0); {
          SERVO_1.write(pozycja); }
         pozycja = pozycja - zmiana;
   delay(100); }



 if (digitalRead(2) == LOW) {

   (pozycja < 180); { 
         SERVO_1.write(pozycja);}
       pozycja = pozycja + zmiana;
   delay(100);

}
}

krzywy187, czegoś chyba w Twoim programie zabrakło (lub tutaj wkleiłeś coś z błędem). Chodzi o ten fragment:

    (pozycja > 0); { 
          SERVO_1.write(pozycja); } 
         pozycja = pozycja - zmiana; 
   delay(100); } 

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...