• 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
Sterowanie silnikiem-kilka funkcji
#1
Witam wszystkich. Mam na imię Daniel, i Arduino zajmuję się od niedawna. Przyszedł mi do głowy pomysł projektu, w którym wykorzystał bym moduł zdalnego sterowania oraz Arduino. Moduł RC to prosty układzik wyciągnięty z zabawkowego samochodu, który działał na zasadzie O/I. Zamysł był taki, by układ RC podłączyć do wejść cyfrowych w Arduino, Który miał by zliczać impulsy i konwertować je na stopnie wychylenia serwa, w moim przypadku prędkość silnika. Silnik sterowany jest regulatorem modelarskim, który działa na takiej samej zasadzie jak serwo. Po podłączeniu układu, napisaniu i wgraniu kodu wszystko działa jak należy. Arduino w zależności od sygnału (pin 0 jazda do przodu, pin 1, stopniowe zatrzymanie) odejmuje lub dodaje impulsy, przelicza na stopnie i steruje silnikiem. Problem tkwi w tym, że aby cały układ zareagował na przyciśnięcie przycisku na pilocie, przycisk trzeba trzymać wciśnięty około 3-4 sekundy. To tylko silnik, do tego dojdzie jeszcze kierunek (taka sama zasada działania) i czujnik odległości, (po dojechaniu do przeszkody, auto ma się zatrzymać i zawrócić). Jaka jest możliwość zmniejszenia czasu czekania na efekt? dziękuję za wszelkie porady.
mój kod:

Kod:
#include <Servo.h> //Biblioteka odpowiedzialna za serwa
 
Servo silnik;
int RUCH = 0;
int PRZOD = 0;
void setup()
{  
 silnik.attach(6);
 pinMode(0, INPUT_PULLUP);
 pinMode(1, INPUT_PULLUP);
 silnik.write(180);
 delay(2000);
 silnik.write(0);
 delay(2000);
}

void loop(){
if (  digitalRead(0) == LOW) { // jeśli przyciśnięte, dodaj 10 do ruchu
 RUCH = 10 + RUCH;
} else {
 RUCH= RUCH;
}
if (  digitalRead(1) == LOW) { // jeśli przyciśnięte, odejmij 10 od ruchu
 RUCH = RUCH - 10;
} else {
 RUCH = RUCH;
}
PRZOD = map(RUCH, 0, 5, 90, 180); //przelicz na stopnie
delay(200);
silnik.write(PRZOD); // poruszaj silnikiem
delay(200);
}

Ps.: Linijki poruszające silnikiem w funkcji setup, służą do zalogowania się regulatora.
 
Odpowiedź
#2
Witam
Tak sobie przeglądam stare posty i zatrzymałem się przy Twoim.
Rozumiem, że jak moduł był podłączony wcześniej tylko do zabawki to wszystko reagowało od razu (nie po 4 sek.) TAK?
Więc według mojej opinii są trzy  problemy:
1) po co dodajesz/odejmujesz 10? dodawaj/odejmuj 1
2) musisz sprawdzać jakieś zakresy (MIN,MAX) dla tych dodawanek, po to aby ich nie przekroczyć.
3) błąd w funkcji map - ta funkcja konwertuje wartości z jednego zakresu (parametr 2 i 3) na inny zakres(parametr 4 i 5). Czyli jakaś wartość (tutaj twój licznik) ma zmieniać się od 0-5 a w wyniku masz mieć 90-180. Zdajesz sobie sprawę, że serwo przy takiej konwersji będzie mocno skakało? Niech licznik zlicza impulsy w szerszym zakresie (np 0-50).  
Ten dziwny czas 4 sek. być może bierze sie stąd właśnie, że zakres do konwersji masz 0-5 a tylko w jednym kroku (za jednym przyciśnięciem pilota) zmieniasz wartość o 10 jednostek. Bez sensu. Jak program ma trafić w ten zakres 0-5 skoro skok jest co 10. trafi co najwyżej w 0. :-)
Pozdrawiam
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości