Przejdź do głównej zawartości

Pilot do lustrzanek Nikona - przeróbka projektu z serwisu Majsterkowo.pl

Jeden z moich ulubionych serwisów (dla którego wyłączam AdBlocka ;-)), czyli majsterkowo.pl, zamieścił na swoich wirtualnych łamach jakiś czas temu artykuł prezentujący projekt pilota do lustrzanek Nikona, wykonany w oparciu o Arduino (http://majsterkowo.pl/elektronika-dla-artystow-czyli-pilot-ir-do-nikona/). Autor tego projektu wykorzystał zapewne opis sekwencji zwalniającej migawkę, umieszczony pod tym adresem: http://www.sbprojects.com/projects/nikon/index.php (reverse engineering rządzi, nie ma co).
W każdym razie artykuł i opis projektu jest świetny i rzeczywiście program bardzo dobrze działa na moim Leonardo. Idąc jednak w kierunku wskazanym przez autora, postanowiłem zaimplementować jego rozwiązanie na czymś prostszym i tańszym. I możliwie mobilnym. Ze względu na szalenie nieskomplikowany charakter programu i małą jego zasobożerność, wybrałem do implementacji malutki mikrokontroler, jeden z moich ulubionych, ATtiny 2313.
Początkowe próby napisania odpowiedniego wsadu w BASCOM-ie, zarówno przy taktowaniu zegarem wewnętrznym 8MHz, jak i z zastosowaniu oscylatora zewnętrznego 16MHz, niewiele dały. Z jednej strony wywołania funkcji (procedur, podprogramów) w BASCOM-ie wprowadziły potężny narzut czasowy, z drugiej strony - po uproszczeniu programu - okazało się, że i tak procesor nie jest w stanie wygenerować odpowiedniej nośnej (czyli o odpowiedniej częstotliwości; nie chodzi bynajmniej o to, że układ nie wyrabia). Jedyną - na pocieszenie - zaletą użycia BASCOM-a było uzyskanie niewielkiego kodu wynikowego w porównaniu do tego, który wygenerował kompilator C...
Właśnie... Postanowiłem wyjątkowo zamienić BASCOM-a na C, przynajmniej dla tego projektu. Szybko się okazało, że elegancki program, w którym w szkolny wręcz sposób powtarzające się fragmenty kodu zostały ubrane w funkcje (prawie jak w oryginale), dał w wyniku kompilacji monstrualnych rozmiarów kod wynikowy. Nawet przy odpowiednio skonfigurowanej optymalizacji. Zminimalizowałem więc liczbę zdefiniowanych funkcji do jednej, resztę kodu umieszczając w funkcji main() - nagle kod wynikowy stał się bez mała dziesięciokrotnie mniejszy... W takiej postaci program oczywiście działa i można nawet pomyśleć o jego rozbudowie, mając jednak na uwadze ciągle skromne zasoby wybranego przeze mnie mikrokontrolera.
Oto więc kod źródłowy programu:

/*
* Pilot do apartów fotograficznych (lustrzanek) Nikon.
* Przetestowany z modelem D40.
*
* Program wzorowany na projekcie ze strony:
* http://majsterkowo.pl/elektronika-dla-artystow-czyli-pilot-ir-do-nikona/
*
* Hardware:
* - MCU ATtiny 2313 @16MHz
*
* main.c
*
* Created on: 2013-05-24
* Author: Rafał Wileczek
*/
#include <avr/io.h>
#include <util/delay.h>
#define OKRES_SGN_38KHZ 26
#define POLOKRES_SGN_38KHZ 13
void wyslij_1(int cykle)
{
for (int i = 0; i < cykle; i++)
{
PORTB = _BV(PB0);
_delay_us(POLOKRES_SGN_38KHZ);
PORTB = ~_BV(PB0);
_delay_us(POLOKRES_SGN_38KHZ);
}
}
int main(void)
{
// PB0 - dioda IR,
// PB2 - LED sygnalizująca
// PB1 - przycisk wyzwalający, zwierający do masy
DDRB = 0x05;
PORTB = 0x02;
while(1)
{
// Naciśnięcie przycisku podłączonego do PB1 zwalnia migawkę.
if ((PINB & _BV(PB1)) == 0) {
PORTB = _BV(PB2);
// Dwukrotne wysłanie sekwencji zwalniającej migawkę
// (źródło: j.w. oraz http://www.sbprojects.com/projects/nikon/index.php).
for (int i = 0; i < 2; i++)
{
wyslij_1(76);
_delay_us(1064 * OKRES_SGN_38KHZ);
wyslij_1(15);
_delay_us(60 * OKRES_SGN_38KHZ);
wyslij_1(15);
_delay_us(136 * OKRES_SGN_38KHZ);
wyslij_1(15);
_delay_us(1211 * OKRES_SGN_38KHZ);
_delay_us(1212 * OKRES_SGN_38KHZ);
_delay_us(1211 * OKRES_SGN_38KHZ);
_delay_us(1212 * OKRES_SGN_38KHZ);
}
_delay_ms(1000);
PORTB = ~_BV(PB2);
}
}
}
view raw pilot.c hosted with ❤ by GitHub


Zamiast schematu, krótki opis połączeń. Otóż zasilamy układ i podłączamy kwarc z kondensatorami według wskazań dokumentacji, dalej do pinu 0 portu B podłączamy przez rezystor ok. 220Ω diodę IR (nadawczą), do pinu 1 tego samego portu dołączamy mikrostyk zwierający do masy i na koniec do pinu 2 - diodę LED, oczywiście przez rezystor również ok. 220Ω.
Wgrywamy program i możemy robić zdjęcia na odległość :)

Ciągle jednak nie daje mi spokoju BASCOM. Muszę znaleźć istotę problemu częstotliwości sygnału nośnego - co prawda funkcje realizujące opóźnienia nie są najszczęśliwszym rozwiązaniem, a jednak avr-gcc daje radę. Ciekawe, w czym tkwi problem? Tym bardziej, że nie przeoczyłem żadnego ważnego elementu związanego z konfiguracją. Być może trzeba będzie odmierzać czas w tym programie za pomocą sprzętowego timera?

A na koniec uwaga: konstruowanie pilota do Nikona z funkcjonalnością li i tylko robienia zdjęcia, pomijając trening umysłu i aspekt ciekawostki, nie ma większego sensu. Zgrabny pilot do lustrzanek Nikona, zasilany bateryjką CR2025, można nabyć za około 15zł (wraz z kosztem wysyłki). Warto więc dodać kilka ekstra ficzerów - do czego zresztą zachęcał autor oryginalnego artykułu.

Komentarze

Popularne posty z tego bloga

Niesamowicie prosty czujnik zmierzchowy.

Tym razem zero programowania, będzie natomiast nostalgiczno-wspomnieniowy układzik, lekko zmodyfikowany. Otóż kilka dni temu rozmawialiśmy w gronie znajomych o różnego rodzaju czujnikach zmierzchowych i czujnikach ruchu. Ponieważ należę do tych wariatów, co to hołdują jeszcze owej przestarzałej i kompletnie odrealnionej dziś zasadzie: "po co kupować, gdy można zrobić", stwierdziłem, że poskładam takie coś (czujnik zmierzchowy; sensor ruchu faktycznie lepiej nabyć, choćby ze względu na rozmiary ;)) i być może podłączę do jakiegoś mikrokontrolera. Przypomniało mi się też przy okazji, że znalazłem ostatnio w elektronicznych śmieciach stary fotorezystor (dla niewtajemniczonych: element zmieniający rezystancję, czyli opór elektryczny, pod wpływem działania strumienia światła) RPP130, jeden z kilku pozostałych po montowanych wieki temu układach tranzystorowych do zdalnego sterowania pracą urządzeń za pomocą latarki... No OK, nie było to specjalnie rozbudowane zdalne sterowanie ;) ...

Aktualizacja oprogramowania układowego w ESP-01 do najnowszej wersji NodeMCU

Oprogramowanie i projekt NodeMCU cieszą się niesłabnącym zainteresowaniem świata konstruktorów urządzeń IoT, zatem co jakiś czas warto odświeżyć sobie firmware w naszych płytkach ESP. Osobiście jestem przeciwnikiem zmienienia czegoś, co dobrze działa, tylko dla zasady czy z chęci cieszenia się świadomością posiadania najnowszej wersji, ale tym razem chodzi jednak o coś innego – zwiększenie funkcjonalności i zapewnienie poprawnego działania oraz kompatybilności z najnowszymi projektami i bibliotekami. W tytule tego artykułu jest mowa o najprostszych płytkach z układem ESP8266 – ESP-01 . To właśnie w oparciu o ten model opracowałem płytkę prototypową, o której pisałem w poprzednim rozdziale. Dotychczas wszystkie moje płytki ESP miały na pokładzie oprogramowanie NodeMCU w wersji 0.9.5 . Zorientowani choć trochę w temacie od razu zauważą (Google? Bing?), że wersja ta ma już co najmniej dwa lata... Najwyższy czas zatem na aktualizację.

Płytka prototypowa na bazie ESP8266 (ESP-01)

To nie jest kolejny artykuł traktujący od początku do... nieco dalej (bo na pewno nie do końca) o płytkach ESP8266 . Żeby się dowiedzieć, co to takiego, odwiedźcie proszę np. tę stronę (oraz wiele innych – poproście o pomoc Waszą ulubioną wyszukiwarkę): http://www.esp8266.com/wiki/doku.php?id=esp8266-module-family . No ale żeby nie było, ESP8266 to układ zawierający na pokładzie wydajny mikrokontroler z rdzeniem RISC-owym, taktowany zegarem 40MHz (wersja, o której jest ten wpis) lub 80MHz, 512KB pamięci flash i podsystem komunikacji przez sieć WiFi . Jest powszechnie wykorzystywany jako swego rodzaju karta sieciowa do połączeń bezprzewodowych naszych urządzeń IoT , które budujemy w zaciszu domowych laboratoriów (i nie tylko). Układ montowany jest na płytkach występujących w kilku wersjach, różniących się przede wszystkim liczbą wyprowadzeń uniwersalnych, czyli GPIO – im większa liczba, tym większe możliwości wykorzystania układu (więcej urządzeń peryferyjnych itp.). Są też pewne ...