Aby robot mógł się poruszać, potrzebuje silnika. Najlepiej dwóch. Podpięcie ich bezpośrednio pod Arduino i sterowanie wyjściowym napięciem pozwoli nam jedynie na poruszanie silnika w jednym kierunku. Problem pojawi się, kiedy będziemy musieli cofnąć się robotem do tyłu, bądź wykonać skręt. Z pomocą przyjdzie nam tu dwukanałowy mostek H, dzięki któremu zyskamy pełną kontrolę nad silniczkiem z poziomu Arduino.
Co nam będzie potrzebne?
- L293D – dwukanałowy sterownik silników (3,50 PLN)
- Dwa silniczki 3-6V (11-14 PLN), bądź przekładnia podwójna Tamiya 70097 (49 PLN z silnikami w zestawie)
Plusem płynącym z zakupu przekładni jest jej kompatybilność z podwoziem gąsienicowym Tamiya 70100 (39,90 PLN) oraz uniwersalną płytką montażową Tamiya 70098 (25 PLN). Nic nie stoi jednak na przeszkodzie, aby nasz robot był zbudowany na własnoręcznie stworzonej platformie z starego samochodziku, bądź z mocnego, sztywnego kartonu – to od Was zależy, jak będzie on wyglądał.
Montaż na płytce stykowej
Sterownik L293D wymaga podpięcia zasilania 5V do części logicznej. Silniczki najlepiej jest zasilić oddzielnie, ja wykorzystuję w tym celu 4 baterie AA podpięte szeregowo. Mostek H powoduje spadek napięcia wyjściowego o ~2V, więc takie zasilanie jest wystarczające dla silniczków 3V, lecz za niskie dla 6V. Jeśli chcemy podpiąć takie silniczki, możemy zastosować akumulator LiPo 7.4V.
PWM możemy podpiąć bezpośrednio pod zasilanie 5V Arduino, wtedy silniczki będą kręcić się z pełną mocą, co za tym idzie stracimy możliwość jej modyfikowania. W kodzie źródłowym ich moc ustawiona jest na 80%.
Sterowanie silniczkami
Po prawidłowym zmontowaniu układu możemy przystąpić do kręcenia silnikiem. Jeśli któryś z nich został podpięty odwrotnie (minus do plusa, co spowoduje kręcenie w przeciwnym kierunku), nic się nie stanie i będziemy mogli poprawić to z poziomu kodu źródłowego, bądź zmieniając podłączenie dwóch przewodów.
[codesyntax lang=”c”]
// 4-kanałowe sterowanie radiowe int A = 3; int B = 5; int C = 2; int D = 4; // Silnik #1 int S1Tyl = 13; int S1Przod = 12; int S1PWM = 11; // Silnik #2 int S2Tyl = 8; int S2Przod = 9; int S2PWM = 10; // coming soon... int surprise0 = 0; int surprise1 = 1; void setup() { Serial.begin(9600); while(!Serial); pinMode(A, INPUT); pinMode(B, INPUT); pinMode(C, INPUT); pinMode(D, INPUT); pinMode(S1Przod, OUTPUT); pinMode(S1Tyl, OUTPUT); analogWrite(S1PWM, map(80, 0, 100, 0, 255)); //80% mocy pinMode(S2Przod, OUTPUT); pinMode(S2Tyl, OUTPUT); analogWrite(S2PWM, map(80, 0, 100, 0, 255)); //70% mocy } void loop() { int A_ = digitalRead(A); int B_ = digitalRead(B); int C_ = digitalRead(C); int D_ = digitalRead(D); //aby robot się zaczymał, jeśli nie odbierze sygnału if(A_ == LOW && B_ == LOW && C_ == LOW && D_ == LOW) { Serial.println("A- B- C- D-"); digitalWrite(S1Przod, LOW); digitalWrite(S2Przod, LOW); digitalWrite(S1Tyl, LOW); digitalWrite(S2Tyl, LOW); } if(A_ == HIGH) { //przod Serial.println("A+"); digitalWrite(S1Przod, HIGH); digitalWrite(S2Przod, HIGH); digitalWrite(S1Tyl, LOW); digitalWrite(S2Tyl, LOW); } if(B_ == HIGH) { //tyl Serial.println("B+"); digitalWrite(S1Przod, LOW); digitalWrite(S2Przod, LOW); digitalWrite(S1Tyl, HIGH); digitalWrite(S2Tyl, HIGH); } if(C_ == HIGH) { //lewo Serial.println("C+"); digitalWrite(S1Przod, LOW); digitalWrite(S2Przod, HIGH); digitalWrite(S1Tyl, HIGH); digitalWrite(S2Tyl, LOW); } if(D_ == HIGH) { //prawo Serial.println("D+"); digitalWrite(S1Przod, HIGH); digitalWrite(S2Przod, LOW); digitalWrite(S1Tyl, LOW); digitalWrite(S2Tyl, HIGH); } delay(100); }
[/codesyntax]
Dzień dobry.
Właśnie szukałem czegoś takiego – robot (2 silniczki) + Arduino Uno + sterowanie radiowe.
Byłoby super gdyby zechciał pan zamieścić graficzny obraz połączeń. Mam wnuka w wieku lat 16 i szukam czegoś co mógłbym budować razem z nim. Mimo, że jak sam Pan pisze, stron jest wiele, to mało jest takich czytelnych i prostych jak Pańska.
Ukłony
maciek