Witam
To mój pierwszy post na tym portalu, który śledzę od paru miesięcy. Elektroniką zajmuje się od dobrych paru lat i często używam AVR’ów oraz, od niedawna, środowiska Arduino.
Trochę o USBasp
USBasp cieszy się dużą popularnością wśród osób programujących AVR’y. Do zbudowania działającego egzemplarza wystarczy mikrokontroler ATMega8 (lub podobny, choć nie każdy – o tym zaraz), garść elementów dyskretnych i drugi programator ISP (lub kolega, który ma taki i pożyczy na chwile). Cała obsługa USB zaszyta jest w mikrokontrolerze. Programator można zbudować wyłącznie z elementów przewlekanych (tak jak ja to uczyniłem). Jest to open hardware (jak arduino) – schematy, program (kod źródłowy i wsad) i sterowniki są ogólnie dostępne na stronie projektu (http://www.fischl.de/usbasp/). Mimo, że projekt wydaje się w stu procentach amatorski, to powstają fabryczne programatory oparte o USBasp.
Programator przyda się osobom programującym zarówno w Arduino (dzięki temu możemy zwolnić port szeregowy i przeznaczyć go do innych celów lub odratować uszkodzony bootloader) jak i pracującym w innych środowiskach i językach – Bascom, C (WinAVR), czy asembler.
Schemat
To oryginalny schemat ze strony projektu:
Wprowadziłem do niego kilka modyfikacji:
- Usunięte zostało połączenie portu ISP z pinami UART mikrokontrolera. Skąd się wzięły? Otóż twórcy planowali w przyszłości dodać obsługę portu szeregowego i wprowadzić “standard” umożliwiający debugowanie programowanego mikrokontrolera z poziomu programatora. Ponieważ nic nie słychać o rozwijaniu tejże opcji, jest nieużywana. Piny 4 i 6 portu ISP zostały podłączone standardowo – do masy.
- Zmieniłem trochę w zworkach – Zworka Self Programming (używana do wgrania firmware do nowego programatora) została zastąpiona dwoma goldpinami łączonymi łączówką. Zamiast dwóch pozostałych (Slow SCK i Supply target) zostały zastąpione podwójnym DIP-Switchem.
- Nóżkę AREF podłączyłem do plusa zasilania.
- Pomiędzy mikrokontrolerem a złączem ISP na szynach MOSI, MISO, SCK i Reset dodałem po rezystorze 100-omowym (o tym w tekście).
- Rezystor R1 (60 ohm) zastąpiłem 47-omowym (o tym w tekście).
Wykonanie PCB
Od jakiegoś czasu mniejsze płytki drukowane wykonuje ręcznie, przy użyciu pisaka. Jest to dobra okazja, by pokazać tą metodę:
Zaczynam od wykonania szkicu ścieżek na kartce w kratkę (w zeszycie). Szkic wykonuje ołówkiem, zaznaczając ścieżki i miejsca wierceń, patrząc od strony elementów. Jedna kratka (0.5 mm) to jeden odstęp w rastrze (2.54 mm – 0.1 cala). Następnie ścieżki poprawiam markerem.
Marker przebija się na drugą stronę kartki i w ten sposób powstaje układ ścieżek od strony druku.
Pora na przygotowanie PCB: Należy ją najpierw dociąć na wymiar. Ponieważ jestem leniwy wziąłem gotową płytkę, lekko “wyrośniętą”, którą zresztą potem musiałem docinać :). Przecieramy płytkę drobnym papierem ściernym (np. 500) , by zdjąć warstwę zabrudzeń.
Pora na punktowanie. Na podstawie rysunku za pomocą małej wiertarki punktuje lekko miejsca na otwory. Ułatwia to rysowanie i wiercenie. Używając wzornika w postaci starej płytki uniwersalnej (moja lata świetności ma za sobą) udaje mi się zachować prawidłowy raster. Tu akurat zapozowała mi inna płytka (nie mam zdjęcia oryginału, ale metoda jest identyczna).
Po punktowaniu jeszcze raz szlifujemy płytkę, by wyrównać warstwę miedzi po wierceniu. Myjemy płytkę najpierw wodą, a potem rozpuszczalnikiem (najlepiej nitro lub benzyną ekstrakcyjną).
Od tego momentu nie dotykamy warstwy palcami ani innymi częściami ciała.
Pora na pisak: Tu dużo zależy od pewnej ręki i wyczucia. Osobiście polecam pisaki olejne – są drogie (od 10 zł za pisak), długo schną i strasznie brudzą, lecz dają grubą warstwę, która trudno odpada przy trawieniu, poza tym można go potem ponownie napełnić tuszem. Punkty pomagają przy rysowaniu. Wprawdzie nie wszędzie udało się uzyskać odpowiednio prostą kreskę, ale jestem zadowolony. Przy kreśleniu należy pamiętać o “rozpisywaniu” co jakiś czas pisaka na niepotrzebnym kawałku PCB.
Tak wygląda Płytka po szkicowaniu.
Odstawiamy ją do wyschnięcia tuszu (na oko jakaś godzina dla całkowitej pewności, może wystarczy krócej…).
Pora na… kawę?
Zdjęcie wygląda niedorzecznie, ale cóż…
Do trawienia PCB używam starego ekspresu do kawy. Dodatkowo kontroluję temperaturę termometrem (Termometr jest własnej konstrukcji, używa DS18B20. Opublikowałbym go ale ma trochę wad i niuansów. Planuję jednak nową, ulepszoną wersję). Ekspres sprawdza się bardzo dobrze, jedynie utrzymuje za wysoką temperaturę (termostat do podregulowania), co powoduje że muszę doglądać temperatury i włączać/wyłączać co jakiś czas ekspres.
Jako środek trawiący używam roztworu nadsiarczanu sodu B320. Ten roztwór ma już kilka płytek za sobą (dlatego jest taki niebieski), lecz można go używać wielokrotnie, aż przestanie działać. Temperaturę należy utrzymywać w okolicach 40 stopni, pamiętając, by nie przekroczyć 50 (wtedy najczęściej dochodzi do podtrawień). Co jakiś czas mieszajmy roztwór. W moim przypadku trawienie trwało ponad 3 godziny, na co nałożyło się kilka czynników – dużo miedzi do strawienia, stary roztwór i rzadkie mieszanie. Ale się udało, i to bardzo dobrze.
PCB płuczemy i suszymy. Teraz zdejmujemy warstwę pisaka. Można użyć do tego zmywacza do paznokci, jednak ja użyłem nitro – rezultat jest o wiele lepszy!
Doszło do jednego poważnego podtrawienia, które zmostkowałem przy lutowaniu kroplą cyny.
W międzyczasie zdecydowałem o skróceniu płytki o mojego maila, by zwiększyć wygodę wpinania kabla USB.
Szlif jest trochę krzywy, potem lekko go poprawiłem, finalnie (po wlutowaniu części) jest to niewidoczne.
Jeszcze jeden krok, którego nie udokumentowałem: do małego naczynia np. kieliszka wlewamy odrobinę (kilka ml) spirytusu lub denaturatu. Następnie wrzucamy trochę opiłków kalafonii i rozpuszczamy do uzyskana lekko żółtawej cieczy. Nasiąkamy nią wacik kosmetyczny i smarujemy nią PCB. Dzięki temu płytka wolniej śniedzieje a lutowanie staje się łatwiejsze.
Pora na wiercenie. Używam małej wiertarki do płytek. Otwory na goldpiny oraz pod większe podzespoły wiercę wiertłem 1mm, pozostałe wiertłem 0,7 mm. Wiercę też miejsce na przylutowanie wtyku USB-B oraz otwory pod śruby. Później je rozwiercam za pomocą multiszlifierki. Potem jeszcze wyrównałem boki płytki pilnikiem (na zdjęciu tego nie widać).
Płytka jest gotowa.
Lutowanie
Przygotowujemy sobie wszystkie elementy:
- Podstawka DIP-28 cieńka
- Gniazdo ISP-10 (typu canda)
- Gniazdo USB-B do druku
- 2 goldpiny męskie
- DIP-switch podwójny
- Dwie diody LED 3mm – czerwona i zielona
- Dwie diody Zenera 3.6V
- Rezonator kwarcowy 12MHz
- Kondensatory ceramiczne 2x 22pF i 1x 100nF
- Kondensator 4.7uF lub podobny (u mnie jest 10uF)
- Rezystory: 4x 100Ω (dodane po moich modyfikacjach – można je zastąpić zworami), 2x 1kΩ, 1×60Ω, 1x 68Ω, 1×60Ω (u mnie 47Ω) , 1×2.2kΩ, 1x 10kΩ – wszystkie 0.25W 5%.
Odnieść się muszę do rezystora R1. Po prostu nie miałem 60-omowego rezystora, więc zastąpiłem go 47-omowym. Testy pokazały, że nie ma z tym problemów, niemniej jednak jak tylko zdobędę taki, to podmienie go :).
Podobnie w przypadku 4 rezystorów 100-omowych. Po co tam one? Bo wiele programatorów takie ma i nie bez powodu. Zapobiegają przepływowi dużych prądów, gdy stany logiczne na pinach programatora i programowanego uC są różne np. po zaprogramowaniu. Jednocześnie nie mają wpływu na proces programowania. Zostały dodane niejako “profilaktycznie”.
Zaczynamy od elementów najniższych (zwory), kończymy na gniazdach ISP i USB-B. To drugie (po przycięciu PCB) wystaje ok. 1-2mm poza obrys płytki. Przyda się przy wkładaniu programatora do obudowy. Lutowanie dobrze przygotowanej płytki to sama przyjemność…
Po zlutowaniu czyścimy resztki kalafonii i innych brudów za pomocą izopropanolu.
Mikrokontroler, ale jaki?
Wg twórców możemy użyć mikrokontrolera ATMega8, ATMega48 lub ATMega88. Nie możemy jednak wybrać sobie dowolnego. Zwróćmy uwagę na dokładne oznaczenie mikrokontrolerów. Mikrokontrolerów ATMega8-PU (bez 16-PU lub 20-PU) nie będziemy mogli zaprogramować, bo producent ograniczył ich taktowanie do 8MHz. Tu mamy 12MHz (Częstotliwość ta jest wymagana do obsługi USB).
W przypadku mikrokontrolerów ATMega8A-PU jest różnie, czego sam doświadczyłem. Miałem 3 sztuki – 2 nie pracują, jedna pracuje na 12MHz – tej użyłem do projektu. Nie wiem, od czego to może zależeć.
W przypadku innych modeli (48 i 88) nie jestem w stanie udzielić informacji.
Mikrokontroler wkładamy do podstawki. Pod względem sprzętowym jesteśmy gotowi. Tak prezentuje się gotowy programator.
Wgrywamy Firmware
Teraz wchodzimy na stronę projektu (podaną na wstępie) i z działu Circuits and Firmware ściągamy najnowszą wersję. Rozpakowujemy archiwum. Znajduje się w nim:
- wsady do mikrokontrolerów (w folderze ./bin/firmware)
- sterowniki do Windowsa (w folderze ./bin/win-driver)
- kod źródłowy (w folderze ./firmware – nie przyda nam sie)
- Schematy ideowe (./circuit)
Na razie nie wgrywamy sterowników! Przygotowujemy płytkę. Za pomocą łączówki zwieramy dwa goldpiny (jeden przy gnieździe ISP, drugi przy pinie RESET mikrokontrolera) i tym samym wprowadzamy programator w tryb Self programming, w którym wgrywamy nowy firmware. Na Dip-switch’u ustawiamy OFF na Slow SCK i ON na Supply target. Za pomocą taśmy ISP łączymy naszego USBasp’a z innym programatorem (w moim przypadku to STK500), który na koniec podłączamy do komputera. Port USB na USBasp pozostaje niepodłączony.
Uruchamiamy programator (np. AVR Studio) i łączymy się z programatorem Wybieramy odpowiedni mikrokontroler i na wszelki wypadek pobieramy sygnaturę sprawdzając, czy zgada się z modelem. Wgrywamy Fuse Bit’y:
dla ATMega8: High=0xC9, Low=0xEF (potwierdzone przeze mnie)
dla ATMega48: High=0xDD Low=0xFF (nie sprawdzałem)
Jeżeli wyskakuje błąd, znaczy że mamy błąd w montażu, zapomnieliśmy zmostkować piny Reset na uC i złączu (łączówka) lub nasz uC nie współpracuje z kwarcem 12MHz
Teraz do pamięci Flash wgrywamy z folderu /bin/firmware odpowiedni wsad. Odpinamy programator, zdejmujemy łączówkę. Pora sprawdzić, czy nasz USBasp pracuje:
Podłączamy nasz programator do komputera
Za pomocą kabla USB podłączamy nasz nowy programator do komputera. Na programatorze powinna zapalić się czerwona dioda LED, a na komputerze powinna pojawić się informacja o nowym sprzęcie. W przypadku Windows 7 zacznie się szukanie sterowników, których na razie nie instalowaliśmy:
Ten widok oznacza, że program do mikrokontrolera wgrał się prawidłowo, a programator pracuje.
UWAGA! W przypadku gdy pojawi się komunikat “Nie rozpoznano urządzenia USB” często pomaga wymiana diód Zenera z 3.6V na 3.3V
Instalujemy sterowniki na Windows 7
Najlepszym sposobem jest wgranie sterowników ręcznie.
Wchodzimy do Menedżera Urządzeń (Start > Panel Sterowania > Menedżer urządzeń). Znajdujemy nasz USBasp, przy nim ikonkę z wykrzyknikiem.
Klikamy na niego, powinien widnieć komunikat Sterowniki nie są zainstalowane. Klikamy Aktualizuj sterownik. Wybieramy, że chcemy ręcznie wskazać ścieżkę do sterowników. System pyta nas o folder, w którym one są. Wskazujemy podfolder /bin/win-driver/ a w nim folder IA64, x86 lub amd64 (w zależności od architektury naszego komputera). Jeszcze tylko klikamy instaluj mimo to w oknie Alertu zabezpieczeń i po kilku sekundach sterowniki są zainstalowane. W menedżerze pojawia się nowy sprzęt:
Od tego momentu nasz programator jest gotowy do użytku. Warto sprawdzić, czy poprawnie programuje np. za pomocą Arduino wgrywamy jakiś prosty program (Blink :) ), wybieramy płytkę, programator (USBasp oczywiście) i wgrywamy.
A linux...
Warto też wspomnieć o instalacji na systemach opartych na jądrze linux. W moim przypadku jest to Ubuntu 15.10. Jeżeli chodzi o Linux, to pewnie część z was zwróciła uwagę na folder /bin/linux-noroot. Niestety, wspomniany patch jest nieaktualny (u mnie nie działa), nowe zasady wgramy sobie ręcznie.
Ta część pochodzi ze strony http://www.blue17.elektroda.eu/usbasp/1161. Mi dzięki temu tutorialowi udało się skomunikować z USBasp.
Zaczynamy od podpięcia naszego USBasp’a. Otwieramy terminal i wpisujemy lsusb. Powinniśmy zobaczyć nasze urządzenie:
Musimy zainstalować wspomniany pakiet libusb: wpisujemy
sudo apt-get update
sudo apt-get install libusb–1.0–0–dev
Po zainstalowaniu musimy stworzyć nową grupę i dodać siebie do niej
sudo addgroup usb
sudo adduser hubert usb (oczywiście zamiast hubert wpisujemy swoją nazwę użytkownika)
Teraz pora na wspomiany plik zasad. Dzięki niemu programy uruchamiane z poziomu innego niż root będą mogły korzystać ze sterowników.
Uruchamiamy gedit’a z poziomu root’a
sudo gedit
Wklejamy do niego poniższą treść:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# USBasp programmer ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="05dc", ATTRS{product}=="USBasp", GROUP="usb", MODE="0666" # Atmel devices SYSFS{idVendor}=="16c0", MODE="666", GROUP="usb" # Devices: free (VOTI) SYSFS{idVendor}=="16c0", MODE="666", GROUP="usb" # Microchip devices SYSFS{idVendor}=="04d8", MODE="666", GROUP="usb" # standard converter FTDI SYSFS{idVendor}=="0403", MODE="666", GROUP="usb" # NXP SYSFS{idVendor}=="0471", MODE="666", GROUP="usb" # LPC-Link probe (Code Red?) SYSFS{idVendor}=="1FC9", MODE="666", GROUP="usb" |
Plik nazywamy USBasp.rules i zapisujemy w folderze /etc/udev/rules.d.
Potem wystarczy odpalić Arduino (lub inne środowisko) by sprawdzić, czy układ poprawnie programuje.
Na koniec…
Niniejszy tutorial jest długi, lecz sam projekt robi się szybko i nie wymaga on dużej wiedzy w zakresie programowania. Sam programator można zrobić na płytce uniwersalnej, ale należy pamiętać by być dokładnym i nie ciągnąć zbyt długich ścieżek, szczególnie przy USB.
Do gotowego programatora warto wykonać jakąś obudowę. Ja planuje wykorzystać pudełko po kasecie magnetofonowej.
Jeżeli macie jakieś pytania, służę pomocą w komentarzach.
Myślę, że to nie będzie mój ostatni projekt na tej stronie. Pozdrawiam i życzę powodzenia.
Hubert.
Plusik za samodzielne rysowanie ścieżek – da sie? Da!
Da się ale wygląda to słabo.
Co mierzysz na tym ekspresie do kawy?
temperaturę roztworu
Mierzy na bieżąco czy ma jakiś data logger?
Po prostu – mierzy i wyświetla na 7-segmentowym wyświetlaczu. Wykorzystuje tu ATtiny2313. Miał być jeszcze termostat, ale nie zmieścił się do programu.
Obecnie na stronie projektu USBasp widnieje inny schemat niż ten który pan zaprezentował. Są w nim już uwzględnione dodane przez pana rezystory 100Ohm – tam 270Ohm. Warto zauważyć że oba rezystory w liniach danych USB tj. R1 i R2 są wartości 68Ohm. Często przydaje się również zworka do odcinania zasilania do programowanego mikrokontrolera. Osobiście proponuje zapoznanie się z programami do tworzenia PCB, choćby darmowy i lekki KiCad. Metoda termotransferu wymaga porównywalnego zaangażowania co pisak, a mamy w zamian dużo lepsze efekty i możliwości.
Niby fajnie, ale to taka super biedna wersja. No i wypada dać po łapach za łączenie AREF do zasilania… ten pin jak już chcesz gdzieś łączyć do do masy przez kondensator 100nF, a w tym projekcie najlepiej zostaw w powietrzu(nie użyty ADC).