Bezprzewodowo… Szeryf :P

Pan Rafał chciał zaprezentować działanie swojego pojazdu i… bateria się skończył! OK, od czego mamy drugą? Oj, druga też! A to pech. Więc może pożyczyć od kolegi? Tomasz nie wygląda na skąpca 😉 No jasne, te dwie (rozładowane) to już dawno pożyczone od P. Tomasza. Zaraza…

XXI wiek – bezprzewodowy pojazd, na kablu! Zwróć uwagę na „mały” pakiecik zasilający ;-D

I w ten oto sposób mamy testowanie bezprzewodowego pojazdu na… kablu zasilającym! Pięknie! XXI wiek 😛

Pan Tomasz zbadał drugie serwo. Wyniki niebawem, tylko dodam mu jeszcze 4 kolejne serwa 😉

Szeryf v0.1

Na tych krótkich zajęciach (z przyczyn osobistych) ZMUSIŁEM studentów do zagrania (przetestowania) moją grę – Szeryf v0.1. Gra powstała w processingu i miała za zadanie przetestować możliwość precyzyjnego sterowania modułem JOY-a w czasie rzeczywistym.

Moduł JOY-a – „rewolwer” Szeryfa.

Precyzyjnym obiektem był CELOWNIK (kolor fioletowy) i należało nakierować go na poruszający się (ruchy Browna) obiekt RZUTKA (kolor biały). Strzela się wciskając przycisk w module JOY-a (każdy wie, że podczas strzału lekko zmienia się pozycja modułu) . Gracz jest więc Szeryfem i ma do dyspozycji 6 pocisków (piękna grafika w lewym-górnym rogu) i strzela na rzutek. Zdobywa punkty jeśli trafi, a wartość nagrody jest iloczynem prędkości rzutki i odległości od środka tarczy (to zmusza gracza do ucieczki od bezpiecznej pozycji w środku i „sępienia się” na nadlatującą RZUTKĘ).

Gra Szeryf: 2 pociski wystrzelone, w bębenku są jeszcze 4.

Nie trzeba dodawać, że nikt nie chciał grać w moją grę 😛 Scenariusz słaby? Wszyscy lubią ratować Księżniczki lub biegać po Skelige z dwoma mieczami na plecach? A może to z grafiką coś nie tak? Chyba nie chodziło też o kwestię utrudnionego sterowania, bo ruch góra/dół w module JOY-a był faktycznie ruchem CELOWNIKA góra/dół, natomiast lewo/prawo było odwrócone – i CELOWNIK poruszał się prawo/lewo. Po pierwszej zmianie „na gorąco” dalej nie było entuzjazmu w mojej pseudo-rozrywce. Dlatego bez ceregieli wykorzystałem swój status na uczelni i przymusiłem uczestników Fi-BOTa do rozgrywki. W ten sposób pozyskałem darmowych beta-testerów 😉

Studenci okazali się niezłymi Szeryfami! Wygrał Pan Rafał, który zdobył ponad 122k punktów! Brawo!

Player name: BB
Player name: T
Player name: R

Plan rozbudowy Szeryfa (pomysły z „rękawa”):

  • level 0: RZUTKA nie porusza się, a pojawia się (losowa pozycja) na ustalony czas by potem zniknąć; im szybciej zestrzelisz rzutkę, tym więcej punktów; (C) BB
  • level 1: RZUTKA porusza się ruchami Browna (to już jest)
  • uwzględnić czas gry: wynik końcowy punktów podzielić przez czas? szybszy Szeryf to lepszy Szeryf!
  • level 3: więcej RZUTEK? niby dlaczego tylko jedna…
  • level 4: Szeryf dwuręczny: jeden moduł JOY-a jest mało irytujący? dwa takie to już istny obłęd!
  • zamiast irytujących modułów JOY-a przyklejone żyroskopy/akceleratory do rąk i sterowanie bezprzewodowe? Kto wie, kto wie 😉

Chyba wprowadzę zasadę na kolejnych Fi-BOTach, że wchodząc na zajęcia MUSISZ OBOWIĄZKOWO zagrać w Szeryfa. To w nawiązaniu do klasyka i obowiązkowej kawy + WZ-etki. Ja natomiast nie staram się o trofeum Złotej Patelni a z dopracowanym produktem lecę prosto do Steama/GOGa/Epica i sukces! i chwała! kasa i uwielbienie! 😉

(c) K.G. 2021

Arduino nano i heXapod

Arduino nano

Miniaturyzacja to super sprawa, a wbudowane wejście USB + układ CH340 do komunikacji z PC zdecydowanie ułatwia sprawę tworzenia projektu. Jednak… przez 20min walczyliśmy „z wiatrakami”, bo ani pod Linuxem, ani pod Windowsem Arduino nie mogło zostać rozpoznane. Na dodatek pod Linuxem wyświetlał się mylący komunikat (z dmesg-a):

[ 6325.924067] hub 6-0:1.0: unable to enumerate USB device on port 3

Przełożenie z jednego wejścia USB do innego powodowało kolejny, podobny komunikat – przy jednoczesnym braku działania Arduino Nano. Oczywiście zasilanie dochodziło do płytki Nano (LED power się świecił), ale Arduino IDE nic nie wykrywał. Stracone 20 min bo przyczyna tkwiła w… przewodzie łączącym Arduino z PC – najwyraźniej był uszkodzony! A była to nówka sztuka! Coż, i tak bywa. Nauczka na przyszłość: mieć dwa przewody, nie tracić czasu na przełączanie pomiędzy Win/Linux (a nawet na inny PC przeszliśmy!) tylko sprawdzić przewód!!!

heXapod – jeden krok

Pan Bartek pracował nad poruszaniem pojedynczej nogi. Wykombinował zależność pracy dwóch serw sterujących nogą i przygotował stosowny fragment kodu. Po kilku problemach technicznych udało się to przetestować.Hmm… Jeszcze nie działa. Nie dziś. Noga wykonuje ruchy jak konająca żaba, a nie te zaplanowane – ruch kroczący. Czyli jest nad czym pracować 😉

Przetwornica step-down

A tu ciekawostka wyszła – pojawiła się nieoczekiwana sprawa podwójnego zasilania i prądu wstecznego w przetwornicy. Trzeba to przemyśleć i wrócić do opisania tutaj problemu.

KG (c) 2020

pomysły, inspiracje…

Nowy termin spotkań

Zapraszam w piątki godz. 10:00, sala 1064

Theo Jansen

Pan Bartek chyba się nudzi w czasie sesji 😉 Podczas gdy inni studenci poświęcają się zaliczeniom/egzaminom, to on zainspirował się pracami Theo Jansena:

Wynikiem tych inspiracji są poniższe symulacje:

A co z tego wyniknie? Czas pokaże…

KG (c) 2020

UPDATE:
Model 3D wykonany, drukarka w ruch, program wgrany i oto efekt:

Brawo Pan Bartek!

KG (c) październik 2020

e-Fi-BOT

Pan Bartek napracował się nad przeniesiem elektroniki na konstrukcję heXapoda. Na zajęciach odbyło się pierwsze włączenie (zasilanie na spodzie pająka) i… udało się. Nic nie wybuchło 😉

Łódź podwodna?

Pan Łukasz: są chęci do pracy nad projektem zaproponowanym w poprzenim tygodniu. W planach jest konstrukcja strzykawki sterowanej Arduino: mechanizm poruszania tłoczka (niezbędny do łodzi w celu zanurzenia/wynurzenia). Prace na razie koncepcyjne, ale kto wie jak się to zakończy.

Powyżej model „na szybko” autorstwa Pana Łukasza – mikro serwo obraca przekładnię, a ten drugi ząbkowany element ciągnie tłoczek strzykawki. Można drukować w 3D, ale Pan Łukasz na razie będzie kombinował bez druku – z elementów dostępnych „pod ręką”. Jeśli coś z tego wyjdzie, będzie nowy projekt 😉 A jeśli elementy „spod ręki” nie wypalą – będzie trzeba drukować (nie ma z tym problemu).

KG (c) 2020, zajęcia w formie e-spotkania

e-Fi-BOT

Pan Bartek po raz kolejny udowadnia, że połączenie processinga z programowaniem elektroniki daje świetne wyniki! Powyżej widzimy panel konstruktorski do sterowania nogami heXapoda. W lewej części ekranu myszką wybieramy jedną z 6-ciu nóg (podświetli się na zielonkawy kolor) a następnie zmieniamy jej położenie w prawej części (myszą zmieniając położenie kulki w kwadracie). Ustawione w ten sposób położenie (współrzędne v,h) zostają przeliczone na odpowiednie nastawy serwomechanizmów w wybranej nodze. Więcej na stronie projektu.

Łódź podwodna?

Pan Łukasz obejrzał filmik na YT i zafascynował się konstrukcją łodzi podwodnej. I bardzo dobrze! Tak jak artyści (np. malarze) odwiedzają galerie sztuki, chodzą na wernisaże czy wystawy tak i my powinniśmy oglądać ciekawostki i czerpać z nich inspirację. Poniżej wspomniany filmik

Jak widać konstrukcja jest bardzo pomysłowa – wykorzystuje rzeczy „spod ręki”, a elektronika bazuje na zestawie Lego. My mamy drukarki 3D i Arduino, więc kto wie, co z tego wyjdzie – zachęcam Pana Łukasza do realizacji projektu!

KG (c) 2020, zajęcia w formie e-spotkania

Salon Maturzystów Perspektywy 2019

Brawa dla Pana Bartka – autora projektu – za kolejne zmiany w sofcie (GRAPH CREATORZE) oraz w Maszynie (nowe wydruki 3D). Wszystko ukończone na pierwszą, publiczną prezentację projektu podczas Salonu Maturzystów (Kampus UwB).


Znaleźli się też ciekawscy dziennikarze (ESKA, Akadera oraz Radio Białystok) którzy bombardowali pytaniami Pana Bartka (trochę zaskoczonego, mocno speszonego)
Prezentacja Maszyny wyszła bardzo dobrze, wydruki (jak widać powyżej) fajne! Warto podkreślić, że nic nie powstało w jeden wieczór – projekt wymagał już wielu godzin pracy (ile? to nawet trudno powiedzieć samemu Autorowi…). Efekty są widoczne – praca popłaca! Szczere brawa dla Pana Bartka!

Więcej o projekcie Maszyny na stronie projektu.

(c) K.G.

Zamykanie okna processinga z potwierdzeniem – SOLVED!

Niby prosta sprawa – okienko „zapisz rysunek” przy wychodzeniu z programu processinga. Nie chcemy utracić tworzonej grafiki (problem powstał podczas tworzenia obrazów w GRAPH CREATORZE – softwarze do obsługi Wielozadaniowej maszyny 2D/3D do zadań precyzyjnych), więc musi sie pojawić dialog o zapisie/odrzeceniu tworzonej pracy. Nie wystarczyło nadpisać funkcji exit() w processingu…

Okienka w Processingu oparte są (chyba) na tzw. JFrame’ach. Aby nimi sterować musimy się dostać do obiektu odpowiedzialnego za konkretne okno w aplikacji. Na początku trzeba utworzyć uchwyt do JFrame’a:

  import javax.swing.JFrame;
  import processing.awt.PSurfaceAWT;
  ...
  PSurfaceAWT surf = (PSurfaceAWT) getSurface();
  PSurfaceAWT.SmoothCanvas canvas = (PSurfaceAWT.SmoothCanvas) surf.getNative();
  JFrame jframe = (JFrame) canvas.getFrame(); //uchwyt
  ...

Otrzymany w ten sposób uchwyt można wykorzystać do modyfikacji działania okienka, np. ustawienie czynności przy zamykaniu okna:

jframe.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

Po dodaniu tych linijek kodu można zauważyć, że nic się nie zmieniło. Processing również rejestruje czy użytkownik próbuje zamknąć okno i wywołuje specjalną metodę to zamykania programu: exit(). 

Teraz wystarczy tą metodę nadpisać własnym kodem aby otrzymać dialog z potwierdzeniem wyłączenia programu:

void exit(){  // nadpisanie metody exit()
    int id = showConfirmDialog(
    frame,
    "Are you sure?", // tekst okienka
    "Exiting", // tytuł okna
    YES_NO_OPTION); // opcja przycisków
    if(id == 0){ //id 0 dla przycisku “Yes”
      super.exit();
    }
}

Okienko zwróci 0 dla przycisku “Yes”, 1 dla przysku “No” oraz -1 jeżeli zamkniemy okienko dialogowe wciskając “X”. Następnie można sprawdzić wartość zmiennej “id” i wywołać nienadpisaną wersję metody exit() przy użyciu super.exit() gdy “id” wynosi 1. Wówczas Processing zajmie się resztą i zamknie aplikację.

Do działania dialogów trzeba jeszcze dodać:

import static javax.swing.JOptionPane.*; (tutaj import jako klasa statyczna?)

Całość wygląda więc tak

import javax.swing.JFrame;
import processing.awt.PSurfaceAWT;
import static javax.swing.JOptionPane.*;

void setup(){
  size(900,600);
  PSurfaceAWT surf = (PSurfaceAWT) getSurface();
  PSurfaceAWT.SmoothCanvas canvas = (PSurfaceAWT.SmoothCanvas) surf.getNative();
  JFrame jframe = (JFrame) canvas.getFrame(); //uchwyt
  jframe.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
}
void draw(){
  rect(100,100, 200, 200);
}
void exit(){
  int id = showConfirmDialog(
    frame,
    "Are you sure?", // message
    "Exiting", // tytuł okna
    YES_NO_OPTION);
    println(id);
    if(id == 0){
      super.exit();
    }
}

I po problemie! Zachęcam do kopiowania tego rozwiząnia — (c) Bartosz Butler, 2019

Samochodzik sterowany – radiówka (nRF24L01) – oraz PM2D3D

Pojazd sterowany – nRF24L01

Pan Przemek zapoznał się z komunikacją radiową. Nadajnik i odbiornik działają, ale trzeba wysyłać konkretne dane (np. z joysticka) a nie losowe „śmieci”. Na razie powstał pomysł kodowania danych w sposób tekstowy — i pojawiły się problemy z obsługą takich „napisów”… Prace w toku 😉

Precyzyjna Maszyna (PM2D3D) – soft

Kolejne już prace nad softem – można zapisywać utworzone obrazy w GRAPH CREATORZE do plików – robi się wersja PRO 😉

Skoro jest zapis plików, to warto nie stracić swojej pracy przez nieumyślne zamknięcie programu – pojawi się stosowne okienko z potwierdzeniem (było przy tym trochę roboty, ale się udało).
Więcej o projekcie Maszyny na stronie projektu.

(c) K.G.

fotorezystor + oscyloskop (processing, finał bis)

Oscylockop – finał „bis”

Sesja powoli za nami… a my wróciliśmy do fotorezystora i wykresów. Oto co udało się nam powtórzyć:

  • praca z multimetrem – mierzenie oporności, napięcia
  • dzielnik napięć na płytce stykowej – wyliczanie oczekiwanego napięcia i sprawdzanie multimetrem
  • dzielnik napięć z fotorezystorem
  • podłączenie Arduino do naszego dzielnika i wypisywanie odczytów na ekran
  • zamiana liczb całkowitych z portu analogowego Arduino na konkretne wartości napięcia – porównanie z multimetrem
  • zmiana programu w Arduino: stosujemy protokół wysyłania liczb całkowitych, omawiany na wcześniejszych zajęciach
  • uruchomienie processinga z prostym oscyloskopem i cieszenie się wykresem! 

Kolejne zajęcia – także we wtorek 16:00 – czujka pola magnetycznego + niespodzianka. Zapraszam!

 

Processing — oscyloskop (finał)

Oscyloskop

Kontynuujemy tworzenie oscyloskopu w processingu. Skupimy się na ostatnich barkujących elementach -kreska przesuwająca się w trakcie zbierania pomiarów, napisy na ekranie oraz obsługa myszy (historia wartości). 

Animacja kreski

Chcę dodać kreskę (od góry ekranu do dołu, u mnie kolor żółty, linia bardzo cienka – na 1 pixel) przesuwającą się z lewa do prawa podczas działania naszego oscyloskopu. Przedstawia to sekwencja poniższych obrazków:

     

Rozwiązań jest wiele, a my proponujemy następujące:

  1. kasujemy starą kreskę w pozycji xPos (czyli rysujemy ją kolorem tła),
  2. rysujemy dalszą część właściwego wykresu, 
  3. rysujemy nową kreskę w pozycji xPos+skokX (naszym ulubionym kolorem).

Te trzy kroki powodują, że nie musimy „odświerzać” całego ekranu dla każdego kawałka krzywej na oscyloskopie (tj. nie musimy rysować całego wykresu od początku, bazując na wcześniej zapamiętanych wartościach otrzymywanych z Arduino). To rozwiązanie jest proste i działa fajnie, dlatego je stosujemy.

void draw(){
 int x=getValue(); 
 print("z Arduino x=",x);
 y=wspA*x;
 
  strokeWeight(1);  //grubość kreski = 1 pixel
  stroke(0);  //kasowanie = kolor ekranu 
  line(xPos, 0, xPos, height);

  strokeWeight(10);// grubość kreski dla wykresu
  stroke(0,0,255); //kolor wykresu
  line(xPos - skokX, poprzedniY, xPos, y);

  strokeWeight(1); //ponownie grubość kreski
  stroke(0,0,200);// moj ulubiony kolor
  line(xPos+skokX, 0, xPos+skokX, height);
   
   xPos=xPos+skokX;
   if (xPos>=width){
     xPos=0;
     background(0);
   }
}

Na uwagę zasługuje

  • ciągła „zabawa” z kolorami i grubościami linii – oddzielnie dla kreski, oddzielnie dla tworzonego wykresu (no i kasowanie kreski musi mieć tą samą grubość, co nasza pionowa kreska).

Napisy

Są niezbędne, aby szybko orientować się jakie wartości są rysowane – mamy wszak możliwość skalowania osi y, czyli zawężania/zwiększanie widocznego zakresu. Dodatkowo, można (a nawet wypada) pisać wartość aktualnie otrzymaną z Arduino. Modyfikujemy funkcję setup() dodając (gdzieś na koniec) następujące linie

PFont f;
f = createFont("Arial",16,true); // Arial, 16 point, anti-aliasing on
textFont(f,36);

W powyższym kodzie przygotowujemy processing do pisania teksów – posługujemy się pomocniczą zmienną f (bez większego znaczenia). Aby pisać napisy używamy 

fill(0,0,100); //zmieniamy kolor teksu, jeśli chcemy
textSize(36); //zmieniamy rozmiar tekstu, jeśli chcemy
text("gawryl", 10,100); //piszemy tekst "gawryl" w pozycji x=10, y=100

Funkcja text() ma spore możliwości, dlatego warto zajrzeć do jej instrukcji. Można nawet używać jej w ten sposób:

int i=17;
text(i, 10,100); //piszemy liczbę całkowitą i
text(3.0*i, 10, 200); //piszemy liczbę rzeczywistą
float f=3.14;
text(f, 10, 300);//piszemy liczbę rzeczywistą

Jak widać konwersja typów na napisy następuje automatycznie – to bardzo ułatwia sprawę pisania tekstów. Proponuję testować poznane możliwości – ale szybko dojdziemy do etapu, gdzie napisy nachodzą na siebie, przekrywają się, są nieczytelne i należy je wyczyścić.

Czyszczenie napisów

Postępowanie podobne do metody z animowaną linią (z początku zajęć) nie jest jednak zadawalające. Chodzi o to, że skoro zdecydowaliśmy się na wyeliminowanie czyszczenia ekranu do minimum i kasowanie poprzenich napisów polega na pisanie ich ponownie kolerm tła – to jednak pozostają jakieś pozostałości. Dlatego… proponuję ograniczyć obszar wykresu tylko do części okna, a nie do całej dostępnej szerokości x wysokości okienka. Dzięki temu zabiegowi będziemy mogli bezkarnie czyścić obszar przeznaczony do napisy (zielony prostokąt na rysunku), a pozostawiać w spokoju właściwy wykres (obszar z czarnym tłem). Aby to zobrazować popatrzmy na rysunek:

Proponuję więc, aby każdorazowo funkcja draw() rysowała prostokąt (u mnie w kolorze zielonym) w określonych pozycjach, kasując całą zawartość tam się znajdującą. Następnie nowe napisy moga być już wypisywane wewnątrz tego prostokątu, bez brzydkich artefaktów z poprzedniej metody. Dalej następuje rysowanie właściwego wykresu i pionowej kreski, od której rozpoczęliśmy nasze zajęcia.

Pomysł z zielonym obszarem oczywiście wymaga zmiany współczynników skalowania wspAwspB prostej dopasowującej wczytany x z Arduino na współrzędną y okienka processinga. Powodzenia!

Historia wykresu

Chodzi o to, aby można było zatrzymać kreślenie wykresu (to już mamy obsługiwane) a dodatkowo aby można było lewym klawiszem myszy kliknąć i sprawdzić (wypisać w zielonym obszarze) wartość wykresu. Musimy więc pamiętać poprzednie pomiary – będziemy je przechowywać w pomocniczych tablicach. Dlatego wprowadzamy zmienne globalne

int[] values;
float[] times;

void setup(){

Deklarację tablic values oraz times umieszczamy gdzieś na początku kodu, aby zmienne te były widoczne wewnątrz wszystkich funkcji poniżej – a więc setup(), getValue() oraz draw(). Następnie modyfikujemy funkcję setup() o utworzenie konkretnych rozmiarów tych tablic:

values = new int[width];
times = new float[width];

Nie wnikając w zawiłości dynamicznego przydzielania pamięci – powyższe linie tworzą teyle elementów tablicy values oraz times, jaka jest szerokość naszego okienka z wykresem. Przy okazji widać, że skoro Arduino nadaje do nas liczby z zakresu 0..1023 to na ich przechowywanie przygotowałem tablicę liczb całkowitch, natomiast druga tablica przechowuje liczby rzeczywiste. Ta druga tablica będzie notować mi czas odebrania (w sekundach) przez processing konkretnej liczby – bardzo przydatne w późniejszej pracy z oscyloskopem.

Modyfikujemy funkcję odbierającą dane z portu szeregowego o fragment wypełniający nasze tablice:

int getValue(){
  int value = -1;
  while (port.available() >= 3){
    if (port.read() == 0xff){
       value = (port.read() <<8) | (port.read());
       values[xPos]=value;
       times[xPos]=millis()/1000.0;
    }//if
  }//while
  return value;
}//getValue

Zdecydowałem się na zapisywanie liczb do tablic z wykorzystaniem zmiennej xPos – takie rozwiązanie jest sprytne, ale będzie pociągało za sobą pewne następstwa. Przy okazji poznajemy nową funkcję processinga millis() – która, podobnie jak w Arduino, zwraca czas działania programu w milisekundach – dzięki temu zapisujemy czas „odebrania” danej nadesłanej z Arduino. Liczbę tą dzielę przez 1000.0 aby mieć wartość w sekundach (z przecinkiem – jak w Polsce lubimy).

Obsługa myszy – historia

Mówiliśmy o obsłudze myszy sprawdzając zmienną mousePressed – dzięki czemu wiemy, że wciśnięto przycisk myszy. Ale taki sposób stosujemy wewnątrz funkcji draw(), a my chcemy zatrzymać kreślenie wykresu (pomijając wywołanie funkcji draw()) a jednocześnie obsłużyć zdarzenia z myszy. Dlatego proponuję zrobić to tak:

void mousePressed() {
  int i = (mouseX/skokX)*skokX;
//pomocnicze linie
  print("x= ",mouseX,i); 
  print(" historia= ",values[i]); 
  println(" ", i]);
//właściwe wypisywanie
  fill(0,200,0);//kolor czyszczenia prostokata
  rect(0,height-50, width, height);
  fill(255);//kolor dlugopisu
  text(times[i], 300, height-20);
  text(values[i], 200, height-20);
}

Specjalna funkcja o nazwie mousePressed() będzie wywoływać się automatycznie za każdym razem, gdy mysz będzie klikana. My musimy wpisać tylko odpowiedni kod.

Mój kod ma aż 3 linie pomocniczych wypisywań — do usunięcia w finalnej wersji programiku. Zmienna i potrzeba mi jest po to, aby przeliczyć współrzędną x-ową kursora myszki na odpowiedni indeks w tablicy – wszak nasz oscyloskop wyposażyliśmy w możliwość rysowania punktów rzadko lub gęsto (decyduje o tym zmienna skokX, obsługiwana z klawiatury). Skoro więc dwuktornie odwołuję się do tego samego indeksu, wypisując wartość times oraz values – nawet w finalnej wersji, pozbawionej pomocniczych print-ów –  to nie liczę tego każdorazowo, tylko przechowuję go w zmiennej.

Ja swoje napisy rysuję 20 pikseli od dołu ekranu, w pozycjach 200 i 300 (licząc od  lewej strony). To jest w obszarze mojego „zielonego prostokąta”.

Czego się dziś nauczyłeś

  • pisanie tekstów
  • tworzenie dynamicznych tablic
  • (inna) obsługa myszy

(ciągle) pozostaje kilka kwestii do rozwiązania:

  • poprawne wczytywanie liczb (z Arduino wysyłamy 0..1023, a processing „widzi” tylko jakieś małe liczby, <30?)
  • skalowanie wykresu – czyli chcemy mieć tak, by liczby z zakresu 0..1023 zawsze mieściły się na ekranie, a nie „wyskakiwały” poza aktualną wysokość ekranu
  • skalowanie minimalnej liczby (więcej skalowań)
  • przesuwanie wykresu góra/dół (więcej skalowań)
  • obsługa myszki i wyświetlanie dowolnych wartości z historii wykresu
  • pisanie napisów w oknie processinga (np. liczb z wartościami na wykresach)
  • pisanie skali na wykresie (np. mL i ML z brzegu okienka)
  • podpis osi x – można użyć czasu do opisu tej osi, będzie widać kiedy odebrano konkretną daną
  • ładniejsza grafika

Zapraszam na kolejne zajęcia, na których podłączymy nasz oscyloskop do czujki pola magnetczynego oraz do fotorezystora.