- LiFePO4 Speicher Test         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 25

Thema: YACCBOA - YetAnotherCameraControlerBasedOnArduino

  1. #11
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.04.2008
    Alter
    39
    Beiträge
    557
    Anzeige

    LiFePo4 Akku selber bauen - Video
    *staubwisch*

    Soooo.....

    In den letzten Wochen bin ich nicht wirklich weiter gekommen. Nicht weil ich vor Problemen bei diesem Projekt stand, sondern weil ein anderes Projekt die höhere Priorität hat (haben den Fuhrpark bei unserer DLRG-Ortsgruppe erneuert und die meisten Umbauten blieben an mir hängen)

    In der Zwischenzeit habe ich immer mal ein bisschen dran rum gespielt und getestet und gemacht und getan und und und.

    Mittlerweile habe ich mich bei der Hardware für den Prototypen festgelegt. Hauptsächlich kommen Bauteile zum Einsatz, die noch bei mir rumliegen.

    In ein kleines Alugehäuse kommen somit:
    - Arduino Pro mini
    - Arduino Ethernet-Shield (zur steuerung der Funktionen via PC)
    - Standart 20x4 LCD mit I2C-Adapter
    - 5 Taster zur Steuerung der Funktionen
    - 6 Klinkenbuchsen zum Anschluss von Kamera, Blitz, Sensoren, Peripherie
    - RJ45 Buchse zur Verbindung mit der Steuereinheit des Sliders
    - 850mAh 3s LiPo-Akku für die Stromversorgung


    Und während ich das so schreibe frage ich mich ob hier jemand an nem Schrumpfstrahler arbeitet damit ich den granzen Kram überhaupt in dem kleinen Gehäuse unterbringen kann.....

    In den kommenden Tagen gibt es endlich mal ein paar Bilder Versprochen.
    Alles ist möglich. Unmögliches dauert nur etwas länger!

  2. #12
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.04.2008
    Alter
    39
    Beiträge
    557
    *staubwisch*

    Moinsen,

    zuerst wünsche ich obligatorisch jedem Leser hier mal ein frohes neues Jahr.

    Über die Feiertage hatte ich endlich mal Zeit und Gelegenheiten mein Projekt voran zu treiben. So hat sich jetzt eine ganze Menge Elektronik in einem kleinen Gehäuse eingefunden und die ersten, grundlegenden Funktionen verrichten ihr Werk. Bitte beachtet, dass es zur Zeit ein Prototyp ist. Dazu im Verlauf mehr.

    Klicke auf die Grafik für eine größere Ansicht

Name:	IMG_3268.jpg
Hits:	24
Größe:	44,6 KB
ID:	27044
    Hier zu sehen das Display und die sechs Knöpfe zur Bedienung. Wahrscheinlich wird es in der finalen Version nur vier Knöpfe geben. Das stellt sich während der kommenden Erprobung heraus. Aber ich denke, dass sowohl für die Navigation im Menü als auch zum Einstellen der Parameter Knöpfe für "Hoch","Runter","Enter" und "Zurück" reichen wird.

    Klicke auf die Grafik für eine größere Ansicht

Name:	IMG_3273.jpg
Hits:	20
Größe:	49,5 KB
ID:	27045
    Auf der Rückseite befinden sich die Anschlüsse. Links beginnend eine 3,5mm Klinkenbuchse für den Anschluss der Kamera.

    Dann folgen sechs Eingänge für Sensoren (Licht, Ton, Berührung, Blitz, ect.). Aber auch Servos aus dem Modellbau können hier betrieben werden, um z.B. Gegenstände kontrolliert fallen zu lassen oder mechanisch etwas zu betätigen. Auch hier verwende ich Klinkenbuchsen und -stecker, da ich so über die drei Pins Vcc, GND für die Versorgung der Sensoren und eine Signalleitung für die Auswertung am Arduino habe.

    Dann folgen sechs gelbe Cinch-Buchsen für die Ansteuerung von Ventilen für die Tropfenfotografie und deren Verwandte.

    Rechts außen befinden sich dann noch drei rote Cinch-Buchsen für die Auslösung von Blitzen. Damit ließen sich während einer Langzeitbelichtung gezielt Blitze auslösen um Bewegungen einzufrieren oder Mehrfachbelichtungen anzufertigen.

    Alle Ein- und Ausgänge sollten sich eigentlich separat Auslesen und Ansteuern lassen. Aber wenn der geneigte Leser kurz durchzählt wird er feststellen, dass nicht genügend Pins verfügbar sind. Und da kommen wir zum nächsten Grund, warum dies "nur" ein Prototyp ist Denn zusätzlich zu den bisher aufgezählten Signalen werden noch zwei Pins für das I2C-Display benötigt, ein ADC Pin der die Knöpfe ausliest und vier Pins werden für den Slider benötigt.

    Slider? Richtig! Über eine RJ45 Buchse wird ein Schrittmotor angeschlossen der einen Schlitten auf einer IGUS-Schiene bewegt. Bilder dazu folgen. Der Antrieb über Zahnriemen rutschte durch, wenn der Schlitten nicht nur horizontal verfahren soll. Darum werde ich eine Gewindestange an den Motor flanschen und über eine Mutter den Schlitten antreiben. Dazu noch zwei Endschalter für die Referenzierung. Somit entsteht ein vorerst einfacher Slider für bewegte Timelapse-Aufnahmen.

    Klicke auf die Grafik für eine größere Ansicht

Name:	IMG_3275.jpg
Hits:	17
Größe:	35,8 KB
ID:	27046
    Neben der RJ45-Buchse ist noch eine Aussparrung angebracht, um die Arduino Pro Mini von außen flashen zu können.

    Klicke auf die Grafik für eine größere Ansicht

Name:	IMG_3280.jpg
Hits:	22
Größe:	73,2 KB
ID:	27047
    Im Inneren sieht es derzeit so aus. Die Anschlüsse für die Sensoren sind noch nicht eingebaut, da ich sie im Moment noch nicht benutzen kann (fehlende Sensorik) Der restliche freie Platz ist für einen Lipo (3s 800mAh) vorgesehen, um das System auch Abseits einer Steckdose betreiben zu können. Für einen Autonomen Einsatz des Sliders muss ich mal gucken, welche Laufzeit mit dem integrierten Akku erreicht werden. Alternativ wird wohl eine Buchse nach außen führen, um zusätzliche Energiespender einbringen zu können.

    Das war es vorerst. Die kommenden Tage werden für die Software und erste Probeläufe drauf gehen.

    To-Do
    - Sensoren aufbauen
    - Anschlüsse für Sensoren einbauen
    - Slider fertig stellen
    - Code, Code und noch mehr Code

    Und wenn ich dann einen Status habe der mir gefällt und ich Erfahrungen habe, wie viele Ports ich von welcher Sorte endgültig brauche wird es wohl noch eine professionell gefertigte Platine geben. Kann ja sein, dass noch jemand Interesse an einem YACCBOA hat
    Alles ist möglich. Unmögliches dauert nur etwas länger!

  3. #13
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.04.2008
    Alter
    39
    Beiträge
    557
    Tja......

    Ich sitze hier grade vor meinem Aufbau und bin ziemlich ernüchtert. Es tun sich immer neue Baustellen auf....


    Die Hardware funktioniert im Prinzip. Die Ventile öffnen, die Blitze blitzen und die Kamera nimmt Bilder auf. ABER! Aber..... aber -_-

    Zwei Blitze unterschiedlicher Hersteller haben unterschiedliche Verzögerungen. Daher habe ich zur Zeit noch Doppelbelichtungen. Dies würde sich recht einfach beheben lassen, wenn nicht das zweite, gravierendere Problem wäre.

    Die Bibliotheken, die ich für das Menü, LCD oder mein eigener Code haben die blöde Eigenschaft, die Vorgänge nicht im Millisekundenbereich aufeinander abzustimmen. Ich habe den Tropfen immer ein paar Millimeter über der Wasseroberfläche, gar nicht im Bild oder schon die letzten Kräusel auf der Oberfläche. Aber ich schaffe es nicht, das Bild zwischen diesen Momenten zu schießen. Ich vermute, dass irgend ein Teil des Codes die Abläufe so verzögert, dass ich z.B. nur in 10ms-Sekunden springen kann.

    Ich vermute, dass es an meinem eigenen Code liegt, da in den Funktionen für den Ablauf (Kamera, Tropfen, Blitz) weder das LCD noch das Menü arbeitet. Ich zähle die Millisekunden per
    Code:
    millis_aktuell = millis() - millis_start;
    und lasse die entsprechenden Aktionen ausführen wenn eine if-Abfrage erkennt, dass genug ms vergangen sind.

    Verwendet wird ein Arduino Pro Mini 16MHz.

    Kann mir jemand nen Tipp geben, wie ich Vorgänge auf die Millisekunde genau timen kann?
    Alles ist möglich. Unmögliches dauert nur etwas länger!

  4. #14
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.04.2010
    Ort
    Im Städtedreieck Köln-Bonn-Aachen
    Alter
    36
    Beiträge
    106
    Das Arduino Pro Mini hat den ATmega328 als µC verbaut. Dieser hat 3 Timerbausteine (2x 8Bit und 1x 16Bit).
    Ich würde es damit versuchen.

    Entweder du liest das/die Register TCNTx per Hand aus, oder du stellst einen Timer so ein, dass er alle 1ms einen Überlauf hat und einen Interrupt auslöst.

  5. #15
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.04.2008
    Alter
    39
    Beiträge
    557
    Ich bin mir nicht sicher wo das Problem liegt. Ich habe heute Vormittag den Durchlauf der Funktion mal per
    Code:
    micros_durchlauf_start = micros();
    .....
    jede menge Code
    .....
    micros_durchlauf = micros() - micros_durchlauf_start;
    Serial.println(micros_durchlauf);
    gemessen. Dabei werden mir pro Durchlauf 20-28 Microsekunden ausgegeben. Was mich aber stutzig macht ist ein Wert nach ca. 100 Durchläufen aus der Reihe schlägt und mit rund -15500µs angegeben wird. Es ist bei jeden Aufruf der Funktion nur ein einzelner Wert nach ca 100 Durchläufen.


    Ich bin mir nicht sicher, ob ein Timer-Interrupt mein Problem lösen wird. Die Funktion scheint ja (meistens) schnell genug zu sein, um sogar mehrmals pro Millisekunde auf ein evtl. auszuführendes Event zu überprüfen. Die ISR müsste ja ähnlich aussehen wie meine bisher verwendete (nachfolgende) Funktion.
    Code:
    void ausloesen(void)
    {
      int millis_start = millis();
      int millis_aktuell = millis();
      int status_ventil_open[3] = {0,0,0};
      int status_ventil_closed[3] = {0,0,0};
      int status_blitz = 0;
      int status_sva = 0;
      int status_trigger = 0;
      int timer_blitz = 500;
      int kamera_delay = 82;
      int micros_durchlauf = 0;
      int micros_durchlauf_start = 0;
      
    
    
      
      lcd.clear();
      lcd.home();
      lcd.print(valve_delay[1]);
      sva();
      
      
      while(tmp == 0)
      {
        millis_aktuell = millis() - millis_start;
        micros_durchlauf_start = micros();
        
         
    //    lcd.setCursor(0,2);
    //    lcd.print(millis_aktuell);
        
        // Ventile öffnen
        for(int i = 0; i<valve_amount;i++)
        {    
          if((millis_aktuell > valve_delay[i]) && (status_ventil_open[i] == 0) && (valve_active[i] == 1))
          {
            digitalWrite(+i,HIGH);
            status_ventil_open[i] = 1;
          }
        }
        
        // Ventile schließen
        for(int i=0;i<valve_amount;i++)
        {
          if((millis_aktuell > (valve_delay[i]+valve_size[i])) && status_ventil_closed[i] == 0)
          {
            digitalWrite(+i,LOW);
            status_ventil_closed[i] = 1;
          }
        }
        
        // Kamera auslösen
        if((millis_aktuell > (timer_blitz - kamera_delay) && (status_trigger == 0)))
        {
          digitalWrite(13,HIGH);
          status_trigger = 1;
        }
        
        // Blitze auslösen
        if((millis_aktuell > timer_blitz) && (status_blitz == 0))
        {
          trigger_blitze();
          status_blitz = 1;
        }
        
        micros_durchlauf = micros() - micros_durchlauf_start;
        Serial.println(micros_durchlauf);
        if(millis_aktuell > 2000)
        {
          tmp=1;
          digitalWrite(13,LOW);
          display_setup_valve_delay();
        }
      }
    }
    Alles ist möglich. Unmögliches dauert nur etwas länger!

  6. #16
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.04.2010
    Ort
    Im Städtedreieck Köln-Bonn-Aachen
    Alter
    36
    Beiträge
    106
    Okay... ich habe min. 10 mal die Antwort hier verworfen.

    Was mich stört, ist das eine menge Lib. aufgerufen werden, die für mich scheinbar der Plattform Arduino als Entwicklungsumgebung abhängig sind.
    Korregiere mich, wenn das nicht stimmt.

    Ich würde immer noch einfach den 16Bit Timer im Hintergrund mitlaufen lassen und ihn als Zeitgeber nehmen.
    Aber ich weiß jetzt nicht, ob Arduino einen so tief in die Hardware des µC rein läst. Sprich ob du einfach das CS11-Bit im TCCR1B Register auf High setzten kannst und das TCNT1 Register einfach auslesen kann, ohne eine aufwendige Funktion zu benutzen.

    Sprich so:
    Code:
    unsigned int auslesen;
    TCCR1B|=(1<<CS11);
    auslesen=TCNT1;
    Die Anweisungen dauern jeweils meine ich max. 4 Takte.

    Daher meine Grundlegende Frage: Kannst du direkt, ohne irgendwelche Funktionen, auf die Register zugreifen?

  7. #17
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    Hallo,

    schickes Gerät, gefällt mir sehr gut. Wollte auf deine PM antworten, aber dein Postfach ist voll.

    @Jimmybot Beim Arduino läuft bereits der Timer im Hintergrund im Interrupt als Zeitgeber. Da würde ich nicht dran herum schrauben.

    Das Problem liegt vermutlich eher an den Variablen Typen. Millis() und micros() geben 'unsigned long' zurück, du verwendest 'int' (das sind beim Arduino 16Bit Werte). Das kann zu Überläufen und ungeahnten Problemen führen.

    Bei meinen Tests habe ich nur schnöde delay() Aufrufe verwendet, will aber auch später millis() verwenden. Brauche ich aber erst wenn ich mehrere Ventile verwende.
    Kann meinen Code aber gerne hier posten, falls gewünscht.

    LG Peter

  8. #18
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.04.2010
    Ort
    Im Städtedreieck Köln-Bonn-Aachen
    Alter
    36
    Beiträge
    106
    Zitat Zitat von m.a.r.v.i.n Beitrag anzeigen

    @Jimmybot Beim Arduino läuft bereits der Timer im Hintergrund im Interrupt als Zeitgeber. Da würde ich nicht dran herum schrauben.
    Wieder was dazu gelernt. Danke für den Hinweis.

  9. #19
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.04.2008
    Alter
    39
    Beiträge
    557
    Danke für die Antwort. Timer sind, wie schon erwähnt, durch die Arduino IDE zum Teil belegt. Gibt Wege diese freizulegen und zu nutzen. Aber da bin ich noch nicht fit genug für.

    Der Hinweis mit den Datentypen ist berechtigt. Hab ich ganz vergessen. Werde ich mir morgen mal Gedanken drüber machen.

    PS: Postfach ist wieder frei
    Alles ist möglich. Unmögliches dauert nur etwas länger!

  10. #20
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.04.2008
    Alter
    39
    Beiträge
    557
    Zwei Fehler die zu seltsamen Verhalten führten. Zuerst habe ich in der for-Schleife für das Öffnen der Ventile durch ständiges Testen und Ändern nur noch Schwachsinn stehen gehabt. Etwas Schlaf und ein frisches Auge haben dies behoben. Dazu habe ich jetzt die Variablen für millis() als unsigned long initialisiert. Ich hab den Überlauf etwas unterschätzt. Hatte nur im Kopf, dass millis(); nach 49 Tagen überläuft. Ich hab dabei aber ignoriert, dass meine Variablen als Integer schon schneller überlaufen.

    Jetzt machen die Ventile was sie sollen. Nur die Wassertropfen muss ich noch bändigen.

    Als nächstes steht etwas Optimierung auf dem Plan. Der Code ist kaum kommentiert, ein paar Funktionen lassen sich vereinfachen oder auslagern um sie an mehreren Stelen zu nutzen. Zur Zeit sind 18.740 Bytes (von einem Maximum von 30.720 Bytes) in Gebrauch. Und ein paar Funktionen sollen noch implementiert werden
    Geändert von Arkon (09.01.2014 um 06:30 Uhr)
    Alles ist möglich. Unmögliches dauert nur etwas länger!

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen