• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Silnik i pilot
#1
Lightbulb 
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);
 

}
 
Odpowiedź
#2
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.
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#3
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.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości