Skocz do zawartości

Programowanie serwomechanizmu do poszczególnych przycisków


AlanB

Pomocna odpowiedź

Witam chciałbym stworzyć kod do serwomechanizmu a mianowicie :

Mam 5 przycisków i każdy będzie obok siebie i chciałbym tak zrobić aby np  przycisk 1 wciśnięty to serwo wykona obrót 30stopni , jeśli przycisk 2 Nie jest wciśnięty, to przechodzi do kolejnego przycisku, który jest wciśnięty. Jeśli sprawdzi wszystkie 5 to zatrzymuje się i oczekuje na kolejne wciśnięcie dowolnego przycisku. Wiem że to robi się funkcja if oraz else ale coś mi nie wychodzi.. 

Link do komentarza
Share on other sites

@Treker

#include <Servo.h>

 

Servo myservo;  

int czasnalewania=1800;

int przycisk = 4;

int pos = 0;    

 

void setup() {

  pinMode(8, OUTPUT);

  pinMode(przycisk, INPUT_PULLUP);

  myservo.attach(9);  

}

 

void loop() {

int buttonState = digitalRead(przycisk);

  Serial.println(buttonState);

  delay(1);

  if (buttonState == LOW) {

 

 

 

    myservo.write(35);              

delay(500);

  digitalWrite(8, HIGH);  

  delay(czasnalewania-700);                    

  digitalWrite(8, LOW);    

  delay(4000);

            

    myservo.write(60);              

delay(1500);

  digitalWrite(8, HIGH);  

  delay(czasnalewania-700);                    

  digitalWrite(8, LOW);    

  delay(4000);

                

 

    myservo.write(90);            

delay(1500);

  digitalWrite(8, HIGH);  

  delay(czasnalewania-700);                    

  digitalWrite(8, LOW);    

  delay(4000);

                

 

    myservo.write(120);              

delay(1500);

  digitalWrite(8, HIGH);  

  delay(czasnalewania-700);                    

  digitalWrite(8, LOW);    

  delay(4000);

                

 

    myservo.write(150);            

delay(1500);

 

  digitalWrite(8, HIGH);  

  delay(czasnalewania-700);                    

  digitalWrite(8, LOW);    

  delay(4000);

                

 

                

  }

}

 

 

bazuję na tym kodzie natomiast on dziala w ten sposób , że gdy przycisk zostałuruchomiony to serwo wykonuje ruchy przez 5 pozycji a zalezy mi na tym , aby np przycisk nr1 wciśnięty to serwo wykona ruch i nastepnie szuka kolejnego przycisku ktory jest wciśnięty (od 1 do 5 przyciskow)

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

#include <Servo.h>
 
Servo myservo;  
int czasnalewania=1800;
int przycisk = 2;
int przycisk2 = 4;
int przycisk3 = 7;
int pos = 0;    
 
void setup() {
  pinMode(8, OUTPUT);
  pinMode(przycisk, INPUT_PULLUP);
  pinMode(przycisk2, INPUT_PULLUP);
  pinMode(przycisk3, INPUT_PULLUP);
  myservo.attach(9);  
}
 
void loop() {

  
int buttonState = digitalRead(przycisk);
  Serial.println(buttonState);
  delay(2);
  if (buttonState == LOW) {
 myservo.write(30);              
delay(2000);
  digitalWrite(8, HIGH);   
  delay(czasnalewania-700);                     
  digitalWrite(8, LOW);    
  delay(4000);
  myservo.write(0); 

  
 int buttonState2 = digitalRead(przycisk2);
  Serial.println(buttonState2);
  delay(1);

  if (buttonState2 == LOW) {
 
 
 
    myservo.write(80);              
delay(500);
  digitalWrite(8, HIGH);   
  delay(czasnalewania-700);                     
  digitalWrite(8, LOW);    
  delay(4000);
  myservo.write(0);
 

  int buttonState3 = digitalRead(przycisk3);
  Serial.println(buttonState3);
  delay(1);

  if (buttonState3 == LOW) {
 
 
 
    myservo.write(120);              
delay(500);
  digitalWrite(8, HIGH);   
  delay(czasnalewania-700);                     
  digitalWrite(8, LOW);    
  delay(4000);
  myservo.write(0);
          
  
  }    
  delay(8000);         
  } 
  }
}

przepraszam za błąd z wklejeniem raz nie tego kodu .... a 2 w złym stylu . TO JEST aktualny kod na którym bazuje jak narazie działam z 3 przyciskami . Po wciśnięciu przycisku nr 1 jednocześnie wciskając nr 2 oraz nr 3 serwo ładnie przechodzi do każdego zadanego mu kąta. Natomiast teraz mam taki problem, że wciskając  sam przycisk nr 2 nic się nie dzieje tak samo z przyciskiem nr 3.  sekwencja ruchu dziala tylko jesli mam wcisniety przycisk nr1 a chcialbym tak ze niezalenie jaki przycisk wcisne to serwo tam wykona ruch . np : Wciskam nr 1 oraz nr3 serwo wykona ruch najpierw do przycisku 1 nastepnie pominie przycisk 2 i przejdzie do przycisku nr 3 .  Wciskam nr 2 oraz nr 3 serwo wykona ruch najpierw do przycisku 2 a pozniej przejdzie do przycisku nr3 itd itd ..@Santiago

Link do komentarza
Share on other sites

Teraz nieco więcej wiem i rozumiem :). Czyli 5 przycisków i w zależności od tego który jest naciśnięty  servo ma się obracać o x stopni. 

Nie rozumiem dlaczego jak naciśniesz np.1 to czeka na inne ? nie można ponownie nacisnąć 1 ? 

dlaczego czasnalewania = 1800  - 700  za każdym razem ?

Ja bym to zrobił tak :

 sprawdź przycisk 1, wciśnięty to rusz servo  na pozycje x1 i odczekaj

sprawdź przycisk 2, wciśniety to rusz servo  na pozycje x2 i odczekaj

........

sprawdź przycisk 5, wciśnięty to rusz servo na pozycję x5 i odczekaj

Link do komentarza
Share on other sites

@Santiago właśnie jestem zielony z programowania i początek tego kodu jest zaczerpany z forum więc do końca nie rozumiem sam tych ustawionych czasów jednakże działa to prawidłowo względem uruchomienia przekaźnika na ten czas (-700) chce właśnie aby serwo dokładnie tak działało właśnie aby ustawiało się do każdego przycisku ale i  żeby też działało jak będą również jednocześnie inne przyciski wciśnięte czyli przycisk 1 oraz 3 to serwo w jednym ruchu podjedzie najpierw do 1 wykona działanie i od razu przejdzie do 3 itp . Teraz właśnie jakoś tak mam zrobione ze wychodzi na to że przycisk 1 jest jakby "matka" i dopiero jak on jest wciśnięty to ogarnia resztę przycisków...

Link do komentarza
Share on other sites

Najlepiej napisz co chcesz osiągnąć , oraz w jaki sposób.  Teraz dochodzi jakiś przekaźnik... Napisz tak - serwo ma 5 pozycji, mam 5 przycisków , naciśnięcie przycisku powoduje ustawienie serwa na odpowiednią pozycję oraz uruchomienie przekaźnika na jakiś czas. 

po tej czynności wszystko wraca do stanu oczekiwania na wciśnięcie przycisku. 

Czy kolejność naciskania przycisku ma znaczenie ? - to jest ważne .

czy mogę naciskać 1  3  1 ?  czy muszę (co jest dziwne) czekać na 4 albo 5 ?

 

Doczytałem ze zrozumieniem - teraz rozumiem :), jak masz wciśnięte jednocześnie 1,2,3,4,5 przycisków to ma serwo zrobić po kolei co jest wciśnięte. OK.  

Co jednak gdy wszystko nie zostało zakończone , a ktoś sobie wesoło wciska przyciski ?  (to nie problem).

Pytanie jednak czy potrzebujesz to dzisiaj czy w czwartek ? Algorytm już się pisze w głowie :).

Edytowano przez Santiago
Link do komentarza
Share on other sites

Dnia 24.09.2024 o 15:33, AlanB napisał:

Mam 5 przycisków i każdy będzie obok siebie i chciałbym tak zrobić aby np  przycisk 1 wciśnięty to serwo wykona obrót 30stopni , jeśli przycisk 2 Nie jest wciśnięty, to przechodzi do kolejnego przycisku, który jest wciśnięty. Jeśli sprawdzi wszystkie 5 to zatrzymuje się i oczekuje na kolejne wciśnięcie dowolnego przycisku. Wiem że to robi się funkcja if oraz else ale coś mi nie wychodzi.. 

Algorytm wydaje się bardzo prosty. Przyciski są ponumerowane od 1 do 5. Pozycja startowa - #0; Serwo ustawia się kolejno do przycisków, które są wciśnięte. Jeśli jest 6 pozycji równomiernie rozstawionych to kolejnym pozycjom odpowiada zmiana wypełnienia o 50 (255/5 = 51) wypełnień impulsów PWM. Kolejne pozycje miałyby wypełnienia: 0, 51, 102, 153, 204 i 255. Istotną sprawą jest kąt rozmieszczenia przycisków, który powinien być taki aby przy wypełnieniu 255 znajdował się ostatni - przycisk #5. Zakres wypełnienia może być mniejszy np. zaczynać się od 10 i kończyć na 250. Wówczas zmiana wypełnienia będzie następowała co 240/5 = 48.

Przykład

Zakres wypełnienia 0 - 255. Wciśnięty pierwszy przycisk #1 oraz wciśnięte przyciski #3 i #5. Serwo dostaje kolejno sygnały sterujące:

0. pozycja startowa (wypełnienie 0);

1. ustaw na pozycji #1 i zaczekaj na wykonanie operacji (wypełnienie 51);

2. ustaw na pozycji #3 i zaczekaj na wykonanie operacji (wypełnienie 153);

3. ustaw na pozycji #5 i zaczekaj na wykonanie operacji (wypełnienie 255);

4. Powróć do pozycji #0 (wypełnienie 0);

Link do komentarza
Share on other sites

@AlanB Niestety jestem chory i nic nie zrobię. Zwróć uwagę , że na filmie każdy kieliszek ma czujnik  (to by upraszczało kod, oraz zapobiegało nalewaniu do pełnego kieliszka, albo nieobecnego).  Skoro jednak chcesz mieć 6 przycisków  to nie ma sprawy. 

Link do komentarza
Share on other sites

@Santiago życzę zdrowia 😉 wstępnie już coś udało mi się stworzyć , natomiast muszę coś wymyśleć bo jeśli Arduino wykona wszystkie kody itd. to jeśli nie zabierzmy kieliszka w ciągu 10s to znowu zaczyna się nalewać. Musiałbym coś zastosować że nawet jak kieliszek długo stoi na czujniku to żeby restowała się  jego komenda dopiero po ponownym postawieniu kieliszka 

Link do komentarza
Share on other sites

7 minut temu, AlanB napisał:

Musiałbym coś zastosować że nawet jak kieliszek długo stoi na czujniku to żeby restowała się  jego komenda dopiero po ponownym postawieniu kieliszka 

Podpowiem, byś pomyślał czy da się to zrobić pętlą while oraz jeżeli tak to jakie będą tego zalety i wady 😉

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.