Własne moduły

Bartek
Posts: 326
Joined: 14 Jul 2011, 19:36
Location: Wrocław
Contact:

Re: Własne moduły

Post by Bartek »

Pytanie tylko, czy zawsze będzie tam jakaś wartość po przecinku. Jeśli komuś potrzebne dokładne wartości, bo np mierzy napięcie i chciałby mieć wynik 9,52V to raczej zwaliłbym to wyliczanie na moduł, który to odbiera Wydaje się jednak, że najczęściej będzie wykorzystywana po prostu wartość liczbowa sczytana wprost z przetwornika A/D niż konkretna przeliczona już wartość w jakichś jednostkach.

W Atmegach stosowanych w Arduino wejścia analogowe mają rozdzielczość 10bit (poza wyjątkami 12bitowymi) zatem mamy 1024 wartości. Jeśli przykładowo podłączę fotorezystor chcąc zrobić czujnik zmierzchu to na wyjściu dostaję jakąś wartość od 0 do 1023 i ta informacja w zasadzie powinna wystarczyć. Dodatkowo można pomyśleć o jakimś parametrze typu BIAS, aby móc wyrównać kilka takich samych czujników, oraz min i max. Przykładowy fotorezystor w całkowitej ciemności nie przyjmie wartości poniżej 250 a przy pełnym oświetleniu dobije do 813.
Ja bym zatem proponował suche dane z przetwornika (16bit), te same dane skonwertowane na 8bit (w większości przypadków taka rozdzielczość powinna wystarczyć), oraz te same dane ale uwzględniające zakres. Jeśli zatem ustawię parametry min na 250 a max na 800 to ten zakres 550 zostanie skonwertowany proporcjonalnie.

Również wydaje się, że moduł wejścia analogowego powinien umieć dostarczać uśrednioną wartość, bo wejścia i czujniki analogowe lubią dostarczać "nieprawdziwe" dane, np. czujnik oświetlenia złapie przelatującego ptaka. Ale to już by była kwestia konfiguracji, w ramce by były albo dane live albo uśrednione, liczone np. średnią kroczącą. Obu chyba nie ma sensu dawać.

Zatem przykładowa ramka:
30 A0 | id id | [RAW_MSB] [RAW_LSB] [kanał] [8bit] [przeskalowana 8 bit] [rezerwa] [rezerwa] [rezerwa]

powinna zadowolić każdego. Jeśli przykładowo poziom oświetlenia spadnie już na tyle, że chciałbym załączyć światła, to odczytam z modułu aktualną średnią wartość oświetlenia, dajmy na to 120 (8bit) i wtedy ustawię relaya aby przy takiej wartości włączał światło (a jeszcze lepiej poniżej tej wartości, jako że wartość może przeskoczyć ze 121 na 119). Nie jest mi do tego potrzebna liczba lumenów - jak w przypadku termometru cyfrowego.

Póki co to ja widzę kilka zastosowań takich wejść:
- pomiar oświetlenia (średniego)
- pomiar poziomu dźwięku (średniego)
- pomiar ilości wody w zbiorniku (akwarium, również średni)

P.S. Właśnie opracowuję submoduł z termometrem DS18B20. Póki co działający pojedynczo jak w Hapcanie. Działa bez problemów :). Szkoda, że Hapcan programmer nie wylicza temperatury w monitorze bo nie mam jak jej zweryfikować ;). Ale na oko czytając z hexów jest około 24°C.
Jacek
Posts: 560
Joined: 17 Feb 2007, 18:00

Re: Własne moduły

Post by Jacek »

PelzaK wrote:Pytanie tylko, czy zawsze będzie tam jakaś wartość po przecinku.
Sorry nie miałem na myśli dosłownej wartości po przecinku. Jeżeli w bajtach [wartość analogowa-bity 15-8] [wartość analogowa-bity 7-0] bity będą justowane do lewej strony, to przy odczycie 12 bit, 8 zmieści się w [wartość analogowa-bity 15-8], a pozostałe 4 w [wartość analogowa-bity 7-0]. Czyli najbardziej znaczące bity będą w [wartość analogowa-bity 15-8] i ten bajt można używać jako wartość 8bitową. Co prawda nie będzie ona uwzględniać zaokrąglania, a tylko powstanie z odrzucenia najmniej znaczących bitów.
Może ewentualne rozłożenie proporcjonalne między min i max oraz uśrednianie można by udostępniać na tych samych bajtach (co by było ustawiane w konfiguracji modułu). Pytanie czy potrzebne będzie udostępnienie wartości bezpośrednio odczytanej z przetwornika a/c i jednocześnie proporcjonalnej/uśrednionej. Myślę tu o oszczędzaniu bajtów w ramce, bo jest ich tylko 8.
Regards
Jacek
Bartek
Posts: 326
Joined: 14 Jul 2011, 19:36
Location: Wrocław
Contact:

Re: Własne moduły

Post by Bartek »

No jest 8, ale co więcej można przesyłać ramką analogową niż dane analogowe :). W mojej ocenie ramka powinna być uniwersalna i możliwie niezależna od modułu, tak aby różne moduły implementujące jakieś funkcje analogowego wejścia mogły się posługiwać taką samą ramką, ewentualnie rozszerzając ją o jakieś dodatkowe informacje (na co jest jeszcze miejsce).

A taka ramka zawierająca wszystkie dane też może być przydatna. Wartości 8bit mogą być wykorzystane przez moduły, zaś pełna wartość przez komputer np zbierający dane. Nie upieram się przy tym, ale skoro w ramce wykorzystane są 4 bajty (2 adresowe i 2 z danymi) a 4 leżą nieużywane i być może nigdy nie doczekają się lepszego sposobu wykorzystania to dlaczego by części z nich od razu nie zagospodarować :).

P.S. Robię przymiarki do nowego programatora, bo i tak będzie mi potrzebny do modułów na Arduino. Ręczna edycja pamięci w hexach powoduje dużo błędów. Potem debuguję kod urządzenia przez godzinę, po czym okazuje się, że 0x10 to nie jest 8 :D.
Bartek
Posts: 326
Joined: 14 Jul 2011, 19:36
Location: Wrocław
Contact:

Re: Własne moduły

Post by Bartek »

Właśnie powracam troszki do rozwoju Hapcanuino i zauważyłem, że Hapcan Programmer rozpoznaje hardware version jako Hapcanuino :). Dzięki Jacku, zawsze to lepiej wygląda niż TYPE: 4f41 :).

Zainteresowanych informuję, że wprowadzam kilka zmian łamiących wsteczną kompatybilność. Między innymi jest to dostosowanie struktury boxów konfiguracyjnych do tych z Hapcana, zatem liczba ich spada z 32 do 28 na Arduino UNO (1KB EEPROM). Jeśli coś tam mieliście zaprogramowane to trzeba zaorać (najlepiej wpisując 0xFF w komórki EEPROMA) i zapisać boxy jeszcze raz w nowym formacie. Będzie też obsługa nowych operatorów <= i >=.

Prócz tego zmieniły się sygnatury funkcji OnExecuteInstruction i ExecuteInstruction.
Było:

Code: Select all

void ExecuteInstruction(byte instruction, byte param1, byte param2, byte param3, Hapcan::HapcanMessage& message);
Będzie:

Code: Select all

void ExecuteInstruction(Hapcan::InstructionStruct& exec, Hapcan::HapcanMessage& message);
Obiekt exec klasy InstructionStruct zawiera 8 bajtów instrukcji do wykonania, a nie tylko 4 jak poprzednio. Kolejne bajty można odczytać następująco:

Code: Select all

byte instruction = exec.Instruction(); 
byte param1 = exec.Parameter1();
byte param2 = exec.Parameter2();
...
byte param7 = exec.Parameter7();
I to najpewniej trzeba będzie zmienić w swoich firmwarach dla Hapcanuino.
W razie pytań zapraszam na slacka. Zaproszenia wysyłam po mailowym kontakcie na "software na onixarts pl". Jest tam już parę osób i tak sobie rozmawiamy od czasu do czasu na tematy około_Hapcanowe.
Bartek
Posts: 326
Joined: 14 Jul 2011, 19:36
Location: Wrocław
Contact:

Re: Własne moduły

Post by Bartek »

Kilka newsów z placu boju :).

Na githubie są już nowe źródła. Powstaje również tutorial, opisujący jak korzystać z Hapcanuino krok po kroku, z obrazkami, schematami. Angielski wymagany. Jakby ktoś był zainteresowany to zapraszam.

Planuję niedługo produkcyjnie (czyli w domu) zastosować Hapcanuino (do tej pory było tylko w fazie testów), więc porządkuję bibliotekę oraz dokumentację.
Post Reply