Ich habe eine Kamera, die mit 1000 fps und mehr filmen kann und die mir ein Taktsignal ausgibt. Sie liefert für jeden Frame 5Volt und fällt dann ab.
Mein Arduino Mega 2560 soll dieses Signal verarbeiten, so dass ich bei jedem einzelnen Frame beispielsweise eine andere LED einschalten kann. Ich würde gerne bis zu 6000 fps kommen, oder so.
Ich hatte das mit analogRead() versucht, aber das scheint zu langsam? Und mit digitalRead() kann man diese Art Signal gar nicht verarbeiten, richtig?
Mein nächster Schritt wäre nun, das Signal der Kamera dazu zu nutzen, um einen Optokoppler zu feeden, so dass das Signal dann in ein on/off verwandelt wird, das ich digital verarbeiten kann. Ist das eine gute Idee?
Wenn nicht, wie würde ich das angehen? Ich bin absolut kein Elektroniker, das mit dem Optokoppler bekäme ich wahrscheinlich noch hin, aber viel weiter komme ich nicht.
Fällt jemandem eine einfache Lösung ein? Wäre sehr dankbar!
Was verstehst Du unter "fällt dann ab"? Wenn das nicht zu flach erfolgt, was ich mir bei 1000 fps nicht vorstellen kann, kannst Du das auch digital einlesen.
Wenn die Cam 1000 fps bringt, wie willst Du dann auf 6000 fps kommen?
Ich habe die Kamera so konfiguriert, dass sie genau 200 Frames filmt, dann automatisch wieder aufhört. Ich schaffe es nicht, alle 200 Frames zu bekommen, ich lande bei 70 oder so, es variiert allerdings. Ist das hier die richtige Grundstruktur?
int analogPin = A3;
int val = 0;
int valPrev = 0;
int iCounter = 0;
void setup() {
}
void loop() {
while(true)
{
valPrev = val;
val = digitalRead(analogPin);
if(val != valPrev)
{
if(val == 0)
{
iCounter++;
}
}
}
}
Nein, das wird nichts, das dürfte zu langsam sein.
Die beiden Geräte brauchen einen gemeinsamen GND.
Und Du solltest eine Schutzbeschaltung am Arduino-Pin ansetzen.
Dann kannst das mit einem Interruptpin und einem Zähler in der ISR lösen.
Ich habe gerade pulseIn() versucht. Auch dabei komme ich auf nur 65 Signale.
Ich habe die Vermutung, dass Serial.println einige verschluckt. Ich probiere es mal, die Ausgabe erst mit Abschluss des Signal-Bursts zu machen, oder eben interrupt, ja.
Und woher willst Du dann wissen, wann eine Sekunde vorbei ist? Einfach nur aus der Anzahl? Oder 1000 Impulse zählen und dann schauen, wie lange das gedauert hat. Ohne Zeit dürfte das schief gehen.
Ein Optokoppler alleine produziert dir kein Digitalsignal. Dafür nimmt man Logikgatter mit Schmitt-Trigger Funktion. Wobei das auch die Arduino-Eingänge für sich schon machen. Einfach weil die Pegel ab der High und Low erkannt werden festgelegt sind.
Du solltest dabei berücksichtigen, dass pulseIn() blockiert - bei 6000fps vielleicht kein Problem. Aber wenn es (sehr) langsam wird, kann man in der Wartezeit auf die nächste Flanke vielleicht was anderes mit der CPU anstellen.