↓
 

majek.sh

Marek Wodziński's home page

  • O mnie
  • LCD88
    • Posts about lcd88
  • R/C
  • Elektronika
Home - Strona 5 << 1 2 3 4 5 6 7 8 9 >>

Nawigacja

← Starsze posty
Nowe posty →

HobbyKing SuperSimple HK-18A z firmware SimonK

majek.sh Opublikowano w 2013-04-23 przez majek2018-03-18

Tani i dobry regulator silników do tricoptera

Każdy multikopter wymaga regulatorów silników bezszczotkowych (w skrócie 'regulator’ lub z angielskiego 'ESC’). Niektóre są tanie, ale skonstruowane dla samolotów (mają łagodną charakterystykę i są dosyć wolne w reakcji na 'gaz’), niektóre mają więcej opcji ustawienia, ale zazwyczaj kosztują więcej,

Na szczęście dzięki firmware od SimonK, jest możliwość zmiany oprogramowania w wielu z nich na dedykowane do multikopterów. Dlatego też do budowy mojego Tricoptera wybrałem najtańsze dostępne, które da się przeprogramować:
HobbyKing SS Series 15-18A ESC
SuperSimple HK-18A ESC

No to do dzieła 🙂

Sprzęt/elektronika

Żeby wgrać inne oprogramowanie potrzebny jest programator do procesorów AVR (używam USBasp z HobbyKing-a, ale na eBayu można znaleźć tańszy i w wersji obsługującej układy zasilane 3.3V jak i 5V). Dodatkowo potrzebne są też pewne zdolności manualne, żeby to polutować oraz szkło powiększające 🙂

Na początek trzeba zdjąć koszulkę termokurczliwą z regulatora. Najlepszym i najbezpieczniejszym miejscem do jej rozcięcia jest brzeg płytki.
hk-18a cut shrink-wrap

Po zdjęciu koszulki pierwsze zaskoczenie: mam inną (najprawdopodobniej świeższą) wersję tego regulatora, bo płytka wygląda trochę inaczej niż na zdjęciach z listy wspieranych regulatorów. Na szczęście po sprawdzeniu omomierzem okazało się, że jedyną różnicą jest dodanie padów do programowania, więc cała operacja będzie jeszcze prostsza:
hk-18a programming pads

Jak widać na powyższym zdjęciu, koło procesora jest 6 padów. Niestety, niektóre są płaskie, a niektóre mają górki/kropelki cyny, więc zrobienie jakiegoś złącza z dobrym kontaktem będzie trudne. Ponieważ miałem tylko 3 regulatory do przeprogramowania, więc postanowiłem po prostu dolutować się do tych padów.

Żeby ułatwić sobie zadanie, na początek zrobiłem 'kulki’ na każdym z tych padów:
hk-18a programming pads with balls and pin description

Następnie przygotowałem sobie złączkę z goldpinów z cienkimi drucikami z Kynaru 0.2mm. Jeżeli najpierw pocynuje się druciki, to dolutowanie się do 'kulek’ jest już całkiem proste (z pomocą lupy 🙂 ).
hk-18a with isp header

Pozostało tylko podłączyć to do programatora USBasp i zaprogramować.
hk-18a connected to USBasp

Oprogramowanie

Wiadomo, że coś trzeba wgrać do tych procesorów w regulatorach 🙂

Skąd?

Ściągnąłem oprogramowanie prosto z repozytorium gita projektu:

git clone https://github.com/sim-/tgy.git

Przed kompilacją wyłączyłem możliwość kalibracji regulatorów w tgy.asm:

.equ    RC_CALIBRATION  = 0     ; Support run-time calibration of min/max pulse lengths

Wg. mnie nie jest to potrzebne w tych regulatorach, bo procesor jest taktowany generatorem kwarcowym (czyli stabilnym i takim samym dla wszystkich), oraz sygnał sterujący będzie sterowany przez płytkę z MultiWii, a nie przez zwykły odbiornik, gdzie ta kalibracja mogłaby się przydać.
Oszczędzą to też potencjalnych kłopotów z przypadkowym przekalibrowaniem regulatorów.

Kompilacja

Do kompilacji SimonK używa kompilatora AVRA:

tgy$ make tp_8khz.hex
avra -fI -o tp_8khz.hex -D tp_8khz_esc -e tp_8khz.eeprom -d tp_8khz.obj tp_8khz.asm
AVRA: advanced AVR macro assembler Version 1.3.0 Build 1 (8 May 2010)
Copyright (C) 1998-2010. Check out README file for more info
&nbsp;
   AVRA is an open source assembler for Atmel AVR microcontroller family
   It can be used as a replacement of 'AVRASM32.EXE' the original assembler
   shipped with AVR Studio. We do not guarantee full compatibility for avra.
&nbsp;
   AVRA comes with NO WARRANTY, to the extent permitted by law.
   You may redistribute copies of avra under the terms
   of the GNU General Public License.
   For more information about these matters, see the files named COPYING.
&nbsp;
Pass 1...
Pass 2...
done
&nbsp;
Used memory blocks:
   Data      :  Start = 0x0060, End = 0x008C, Length = 0x002D
   Code      :  Start = 0x0000, End = 0x03ED, Length = 0x03EE
   Code      :  Start = 0x0E00, End = 0x0FDF, Length = 0x01E0
   Code      :  Start = 0x0FE0, End = 0x0FFF, Length = 0x0020
&nbsp;
Assembly complete with no errors.
Segment usage:
   Code      :      1518 words (3036 bytes)
   Data      :        45 bytes
   EEPROM    :         0 bytes

Jeżeli nie masz tego kompilatora, nie możesz skompilować, to możesz pobrać gotowy 'wsad’ skompilowany przeze mnie tu.

Programowanie

W tym kroku potrzebne jest Avrdude lub inny soft mogący programować układy AVR z pliku w formacie Intel Hex. Jeżeli masz zainstalowane najnowsze Arduino, to powinieneś mieć w nim również Avrdude.

tgy$ make program_usbasp_tp_8khz
avrdude -c usbasp -B.5 -p m8 -U flash:w:tp_8khz.hex:i
&nbsp;
avrdude: set SCK frequency to 1500000 Hz
avrdude: warning: cannot set sck period. please check for usbasp firmware update.
avrdude: AVR device initialized and ready to accept instructions
&nbsp;
Reading | ################################################## | 100% 0.01s
&nbsp;
avrdude: Device signature = 0x1e9307
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: set SCK frequency to 1500000 Hz
avrdude: warning: cannot set sck period. please check for usbasp firmware update.
avrdude: reading input file "tp_8khz.hex"
avrdude: writing flash (8192 bytes):
&nbsp;
Writing | ################################################## | 100% 5.02s
&nbsp;
&nbsp;
&nbsp;
avrdude: 8192 bytes of flash written
avrdude: verifying flash memory against tp_8khz.hex:
avrdude: load data flash data from input file tp_8khz.hex:
avrdude: input file tp_8khz.hex contains 8192 bytes
avrdude: reading on-chip flash data:
&nbsp;
Reading | ################################################## | 100% 4.38s
&nbsp;
&nbsp;
&nbsp;
avrdude: verifying ...
avrdude: 8192 bytes of flash verified
&nbsp;
avrdude: safemode: Fuses OK
&nbsp;
avrdude done.  Thank you.

Bootloader

Powyższy program zawiera również bootloader, który umożliwia późniejsze przeprogramowywanie regulatora już bez dolutowywania się do wewnętrznych padów. Wystarczy do tego złącze sterującej regulatora. Niestety, za taką wygodę trzeba zapłacić kolejnym programatorem: Turnigy USB Linker albo przy pomocy Arduino można samemu zrobić to samo przy pomocy tego programu: ArduinoUSBLinker.

Dodatkowo, żeby bootloader zawsze działał, trzeba zmienić fuse bity: BOOTSZ i BOOTRST. W tym regulatorze, po ich zmianie, nowa wartość dla hfuse powinna wynosić: 0xca (albo 0xc2 jeżeli chcemy, żeby zawartość eepromu przeżywała chip erase).

tgy$ avrdude -c usbasp -u -p m8 -U hfuse:w:0xca:m
&nbsp;
avrdude: warning: cannot set sck period. please check for usbasp firmware update.
avrdude: AVR device initialized and ready to accept instructions
&nbsp;
Reading | ################################################## | 100% 0.01s
&nbsp;
avrdude: Device signature = 0x1e9307
avrdude: reading input file "0xca"
avrdude: writing hfuse (1 bytes):
&nbsp;
Writing | ################################################## | 100% 0.00s
&nbsp;
avrdude: 1 bytes of hfuse written
avrdude: verifying hfuse memory against 0xca:
avrdude: load data hfuse data from input file 0xca:
avrdude: input file 0xca contains 1 bytes
avrdude: reading on-chip hfuse data:
&nbsp;
Reading | ################################################## | 100% 0.00s
&nbsp;
avrdude: verifying ...
avrdude: 1 bytes of hfuse verified
&nbsp;
avrdude done.  Thank you.

Testy

Na początku radzę podłączyć regulator do akumulatora przez rezystor 10 Ohm (najlepiej kilkuwatowy). Wartość jest na tyle mała, że silnik wystartuje i będzie się kręcił, ale z drugiej strony na tyle duża, że gdyby coś poszło nie tak, to nie spalimy sobie regulatora.
modified hk-18a - testing via resistor

Na koniec mały filmik porównujący regulator z oryginalnym oprogramowaniem oraz ze zmienionym:

Opublikowano w R/C | Tagi: avr, r/c, simonk, tricopter, video | 3 komentarze

Analizator stanów logicznych

majek.sh Opublikowano w 2013-02-25 przez majek2013-07-02

Tym razem o dwóch rzeczach na raz, ale w sumie o jednej:-) Czyli nowa moja zabawka: analizator stanów logicznych oraz zajawka diversity do odbiornika wideo.

Analizator stanów logicznych

Robiąc cokolwiek przy technice cyfrowej, mikrokontrolerach itp., analizator stanów logicznych może być bardzo przydatny do debugowania. Jest też świetny do rozgryzania gotowych układów 🙂
Od pewnego czasu chodziło mi po głowie, żeby sobie zrobić The Fabulous Logic Analyzer, ale port równoległy, to niestety coś co jest coraz rzadziej spotykane, zwłaszcza w laptopach 🙁
Niedawno widziałem jak działa Saleae Logic16🙂 Robi wrażenie, zwłaszcza, że działa również pod Linuxem. Tylko 100-200 Euro to trochę za dużo za nową zabawkę, więc zacząłem szukać bardziej dostępnych cenowo alternatyw. Po przekopaniu Internetu znalazłem, że starsza wersja Saleae Logic, CWAV USBee SX i inne tańsze analizatory oparte są na tym samym układzie Cypressa: CY7C68013A – i co ciekawe prawie bez dodatkowych części. Wiedząc czego szukać znalazłem na Ebay-u płytkę prototypową Lcsoft CY7C68013A Mini Board za mniej niż $12, którą oczywiście szybko kupiłem 🙂
LCSoft Cypress prototyping board

Nie jest ona kompatybilna z Saleae mimo zaprogramowanego takiego samego identyfikatora USB (VID/PID), ale ponieważ staram się używać otwartego softu o ile się da, to wybrałem Sigrok-a, który to założenie spełnia i radzi sobie z tą płytką.
Po pewnych trudnościach ze spełnieniem zależności (Python3, sdcc i trochę innego dziwnego softu), w końcu się skompilował i zaczął działać. Sigrok na szczęście przychodzi ze swoim firmware do układów Cypressa, więc nic tym razem nie trzeba piratować 🙂

Jest nawet lepiej, płytka Lcsoftu ma zworkę, gdzie można zmienić tryb pracy pomiędzy 'Saleae’ i 'Płytka prototypowa Cypress’.
W trybiie Saleae, Sigrok wrzuca kompatybilny firmware, więc dostępne jest tylko 8 bitów przy samplowaniu 24MHz.
Natomiast po przełączeniu w tryb natywny dostajemy analizator z 16 wejściami. Niestety, dla 16 bitów 24MHz jest już nieosiągalne (max 12MHz), ale można zmniejszyć liczbę próbkowanych wejść i jak zejdziemy do 8 bitów i mniej, to wtedy jest dostępna jest pełna prędkość.

Sogrok jest w miarę nowym projektem, więc gui nie jest niestety jego mocną stroną, ale przynajmniej można posamplować i podejrzeć przebiegi. I to wszystko – nawet zapisu nie da się zrobić 🙁
Sigrok's Pulseview

Za to uruchamiany z linii komend sigrok_cli jest już całkiem potężnym narzędziem.

Analizowanie odbiornika wideo

Nadszedł czas coś poanalizować i odbiornik wideo z zestawu Fox700 jest idealny do tego 🙂
Zastanawiałem się od jakiegoś czasu co dokładnie biega w nim na szynie i2c, czyli jak dokładnie programowany jest tuner dla konkretnej częstotliwośći odbioru, i okazja się w końcu znalazła 🙂

Standard 1.2GHz video receiver
Logic analyzer and video receiver

Jak widać na zjęciach powyżej, dodałem prosty konwerter poziomów na opornikach i diodach Zenera. Było to konieczne ponieważ odbiornik wideo działa na 5V, a układ Cypressa na 3.3V. Oczywiście na początku próbowałem bez diod Zenera, ale to niestety nie jest AVR i dziwne rzeczy się działy :–)

Samplowanie przy pomocy sigrok_cli:

$ sigrok-cli --driver fx2lafw --device samplerate=24000000 --time 1s -p 0-7
libsigrok 0.2.0
Acquisition with 8/16 probes at 24 MHz
0:00000000 00000000 00000000 00000000
1:00000000 00000000 00000000 00000000
2:00000000 00000000 00000000 00000000
3:11111111 11111111 11111111 11111111
4:11111111 11111111 11111111 11111111
5:11111111 11111111 11111111 11111111
6:11111111 11111111 11111111 11111111
7:11111111 11111111 11111111 11111111

Jedynki i zera są całkiem fajne, ale prawdziwa siła Sigroka tkwi z możliwości dekodowania protokołów:

$ sigrok-cli --driver fx2lafw --device samplerate=24000000 --time 10s -p 0-7 -o test.sr
$ sigrok-cli -i test.sr -a i2c:sda=0:scl=1
i2c: "START"
i2c: "ADDRESS WRITE" "0x68"
i2c: "ACK"
i2c: "DATA WRITE" "0x05"
i2c: "NACK"
i2c: "STOP"
i2c: "START"
i2c: "ADDRESS READ" "0x50"
i2c: "ACK"
i2c: "DATA READ" "0x00"
i2c: "NACK"
i2c: "STOP"
i2c: "START"
i2c: "ADDRESS WRITE" "0x61"
i2c: "ACK"
i2c: "DATA WRITE" "0x2b"
i2c: "ACK"
i2c: "DATA WRITE" "0x6c"
i2c: "ACK"
i2c: "DATA WRITE" "0x8e"
i2c: "ACK"
i2c: "DATA WRITE" "0xf0"
i2c: "ACK"
i2c: "STOP"

Zapisy na początku, to jakieś śmieci, myślę, że układ sterujący był zaprojektowany do innego układu z dodatkowymi peryferiami, ale w zasadzie to co jest interesujące, to zapisy pod adres 0x61.
Zgodnie z dokumentacją układu SP5055 (synteza używana w większości takich tunerów), adres 0x61 jest adresem pod którym układ zawsze odpowiada, niezależnie od ustawienia stanu na nóżce adresu.
W czasie zapisu zostają przesłane 4 bajty: 2 bajty dzielnika (różne dla każdego kanału) oraz 2 bajty innych ustawień (stan, zewnętrzne wyjścia) – zawsze takie same.

Sprawdźmy więc jaka częstotliwość powinna być zaprogramowana.

Dzielnik w powyższym przykładzie wynosi 0x2b6c (MSB jest transmitowane najpierw) = 11116

Zgodnie ze specyfikacją układu, częstotliwość dostrojenia wynosi:
f = dzielnik * 16 * Fcomp
Fcomp jest częstotliwością z podłączonego kwarcu lub zewnętrznego generatora (typowo 4MHz) podzieloną przez 512, więc:
f = dzielnik * 16 * 4000000 / 512

W tym przypadku synteza/generator jest natrojony na 1389500000Hz = 1389.5MHz
Ale to nie koniec – trzeba jeszcze odjąć częstotliwość pośrednią, czyli w tym tunerze 479.5MHz.
Czyli w rzeczywistości tuner jest dostrojony do częstotliwości 910MHz co odpowiada dokładnie kanałowi 0, który był ustationy w odbiorniku w czasie testu.

Sukces! 🙂

Jedną z rzeczy, które mi brakuje w sigrok_cli jest brak timestampów (chociaż opcją -v można zobaczyć liczbę sampli), ale ponieważ jest to otwarty soft, to może ktoś to prędzej czy później dopisze (może nawej ja) 😉

Na dzisiaj już wiem jak programować tuner, więc mogę zrobić swój kontroler.
Dlaczego? Bo wg. dokumentacji SP5055 niektóre tunery powinny mieć możliwość odczytu z wewnętrznego przetwornika ADC połączonego zazwyczaj z układem demodulatora, co daje informację o dostrojeniu/odstrojeniu między ustawioną częstotliwością, a rzeczywiście odbieraną. Dzięki temu można się dokładniej automatycznie dostroić do nadajnika, który stabilnością niestety nie grzeszy. Dodatkowo istnieje możliwość dostrojenia do dowolnej częstotliwości z zakresie pracy głowicy z rozdzielczością 125kHz 🙂
Dostrajanie z tymi informacjami wielu tunerów jednocześnie też nie jest problemem, więc również zrobienie diversity będzie prostsze 🙂

Opublikowano w Elektronika, Linux, R/C | Tagi: diy, fpv, i2c, logic analyzer, sigrok, video receiver | 13 komentarzy

Niesamowity analizator widma z tunera DVB-T

majek.sh Opublikowano w 2013-02-19 przez majek2013-06-22

Parę tygodni temu natknąłem się na jednym z forów FPV na temat o sprawdzaniu częstotliwości, zajętości pasma, antenach itp. Zauważyłem, że ludzie uzywają tanich tunerów DVB-T na chipie RTL2832U Realteka jako analizatora widma, a czasem nawet jako oscyloskopu.

Dla mnie była to jedna z tych mocno brakujących rzeczy w moim warsztacie, która wiele rzeczy by uprościła. Tak się na to napaliłem, że tym razem postanowiłem kupić tego dongla jak najszybciej za trochę więcej niż bezpośrednio z Chin (55zł). Udało mi się znaleźć taki w sklepie w moim mieście i już następnego dnia byłem kolejnym szczęsliwym posiadaczem takiego tunera:-)

Oto Lifeview LV5T Deluxe (pod marką NOT ONLY TV):


Wyposażony jest w trochę inny tuner niż opisany na stronie rtlsdr/osmocomSDR: Fitipower FC0013, ale za to z możliwością pracy w zakresie częstotliwości 22-1100MHz (trochę więcej niż oparte na FC0012):

Oprogramowanie

Żeby było jasne: używam Linuxa 🙂

Pierwszym krokiem jest ściągnięcie i instacja biblioteki rtl-sdr z http://sdr.osmocom.org/trac/wiki/rtl-sdr. W pakiecie są również regułki udev-a, więc później nie są już potrzebne uprawnienia root-a.
Na powyższej stronie można znaleźć również linki do różnych innych programów używających tej biblioteki.

Kolejnym krokiem jest ściągnięcie biblioteki Pythona pyrtlsdr, bo większość programów jest właśnie w tym języku (przynajmniej z tych co sprawdzałem). Po instalacji jeszcze kilku pakietów zależnych jak wxPython, numpy, matplotlib itp. zacząłem testować soft 🙂

RTLSDR-Scanner

Pierwszym programem był RTLSDR-Scanner. Prosty, prawie toporny analizator widma:

Łatwy w obsłudze, z mośliwością powiększania, ale skanowanie może odbywać się tylko od/do całych MHz. Dokładniejsze ustalnie pasma niestety nie jest możliwe – ale zawsze można użyć powiększenia.
Czyli całkiem niezły, ale czuję po nim niedosyt 🙂

rtlsdr-waterfall

Wodospad – coś co pokazuje prawdziwe możliwości komputerowego analizatora widma:
Prosty skrypt w Pythonie jest bardziej niż użyteczny.

Na przykład: pasmo komercyjnych stacji FM:

I sytuacja, gdzie wodospad pokazuje swoje prawdziwe możliwości – skan pasma ISM 433MHz z widocznymi nadajnikami, które wysyłają tylko krótkie paczki (to po lewej, to najprawdopodobniej jakiś sensor ze stacji pogodowej):

A wracając do modeli i R/C 🙂 Mój nadajnik na 40MHz:

W programie można zaznaczyć kawałek pasma i je zmierzyć, zmniejszać lub zwiększać zakres częstotliwości (ale niestety przy niższych wartościach aplikacja potrafi się wyłożyć), zmieniać czułość tunera żeby np. usunąć przesterowanie (i dodatkowe harmoniczne przez to spowodowane).

Audacity

Tak, to TO Audacity: znany program do obróbki audio. Zrobiłem sobie do niego małego patcha (niech zyje OpenSource 🙂 ), który pozwala zmienić częstotliwość próbkowania nawet do 10MHz (oryginalnie jest do 100kHz, natomiast rtl-sdr sampluje z częstotliwością ok. 2MHz) – w zasadzie po to, żeby narzędzie selekcji jak również FFT działały poprawnie.
Uzywając programu rtl_sdr z biblioteki rtl-sdr zrzuciłem trochę sampli na interesującej mnie częstotliwości i zaimportowałem to jako surowe 8 bitowe dane stereo do Audacity. Poniżej wyniki 🙂

Mój nadajnik na 35MHz na kanale 71. Mam lekki problem z zasięgiem na tym kanale i na tym obrazku widać dlaczego:

Można na nim zobaczyć, że:

  • radio jest 5 kanałowe (6 impulsów synchronizacji)
  • podstawowa częstotliwość jest przesunięta o ok. 5kHz od częstotliwości samplowania, czyli częstotliwości kanału – i to jest przyczyna złego odbioru (kanał ma szerokość 10kHz, więc odchyłka jest znaczna)
  • dewiacja wynosi ok. 3kHz (do ok. 8kHz od środka kanału)

To samo radio, ale z kwarcem na 63 kanał chodziło o wiele lepiej, co potwierdzają poniższe obazki:

Odchyłka od środka kanału jest mniejsza niż 3kHz, więc jest lepiej niż na kanale 71.

Dla porównania: mój prosty 4 kanałowy nadajnik na 40MHz:

Bardzo kusząco wygląda SDR# (dostępny również na Windows), ale wymaga jeszcze więcej zależności (MONO), więc może kiedyś indziej.
Ale jestem pewny, że to tego tematu jeszcze kiedyś wrócę z nowymi informacjami 🙂

Opublikowano w Elektronika, Linux, R/C | Tagi: r/c, rtlsdr, spectrum analyzer | 11 komentarzy

Koniec ery REXa 6000

majek.sh Opublikowano w 2013-02-18 przez majek2014-05-30

Gdzieś w okolicach roku 2001 zauroczył mnie malutki PDA z ekranem dotykowym: Xircom REX 6000.
Miał on dosyć szeroką społeczność, łącznie z bardzo aktywnymi programistami. Dodatki, aplikacje, opisy i hacki pojawiały się ciągle.
Była to dosyć droga zabawka, ale jednocześnie dosyć unikalna: mały PDA, wielkości karty PCMCIA (w zasadzie to była karta PCMCIA), z ekranem dotykowym, z nieulotną pamięcią (w przeciwieństwie do królującego wtedy Palm-a), z dużą ilością wbudowanych aplikacji (kontakty, kalendarz, lista zadań, przeglądarka wml), i możliwością synchronizacji danych z komputerem. Co więcej, był dedykowany portal rex.net zawierający wiadomości, prognozy pogody i inne ciekawe rzeczy, z którego można było pobierać dane do późniejszego przeglądania przez wbudowaną przeglądarkę wml. Po jakimś czasie pojawiły się również aplikacje generujące dowolne dane dla tej przeglądarki (e-booki, rozkłady jazdy itp.) udające w różny sposób oryginalny portal. Wszyscy byli szczęsliwi 🙂
I wtedy Intel przejął Xircoma i oznajmił koniec wsparcia dla REX-a, zaczynając od oznajmienia, że rex.net zostanie wyłączony za niecałe 2 miesiące.
Nie było zbyt wiele czasu, żeby coś z tym zrobić. Ponieważ byłem wielkim fanem tego PDA (miałem 2 sztuki), miałem swój serwer i miałem pojęcie o całej tej części http/cgi jaka była potrzebna do stworzenia takiego portalu, zacząłem reverse enineering protokołu używanego do synchronizacji. Nie było to proste, ale po ok. miesiącu miałem już podstawową funkcjonalność portalu gotową. Miesiąc ciężkiej pracy tylko nad tą jedną rzeczą był możliwy, bo … złamałem obojczyk i przymusowo musiałem zostać w domu 🙂
Dodatkowym ułatwieniem było to, że aplikacja do synchronizacji (tylko na Windows) miała url do portalu podany w rejestrze windowsa, więc podmienienie tego było bardzo proste i nie ingerowało w nią samą.

I w ten sposób narodził się rex.mamy.to 🙂
To był mój pierwszy 'portal społecznościowy’ 🙂
Ponieważ nie byłem w stanie dostarczyć gotowych wiadomości i prognozy pogody dla całego świata jak to było na rex.net, postanowiłem pozwolić użytkownikom na definiowanie urli do stron z treścią. Serwer automatycznie pobierał te strony 2 razy dziennie i dzięki filtrom był w stanie zamienić html-a na wml-a oraz wyciąć tylko interesujący nas kawałek na podstawie zdefiniowanych ciągów znaków. Oczywiście była też możliwość definiowania stron statycznych, gdzie można było sobie wrzucić cokolwiek się chciało (e-booki, instrukcje, rozkłady jazdy i inne). Zrobiony też został cały system dostępów do tych zasobów – można było zrobić coś tylko dla siebie, publiczne lub udostępnione tylko konkretnym osobom.
Do dnia dzisiejszego na portalu stworzone zostało ponad 4000 stron przez ponad 3000 użytkowników z całego świata, z czego większość w ciągu pierwszych dwóch lat działania strony.
W erze Facebooka nie jest to może imponująca liczba, ale w tamtych czasach było to naprawdę sporo.
Po wyłączeniu rex.net, Intel nawet na stronie oznajmiającej, że serwis jest wyłączony, podawał link do rex.mamy.to jako społecznościowego zamiennika zamkniętej usługi 🙂

Dzisiaj, po ponad 12 latach hostowania tego portalu, nadszedł czas na jego koniec. Utrzymywałem go tak długo jak ktoś z niego korzystał i na ile dało się utrzymać w działaniu tak stare oprogramowanie. Zeszłego roku tylko 3 osoby z zarejestrowanych zalogowały się (z czego dwie jeszcze synchronizowały REXa!). Jestem również w trakcie migracji usług ze starego serwera na nowy, gdzie kompilacja ponad 12 letniego oprogramowania byłaby niemożliwa, jak również samo cgi też by nie działało po przeniesieniu.

Dlatego to już koniec rex.mamy.to, przykro mi.

Opublikowano w Życie | Tagi: rex.mamy.to, rex6000, xircom | 15 komentarzy

LCD88: Nadajnik R/C DIY

majek.sh Opublikowano w 2013-01-12 przez majek2013-09-01

Jeszcze jeden? 🙂

Jest kilka otwartych projektów. więc po co następny?
Od początku: zacząłem ten projekt już w 2009, wtedy nie było zbyt wiele opcji dostępnych, gotowe nadajniki o sporych możliwościach były bardzo drogie. No i żaden nie był dostatecznie elastyczny jak dla mnie 🙂 Nawet dzisiaj nie wiem czy podobny nadajnik istnieje, przynajmniej za sensowną cenę, a nie tysiące $$ 🙂

BLOCZKI!

Cała unikalnośc tego projektu tkwi w BLOCZKACH!
Do sterowania każdym modelem mamy jakieś drążki, gałki, przełączniki, i na wyjściu kilka kanałów. Pomiędzy wejściami a wyjściami jest zawsze mniej lub bardziej elastyczna 'czarna skrzynka’.
W moim projekcie wnętrze 'czarnej skrzynki’ można swobodnie definiować łącząc dowolnie matematyczne bloczki.

Bloczki jakie można użyć:

  • trymery
  • rewersy
  • dodawanie
  • odejmowanie
  • negacja
  • expo
  • mnożenie
  • zamiana wartości analogowej na 3 stany: -1,0,1 (dla przełączników)
  • powszechne mixery
  • limity
  • i wiele innych…

Najlepszą metodą na wyjaśnienie tego jak to wszystko działa jest pokazanie na przykładach.
W podanych przykładach powinieneś wiedzieć tylko, że kanały 0-7 są wejściami (drążki, potencjometry, przełączniki), natomiast 16-23 to kanały wyjściowe (to co dostanie odbiornik). Reszta czasem ma specjalne znaczenie, albo jest zarezerwowana, ale to nie jest tu ważne.

Prosty model – taki jak w większości prostych nadajników.

Podstawowe bloczki:

Kanał 0 (CH0) jest wejściem z drążka, jego wartoś idzie na wejście bloczka revers. Drugie wejście tego bloczka jest podłączone do kanału CH40, który pamięta pozycję przełącznika rewersu. Wyjście rewersu idzie do kanału 52. Następnym etapem jest bloczek trymera, który na jednym wejściu ma kanał 52 (wyjście poprzedniego bloczka), na drugim ma kanał 28 z którego dodaje wartość trymera. Wyjście bloczka trymera idzie już bezpośrednio do kanału wyjściowego.
Pozostałe kanały tworzy się w podobny sposób.

Bloczek specjalny rewers jest tak naprawdę bloczkiem mnożenia, ale w menu jest traktowany specjalnie – drugie wejście automatycznie pojawia się w menu 'Reverse’.
Podobnie jest z bloczkiem trymera, który jest bloczkiem dodawania, a drugie jego wejście pojawia się w menu 'Trims’.

Wygląda prosto, nieprawdaż? 🙂
To teraz coś odrobinę trudniejszego.

Delta lub latające skrzydło

Kolejny przykład: mixer delta.

Na początek warto napisać co taki mikser liczy:

lewa lotka = ( kierunek + wysokość ) /2
prawa lotka = ( - kierunek + wysokość ) /2

To narysujmy bloczki do policzenia tego:

Ale to tylko sam mixer, a co z trymerami, rewersami itp?

Spójrzmy więc na prawdziwy model:

Wygląda dosyć skomplikowanie, więc wyjaśnijmy o co tu chodzi.

Trochę zmodyfikowane równanie mixera delta:

prawa lotka=0.5*wysokość+0.5*kierunek
lewa lotka=0.5*wysokość-0.5*kierunek

Myślę, że większość ludzi, którzy mieli okazję latać latającym skrzydłem może potwierdzić, że ten typ modelu jest bardzo wrażliwy na ster wysokości. Jednym z rozwiązań tego problemu jest ustawienie expo na kanale wysokości. Ale można też po prostu znieczulić wysokość na korzyść steru kierunku. Czyli zamiast używać 0.5 jako mnożnik dla obydwu kanałów, używam mniejszego dla wysokości, a większego dla kierunku. Ważne, żeby suma współczynników nie była większa od 1, to wtedy wartości na wyjściu nie będą przesterowane lub obcięte (podobnie zrobiłem w moim małym mikserze na ATTINY13).

Spójrzmy na powyższy obrazek. Bloki 1-3 'wytwarzają’ mnożniki dla mixera delta. Ponieważ CH40 jest podłączony do bloczka trymera, więc jest możliwość z poziomu menu na modyfikację tego mnożnika. Bloczek 2 normalizuje wartość, żeby mieściła się między 0 a 1, Bloczek 3 wytwarza drugi mnożnik odejmując od 1 poprzedni wyliczony.
Bloczki 5,7,10,11,12 tworzą mikser delta z zmiennymi mnożnikami. Po mikserze delta są bloczki rewersów i trymerów dla właściwego ustawienia kierunku i pozycji neutralnej serwa.
Blisko wejść mamy bloczki 4,6 i 8 – zwykłe trymery przydatne do korekcji zachowania samolotu w locie.

Czyli jeżeli można sobie wyobrazić równanie opisujące zachowanie aparatury, to można takie coś zrobić z bloczków.
Oczywiście będą potrzebne jeszcze specjalne bloczki (stany, przełączniki, pamięci itp), ale to można niewelkim kosztem dorobić, i pewnie dorobię jak czegoś będę potrzebował 🙂

Wystarczy o bloczkach, warto jeszcze opisać kilka innych rzeczy 🙂

Architektura oprogramowania

W nadajniku jest kilka typów procesów:

  • krytyczny – generowanie sygnały PPM
  • wysokiego priorytetu – pobieranie wartości z wejść, przeliczenie bloczków i przygotowanie wartości dla generatora PPM
  • reszta – interfejs użytkownika (menu, wyświetlanie czegoś na LCD, trymowanie, opcje etc.)

Generowanie sygnału PPM

Użyłem sprzętowego generatora PWM, żeby PPM był jak najdokładniejszy jak to tylko możliwe 🙂
Udało się dzięki ustawieniu licznika w tryb CTC i modyfikacji go w przerwaniu, ale w niekrytycznym momencie. Cały pomysł opiera się na tym, że zmiana górnej wartości licznika w tym trybie odbywa się automatycznie dopiero po dojściu licznika do końca. Czyli nową wartość dla następnego cyklu można wpisać w dowolnym momencie trwania obecnego bez jego zaburzania. Daje to sporo czasu na przeprogramowanie licznika i nie skutkuje jitterem czy innymi dziwnymi rzeczami. Ponieważ cały kawałek przebiegu dla jednego kanały składa się z impulsu synchronizującego, a później z o wiele dłuższego zależnego od wartości zadanej, uruchamiam licznik zawsze ze stałą wartością dla czasu synchronizacji, a po jego zakończeniu już programuję licznik na nowy cykl. Ponieważ mam na to co najmniej 10000 cykli zegarowych, szansa, że nawet jakieś inne przerwanie opóźni przeprogramowanie jest właściwie zerowa.
A ponieważ przeprogramowywanie odbywa się w przerwaniach, więc niezależnie co robi główny wątek programu, to sygnał PPM jest zawsze generowany.

Odczytywanie wartości, przeliczanie i inne rzeczy

Kolejnym ciekawym rozwiązaniem jakie zastosowałem w tym oprogramowaniu jest multitasking (tak, na AVR:-) )
Ponieważ przerwania powinny być w miarę krótkie, natomiast proces przeliczania bloczków może trwać trochę dłużej, postanowiłem zrobić coś co pozwoli na ciągłe i prawidłowe działanie aparatury nawet jak dużo klikamy po menu czy wykonujemy inne czasochłonne operacje, które zabijają programy oparte na jednej pętli ze wszystkim.

Co się w takim razie naprawdę dzieje w tym sofcie?
Z powyższego widać, że w przerwaniach generowany jest sygnał PPM. Na przerwaniach również odczytywane są przetworniki ADC, przeliczane na zakres -1..1 i wstawiane w odpowiednie kanały. W przerwaniach jest również przeglądana klawiatura. Żadne z tych przerwań nie blokuje procesora na więcej niż kilkaset taktów.
Pozostają jeszcze dwie rzeczy: przeliczanie bloczków, które może zająć więcej czasu (więc nie powinno być robione w przerwaniach) oraz obsługa klawiatury i wyświetlanie informacji na wyświetlaczu (przerysowanie kolorowego wyświetlacza potrafi trwać nawet koło miliona taktów!). W tym wypadku postanowiłem, że wątek 'wyświetlacza’ jest głównym wątkiem i działa cały czas. Natomiast zaraz po tym jak zostaną zebrane nowe wartości z przetworników ADC wątek ten jest wywłaszczany i uruchamiane jest w jego miejsce przeliczanie bloczków. Gdy wszystkie bloczki zostają przeliczone, program wraca do poprzedniego wątku. W ten sposób wszystko robione jest o czasie, a klikanie po menu i wyświetlanie na ekranie nie ma żadnego negatywnego wpływu na działanie nadajnika.

Dodatkową zaletą multitaskingu jest to, że programując 'user interface’ nie muszę się martwić o czas wykonywania, czy dzielenie procedur na kilka części i uruchamianie ich po kawałku (jak to robiłem w GPS-ie).

Pamięć

Zdecydowałem się użyć wewnętrznej pamięci Flash (programu) jako miejsca na definicję modeli (bloczki, wartości kanałów itd). Dane są zapisywane 'kontenerami’ z odpowiednimi nagłówkami (numer modelu, typ bloczku itp), żeby można było szybko znaleźć w takim śmietniku odpowiedni bloczek. A ponieważ jest to pamięć flash o mniejszym życiu niż wbudowany, ale mały eeprom, więc jest jeszcze jedno dodadkowe założenie: każdy bloczek może wystąpić więcej niż jeden raz – w takim wypadku aktualnym jest ostatni. Pozwala to zmodyfikowane bloki po prostu zapisywać na końcu pamięci, a całość 'odśmiecać’ dopiero co jakiś czas na żądanie.
Z drugiej strony używanie trymerów mogło zapchać w ten sposób pamięć bardzo szybko, więc zdecydowałem, że jako tymczasowe miejsce do przechowywania będzie używany eeprom. Gdy już wszystko wytrymujemy jak trzeba, to można przenieść wartości kanałów z eepromu do flasha.

Właściwości nadajnika

  • Pamięć modeli (maksimum 31).
  • Każdy model składa się z:
    • komentarzy (maksimum 256/model), nazwa modelu jest jednym z nich i jest obowiązkowy, komentarze mogą opisywać kanały jak i bloczki
    • kanałów, niektóre są dedykowane jako wejście, niektóre jako wyjście, reszta moża być użyta jako miejsce na trymery, rewersy czy do połączeń pomiędzy bloczkami (maks. 253/model)
    • bloczków, które robią całą przeliczeniową część 'czarnej skrzynki’ (maksimum 255/model)
    • listy w jakiej bloczki powinny być przetwarzane, obecnie lista musi być ręcznie robiona, ale możliwe, że w przyszłości będzie generowana automatycznie
  • 8 kanałów wyjściowych, można zwiększyć, ale należy pamiętać, że wtedy ramka już może się nie zmieścić w standardowym czasie i trzeba będzie coś zmienić
  • 8 analogowych wejść z możliwością podłączenia pod nie przełączników
  • wyjście PPM (super dokładne, wolne od jiteru, ok. 11000 kroków na kanał)
  • wewnętrzne obliczenia robione na 16 bitowych liczbach stałoprzecinkowych (6+10), czyli z rozdzielczością ponad 2048 kroków
  • bootloader po porcie szeregowym, czyli upgrade firmware może być zrobione zwykłym kablem usb-serial(ttl)
  • kolowy wyświetlacz LCD
  • 6 klawiszy do nawigacji po menu
  • Open source! (kod wrzucę niedługo)

Troszkę historii

W 2006, kiedy zacząłem interesować się modelami R/C, kupiłem najtańszą 4 kanałową aparaturę z myślą, że jak będę potrzebował czegoś więcej, to na tej bazie zrobię sobie już sam:-)
Gdzieś pomiędzy 2007 a 2008 podczas dyskusji na forum Alexrc narodziła się idea super elastycznego nadajnika.
Pomysłem było, żeby to co jest w środku nadajnika dało się zdefiniować przy pomocy bloczków z podstawowymi funkcjami matematycznymi i połączeniami pomiędzy nimi, wejściami i wyjściami.
W 2008 zrobiłem sobie uniwersalną płytkę do wielu zastosowań na Atmega8L i z wyświetlaczem z telefonu Siemens S65.
W 2009 wymieniłem Atmega8L na Atmega88 – dzięki temu mogłem podnieść taktowanie procesora z 7MHz do ponad 11MHz nadal pozostając w zgodzie ze specyfikacją procesora i zasilając go z 3V. I tu prawdziwa historia się zaczyna 🙂
Pod koniec 2009 miałem już kilka rzeczy skończonych: generowanie ppm, przeliczanie bloczków, multitasking, podstawy interfejsu użytkownika (menu, klawiatura). I od tej pory projekt utknął na prawie 3 lata.
Chciałem zrobić wszystko zbyt uniwersalne i niestety to podejście nie sprawdziło się do intefejsu użytkownika. Podczas tych lat używałem kilku prostych nadajników, które do moich samolotów sprawdzały się całkiem nieźle. Ale nowy projekt Tricoptera zmienił wszystko, gdy nie byłem w stanie żadnym nadajnikiem uzbroić płytki sterującej, poza tym nagle zaszła potrzeba posiadania więcej niż 4 kanałów. W ten sposób stary projekt odżył.
Pod koniec 2012 usunąłem praktycznie cały 'superuniwersalny’ kod generujący menu, przemyślałem pewne rzeczy (trzymanie trymerów również w eepromie) i od tego czasu projekt poszedł naprzód.
Płytkę wsadziłem do starego nadajnika, który kupiłem za 5zł, dodałem moduł FrSky DHT, podłączyłem razem do kupy i teraz można tego już używać w prawdziwym świecie 🙂

Przyszłość

  • Zmiana procesora na Atmega168 lub od razu na Atmega328 (kod jest gotowy dla obydwóch – trzeba tylko porobić płytki i polutować)
  • Ponieważ obecnie praktycznie nie jest możliwy już zakup wyświetlacza od S65 (mimo, że mam jeszcze zapas 🙂 ), to kupiłem już podobny i postaram się jego również obsługiwać.
  • Przejrzenie i zmiana kodu, żeby można było go uruchomić na zwykłej płytce Arduino z procesorem Atmega328 (czyli dostosowanie do innej częstotliwości taktowania).
  • Więcej kodu, więce funkcjonalności (niestety już nie na Atmega88, bo więcej tam się już nie zmieści w pamięci)
  • Timery, extender i/o (możliwość podłączenia dodatkowych wejść, wejście trenera)
  • …
Opublikowano w Elektronika, R/C | Tagi: arduino, avr, diy, frsky, lcd88, ppm, r/c, transmitter | 6 komentarzy

Nawigacja

← Starsze posty
Nowe posty →
  • English
  • Polski

Ostatnie wpisy

  • Jeep Grand Cherokee ZJ – wentylator elektryczny
  • (English) New 3D printer – vn-corexy
  • (English) Classic keyboard for Lenovo X230
  • Zmiany, zmiany
  • Zapisywanie do wewnętrznej pamięci flash w Arduino
  • dm-cache w Slackware
  • Lampki choinkowe na Arduino i led-ach z kontrolerem WS2811 :-)
  • Initrd w Slackware
  • Złodziej zdjęć
  • Lutowanie kabla AWG10 do wtyczki XT60
  • LCD88 na wolności :-)
  • XEBOOT – mały bootloader dla Atmega8 obsługujący xmodem
  • RTL-SDR i ADS-B
  • Interfejs bluetooth z Chin :-)
  • Skończył się 2013, leci 2014

Najnowsze komentarze

  • demostenes - HobbyKing SuperSimple HK-18A z firmware SimonK
  • majek - Lutowanie kabla AWG10 do wtyczki XT60
  • Hello - Lutowanie kabla AWG10 do wtyczki XT60
  • wefwe - Koniec ery REXa 6000
  • Kudłaty - Miernik częstotliwości do 100MHz
  • majek - Miernik częstotliwości do 100MHz
  • somok - Miernik częstotliwości do 100MHz
  • majek - Miernik częstotliwości do 100MHz
  • AM Technologies - Miernik częstotliwości do 100MHz
  • majek - LCD88: Nadajnik R/C DIY

Kategorie

  • 3D printing (1)
  • Car (1)
  • Elektronika (22)
  • Życie (12)
  • Linux (9)
  • R/C (20)

Archiwa

  • lipiec 2022 (1)
  • styczeń 2021 (1)
  • kwiecień 2018 (1)
  • marzec 2018 (1)
  • czerwiec 2015 (1)
  • marzec 2015 (1)
  • styczeń 2015 (1)
  • grudzień 2014 (2)
  • sierpień 2014 (1)
  • czerwiec 2014 (1)
  • maj 2014 (1)
  • marzec 2014 (2)
  • luty 2014 (1)
  • listopad 2013 (1)
  • sierpień 2013 (1)
  • czerwiec 2013 (3)
  • kwiecień 2013 (1)
  • luty 2013 (3)
  • styczeń 2013 (2)
  • grudzień 2012 (1)
  • październik 2012 (1)
  • wrzesień 2012 (1)
  • sierpień 2012 (9)
  • lipiec 2012 (1)
  • czerwiec 2012 (2)
  • marzec 2007 (1)
  • marzec 2006 (1)
  • październik 2005 (1)
  • luty 2002 (1)

Tagi

1-wire ads-b arduino avr awstats car china crash dialog diy dns e-osd e-wro fpv frsky fun g-osd gps głupota harpagan i2c lcd lcd88 linux logic analyzer multiwii netia osd ppm r/c repair rex.mamy.to rex6000 rtlsdr simonk slackware small things spectrum analyzer transmitter tricopter video video receiver vn-corexy watchdog xircom

Blogi

  • Blog Akuaku
  • Savage Chickens
  • xkcd

Znajomi

  • Belfer
  • Copernicus Project
  • freesco.pl
  • Harpagan
  • Sadziu
  • Tropiciel
  • Wydawnictwo Dobrew (audiobooki)
  • Wydawnictwo Muszkin

Hosting

  • mamy.to
©2025 - majek.sh - Weaver Xtreme Theme
↑