• 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
#11
Tak o to mi chodziło. Można by PIRem wybudzać arduino a ActiveIR wyzwalać zdjęcia (konieczność zmiany w programie). Jak ActiveIR się "uszkodzi" i będzie w stanie niskim pobudzenie PIRa wyzwoli zdjęcia. Może takie rozwiązanie będzie lepsze i Yeti może przyjdzie się sfotografować Smile.
 
Odpowiedź
#12
Ha...ha...ha.... Spróbuję coś tam sklecić jak dojdzie do mnie PIR Smile i wtedy napsać coś i wrzucić do sprawdzenia.
 
Odpowiedź
#13
Dotarł do mnie sensor PIR połączyłem wszystko razem i skleciłem "jakiś tam" Shy kod gdzie "TYLKO" gdy oba sensory potwierdzą ruch nastąpi wykonanie zdjęcia. Po wyregulowania sensora PIR zaczęło to nawet w miarę sensownie działać. Tylko to chyba nadal nie jest do końca to o co mi chodzi. 

  Wolałbym aby priorytet miał odbiornik aktywny activeIR - jest dokładniejszy od PIR i zdjęcia wykona dokładnie w odpowiedniej chwili. Sensor PIR chciałbym traktować jako rezerwowe zabezpieczenie które zareaguje dopiero gdy pójdzie długa seria zdjęć (powiedzmy 20). Sprawdzi wtedy czy coś nie nawala i aparat nie będzie robił zdjęć aż do wyczerpania baterii lub karty. Krótko mówiąc sprawdzi czy na pewno przed układem znajduje się jakieś żywe stworzenie - jeśli wykryje ruch to nie zrobi nic (zdjęcia dalej będą się wykonywały), a jeśli nie wykryje ruchu zatrzyma wykonywanie zdjęć. Wtedy aby układ się "zresetował" odbiornik actieIR musi wrócić do stanu wysokiego (bo ruch = LOW). Trochę mnie to już przerasta Sad Czytam... ale.... Sad 

Tu obecne rozwiązanie:
Kod:
// **** INCLUDES *****
#include "LowPower.h"  //dodaje biliotekę obsługującą zaawansowane tryby oszczędzenia energii

/*-----( Declare Constants )-----*/
#define AIRsensor     2    // przewód sygnałowy z odbiornika AIR (active IR)wchodzi na pin 2 (jest to równoczesnie pin interrupt #1(INT0))
#define PIRsensor     3    // przewód sygnałowy z odbiornika PIR wchodzi na pin 3
#define shutter       4    // wyjscie cyfrowe 4 poprzez transoptor 4n26 do wyzwolenia migawki
#define focus         5    // wyjscie cyfrowe 5 poprzez transoptor 4n26 do ustawienia ostrości


/*-----( Zmienne )-----*/
// Zmienne dla wykrywania ruchu
int detector_state;  // zmienna utrzymuje ostatni stan przełącznika


//Zmienne wyzwalania aparatu
int trigger = 2;      // Ilość wykonanych zdjęć

//Zmienne dotyczace trybu usypiania arduino
int odliczanie = 5;  //zmienna odpowiedzialna za odliczanie czasu do uśpienia ATMegi

//Zmienne do zapamiętania wartości z czujników ruchu
int pirValue;
int airValue;

//-----------------------------------------------------------------------------------------------------------------------------------------------------------

void setup()    /*----( WYKONAJ RAZ )----*/
{
  CLKPR = 0x80;
  CLKPR = 0x03;  // przetaktowanie z 8Mhz do 1Mhz
 
  pinMode(LED_BUILTIN, OUTPUT);       //określa cyfrowy pin LED_BUILTIN jako WYJŚCIE...
  digitalWrite(LED_BUILTIN, LOW);    // ... i nakazuje poleceniem jej WYŁĄCZENIE (diody LED) poprzez odcięcie napięcia (LOW) w celu zmiejszenia poboru energii
  

  detector_state = 0;  
 
  // Setup shutter and focus as output
  pinMode (shutter, OUTPUT );     // określa cyfrowy pin (4) od którego poprzez transoptor 4n26 podłączyliśmy się do migawki jako WYJŚCIE
  pinMode (focus, OUTPUT );       // określa cyfrowy pin (5) od którego poprzez transoptor 4n26 podłączyliśmy się do focusa jako WYJŚCIE
 
  // Setup AIR as Input          
  pinMode (AIRsensor, INPUT );   // określa cyfrowy pin (2) do którego wchodzi przewód sygnałowy z odbiornika AIR jako WEJŚCIE
 
  // Setup PIR as Input
  pinMode(PIRsensor, INPUT);    // określa cyfrowy pin (3) do którego wchodzi przewód sygnałowy z sensora PIR jako WEJŚCIE
 
  Serial.begin(9600); // połaczenie z konsolą (tu w sumie zbędne, ale może rozpiszę debug)

  // początkowe opóźnienie o 15sek w celu ustabilizowania sensorów infrared w nowym środowisku
  delay(1875); // aby zrekompensować underclocking z 8Mhz do 1Mhz należy podzielić rządany czas przez 8 - w tym przypadku 15000:8=1875 (15sek) 
}

/*--(end setup)---*/



void loop()     /*----( WYKONAJ W PĘTLI )----*/
{
   attachInterrupt(0, Budzenie, LOW);
  
   LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);

   detachInterrupt(0);
  

 
   // tu robimy 2 zdjęcia
    for (int x = 0; x < 2; x++)  // ilość wykonanych zdjęć (w tym przypadku 2: zdjęcie 0 i zdjęcie 1)
   {
    if
    (digitalRead(AIRsensor) == 0 and digitalRead(PIRsensor) == 1)
    digitalWrite (focus, HIGH );
    delay (13);                // czas opożnienia w tym wypadku 13x8 = 104ms
    digitalWrite (shutter, HIGH );
    delay (13);
    digitalWrite (focus, LOW );
    digitalWrite (shutter, LOW);
    delay (125);              // czas opożnienia 1 sek.
   
 
    delay (13); // czekamy po 2 zdjęciach i idziemy spać jak nie ma na pinie 2 LOW
  }
}
void Budzenie()
{
    //Zatrzymujemy się w pustej pętli
}
 
Odpowiedź
#14
Coś wymyśliłem. Nie wiem czy spełni oczekiwania.
AIR wybudza a PIR sprawdza czy coś "ciepłego" jest w polu widzenia i się rusza. Jak jest to zeruje licznik zdjęć i zdjęcia wykonują się jak AIR jest aktywny.

Jak AIR się uszkodzi w stanie LOW i PIR będzie nieaktywny to wykona się 10 x po 2 zdjęcia i arduino  się zablokuje w stanie wybudzenia, nie "zaśnie". Reset lub wyłączenie zasilania i ponowne włączenie przywraca urządzenie do pracy.

Jeżeli AIR jest zawodny. Można przyjąć inną strategię. Może PIR wybudzać a AIR wyzwalać zdjęcie. Przy uszkodzeniu AIR w stanie LOW można pomyśleć o blokadzie wykonywania zdjęć lub wykonywać tak długo jak PIR jest pobudzony. Może coś się uda złapać.
Poniżej kod według pierwszej strategi.


Kod:
// **** INCLUDES *****
#include "LowPower.h"  //dodaje biliotekę obsługującą zaawansowane tryby oszczędzenia energii

/*-----( Declare Constants )-----*/
#define AIRsensor     2    // przewód sygnałowy z odbiornika AIR (active IR)wchodzi na pin 2 (jest to równoczesnie pin interrupt #1(INT0))
#define PIRsensor     3    // przewód sygnałowy z odbiornika PIR wchodzi na pin 3
#define shutter       4    // wyjscie cyfrowe 4 poprzez transoptor 4n26 do wyzwolenia migawki
#define focus         5    // wyjscie cyfrowe 5 poprzez transoptor 4n26 do ustawienia ostrości


/*-----( Zmienne )-----*/
// Zmienne dla wykrywania ruchu
int detector_state;  // zmienna utrzymuje ostatni stan przełącznika


//Zmienne wyzwalania aparatu
int trigger = 2;      // Ilość wykonanych zdjęć

//Zmienne dotyczace trybu usypiania arduino
int odliczanie = 5;  //zmienna odpowiedzialna za odliczanie czasu do uśpienia ATMegi

//Zmienne do zapamiętania wartości z czujników ruchu
int pirValue;
int airValue;
int licznikZdjec = 0;
//-----------------------------------------------------------------------------------------------------------------------------------------------------------

void setup()    /*----( WYKONAJ RAZ )----*/
{
  CLKPR = 0x80;
  CLKPR = 0x03;  // przetaktowanie z 8Mhz do 1Mhz

  pinMode(LED_BUILTIN, OUTPUT);       //określa cyfrowy pin LED_BUILTIN jako WYJŚCIE...
  digitalWrite(LED_BUILTIN, LOW);    // ... i nakazuje poleceniem jej WYŁĄCZENIE (diody LED) poprzez odcięcie napięcia (LOW) w celu zmiejszenia poboru energii
 

  detector_state = 0; 

  // Setup shutter and focus as output
  pinMode (shutter, OUTPUT );     // określa cyfrowy pin (4) od którego poprzez transoptor 4n26 podłączyliśmy się do migawki jako WYJŚCIE
  pinMode (focus, OUTPUT );       // określa cyfrowy pin (5) od którego poprzez transoptor 4n26 podłączyliśmy się do focusa jako WYJŚCIE

  // Setup AIR as Input         
  pinMode (AIRsensor, INPUT_PULLUP );   // określa cyfrowy pin (2) do którego wchodzi przewód sygnałowy z odbiornika AIR jako WEJŚCIE

  // Setup PIR as Input
  pinMode(PIRsensor, INPUT);    // określa cyfrowy pin (3) do którego wchodzi przewód sygnałowy z sensora PIR jako WEJŚCIE

  Serial.begin(9600); // połaczenie z konsolą (tu w sumie zbędne, ale może rozpiszę debug)

  // początkowe opóźnienie o 15sek w celu ustabilizowania sensorów infrared w nowym środowisku
  delay(1875); // aby zrekompensować underclocking z 8Mhz do 1Mhz należy podzielić rządany czas przez 8 - w tym przypadku 15000:8=1875 (15sek)
}

/*--(end setup)---*/



void loop()     /*----( WYKONAJ W PĘTLI )----*/
{
   attachInterrupt(0, Budzenie, LOW);
 
   LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);

   detachInterrupt(0);
 

  if (licznikZdjec < 10) // wykona się max 10 X po 2 zdjęcia jak na pinie 2 będzie LOW a PIR będzie nieaktywny (LOW)
  {
   // tu robimy 2 zdjęcia
    for (int x = 0; x < 2; x++)  // ilość wykonanych zdjęć (w tym przypadku 2: zdjęcie 0 i zdjęcie 1)
   {
    //if (digitalRead(AIRsensor) == 0 and digitalRead(PIRsensor) == 1)
    digitalWrite (focus, HIGH );
    delay (13);                // czas opożnienia w tym wypadku 13x8 = 104ms
    digitalWrite (shutter, HIGH );
    delay (13);
    digitalWrite (focus, LOW );
    digitalWrite (shutter, LOW);
    delay (125);              // czas opożnienia 1 sek.
   
   }
   licznikZdjec = licznikZdjec +1;
   if (digitalRead(PIRsensor) == 1)
   {
    licznikZdjec = 0;
   }
   // czas pomiędzy seriami zwiększyłem dla obserwacji, ustawić do potrzeb
    delay (113); // czekamy po 2 zdjęciach i idziemy spać jak nie ma na pinie 2 LOW
  }
}

void Budzenie()
{
    //Zatrzymujemy się w pustej pętli
}
 
Odpowiedź
#15
Jesteś nieoceniony. Zaczną testy i zobaczę jak to działa Smile
Sęk w tym , że to AIR jest bardzo niezawodny i kiedy coś wykrywa to to tam jest na bank . Problem jest paradoksalnie w tym, że jest taki precyzyjny i bardzo niezawodny. Między nadajnikiem, a odbiornikiem jest wysyłana wiązka podczerwieni  taki niewidzialny "pseudo promień lasera" Wink . Póki odbiornik ją "widzi"  to nic nie robi , jak coś ją "zasłoni" reaguje. Trzeba więc bardzo dokładnie ustawić odbiornik i nadajnik. A w terenie wszystko może się zdarzyć. Jakiś wiatr przechyli któreś z urzadzeń, jakaś złamana gałąż spadnie prosto na nie. Jak tylko odbiornik nie "zobaczy" nadajnika uzna to za pojawienie się jakiegoś "obiektu". Mam nadzieję że nigdy do tego nie dojdzie, ale gdyby to szkoda migawki w lustrzance bo z założonym gripem (dodatkowe baterie) to może robić te zdjęcia praktycznie bez końca  Tongue

Reasumując: w kontrolowanych warunkach (jakieś pomieszczenie itp.) w ogóle bym nie dodawał PIR bo bez niego działa to rewelacyjnie.

Jeszcze raz Wielkie Dzięki Smile


EDIT: Kod działa poprawnie (to znaczy dokładnie tak jak opisałeś), ale się nie sprawdzi bez dopisania "drugiej części"   - zamiast zawieszenia musiało by nastąpić tylko zatrzymanie z możliwością "resetu" do stanu początkowego po powrocie odbiornika AIR do stanu HIGH.  Tylko nie wiem czy coś takiego da się napisać ?
Już tłumaczę dlaczego: wiele zwierząt zaniepokojonych migawką zamiera na wiele długich sekund w absolutnym bezruchu. W takiej sytuacji to właśnie PIR okazuje się zawodny i szybko "przestaje widzieć" obiekt. Sprawdziłem . Tak jak pisałeś w takiej sytuacji następuje zawieszenie układu zupełnie niepotrzebnie. Tak, że działa fajnie, ale w pewnych sytuacjach zawiesi sprawnie działający układ Sad
 
Odpowiedź
#16
Dopisałem "drugą część" .
Sprawdź czy działa.
Kod:
// **** INCLUDES *****
#include "LowPower.h"  //dodaje biliotekę obsługującą zaawansowane tryby oszczędzenia energii

/*-----( Declare Constants )-----*/
#define AIRsensor     2    // przewód sygnałowy z odbiornika AIR (active IR)wchodzi na pin 2 (jest to równoczesnie pin interrupt #1(INT0))
#define PIRsensor     3    // przewód sygnałowy z odbiornika PIR wchodzi na pin 3
#define shutter       4    // wyjscie cyfrowe 4 poprzez transoptor 4n26 do wyzwolenia migawki
#define focus         5    // wyjscie cyfrowe 5 poprzez transoptor 4n26 do ustawienia ostrości


/*-----( Zmienne )-----*/
// Zmienne dla wykrywania ruchu
int detector_state;  // zmienna utrzymuje ostatni stan przełącznika


//Zmienne wyzwalania aparatu
int trigger = 2;      // Ilość wykonanych zdjęć

//Zmienne dotyczace trybu usypiania arduino
int odliczanie = 5;  //zmienna odpowiedzialna za odliczanie czasu do uśpienia ATMegi

//Zmienne do zapamiętania wartości z czujników ruchu
int pirValue;
int airValue;
int licznikZdjec = 0;
int maxSerii = 5; // maksymalna ilość serii przy pobudzeniu AIR i nieaktywnym PIR
//-----------------------------------------------------------------------------------------------------------------------------------------------------------

void setup()    /*----( WYKONAJ RAZ )----*/
{
  CLKPR = 0x80;
  CLKPR = 0x03;  // przetaktowanie z 8Mhz do 1Mhz

  pinMode(LED_BUILTIN, OUTPUT);       //określa cyfrowy pin LED_BUILTIN jako WYJŚCIE...
  digitalWrite(LED_BUILTIN, LOW);    // ... i nakazuje poleceniem jej WYŁĄCZENIE (diody LED) poprzez odcięcie napięcia (LOW) w celu zmiejszenia poboru energii
 

  detector_state = 0; 

  // Setup shutter and focus as output
  pinMode (shutter, OUTPUT );     // określa cyfrowy pin (4) od którego poprzez transoptor 4n26 podłączyliśmy się do migawki jako WYJŚCIE
  pinMode (focus, OUTPUT );       // określa cyfrowy pin (5) od którego poprzez transoptor 4n26 podłączyliśmy się do focusa jako WYJŚCIE

  // Setup AIR as Input         
  pinMode (AIRsensor, INPUT_PULLUP );   // określa cyfrowy pin (2) do którego wchodzi przewód sygnałowy z odbiornika AIR jako WEJŚCIE

  // Setup PIR as Input
  pinMode(PIRsensor, INPUT);    // określa cyfrowy pin (3) do którego wchodzi przewód sygnałowy z sensora PIR jako WEJŚCIE

  Serial.begin(9600); // połaczenie z konsolą (tu w sumie zbędne, ale może rozpiszę debug)

  // początkowe opóźnienie o 15sek w celu ustabilizowania sensorów infrared w nowym środowisku
  delay(1875); // aby zrekompensować underclocking z 8Mhz do 1Mhz należy podzielić rządany czas przez 8 - w tym przypadku 15000:8=1875 (15sek)
}

/*--(end setup)---*/



void loop()     /*----( WYKONAJ W PĘTLI )----*/
{
   attachInterrupt(0, Budzenie, LOW);
 
   LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);

   detachInterrupt(0);
 

  if (licznikZdjec < maxSerii) // wykona się max 10 X po 2 zdjęcia jak na pinie 2 będzie LOW a PIR będzie nieaktywny (LOW)
  {
   // tu robimy 2 zdjęcia
    for (int x = 0; x < 2; x++)  // ilość wykonanych zdjęć (w tym przypadku 2: zdjęcie 0 i zdjęcie 1)
   {
    //if (digitalRead(AIRsensor) == 0 and digitalRead(PIRsensor) == 1)
    digitalWrite (focus, HIGH );
    delay (13);                // czas opożnienia w tym wypadku 13x8 = 104ms
    digitalWrite (shutter, HIGH );
    delay (13);
    digitalWrite (focus, LOW );
    digitalWrite (shutter, LOW);
    delay (125);              // czas opożnienia 1 sek.
   
   }
   licznikZdjec = licznikZdjec +1;
   if (digitalRead(PIRsensor) == 1)
   {
    licznikZdjec = 0;
   }
   // czas pomiędzy seriami zwiększyłem dla obserwacji, ustawić do potrzeb
    delay (113); // czekamy po 2 zdjęciach i idziemy spać jak nie ma na pinie 2 LOW
  }
  if (licznikZdjec >= maxSerii && digitalRead(PIRsensor) == 1)
  {
    licznikZdjec = 0;
  }
}

void Budzenie()
{
    //Zatrzymujemy się w pustej pętli
}
 
Odpowiedź
#17
Smile
DZIĘKI! Zaraz będę testował. Przeglądam kod starając się jak najwięcej zrozumieć Smile

Czy w tej linijce:

if (licznikZdjec >= maxSerii && digitalRead(PIRsensor) == 1)

...nie chodziło o AIRsensor?

if (licznikZdjec >= maxSerii && digitalRead(AIRsensor) == 1)


EDIT: DZIAŁA!!! No super! @Agregacik : jestem Ci ogromnie wdzięczny za Twoją bezinteresowną pomoc. Wreszcie pora na sklecenie jakiejś obudowy i testy w terenie. Nie omieszkam napisać jak i czy w ogóle działa w terenie. No i jak pstryknę Yeti to wrzucę fotkę Wink
 
Odpowiedź
#18
Ma być tak jak jest czyli PIR.
Jak "potwór" przetnie linię AIR arduino wybudzi się i zacznie robić zdjęcia. "Potwór" się zatrzyma AIR będzie aktywny a PIR może przez brak ruchu stać się nieaktywny, więc aparat wykona zadaną liczbę zdjęć mimo aktywnego AIR. Jak "potwór" się ruszy, nastąpi reset zmiennej liczbaZdjec i aparat znowu zacznie robić zdjęcia aż AIR nie będzie aktywny. W przypadku "uszkodzenia" AIR w stanie aktywnym arduino nie "zaśnie" a zdjęcia będzie wyzwalał PIR do puki będzie aktywny.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości