Pojazd (pierwsze uruchomienie) + podstawy (LEDy + przycisk)

Rozwija się projekt POJAZDU, a jednocześnie nauczane są podstawy Arduino (i programowania)…

  1. POJAZD
    1. praca nad sterowaniem pojazdem: wykorzystujemy sterownik Monster vnh2p30 o bardzo dobrych parametrach (maksymalny prąd nawet 30A! zasilanie 6-18V) i świetnej cenie (~25 zł). Sterowanie podobne jak w przypadku L298 (za pomocą dwóch sygnałów) – konieczne jest podłączenie sygnału PWM (lub innego pinu z Arduino i włączenie go na stałe na HIGH, czyli PWM=100%). Fajna stronka opisująca co i jak podłączyć – polecam.
    2. Można kupić PODWÓJNY sterownik, ale cena (o dziwo) nie jest już aż tak atrakcyjnaZnalezione obrazy dla zapytania monster vnh2p30
  2. PODSTAWY: LEDy + przycisk = REFLEKS. Poznajemy jak odczytać stan przycisku – małe wyzwanie: program REFLEKS: LED zapali się po losowym czasie, naszym zadaniem jest jak najszybsze wciśnięcie przycisku od razu po zaświeceniu LEDa. Mierzymy czas reakcji człowieka.  Ciągle polecam wirtualne Arduino do zabawy w domu!
  3. Poznaliśmy OPTYCZNY czujnik odległości E18-D80NK (5V, zakres 3-80cm, nie dźwiękowy!) – prosty w użyciu, a niedługo do wykorzystania w projekcie Pojazdu.

KG, 2018

Pojazd (mechanika + pierwsze uruchomienie) + podstawy (LEDy)

Rozwija się projekt POJAZDU, a jednocześnie nauczane są podstawy Arduino (i programowania) – jest więc mały chaos…

  1. POJAZD
    1. konstrukcja: podstawa z płyty wiórowej 18mm wymieniona na sklejkę 10mm, czyli cieńszą, aby koła pojazdy miały większy „prześwit”
    2. silniki to Pollolu 37Dx70L z wbudowanym enkoderem – silnik ma przekładnię 70:1 dzięki której na dość małych obrotach (150 obr/min) uzyskuje  moment obrotowy 1,39 Nm (co oznacza 14 kg*cm). Dodatkowo możemy oprogramować enkoder kwadraturowy o rozdzielczości 64 impulsy na obrót (po przełożeniu 4480 impulsów na obrót).
    3. Zasilanie silnika to 6V do 12V – co przekłada się odpowiednio na na obroty: 75 rpm do 150 rpm i na pobór prądu: średniego 250/300mA i maksymalnego 2.5A/5A. Widać, że będziemy potrzebować mocnego sterownika do tych silników (typowy L298 da radę z maksymalnie 1A – tylko!)
    4. Koło do tego silnika to oryginalne Pollolu 12cm
    5. Mocowanie silnika to wydrukowane w 3D na uczelnianej drukarce „chwytaki” (projekt własny):
  2. PODSTAWY: LEDy, czyli poznajemy jak włączać/wyłączać napięcie na pinach Arduino. Polecam wirtualne Arduino do zabawy w domu.

KG, 2018

Pierwsze zajęcia 2018/2019

Po ostatnich nieudanych zajęciach, ruszyliśmy pełną parą. Frekwencja dopisała – pojawiło się sześciu pięciu nowych członków koła, oraz trzech „starych wyjadaczy”, toteż ze względu na różnicę w umiejętnościach, podzieliliśmy się na 2 grupy.

Pięciu kadetów przeszło przez szybkie, aczkolwiek intensywne szkolenie teoretyczne i praktyczne z podstaw budowy i działania mikrokontrolera, obwodów elektrycznych oraz programowania Arduino. Pod koniec zajęć udało im się zaprogramować migające diody, na pewno są dumni ze swojego projektu – i słusznie, każdy przecież od czegoś zaczynał!

Starsi wyjadacze natomiast, dostali zadanie zapoznania się ze specyfikacją tajemniczego silniczka i jego sterownikiem. Testowali jego działanie tak, aby w przyszłości stał się częścią robota którego będziemy konstruować. Przyznam szczerze, że po wakacyjnej przerwie, potrzebowaliśmy chwili obycia się ze sprzętem, za którym jednak bardzo się stęskniliśmy. Poza tym, weszliśmy trochę na wyższy level zabawy, ponieważ operowaliśmy na wielokrotnie droższych rzeczach od tych, z którymi mieliśmy styczność wcześniej – przy budowie naszego samochodzika. Toteż tym bardziej musieliśmy się bardziej skupić i dokładnie przemyśleć nasze działania. Finalnie udało się poznać i zrozumieć specyfikę i działanie zarówno silnika jak i jego kontrolera. Pojawił się jednak problem przy implementacji kodu sterującego do Arduino, gdyż z niewiadomych przyczyn nie chciał on działać tak jak należy. Jednak że zajęcia dobiegały już do końca, stwierdziliśmy że poświęcimy temu więcej czasu na następnym spotkaniu – kto wie, może za tydzień nieznana siła sprawi że wszystko będzie działać prawidłowo?

O tym przekonamy się na następnym spotkaniu!

Przemysław Baj (c)

Pierwsze zajęcia… falstart :(

Na spotkaniu organizacyjnym ustaliliśmy, że spotykamy się co tydzień w piątki o 15tej.

Dzisiejsze zajęcia jednak przepadły z powodu szkolenia „pierwszaków” w tym samym terminie. Cóż – bywa (ja się o tym szkoleniu dowiedziałem przed samymi zajęciami, więc za późno by oficjalnie odwołać zajęcia u mnie). Ale ale, co się odwlecze, to nie uciecze 😉 Zapraszam w kolejne piątki (szkoleń już nie będzie).

KG, 2018

Startujemy! piątek, 5-10-2018

STARTUJEMY!

piątek, 5-10-2018, godz. 15:00

(dla studentów Wydziału Fizyki)

Będziemy bawić się/oprogramowywać Arduino, RaspberryPi (no sam nie wiem) i wiele gadgetów elektronicznych (silniczki, czujki, itd.). Co z tego powstanie? Inteligenty dom, robot, nocnik? 😉 Trudno powiedzieć, ale na pewno dużo się nauczysz (programować + konstruować proste układy elektroniczne). Obawiasz się, że mało umiesz z powyższych rzeczy? Zapraszam także „nowicjuszy”!

Jeśli jesteś zainteresowany, zapraszam na spotkanie organizacyjne w dniu 5-10-2018 (piątek), godz. 15:00, sala 1064.

(c) K. Gawryluk 2018

p.s.

nie było łatwo z doborem terminu – chodzi o dostępność sal, oraz o nie kolidowanie z zajęciami dla większości studentów. Inna propozycja spotkań to wtorki, godz. 16:15 – przedyskutujmy to na spotkaniu organizacyjnym.

 

Sesja lato 2018 — przerwa w spotkaniach

Sesja – wiadomo, studenci zaczynają się (w końcu!) uczyć. Oficjalnie ogłaszam więc przerwę na nasze spotkania – niech priorytetem będzie zaliczenie zajęć/labek/egzaminów. Piszcie do mnie na priv jeśli będziecie chcieli się spotkać i popracować nad „maskotką”.

Powodzenia w sesji! Niech moc będzie z Wami 😀

(c) K. Garwyluk 2018

 

XVI Podlaski Festiwal Nauki i Sztuki

W dniu 6 czerwca w ramach imprez festiwalowych na Wydziale Fizyki UwB odbyły się „Pierwsze spotkania z robotyką – Arduino”. To impreza dla ciekawskich ludzi chcących zapoznać się z programowaniem elektroniki. Na tych krótkich zajęciach (~60min) mogliśmy samodzielnie zbudować układ elektroniczny z LED-em, także z przyciskiem a następnie… oddać sterowanie płytce Arduino UNO i kazać jej włączać i wyłączać LEDa! Niektórym udało się podłączyć kilka LED-ów i świecić nimi niezależnie – gratuluję!

Grupa 11:00 – uczniowie I i III klasy z technikum budowlanego.

Grupa 12:00 – Lokalny Klub Kodowania 60+ przy Gminnej Bibliotece Publicznej w Orli (plus ojciec z synem – gratuluję zaangażowania!).

Przypominam, że każdy z uczestników może pobawić się dalej w Arduino bez jego kupowania – wystarczy skorzystać z wirtualnego Arduino ze strony www.tinkercad.com a także mojego mini-opisu co i jak robić.

Chciałbym podziękować swoim asystentom z koła naukowego robotyków Fi-BOT za pomoc przy „obsłudze” odwiedzających nas gości – Wasza pomoc była mi naprawdę zbawienna! Wielkie Dzięki dla Pana Przemka, Szymona i Mateusza !!

(c) K. Garwyluk 2018

 

TinkerCAD – wirtualne Arduino – dla początkujących (i nie tylko)

Wirtualne Arduino – czyli SYMULATOR płytki Arduino (ale także i prostej elektroniki). Dla kogo? Dla każdego, kto chce spróbować zabwy z Arduino. Nie trzeba więc kupować zestawu, wystarczy usiąść przed ekranem swojego komputera i bawić się płytką Arduino tak jak prawdziwą! Fajne, i za darmo!

Rejestracja

Projekt TINKERCAD jest własnością firmy AUTODESK i najpierw wymaga rejestracji. Zakładamy więc konto (darmowe) i dopiero wówczas możemy korzystać z serwisu.

Uprzedzam, że ani ja, ani Wydział Fizyki UwB nie jest powiązany z AUTODESK ani nie czerpie profitów z tego oprogramowania – polecam je jako bardzo ciekawe i łatwe w użyciu. Dodam, że jest to jedno z wielu dostępnych symulatorów Arduino – K. Gawryluk.

www.tinkercad.com

Zakładamy konto (o ile jeszcze nie mamy) wpisując powyższy adres i wybierając przycisk ZAREJESTRUJ SIĘ.

Prawy górny róg:

Potem postępujemy zgodnie z ekranami, podając swoje miejsce zamieszkania i datę urodzin:

podajemy też swój adres email i wybieramy hasło (proponuję też przyjrzeć się warunkom korzystania z usług – choć nie widzę tam „haczyków”):

Kolejny etap to już tylko potwierdzenie utworzenia konta – uruchamiamy swoją pocztę i potwierdzamy nadesłany email z Grupy Autodesk. Możemy już działać!

Po zalogowaniu – panel użytkownika

Z lewej strony widzimy swoje zdjęcie (o ile takie dodaliśmy), poniżej opcje tworzenia różnych projektów (bo TinkerCAD to nie tylko wirtualne Arduino!). W centralnej części mamy obrazki z naszymi wcześniejszymi projektami – oczywiście po założeniu nowego konta nie ma ich tyle, co na moim obrazku.

Ważne: TinkerCAD zapisuje automatycznie nasze projekty w „chmurze”, czyli możemy korzystać z nich wszędzie, na każdym komputerze (z dostępem do internetu – oczywiście). Jest to plus, ale i… minus! Często ładowanie projektów jest poooowooooolnneeeee (coż, nie jesteśmy jedynymi użytkownikami – to bardzo dobry i popularny serwis).

Wirtualna elektronika – nasz pierwszy obwód

Aby rozpocząć zabawę z elektroniką wybieramy sekcję Circuits – czyli (w wolnym tłumaczeniu) obwody elektroniczne. Sekcja ta zaznaczona jest na obrazku poniżej kolorem niebieskim (znajduje się zaraz pod naszym imieniem i nazwiskiem, lub nickiem).

Po wybraniu Circuits klikamy duży, zielony przycisk Create new Circuit (co tłumaczymy jako Tworzymy nowy obwód elektroniczny).

Brawo! Możemy rozpocząć dodawanie elementów elektronicznych! Gdzie je znaleźć? Proszę przyjrzeć się prawej stronie okienka z rozwijaną listą Components Basic. Na liście tej znajduje się sporo fajnych rzeczy – bateryjki, oporniki, płytka stykowa…

Proszę odnaleźć płytkę stykową – klikamy ją myszką i znajduje się ona na naszym wirtualnym biurku! Tak samo robimy z bateryjką 1.5V – klikamy i dodajemy!

Następnie wybieramy na biurku bateryjkę – klikamy ją myszką. Pojawia się dodatkowe menu z różnymi opcjami:

Można zmienić nazwę (hmmm…. chyba zbyteczne, choć może być przydatne w większych projektach), ale my zmieniamy liczbę bateryjek w zestawie – modyfikujemy pole Count  jak na rysunku powyżej. Mamy napięcie 4.5V !

Łączymy przewody – wystarczy kliknąć na wyprowadzenie z bateryjki (pojawia się też „dymek” z podpowiedzią – w języku angielskim) a następnie drugi raz kliknąć w innym miejscu – pojawi się połączenie przewodem.

Dodajemy kolejny przewód -warto dbać o porządek podczas pracy z elektroniką (także tą wirtualną!). Zmieniamy kolory przewodów w menu. Pamiętajmy, że dobrze jest oznaczać czarnymi przewodami „-” z bateryjki, a czerwonymi przewodami – bieguny „+”.

Dodajemy opornik (trzeba go najpierw odnaleźć z prawej strony – nazywa się Resistor). 

Proszę zmienić też wartość oporu: pole Resistance powinno być ustawione na 220 ohmów. Wirtualnymi elementami można obracać – użyj ikonki z lewej, górnej części ekranu:

Teraz dodajemy diodę elektroluminescencyjną (LED):

Pamiętajmy, że diody mają wyróżnioną polaryzację – dwie „nóżki”: anodę („+”) i katodę („-„) więc ważne jest, która nóżka jest która. Postaraj się zrobić tak, jak na rysunku powyżej.

Na koniec dodajemy ostatni przewód zamykający obwód elektryczny. Brawo – w ten sposób stworzyłeś wirtualny obwód!

Aby go uruchomić należy wybrać przycisk Start Simulatoin (uruchom symulację).

Jeśli wszystko dobrze podłączyłeś, LED powinien się świecić a Ty powinieneś się cieszyć, że wszystko działa! 

Co teraz? Może sprawdź parę rzeczy:

  • jak wpłynie większa wartość opornika w Twoim układzie? W tym celu zatrzymaj symulację (Stop simulation) i kliknij opornik – zmień mu wartość Resistance w menu na większą – 500 Ohm, 1000 Ohm a może nawet 10 kOhm? Po tej zmianie ponownie uruchom symulację.
  • a może tak przepalić LED-a? spokojnie, komputer nie ucierpi – ale Ty nauczysz się, że gdy wartość opornika będzie za mała – popłynie za duży prąd (tutaj: powyżej 20mA) i led „wybuchnie” (wirtualnie!).  W tym celu zatrzymaj symulację i zmień wartość opornika na bardzo mały, np. 22 Ohm, a może nawet 2 Ohm. Pamiętaj, aby nie robić tego z prawdziwym obwodem na własnym biurku!
  • można też zmienić napięcie zasilania układu – zatrzymaj symulację, wybierz myszą koszyk z bateriami i zmień pola Count, Type. Zauważ, że jest tam także możliwość dodania przełącznika: Build-In switch
  • zauważ, że możesz dodawać też multimetr – i robić pomiary aby sprawdzić, jaki prąd płynie w układzie lub jaki jest spadek napięcia na poszczególnych elementach elektronicznych!
  • poszukaj elementów, które możesz znać – wybierz przycisk (mikrostyk) i zbuduj taki układ:

Układ z Arduino UNO

Tworzymy nowy projekt – wracamy do głównego panelu wybierając kolorową ikonkę TIN KER CAD. Tworząc nowy układ automatycznie otrzymujemy zabawną nazwę (poniżej „Amazing Curcan-Hago”) – jeśli Ci nie pasuje, lewy klik na napisie i zmieniamy!

Ponownie wybieramy Circuits oraz Create new Circuit. Dodajemy elementy jak na zdjęciu poniżej:

Po dodaniu do układu płytki Arduino UNO  pojawiła się nowa opcja w menu Code (czyli programuj Arduino) – obok przycisku Start Simulation. Po wciśnięciu tego przycisku rozwinie się pole (z prawej strony) umożliwiające pisanie programu a raczej… budowanie go z „klocków” w stylu Scracha. Można z tego korzystać (co kto lubi), ale ja wolę się przełączyć na pisanie programu w języku C/C++

Zmieniamy więc pole Blocks na liście na Text i mamy program w C/C++

Zwróć uwagę, że ja zmodyfikowałem tekst programu: zamieniłem liczby 13 na 7 – gdyż u mnie LED podłączony jest do pinu numer 7 na płytce Arduino. Możemy już uruchomic symulację (Start Simulation) i Arduino będzie wykonywać nasz program! Zwróć też uwagę, że przewód podłączeniowy w tym momencie jest wciśnięty w Arduino.

Co dalej? Proponuję zatrzymać się w tym momencie i bawić się wirtualną płytką:

  • zmodyfikować program tak, aby LED świecił i i gasł nie w odstępie 1 sekundy, ale z przerwami co 2 sekundy
  • a może tak zmienić program, aby najpierw LED zaświecił się na 1 sek, zgasł na 1 sek, potem zaświecił się na 2 sek, zgasł na 1 sek, potem świecił się na 3 sek a zgasł na 1 sek – po tym cyklu wszystko ma się powtórzyć
  • można dodać więcej LED-ów – czy umiesz odtworzyć poniższy układ w wirtualnym Arduino?

Wyświetlacz 7-segmentowy

Dodawanie kolejnych LED-ów może być zabawne, ale czas teraz na wyświetlacz siedmio-segmentowy: znajdź go na liście komponentów elektronicznych (Components) i dodaj go na płytkę stykową

Zwróć uwagę, że możesz zmienić rodzaj wyświetlacza: wspólna anoda („+”) lub wspólna katoda („-„). To ma znaczenie! Podłączaj wyświetlacz wybierając piny z Arduino takie, jak lubisz, np.

a potem programuj! Zwróć uwagę, że kursor myszki nad wyświetlaczem wyświetla „dymek” z podpowiedzią, która nóżka co oznacza. Postaraj się stworzyć program wyświetlający wszystkie cyfty! Zacznij od 3-ki:

Teraz zaczyna się przygoda!

Tak, teraz możesz się bawić w programowanie elektroniki! Jest to bardzo bezpieczne, gdyż nawet jeśli coś źle połączysz (co się pewnie zdarzy) – to popsujesz tylko wirtualne Arduino! Jeśli jednak „złapiesz bakcyla” i będziesz chcieć więcej – kup prawdziwe Arduino z osprzętem (przewody, płytka stykowa, oporniki i LEDy) i baw się w rzeczywistym świecie (to jeszcze lepsza frajda – gwarantuję!). Jeśli jednak znudziła Cię ta zabawa – nic straconego, nie wydałeś ani złotówki – zamknij program i poświęć czas na swoje ulubione zabawy. Twój wybór.

Więcej? a może kolorowe LEDy RGB?

Zestaw elementów TinkerCADa ciągle się rozrasta i można już się „bawić” modułam WS2812B! Proszę spróbować:

Ws2812b oraz potencjometr

Czy tylko zabawa?

Pamiętaj, że wirtualne Arduino ze strony TINKERCAD to nie tylko „zabawa” dla początkujących – warto budować i sprawdzać swoje prawdziwe projekty, przed ich podłączeniem! Powodzenia!

(c) K. Garwyluk 2018
pochwal się ze mną swoimi projektami
k. gawryluk@uwb.edu.pl

Przygotowania + pianinko

XVI Festiwal przed nami – przygotowujemy się do pokazów. Przy tej okazji: poznajemy funkcję tone() w Arduino aby wydobywać dzwięki z podłączonego głośniczka. Działa! A jaki ubaw, gdy Mario-Bros brzmi z naszej maszynki (wiem wiem, cofamy się do lat ’80, ale… mimo to widzę zadowolenie na twarzach!).

Musieliśmy przypomnieć sobie działanie przycisków (ale nie modułów), tylko micro-styków. Dlatego rozmawialiśmy o INPUT_PULLUP (wbudowany rezystor podciągający) i dlaczego właśnie tak należy postępować z mikrostykami. Zrobiliśmy mini-pianinko:

Sprawa niby prosta – przycisk wciśnięty = graj dany ton, zwolniony = cisza. Ale ale… Okazało się, że trzeba mądrze programować przyciski!

(c) KG 2018

Optymalizacja sterowania

Słowem wstępu…

Dzisiejszego dnia pracowaliśmy nad optymalizacją naszego sterowania pojazdem.

Wciąż używamy do tego naszego smartfona, a konkretniej aplikacji „ArduinoRC”, która za pomocą bluetooth w naszym telefonie łączy się z modułem Bluetooth XM-15B podłączonego do Arduino. Więcej o tym w tym artykule.

Na poniższym zdjęciu nasz wypasiony „panel sterowania” 🙂

 

Dotychczas nasz program działał w dosyć prosty sposób – jeżeli Arduino odczytało określony znak z komunikacji szeregowej  bluetooth, to przekazywało do silniczka konkretne stany tak aby koła kręciły się na przykład w przód.

 

Poznaliśmy jednak głębszą teorię sterowania i pojawił się następujący problem:

A więc w aplikacji „ArduinoRC” klikamy strzałkę w górę. Załóżmy że przekazywany znak to literka 'W’, po odczytaniu której kółka mają się kręcić w przód.  Po przekazaniu jej komunikacją szeregową, Arduino posłusznie uruchamia silniczki, po czym je wyłącza. Gdy na telefonie tym razem przytrzymamy strzałkę, zamiast pojedynczego znaku 'W’, Arduino odczyta serie znaków – „WWWWWWWWWW … „. Po każdym z odczytanych znaków silniczki na chwilę staną, po czym po wczytaniu następnego – znowu ruszą. Taki efekt 'szarpania’ to nienajlepsze rozwiązanie ponieważ ciągłe włączanie i wyłączanie silniczka powoduje większe zużycie baterii. Więc zamiast sekwencji:

włącz(1) – wyłącz(1) – włącz(2) – wyłącz(2) – włącz(3) – wyłącz(3)

proponujemy logiczniejsza sekwencje:

włącz(1) – kontynuuj(2) – kontynuuj(3) – wyłącz(3).

Oczywiście nie zobaczymy tego problemu gołym okiem, ponieważ Arduino może odczytywać parę tysięcy takich znaków na sekundę.

Rozwiązanie problemu

Pomysłów na rozwiązanie tego problemu było parę, trzeba było jednak liczyć się z tym że Arduino to nie komputer stacjonarny i warto zrobić to w miarę możliwości optymalnie, aby nie zaśmiecać pamięci mikrokontrolera.

Z pomocą przyszła nam funkcja millis() z wbudowanej biblioteki, która zwraca czas który upłynął od włączenia urządzenia w milisekundach. Utworzyliśmy też parę pomocniczych zmiennych i utworzyliśmy sprytny sposób aby usprawnić pracę silnika.

Znowu użyłem swoich ponadprzeciętnych umiejętności artystycznych oraz zaawansowanego oprogramowania do obróbki graficznej (Paint i Gimp) aby stworzyć kilka schematów blokowych.

Przedstawiają one po kolei:

1. Działanie głównej pętli loop

Jak widać główna pętla programu Arduino będzie składała się z dwóch bloków: Obsługi Bluetootha, a potem Obsługi stopu silnika. Tak, tylko stopu silnika, bo uruchomienie silników zajdzie się w Obsłudze Bluetooth. Raz puszczone koła w ruch zatrzymają się dopiero w drugim bloku, po upływie określonego czasu. 

2. Działanie obsługi Bluetooth

Powyższy schemat koncentruje się tylko na jednej instrukcji – jedz do przodu (wczytanie W). Gdy już wszystko będzie dobrze działać – w podobny sposób trzeba dodać kolejne polecenia (zda do tylu, w lewo i w prawo). 

Sama obsługa instrukcji jazdy do przodu (obsługa 'W’) będzie obszerniej wytłumaczona za chwilę, ale już sam schemat algorytmu dużo może wyjaśnić:

3. Działanie obsługi odczytania znaku 'W’

Na początku, utwórzmy zmienną pomocniczą P i na razie przypiszmy jej liczbę 0. Będzie to zmienna przechowująca czas działania Arduino w milisekundach, po którego przekroczeniu nasze kółka przestaną się kręcić.

Zmienna DeltaT przechowywuje czas w milisekundach, przez jaki nasze kółka mają się kręcić po jednorazowym odczytaniu znaku. My akurat ustaliliśmy wartość 100 milisekund, jest to optymalna wartość przy której w praktyce nasza maszyna śmiga jak należy.

Dla lepszego wyobrażenia sobie tego o czym mowa, poniżej przedstawiłem oś przedstawiającą upływ czasu od włączenia Arduino. Zaznaczyłem zupełnie przypadkową wartość, akurat w tym przypadku oznacza, że minęło 10234 milisekund (czyli jakieś 10,2 sekund od włączenia urządzenia).

Kolejny krok w naszym schemacie to instrukcja warunkowa:

Czy P<milis() ?

W tej chwili Arduino wywołuje funkcje millis() i porównuje ją ze zmienną P. Między uruchomieniem urządzenia a wczytaniem znaku z naszego telefonu musiała minąć przynajmniej 1/1000 sekundy. Warunek zostaje więc spełniony – upływ czasu w milisekundach jest większy od 0. Przechodzimy więc do następnego bloku zgodnie ze schematem.

  1. P = millis() + DeltaT
  2. włączSilnik()

1.Zmienna P przyjmuje wartość sumy aktualnego upływu czasu   i   czasu przez jaki nasze kółka mają się kręcić po jednorazowym odczytaniu znaku.

2.Nasz silnik uruchamia się a wehikuł jedzie do przodu.

 

Tak jak wspominałem, zmienna P będzie przetrzymywała czas działania Arduino po którym silnik przestaje działać – teraz widzimy to na osi. Działa to mniej więcej w ten sposób:

  1. Wczytany został sygnał 'W’.
  2. Aktualnie minęło 10234 milisekund od czasu uruchomienia urządzenia.
  3. Silnik uruchamia się.
  4. Silnik ma pracować dopóki czas działania Arduino nie przekroczy 10334 milisekund.

Całkiem proste prawda? 🙂

To co opisałem do tej pory, to reakcja na pojedynczy znak 'W’. Jednak ja chcę aby mój samochodzik podjechał dwa metry do przodu, a co mi tam! Zobaczmy więc co zdarzy się jeśli przytrzymam strzałkę w aplikacji sterującej, a Arduino dostanie serie znaków „WWWWWWWWWWW … „.

Ok, analogiczna do powyższej sytuacja:

  1. Arduino odczytuje pojedynczy znak 'W’
  2. zmienna P przyjmuje odpowiednią wartość
  3. silniczek rusza

Jednak zanim minie nasze DeltaT czyli 100 milisekund, Arduino dostaje kolejny znak – kolejne 'W’. I co teraz? Wróćmy do naszego schematu blokowego nr 2 – tym razem zacznijmy działanie od instrukcji warunkowej (zmienne przypisuje tylko na początku działania programu) – i spójrzmy na poniższy wykres:

Aktualnie nasze P jest większe od czasu który upłynął dotychczas – rozpatrując więc działanie schematu blokowego, pierwszy warunek nie zostaje spełniony – wykonuje się instrukcja:

P = P + DeltaT

Czyli zmienna P która dotychczas przyjmowała konkretną wartość, powiększy się o kolejne DeltaT – czyli o 100. Oznacza to że czas działania urządzenia w którym silnik ma się wyłączyć wydłuża się o 100 milisekund.

Po odczytywaniu kolejnych znaków – analogicznie czas ten będzie się wydłużał. Będzie tym bardziej dłuższy, im dłużej przytrzymam strzałkę i im więcej znaków w jednej sekwencji odczyta Arduino. Przy tym warto zauważyć że w takiej sytuacji nasz silnik nie zatrzyma się, będzie działał dopóki trzymam strzałkę. Tak więc nasz problem został rozwiązany.

Na koniec ostatni blok programu – sprawdzenie, czy trzeba zatrzymać silniki.

4. Działanie obsługi stopu silników

 

PROGRAM i obiekty

Teraz zapoznajmy się z praktycznym kodem na Arduino. Naturalnie jest on obszerniejszy niż schematy blokowe, ponieważ obsługuje On całe działanie samochodu. W tym przykładzie zdecydowałem się na stworzenie klasy – jest to forma programowania obiektowego,  co umożliwia język C++. Różni się więc od poprzednich programów z fi-bot-a – gdzie programowaliśmy strukturalnie (język C). Opiszę więc komentarzem kluczowe linijki kodu których działanie opisałem wcześniej.

#include <SoftwareSerial.h>
#define RxD 2
#define TxD 3
#define IN1 4
#define IN2 5
#define IN3 6
#define IN4 7

SoftwareSerial btSerial(RxD,TxD);
unsigned long int przod = millis();                           
unsigned int delta_t=100;               

class Silnik      //w tym przykladzie zdecydowalem sie na stworzenie klasy - jest to forma 
{                 //programowania obiektowego co umozliwia język C++, a nie jak w poprzednich
  public:         //artykulach - tylko programowania strukturalnego a'la język C

  void wylaczSilnik()
  {
    digitalWrite(IN1,HIGH);
    digitalWrite(IN2,HIGH);
    digitalWrite(IN3,HIGH);
    digitalWrite(IN4,HIGH);
  }
 
  void doPrzodu()                        
  {
    digitalWrite(IN1,HIGH);
    digitalWrite(IN2,LOW);
    digitalWrite(IN3,HIGH);
    digitalWrite(IN4,LOW);
  }

  void doTylu()
  {
    digitalWrite(IN1,LOW);
    digitalWrite(IN2,HIGH);
    digitalWrite(IN3,LOW);
    digitalWrite(IN4,HIGH);
  }

  void wPrawo()
  {
    digitalWrite(IN1,HIGH);
    digitalWrite(IN2,LOW);
    digitalWrite(IN3,HIGH);
    digitalWrite(IN4,HIGH);
  }

  void wLewo()
  {
     digitalWrite(IN1,HIGH);
     digitalWrite(IN2,HIGH);
     digitalWrite(IN3,HIGH);
     digitalWrite(IN4,LOW);
  }
};

  Silnik Maria;

void setup() {
  Serial.begin(9600);
  Serial.println("start!");
  btSerial.begin(9600);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
 
}
              
void loop() {                          //schemat blokowy nr 1
  if(btSerial.available())             //schemat blokowy nr 3
  {
    char zn=btSerial.read();           
    Serial.println(zn);

   
    switch(zn)
    {
      case 'W':                        //schemat blokowy nr 2
      if(przod<millis())               
      {
        przod=millis()+delta_t;        
        Maria.doPrzodu();
      }

      else                              
      {
        przod+=delta_t;
      }

      break;

      case 'S':
      if(przod<millis())
      {
        przod=millis()+delta_t;
        Maria.doTylu();
      }

      else
      {
        przod+=delta_t;
      }
     
      break;

      case 'A':
      if(przod<millis())
      {
        przod=millis()+delta_t;
        Maria.wLewo();
      }

      else
      {
        przod+=delta_t;
      }
      break;
     
      case 'D':
      if(przod<millis())
      {
        przod=millis()+delta_t;
        Maria.wPrawo();
      }

      else
      {
        przod+=delta_t;
      }
      break;
    }
  }

  if(millis()>przod)                    //schemat blokowy nr 4
    {
      Maria.wylaczSilnik();             
    }
}

To by było na tyle, bądźcie na bieżąco 🙂

Pozdrawiam!

(c) Przemysław Baj 2018