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.

PM2D3D – nowe wózki i akceleracja

Nowe wózki

Pan Bartek napracował się przy nowych wózkach – przemyślana konstrukcja, projekt 3D a potem wydruk. No i mamy konkretny wynik! Nie tylko wizualny, ale i jakościowy – dzięki nim maszyna jest niższa, a także pracuje stabilniej!


Uważny obserwator bloga zauważy też, że RAMA ma krótsze nóżki 😉 To też pozytywnie wpływa na wibracje pisaka.

Akceleracja ruchu

Jeszcze nie ukończona, ale prace są bardzo zaawansowane – co przedstawia poniższy film:

Więcej o projekcie PM2D3D na dedykowanej stronie.

(c) K.G.

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.

Samochodzik sterowany – podczerwień, TSOP – oraz PM2D3D

Pojazd sterowany – TSOP23xx

Pan Przemek uporał się z płynnym sterowaniem pojazdu (naprawa softu) – auto śmiga teraz całkiem gładko! Koła nie są uruchamiane i zatrzymywane na określony czas po wciśnięciu danego przycisku – brak efektu „czkawki”. Zamiast tego, auto zatrzymuje się gdy użytkownik zwolni przycisk na pilocie. Obsługiwane są też kody repetycji przycisku, w tym także tajemniczy kod ZERO – który pojawiał się na skutek jakiś problemów komunikacji pilota z czujką TSOP. Można więc się cieszyć, choć pilot płata figle i… mimo wszystko zrywa się komunikacja – wówczas auto się zatrzymuje (na chwilę, bo w końcu przycisk cały czas jest wciśnięty więc po chwili auto rusza). śmiało można to nazwać sukcesem. Niestety – testowy pojazd jest kiepski – 4 koła mają różne silniczki i jeden z nich działa zdecydowanie słabiej niż reszta, przez co auto marnie jeździ po podłodze (wykładzina = duże tarcie, trefne koło stoi w miejscu zamiast się kręcić). Będzie trzeba zmienić platformę (na zmodyfikowane serwomechanizmy – ale o tym za tydzień). Za tydzień też zastosowanie tej części kodu w komunikacji radiowej (lepszej niż na podczerwień).

Precyzyjna Maszyna (PM2D3D) – soft

Kolejne prace nad softem, wydruk wydaje się zachęcający 😉 Z poziomu GRAPH CREATORA można już tworzyć grafikę, która zostanie przeniesiona na kartkę papieru. Brawo!

Więcej o projekcie Maszyny na stronie projektu.

(c) K.G.

Samochodzik sterowany – podczerwień, TSOP – oraz PM2D3D

Pojazd sterowany – TSOP23xx

Pan Przemek zapoznał się z odbiornikiem podczerwieni TSOP 2230, dzięki któremu jego pojazd był sterowany bezprzewodowo. Poniżej prosty programik do dekodowania sygnałów z pilota telewizyjnego z wykorzystaniem biblioteki IRLib (do pobrania w dziale Do pobrania):

#define IR 12
#include <IRLib.h>
IRrecv pilot(IR);//pin
IRdecode dekoder;
 
void setup(){
  pilot.enableIRIn();//uruchamiamy odbiornik IR
  Serial.begin(9600);
}
 
void loop(){
   if (pilot.GetResults(&dekoder)) {
     dekoder.decode();    //dekoduj dane
     pilot.resume();     //restartuj odbiornik
     Serial.println(dekoder.value);//kody klawiszy! zanotuj je sobie....
   }//if
}/loop

Po zapisaniu sobie kodów pilota TV można zmienić program do poruszania naszym samochodzikiem – instrukcjami typu  if (dekorer.value==432421) jedz_do_przodu() — oczywiście funkcję tą należało wcześniej sobie napisać 😉

Wspólnie ustaliliśmy, że każdokrotne naciśnięcie przycisku do przodu na pilocie uruchamia silniki na zadany czas (np. 100ms) a następnie je wyłącza. Tak samo z jazdą do tyłu – włączamy odpowiednio silniki (ponownie na 100ms) a potem je wyłączamy (no i ze skrętami tak samo). Wszystko ładnie działało, ale… nie do końca. Silniki są cały czas włączane i wyłączane – a wiadomo, że prąd potrzebny na „rozruch” silnika jest znacznie większy niż podczas jego pracy ze stałą prędkością. Nie ma potrzeby je zatrzymwać, jeśli użytkownik trzyma wciśnięty dany przycisk! Dodatkowo, przy mniejszym czasie pracy silnika (nie 100ms a 50ms czy nawet 20ms) samochód miał „czkawkę” – ciągle uruchamiał i zatrzymywał silniczki. Te dwa powody były wystarczające do zmiany pierwszej wersji kodu – na bardziej zaawansowaną, która nie wyłącza silnika gdy ciągle wciskamy ten sam przycisk.  „Czkawka” została (częściowo) opanowana, ale… są błędy w kodzie 🙁 Na dodatek należy obejść (dobrze zaprogramować) błędy w komunikacji pilota na podczerwień z czujką TSOP23xx – przy trzymanym przycisku pojawia się tajemniczy kod ZERO, co przerywa pracę silników. Za tydzień się z tym uporamy!

Precyzyjna Maszyna (PM2D3D) – soft

Choć najwięcej zmian zostało w softwarze – to nastąpiła także modyfikacja konstrukcji ramy: silniki zostały przeniesione z jednej strony na przeciwne, aby zrónoważyć całą konstrukcję. Ciągle pozostaje kwestia dodania przeciwwagi po przeciwnej stronie ramy, aby nie tylko kirunek wschód-zachód był zrównoważony, ale także północ-południe. Dodatkowy ciężarek będzie pewnie w niedalekiej przyszłości, gdy powstanie panel do sterowania.

Są też anty-poślizgowe nóżki do ramy, z dodatkowymi „dociskaczami” kartki A4 (wydrukowane w 3D). Jak wspomniano, najwięcej zmian Pan Bartek wykonał w sofcie i… poprawnie rysowane są już ukośne linie! Brawo

Więcej o projekcie Maszyny na stronie projektu.

(c) K.G.

Krańcówka w PM2D3D oraz samochodzik (L293N)

Sterownik silników L293N

Pan Przemek zapoznał się z sygnałami PWM (obowiązkowy programik „gaszący” LEDa – i funkcja analogWrite) a następnie poznał sterowanie silnikami DC – za pomocą sterownika L293N. Najpierw podłączaliśmy zasilanie 6V z żelowego akumulatorka:a następnie konstrukcja uległa modyfikacji (w tym także zasilanie) i powstała taka oto platforma testowa:
Udało się „nauczyć” jeździć ten pojazd do przodu, tyłu i skręcać. Na razie wykonuje on wszystkie te czynności w kółko – więc jest to mało sensowne. Ale kolejny krok to zdalne sterowanie i ten krok to już duży krok w kierunku Wojny Robotów 😉

Precyzyjna Maszyna (PM2D3D) – krańcówka

Pan Bartek zamontował krańcówki – wydrukował odpowiednie elementy trzymające.
  Skoro są już krańcówki, to należy je oprogramować. Drogi są (co najmniej) dwie: 1) w programie realizującym poruszanie silnikami sprawdzamy, co się dzieje z krańcówkami – i w razie czego zatrzymujemy konkretny silnik, lub 2) inicjalizujemy przerwania, które robią to automatycznie. Jednak zanim doszło do tego to… pojawiły się problemy z rysowaniem linii po skosie. Przygotowany przez Pana Bartka kod miał działać – jednak okazało się, że ma wady. Wiadomo – ten się nie myli, kto nic nie robi 😉 Dlatego dzisiejsze zajęcia poszły w kierunku naprawy softwaru… Jeszcze jest trochę roboty 😉

Więcej o projekcie Maszyny na stronie projektu.

(c) K.G.

Precyzyjna Maszyna oraz RPM

Obroty na minutę: RPM (czujka pola magnetycznego SS49E)

Pan Przemek ukończył kod, który zlicza obroty wirującego silniczka – brawo! Należy się pochwała, bo to jego pierwsze zmagania z Arduino.

Układ doświadczalny:

W układzie celowo zamontowano magnesy tak, by czujka SS49E „widziała” raz biegun północny (N) magnesu, a za drugim razem (gdy silniczek obróci sie o 180 stopni) biegun południowy (S). Ustawienie magnesów na końcach patyka nie jest więc przypadkowe 😉 Czujnik SS49E odczytuje zarówno biegun S jak i N (uwaga: nie wszystkie czujki pola magnetycznego, bazującego na efekcie Halla, tak mają – warto to sprawdzić przed zakupejm), dlatego widzimy dwa „piki” podczas obracania silniczka – jeden „do góry” (większe napięcie) oraz „do dołu” (napięcie mniejsze). Z dala od magnesów czujka zwraca napięcie ~2.5V informując, że wartość pola magnetycznego jest (około) zera. Poniżej wykres z Kreślarki

Program zliczający liczbę obrotów na sekundę (zmienna czas – aktualnie 1000ms, ale można zmienić, także przez krotność – zmienna krok). Algorytm polega na znajdowaniu maksimum i minimum napięcia – a zapisywane jest moment ich wystąpienia (do zmiennych t_1oraz t_2, odpowiednio). Różnica tych czasów do pół obrotu.

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

int i,max_=518,min_=518,a=0,b=0,czas,n=0,krok=1;
float v;
long int t_1=0,t_2=0,t_k=0,t_3=0,t_p;

void loop(){
 t_p=millis();
 czas=1000;
 i=analogRead(A0);
 if(i>540){
   if(i>max_){
    max_=i;
    t_1=millis();
   }
   else if(i<max_){
    a=1;
   }
 }
 if(i<490){
   if(i<min_){
    min_=i;
    t_2=millis();  
    }
   else if(i>min_){ 
    b=1; 
  }
 }

 if(t_1>t_2){
  t_3=t_2;
 }
 else{
  t_3=t_1;
 }
 
 if(a==1&&b==1){
    t_k=abs(t_2-t_1);
    a=0;
    b=0;
    max_ = 518;
    min_ = 518;
    if(czas>t_3){
      n++;
    }
    else if(czas<t_3){
    Serial.print("Liczba pol-obrotow: ");
    Serial.println(n);
    n=0;
    krok++;
    czas=czas*krok;
    }
 }
 }

Zmienna n (małe n) zlicza wystąpienia „półobrotów”, a co ustalony czas wypisywany jest komunikat z tą liczbą. W ten sposób mamy właśnie pół-RPS (revolutions per second), z którego łatwo można już otrzymać RPM (revolutions per minute).

Precyzyjna Maszyna

Sprężynka nie wytrzymała – chyba była zbyt twarda 🙁

Nowy model powinien być lepszy – bo wydrukowany z Z-Ultratu:

No i mamy coraz lepszą pracę Maszyny:

Więcej o projekcie Maszyny na stronie projektu.

(c) K.G.

Precyzyjna Maszyna (chwytak!) oraz Wiatromierz

Chwytak do ołówka/mazaka zaprojektowany, wydrukowany w 3D i zamontowany! Działa z serwomechanizmem a kod BBcode obsługuje nowe instrukcje (up, down).

No i kolejny (próbny) precyzyjny rysunek:

Opis całego proejktu Maszyny pod tym adresem

Obroty na minutę (rpm) i czujka pola magnetycznego SS49E

Wakacje w trakcie, ale nie tylko Pan Bartek spędza wolny czas z pracą nad projektem. Pan Przemek, który nie miał czasu na zajęcia Fi-BOTa w roku akademickim, poznaje Arduino i „atakuje” temat liczenia obrotów silniczka, wykorzystując czujkę pola magnetycznego SS49E


A po co nam zliczanie tych obrotów? Zastosowań jest wiele, jednym z nich jest mierzenie prędkości wiatru takim prostym urządzeniem:

w środku którego znajdują się: czujka SS49E, dwa magnesy oraz łożysko kulkowe (typ 682ZZ).

O dalszych losach tego projektu niebawem…

(c) K.G.