Maskotka, Wieloklik i PM2D3D

Maskotka – podwozie OK!

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.

Zmodyfikowane podwozie Maskotki.

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ą ;-).

Prace nad dwuklikiem i trzyklikiem…

Więcej na stronie projektu.

Maszyna 2D3D

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ół…).

Większy ekranik w maszynie – jest wyrażniej!

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.

(c) K.G. 2019

Czujka pola magnetycznego SS49 oraz Maskotka

Maskotka – napęd

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ć 😉

Moduł BB-Nokia 😀
BB-Nokia zamocowana…

Przerwa świąteczna – kiedy kolejne spotkanie?

Zapraszam w poniedziałek 23 grudnia 2019 o godz. 12:00.

(c) K.G. 2019

Wieloklik i Maskotka

Maskotka – napęd

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!


Otwory nan nowe koła – piękne być nie muszą, tam nikt nie zajrzy.

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.

Schemat z zajęć…

Po całogodzinnej zabawie udało się zrealizować Wieloklika – brawo! Pozostał jedynie malutki szczególik do dopracowania, ale to już za tydzień.

(c) K.G. 2019

Maskotka – 2-gi etap

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 😉

Odpowiednie narzędzia to podstawa – z taką piłą to daleko nie pojedziemy…
Stare koła już odłączone i czekają na powiększne otwory… Nowa piła potrzebna! Mniejsza, zręczniejsza (bo nie chcemy wszystkiego demontować).
Konsola, w tracie projektowania. Bazujemy na projekcie edukacyjny z Amsterdamu – ale niebawem zdemontujemy wszystko i na tej podstawie zbudujemy własną (z komponentami nam potrzebnymi),

W kolejnym tygodniu wymiana kół – piłowanie nadwozia – oraz prace nad konsolą? Zobaczymy!

(c) K.G. 2019

Maskotka – reaktywacja (2-gi etap)

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.

(c) K.G. 2019

Ws2812b oraz potencjometr

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 😛

#include <Adafruit_NeoPixel.h>
     
#define PIN 7 
#define NDIOD 16 
int delta=1024/NDIOD;

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NDIOD, PIN, NEO_GRB + NEO_KHZ800);

int nr,poprzedni;

void setup() {
    Serial.begin(9600);
    pixels.begin(); 

    nr=analogRead(A0)/delta;
    pixels.setPixelColor(nr, 10, 0, 0);
    pixels.show();
    poprzedni = nr;
}

void loop() {
    nr=analogRead(A0)/delta;
//    Serial.println(nr); 
        
    if(nr != poprzedni){
      //AKCJA!
      Serial.print("zmiana! nr="); 
      Serial.println(nr); 
      pixels.setPixelColor(poprzedni, 0, 0, 0);
      poprzedni = nr;
      pixels.setPixelColor(nr, 10, 0, 0);
      pixels.show();
    }
}

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!

(c) K.G. 2019

Dni Otwartego Biznesu – oferta PZU

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.

Na zapisy na szkolenie studenci mają czas do 10 listopada 2019 r. Aplikacje zbierane są poprzez stronę https://www.pzu.pl/kariera/studenci/dni-otwartego-biznesu

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.

(c) K.G. 2019

Ws2812b, potencjometr oraz Monster

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ą 😉

Do zapamiętania:

  1. elektronika/fizyka: dzielnik napięć
  2. informatyka: dzielenie całkowite i dzielenie rzeczywiste, rzutowanie typów
  3. Arduino: sprawdź wartość wyjścia 5V i dostosuj formułki do obliczania odczytanego napięcia
  4. Arduino: przetworniki ADC – rozdzielczość pomiaru, błąd odczytu.
W tinkercadzie można też sprawdzić potencjometr!

Efekty w kółku – bez delay()a

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.

Moduł Monster dla pojedynczego silnika DC – ze stronki https://protosupplies.com/product/vnh2sp30-single-monster-motor-module/

Warto przeczytać opis użycia modułu oraz jego specyfikację, gdy coś nie idzie tak, jak 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!

(c) K.G. 2019

Ws2812b oraz millis()

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…

(c) K.G. 2019

Wojny robotów i programowanie paska z LEDami

Wojny robotów – zbieramy ekipę!

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++;
    }

© J.Ch. 2019