HobbyKing SuperSimple HK-18A z firmware SimonK
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
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.
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:
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:
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 🙂 ).
Pozostało tylko podłączyć to do programatora USBasp i zaprogramować.
Oprogramowanie
Wiadomo, że coś trzeba wgrać do tych procesorów w regulatorach 🙂
Skąd?
Ściągnąłem oprogramowanie prosto z repozytorium gita projektu:
Przed kompilacją wyłączyłem możliwość kalibracji regulatorów w tgy.asm:
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:
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
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.
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.
Pass 1...
Pass 2...
done
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
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.
avrdude -c usbasp -B.5 -p m8 -U flash:w:tp_8khz.hex:i
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
Reading | ################################################## | 100% 0.01s
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):
Writing | ################################################## | 100% 5.02s
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:
Reading | ################################################## | 100% 4.38s
avrdude: verifying ...
avrdude: 8192 bytes of flash verified
avrdude: safemode: Fuses OK
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).
avrdude: warning: cannot set sck period. please check for usbasp firmware update.
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.01s
avrdude: Device signature = 0x1e9307
avrdude: reading input file "0xca"
avrdude: writing hfuse (1 bytes):
Writing | ################################################## | 100% 0.00s
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:
Reading | ################################################## | 100% 0.00s
avrdude: verifying ...
avrdude: 1 bytes of hfuse verified
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.
Na koniec mały filmik porównujący regulator z oryginalnym oprogramowaniem oraz ze zmienionym:
hello,
I changed because of defective Atmega8.
How should I set the fuse.
Original is 0x1E 0x93 0x07
Request for Info
Thank you
You need to use avrdude (it’s distibuted with Arduino for example).
I guess that 0x1e is low fuse, 0x93 is high fuse and 0x07 are lock bits, so:
hfuse: avrdude -c usbasp -u -p m8 -U hfuse:w:0x93:m
lfuse: avrdude -c usbasp -u -p m8 -U hfuse:w:0x1e:m
lock bits: avrdude -c usbasp -u -p m8 -U lock:w:0x07:m
hello can i use your firmware to use the esc as a car (no brake, no reverse)esc?
where do i have to change the code?