Ta strona używa ciasteczek (plików cookies), dzięki którym może działać lepiej. Dowiedz się więcejRozumiem i akceptuję

Kurs budowy robotów – #4 – pierwsze programowanie

Roboty 06.01.2017 Damian (Treker)

Jeśli nasz robot stoi już na 3 kołach, to możemy spokojnie zabrać za główną część kursu, czyli programowanie. Nie użyjemy gotowej biblioteki, wszystko napiszemy wspólnie od pustego szkicu. Dzięki temu opisane zagadnienia będzie można łatwo zastosować przy innych projektach.

Zajmiemy się również częstym problemem, który pojawia się podczas budowy pierwszych robotów.

Nawigacja serii artykułów:
« poprzednia część

» Pokaż/ukryj cały spis treści «

Kup zestaw elementów i zacznij naukę w praktyce! Przejdź do strony dystrybutora »

Na tym etapie zakładam, że każdy zapoznał się już z wykorzystywanym shieldem, który opisałem w 2 części tego kursu. Co więcej, obok Waszego komputera powinien stać już złożony robot, który jest gotowy do programowania.

W kursie skupimy się na budowie i programowaniu robotów, nie ma więc tutaj miejsca na opis podstaw Arduino. Osoby, które będą miały problemy z podstawami programowania będę starał się odsyłać do odpowiednich miejsc kursu Arduino.

Aby nie uszkodzić robota i napędów…

Zanim robot ruszy warto wprowadzić w życie kilka nawyków, które znacznie zmniejszą szansą na uszkodzenia konstrukcji. Podczas programowania odłączaj zasilanie dopływające do napędów (za pomocą odpowiedniej zworki na shieldzie). Dzięki temu robot m.in. nie spadnie z biurka…

W celu odłączenia zasilania wystarczy również po prostu zdjąć powyższą zworkę.
Nie trzeba koniecznie przekładać jej na pozycję OFF.

Przy założonej zworce zasilania napędów w pozycji ON (i włączonym zasilaniu)
na płytce powinna się świeci dioda opisana jako MOT.

Staraj się unikać sytuacji, gdy koła robota będą zablokowane. Konkretnie chodzi o sytuacje, w których dostarczamy prąd do silników, ale przez zablokowanie kół nic się nie dzieje. Może tak się zdarzyć, gdy trzymamy robota za koła i blokujemy ich ruch ręką lub np. gdy podczas jazdy wjedzie on w jakąś przeszkodę i będzie cały czas próbował „wjechać w ścianę”.

Sytuacja taka jest groźna z dwóch powodów. Po pierwsze możliwe są uszkodzenia mechaniczne kół, silników oraz przekładni. Po drugie, podczas zatrzymania silników znacznie rośnie pobierany przez nie prąd, może to doprowadzić do przegrzania układu sterującego napędami.

Producent deklaruje, że układ ma wbudowane zabezpieczenia, które powinny go ochronić. Zawsze jednak istnieje jakieś ryzyko – lepiej unikać takich sytuacji.

Bezpieczne wgrywanie nowego programu

Podczas wgrywania programów staraj się postępować zgodnie z poniższymi krokami:

  1. Zdejmij zworkę zasilania napędów.
  2. Podłącz przewód USB i włącz zasilanie przełącznikiem suwakowym.
  3. Wgraj nowy program.
  4. Odłącz przewód USB.
  5. Wyłącz zasilanie.
  6. Załóż zworkę zasilania napędów.
  7. Postaw robota na ziemi (lub trzymaj w powietrzu za sklejkę).
  8. Włącz zasilanie.

Najniebezpieczniejsza sytuacja, to podłączony przewód USB, założona zworka
zasilania napędów i zasilanie wyłączone przełącznikiem. Wtedy silniki będą zasilane
z portu USB, co może doprowadzić do uszkodzenia robota i komputera!

Zestaw elementów do budowy robota

Gwarancja pomocy na forum dla osób, które kupią poniższy zestaw!

Części pozwalające wykonać ćwiczenia z kursu budowy robotów dostępne są w formie gotowych zestawów! W komplecie znajdują się elementy mechaniczne (w tym koła i silniki), baterie oraz shield!


Kup w Botlandzie »

Sterowanie silnikami z użyciem mostka H (DRV8835)

Nasze Arduino może sterować silnikami korzystając z pośredniczącego układu – mostka H. Silniki pobierają zbyt duży prąd, aby można je było bezpiecznie podłączyć do mikrokontrolera.

Podstawy pracy z mostkami H były opisane w 8. części kursu podstaw Arduino.

Podstawy opisane w tamtym artykule są nadal aktualne, jednak wykorzystany tutaj mostek (DRV8835) wymaga odrobinę innego, prostszego sterowania. Nasz shield łączy mostek H z Arduino tylko za pomocą 4 sygnałów. Dwa z nich odpowiadają za kierunek obrotów, a pozostałe za prędkość silników:

  • Pin 4 odpowiada za kierunek obrotów silnika lewego.
  • Pin 5 (PWM) odpowiada za prędkość silnika lewego.
  • Pin 6 (PWM) odpowiada za prędkość silnika prawego.
  • Pin 9 odpowiada za kierunek obrotów silnika prawego.

Zasada działania dla poszczególnych silników jest następująca:

Przykładowo kręcenie lewym silnikiem do przodu z prędkością XX wymaga:

  • ustawienia na wyjściu nr 4 sygnału 0,
  • ustawienia  na pinie nr 5 sygnału PWM o wypełnieniu XX.

Kręcenie tym samym silnikiem do tyłu wymagałoby następującego sterowania:

  • ustawienia na wyjściu nr 4 sygnału 1,
  • ustawienia  na pinie nr 5 sygnału PWM o wypełnieniu XX.

Natomiast zatrzymanie silnika wymaga:

  • ustawienia na wyjściu nr 4 sygnału o dowolnej wartości,
  • ustawienia  na pinie nr 5 sygnału PWM o wypełnieniu 0.

Uwaga! Konkretne kierunki (przód/tył) zależą również od sposobu podłączenia
przewodów od silników – więcej o tym w dalszej części artykułu.

Pierwszy test silników w praktyce

Pora na pierwszy, prosty program. Na razie sprawdzimy tylko, czy oba silniki działają poprawnie. Zarówno na shieldzie, jak i na podwoziu ze sklejki oznaczone są silniki robota lewy (L – left) i prawy (R – right). Oczywiście strony te są umowne, bo konstrukcja nie ma jednego przodu i równie dobrze może jeździć odwrotnie… Załóżmy teraz, że miejsce z zamontowanym Arduino jest tyłem.

Zanim przejdziesz dalej upewnij się, że przewody od lewego silnika (L na podwoziu)
podłączone są do lewego gniazda silników (L na shieldzie). Oczywiście analogicznie
prawy silnik (R), do prawego gniazda (R).

Zacznijmy od wprowadzenia definicji pinów oraz ich konfiguracji. Będziemy stosować skróty, które pozwolą na szybką identyfikację wyprowadzeń:

  • L (left) – lewy,
  • R (right) – prawy,
  • DIR (direction) – kierunek,
  • PWM – pin, na który podajemy sygnał PWM ustawiający prędkość danego silnika.

Przykładowo L_DIR oznacza pin Arduino, którym wybieramy kierunek obrotów lewego silnika.

Teraz pora uruchomić lewy silnik. Zacznijmy od prostego włączania i wyłączania. Cały program może wyglądać następująco:

Na razie podczas testów korzystaj jedynie z PWM w zakresie 0-100!
Większa wartość może uszkodzić silniki – więcej informacji w dalszej części!

W powyższym programie podświetliłem jedną linię. Jest ona umieszczona tam nadmiarowo. Jeśli na pinie L_PWM ustawiamy 0, to stan L_DIR nie zrobi nam już różnicy – silnik będzie wyłączony. Linia ta jednak nie zaszkodzi (można ją tam zostawić) – dodałem ją dla lepszego zobrazowania sytuacji.

Efekt działania tego programu widoczny jest na filmie, oczywiście uniosłem dla testu przód robota, aby nie uciekł mi z kadru!

Jeśli silnik się nie kręci – sprawdź koniecznie, czy zielone wtyczki są poprawnie zamontowane na przewodach od silników! Wewnątrz złącza powinien znaleźć się tylko odsłonięty kawałek przewodu bez izolacji!

Zanim przejdziesz dalej upewnij się, że w Twoim robocie kręci się ten sam, lewy silnik. Jeśli tak nie jest to należy zamienić miejsca wtyczek w shieldzie (prawy z lewym silnikiem). Jeśli kręci się lewy silnik, ale w przeciwną stronę, to są dwa wyjścia:

  1. Możesz zamienić kolejność przewodów we wtyczce od silnika lewego.
  2. Nie rób teraz nic – „poprawimy” to później programowo.

Niezależnie od wybranej metody zanotuj sobie teraz, w którą stronę kręci się lewy silnik, gdy na pinie L_DIR ustawiona była wartość 0. W moim wypadku zapisuję, że silnik kręci się „do przodu”, a poprawniej mówiąc – przy takich obrotach robot porusza się do przodu.

Test ponawiamy dla drugiego silnika:

Po uruchomieniu tego programu musi kręcić się silnik prawy. Dobrze by było, aby kierunek obrotów zgadzał się z wcześniej testowanym silnikiem lewym. Jeśli tak nie jest, to znów masz dwa wyjścia:

  1. Zamień kolejność przewodów we wtyczce od silnika prawego.
  2. Nie rób teraz nic – „poprawimy” to później programowo.

Tak samo jak poprzednio zanotuj sobie, w którą stronę kręci się silnik prawy, gdy na R_DIR jest 0. W moim przypadku będzie to „do przodu”, czyli tak samo jak w przypadku silnika lewego.

Dla wygody dobrze byłoby doprowadzić do sytuacji, gdy po podaniu 0
na piny DIR oba silniki będą kręciły się w tę samą stronę (niezależnie którą).

Zadanie dodatkowe 4.1

Sprawdź jak zachowują się silniki dla innych wartości PWM. Trzymaj się nadal zakresu 0-100. Czyli przykładowo zobacz, co dzieje się, gdy ustawisz prędkość „50”: analogWrite(R_PWM, 50); Sprawdź, czy silniki kręcą się tak samo dobrze dla niskich wartości PWM itd.


Kolejnym etapem będzie napisanie kilku funkcji, które pozwolą na łatwe sterowanie silnikami (bez pamiętania o wartościach DIR itd). Jednak zanim do tego przejdziemy, to wyjaśnię skąd wcześniej wzięło się ograniczenie maksymalnej wartości PWM do 100…

Ograniczenie prędkości (bezpieczne napięcie maks.)

Jak powinieneś pamiętać z kursu podstaw Arduino (część 5) podczas korzystania z PWM możemy regulować wypełnienie od 0 do 255, gdzie 0 to 0% wypełnienia, a 255, to 100% wypełnienia. Przed testami poprosiłem wstępnie, aby operować wypełnieniem z zakresu 0-100, co przekładało się na regulację od 0% do około 40% wypełnienia. Skąd takie ograniczenie?

Cały robot zasilany jest z 6 baterii AA, co daje maksymalnie 6*1,5V = 9V. Było to niezbędne do poprawnej pracy całej konstrukcji i właśnie takie napięcie możemy dostarczyć do silników – jednak byłoby to dla nich zabójcze. Zastosowane napędy pracują najlepiej, gdy są zasilane ~5V.

Najprościej zabezpieczyć więc silniki poprzez
ograniczenie maksymalnego wypełnienia sygnału PWM.

Wcześniej narzucona wartość 100 była jedynie przykładowa, nie chciałem od razu tłumaczyć skąd wzięła się dziwna wartość maksymalna 165 – bo właśnie takie największe wypełnienia można ustawiać. Wartość ta stanowi około 65% wypełnienia PWM.

Skąd wzięła się ta wartość? Została dobrana eksperymentalnie zamiast silników podłączyłem do robota woltomierz i sprawdzałem napięcie, które pojawia się tam w zależności od wybranego PWM. Dla 165 zmierzyłem lekko ponad 5V, co będzie bezpieczną wartością – szczególnie, że z czasem baterie będą się trochę rozładowywać.

Pomiar napięcia dopływającego do silników przy wybranym PWM.

Dodajmy od razu na samej górze programu kolejną definicję:

Od razu wyjaśnia się też sprawa dlaczego przy zbyt małym wypełnieniu PWM silniki nie ruszają, tylko wydają piski. Poniższej pewnego napięcia zasilającego napędy te są zwyczajnie za słabe, aby poruszyć naszego robota.

Więcej informacji o sterowaniu z wykorzystaniem PWM
znaleźć można w kursie elektroniki, poziom II.

Łatwe funkcje sterujące napędami

Pora zabrać się za napisanie funkcji, które usystematyzują powyższe informacje i pozwolą na łatwe programowanie robota. Do napisania są 3 funkcje. Dwie, to osobne sterowanie lewym/prawym silnikiem. Trzecia będzie zatrzymywała robota.

Każdy może zbudować ten mechanizm zgodnie ze swoimi upodobaniami. Ja w swoich robotach najczęściej korzystam z mechanizmu, który pozwala sterować kierunkiem i prędkością silników za pomocą 1 liczby. Wywołanie funkcji leftMotor(95); sprawi, że silnik będzie kręcił się do przodu z 95% maksymalnej prędkości. Natomiast leftMotor(-95); będzie odpowiadało za obroty z taką samą prędkością, ale do tyłu.

Znak liczby odpowiada za kierunek („+” do przodu, „” do tyłu),
natomiast wartość odpowiada za procent maksymalnej prędkości.

Zaczynamy od pustej funkcji typu void, ponieważ nie będzie ona zwracała żadnej wartości. Jako argument przyjmować będziemy jedną liczbę typu int. Typ ten może przechowywać liczby dodatnie i ujemne, więc sprawdzi się tu idealnie.

Oczywiście nazwa zmiennej w argumencie może być dowolna.
Ja wybrałem V, bo jest to popularne oznaczenie prędkości w fizyce.

W kolejnym kroku należy rozróżnić, czy silnik ma się kręcić do przodu, czy do tyłu:

Nie musimy dokładnie zastanawiam się, co w przypadku, gdy prędkość będzie 0, ponieważ tak, czy inaczej będzie to oznaczało zatrzymanie silnika (kierunek nie będzie miał znaczenia). W kolejnym kroku uzupełnijmy część dla silnika kręcącego się do przodu:

Funkcja map() pomaga nam przeskalować prędkość. Tutaj używamy jej do przeliczenia wartości procentowej prędkości 0-100%, na wypełnienie sygnału PWM 0-165 (PWM_MAX). Oczywiście w zaznaczonej linijce musimy wpisać odpowiednią wartość L_DIR, dla której silnik kręcił się do przodu. W moim przypadku zgodnie z wcześniejszymi testami wpisałem 0.

Ostatni etap, to wysterowanie silnika do tyłu. Należy jednak pamiętać, że w tym przypadku nie da się od razu ustawić wypełnienia PWM o wartości V, ponieważ zmienna ta będzie przechowywała wartość ujemną! Tutaj pomocna będzie funkcje wbudowana w Arduino, która zwraca nam wartość bezwzględną liczby (czyli bez znaku).

Mowa o abs(). Dla jasności, przykłady:

  • Wywołanie abs(10) zwraca 10
  • Wywołanie abs (-10) również zwraca 10, itd.

Wracając do przykładu z silnikiem, cała funkcja sterująca lewym silnikiem powinna wyglądać tak:

Dla testu warto teraz uruchomić program, który powinien wysterować silnik szybko do przodu, a po chwili trochę wolniej do tyłu:

Gdy test ten przebiegnie pozytywnie można dodać analogiczną funkcję dla silnika prawego. Opis kolejnych kroków byłby identyczny, więc ograniczę się do wklejenia gotowej funkcji:

Funkcja zatrzymująca robota

Oczywiście korzystając z powyższych dwóch funkcji można również zatrzymywać robota, ale czasami wygodna będzie osobna, krótka funkcja, która zrobi wszystko „sama”. W celu zatrzymania robota wystarczy na pinach od PWM ustawić dowolne wypełnienie PWM równe 0.

Tym razem funkcja nie musi przyjmować żadnych argumentów:

Gotowy szkielet programu z funkcjami

Podstawowy program, który będzie pozwalał na łatwe zabawy z robotem wygląda więc tak:

Możliwe ruchy robota

Teraz warto zastanowić się nad ruchami, które może wykonywać robot. Mamy tutaj napęd, który składa się z dwóch niezależnie sterowanych silników. Brak kół skrętnych, więc nie możemy tutaj mówić o sterowaniu jak w samochodzie. Bliżej nam tutaj do czołgu, który napędzany jest dwiema gąsienicami.

Obroty i skręty będzie można wykonywać sterując
prędkościami i kierunkami obrotów poszczególnych silników.

Jazda do przodu i do tyłu

Pierwsza, podstawowa możliwość robota to jazda do przodu lub do tyłu. Tutaj sprawa jest całkiem oczywista. Jeśli oba koła kręcą się w tym samym kierunku i z tą samą prędkością to robot pojedzie w daną stronę. Są od tego pewne wyjątki, ale o tym później…

Aby uzyskać taki efekt należy wydać następujące polecenia. Dla jazdy do przodu:

Dla jazdy do tyłu:

Obrót względem koła

Jeśli robot będzie kręcił tylko jednym z kół, to nasza konstrukcja będzie jechała po małym łuku. Dokładniej mówiąc będzie się obracała dookoła tego nieruchomego napędu.

W celu wykonania takich manewrów należy wydać następujące polecenia. Dla obrotu względem lewego koła:

Dla obrotu względem prawego napędu:

Ten sposób wykonywania obrotów jest
jednak wykorzystywany dość rzadko.

Obroty w miejscu

Jedną z ciekawszych możliwości czołgów jest obrót wykonywany dosłownie w miejscu. Tak będzie mógł również zachować się nasz robot. Wystarczy, że koła będą kręciły się w przeciwne strony:

W celu wykonania takich manewrów należy wydać następujące polecenia. Dla obrotu w lewo:

Dla obrotu w prawo:


Oczywiście możliwe są również inne opcje. Sterując silnikami z różną prędkością będziemy mogli poruszać się po łukach itd. Zachęcam do sprawdzenia opisywanych wyżej metod w praktyce. Dajcie znać w komentarzach, jeśli uzyskaliście jakieś ciekawe efekty! Szczególnie mile widziane wszystkie materiały wideo!

Testy możliwych ruchów w praktyce

Teraz możesz już samodzielnie napisać programy, które sprawdzą jak robot radzi sobie z jazdą. Sposób realizacji przykładowej trasy (jazda do przodu przez sekundę, obrót w miejscu przez dwie sekundy, jazda do tyłu przez sekundę) wygląda następująco:


Poniżej widoczne są moje próby z innymi programami i ustawieniami, zachęcam do takich testów:

Dlaczego robot „nie potrafi” jechać prosto?

Wielu początkujących jest bardzo zasmucona, gdy po wydaniu komendy „jazda do przodu” widzi, że robot nie zachowuje się zgodnie z oczekiwaniami. Często mimo zadania takich samych obrotów na oba silniki ich faktyczna prędkość będzie różna.

Spowoduje to jazdę po łuku. Tak niestety będzie, ale nie jest to nic złego. Powodów jest wiele. Należy pamiętać, że silniki, przekładnie i koła, to elementy mechaniczne… Nic nie jest idealne. Zawsze jeden silnik będzie trochę szybszy, jedna przekładnia będzie stawiała trochę większy opór, a jedno koło będzie mniej przyczepne.

Jazda „prosto” często okazuje się łukiem…

Suma takich błędów będzie powodowała, że robot zawsze będzie skręcał, w którąś ze stron. Jazda po prostej to dość „skomplikowane zadanie”. Konstrukcje, które muszą jechać prosto wyposaża się w droższe napędy, często dodaje się również czujniki (enkodery), które mierzą faktyczną prędkość obrotów silnika. Zastosowanie bardziej zaawansowanych programów pozwala wtedy jechać prosto.

Tym tematem nie będziemy zajmować się w kursie. Zainteresowani powinni poczytać na temat regulatorów ze sprzężeniem zwrotnym np. PID.

„Krzywa” jazda nie jest wcale problemem!

Jazda po prostej jest potrzebna w nielicznych sytuacjach. Teraz testujemy zachowanie robota ze sztywno zaprogramowanymi operacjami, więc jazda po łuku będzie widoczna.

Jednak docelowo chcemy zbudować prawdziwego robota, czyli układ, który oprócz
napędów ma czujniki będące „oczami” naszego pojazdu!

W kolejnej części kursu dodamy mechaniczne czujniki przeszkód, które uchronią robota przed zderzeniem ze ścianą. Zamiast jechać ślepo prosto w przeszkodę będzie on mógł reagować na otoczenie i odpowiednio zmieniać prędkości silników.


Jeśli różnica w obrotach silników jest stosunkowo duża lub przeszkadza komuś bardzo mocno, to można pokusić się o prostą korektę błędu w programie. Wystarczy zmniejszyć trochę PWM_MAX dla szybszego silnika. Rozwiązanie to jednak może okazać się zgubne. Polecam je jedynie w formie testów. Podczas dalszych części kursu naprawdę nie trzeba się tym przejmować.

Zadanie dodatkowe 4.2

Napisz program realizujący jazdę po następującej trasie:

Zadanie dodatkowe 4.3

Napisz program realizujący zadanie płynnego zwiększania oraz zmniejszania prędkości:

Podsumowanie

W tej części kursu ożywiliśmy nasz pojazd, który może teraz poruszać się po zaprogramowanych trasach. W ramach ćwiczenia polecam napisać kilka programów, dzięki którym robot będzie umiał pokonać wymyślone przez Was trajektorie np. jazda po prostokącie, elipsie, kręcenie ósemek itd.

W kolejnym artykule zajmiemy się mechanicznymi czujnikami przeszkód, co pozwoli na pierwszą autonomiczną jazdę naszego pojazdu. Tym razem będzie umiał samodzielnie omijać przeszkody!

Autor kursu: Damian (Treker) Szymański
Grafiki, ilustracje: Piotr Adamczyk

» Pokaż/ukryj cały spis treści «

Kup zestaw elementów i zacznij naukę w praktyce! Przejdź do strony dystrybutora »

Powiadomienia o nowych, darmowych artykułach!

Komentarze

ZombiZiomek

10:57, 07.01.2017

#1

Dioda się świeci, a koła stoją :-/

__________

Komentarz dodany przez: Treker

Problem rozwiązany, przyczyna: niepoprawnie założone wtyczki na przewody od silnika.

qbeczek

13:09, 07.01.2017

#2

Nie wiem jak to się stało, że wcześniej tego nie zauważyłem, ale generalnie to nie mam zworki, da się to jakoś zastąpić?

Treker
Autor wpisu
Administrator

13:13, 07.01.2017

#3

ZombiZiomek, przy tak małej ilości informacji ciężko udzielić odpowiedzi. Nie wiadomo, czy i jaki program wgrałeś, czy podłączone jest zasilanie (koszyk z bateriami) itd. Artykuł pisany był na podstawie dokładnie takich elementów jakie są w zestawie (przynajmniej nic mi nie wiadomo o żadnych zmianach). Jeśli jesteś przekonany, że wszystko zrobiłeś identycznie jak w artykule i nic nie blokuje napędów, to musisz przedstawić trochę więcej szczegółów - jakieś zdjęcie, opis, co dokładnie zrobiłeś, czy program z poprzedniego artykułu działał itd.

Przy okazji proszę Cie o trochę wyrozumiałości, odpisywałem na Twoje maile rano, wieczorem, w tygodniu, w piątek, który był dniem wolnym, dziś w sobotę, która z reguły też jest dniem wolnym, więc wysyłanie kolejnych maili nie przyspieszy moich odpowiedzi.... Po prostu też czasami nie siedzą przy komputerze, jak tylko jestem dostępny to staram się na wszystko odpowiadać.

qbeczek, właśnie się okazało, że chyba faktycznie do kilku osób trafiły płytki bez zworek. Oczywiście doślemy, jeśli będą potrzebne. Na ten moment można sprawę rozwiązać przekładając jedną zworkę, z tych które było przy czujnikach. Inna opcja to wykorzystanie przewodu żeńsko-żenskiego do zestawów uruchomieniowych :)

ZombiZiomek

13:54, 07.01.2017

#4

Ok, wgrywalem program testowy i ten gotowy z funkcjami, wszystko robilem wg kursu, zasilanie jest, kable przy silniku sie trzymają, a silniki się nie kręcą

qbeczek, ja użyłem poprostu innej zworki.

Treker
Autor wpisu
Administrator

14:02, 07.01.2017

#5

ZombiZiomek, ok teraz przynajmniej coś widać :) Będę miał dostęp do swojego robota koło 16 to wtedy wszystko porównam i dam znać. Do tego czasu sprawdź dla pewności, czy dla wyższego PWM również się nic nie dzieje (np. 150), czyli wgraj dokładnie ten kod:

#define L_PWM 5

#define L_DIR 4

#define R_PWM 6

#define R_DIR 9

#define LED 13

void setup() {

//Konfiguracja pinow od mostka H

pinMode(L_DIR, OUTPUT);

pinMode(R_DIR, OUTPUT);

pinMode(L_PWM, OUTPUT);

pinMode(R_PWM, OUTPUT);

pinMode(LED, OUTPUT);

}

void loop() {

//Obroty silnika przez sekundę do przodu z prędkością 100

digitalWrite(L_DIR, 0); //Ustawienie kierunku

analogWrite(L_PWM, 150); //Ustawienie predkosci

digitalWrite(LED, 0); //Zmiana stanu diody

delay(1000); //Opoznienie 1 sekunda

//Zatrzymanie silnika na sekundę

digitalWrite(L_DIR, 0); //Ustawienie kierunku

analogWrite(L_PWM, 0); //Wylaczenie silnika

digitalWrite(LED, 1); //Zmiana stanu diody

delay(1000); //Opoznienie 1 sekunda

}

Jak rozumiem silniki nie wydają też żadnego dźwięku, tak? Jeśli masz miernik, to sprawdź czy na złączach silnika lewego pojawia się jakieś napięcie (możesz mierzyć przykładając miernik do śrubek w złączu).

Elvis

14:05, 07.01.2017

#6

Jeśli mogę coś doradzić, to proponowałbym do kodu dodać jakąś migającą diodę. Wtedy będzie wiadomo czy program został poprawnie wgrany i czy procesor robi to co powinien.

__________

Komentarz dodany przez: Treker

Właśnie w tej samej chwili edytowałem wklejony program i to dodawałem ;)

ZombiZiomek

14:14, 07.01.2017

#7

Program wgrany, dioda mruga silniki nic nie robią i nie wydają dżwięków. Miernika niestety nie mam.

Treker
Autor wpisu
Administrator

14:16, 07.01.2017

#8

ZombiZiomek, ok dziękuję za informację - sprawdzę moje pomysły w praktyce i dam znać po 16. Jeśli ktoś inny ma podobny problem (niedziałające silniki), to proszę o informację wraz z datą zakupu zestawu, będziemy wtedy badać temat z producentem shieldów.

ZombiZiomek

14:17, 07.01.2017

#9

Treker, Dzięki :D

qbeczek

14:41, 07.01.2017

#10

U mnie jeden działa, tzn lewy, a prawy niestety nie. Tak samo jak u kolegi dioda mruga a silnik stoi.

__________

Komentarz dodany przez: Treker

Problem rozwiązany, przyczyna: niepoprawnie założona wtyczka na przewód od silnika.

Treker
Autor wpisu
Administrator

14:44, 07.01.2017

#11

qbeczek, powyższy program ma właśnie wysterować jeden silnik - więc wszystko jest dobrze. Drugi możesz sprawdzić kolejnym programem umieszczonym w artykule.

qbeczek

14:49, 07.01.2017

#12

Właśnie o to mi chodzi, wgrałem program na lewy działa, sprawdzam prawy nie działa, ale już znalazłem błąd jest w połączeniu silnika, bo zmieniłem wejścia i lewy działa w wejściu na prawy.

Treker
Autor wpisu
Administrator

14:53, 07.01.2017

#13

qbeczek, czyli winny jest u Ciebie prawy silnik, tak? Sprawdź dla pewności, czy masz poprawnie założone wtyczki (może przypadkiem zacisnęły się na izolacji kabla)?

qbeczek

15:20, 07.01.2017

#14

Dokładnie tak było, źle były zaciśnięte kable... Dzięki Treker, jesteś naprawdę cierpliwy. Pozdrawiam! :)

Treker
Autor wpisu
Administrator

16:12, 07.01.2017

#15

qbeczek, cieszę się, że już wszystko działa :)

Może w takim razie to samo rozwiąże problem kolegi ZombiZiomek? Spróbuj odkręcić i jeszcze raz założyć wtyczki na kable od silników. Pamiętaj, aby wewnątrz złącza znajdował się odsłonięty kawałek przewodu, a nie izolacja.

buchbuch

19:42, 07.01.2017

#16

Prawie jak Colobot: motor(30,-30); tylko chwytaka brak ;)

Zobacz wszystkie komentarze (23) na forum

FORBOT Damian Szymański © 2006 - 2017 Zakaz kopiowania treści oraz grafik bez zgody autora. vPRsLH.

Relacja z 3D Show – Tragi druku przestrzennego, Warszawa

W piątek odwiedziłem największe w Polsce targi druku przestrzennego 3D...

Zamknij