• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Fotopułapka do lustrzanki oparta na sensorach activ IR i arduino cz.2
#1
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 Smile

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 ) //
 
Odpowiedź
  


Wiadomości w tym wątku
Fotopułapka do lustrzanki oparta na sensorach activ IR i arduino cz.2 - przez fro - 01-12-2019, 19:42

Skocz do:


Przeglądający: 1 gości