Zum Inhalt springen

Friedemann Wachsmuth

Mitglieder
  • Gesamte Inhalte

    12.510
  • Benutzer seit

  • Letzter Besuch

  • Tagessiege

    509

Alle erstellten Inhalte von Friedemann Wachsmuth

  1. Ich fürchte, das kriegst Du nicht mehr aus der Gelatine. Mit nix. (In Aceton lost sich Triacetat übrigens auf...)
  2. Übrigens sitze ich seit gestern wieder man Synkino. Nach einem Jahr den eigenen Code verstehen hat eine Weile gebraucht. Und der Weg ist noch lang. Aber zumindest gehts wieder voran. :) (Aber bitte nicht drauf warten, Thorsten!)
  3. Welche ist völlig egal. Wie stellst Du Dir den Tank denn vor?
  4. Nee, die hat er von mir. :) lag hier schon ewig im Keller.
  5. Mein Bastelplatz hat ne neue Lampe. :)
  6. Welchen “Zapfen” meinst Du? Den Greifer in der Nähe des Bildfensters?
  7. Das mache ich selbst. Lohnt bei so kleinen Mengen nicht, Pick&Place einzurichten.
  8. Prototyp mit Debug-Addons. :)
  9. /* ATtiny85 IR Remote Control Receiver This code simulates the Nikon EA-1 Remote Control Switch and adds extra functions, like IR-Remote control support and a nifty intervalometer with 416 different intervals ranging from 200ms to more than 37 hours. The power needed for the circuit is harvested from the camera (the camera connector has no actual power output). Some documentation on the hardware below: Pin numbering, looking onto the camera side jack (or PCB Front) 3 Green - - Brown 4 2 Red - - Yellow 5 space space 1 Blue - - White 6 Inside the handpiece of the remote control: Sliders move from 0 to 1 for lightmeter and from 1 to 2 for exposure. |-------| |---------| |------| 2 expose | | | | |-------|------| | |------| 1 lightmeter on | | | | | | 0 no connect Brown Blue Red Green Yellow White 4 1 2 3 5 6 \ Hold /\ Load /\ Start / \Light/ The "Load" phase charges a capacitor to ease sudden startup and assure even exposure timing. The entire start mechanism of the Nikon R8/R10 is rather sophisticated and barely documented. We need four relays here to follow the protocol. Not following the protocol can work, but might damage the camera... who want's that? */ #include <util/delay.h> // built-in delay() runs too fast due to timer0 usage in IR receiver ISR /* Apple Remote (all models) 87 EE */ // see https://en.wikipedia.org/wiki/Apple_Remote // *** defines and variables *************************** #define RC_CODE 0x87EE // Apple #define UP_KEY 0x05 // Up #define DOWN_KEY 0x06 // Down #define LEFT_KEY 0x04 // Left #define RIGHT_KEY 0x03 // Right #define MENU_KEY 0x01 // Menu #define ALU_CENTER_KEY 0x2E // Center (Alu RC) #define ALU_PLAY_KEY 0x2F // Play (Alu RC) #define WHITE_PLAY_KEY 0x02 // Play (old white Apple Remote) #define LM_MODE_1ST_SINGLESHOT 1 // On the first single exposure shot, we start with lightmetering. #define LM_MODE_SUB_SINGLESHOT 2 // Subsequent shots do not meter the light again. // These are our four relays int lightmeterPin = 3; // K4 ye + wh : Lightmeter int startPin = 4; // K3 re + gr : Start int loadPin = 1; // K2 bl + re : Load int holdPin = 0; // K1 br + bl : Hold int ledPin = 1; // LED is parallel to load-relay volatile int irBits; // This counts the incoming bits from NEC-encoded IR transmitters in the ISR volatile unsigned long receivedData; // This contains the received code // These are used to maintain the different intervals byte oldIntervalStep = 31; // This is the initial OCR1C value (at 1 MHz / Prescaler 16384 = 524ms) byte newIntervalStep = 31; // store it here after a change, since we only update OCR1C in the ISR int postscaler = 2; // the postscaler doubles the timer1 by POT factors up to 2^16 (39:04:20) volatile int divider = 0; // needed in ISR to do some modulo for intervals > 4.3 sec byte lmMode = LM_MODE_1ST_SINGLESHOT; bool blinkFlag = true; // Thisone is used to confirm reception fo valid IR codes bool aluRemote = false; // Apple's Alumium Remote has one more key than the white one. Reading // that key is ambigious, so we "lock in" to a safe mode once we know for sure // that our RC is not the white one. // *** Setup ********************************************** void setup() { pinMode(lightmeterPin, OUTPUT); pinMode(holdPin, OUTPUT); pinMode(loadPin, OUTPUT); pinMode(startPin, OUTPUT); noInterrupts(); // Set up timeStampr/Counter0 (assumes 1MHz clock) TCCR0A = 0; // No compare matches TCCR0B = 3<<CS00; // Prescaler 64 // Set up INT0 interrupt on PB2 MCUCR = MCUCR | 2<<ISC00; // Interrupt on falling edge GIMSK = GIMSK | 1<<INT0; // Enable INT0 irBits = 32; // Wait for NEC-IR AGC start pulse // Set up timeStampr/Counter1 (assumes 1MHz clock speed, saving some power) TCNT1 = 0; TCCR1 = 0; OCR1C = oldIntervalStep; OCR1A = OCR1C; // interrupt COMPA TCCR1 |= (1 << CTC1); // CTC TCCR1 |= (1 << CS13) | (1 << CS12) | (1 << CS11) | (1 << CS10); // Prescaler 2^14 = 16384 interrupts(); } void ReceivedCode(boolean Repeat) { // Check if Transmitter is not an Apple Remote if ((receivedData & 0xFFFF) != RC_CODE) { if (!Repeat) blinkLED(); int key = receivedData>>16 & 0xFF; // extracting the command byte, full 8 bits // We could actually learn some arbitrary codes here and keep them in the EEPROM. Wouldn't // be a very interactive experience though, so skipping that part until someone asks for it. if ((key != 0xFF) && !Repeat && !digitalRead(lightmeterPin)) startRunWithMetering(); else if ((key != 0xFF) && !Repeat && digitalRead(lightmeterPin)) stopRun(); } else { // This is comfort mode with the Apple Remote. :) int key = receivedData>>17 & 0x7F; // extracting the command byte, ignoring the 1-bit to match all Apple Remotes // If we receive codes unique to an alu RC, let's remember that to fight ambiguity if (((key == ALU_CENTER_KEY) && !Repeat) || ((key == ALU_PLAY_KEY) && !Repeat)) aluRemote = true; // Now let's determine what to do if ((key == ALU_PLAY_KEY) && !Repeat && !digitalRead(lightmeterPin)) startRunWithMetering(); else if ((key == ALU_PLAY_KEY) && !Repeat && digitalRead(lightmeterPin)) stopRun(); else if ((key == ALU_CENTER_KEY) && !Repeat) { if (lmMode == LM_MODE_1ST_SINGLESHOT) meterOnce(); singleFrame(); } else if ((key == MENU_KEY) && !Repeat) { //MENU_KEY if (TIMSK & ( 1 << OCIE1A )) TIMSK &= ~(1 << OCIE1A); // enable timer interrupt else TIMSK |= (1 << OCIE1A); // disable timer interrupt } else if ((key == DOWN_KEY) && !Repeat) { oldIntervalStep = newIntervalStep; newIntervalStep = constrain(oldIntervalStep + 10, 1, 255); } else if ((key == UP_KEY) && !Repeat) { oldIntervalStep = newIntervalStep; if (postscaler <= 4) { // This could lead to intervals <200ms, which we do want to avoid newIntervalStep = constrain(oldIntervalStep - 10, 11, 255); } else { newIntervalStep = constrain(oldIntervalStep - 10, 1, 255); } } else if ((key == RIGHT_KEY) && !Repeat) postscaler = constrain(postscaler * 2, 1, 32768); else if ((key == LEFT_KEY) && !Repeat) { postscaler = constrain(postscaler / 2, 1, 32768); if ((newIntervalStep < 11) && (postscaler <= 4)) newIntervalStep = 11; } else if ((key == WHITE_PLAY_KEY) && !Repeat && !aluRemote && !digitalRead(lightmeterPin)) startRunWithMetering(); else if ((key == WHITE_PLAY_KEY) && !Repeat && !aluRemote && digitalRead(lightmeterPin)) stopRun(); else blinkFlag = false; // if we received a partial or garbled IR code, let's not confirm reception } if (blinkFlag) blinkLED(); blinkFlag = true; // Let's assume the next code is a valid one } // ISR 1 - called on IR signal coming in (falling edge on PB2) ISR(INT0_vect) { int timeStamp = TCNT0; int overFlow = TIFR & 1 << TOV0; if (irBits == 32) { // Let's check for AGC if ((timeStamp >= 194) && (timeStamp <= 228) && (overFlow == 0)) { receivedData = 0; irBits = 0; } else if ((timeStamp >= 159) && (timeStamp <= 193) && (overFlow == 0)) ReceivedCode(1); } else { // Here comes the Data in if ((timeStamp > 44) || (overFlow != 0)) { irBits = 32; // Invalid data, so try again } else { if (timeStamp > 26) { receivedData = receivedData | ((unsigned long) 1 << irBits); } if (irBits == 31) { ReceivedCode(0); } irBits++; } } TCNT0 = 0; // Clear Counter0 TIFR = TIFR | 1 << TOV0; // Clear Overflow GIFR = GIFR | 1 << INTF0; // Clear INT0 flag } // ISR 2 - called by timer1 (for intervalometer) ISR(TIMER1_COMPA_vect) { if (newIntervalStep != oldIntervalStep) { OCR1C = newIntervalStep; OCR1A = OCR1C; } if (divider == 0) { singleFrame(); } divider++; divider %= postscaler; // modulo trick to allow intervals > 4.3 Sec } void loop() { // Our loop() is empty, since everthing happens through Attiny timeStamprs/Counters and Interrupts :) } // Here come the various relay plays, simulating what a finger on the camera trigger would do to the built-in switches. void blinkLED() { digitalWrite(ledPin, HIGH); _delay_ms(20); digitalWrite(ledPin, LOW); } void startRunWithMetering() { // Normaler Startzyklus wie mit EA-1 digitalWrite(lightmeterPin, HIGH); digitalWrite(holdPin, HIGH); digitalWrite(loadPin, HIGH); _delay_ms(250); digitalWrite(loadPin, LOW); _delay_ms(70); digitalWrite(startPin, HIGH); } void stopRun() { digitalWrite(startPin, LOW); _delay_ms(70); digitalWrite(holdPin, LOW); digitalWrite(lightmeterPin, LOW); digitalWrite(ledPin, HIGH); _delay_ms(250); digitalWrite(ledPin, LOW); lmMode = LM_MODE_1ST_SINGLESHOT; } void meterOnce() { digitalWrite(lightmeterPin, HIGH); digitalWrite(ledPin, HIGH); _delay_ms(350); digitalWrite(ledPin, LOW); digitalWrite(lightmeterPin, LOW); lmMode = LM_MODE_SUB_SINGLESHOT; } void singleFrame() { digitalWrite(loadPin, HIGH); _delay_ms(10); // 10ms is short but subsequent exposures will have a pre-loaded cap. digitalWrite(loadPin, LOW); digitalWrite(startPin, HIGH); _delay_ms(20); digitalWrite(startPin, LOW); digitalWrite(loadPin, HIGH); // Pre-load the start capacitor since for the next exposure. Reduces latency. :) _delay_ms(50); digitalWrite(loadPin, LOW); } Und falls es jemanden interessiert, hier der derzeitige Code. Funktioniert fantastisch. Besonders stolz bin ich auf den main() loop :-)
  10. Ich bin ja noch gespannt, ob der chinesische Billigheimer diese Platinenform wirklich gefräst bekommt. Und ob die Sollbruchstellen für die Kontaktstifte die Fertigung überleben... Das ganze zu Löten wird auch noch etwas eng...
  11. So, langsam bin ich fertig. Die Platinen sind nach zig Änderungen jetzt final und in China bereits bestellt. So sehen sie aus: Das ganze ist allerdings nur 25x35mm klein. Die goldenen Flügel werden durch die sechs Schlitze gesteckt und ergeben festgelötet dann exakt den proprietären Nikon-Stecker. So sitzt das Platinchen einfach unter der Kamera, stört nicht, braucht keine Kabel und keinen extra Strom. Ich glaub, das wird ne feine Sache.
  12. Den habe ich wohl geschrieben. Headline war „Zwischen den Zeilen“ und er beschrieb das (ungünstig gewählte) Schlagwort „Superresolution“. Wenn Du ihn nicht findest sag Bescheid, ich hab den irgendwo noch als PDF. Auf filmkorn.org müsste er aber eigentlich auch noch sein.
  13. https://www.kameramann.de/technik/entwicklungsprozesse-aller-art/
  14. Diesen Ratschlag würde ich niemandem jemals geben. Erst recht keinem Freund.
  15. Genau, eine Fernbedienung für Nikon R10/R8, denen ja leider ein einfacher Taster am Kabel nicht reicht. Neben Spezialstecker brauchen die vier im exakt richtigen Timing schließende Kontakte. Das übernimmt dieses kleine Platinchen, das zusammengebaut quasi zum Stecker wird. Und sich dann eben auch noch fernbedienen lässt. Stromversorgung kommt aus der Kamera. :)
  16. Hmm, stimmt eigentlich. Danke.
  17. Stümmt. Nicht aufgepasst. :) War im Grunde Einstiegsübung in KiCAD. Eagle hat mich zunehmend genervt. Montag werden Platinen in China bestellt, auf dem Breadboard läuft schon fast alles. :) Kurze Umfrage, was wäre praktischer: eine Logik die mit jeder beliebigen IR-Fernbedienung funktioniert (und dann halt nur Start/Stop kann), oder eine mit dedizierter Mini-FB, die dann auch Einzelbild und Intervalometer kann, aber u.U. eben im passenden Moment zuhause liegt?
  18. Für die kommenden arbeitsfreien Wochen: - mit dem Synkino maßgeblich weiterkommen, hier ist noch viel viel zu tun - Die Bray anschließen und in Gang bringen (braucht noch Warmwasserbereiter und ne kleine Hebeanlage) - Tonnenweise TK-Vorräte verfilmen
  19. Ich befürchte eher, bei Kodak im Marketing wissen sie nicht mehr so genau wie man kerbt und wierum die Kassette gehört.
  20. Nein. Aber eine neue, andere Bewichtelungskombination als letztes Jahr wäre schön.
  21. Vorzeitig geht auch. :)
  22. Sag mal @SandroP, wollen wir dieses Jahr wieder Forenwichten machen? Hättest Du Zeit und Lust, das wieder zu organisieren? :)
×
×
  • Neu erstellen...

Filmvorführer.de mit Werbung, externen Inhalten und Cookies nutzen

  I accept

Filmvorfuehrer.de, die Forenmitglieder und Partner nutzen eingebettete Skripte und Cookies, um die Seite optimal zu gestalten und fortlaufend zu verbessern, sowie zur Ausspielung von externen Inhalten (z.B. youtube, Vimeo, Twitter,..) und Anzeigen.

Die Verarbeitungszwecke im Einzelnen sind:

  • Informationen auf einem Gerät speichern und/oder abrufen
  • Datenübermittlung an Partner, auch n Länder ausserhalb der EU (Drittstaatentransfer)
  • Personalisierte Anzeigen und Inhalte, Anzeigen- und Inhaltsmessungen, Erkenntnisse über Zielgruppen und Produktentwicklungen
Durch das Klicken des „Zustimmen“-Buttons stimmen Sie der Verarbeitung der auf Ihrem Gerät bzw. Ihrer Endeinrichtung gespeicherten Daten wie z.B. persönlichen Identifikatoren oder IP-Adressen für diese Verarbeitungszwecke gem. § 25 Abs. 1 TTDSG sowie Art. 6 Abs. 1 lit. a DSGVO zu. Darüber hinaus willigen Sie gem. Art. 49 Abs. 1 DSGVO ein, dass auch Anbieter in den USA Ihre Daten verarbeiten. In diesem Fall ist es möglich, dass die übermittelten Daten durch lokale Behörden verarbeitet werden. Weiterführende Details finden Sie in unserer  Datenschutzerklärung, die am Ende jeder Seite verlinkt sind. Die Zustimmung kann jederzeit durch Löschen des entsprechenden Cookies widerrufen werden.