Sporo brutalnej „zabawy” w drwala z ręczną piłką 😛 i choć nie wygląda to za dobrze – to zadanie wykonane! Otwory powiększone i koła zamocowane.
Wypada umieścić słowo wyjaśnienia: nie chcieliśmy zdejmować obudowy Maskotki aby powiększyć te otwory (z pewnością to by ułatwiło sprawę). Obudowa przytwierdzona jest do podwozia wkrętami stolarskimi więc ich ponowne wkręcenie nie gwarantowałoby trzymania obudowy. W takim razie lepiej zrobić nowe otwory – ale to z kolei pozostawi wiele (niepotrzebnych) otworów. Dlatego więc męczyliśmy się z powiększaniem otworów z założoną obudową.
Wieloklik
Sprawa rozwojowa – zliczanie klików to za mało, teraz poprzeczka poszła w górę i Pan Marek zlicza dwukliki i trzykliki (są takie wyrazy w języku polskim? jak nie, to już są ;-).
Ostatnia prosta – ekranik Nokii. Zamontowany (wszystko udało się upchać do środka!) ale co najważniejsze – działa od pierwszego podłączenia (sam Autor projektu się tym zdziwił). Trzeba było jedynie zmniejszyć kontrast, bo Nokia zasilana przez Arduino podłączone do PC-ta miała inne napięcie niż Nokia zasilana z Arduino z dedykowanym zasilaczem (niby mały szczegół…).
Pan Bartek rozbudował menu – można poruszać się (przewijać) po wszystkich plikach z katalogu na karcie SD, nie tylko kilku pierwszych. To istotne usprawnienie.
Przerwa świąteczna – kiedy kolejne spotkanie?
Zapraszam w piątek 3 stycznia 2020 r. o godz. 12:00.
A jednak znowu piłka do drewna (płyty)… Otwory za wąskie na koło z mocowaniem. Bywa…
Czujka pola SS49E
Znana na zajęciach Fi-BOTa i powraca ponownie. Tym razem w połączeniu z kolorymi kółkami WS2812b. Odczytujemy czujkę i w zależności od wartość pola zaświecamy tyloma LEDami ile trzeba. Na dodaek nasza czujka odczytuje dwa bieguny, w szkole „kolorowane” na kolor niebieski i czerwony – właśnie tak i my będziemy swiecić! Prace w toku….
Maszyna 2D3D
No to sporo pracy z tą wymianą ekraniku z OLEDa na Nokie 5110. Pan Bartek zaprezentował własne moduły ułatwiające połączenia i niebawem (na Gwiazdkę?) może będzie wszystko działać 😉
Przerwa świąteczna – kiedy kolejne spotkanie?
Zapraszam w poniedziałek 23 grudnia 2019 o godz. 12:00.
Sporo manualnej pracy z tą Maskotką… Czasami elektronik/progamista musi się „urbrudzić” i popracować trochę najprostrzymi narzędziami – śrubokrętem, piłką do metalu lub do drewna (u nas: płyta wiórowa). No tak, ale zadanie poszerzenia otworów na koła bez demontażu obudowy – wykonane!
Wieloklik
Nowy projekt – może niekoniecznie duży, ale baaaardzo użyteczny. Fajnie, że ktoś sam się tym zainteresował i zrealizował. Szczegóły na stronie projektu.
Po całogodzinnej zabawie udało się zrealizować Wieloklika – brawo! Pozostał jedynie malutki szczególik do dopracowania, ale to już za tydzień.
Plany z Maskotką są duże: 1) wymiana kół (co wiąże się z powiększeniem otworów w podstawie Maskotki), 2) zrobienie profesjonalnej konsoli sterującej – a wszystko to do polowy stycznia 2020. Zobaczymy 😉
W kolejnym tygodniu wymiana kół – piłowanie nadwozia – oraz prace nad konsolą? Zobaczymy!
Pan Przemek (na moją prośbę) zabrał się za Maskotkę i wymienił w niej sterowanie: zamiast modułu Bluetooth wstawił radiówkę nRF24. Trudność polegała na zrozumieniu tego, co już zostało zrobione na płycie głównej Maskotki, co jak jest tam sterowane, co wyłączyć i co gdzie podłączyć… Udało się – moduł podłączony poprawnie, sprawdzony w działaniu z tekstowym protokołem.
Warte zapamiętania: ponieważ większości pinów na pierwszym Arduino UNO została już wykorzystana, zaszła konieczność podłączenia modułu nRF24 w dość niestandardowy sposób – pin CS radiówki został połączony z A0 Arduino. To spora rozrzutność, ale cóż zrobić, gdy nie ma już wolnych pinów cyfrowych w Arduino? Został „poświęcony” analogowy, który może działać jako cyfrowy input i właśnie działa! Potrzeba matką wynalazców 😛
W kolejnym tygodniu wymiana kół i komunikacja pomiędzy dwoma Arduino UNO w Maskotce.
Kolejne spotkanie z kolorowymi paskami LEDów WS2812B – tym razem sterowane potencjometrem.
UWAGA: TinkerCAD (czyli „wirtualne Arduino”) został wzbogacony właśnie o omawiane moduły RGB. Trzeba przyznać, że działają całkiem fajnie — dlatego zachęcam do zabawy nawet dla osób, które nie mają ich w realu!
Zadanie do wykonania
Zaświecić LEDem o numerze zgodnym z ustawioną wartością na potencjometrze. Inne LEDy mają być wyłączone. Kręcimy potencjometrem – „przesuwamy” LEDa. Kolor LEDa? Twój ulubiony 😉
Pozycję potencjometru odczytujemy przez funkcję analogRead(A0) – o ile środkowy pin potencjometru został podłączony do pinu A0 właśnie. W potencjometrze podłączone są także piny do GND i 5V w Arduino – zgodnie z powyższym rysunkiem.
Numer LEDa – dzielenie całkowite!
analogRead(a) zwraca wartość z przedziału 0..1023, natomiast my mamy tylko (aż?) 16 LEDów. Należy więc przeliczyć wartość a analogRead() na numer pinu… w prosty sposób:
nr = analogRead(A0)*16/1024; //dobrze!
Ważna jest tutaj kolejność obliczeń, bo gdy napiszemy
nr = 16/1024*analogRead(A0); //źle :-(
to choć z matematycznego punktu widzenia oba wyrażenia są równoważne, to jednak w drugim przypadku najpierw wykonuje się dzielenie – a jest tutaj dzielenie całkowite (bo zarówno 16 jak i 1024 są liczbami całkowitymi) więc wynosi zero. A zero mnożone przez cokolwiek da zawsze zero. Pierwszy wzorek jest poprawny, bo najpierw wykonamy mnożenie analogRead(A0)*16 a dopiero potem wynik tego iloczynu dzielimy (dzielenie całkowite, ale teraz nie przeszkadza) – i otrzymujemy liczbę z przedziału 0..15.
Dyskoteka – czyli efekt stroboskopu
Skoro mamy już ustalony numer LEDa, to teraz możemy zgasić wszystkie inne, a potem zaświecić tego konkretnego – o numerze nr właśnie. Ale ale… za chwilkę ponownie ustalimy położenie potencjometru, ponownie wyliczmy nr LEDa i co – ponownie zgasimy wszystkie, aby włączyć ten o numerze nr? Obawiam się, że w związku z wyłączaniem i włączaniem otrzymamy efekt „dyskoteka” (stroboskopu). Poza tym to nieprofesjonalne 😛
Powyższy kod rozwiązuje efekt stroboskopu – dzięki dodatkowej zmiennej poprzedni zapamiętujemy, który LED był ostatnio włączony. W głównej pętli programu ustalamy numer LEDa zgodnego z ustawieniami potencjometru, ale „akcja” dzieje się tylko wówczas, gdy zmieniliśmy ustawienia potencjometra. Dobrze dodać wypisywanie na monitor szeregowy informacji tylko wóczas, gdy dzieje się „akcja” – dzięki temu mamy pewność, że napisy (a tym samym i sama „akcja”) wykonuje się jedynie w przypadku zmian ustawień potencjometru.
Uwaga #1 – int VS float
Proszę zwrócić uwagę, że zarówno zmienna nr jak i zmienna poprzedni są zadeklarowane jako int, co w zupełności wystarczy – nie ma potrzeby używać arytmetyki liczb rzeczywistych (powolnych, szczególnie na Arduino).
Uwaga #2 – być bardziej PRO 😛
Zwróć uwagę, że wywołuję funkcję pixels.show() tylko wówczas, gdy coś się zmieniło – niby po co miałbym wołać tą funkcję za każdym razem w loop()-ie, niezależnie od tego, czy coś się zmieniło czy nie? W końcu pixels.show() programuje LEDy zgodnie ze wcześniejszymi ustawieniami pixels.setPixelColor(), więc nie ma senesu wołać ją bez potrzeby.
Zadanie #2 (także tinkercad)
Zmienić kod tak, by świeciły się LEDy od pierwszego do tego konkretnego, zgodnego z ustawieniami potencjometru. Unikać efektu „dysko”.
Zadanie #3
Joystick to dwa potencjometry – można tu go wykorzystać i oprogramować tak, by ruch na osi X zmieniał numer LEDa (jak dotychczas), a ruch na osi Y zmieniał kolor – w jakiś zabawny sposób (może tęcza?). Proszę się pochwalić wynikami!
Otrzymaliśmy zaproszenie do uczestnictwa w szkoleniach dla studentów – PZU oferuje bilety PKP oraz jeden ciepły posiłek.
Dni Otwartego Biznesu trwają od 2 do 13 grudnia 2019 r. Każdy dzień poświęcony jest innemu zagadnieniu. Tematy omawiane na szkoleniach to m.in. robotyka, DevOps, sprytne utrzymanie aplikacji i wiele więcej. Obejrzyj załącznik z wszystkimi tematami warsztatów, opisami i datami.
Każdy ma możliwość zapisania się na wszystkie warsztaty jednak otrzyma zaproszenie tylko na jeden dzień szkoleń.
Szkolenia odbywają się w Warszawie w siedzibie Grupy PZU (około 10-15 min od dworca PKP). Organizator zapewnia każdemu uczestnikowi bilety PKP oraz ciepły posiłek w czasie warsztatów. Szkolenia odbywają się w godzinach 10-17.
Każdy z uczestników otrzymuje certyfikat potwierdzający zdobycie nowych kwalifikacji. Szkolenia prowadzone są przez menadżerów co najmniej średniego szczebla.
Kolejne spotkanie z kolorowymi paskami LEDów WS2812B zapętlonymi w koło – sterowane potencjometrem. Dla nowych studentów to fajna zabawa – odczytujemy napięcie funkcją analogRead() a efekt przekładamy na wędrujący w kole piksel… Prace trwają 😉
Dwie strony naszego kółka wyświetlają różne kolory – rozpoczynamy od góry kółka, gdzie kolejne piksele zapalają się co zadany interwał czasu, a po „dotarciu” do środka kółka – piksele wracają (gaszą się). Ale… lewa strona jest cztery razy szybsza niż prawa strona. Na dodatek nie można używać funkcji delay()!
D E M O
Brawo dla Pana Łukasza!
Monster – moduł sterownika silnika DC
Mocny sterownik do silników DC – prąc pracy 12A (chwilowy 30A), napięcie pracy 16 V – bije na głowę poczciwego L293x i dlatego jest MONSTEREM 😉 12A to brzmi dumnie, ale w postaci BEZ RADIATORA to możemy pracować do 6A.
Układ nazywa się VNH2SP30 i jest warty polecenia, ale uwaga – w wielu sklepach (nawet tych renomowanych) można kupić uszkodzone sterowniki, które kręcą kółkami tylko w jedną stronę! Sprzedawcy wymieniają wadliwe sztuki, ale piszę to w celu zaoszczędzenia nerwów – gdy coś nie działa a powinno.
Generalnie wszystko jest proste: 5V, GND do odpowiednich na Arduino, INA oraz INB do dowlonych pinów w Arduino, którymi chcemy sterować silniczkiem (tak samo jak w L293x), ale pin PWM musi być podłączony do Arduino – w przeciwnym razie sterowanie odbywa się z ZERO procent mocy. Pin EN (enabled) może być podłączony do 5V w Arduino, choć i tak jest w stanie wysokim, więc układ jest włączony, pin CS to diagnostyczny, na razie pomijamy (odczytuje prąd pracy układu, temperaturę…). Silnik podłączamy do OUTA oraz OUTB, natomiast zasilanie do + (plus) oraz – (minus) po przeciwnej stronie modułu – uwaga na właściwą polaryzację! Tutaj ważne jest ten plus i minus, oby nie odwrotnie!
No i ostatnia ISOTONA kwestia: zasilanie musi być przynajmniej 5.5V, nie może być mniej!
Kolejne spotkanie z kolorowymi paskami LEDów WS2812B – tym razem zapętlone w koło, więc efekt fajny!
Efekty mogą być fajne, ale… programując tylko takie „kółeczka” nie martwimy się używaniem funkcji delay(). To dobrze w tym prostym przypadku. Ale czy zawsze tak można?
Zadanie do wykonania
migać pierwszym LEDem co 1 sek (włączać na 1 sek, wyłączać na 1 sek), migać drugim LEDem co 30 sek — wszystko bez użycia funkcji delay() ! Po co to nam? A chodzi o to, że efekty świetlne mają pojawiać się niezależnie od innych rzeczy dziejących się w „międzyczasie”, nie chcemy ich stopować delay()em. W naszym przypadku zamierzamy jeździć pojazdami, które sterowane będą bezprzewodowo przez moduły radiowe nRF24L więc nie chcemy zatrzymywać odbioru sterowania wyświetlając efekty na kolorowych kółkach. Jak to zrobić?
Liczniki czasu – funkcja millis()
Powiedzmy, że chcemy wykonać pewne instrukcje co interwał czasu (może być 150 ms, może być 3777 ms albo dowolnie).
unsigned long int interwal = 3777;
unsigned long int t1,t2;
unsigned long int licznik = 0;
void loop(){
t1 = millis();
//
//rozne operacje, ktorych nie chcemy zatrzymywac
//
t2 = millis();
licznik += (t2 - t1);
if (licznik >= interwal){
//wykonaj zadania co dany interwal
licznik = 0;
}
}//loop
Powyższy kod to szkic postępowania w celu uzyskania „wielozadaniowości” na platformie Arduino 😉 Na początku pętli loop() zapisujemy aktualny czasu do zmiennej t1, wykonujemy wszystkie potrzebne instrukcje, których nie chcemy przerywać, na koniec ponownie zapisujemy czas do zmiennej t2. Zwiększamy licznik czasu (zmienna licznik) właśnie o czas wykonania pętli loop(), czyli różnicę t2-t1. Następnie sprawdzamy czy licznik „napełnił się” do zadanego interwału – jeśli tak, wykonujemy zadania i zerujemy licznik. Oczywiście możemy mieć wiele liczników, jak też i różne interwały…
Zajęcia rozpoczęły się od krótkiej rozmowy na temat potencjalnego projektu, pt. „Wojny robotów”, który zaprezentowany zostałby na nadchodzącym „Podlaskim Festiwalu Nauki i Sztuki” (czerwiec 2020). W założeniu projekt opiera się na stworzeniu pary/czwórki robotów-pojazdów ganiających się i starających się zniszczyć. Roboty będą wyposażone w magnesy oraz czujki pola magnetycznego – dzięki temu pojazd, który „oberwał” traci trochę energii. Stan energii przedstawiona będzie jako kolorowe koło utworzone z diod LED. Obudowy mają być wydrukowane w 3D – jeśli uda uzyskać się dofinansowanie, to koło Fi-BOT zyska drukarkę 3D na realizację tego projektu (oraz na kolejne). Potrzebujemy osób do programowania pojazdów, kontrolera, efektów wizualnych, a także do modelowania obudowy – wygląda na to, że sporo osób się zgłosiło!
Ws2812b
Następnie zajęcia prowadzone były jak zwykle – wprowadzenie do robotyki. Tego dnia zajmowaliśmy się programowaniem pasków LEDami WS2812B, do których obsługi potrzebna nam była biblioteka Adafruit NeoPixel. Biblioteka ta umożliwia nam ustawienie koloru każdego poszczególnego LEDa na odpowiednią mieszankę barw RGB.
Prosty przykład wykorzystania biblioteki do zaprogramowania zapalającej się i gasnącej diody LED.
#include <Adafruit_NeoPixel.h>
#define PIN 7 //Zapisujemy pin, do którego podpięliśmy pasek jako zmienną.
#define NDIOD 3 //zapisujemy ile diod ma pasek
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NDIOD, PIN, NEO_GRB + NEO_KHZ800);
// Powyżej mamy zapis nowej zmiennej pixels jako typ zmiennej wynikającej z podłączonej biblioteki
void setup(){
pixels.begin(); // Tą metodą inicjalizujemy bibliotekę Adafruit NeoPixel
}
int nr=1;
void loop(){
if(nr>NDIOD){
nr=1;
}
pixels.setPixelColor(nr, 200, 0, 0); // LED zaświeci się na czerwono
pixels.show(); // metoda odpowiada wyświetlaniu się wcześniej zdefiniowanego koloru
delay(100);
pixels.setPixelColor(nr, 0, 0, 0); // LED zgaśnie
pixels.show();
nr++;
}