Skocz do zawartości

Przytrzymanie przycisku wykonuje obrót servem


Pomocna odpowiedź

Napisano

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

 

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

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ź

(edytowany)
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

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 ?

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

 

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

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