Skocz do zawartości

Sterowanie serwem , modyfikacja programu Arduino, PWM


krzywy187

Pomocna odpowiedź

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();
}
}
Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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();
}
}
Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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

}
}
Link do komentarza
Share on other sites

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

Anonim
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.