Witam! Mój poprzedni wątek dotyczący tego projektu został zamknięty ponieważ temat zdryfował na zupełnie inne tematy dlatego bardzo proszę o trzymanie się tematu
Celem projektu jest fotopułapka uruchamiająca po wykryciu ruchu lustrzankę DSLR i lampy błyskowe w celu sfotografowania obiektu którego ruch został wykryty. Jako, że w takiej sytuacji ważne jest żeby wiedzieć gdzie dokładnie jest fotografowany obiekt projekt oparłem na nadajniku i odbiorniku active IR zamiast mało precyzyjnego sensora IR.
Założenia:
- w celu optymalizacji zużycia energii zastąpiłem arduino uno Adafruit Pro Trinket
- kabel sygnałowy z odbiornika IR podłączony został do pinu 3 (INT1) - po wykryciu ruchu LOW
- do pin 4 podłączone zostało przez transoptor (optoizolator) wyjście na ustawianie ostrości
- do pin 8 podłączone zostało przez transoptor (optoizolator) wyjście na migawkę (czyli de facto wykonanie zdjęcia)
Działanie:
wszystko działało bardzo fajnie ale zużycie energii było wysokie i w celu jej zaoszczędzeniu dodałem do kodu tryb "deep-sleep mode". W teorii wszystko super. Urządzenie przechodzi w tryb deep-sleep i zużycie energii obniża się praktycznie tylko do zasilenia czuwającego odbiornika IR. Wybudza się też praktycznie natychmiast i ponownie przechodzi po określonym czasie w deep-sleep.
Problem:
- niestety nie jest tak kolorowo. Przed dopisaniem do kodu deep-sleep mode - czujnik wyzwalał migawkę za każdym razem, teraz bardzo szybkie naruszenie nie wyzwala migawki. To bym jeszcze przeżył, bo przynajmniej małe zwierzątka (myszy itp. ) nie wyzwalały by migawki. Chociaż oczywiście chciałbym wiedzieć co jest przyczyną takiej sytuacji.
- drugi problem jest znacznie poważniejszy - przy serii nieregularnych naruszeń w niewielkich odstępach czasu (imitujących powiedzmy przechodzące stadko dzików) następuje zawieszenie płytki i niezbędny jest reset.
Jest to zapewne spowodowane nieudolnym zaimplementowaniem przeze mnie deep-sleep bo bez tego kod działa bezbłędnie. Niestety niewiele jeszcze umiem i liczę, że ktoś wskaże mi na czym polega błąd.
Kod:
Celem projektu jest fotopułapka uruchamiająca po wykryciu ruchu lustrzankę DSLR i lampy błyskowe w celu sfotografowania obiektu którego ruch został wykryty. Jako, że w takiej sytuacji ważne jest żeby wiedzieć gdzie dokładnie jest fotografowany obiekt projekt oparłem na nadajniku i odbiorniku active IR zamiast mało precyzyjnego sensora IR.
Założenia:
- w celu optymalizacji zużycia energii zastąpiłem arduino uno Adafruit Pro Trinket
- kabel sygnałowy z odbiornika IR podłączony został do pinu 3 (INT1) - po wykryciu ruchu LOW
- do pin 4 podłączone zostało przez transoptor (optoizolator) wyjście na ustawianie ostrości
- do pin 8 podłączone zostało przez transoptor (optoizolator) wyjście na migawkę (czyli de facto wykonanie zdjęcia)
Działanie:
wszystko działało bardzo fajnie ale zużycie energii było wysokie i w celu jej zaoszczędzeniu dodałem do kodu tryb "deep-sleep mode". W teorii wszystko super. Urządzenie przechodzi w tryb deep-sleep i zużycie energii obniża się praktycznie tylko do zasilenia czuwającego odbiornika IR. Wybudza się też praktycznie natychmiast i ponownie przechodzi po określonym czasie w deep-sleep.
Problem:
- niestety nie jest tak kolorowo. Przed dopisaniem do kodu deep-sleep mode - czujnik wyzwalał migawkę za każdym razem, teraz bardzo szybkie naruszenie nie wyzwala migawki. To bym jeszcze przeżył, bo przynajmniej małe zwierzątka (myszy itp. ) nie wyzwalały by migawki. Chociaż oczywiście chciałbym wiedzieć co jest przyczyną takiej sytuacji.
- drugi problem jest znacznie poważniejszy - przy serii nieregularnych naruszeń w niewielkich odstępach czasu (imitujących powiedzmy przechodzące stadko dzików) następuje zawieszenie płytki i niezbędny jest reset.
Jest to zapewne spowodowane nieudolnym zaimplementowaniem przeze mnie deep-sleep bo bez tego kod działa bezbłędnie. Niestety niewiele jeszcze umiem i liczę, że ktoś wskaże mi na czym polega błąd.
Kod:
Kod:
/*
* Fotopułapka DSLR AIR (active infrared) - 28/11/2019
*
* Fotopułapka DSLR oparta na aktywnych czujnikach IR (infrared)(komplet: nadajnik/odbiornik) i adafruit pro trinket
* odbiornik active IR po wykryciu ruchu przechodzi w stan niski (LOW)
*
*/
// **** INCLUDES *****
#include "LowPower.h" //dodaje biliotekę obsługującą zaawansowane tryby oszczędzenia energii
/*-----( Declare Constants )-----*/
#define IRsensor 3 // przewód sygnałowy z odbiornika AIR (active IR)wchodzi na pin 3 (jest to równoczesnie pin interrupt #1(INT1))
#define shutter 4 // wyjscie cyfrowe 4 poprzez transoptor 4n26 do wyzwolenia migawki
#define focus 8 // wyjscie cyfrowe 8 poprzez transoptor 4n26 do ustawienia ostrości
/*-----( Declare Variables )-----*/
int detector_state; // zmienna utrzymuje ostatni stan przełącznika
int trigger = 2; // Ilość wykonanych zdjęć
int odliczanie = 5; //zmienna odpowiedzialna za odliczanie czasu do uśpienia ATMegi
void setup() /*----( SETUP: RUNS ONCE )----*/
{
pinMode(LED_BUILTIN, OUTPUT); //określa cyfrowy pin LED_BUILTIN jako wyjście
digitalWrite(LED_BUILTIN, LOW); // wyłącza diodę LED poprzez odcięcie napięcia (LOW)
detector_state = 0;
pinMode (IRsensor, INPUT );
pinMode (shutter, OUTPUT );
pinMode (focus, OUTPUT );
CLKPR = 0x80;
CLKPR = 0x04; // przetaktowanie z 16Mhz do 1Mhz Ważne: przetaktowanie nie ma wpływu na opisany problem - na standardowej prędkości 16Mhz jest dokładnie to samo
Serial.begin(9600);
delay(312); // aby zrekompensować underclocking z 16Mhz do 1Mhz należy podzielić rządany czas przez 16 - w tym przypadku 5000:16=312 (5sekund)
}
/*--(end setup)---*/
void loop () /*----( LOOP: RUNS CONSTANTLY )----*/
{
detector_state = digitalRead (IRsensor);
if ( HIGH == detector_state)
{
digitalWrite (shutter, LOW );
digitalWrite (focus, LOW );
odliczanie--; //dekrementujemy (zmniejszamy) zmienną odliczanie o 1
delay(62); //ustawiamy opóźnienie 1 sekundy
if (odliczanie <= 0) { //jeżeli zmienna odliczanie jest mniejsza równa 0
odliczanie = 5; //ustaw zmienną odliczanie na 5, aby po przebudzeniu można było
//wykonywać odliczanie
Spanie(); //przenieś wykonywanie programu do klasy Spanie
}
}
else
{
for (int x = 0; x < 2; x++) // ilość wykonanych zdjęć (w tym przypadku 2: zdjęcie 0 i zdjęcie 1)
{
digitalWrite (focus, HIGH );
delay (7); // czas opożnienia w tym wypadku 5x16 = 80ms
digitalWrite (shutter, HIGH );
delay (7);
digitalWrite (focus, LOW );
digitalWrite (shutter, LOW);
delay (62); // czas opożnienia 1 sek.
}
}
delay (7); // czas opożnienia 0,1 sek.
}
/*--(end loop)---*/
void Spanie() /*----( Spanie: Sleep Mode )----*/
{
attachInterrupt(1, Budzenie, LOW); //jeżeli na pinie 3 pojawi się stan niski to wybudź ATMegę i przenieś do klasy budzenie
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF); //wybieramy tryb Power-down i ustawiamy żeby ATMega spała cały czas spała przy wyłączonom ADC i BoD do momentu wystąpienia przerwania
}
/*--(end sleep mode)---*/
void Budzenie() /*----( Budzenie: Wake Mode )----*/
{
detachInterrupt(1); //ustawiamy debounce pinu 3, żeby układ nie "wybudził się" dwa razy
}
/*--(end wake mode)---*/
// ( THE END ) //