Nokia 5510 – wizualizacja 3D

Czy można zmusić Arduino do wyświetlania grafiki 3D? Wiadomo, że do grania w gry potrzebujemy potężnych akceleratorów graficznych (karty nVidii lub ATI) lub dla mniej wymagającej grafiki mocnego CPU. Arduino może i nie ma wielkich zasobów mocy obliczeniowej, ale przy użyciu prostego wyświetlacza i lekkiej imitacji biblioteki 3d możemy uzyskać interesujące efekty. Stworzę “silnik 3D” – który w zasadzie jest tylko prostym rzutowaniem punktów na ekran. Pomimo ograniczonej funkcjonalności, możemy uzyskać ciekawe efekty takie jak obracająca się przestrzenna siatka sześcianu.

Cała sztuczka uzyskania wrażenia 3D polega na dobrym rzutowaniu punków w przestrzeni na piksele ekranu. Wiadomo, że obiekty dalsze są mniejsze, a te bliższe – są większe (perspektywa!). Ta obserwacja prowadzi mnie do banalnego pomysłu – nie będę rzutować trójwymiarowych punktów (x,y,z) na ekranik wyświetlacza (x,y), uwzględniając pozycję kamery w przestrzeni a jedynie… będę zmniejszać/zwiększać obiekty w zależności od ich odległości! Do oddania efektu głębi użyję funkcji wykładniczej a nie liniowej – to kolejna obserwacja, z którą trudno się nie zgodzić (obiekt dwa razy dalej nie jest wcale dwa razy mniejszy!). Dzięki temu obiekty znajdujące się bliżej będą powiększane, a te dalej pomniejszane.

Daje nam to wrażenie, że obiekty znajdujące się dalej zbliżają lub oddalają się wolniej, a natomiast te bliżej – szybciej. Oddalające się punkty powinny się zbiegać do środka ekranu aby otrzymać efekt perspektywy punktowej.

Jako przykład użyjemy wyświetlacza Nokii 5110 oraz bibliotek Adafruit_PCD8544.h oraz Adafruit_GFX.h. Biblioteki posłużą nam do kontrolowania ekranem i wyświetlania linii.

Na początku musimy zaimplementować rzutowanie:

struct point2D{
 int x,y;
};

struct point3D{
 float x,y,z;
 point2D CastTo2D(){
   point2D ret;
   ret.x = szerokosc_ekranu/2 + (x * X_SCALE *  pow(Z_SCALE, z));
   ret.y = wysokosc_ekranu/2 - (y * Y_SCALE * pow(Z_SCALE, z));
   return ret;
 }
};

Tworzę w ten sposób dwie struktury oraz metodę do późniejszego rzutowania na ekran. X_SCALE, Y_SCALE to współczynnki skalowania na poszczególnych osiach ekranu (bardzo przydatne w przypadku gdy piksele wyświetlacza nie są kwadratowe). Z_SCALE natomiast to współczynnik skalowania głębi.

Po podłączeniu ekranu do Arduino używamy bibliotek, żeby coś wyświetlić:

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
Adafruit_PCD8544 disp = Adafruit_PCD8544(5, 4, 3);

void setup() {
    disp.begin();
    disp.display(); // wyswietlanie buffera
}

Ten krótki kawałek kodu powinien wyświetlić logo Adafruit na ekranie. Można poświęcić chwilę na przyjrzenie się bliżej bibliotece i postarać się stworzyć własne logo, np. takie:

Gdy już wszystko nam działa możemy przejść do wyświetlenia czegoś przestrzennego. Pomocna będzie funkcja rysująca linię na ekranie pomiędzy punktami w przestrzeni:

void draw3DLine(point3D a, point3D b){
 disp.drawLine(a.CastTo2D().x, a.CastTo2D().y, b.CastTo2D().x, b.CastTo2D().y, BLACK);
}

Musimy jednak mieć na uwadze w jaki sposób punkty przestrzenne są konwertowane na piksele ekranu. Punkt (0,0,0) znajduje się na środku ekranu, a składowa Z określa powiększenie (Z>0) lub pomniejszenie (Z<0) obiektu. Dla Z=0 rozmiar obiektu nie zostanie zmodyfikowany. Znaczenie ma również skala (X_SCALE, Y_SCALE), gdyż to właśnie przez te wartości mnożymy położenie punktu (dla małej skali musimy podać większe współrzędne, bo nasz obiekt na ekranie może okazać się jedynie małą kropką).

Wyświetlenie siatki sześcianu to odpowiednie połączenie ośmiu punktów – dosyć proste. Ale jak sprawić, żeby ten sześcian się obracał? W tym celu sięgamy po parę funkcji trygonometrycznych, a mianowicie sinus i cosinus.

Zamiast podawać konkretne współrzędne x i y, możemy użyć kąta i odległości od środka. Punkt (r*cos(a), r*sin(a)), niezależnie od kąta a, jest zawsze oddalony o odległość r od punktu(0,0). Zwiększając ten kąt, punkt będzie “wędrować” po okręgu. Możemy to wykorzystać właśnie do obracania sześcianem.

Teraz możemy określić pionową parę punktów współrzędnymi:

(cos(a)*R, y, sin(a)*R) i (cos(a)*R, -y, sin(a)*R),

gdzie R to promień okręgu, po którym będą poruszać się punkty i jednocześnie połowa przekątnej sześcianu. Aby uzyskać następną parę punktów musimy je obrócić o 90 stopni, czyli do poprzedniego kąta dodajemy ℼ/2:

(cos(a+PI/2)*R, y, sin(a+PI/2)*R) i (cos(a+PI/2)*R, -y, sin(a+PI/2)*R).

W podobny sposób uzyskujemy pozostałe pary punktów dodając odpowiednio wielokrotność kąta ℼ/2 (dla trzeciej pary: 2*PI/2 i czwartej: 3*PI/2).

Kiedy już zapisaliśmy pozycje punktów w tej postaci, możemy zwiększać kąt a (lub zmniejszać co spowoduje obrót w przeciwnym kierunku). Warto pamiętać, że jest to kąt w radianach i należy go zwiększać o stosunkowo małe wartości.

Efekt jest następujący:

Kod programu:

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#define Z_SCALE 1.2
#define X_SCALE 20
#define Y_SCALE 16
#define ANGLE 0.08
#define DT 60
#define RADIUS 1.3

struct point2D{
  int x,y;
};

struct point3D{
  float x,y,z;
  
  point2D CastTo2D(){
    point2D ret;
    ret.x = round(42. + (x * X_SCALE *  pow(Z_SCALE, z)));
    ret.y = round(24. - (y * Y_SCALE * pow(Z_SCALE, z)));
    return ret;
  }
};
// Software SPI (slower updates, more flexible pin options)
// pin 7 - Serial clock out (SCLK)
// pin 6 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 4 - LCD chip select (CS)
// pin 3 - LCD reset (RST)
Adafruit_PCD8544 disp = Adafruit_PCD8544(7, 6, 5, 4, 3);

void draw3DLine(point3D a, point3D b){
  disp.drawLine(a.CastTo2D().x, a.CastTo2D().y, b.CastTo2D().x, b.CastTo2D().y, BLACK);
}

void setup() {
  disp.begin();
}

float fi = 0.;
void loop() {

  fi+=ANGLE;
  disp.clearDisplay();
  for(int i=0; i<4; i++){
    point3D a= {cos(i*2*M_PI/4 + fi)*RADIUS, 1, sin(i*2*M_PI/4+ fi)*RADIUS};
    point3D b= {cos(i*2*M_PI/4 + fi)*RADIUS, -1, sin(i*2*M_PI/4+ fi)*RADIUS};
    draw3DLine(a,b);
    point3D c= {cos((i+1)*2*M_PI/4 + fi)*RADIUS, 1, sin((i+1)*2*M_PI/4+ fi)*RADIUS};
    point3D d= {cos((i+1)*2*M_PI/4 + fi)*RADIUS, -1, sin((i+1)*2*M_PI/4+ fi)*RADIUS};
    draw3DLine(a,c);
    draw3DLine(b,d);  
  }
  disp.display();
  delay(DT);
}

 

 

(c) Bartosz Bytler 2019

Pomiar ciągu silnika

Pomiar ciągu silnika

Okazuje się, że zaproponowany na zajęciach schemat pomiarowy (wykorzystany do określenia ciągu naszego balonu) nie zadziała w przypadku silniczka:

Dorysowane strzałki tłumaczą sprawę, ale wyjaśniam: waga nie wskazała mniejszej masy, gdyż powietrze z wirujących łopat śmigieł powodowało ciśnienie na wagę… Z balonem ten pomysł „wypalił”, a tutaj nie. Ulepszony zestaw pomiarowy wykorzystujący „dźwignię”  – ważne: oba ramiona tej samej długości, ech ta fizyka 😉

Tym razem nie ma problemu z ciśnieniem powietrza, gdyż to wypychane jest za dźwignię, podnosząc lekko ramię – co rejestruję na wadze. Działa to w dwie strony: przy odwrotnej pracy silnika (lub innych śmigłach: CW zamiast CCW) ramię będzie dociskane do wagi i obserwować będę zwiększenie wskazań masy. Trzeba więc jedynie zanotować odczyt wagi na początku (przed uruchomieniem silniczka) i wykonywać pomiary.

Pomiary najlepiej wykonywać zmieniając napięcie zasilające silniczek – ja tu mam regulowany zasilacz laboratoryjny, który dodatkowo podaje mi informację o prądzie pobieranym przez podłączony układ (ważna informacja).

Pomierzyłem „osiągi” swojego silniczka MT-62 (4 gramy) ze śmigiełkiem 60mm (0.2g) i otrzymałem takie wyniki

napięcie

[V]

prąd

[A]

ciąg

[g]

2 0.06 2
3 0.11 4
3.7 0.14 5.4
4 0.16 6.3
5 0.21 8.8

Oszałamiające one nie są… przy docelowym napięciu z baterii Li-Po 3.7V będę tylko „lekko” na plusie – jeśli chodzi o samą masę silniczka (masa śmigiełka na tyle mała, że pomijam).

Ważymy podzespoły

Arduino Nano (z pinami) 5.7 g
1x pakiet Li-Po 3.7V 800mA 16g
DRV8833 (trzeba 2x) 1g (według producenta)
silniczki + śmigła (trzeba 4) 4g
XM-15B 3.7g
rama? mocowania? x?

Jak widać jest kłopot przy tym silniczku – aby podnieść ~50g (zakładam ramę 10g), to dysponując balonem o sile nośnej ~20g musimy silniczkami dostarczyć brakujące 30g ciągu! MT-62 przy zasilaniu z pojedynczej Li-Po nie wystarcza. Sprawa wygląda lepiej gdy zwiększamy zasilanie (choć nie możemy robić tego do poziomu 2×3.7V, bo te silniczki działają do 6V), ale jeszcze lepiej – gdy zmienimy silniczki (za chwilę).

Rama

Można zaprojektować i wydrukować w 3D samodzielnie, o tak jakoś:

co zrobiłem wzorując się na „klasyku” QX80. Co zyskujemy drukując samemu? możemy ustawić dwa silniczki w innej płaszczyźnie, tak jak nam potrzeba. Tak czy owak fajne jest to, że waga takiej ramy to <10g (zarówno tej kupnej, jak i mojej – wydrukowanej w 3D).

Zapotrzebowanie na prąd

Silniczek MT-62 przy pracy z napięciem 3.7V pobierał 0.14A, czyli 140mA. Cztery takie silniczki będą zjadać 560mA. Dodatkowo trzeba uwzględnić prąd pracy Arduino – zmierzyłem, że to jest 10mA przy działaniu prostego programiku – ale przy bardziej skomplikowanym programie może być więcej. Uwzględnić trzeba sterownik DRV8833 (lub podobny, patrz specyfikacja) oraz moduł Bluetooth (ponownie: patrz specyfikacja). Niech dla prostoty dalszych rachunków zaokrąglę wszystko do 800mA. Bateria Li-Po o pojemności 800mAh umożliwia pobranie właśnie 800mA przez całą godzinę, czyli wychodzi na to, że mamy około godziny latania! To wygląda bardzo optymistycznie.

Można pomyśleć o mniejszej pojemności baterii, np. 250mAh – wówczas będziemy mogli latać tylko ~1/3 godziny (bo taka bateria dostarcza prąd 250mA przez godzinę, a my potrzebujemy 800mA), ale… zyskujemy na wadze! Taki akumulator waży TYLKO 6.6g ! Można też lekko zmniejszyć masę naszej konstrukcji wybierając pakiet 560mAh (waga 11g), co jest niezłym kompromisem. Trzeba to przemyśleć (albo kupić kilka pojemności takich aku). Obowiązkowo zachęcam do poczytania o bateriach Li-Poli przed ich zakupem i używaniem.

Inne silniczki i śmigła

Poniżej przedstawiam zawartość swojej „spóźnionej” paczuchy…

Czyli: kilka (tanich) śmigieł (30mm oraz 60mm), oraz mikro silniczki szczotkowe 716 (po dwa CW i CCW – na wszelki wypadek, gdybym przypadkiem je przepalił czy inaczej uszkodził – są tanie, za to przesyłka droga). Silnik prezentowany na zajęciach MT 62 okazał się słaby w porównaniu do 716-tki (wydaje się odpowiedni do sterowania, ale nie do uzyskiwania ciągu balona).

Uważaj! Pracuja z szybkoobrotowymi silniczkami z zamontowanymi śmigłami jest niebezpieczna – uważaj na palce, oczy i zadbaj o bezpieczeństwo!

716-tka – maleństwo o masie ~3g ze śmigłami (+1 g?) 60mm daje czadu! Przy okazji: śmigła miały za duży otwór (chyba 1mm) więc je zaklinowałem (nóżka od rezystora 1/4W okazała się w sam raz) aby wał mojego 716 siedział sztywno – zadbaj o to i Ty! 

napięcie

[V]

prąd

[A]

ciąg

[g]

1 0.42 15
2 0.8,0.66,1.04 28,20,39
3 1.8,1.63 64,62
3.7 2 69
     

W tabelce zwróć uwagę na DUŻY PRĄD pracy silniczka – pamiętaj, że to tylko jedna sztuka, a są (chyba) potrzebne 2. Przy takich prądach trzeba stosować odpowiedni sterownik. No i uważać na grzanie się układu (sterowniki DRV8833 mają zabezpieczenia termiczne wyłączające układ, gdy temeratura jest zbyt wysoka – trzeba mieć to na uwadze). Dodatkowo: przy napięciach 2 i 3V podałem kilka pomiarów (wartości po przecinkach) – byłem zaskoczony bardzo niestabilną pracą maleństwa 716! To może być problem…

A jak mikro silniczek szczotkowy 716 działa z malutkim śmigłem 30mm (CX-10)? Wydawało mi się, że szkoda na to czasu, a tu jednak miła niespodzianka!

napięcie

[V]

prąd

[A]

ciąg

[g]

1 0.07 2
2 0.16 6
3 0.28 11
3.7 0.42 17
     

I właśnie taki wariant wydaje się bardzo obiecujący – prąd „zjadany” przez silniczek jest akceptowalny do tego projektu, a jego ciąg też sensowny. Sądzę, że warto kupić parę innych zestawów śmigieł i jeszcze poeksperymentować (są tanie, nie ma biedy).

Wyciek helu

Balon gubi gaz… te aluminiowe gubią powoli (szczególnie w porównaniu do gumowych balonów, dla których zalecane jest kupno specjalnego sprayu). Chyba najbardziej gaz ucieka przez „zawór” – warto o to zadbać, dobrze go wiążąc.

Rozpocząłem pomiary (dopiero) 12-go stycznia 2019 (zakup 5-go stycznia) i już wyraźna część helu uciekła – patrz zdjęcie. Przyczepiłem balon do czegoś ciężkiego (u mnie kluczyk, zresztą widoczny na zdjęciu), przywiązałem nitką krawiecką do balona (bo wytrzymała i  lekka!) ale jeszcze nitki nie puściłem – mój układ (kluczyk) ważył 35.7 g. Po puszczeniu nitki balon chciał poderwać kluczyk, ale wyporność była za mała i jedynie zmniejszył wskazania wagi. Rejestrowałem te zmiany w czasie (21 g, 24 g,…,35.2 g), przed każdym pomiarem sprawdzając „kalibracje” – ważyłem kluczyk, trzymając nitkę i sprawdzałem, czy mam 35.7 g. Dopiero potem dokonywałem pomiaru – widziałem, jak kluczyk robił się „coraz cięższy”.

Poniżej wykres przedstawia zależność siły nośnej w funkcji czasu – siła („udźwig”, czyli masa początkowa 35.7g minus wskazania wagi kluczyka) maleje, bo gaz ucieka… 

Ciekawa sprawa z tym wykresem – bo jest liniowy (szkoda, że tak późno rozpocząłem swoją zabawę w ważenie kluczyka, bo może początek był nieliniowy – tego bym się spodziewał, ze względu na większe ciśnienie na początku). Może to też oznaczać, że wyciek helu odbywa się nie przez powierzchnię balona, a głównie przez „zawór” – ten pozostaje cały czas tak samo „ściśnięty” (niedoskonały).

pojazd cz.1

Dziś było więcej mechaniki, niż elektroniki… choć na koniec udało się Wszystkim złożyć swoje pojazdy i uruchomić – gratuluję! Za tydzień sterowanie i pierwsze jazdy próbne 😉

(c) KG 2018

Bluetooth

Z wielkim sukcesem i zadowoleniem oprogramowaliśmy moduł Bluetooth XM-15B

  • biblioteka SoftwareSerial.h — bardzo przydatna w pracy z bluetooth, bo potrzebujemy komunikacji szeregowej (Arduino UNO ma tylko jedną parę Tx/Rx!)
  • tworzymy zmienną SoftwareSerial i przypisujemy jej dwa piny cyfrowe – w kolejności Rx, Tx
  • nie zapomnijcie o włączeniu metodą begin(9600)
  • łączenie „na krzyż” z modułem XM-15B, czyli: Tx <–> Rx, Rx <–> Tx
  • czytanie i interpretowanie komend…. a myślicie, że po co ciągle ćwiczyliśmy czytanie z klawiatury? teraz się przyda!

Poniżej działanie aplikacji Blutooth Control Lamp i wyświetlaczem 7-mio segmentowym:

Podłączamy sterownik silników L298N i kolejna apka z Androida: Android RC

A tu mamy to, co niebawem nas czeka: troszkę większe silniczki (37Dx73L) z zaprojektowanym i wydrukowanych „trzymakiem”

Chciałem pogratulować całej 5-tce obecnej na dzisiejszych zajęciach – za zaangażowanie w pracę nad projektem – i naukę nawet w długi weekend majowy. Jestem przekonany, że Wam się to opłaci.

(c) KG 2018

Fale… z ledów… także wirtualnych…

Fala… z LED-ów…. prawdziwych! Oprócz fal pojawiła się TABLICA i pętla FOR. To sporo – kto nadążał – gratuluję!

Prezentacja Pana Macieja – proste, ale… całkiem efektowne! Gratuluję. Bez pętli zaprogramować coś takiego to koszmar.

Następnie zachęcałem do wirtualnego Arduino ze stronki tinkercad.com (jest to znany projekt cicuits.io, który przejęła firma Autodesk):

Stronka ta umożliwia zabawę w Arduino bez posiadania płytki Arduino – wystarczy się zarejestrować (za darmo!) i można działać.

Jak zacząć? Już po rejestracji wybieramy CIRCUITS:

a następnie zielony przycisk Create new circuits:

Kolejnym krokiem jest już dodawanie elementów po naciśnięciu +Components (prawy pasek, na górze)

gdzie zaczynamy od płytki stykówki, LED-a, rezystorka i bateryjki. Uruchamiamy symulację przyciskiem Start Simulation (potem ją zatrzymujemy Stop). Gdy już wszystko rozumiemy (tyle-o-ile) to czas na dodanie płytki Arduino i… tu się zaczyna zabawa!

Kto zrobi pracę domową z „odbijającą się” falą? Ze zmienną czas? Na następnych zajęciach wgramy programiki na prawdziwe płytki i zobaczymy kolorowe efekty! Proszę śmiało działać!

 

Pierwsze spotkanie 2017 r.

No i rozpoczęliśmy nowy rok akademicki 2017/2018 a tym samym i Fi-BOTa. Na pierwszych zajęciach pojawiło się 9 śmiałków – zobaczymy, ilu będzie kontynuować…

Co robiliśmy? Dla większości była to pierwsza przygoda z Arduino więc było sporo gadania, ale finalnie udało nam się błyskać jednym LED-em podłączonym na płytce stykowej. To dużo jak na godzinkę z hakiem i moją skłonność do gadania 😉 Ale pokazałem też motywację – ta sama płytka Arduino podłączona do żarówki 230V – i działa!

Spotkania w roku 2017/18 będą odbywać się zawsze we wtorki o godz. 16:00. Zapraszam!

Followliner (FL) – starcie 1

  1. Prosty FL – zbudowany na 2 czujnikach TCRT5000 ustawionych blisko siebie tak, by oba leżały nad czarną linią. Położenie czujek – z przodu, przy napędzie (wiem wiem…).
  2. Instalacja modułu w pojeździe.
  3. Pierwszy program – jedź prosto, gdy oba czujniki „widzą” linię.
  4. Modyfikacja – skręcaj (zatrzymując jedno koło) gdy jedna czujka „gubi” linię.
  5. Modyfikacja – silniki STOP, gdy obie czujki zgubiły linię.

Do zrobienia:

  1. (chwilowo) zostaniemy przy 2 czujkach, za to dodamy regulację szybkości kół w zależności od sygnału na czujce (aby nie było szarpania, a ruch był płynny).
  2. gdy pojazd wyjechał poza linię, to ma się cofnąć (może nawet kilka razy, a jeśli po tych kilku razach dalej nie widać linii – to dopiero wówczas STOP).
  3. zmodyfikujemy tor testowy – łagodniejsze łuki (łatwiejsze, ale z czasem zmienimy).

Liczymy obroty (TCRT5000) – sukces!

Liczymy obroty silniczka D65:

Znalezione obrazy dla zapytania d65 zestaw napedowytutaj nasz program:

 

bool stan, poprz;
unsigned long int t1;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  stan=false;
}

int odczyt;
int licz=0;
void loop() {
  poprz=stan;
  odczyt=analogRead(A0);
  if (odczyt<50)
    stan=true;
  else
    stan=false;
//  Serial.print(odczyt);
//  Serial.print("   ");
//  Serial.print(stan?"jasne":"ciemne");
//  Serial.print("   ");
  if (stan!=poprz){
    licz++;
    Serial.print(" KLIK ");
    Serial.print(licz);
    Serial.print(" ");
    if (licz%2==0){
      Serial.print(1000./(millis() - t1)*60);
      Serial.println(" rpm");
      t1= millis();
    }
  }
//  else
//    Serial.println();
}

I działa bardzo fajnie, nawet z tylko jednym znacznikiem! Wyniki są bardzo powtarzalne (przy zasilaniu około 7V – jeden obrót w 230-240ms, czyli 4 obroty w 1 sekundę, a to daje 4*60=240 obrotów na minutę – rpm).

Rozbudowa?

  1. więcej znaczników (już 2 polepszają sprawę, 4 to zdecydowanie OK).
  2. inny algorytm – zliczanie liczny obrotów i aktualizowanie wartości rpm co określony czas, np. 2 sek

Liczymy obroty (TCRT5000)

Liczymy obroty silniczka D65:

Znalezione obrazy dla zapytania d65 zestaw napedowy

który przy zasilaniu 6V powinien mieć 100 rpm (=obrotów na minutę). My wykorzystujemy poznaną czujkę odbiciową TCRT5000:

 

Znalezione obrazy dla zapytania tcrt5000

Pierwsze zgrubne wyniki dały 1 pełen obrót w czasie 250ms, czyli 240 rpm (trochę dużo, ale to dlatego, że zailalem silniczek 8V – „nielegalnie”). Zrzut ekranu:

oraz program (wyjaśnienia i dyskusja później, jak też i omówienie dokładności pomiaru):

int pomiar[3],i=0,maksior;
unsigned long t1,delta;

void setup() {
  Serial.begin(9600);
  t1=millis();    
}
void loop() {
//  Serial.print(millis());
//  Serial.print("   ");
  pomiar[0]=pomiar[1];
  pomiar[1]=pomiar[2];
  pomiar[2]=analogRead(A0);
  //Serial.println(pomiar[2]);  
  if ((pomiar[1]<950)&&(pomiar[1]>300)&&(pomiar[1]>pomiar[0])&&(pomiar[1]>pomiar[2])){
    delta=millis()-t1;
    if(delta>50){
      Serial.print("1 obrot w ");
      Serial.print(delta);
      t1=millis();    
      Serial.print("ms, czyli rpm=");  
      Serial.println(60*1000.0/delta); 
    }
  }  
  //delay(100);
}

 

 

Encoder do silników DC – pracujemy…

Panu Kamilowi udało się zbudować układ, który w podłączeniu z processingiem produkuje takie obrazki:zad4 zad3 zad2 zad1

Widzimy tu dwie krzywe, ale to właśnie ta biała pochodzi z omawianego encodera. Teraz „trzeba tylko” opracować algorytmiczną metodę zliczania pików w danym okresie czasowym, a następnie przełożyć to na faktyczne obroty koła… Prace w toku…

Przy okazji: ta żółta krzywa pochodzi od czujki pola magnetycznego – dzięki niej w późniejszym czasie można będzie przełożyć zliczone piki (białe) na faktycznie wykonane obroty (żółte dwa piki odpowiadają jednemu pełnemu obrotowi).

Plik z przykładowymi danymi – do wstepnej obróbki (gnuplot, arkusz kalkulacyjny Calc…).