Wildtierfotofalle mit IR-LED Scheinwerfer

Fragen zu Schaltungen, Elektronik, Elektrik usw.

Moderator: T.Hoffmann

Benutzeravatar
Beatbuzzer
Auserwählter
Auserwählter
Beiträge: 3177
Registriert: Fr, 17.08.07, 11:02
Wohnort: Alfeld / Niedersachsen
Kontaktdaten:

Sa, 28.11.09, 21:32

Crafty-Catcher hat geschrieben: dann bleiben die LEDs schonmal aus
leider auch wenn ich von Pin 3 dann über nen R 150 Ohm an Pin 1 gehe
Du musst ja jetzt auch das Gate an Minuspol legen, damit der FET leitet.
Alles genau umgekehrt, wie bei N-Channel :wink:
Crafty-Catcher
Super-User
Super-User
Beiträge: 71
Registriert: Di, 21.11.06, 18:18
Wohnort: Lippstadt
Kontaktdaten:

Sa, 28.11.09, 21:41

Scheint zu spät zum denken zu sein, jetzt gehen die IRs auch an... Danke

Seh ich das dann weiter richtig, dass ich die eh nicht wieder aus bekomme und mir noch nen paar neue N Channels besorgen sollte?
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

So, 29.11.09, 13:07

Sollte eigentlich auch mit P-Channel Mosfet kein Problem sein. Sorry dass ich das Datenblatt nicht gelesen habe, sonst hätte ich Dir gleich gesagt, wie die anzuschließen sind. Der Tiny13 hat eine abs. Maximum Operating Voltage von 6.0V, also kannst Du den doch direkt an 4 Akkus betreiben, 6V schaffen die Akkus dann doch nicht. Der Mosfet hat eine Gate Threshold Voltage von 2-4V, das ist schon relativ hoch. Könnte aber grade so reichen. Wenn die Akkus schwächer werden (<5V) reicht es aber vmtl. nicht mehr. Ich würde lieber einen IRLZ34N o.ä. mit einer Gate Threshold Voltage unter 2V verwenden, dann bist Du auf der sicheren Seite. Aber Versuch macht kluch...
Einfach mal das Gate des IRFU9024 über 100-150Ohm von einen Pin vom Tiny steuern (in diesem Fall bedeutet PORT-Pin=1 Mosfet aus und PORT-Pin=0 Mosfet an) und bei einer Betriebsspannung von 4.5V prüfen, ob der Mosfet noch brauchbar 'durchschaltet' oder eben nicht.
Crafty-Catcher
Super-User
Super-User
Beiträge: 71
Registriert: Di, 21.11.06, 18:18
Wohnort: Lippstadt
Kontaktdaten:

So, 29.11.09, 21:04

Mein Problem ist eher, dass der jetzt anschaltet aber nicht wieder aus. D.h. ich kann das Gate sonstwo anschließen, wenns einmal an ist bleibts an, außer ich entfern die LEDs vom Mosfet. Oder ist mein Mosfet jetzt hin vom ausprobieren?

Viele Grüße,
Crafty-Catcher
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

Mo, 30.11.09, 10:01

Also wenn der Mosfet nicht sperrt wenn das Gate direkt mit dem + Pol der Spannungsquelle verbunden wird, ist er entweder kaputt oder doch irgendwie falsch angeschlossen.
Testschaltung:
P-Channel-MosFet-Test1.png
P.S. Der LED Vorwiderstand von 20Ohm ist hier nur als Platzhalter zu verstehen. Bei einer IR-LED mit ca. 1.3V Flussspannung würden da fast 200mA fließen! Falls also nur ein IR-LED angeschlossen werden soll, dann eher 200 Ohm verwenden.
Crafty-Catcher
Super-User
Super-User
Beiträge: 71
Registriert: Di, 21.11.06, 18:18
Wohnort: Lippstadt
Kontaktdaten:

Di, 01.12.09, 19:56

Dan Borax Hilfe und der zufälligen Begegnung mit dem großen blauen C habe ich fünf N-Channel Mosfets vom Typ IRLZ24N erstanden. Der erfüllt jetzt auch seinen Zweck und schaltet fleißig an und aus.
Ich habe meine Schaltung provisorisch zusammengesetzt und muss mir jetzt so wie es scheint ein paar Gedanken zur Spannungsstabilisierung machen. Der Bewegungsmelder scheint die Spannungsschwankungen durch den Servobetrieb übel zu nehmen und antwortet dann auch mal promt mit einer identifizierten Bewegung, auch wenn es keine gab. Beim einschalten schaltet der Bewegungsmelder nämlich erstmal generell auf "An".

Die große Frage wird jetzt werden, hänge ich einen Elko an den Bewegungsmelder oder an das Servo und wie groß sollte der wohl sein?

Auch stimmt noch mit meiner Programmierung irgendwas nicht, der Effekt ist, dass der AtTiny das Servo in die richtigen Positionen fährt, aber irgendwie schaltet der AtTiny meinen Port 3 nach ein paar Sekunden auf "An" und reagiert nur noch auf das manuelle Anlegen eines Signals an Port 2. Ich muss mir das nochmal in Ruhe ansehen, das Probem ist auch, dass der Code im Debugger nicht vernünftig läuft. Das AVR Studio bleibt immer in dem Timer Interrupt hängen und kommt da auch nicht wieder raus.

Code: Alles auswählen

#include <avr/io.h>
#include <avr/delay.h>
#include <avr/interrupt.h>

volatile unsigned int Tick;   		// 100KHz pulse
volatile unsigned int sPulse;   	// Servo pulse variable
volatile unsigned int Tick_20ms;   // Servo frame variable
volatile unsigned int Status;   	//An oder Aus
volatile unsigned int Action;     //Servo schalten

/* Crafty-Catchers C Tagebuch
 *  x |= (1 << Bitnummer);  // Hiermit wird ein Bit in x gesetzt
 *  x &= ~(1 << Bitnummer); // Hiermit wird ein Bit in x geloescht 
 */

int main (void)
{

   sei(); //  Enable global interrupts
   //DDRB = 0x00; // Alle Pins als Ausgang
   DDRB |= (1<<PB0) | (1<<PB1) | (1<<PB3); // PB0 and PB1 as outputs
   //DDRB &= ~(1<<PB4); //PB4 wieder als Eingang
   TCCR0A |= (1<<WGM01); // Configure timer 1 for CTC mode
   TIMSK0 |= (1<<OCIE0A); // Enable CTC interrupt
   OCR0A = 95; // Set CTC compare value 95
   TCCR0B |= (1<<CS00); // No prescaler
   Tick = 0;
   Status = 0;
   Action = 0;
   Tick_20ms = 0;
   PORTB &= ~(1<<PB3);			//Pin PB3 auf AUS schalten
   while(1)
   {	
      
	  if( PINB & ( 1 << PB4 ) && Status==0) //Ein schalten
	  	{
			PORTB |= (1<<PB3);				// Pin PB3 auf AN schalten
			Status = 1;
			Action = 1;
		}

      if( !PINB & ( 1 << PB4 ) && Status==1) //Aus schalten
	  	{
			PORTB &= ~(1<<PB3);				 //Pin PB3 auf AUS schalten
			Status = 0;
			Action = 1;
        }

	  if( PINB & ( 1 << PB2 ) && Status==1) //Manuell Aus schalten
	  	{
			PORTB &= ~(1<<PB3);				 //Pin PB3 auf AUS schalten
			Status = 0;
			Action = 1;
		}

      if( Action == 1)
	  	{   sPulse = 133;	
      		for(int i=1; i<=10; i++)   // Servo auf AN schalten (i bestimmt wie lange der Zeitrahmen ist, indem das Servo auf die Position sPulse fährt)
      		{
				_delay_loop_2(10000);
      		} 

			sPulse = 143;
			//_delay_loop_2(20000);
	      	for(int i=0; i<=20; i++) // Servo auf AUS schalten
	      	{
	         	_delay_loop_2(20000);

	      	} 
			Action = 0; 
			sPulse = 0;
   		}
	} //while
} //main

ISR(TIM0_COMPA_vect)   // 100 KHz interrupt frequency
{
	if (Action == 1) {
	   if(Tick >= 2000 )   // One servo frame (20ms) completed
	      {
	         Tick = 0;
	        Tick_20ms++;
	      }

	   Tick++; 
	   if(Tick <= sPulse)   // Generate servo pulse
	   {
	      PORTB |= (1<<PB0);   // Servo pulse high
	   }
	   else
	   {
	      PORTB &= ~(1<<PB0);   // Servo pulse low
	   }
	}
} 
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

Di, 01.12.09, 23:27

Ich hab den Code nur mal kurz überflogen (C ist nicht meine Sprache). 100KHz Interrupt Freq ist aber schon extrem (irq muss alle 0.01ms ausgeführt werden!). Bei 9.6MHz bleiben da nur knapp 100 Takte übrig (Insgesamt! Einschließlich Call Overhead - ich weiß allerdings nicht, wie viel Overhead der C-Compiler bei einer IRQ Routine erzeugt). Ich würde mal die Interrupt Freq auf 0.1ms (also 10KHz) runtersetzen.
hänge ich einen Elko an den Bewegungsmelder oder an das Servo und wie groß sollte der wohl sein?
Ich würde es zunächst bei dem Bewegungsmelder probieren mit etwa 1000µF. Und dann natürlich eine Schottky Diode davor, sonst nützt der Kondensator nicht viel.
Crafty-Catcher
Super-User
Super-User
Beiträge: 71
Registriert: Di, 21.11.06, 18:18
Wohnort: Lippstadt
Kontaktdaten:

Mi, 02.12.09, 08:37

Logisch - das ist mir jetzt schon wieder fast peinlich. Deswegen funktioniert das ja auch nur wenn ich den Interupt nicht erweiter, vermutlich ist das Zeitfenster einfach zu klein.
Ich bin auch gerade so beim nochmal drüber Nachdenken auf den Fehler im Debugger gekommen, der läuft nämlich nur mit 4,8 Mhz - sollte ich heute Abend wohl mal umstellen.

Danke. Ich melde mich wieder.

Viele Grüße,
Crafty
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

Mi, 02.12.09, 09:41

Ok, dann sind es max. 48 Takte, die hast Du wohl überschritten :D
Noch ein paar Anmerkungen...
Ich nehme mal an, dass die Schaltung eher 'lange' laufen soll. Daher würde ich mir ein paar Gedanken zum 'Strom sparen' machen. Die AVRs lassen sich recht einfach in einen Strom-Spar-Modus versetzen (Powersave-Modus) wobei der Timer weiter läuft (siehe z.B. diese Seite: http://www.rn-wissen.de/index.php/Basco ... _Assembler ist zwar auf Bascom bezogen, sollte aber mit C ähnlich sein)
Das Servo würde ich ggf. über einen weiteren Mosfet 'entkoppeln' (also dem Servo nur Strom geben, wenn es auch gebraucht wird). Hier gibt es eine nette Seite zum Stromverbrauch von Servos: http://flyheli.helitron.eu/rxversorgung.htm . Und dann das Servo wirklich nur ansteuern (also die 1-2ms Pulse erzeugen) wenn es auch 'was tun soll'.
Eine ganz andere Möglichkeit wäre es, wenn Du das gar nicht mit dem Servo machst... Kamera aufschrauben, am Auslöser zwei Kabel anlöten und dann einfach per Optokoppler schalten. Hab ich bei einer Kodak EasyShare auch schon mal gemacht. Ist nicht so schwierig. Garantie ist natürlich futsch. Aber ältere derartige Kameras gibt es immer mal wieder als Restposten für unter 50€.
Crafty-Catcher
Super-User
Super-User
Beiträge: 71
Registriert: Di, 21.11.06, 18:18
Wohnort: Lippstadt
Kontaktdaten:

Fr, 04.12.09, 19:46

Übers Stromsparen mache ich mir Gedanken wenn es halbwegs funktioniert ;) ... es ist ..... jetzt so weit ...

Wie blöd muss man eigentlich sein? Bewegungsmelder schaltet "an" -> LED leuchtet also ist am Beinchen der LED genau ... _kein_ Signal, weil ja durchgeschaltet wird und die Spannung also gegen 0 tendiert. Daher muss die Programmierung natürlich bei "kein Signal" die Kamera anschalten. Aber die Minuten der Erleuchtung sind dann doch noch gekommen und ein wenig rumprobieren hat es mir auch ermöglicht den "Signal ist nicht da" Status von einem Pin abzufragen. (Wegen einem Fehler in einer Doku - ging das die ganze Zeit nicht.)

Aber hier erstmal der Quellcode, falls das noch jemand braucht:

Code: Alles auswählen

#include <avr/io.h>
#include <avr/delay.h>
#include <avr/interrupt.h>

volatile unsigned int Tick;   		// 50KHz pulse
volatile unsigned int sPulse;   	// Servo pulse variable
volatile unsigned int Tick_20ms;   // Servo frame variable
volatile unsigned int Status;   	//An oder Aus
volatile unsigned int Action;     //Servo schalten

/* Crafty-Catchers C Tagebuch
 *  x |= (1 << Bitnummer);  // Hiermit wird ein Bit in x gesetzt
 *  x &= ~(1 << Bitnummer); // Hiermit wird ein Bit in x geloescht 
 */

int main (void)
{

   sei(); //  Enable global interrupts
   //DDRB = 0x00; // Alle Pins als Ausgang
   DDRB |= (1<<PB0) | (1<<PB1) | (1<<PB3); // PB0 and PB1 as outputs
   //DDRB &= ~(1<<PB4); //PB4 wieder als Eingang
   TCCR0A |= (1<<WGM01); // Configure timer 1 for CTC mode
   TIMSK0 |= (1<<OCIE0A); // Enable CTC interrupt
   OCR0A = 190; // Set CTC compare value 95
   TCCR0B |= (1<<CS00); // No prescaler
   Tick = 0;
   Status = 0;
   Action = 0;
   Tick_20ms = 0;
   PORTB &= ~(1<<PB3);			//Pin PB3 auf AUS schalten
   while(1)
   {	
      
	  if( !PINB & ~( 1 << PB4 ) && Status==0) //Ein schalten
	  	{
			PORTB |= (1 << PB3);				// Pin PB3 auf AN schalten
			Status = 1;
			Action = 1;
		}

      if( PINB & ( 1 << PB4 ) && Status==1) //Aus schalten
	  	{
			PORTB &= ~(1 << PB3);				 //Pin PB3 auf AUS schalten
			Status = 0;
			Action = 1;
        }

	  if( PINB & ( 1 << PB2 ) && Status==1) //Manuell Aus schalten
	  	{
			PORTB &= ~(1 << PB3);				 //Pin PB3 auf AUS schalten
			Status = 0;
			Action = 1;
		}

      if( Action == 1)
	  	{   sPulse = 63;	//133
      		for(int i=1; i<=20; i++)   // Servo auf AN schalten (i bestimmt wie lange der Zeitrahmen ist, indem das Servo auf die Position sPulse fährt)
      		{
				_delay_loop_2(10000);
      		} 

			sPulse = 71; //143
			//_delay_loop_2(20000);
	      	for(int i=0; i<=30; i++) // Servo auf AUS schalten
	      	{
	         	_delay_loop_2(10000);

	      	} 
			Action = 0; 
			sPulse = 0;
   		}
	} //while
} //main

ISR(TIM0_COMPA_vect)   // 100 KHz interrupt frequency
{
	if (Action == 1) {
	   if(Tick >= 1000 )   // One servo frame (20ms) completed
	      {
	         Tick = 0;
	        Tick_20ms++;
	      }

	   Tick++; 
	   if(Tick <= sPulse)   // Generate servo pulse
	   {
	      PORTB |= (1<<PB0);   // Servo pulse high
	   }
	   else
	   {
	      PORTB &= ~(1<<PB0);   // Servo pulse low
	   }
	}
} 
Ich habe die Interrupt Frequenz erstmal auf 50 kHz runtergeschraubt. Das ist immernoch ziemlich viel, mal sehen ob ich das noch weiter runter kriege.

Viele Grüße,
Crafty-Catcher

P.S. Ich schau mir jetzt mal die Stromsparfunktionen an und überlege ob ich das Servo mit nem Mosfet entkoppel. Vielen Dank für den Tipp. Ich habe aber wie immer wenig Zeit, nicht böse sein, wenn ich nicht allzu schnell von mir hören lasse.

P.P.S.
Ich habe noch eben den Strom gemessen, der da so fließt.
Bei "An" sind es 162,7 mA = 0,82 W = 12h
Bei "Aus" sind es 10,6 mA = 0,053 W = 188h = 7,8 Tage
Bei "Aus" ohne Servo sind es 6,6 mA = 0,03333 W = 303h = 12,6 Tage
bei 5,05 V und bei einer Akkukapazität von 2000mAh - auf den Akkus steht 2700mAh, aber die Eneloops die ich hier noch habe, haben 2000mAh
Crafty-Catcher
Super-User
Super-User
Beiträge: 71
Registriert: Di, 21.11.06, 18:18
Wohnort: Lippstadt
Kontaktdaten:

So, 17.01.10, 18:24

Hier hat sich länger nichts getan, das lag unter anderem daran, das Weihnachten war und das ich auf der Arbeit viel zu tun habe und zum anderen hat das mit der Fotofalle nicht immer alles so geklappt wie ich es gerne wollte. Nun aber ist es soweit und sie ist technisch funktionstüchtig, aber noch nicht sehr hübsch ;)

Jetzt werde ich die Akkus laden und dann wird sich zeigen ob sich die Mühe überhaupt gelohnt hat. Der IR Scheinwerfer musste erstmal dran glauben, wegen ineffizienz ist der rausgeflogen und wenn einer dran kommt, dann in einem extra Gehäuse.
Bild1.jpg
Bild1.jpg (41.79 KiB) 3924 mal betrachtet
Bild2.jpg
Bild2.jpg (60.62 KiB) 3924 mal betrachtet
Bild3.jpg
Bild3.jpg (47.42 KiB) 3924 mal betrachtet
Bild4.jpg
Bild4.jpg (51.52 KiB) 3924 mal betrachtet
Bild5.jpg
Antworten