Strona 1 z 2

Mój soft do NANJG

: środa 24 kwie 2013, 14:14
autor: pralat
Witam.

Od pewnego czasu bawiłem się programowaniem sterownika NANJG 105C. Początkowo bazowałem na gotowym kodzie, który wydawał mi się wystarczający do wszystkiego i wymagał tylko małych modyfikacji. Kiedy jednak ustaliłem jaką chcę mieć funkcjonalność, okazało się, że trzeba jednak napisać wszystko od zera, dokładnie tak jak chcę.
Muszę przyznać, że dawno się tak nie bawiłem, jak tutaj szukając oszczędności na rozmiarze wynikowego programu. Jak za czasów C64 i asemblera, gdzie każdy cykl procesora był cenny... Tu jednak program pisałem tylko w C, bez wstawek w asemblerze. Kilka razy już wątpiłem dodając nową funkcjonalność, czy uda się ją zmieścić. Największa zawalidrogą był dla mnie tryb SOS, zajmuje stosunkowo dużo miejsca a jego przydatność jest ograniczona. Jednak kto wie, akurat ten tryb może kiedyś być potrzeby i mimo wszystko wolałem siedzieć na kodem szukając oszczędności niż go usunąć. Na szczęście udało się upakować wszystko co chciałem :)

Funkcjonalność jest taka:

Grupy trybów

Ustawić można od 1 do 4 grup, z których każda może zawierać tryby typu:
  • zwykły (ciągły),
  • beacon,
  • strobo,
  • SOS.
W każdej grupie może być inna ilość trybów, a ich maksymalna ilość w jednej grupie jest zależna od ilości grup w ogóle:
  • 1 grupa – maksymalnie 18 trybów w grupie,
  • 2 grupy – maksymalnie 9 trybów w grupie,
  • 3 grupy – maksymalnie 6 trybów w grupie,
  • 4 grupy – maksymalnie 4 tryby w grupie,
Czyli jest miejsce na 18 trybów łącznie, które dzieli się na grupy.

Używana przeze mnie konfiguracja to zestaw 4 grup:
  • grupa 1: moonlight, 8%, 33%, 100%
  • grupa 2: 8%, 33%, 100%
  • grupa 3: 33%, 100%
  • grupa 4: 33%, 100%, beacon, SOS
Początkowo przewidziałem sobie tylko dwie grupy: w pierwszej tryby zwykłe, w drugiej migające - bez możliwości "mieszania" typów. Doszedłem jednak do wniosku, że możliwość użycia w jednej grupie trybów różnego rodzaju będzie wygodniejsza i pozwoli utworzyć grupy na różne okazje - aby w razie potrzeby tylko włączyć odpowiedni tryb, a nie klikać w poszukiwaniu kombinacji zmieniającej grupę.

Interfejs

Podstawą jest tutaj "krótki klik", co oznacza kliknięcie w czasie krótszym niż 1,5s od włączenia latarki.
Zmiana trybów odbywa się poprzez krótki klik, a funkcje specjalne dostępne są poprzez "wielokliki".
Wielokliki realizowane są w taki sposób, że najpierw latarka czeka 0,5s, następnie daje sygnał szybkimi błyskami (od 1 do 4, np. pomiar napięcia = 1 błysk), że aktualny wieloklik ma specjalne znaczenie i czeka 2s na reakcję. To pozwala zorientować się, czy wyklikaliśmy to, co chcemy. Jeżeli tak, to czekamy 2s i wykonywana jest wybrana akcja. Po wykonaniu akcji latarka sygnalizuje aktualnie wybrane ustawienie.
Po co oczekiwanie 0,5s po włączeniu? Ponieważ łatwo wtedy od razu zauważyć, że mamy do czynienia z zachowaniem nietypowym; dodatkowo ułatwia to klikanie przy aktywnych trybach specjalnych, gdzie miganie stroboskopów może trochę dezorientować.

Akcje:
  • 12-klik: pomiar napięcia i sygnalizacja błyskami
    Wygląda to tak, że najpierw na ok. 1s włącza się dioda, aby obciążyć ogniwo i wykonywanych jest kilka pomiarów, następnie prezentowany jest wynik w postaci błysków.
    • sygnał przed: 1 błysk
    • sygnał po: 1 (aku prawie pusty) do 4 (aku pełny) błyski
  • 13-klik: przełączenie grupy trybów na następną
    • sygnał przed: 2 błyski
    • sygnał po: błyski od 1 do 4 wskazują numer aktualnie wybranej grupy
  • 14-klik: włączenie/wyłączenie pamięci ostatnio używanego trybu. Domyślnie pamięć jest wyłączona i latarka startuje zawsze od pierwszego trybu z aktualnej grupy.
    • sygnał przed: 3 błyski
    • sygnał po: 1 błysk – funkcja wyłączona, 2 błyski – funkcja włączona
  • 15-klik: włączenie/wyłączenie ochrony przed głębokim rozładowaniem ogniwa. Domyślnie jest włączona i przy 2.9V latarka przestanie świecić.
    • sygnał przed: 4 błyski
    • sygnał po: 1 błysk – funkcja wyłączona, 2 błyski – funkcja włączona
Przykład: mamy aktualnie wybraną grupę trybów nr 1, chcemy przełączyć na nr 2.
Klikamy...
12-klik - widać 1 błysk po 0,5s ... to nie to, klikamy jeszcze raz,
13-klik - widać 2 błyski po 0,5s ... to właściwa funkcja, czekamy 2s... latarka przełącza grupę na nr 2 i informuje o tym błyskając 2 razy.

Początkowo ustawiłem sobie pierwszy wieloklik na 5, jednak kilka razy chciałem szybko włączyć latarkę na mocniejszy tryb i zaklikałem za daleko, co z kolei już zmuszało mnie do przeskoczenia przez wszystkie akcje specjalne. Stwierdziłem wtedy, że jednak funkcji specjalnych nie potrzebuję aż tak często jak zakładałem na początku.

Obsługa akumulatorów bez zabezpieczenia

Sterownik ma wsparcie dla niezabezpieczonych akumulatorów, przy napięciu mniejszym niż ok. 3.1V (pod obciążeniem) zmniejszana o połowę jasność, z dodatkowym ograniczeniem do max. 30%. Włącza się też sygnalizacja "ciemnym błyskiem" co 5s (poza trybami strobo). Jeżeli napięcie spadnie poniżej 3.0V latarka przechodzi w moonlight. Istnieje również zabezpieczenie przez głębokim rozładowaniem, które może zostać włączone lub wyłączone przez użytkownika. Jeżeli jest włączone, przy napięciu poniżej 2.9V latarka przestanie świecić. Przy wyłączonym będzie tylko sygnalizować słaby akumulator, ale będzie pracować aż do całkowitego wyczerpania ogniwa.
Początkowo obsługę słabego aku zrobiłem jako stopniowe zmniejszanie jasności jeżeli napięcie jest niższe niż 3.1V. W teorii miało być tak, że przy zmniejszeniu obciążenia napięcie wzrośnie i stan się utrzyma przez dłuższy czas. Jednak dochodziło w czasie testów do tego, że jednak zbyt szybko latarka schodziła do moonlight. Nie chciałem już tutaj przekombinować, wprowadzając dodatkowe opóźnienia, itp., więc zrobiłem zabezpieczenie oparte o trzy progi napięć, które dają konkretne działania.
Co do samej sygnalizacji poziomu napięcia, to przewidziałem 4 błyski maksymalnie, ale może się zdarzyć i 5 dla aku naładowanego po brzegi ;)

: środa 24 kwie 2013, 15:07
autor: Pyra
Witam
No to nam grono programistów rośnie ;)
Nie uważasz, że 3,1V pod obciążeniem to za wysoko?

Pozdrawiam

: środa 24 kwie 2013, 18:22
autor: pralat
Taka już moja natura... jestem zbytnio ostrożny. Może rzeczywiście warto trochę obniżyć ten próg. Zastanawiam sie tylko jaki jest rozrzut oporników w egzemplarzach sterownika. Czy nie jest możliwa sytuacja, że pomiar będzie zawyżony o np. 0, 1V i w konsekwencji ogniwo ulegnie szkodzeniu?
A w ogóle to dzięki za sugestię.

: środa 24 kwie 2013, 19:40
autor: Pyra
Witam
Weź pod uwagę, że na samym Rwew ogniw masz spadek, potem połączenia sprężynki itp, spokojnie możesz obniżyć do 3,0 - 2,9V.

Pozdrawiam

: środa 24 kwie 2013, 20:27
autor: ElSor
A jaką moc ma tryb moon ?
Jaką częstotliwością traktujesz AMCki ?
Myślę, że zabezpieczenie czy to w moon czy przy 2,8A można spokojnie ustawić na 2,8V a uzyskane przez to wolne miejsce przeznaczyć na inne funkcje (np info o wyczerpującej się baterii - po obniżeniu napięcia poniżej 3V mignięcie co minutę).

: środa 24 kwie 2013, 20:43
autor: GozDD
Aktualnie z programowaniem mam mało wspólnego, ale generalnie jestem pod wrażeniem, że udało Ci się to wszystko upchnąć.

Co powiesz na zastosowaną już przez kogoś zmianę trybów: jeden klik - tryb w górę, dwa kliki - tryb w dół?

Masz zamiar jakoś rozpowszechniać swój soft - sprzedaż sterowników z tym softem, sprzedaż softu, czy samych scalaków?

Też jestem za zabezpieczeniem na 2,8V. W trybie moon prawie na pewno ogniwo rozładujemy do ustawionego progu, ale przy 2,8A nie ma się czego obawiać, jak już koledzy wyżej wspomnieli. Ewentualnie, jeśli jesteś aż tak zapobiegliwy, to może dodać wybór tego progu - 2,8 lub 3V?

: środa 24 kwie 2013, 21:15
autor: pralat
Pyra pisze:spokojnie możesz obniżyć do 3,0 - 2,9V
Czyli sugerujecie przy przy 2.9-3.0V dopiero włączyć informację o słabym ogniwie, odcinać w razie potrzeby przy 2.8V?
ElSor pisze:A jaką moc ma tryb moon ?
Jaką częstotliwością traktujesz AMCki ?
Moon to PWM = 1, dla niego ustawiam prescaler = 8, co daje ok. 290Hz. W wyższych trybach trybach prescaler = 1, co daje 2.35kHz.

GozDD pisze:Co powiesz na zastosowaną już przez kogoś zmianę trybów: jeden klik - tryb w górę, dwa kliki - tryb w dół?
Ciekawy pomysł, sprawdzę!
Widziałbym to tak, że jak kliknę raz, to nie dzieje się nic przez 1s - jeżeli nie nastąpi drugi klikw tym czasie, to przełączę "w górę", jeżeli nastąpi - to przełączę w dół.
GozDD pisze:generalnie jestem pod wrażeniem, że udało Ci się to wszystko upchnąć.
Masz zamiar jakoś rozpowszechniać swój soft - sprzedaż sterowników z tym softem, sprzedaż softu, czy samych scalaków?
Dzięki :)
Tak, uruchomiłem sprzedaż na małą skalę w światełkowym sklepiku - o tutaj.

[ Dodano: 25 Kwiecień 2013, 09:05 ]
ElSor pisze:Myślę, że zabezpieczenie czy to w moon czy przy 2,8A można spokojnie ustawić na 2,8V a uzyskane przez to wolne miejsce przeznaczyć na inne funkcje (np info o wyczerpującej się baterii - po obniżeniu napięcia poniżej 3V mignięcie co minutę).
Nie bardzo rozumiem - na czym (jakiej funkcjonalności) miałbym zaoszczędzić miejsce?
W tej chwili jest już sygnalizacja wyczerpującej się baterii.

: czwartek 25 kwie 2013, 10:03
autor: mauzer
IMO trochę toporny interfejs. Przeglądałeś może dokumentację drivera Flagiusza?

: czwartek 25 kwie 2013, 12:23
autor: ElSor
Nie bardzo rozumiem - na czym (jakiej funkcjonalności) miałbym zaoszczędzić miejsce?
Na stopniowym ograniczaniu mocy podczas końca życia akusa (najpierw zbijasz przy 3,1V podczas pracy na wyższych trybach, później przy 3V na niższych trybach) - po co tak wydziwiać ? Można zbijać tryby np przy 2,9V bez względu na to w jakim się jest trybie.
pralat pisze:W tej chwili jest już sygnalizacja wyczerpującej się baterii.
Jest wcześniejsza sygnalizacja, że zaraz zostanie obniżony tryb na niższy czy sygnalizacja działającego już zabezpieczania ? ;) Wg opisu to 2gie.
pralat pisze:Moon to PWM = 1, dla niego ustawiam prescaler = 8, co daje ok. 290Hz.
Czemu tak nisko zszedłeś z częstotliwością PWMa? Jak dla mnie światło o tej częstotliwości jest bardzo denerwujące.

: czwartek 25 kwie 2013, 12:58
autor: pralat
ElSor pisze:Czemu tak nisko zszedłeś z częstotliwością PWMa? Jak dla mnie światło o tej częstotliwości jest bardzo denerwujące.
Sory, wygląda na to, że pomyliłem się w obliczeniach.

Częstotliwość PWM obliczam wg wzoru z dokumentacji, wg którego:
Phase Correct PWM f = f_clk_io / (N * 510),
gdzie N to prescaler. Normalnie używam 1, w moon 8 (bo nie ma wartości pośrednich, jakby co).
Jako f_clk_io użyłem to 1.2 MHz, co dawało:
f_clk_io / (N * 510) = 1.2 MHz / (8 * 510) = 294 Hz

A powinienem użyć f_clk_io = 4.8MHz (ustawiam CKSEL = 01), co daje 1.1 kHz dla moon i 9.4 kHz dla pozostałych.
Zgadza się?


Jeżeli chodzi o kontrolę rozładowania, jest ona niezależna od aktualnego trybu i działa tak:
- przy 3.1V zmniejsza PWM o połowę
- przy 3.0V ustawia PWM = 1
- przy 2.9V wyłącza diodę (jeżeli opcja odcinania jest aktywna)

Nie ma tutaj kombinacji ;)

Sygnalizacja słabego ogniwa rozpoczyna się już od 3.1V, czyli od momentu zmniejszenia jasności i obowiązuje aż do wyłączenia latarki.

[ Dodano: 25 Kwiecień 2013, 13:50 ]
mauzer pisze:IMO trochę toporny interfejs. Przeglądałeś może dokumentację drivera Flagiusza?
Czy możesz napisać coś konkretniej?
Driver Flagiusza ma zupełnie inna funkcjonalność, nie bardzo w ogóle widzę celowość porównania. Tam funkcjonuje tylko 2- i 3- klik, jest to driver programowalny przez użytkownika, dopuszcza modyfikacje PCB. Nie ma grup trybów, pomiaru napięcia czy opcji wł/wył: pamięci trybu / odcięcia słabego aku.

W jaki sposób widziałbyś realizację w interfejsie 4 akcji specjalnych, jeżeli nie za pomocą wieloklików (jak ja to zrobiłem)?

: sobota 27 kwie 2013, 02:28
autor: GozDD
Ja bym to widział mniej więcej tak:
-przy 2.9/3.0V sygnalizacja mignięciem raz na minutę i blokada trybów powyżej 30%
-przy 2.8V jeżeli opcja odcięcia jest aktywna to wyłącza diodę

Według mnie to konfiguracja tego driver'a jest mniej skomplikowana i w skrócie lepsza od driver'a Flagiusza, co kto lubi po prostu. Nie mogą wszyscy wzorować się na jednym, bo w końcu nie byłoby w czym wybierać.

Jak tylko będę tworzył jakieś świecidełko to zgłoszę się do Ciebie po driver ;)

: poniedziałek 29 kwie 2013, 09:38
autor: pralat
Dzięki za sugestie!
Obniżę o 0.1 V progi napięcia uznawanego za niskie. Z częstotliwością sygnalizacji coś też pomyślę, jednak tutaj sprawa trochę się komplikuje - na potrzeby optymalizacji rozmiaru przyjąłem pewne ograniczenia dla funkcji realizującej opóźnienie. Nie bardzo mogę też dodać cokolwiek do kodu, ponieważ pozostały mi do dyspozycji 2 bajty pamięci programu :) Przemyślę to jednak i może coś uda się wykombinować.

Dodatkowo zmieniłem definicje domyślnych trybów na:
* grupa 1: moon, 8%, 35%, 100%
* grupa 2: 35%, 100%, beacon, sos
* grupa 3: 7%, 35%, 100%
* grupa 4: 30%, 60%, 100%, strobo 9Hz

... i nowość :)
Doszedłem do wniosku, że przełączanie po kolei 3 i 4 grup trybów było dość problematyczne, więc zastosowałem inne podejście. Jeżeli zatem w sterowniku zostaną zdefiniowane 3 lub 4 grupy, to ich przełączanie odbywa się poprzez wybór konkretnej grupy wieloklikiem, a nie jak dotychczas przełączenie na następną. Przykład: mamy ustawione 4 grupy, a pierwszy wieloklik to 8, więc:

8-klik - pomiar napięcia
9-klik - aktywacja grupy 1
10-klik - aktywacja grupy 2
11-klik - aktywacja grupy 3
12-klik - aktywacja grupy 4
13-klik - wł/wył pamięci trybu
14-klik - wł/wył odcięcia akumulatora

Tym sposobem jedną akcją można wybrać sobie grupę.
Żeby było fajniej, okazało się, że dodatkowo oszczędziłem na tym 18 bajtów pamięci programu. Niezbadane są wyroki kompilatora :mrgreen:

[ Dodano: 29 Kwiecień 2013, 11:14 ]
Przeczytałem właśnie, że niejaki wikrap1 zaproponował godzinę wcześniej niż mój post takie samo rozwiązanie w wątku o sterowniku grega. Chciałem tylko oświadczyć, że nie podkradłem mu tego pomysłu. Poniżej screenshot z qgit-a, widać na nim, że wrzuciłem zmianę o 7:17
Obrazek

To tak w kwestii formalnej :-)

: poniedziałek 29 kwie 2013, 20:37
autor: GozDD
Szczerze mówiąc to miałem zaproponować, aby 13-klikiem wejść w zmianę trybu i następnie klikami 1-4 wybrać numer grupy, ale stwierdziłem, że nie będę już marudzić ;)
Aż tu ktoś wpadł na jeszcze lepszy pomysł.

: wtorek 07 maja 2013, 12:41
autor: pralat
Zrobiłem reorganizacje sposobu definicji trybów, dzięki czemu stało się możliwe upakowanie większej ich ilości. Testuję obecnie rozwiązanie z 6 grupami, które zawierają od 3 do 5 trybów. 6 grup to sporo, jednak ich przełączanie jest łatwe, a tyle grup daje możliwość ustawienia wszystkiego co kiedykolwiek może być potrzebne.

: wtorek 07 maja 2013, 16:28
autor: kornik
Takie coś by mi pasowało, myślałem o takich 5 zestawach: dom, auto, rower, wycieczki w góry i tryby sygnalizacyjne. Można zamówić u ciebie coś takiego?