Arduino Polska Forum

Pełna wersja: Silnik i pilot
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Witam, dysponuje arduino UNO i chciałbym za pomocą pilota radiowego z zestawu (takiego z czterema przyciskami) sterować silnikiem krokowym. Jednak jest problem, gdyż program "nie chce" jednocześnie sprawdzać czy wysłana jest nowa dana dt. silnika i poruszać silnikiem. Próbowałem  ruszać kawałek i czekać chwilę lecz takie rozwiązanie mnie nie satysfakcjonuje. Trwa to zbyt długo. Poniżej załączam kod.
Kod:
#include <StepperMotor.h>

StepperMotor motor(8,9,10,11);
void setup(){
pinMode(3, INPUT);
pinMode(4, INPUT);
pinMode(5, INPUT);
pinMode(6, INPUT);//piny od pilota
Serial.begin(9600);
}
 int bieg = 4;
 int tempo;
 int krok;


void loop(){

 
 while (digitalRead(3) == LOW && digitalRead(4) == LOW && digitalRead(5) == LOW && digitalRead(6) == LOW) {

 }  
 while (digitalRead(3) == HIGH) {  // Button 1 pressed
   if (bieg<7)
   {bieg++;
    break;
   }
 
 }
 
 while (digitalRead(4) == HIGH) {  // Button 2 pressed
 if (bieg>1)
   {bieg--;
    break;
   }
 }  
 
 while (digitalRead(5) == HIGH) {  // Button 3 pressed
 
 }
 
 while (digitalRead(6) == HIGH) {  // Button 4 pressed

 }
 

 while (bieg>0)
 {
 
   if(bieg==1)
     {
     tempo=1;
     krok=-100;
     break;
     }else if(bieg==2)
     {
     tempo=2;
     krok=-100;
     break;  
     }else if(bieg==3)
     {
     tempo=3;
     krok=-100;
     break;  
     }else if(bieg==4)
     {
      Serial.println("muj beg jest 4");
     tempo=0;
     krok=0;
     return;
     
     }else if(bieg==5)
     {
     tempo=3;
     krok=1oo;
     break;  
     }else if(bieg==6)
     {
     tempo=2;
     krok=100;
     break;  
     }else if(bieg==7)
     {
     tempo=1;
     krok=100;
     break;  
     }

 }
 Serial.println(bieg);
 Serial.println(krok);
 Serial.println(tempo);
 Serial.println("|/\/\/\/\/\/\/\/\/\|");
motor.setStepDuration(tempo);
motor.step(krok);
 

}
Zacząłbym od poprawienia przejrzystości programu.
Pętlę:
Kod:
   while (bieg>0)
   {
   ...

   }
zamieniłbym na switch {...}.
Nie bardzo rozumiem co w środku tej pętli robi 'return'


Obsługę przycisków zamieniłbym na if { } bo pętla 'while' jest tu niepotrzebna i wstrzymuje program na tak długo jak aktywne jest dane wejście.
Witam,
UNO wykonuje instrukcje sekwencyjnie, z tego też względu nie można czegoś zrobić jednocześnie.
Co do samego kodu, przykro mi to pisać, ale według mnie całą pętlę loop() musiałbyś napisać od nowa. Z pewnością będzie do szybciej niż ją poprawiać.
Pozdrawiam.