Skocz do zawartości

Przytrzymanie przycisku wykonuje obrót servem


radek123

Pomocna odpowiedź

Witam jestem nowym w świecie arduino i potrzebuję pomocy w jednym zagadnieniu. Zastanawia mnie jak mogę wykonać żeby servo ciągle się obracało gdy jest przycisk wciśnięty bez konieczności ciągłego jego wciskania . Oto mój kod steruje nim ramię robota i teraz gdy wcisnę przycisk obraca  się servo o daną wartość w daną stronę.

Dziękuję za wszelką pomoc:)

#include <Keypad.h>
#include <Servo.h>
int pozycja =  120;
int pozycja1 = 120;
int pozycja2 = 120;
int pozycja3 = 120;
int zmiana = 5;
const byte rows = 4; 
const byte columns = 4; 
char buttons[rows][columns] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};  
byte rowP[rows] = {13, 12, 11, 10};
byte columnsP[columns] = {9, 8, 7, 6}; 
Keypad pad = Keypad( makeKeymap(buttons), rowP, columnsP, rows, columns );    
Servo myServo; 
Servo myServo1;
Servo myServo2;
Servo myServo3;
void setup(){
   Serial.begin(9600);
   myServo.attach(5);  
   myServo1.attach(4); 
    myServo2.attach(3); 
     myServo3.attach(2); 
}
void loop(){
  char key = pad.getKey();  
      if(key == '1')
      {
        if (pozycja < 90) { 
          pozycja = pozycja + zmiana; 
          Serial.print( pozycja);
         myServo.write(pozycja);}

      }
      if(key == '2')
      {
         if (pozycja > 0){
          pozycja = pozycja - zmiana;
          Serial.print(pozycja);
          myServo.write(pozycja); }
        

      }
      if(key == '4')
      {
        if (pozycja1 < 140 ){ 
          Serial.print(pozycja1);
          pozycja1 = pozycja1 + zmiana ; 
         myServo1.write(pozycja1);}
  
      }
      if(key == '5')
      {
         if (pozycja1 > 0){
          Serial.print(pozycja1);
          pozycja1 = pozycja1 - zmiana;
          myServo1.write(pozycja1); }
        

       
      }
       if(key == '7')
      {
        if (pozycja2 < 140 ){
          Serial.print(pozycja2);
          pozycja2 = pozycja2 + zmiana;  
         myServo2.write(pozycja2);}

      }
      if(key == '8')
      {
         if (pozycja2 > 0){
          Serial.print(pozycja2);
          pozycja2 = pozycja2 - zmiana;
          myServo2.write(pozycja2); }
         

      }
      if(key == '*')
      {
         if (pozycja3 < 140){
          Serial.print(pozycja3);
          pozycja3 = pozycja3 + zmiana;
          myServo3.write(pozycja3); }
         

      }if(key == '0')
      {
         if (pozycja3 > 0){
          Serial.print(pozycja3);
          pozycja3 = pozycja3 - zmiana;
          myServo3.write(pozycja3); }
         

      }
       if (pozycja1 > 140){;
         pozycja1 = pozycja1 - zmiana;
         }
       
       if (pozycja1 < 0){;
         pozycja1 = pozycja1 + zmiana;
         }
       if (pozycja > 95){;
         pozycja = pozycja - zmiana;
         }
       
       if (pozycja < 55   ){;
         pozycja = pozycja + zmiana;
         }

         if (pozycja2 > 140){;
         pozycja2 = pozycja2 - zmiana;
         }
       
       if (pozycja2 < 0){;
         pozycja2 = pozycja2 + zmiana;
         }

         if (pozycja3 > 60){;
         pozycja3 = pozycja3 - zmiana;
         }
       
       if (pozycja3 < 0){;
         pozycja3 = pozycja3 + zmiana;
         }
}

 

Link do komentarza
Share on other sites

18 godzin temu, radek123 napisał:

 Zastanawia mnie jak mogę wykonać żeby servo ciągle się obracało gdy jest przycisk wciśnięty bez konieczności ciągłego jego wciskania .

 

To najlepiej zrobic sobie jakas flage i zmieniac jej stan przycisnieciami guzika...cos takiego (pomijam poprawnosc) 

key = getkey()
  if (key == "k") {
  flaga = 1;
}
if (flaga == 1) {
servo.write(pozycja)
  pozycja++
  delay(30)
  }

I cos jeszcze trzeba do zresetowania flag...jakas gwiazdka czy cos, ktora zatrzyma serwa

Link do komentarza
Share on other sites

Czyli ten kod będzie działa, że jak ścianę przycisk to serwis będzie się kręciło do póki jego nie odcisnę  czy do momentu kiedy nie ścianę go ponownie żeby się zatrzymało ?

I dziękuję za odpowiedź

Link do komentarza
Share on other sites

6 minut temu, radek123 napisał:

Czyli ten kod będzie działa, że jak ścianę przycisk to serwis będzie się kręciło do póki jego nie odcisnę  czy do momentu kiedy nie ścianę go ponownie żeby się zatrzymało ?

 

Nie...ten kod dziala tak ze jak nacisniesz "k" to ten if sie wykonuje dopuki nie zresetujesz "flaga" 

key = getkey()
  if (key == "k") {
  flaga = !flaga;
}
if (flaga == 1) {
servo.write(pozycja)
  pozycja++
  delay(30)
  }

Twraz masz tak jak pisales...naciskasz k i kreci aie, naciskasz ponownkie k i zatrzymać je serwo...i takie cos dla kazdego serwa...delay(30) decyduje o predkosci obrotu serwa

Edytowano przez farmaceuta
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

1 minutę temu, farmaceuta napisał:

No nie wierze....jako jedyny Ci pomoglem/odpowiedzialem w temacie, podalem Ci przyklady rozwiazania, zapytalem co zwraca funkcja jak nic nie wcisniete a ty dajesz mi negatywa??? Wczesniej nie dalo aie podziekowac bo sie nie chcialo ale negatywa to juz sie nauczyles dawac?? O ty bezczelny czlowieku!

Bardzo cię przepraszam przez przypadek kliknąłem 

przepraszam to nie byłospecjalnie

 

Link do komentarza
Share on other sites

38 minut temu, radek123 napisał:

Przepraszam że mi zajęło tak długo na odpowiedź. 

Lecz mam jeszcze jedno pytanie co jeżeli chce żeby serwo obracało się tylko wtedy gdy przycisk jest wciśnięty ?

Tak jak pisalem, musisz sprawdzic co jest zwracane jak guzik jest caly czas wcisniety, ja tego nie wiem i doradzic Ci nie moge...

Chodzi o to czy znak jest zwracany tylko raz czy ciagle, to wazna sprawa...jezeli ciagle to dobrze, jezeli jednorazowo to gorzej..trzeba wiedziec co zwraca funkcja jak nic nie jest wcisniete...serial monitor do tego sluzy..


key = getkey();
  Serial.println(key);

(Oczywiscie musisz w setup() wpisac Serial.begin(9600);

Link do komentarza
Share on other sites

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

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.