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

Pierwsze oficjalne spotkanie Fi-BOT

7 października o godzinie 14:15 po zajęciach odbyło się pierwsze oficjalne spotkanie koła Fi-BOT na terenie Wydziału Fizyki. Do naszej skromnej grupy dołączyły 4 nowe osoby, dzięki którym, miejmy nadzieję, będziemy w stanie wykonać więcej projektów opartych na Arduino. Pierwsze zajęcia stanowiły rutynowe zapoznanie się z płytką Arduino Uno, jej elementami składowymi oraz formą programowania. W celu zrozumienia, jak funkcjonuje rdzeń naszej pracy, zostały zaprogramowane w prosty sposób LEDy.

W międzyczasie Panowie Przemek i Bartek kontynuowali pracę nad swoimi projektami. Informacje odnośnie projektu Pana Bartka odnaleźć można na dedykowanej stronie.

(c) J.Ch. 2019

Pierwsze spotkanie w nowym semestrze 2019/2020!

Nowy semestr w roku akademickim 2019/2020

Zapraszam zainteresowanych na zajęcia koła Fi-BOT w poniedziałki, o godz. 14:15 do sali 1064 (Wydział Fizyki, Kampus). Będziemy pracować nad rozpoczętymi projektami. Mile widziani studenci ze znajomością platformy Arduino, ale i tak liczy się zaangażowanie. Zapraszam!

Radiówka i „grzebek”

Pan Przemek zrealizował proste sterowanie „grzybkiem” (zamiast przycisków). Proste, bo wychylenie gałki (odczyt z analogRead() w zakresie 0..1023) powyżej ustalonej wartości (>700) oznacza ruch w jedną stronę z pełną prędkością, natomiast gałka w drugą stronę (<300) w przeciwną. Tak samo z drugą osią. W kolejnym podejściu prace nad uzależnieniem prędkości od wartości wychylenia (PWM silników skalowane analogReadem grzybka).

Jak zawsze coś się musiało rozlutować…

PM2D3D Nowe wózki i akceleracja

Pan Bartek udoskonalił nowe wózki i ciągle pracuje nad akceleracją… Więcej o projekcie PM2D3D na dedykowanej stronie.

(c) K.G.