Servo, Blinker und Spannung messen Gleichzeitig

Hallo,
für ein Modellbauprojekt habe ich vor, mir ein Arduinoboard anzuschaffen. Vorerst geht es mir darum, wie
ich die Programmierung umsetze.
Für meinen Quadrocopter will ich zwei einfahrbare Landebeine konstruieren die über einen Servo gesteuert werden.
Wenn der Copter praktisch 4s lang über 1m in der Luft schwebt, sollen sich die Beine automatisch einklappen(Servo 90° drehen), ebenso unter 1m wieder ausfahren… Um die Höhe zu bestimmen, habe ich den Ultraschallsensor HC-SR04 vorgesehen.

Zudem will ich mit dem Board den aktuellen Lipo-Akku Füllstand(ca 12.6v- 10v) messen. Bei einer möglichen Unterschreitung der
Spannung soll eine rote LED aufleuchten.
Abschließend dazu soll auch noch eine Positions - LED während des ganzen Fluges blinken (1s-Takt).

Ziel ist es, die oben genannten 3 Abläufe parallel auf einem Arduino Board zum Laufen zu bekommen.

Kann mir hierzu jemand einen Ansatz geben, wie ich an eine solche Aufgabe herantaste?
Über Hilfe würde ich mich sehr freuen.

Grüße,
pilot

Naja, sollte so komplex nicht werden ...

Initialisiere die Ports für Sensoren und Ausgaben, Spannung über einen Spannungsteiler am analogen (A/D) Eingang, so dass sie unter 5V bleibt ...

Dann einfach Schleife laufen lassen:

wenn Höhe < 1m merke Zeit als abhebezeit
wenn aktuelle Zeit > abhebezeit+4 UND status Beine ausgefahren dann fahre Beine ein und setze Status auf eingefahren
wenn Sensor < 1m dann Beine ausfahren (Status ändern?)
wenn Sekunden(aktuelle Zeit) geändert dann Zustand der Blink-LED ändern
wenn Spannung kleiner x dann rote LED anschalten

Das ganze läuft innerhalb von Sekundenbruchteiler mehrfach ab und reagiert halt auf Änderungen ...

Liebe Grüße

Dirk

Zur Zeitmessung kannst Du die Funktion millis() verwenden. Diese gibt Dir die Zeit in Millisekunden ab Einschalten zurück.
Siehe in der IDE das Beispiel BlinkWithoutDelay an.
Grüße Uwe

pilot1311:
Kann mir hierzu jemand einen Ansatz geben, wie ich an eine solche Aufgabe herantaste?
Über Hilfe würde ich mich sehr freuen.

Kooperatives Multitasking.

Im Prinzip schreibst Du für Dein Programm lauter Funktionen nach diesem Pseudocode-Schema:

void meineFunktionX()
{
  WennNichtsZuTunIst return; 
  if (EtwasSollGestartetWerden())  starteIrgendwas();
  if (EtwasSollGemachtWerden()) macheirgendwas();
  if (EtwasSollBeendetWerden())  beendeirgendwas();
}

Diese Funktionen rufst Du in der loop() nacheinander reihum auf ("Round-Robin-Scheduling")

void loop()
{
  meineFunktion1();
  meineFunktion2();
  meineFunktion3();
  meineFunktion4();
  meineFunktion5();
}

Und das Timing wann etwas gestartet, gemacht oder beendet werden soll machst Du über den millis() Timer.

Die Funktion "delay()" mußt Du zwingend vermeiden.

Und auch die Unterfunktionen starteIrgendwas(); macheIrgendwas(); beendeIrgendwas(); müssen kooperativ programmiert sein, d.h. das Programm darf niemals mit einem delay() in der Ausführung blockiert werden, sondern eine Funktion muß sich selbst ("kooperativ") beenden, wenn sie nichts zu tun hat, und sie muß blitzschnell das tun, was sie tun soll, wenn die Zeit gekommen ist, etwas zu tun.

Erstmal vielen Dank für die brillianten Lösungen! :slight_smile:
Helfen mir sehr weiter!

Zum Abschluss würde ich noch gerne wissen wollen,
welches Board ich dafür verwenden soll oder welches ausreicht:) ?

Grüße,
pilot

Weil das alles fliegen soll rate ich zu einem Arduino mini oder Arduino PRO mini. Dazu brauchst Du noch einen Seriell-USB Adapter zum programmieren.
Grüße Uwe