Jako świeżo upieczony tatuś, a jednocześnie niby szef małego zespołu programistów, nie mogąc z racji nowych obowiązków ojca bywać codziennie w firmie postanowiłem mieć choć iluzoryczną kontrolę nad tym co się w firmie dzieje podczas mojej nie obecności. Wymyśliłem że zainstaluję tam kamerkę internetową. Uruchamiając zdalnie komputer w pracy mogłem się na niego łączyć przez pulpit zdalny a więc i mogłem podglądać to co kamera mi pokazuje. Jednak załoga nie mająca najwyraźniej zapędów exchibinistycznych nie była zadowolona z tego że mogę ich tak cichaczem podglądać, szybko okazało się że kamera niby przypadkiem jest przestawiana do ściany albo zasłaniana "przypadkowo" położonymi przed obiektywem przedmiotami.
Wymyśliłem sobie wtedy że zrobię prosty system panoramowania kamerą. Gdy nie będę podglądał kamerka będzie zwrócona do ściany, ale jak będę chciał sprawdzić czy w firmie wszystko jest w porządku to będę się rozglądał, co oczywiście wszyscy mają szansę zauważyć i przyjąć na czas odpowiednią pozę. Miałem nadzieję że nadrobię tym lekkie niezadowolenie kolegów a jednocześnie nie stracę taj jakże przydatnej dla pracownika wirtualnego możliwości bycia również oczami w firmie. Oto efekt końcowy mojej pracy. Trudno nazwać to w pełni profesjonalnym systemem panoramowania, ale do celów jakie sobie założyłem to rozwiązanie jest zupełnie wystarczające. Cały układ oparłem na mikrosterowniku firmy AVR ATMEGA 16. Projekt ten spokojnie zmieścił by się i do mniejszych mikrosterowników tej rodziny jednak ponieważ niedawnio kupiłem sobie programator JTAG-TWICE firmy Miklobit (wcześniej jechałem na zwykłym programatorku ISP własnoręcznie złożonym) pomyślałem sobie że miło będzie wykorzystać możliwości debugowania jakie daje interfejs JTAG a ponieważ najmniejszym mikrosterownikiem AVRa który ma JTAGa jest ATMEGA 16 więc stąd ta mikrosterownikowa rozrzutność.
Założyłem sobie że obrót kamery będzie wymuszany przez komputer za pomocą portu
Układ zmontowałem z części które właściwie miałem w domu, wiecie jak to jest jak ktoś się trochę bawi elektroniką to zawsze mu się po szufladach walają jakieś części pozostałe z nadmiarowych zakupów. Z lenistwa nawet postanowiłem nie robić płytki drukowanej, co niestety okazało się wątpliwą oszczędnością czasu ponieważ lutowanie tego na płytce uniwersalnej było całkiem sporym wyzwaniem związanym z planowaniem drogi kabelków, cięciem i zdzieraniem izolacji z ich końcówek i ich bieleniem, brrr nie polecam, robiłem to pierwszy raz w ten sposób, ale naprawdę chyba prościej i szybciej i bardziej elegancko jest już zrobić tę płytkę drukowaną, niż się bawić w taką partyzantkę (tym bardziej że teraz wykonanie płytki za niewielkie pieniądze można zlecić profesjonalnej firmie). Choć właściwie w tym przypadku można mówić że tworzyłem prototyp, bo lutowałem na żywca nie rysując nawet wcześniej schematu układu, jak mi to się udało zrobić to sam się dziś zastanawiam, no ale się udało a to najważniejsze.
Elementem wykonawczym w tym przypadku jest mały i słaby pięcio-końcówkowy unipolarny silnik krokowy, wyciągnięty ze starej 5cio calowej stacji dysków. Pełno ich się wala za psie pieniądze na giełdach elektronicznych (Wolumen itp.) Jest to bodaj najprostszy do wysterowania rodzaj silnika krokowego, wartości binarne przy pomocy których ustawiam cewki silnika znalazłem w internecie i o ile się nie pomyliłem silniczek ten jest sterowany pół krokowo. Sam silniczek przykręciłem do górnej połówki obudowy śrubkami a do jego wału przynitowałem podstawkę dla kamery wykonaną z blaszanego kółka (pozostałość po starej ale ukochanej zabawce jeszcze z mojego dzieciństwa tzw. "Małego Technika"). No już prościej nie można chyba tego zrobić, żadnych przekładni pasków itp. komplikacji, jednak ponieważ silniczek ten jest słaby zdarza mu się zgubić jakiś krok co oczywiście w tym zastosowaniu nie jest straszną tragedią, w końcu to nie frezarka numeryczna nie musi być idealnie. Dodam jeszcze w tym miejscu że układ do pracy potrzebuje dwóch napięć. Pięciu woltów do zasilania mikrosterownika oraz 12 woltów do zasilania silnika wraz z jego sterownikiem. O potrzebne napięcia najlepiej zadbać samemu uzyskując je np. za pomocą popularnych i tanich układów stabilizujących 7805 i 7812.
Do prądowego wysterowywania cewek silnika wykorzystałem znany mi już dobrze układ
Sercem układu jest tak jak już pisałem mikrosterownik ATMEGA 16 firmy AVR, układ do sterowania przez komputer używa specjalizowanego portu szeregowego obsługiwanego przez tzw. UART czyli wyspecjalizowaną część swojej wewnętrznej elektroniki umożliwiającej komunikację mikrosterownika ze światem przy pomocy szeregowego protokołu rs232, jest to niesamowite ułatwienie umożliwiające prawie bezpośrednie podłączenie mikrosterownika do komputera PC przez port szeregowy COM. Układ MAX232 pełni tu tylko funkcję dopasowującą poziomy napięć.
Programowanie układu wykonywałem przy pomocy programatora JTAG-TWICE firmy MikloBit i na schemacie właśnie takie przyłącze jest przewidziane, jednak nic nie stoi na przeszkodzie aby zmienić podłączenie złącza programującego tak aby można było cały układ zaprogramować przy pomocy prostszego programatora ISP. Oczywiście właściwie to chyba nie ma co pisać takich oczywistości że kod źródłowy, trzeba skompilować do postaci binarnej i tyko taką postać można wpisać do mikrosterownika. Ja do kompilacji używałem niezwykle wygodnego środowiska edycyjnego połączonego z kompilatorem i programatorem, czyli AVR Studio wersja 4. Można oczywiście użyć dowolnego edytora podłączonego do darmowego kompilatora języka C o nazwie AVR-GCC rozpowszechnianego na licencji GNU. I właściwie tylko ten kompilator wchodzi w grę ponieważ pomimo istnienia również innych kompilatorów potrafiących wygenerować kod binarny dla ATMEGI, to jednak tylko do tego kompilatora jest dostosowany kod źródłowy mojego projektu.
Jednak proszę pamiętać że zanim zabierzemy się za programowanie mikrosterownika trzeba zadbać o właściwe ustawienie tzw. "Fuse" bitów. Jak łatwo zauważyć w moim układzie mikrosterownik jest taktowany oscylatorem zewnętrznym o częstotliwości 8 MHz natomiast domyślnie ATMEGA 16 jest ustawiony na oscylator wewnętrzny o częstotliwości 1MHz. Trzeba zachować sporo ostrożności przy ustawianiu "Fuse" bitów ponieważ niewłaściwe skonfigurowanie układu może spowodować że mikrosterownik nie będzie reagował już więcej na nasze próby skontaktowania się z nim. Zwykle da się to odkręcić, ale trzeba się trochę przy tym nagimnastykować. Celowo nie opisuje dokładnie które bity trzeba ustawić, bo po pierwsze takie rzeczy trzeba i tak zawsze dokładnie sprawdzić w dokumentacji układu, a po drugie dziś już tego dokładnie nie pamiętam i też musiał bym ponownie przebijać się przez dokumentację. W każdym bądź razie układ ma być ustawiony na zewnętrzny oscylator 8MHz. Jeśli ktoś by się chciał uprzeć i ustawić inny oscylator to musi pamiętać że od częstotliwości oscylatora zależy i ustawienie interwałów czasowych timera w mikrosterowniku, oraz prędkości transmisji szeregowej z jaką układ UART próbuje kontaktować się z komputerem przez port szeregowy COM. Przy oscylatorze 8MHz transmisja jest na stałe ustawiona na 2400 b/s i tak należy prawidłowo ustawić szybkość portu szeregowego w komputerze, ilość bitów powinna wynosić 8, bez bitu parzystości. Inne ustawienie prędkości może po prostu spowodować że komputer nie dogada się z mikrosterownikiem.
Kody źródłowe do sterownika (wczytać do atmega 16)Algorytm dziłania programu opiera się głównie na dwóch przerwaniach. Przerwaniu od timera. Które wywoływane jest w ustalonych stałych odstępach czasu. Oraz przerwaniu od układu UART wywoływanego po odebraniu jednego znaku z portu szeregowego. Przerwanie od timera cyka co określony czas (który ze względu na brak znajomości bezwładności silnika był bardziej ustalony doświadczalnie niż wyliczony) i w takich odstępach czasu następuje przesunięcie silnika o kolejny krok. Oczywiście jeśli wcześniej dzięki przerwaniu od Układu UART przyszło właściwe polecenie przekazane z komputera przez port COM. Tak na prawdę to w układzie są również zwykłe przyciski dzięki którym mogą spowodować obrót silnika. Jest to co prawda mało przydatna możliwość, ale zrobiłem taki panel sterowania aby nikt nie musiał zasłaniać kamery jeśli mu się nie podoba kierunek w jakim ona patrzy. Przy takim sterowaniu zachodzi ciekawa zależność, ponieważ przesunięcie silnika o jeden krok zależy od wysłania do układu przez np. program Hyperterminal określonego znaku jednobajtowego w kodzie ASCI to prędkość obrotu silnika przy sterowaniu z komputera zależy od szybkości z jaką operator może naciskać klawisz na klawiaturze, lub od szybkości powtarzania jednego znaku w przypadku ciągłego przyciskania tego klawisza.
Jednak transmisja danych nie jest tylko w jedną stronę, ale również sterownik potrafi wysłać do komputera i wyświetlić na terminalu informacje o swoim stanie oraz np. krótkiego helpa opisującego które przyciski na klawiaturze komputera są odpowiedzialne za konkretne funkcje.
Pewną dodatkową możliwością sterownika oprócz kręcenia silnikiem krokowym, jest możliwość włączania lub wyłączania dwóch urządzeń dodatkowych. W mojej wersji sterownika jest do włączanie i wyłączanie lampki na biurku. Co zrealizowałem dzięki wykorzystaniu przekaźnika odseparowywującego galwanicznie układ od napięcia sieci. Natomiast drugim urządzeniem jest oświetlenie taktyczne w postaci trzech jasnych diód LED przyklejonych do kamery. Takie proste podświetlenie umożliwia widzenie również w nocy, co może czasem być przydatne. Oczywiście tylko od pomysłowości zależy jak wykorzystamy takie funkcje włącz/wyłącz, a jeśli by ktoś potrzebował więcej takich urządzeń do wysterowania to odpowiednia przeróbka algorytmu i układu nie powinna sprawić nikomu kłopotów.
Tak już na koniec dodam że kod źródłowy jaki tu przedstawiam jest po prostu jakąś moją propozycją dla wykonania tego zadania i jeśli ktoś będzie chciał go wykorzystać lub go przerobić to proszę bardzo. Programowanie mikrosterowników nie jest moim głównym zadaniem zawodowym dlatego zdaję sobie sprawę że przedstawiony tu kod prawdopodobnie nie jest raczej jakimś mistrzostwem jeśli chodzi o programowanie mikrosterowników. I jeśli jakiś oburzony niskopoziomowy programista chciałby tylko udowodnić mi że jego "Kung-Fu" jest lepsze, to na prawdę, niech sobie daruje, natomiast wszelkie merytoryczne uwagi chętnie przyjmę :-)