INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Modellschiffchen mit einem Arduino Leben einhauchen
05.05.2014, 20:10
Beitrag #1
Tongue Modellschiffchen mit einem Arduino Leben einhauchen
Einen schönen Abend,
mein estes Projekt mit einem Arduino im Modellbau möchte ich Euch heute mal auf die schelle vorstellen.Cool
Zu meiner Vorgeschichte ist noch kurz zu sagen, bis zum Februar diesen Jahres hatte ich noch keine Ahnung was ein Ardu so macht und kann. Geschweige denn das ich wußte was ein Transistor macht, oder wie er geschaltet wird. Meine elektronischen Fähigkeiten beschräkten sich darauf eine LED mit einem Widerstand zu versorgen. Sad

Durch Anregungen in einem anderen Forum kam ich gedanklich das erste mal mit der Gattung der Ardus in kontakt. Es hat mich seither fasziniert wie Projekte gesteuert werden können und das jedes mal anders ohne stundenlang Löten zu müssen.

So nun aber zu meinem Modell-Boot.
Das es Ferngesteuert ist brauch ich wohl nicht zu erwähnen, und wer näheres darüber lesen möchte braucht auf meiner Webseite nur den Reiter Gefjon anklicken. Dort sind genügend Infos. (ich glaube die Werbung reicht.)

Für das Modell habe ich sechs Sonderfunktionen eingeplant.
1. ein Suchscheinwerfer
2. nautische Beleuchtung
3. Kabinenbeleuchtung
4. eine Kerze in der Plicht
5. öffnen einer Motorraumluke
6. einen Ventilator einschalten

In die Figuren (ich nenne sie Darsteller, wenn sie in der nähe sind) habe ich kleine Servos eingebaut. Mit denen können sie nun die Köpfe ein wenig nach rechts und links bewegen. Zudem Steuert die Mis Swan das Boot, und Arnold ist mal wieder für Power zuständig und gibt Gas.

Da ich nur einen ganz einfachen Sender mit 5 Kanälen habe, und die Funktionen nicht über die Stellhebel (Kreutzknüppel) des Senders schalten wollte, habe ich mir einen Taster an den fünften Kanal gelötet. Big Grin

Der Ardu soll nun die fünf Empfängerkanäle auslesen (ist ein PWM-Signal pro Kanal). Dazu habe ich mir eine RC-Receiver Bibliothek geladen, die ich nur empfehlen kann.
Da ich die Signale nach möglichkeit ohne aussetzter erwischen wollte kam nur die Methode mittels Interrupt in Frage. Was mir dann einen Mega 2560 von Sainsmart einbrachte. Tongue
Da konnte ich dann an den Pin 2,3,21,20,29,18 die Externen Interrups nutzen.

Auf dem linken Stellhebel habe ich die Funktionen des Fahrens vor zurück und links rechts. Soweit normal. Auf dem rechten Stellhebel habe ich die beiden Köpfe der Darsteller.Sleepy

Die oben genannten Funktionen kann ich nun über einen Taster im Zählverfahren schalten. Zwei mal kurz und einmal lang schaltet den Kanal drei und so weiter. Um Fehlsignale auszufiltern ist die kurze Schaltfase länger als 80ms und die lange länger als 500ms. Funktioniert soweit alles sehr gut.Big Grin

Wenn der Suchscheinwerfer nun eingeschaltet wird soll auf dem rechten Stellhebel anstatt der Kopfbewegung der Frau der Scheinwerfer links rechts gedreht werden. Indessen soll der Kopf der Frau dann der Fahrtrichtung folgen. und weil das noch nicht reicht soll der Kopf des Mänchens sofern der Stellhebel 5 sec. nicht bewegt wurde sich automatisch per zufall in verschiedenen Geschwindigkeiten und Zeitabständen in unterschiedliche Richtungen bewegen. Rolleyes

So hoffe ich habe nichts vergessen. Nun überlege ich noch ob ich die Zufallssteuerung der Frau auch verpasse wenn der Suchscheinwerfer aus ist.

Soweit mein erstes Projekt.
Ach ja, ein Bildchen hab ich auch noch mom...
   
Hier ist noch ein Link zu einem video in dem ich die Zufallsteuerung getestet habe.

Somit wünsch ich Euch allen noch einen schönen Abend,
schöne Grüße aus Harrislee
Sven

Nichts auf der Welt ist unnütz, es kann im schlimmsten Fall immer noch als schlechtes Beispiel dienen.
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.05.2014, 21:01
Beitrag #2
RE: Modellschiffchen mit einem Arduino Leben einhauchen
Guten Abend,
mein Projekt habe ich um eine Zufallsbewegung erweitert. Nun wird auch der Kopf der Frau über den Arduino per Zufall gesteuert sofern der Scheinwerfer aus ist und der zugehörige Stellhebel länger als 5 sec. nicht bewegt wurde.

für alle die es interessiert versuch ich mal den Code einzustellen.Huh

Code:
/*--------------------------------------------------------------------------------------------------------------------------------------------------------------
Multiswitch Sketch mit 6 Schaltfunktionen für Arduino Mega 2560
Steuerung über einen Taster am Sender. Empfängerkanal an Pin 18 angeschlossen.

Am AusgabeKanal 1 (Pin 31) wird ein Scheinwerfer angeschlossen ein/aus.
Wenn der Scheinwerfer leuchtet, soll er über den linken Kreutzknüppel (rcSignal2) des Sender (Pin2) links/rechts steuerbar sein (Servo an Pin 7).
Der Kopf der Frau soll in dessen der Fahrtrichtung folgen (rcSignal3 vom Pin 3 Servo an Pin 8).

Ist der Scheinwerfer ausgeschaltet, so wird über den selben Empfängerkanal ein
Servo zur Steuerung des Kopfes der Frau angesteuert (rcSignal2 ans Servo Pin8), Ist der Kreutzknüppel 5 sec. nicht bewegt wurden soll sich der Kopf automatisch von allein bewegen.
Das selbe soll mit dem Servo zur Steuerung des Kopfes des Mannes passieren.

Die Ausgabekanäle 2-5 (Pin 33-39) schalten verschiedene Beleuchtungen.
Der Ausgabekanal 6 (Pin 41 eine Kontroll LED) soll eine Luke zum Motorraum öffnen/schliessen (Servo an Pin6)

Wird der Ausgabekanal 7 mal geschaltet werden alle Funktionen ausgeschaltet.
-------------------------------------------------------------------------------------------------------------------------------------------------------------------*/


//Bibliotheken laden
#include "Servo.h"
#include "makros.h"
#include "debug.h"
#define USE_TIMER_5
#include "RCReceive.h"
  
//Globale-Variablen Deklarieren  
const int AusgabePin[]={31,33,35,37,39,41}; //die 6 Ausgabepins festlegen für die Schaltkanäle
boolean Anaus[]={LOW,LOW,LOW,LOW,LOW,LOW,LOW}; //Variablen zum Schaltstatus der Kanäle auf LOW deklarieren
  
int i=0;//Zählervariable für schleifen

//Zufallsbewegung Mann Variablen
long zufallwinkel;//Zufallszahl für den Blickwinkel des Mannes
long zufallzeit;// Zufallszahl für den Zeitabstand der Bewegungen
long zufallgeschw;// Zufallszahl für die Bewegungsgeschwindigkeit
long winkelkopfMann;// nimmmt den Winkel des Kopfes auf

unsigned long StartZeitZufall=millis();// Steuert die Startzeit der Zufallsbewegung
unsigned long VZeitKbw=0;// Vergleichszeit zum abfragen wann die Bewegungswerte neu generiert werden sollen
unsigned long verz1=0;
unsigned long Start1=millis();
unsigned long Zeitstellhebelrechts=millis();//wie lange wurde der rechte Stellhebel nich auf oder ab bewegt??
unsigned long Zeitstellhebelrechtsvergl;
boolean Automatik = LOW;//Kopf wird automatisch gesteuert wenn pegel HIGH

//Zufallsbewegung Frau Variablen
long zufallwinkel_frau;//Zufallszahl für den Blickwinkel der Frau
long zufallzeit_frau;// Zufallszahl für den Zeitabstand der Bewegungen
long zufallgeschw_frau;// Zufallszahl für die Bewegungsgeschwindigkeit
long winkelkopf_frau;// nimmmt den Winkel des Kopfes auf

unsigned long StartZeitZufall_frau=millis();// Steuert die Startzeit der Zufallsbewegung
unsigned long VZeitKbw_frau=0;// Vergleichszeit zum abfragen wann die Bewegungswerte neu generiert werden sollen
unsigned long verz1_frau=0;
unsigned long Start1_frau=millis();
unsigned long Zeitstellhebelrechts_frau=millis();//wie lange wurde der rechte Stellhebel nich auf oder ab bewegt??
unsigned long Zeitstellhebelrechtsvergl_frau;
boolean Automatik_frau = LOW;//Kopf wird automatisch gesteuert wenn pegel HIGH

//Zeitmanagemant
unsigned long StartZeit=millis();//Zeitsteuerungsvariable zum Schaltintervall berechnen
unsigned long VergleichZeit=0;//Zeitsteuerungsvariable zum vergleichen mit SartZeit
unsigned long StartZeitKopf=millis();//Zeitsteuerungsvariable zum Schaltintervall berechnen
unsigned long VergleichZeitKopf=0;//Zeitsteuerungsvariable zum vergleichen mit StartZeitKopf
  
unsigned long zaehlerZeit=millis();//Zeitsteuerungsvariable zum zurücksetzen fals die Timeout Zeit errecht wird
unsigned long Vergleichzaehler=0;//Zeitsteuerungsvariable zum vergleichen mit zaehlerZeit
boolean w=LOW;//Schaltvariable zum Timeout
  
//Pinbelegung RC-Kanäle
const byte PIN_RC = 18;//Variable Empfängerkanal Pin festlegen Kanal 1 Taster
const byte PIN_RC2 = 2;//Variable Empfängerkanal Pin festlegen Kanal 2 Scheinwerfer/Kopf
const byte PIN_RC3 = 3;//Variable Empfängerkanal Pin festlegen Kanal 3 Ruder
const byte PIN_RC4 = 19;//Variable Empfängerkanal Pin festlegen Kanal 4 Gas
const byte PIN_RC5 = 20;//Variable Empfängerkanal Pin festlegen Kanal 5 zur Zeit noch frei
  
byte rcSignal;// Variable für das Empfängersignal 1 Steuert den Multiswitch
byte rcSignal2;// Variable für das Empfängersignal 2 Steuert den Kopf Frau/Scheinwerfer
byte rcSignal3;// Variable für das Empfängersignal 3 Steuert den Kopf Frau/Ruder
byte rcSignal4;// Variable für das Empfängersignal 4 Steuert den Kopf Mann
byte rcSignal5;// Variable für das Empfängersignal 5 Steuert den Kopf Mann-Gas

int Kanalzaehler = 0;// Zähler für den zu schaltenden Kanal
int Schaltwert = 220;// wert ab dem der Zähler erhöht wird. Vergleicht den rcSignal wert ist der Signalwert höhe...
int schaltzeitk = 80;//kurze schaltzeit ca. eine 10.tel sec zum entprellen
int schaltzeitl =550;//Lange schaltzeit dreiviertel Sec. zum schalten eines ausganges
int timeout = 10000;// Timer zum zurücksetzen des Schaltbildes
int Schaltwertver=0;
  
int t=0;//Schleifen Zählervariable
int a=0;//
int Langeschaltzeit=0;//Prüfvariable ob die Schaltzeit über schaltzeitl gewesen ist
  
// Der Empfänger
RCReceive rcKanal1;//Objekt Kanal 1 festlegen Taster
RCReceive rcKanal2;//Objekt Kanal 2 festlegen Kreutzknüppel rechts links rechts
RCReceive rcKanal3;//Objekt Kanal 3 festlegen Kreutzknüppel links links rechts
RCReceive rcKanal4;//Objekt Kanal 4 festlegen Kreutzknüppel links auf ab
RCReceive rcKanal5;//Objekt Kanal 5 festlegen Kreutzknüppel rechts auf ab

//Der Kopfservo Frau
int Kopfpin=8;//Der Servo Pin für den Kopf Frau
Servo Kopf;// Servo Objekt anlegen
boolean kopf=LOW;//Kopfdrehung links oder rechts
int kopfwert=0;// nimmt den verstellwert für den Kopfservo auf


//Der Kopfservo Mann
int KopfpinMann=5;//Der Servo Pin für den Kopf Mann
Servo KopfMann;// Servo Objekt anlegen
boolean kopfMann=LOW;//Kopfdrehung links oder rechts
int kopfwertMann=0;// nimmt den verstellwert für den Kopfservo auf
int KopfMannWinkel=3;
  
//Der Scheinwerferverservo
int Scheinwerferpin=7;//Der Servo Pin für den Scheinwerfer
Servo Scheinwerfer;// Servo Objekt anlegen für den Scheinwerfer

//Der Servo Luke Motorraum
int Lukepin=6;//Der Servo Pin für den Lukenservo
Servo Luke;// Servo Objekt anlegen
boolean luke=LOW;//Luke auf oder zu
int lukewinkel=3;// Winkel des Luckenservo

void setup()
{
  rcKanal1.attachInt(PIN_RC);//Objekt Kanal 1 an Pin binden Switch
  rcKanal2.attachInt(PIN_RC2);//Objekt Kanal 2 an Pin binden Scheinwerfer/Kopf
  rcKanal3.attachInt(PIN_RC3);//Objekt Kanal 3 an Pin binden RuderServo
  rcKanal4.attachInt(PIN_RC4);//Objekt Kanal 4 an Pin binden ....
  rcKanal5.attachInt(PIN_RC5);//Objekt Kanal 5 an Pin binden Kopf Mann
    
  Kopf.attach(Kopfpin,930,2050);//Servo Objekt an Pinn anbinden für den Kopf der Frau
  Scheinwerfer.attach(Scheinwerferpin,930,2050);//Servo Objekt an Pinn anbindenfür den Scheinwerfer
  Luke.attach(Lukepin,930,2050);//Servo Objekt an pin 6 für die Motorluke
  KopfMann.attach(KopfpinMann,930,2050);//Servo Objekt an Pinn anbinden für den Kopf des Mannes
  randomSeed(analogRead(0));
  
  pinMode(AusgabePin[0],OUTPUT);//Ausgabepins für die Schaltfunktionen deklarieren
  pinMode(AusgabePin[1],OUTPUT);
  pinMode(AusgabePin[2],OUTPUT);
  pinMode(AusgabePin[3],OUTPUT);
  pinMode(AusgabePin[4],OUTPUT);
  pinMode(AusgabePin[5],OUTPUT);
  randomSeed(analogRead(0));
  //Serial.begin(9600);//Serielle Übertragung durch Kommentar ausgeblendete ist nur zu Kontrollzwecken
  Scheinwerfer.write(87);
}
  
void loop()
{
//Empfänger überwachen
if (!rcKanal1.hasError() && !rcKanal2.hasError() && !rcKanal3.hasError() && !rcKanal4.hasError() && !rcKanal5.hasError())
  {
   doWork(); // aurufen der "Arbeits-Routine"
  }
  else if (rcKanal2.hasError())
  { // bei Empfangsproblemen dagegen
   failSave(); // wird die Failsave-Routine gestartet
  }
}
//-------------------------------------------------------------------------------
//      01 Funktion Arbeit
//-------------------------------------------------------------------------------
void doWork()
{
  rcSignal = rcKanal1.getValue(); // den Empfänger auslesen
  rcSignal2 = rcKanal2.getValue();// den Empfänger Kanal 2
  rcSignal3 = rcKanal3.getValue();// den Empfänger Kanal 3
  rcSignal4 = rcKanal4.getValue();// den Empfänger Kanal 3
  rcSignal5 = rcKanal5.getValue();// den Empfänger Kanal 3
  /*
  Serial.println("anfang:  ");//Serielle übertragung ausgeblendet
  Serial.print(rcSignal);
  Serial.print(", ");
  Serial.print(rcSignal2);
  Serial.print(", ");
  Serial.print(rcSignal3);
  Serial.print(", ");
  Serial.print(rcSignal4);
  Serial.print(", ");
  Serial.print(rcSignal5);
  Serial.print(", ");
  Serial.print(Automatik);
  Serial.print(", ");
  Serial.print(Zeitstellhebelrechtsvergl);
  */
  //Zufallkopfbewegung ders Mannes Stellhebelabfrage
  if (rcSignal5>120 && rcSignal5<150)//wenn der Stellhebel in Mittelposition ist
  {
    Zeitstellhebelrechtsvergl=millis()-Zeitstellhebelrechts;
    if (Zeitstellhebelrechtsvergl>5000)//wurde der Stellhebel 5 sec. nicht bewegt?
    {
      Automatik = HIGH;
    }
    else
    {
      Automatik = LOW;
    }
  }
  else
  {
    Zeitstellhebelrechts=millis();//Laufzeit speichern wann der Hebel bewegt wurde
  }
  
  //Zufallkopfbewegung derFrau Stellhebelabfrage
  if (rcSignal2>120 && rcSignal2<150)//wenn der Stellhebel in Mittelposition ist und der Schienwerfer aus ist
  {
    Zeitstellhebelrechtsvergl_frau=millis()-Zeitstellhebelrechts_frau;
    if (Zeitstellhebelrechtsvergl_frau>5000)//wurde der Stellhebel 5 sec. nicht bewegt?
    {
      Automatik_frau = HIGH;
    }
    else
    {
      Automatik_frau = LOW;
    }
  }
  else
  {
    Zeitstellhebelrechts_frau=millis();//Laufzeit speichern wann der Hebel bewegt wurde
  }
  
  Kopfservo();//ruft das Unterprogramm zum Steuern des Kopfes der Frau und des Scheinwerfers auf
  KopfservoMann();//ruft das Unterprogramm zum Steuern des Kopfes des Mannes auf
  /*if (luke==HIGH)
  {
   Motorlukeoeffnen();
  }
  else
  {
   Motorlukeschliessen();
  }
  */
  //-------------------------------------------------------------------------------
  //      Timeout
  //-------------------------------------------------------------------------------
  if (w==HIGH)//wenn der Timout bereits gstartet ist wird Die Schaltsequenz zurück gesetzt, sofern die Bedingungen erfüllt sind
  {
    Vergleichzaehler=millis()-zaehlerZeit;//Laufzeit des Timout vergleichen
    if (Vergleichzaehler>timeout)
    {
     Kanalzaehler=0;
     a=0;//Kurze schaltzeit für den Kanalzähler zurücksetzen
     Langeschaltzeit=0;//Kanal Schalten zurücksetzen
     StartZeit=millis();// Startzeit neu setzen
     w=LOW;
    }
  }
  //-------------------------------------------------------------------------------
  //      Empfangsignal1 auswerten
  //-------------------------------------------------------------------------------
  if (rcSignal < Schaltwert)//wenn das ausgelesene Empfängersignal kleiner als der schaltwert ist
  {
   if (w==LOW)//ist es der erste schaltvorgang?
   {
     w=!w;//w HIGH setzen
     zaehlerZeit=millis();//Timeout Zeit starten
   }

   multiswitch();//aufrufen der multiswitch-Routine
   if (Langeschaltzeit==1)//wenn der Schaltimpuls lang war...
   {
     Kanalschalten();}//aufrufen der Kanalschalten-Routine
   }
   else//Werte zurücksetzen wenn das RC-Signal1 nicht in schaltposition ist
   {
    a=0;//Kurze schaltzeit für den Kanalzähler auf null setzen
    Langeschaltzeit=0;//Kanal Schalten aus null setzen
    StartZeit=millis();// Startzeit neu setzen
   }
}
//-------------------------------------------------------------------------------
//      02 Funktion multiswitch zum auslesen des Schaltbildes
//-------------------------------------------------------------------------------
void multiswitch()
{
  VergleichZeit=millis()-StartZeit;//wieviel zeit ist seit dem letzten zurücksetzen der Werte vergangen
  if (VergleichZeit > schaltzeitk)//ist die schaltzeit über der kurzen Schaltzeit??
  {
   if (a==0)// Wird diese schleife zum ersten mal durchlaufen ??
   {
     a=1;//wird auf 1 gesetzt damit der Kanalzäler nur einmal pro Schalterbewegung erhöht wird
     Kanalzaehler++;//den Kanalzähler (Ausgang) um 1 erhöhen
     if (Kanalzaehler>7)//Wenn der Kanalzäler größer als 7...
     {
       Kanalzaehler=0;}// ...ist wird er auf 0 zurückgesetzt
     }
     if (VergleichZeit > schaltzeitl)//Wenn die Schaltzeit lang war
     {
       Langeschaltzeit=1;//wird auf eins gesetzt damit ein Kanal geschaltet wird
       Anaus[Kanalzaehler-1]=!Anaus[Kanalzaehler-1];//Schaltzustand toggeln
     }
   }
}
//-------------------------------------------------------------------------------
//      03 Funktion Ausgabekanal schalten
//-------------------------------------------------------------------------------
void Kanalschalten()
{
  //Schaltet einen Kanal an bzw. aus
  switch(Kanalzaehler)
  {
  case 1:// Schaltet Kanal 1
    digitalWrite (AusgabePin[0],Anaus[0]);
  break;
  case 2:// Schaltet Kanal 2
    digitalWrite (AusgabePin[1],Anaus[1]);
  break;
  case 3:// Schaltet Kanal 3
    digitalWrite (AusgabePin[2],Anaus[2]);
  break;
  case 4:// Schaltet Kanal 4
    digitalWrite (AusgabePin[3],Anaus[3]);
  break;
  case 5:// Schaltet Kanal 5
    digitalWrite (AusgabePin[4],Anaus[4]);
    luke=HIGH;   // Motorluke auf
  break;
  case 6:// Schaltet Kanal 6
    digitalWrite (AusgabePin[5],Anaus[5]);
  break;
  case 7:// Wenn der Kanalzähler auf 7 steht werden alle Kanäle ausgeschaltet
   digitalWrite (AusgabePin[0],LOW);
   digitalWrite (AusgabePin[1],LOW);
   digitalWrite (AusgabePin[2],LOW);
   digitalWrite (AusgabePin[3],LOW);
   digitalWrite (AusgabePin[4],LOW);
   digitalWrite (AusgabePin[5],LOW);
   Anaus[0]=LOW;
   Anaus[5]=LOW;//Luke schliessen
  break;
}
if (Anaus[5]==LOW) //wenn Ausgagekanal6 aus ist... Motorluke Schliesen
{
   luke=LOW;
}
Kanalzaehler=0;//setzt den Kanalzähler nach dem Schalten eines Kanals zurück
w=LOW;//Timeout zurücksetzen
}
//-------------------------------------------------------------------------------
//      04 Funktion Kopfbewegung Frau / Scheinwerfer drehen
//-------------------------------------------------------------------------------
void Kopfservo()
{
  VergleichZeitKopf=millis()-StartZeitKopf;//Zeiten vergleichen
  if (Anaus[0]==LOW)//Servo über Funke steuern oder automatisch, wenn der Scheinwerfer aus ist
   if (Automatik_frau == HIGH)
    {
      VZeitKbw_frau=millis()-StartZeitZufall_frau;//Vergleichszeit für die Kopfbewegung setzten
      if (VZeitKbw_frau>zufallzeit_frau)//Bewegungsparameter festlegen
      {
        zufallwinkel_frau = random(179);//erzeugt einen zufälligen Winkel
        zufallzeit_frau = random(500,5000);//erzeugt eine zufällige Zeit zwischen einer halben und 5 sec. (Ruhezeit zwischen den Bewegungen)
        zufallgeschw_frau = random(0,10);//legt die Bewegungsgeschwindigkeit fest
        StartZeitZufall_frau=millis();//Legt die Startzeit neu
      }
      verz1_frau=millis()-Start1_frau;
      winkelkopf_frau=Kopf.read();// Winkel des Kopfservo einlesen
      if (winkelkopf_frau>zufallwinkel_frau)//wenn der Servowinkel zu groß...
      {
        if (verz1_frau>zufallgeschw_frau)//Zeitsteuerung der Bewegung
        {
          winkelkopf_frau--;//Winkelwert verkleinern
          Kopf.write(winkelkopf_frau);//Servo bewegen
          Start1_frau=millis();//Zeit speichern für die nächste Bewegung
        }
      }
      if (winkelkopf_frau<zufallwinkel_frau)//wenn der Servowinkel kleiner ist...
      {
      if (verz1_frau>zufallgeschw_frau)//Zeitabfrage: ist es Zeit für eine Bewegung?
       {
         winkelkopf_frau++;//Winkel vergrößern
         Kopf.write(winkelkopf_frau);//Servo bewegen
         Start1_frau=millis();//Zeit speichern für die nächste Bewegung
       }
    }
  }
  else
  {  
    rcSignal2=map(rcSignal2,25,195,175,40);//Empfängersignal auf Servo umrechnen
    Kopf.write(rcSignal2);//Servo Kopf bewegen
  }
  else// Kopfbewegung im Automatik modus (zur Zeit: Bewegung mit dem Ruder) und Scheinwerfer bewegen.
  {
    if (rcSignal2>124 && rcSignal2<135)//Abfrage des rcSignals, da der Scheinwerfer bei geringer abweichung von 87° endlos dreht
    {
      rcSignal2=87;//Servowinkel auf Stillstand
    }
    else
    {
      rcSignal2=map(rcSignal2,43,240,8,179);//Empfängersignal auf Servo umrechnen
    }
    Scheinwerfer.write(rcSignal2);//Servo Scheinwerfer bewegen
    
    kopfwert=map(rcSignal3,43,240,8,179);//Empfängersignal vom Ruder auf Servo umrechnen
    StartZeitKopf=millis();//Startzeit zurücksetzen
    Kopf.write(kopfwert);//Servo Kopf bewegen
  }
}

//-------------------------------------------------------------------------------
//      05 Funktion Kopfbewegung Mann automatisch
//-------------------------------------------------------------------------------
void KopfservoMann()
{
  if (Automatik == HIGH)
  {
    VZeitKbw=millis()-StartZeitZufall;//Vergleichszeit für die Kopfbewegung setzten
    if (VZeitKbw>zufallzeit)//Zeitabfrage: ist es zeit neue Bewegungsparameter zu setzen?
    {
      zufallwinkel = random(179);//Zufallswinkel für die Blickrichtung
      zufallzeit = random(500,5000);//erzeugt eine zufällige Zeit zwischen einer halben und 5 sec. (Ruhezeit zwischen den Bewegungen)
      zufallgeschw = random(0,10);//legt die Bewegungsgeschwindigkeit fest
      StartZeitZufall=millis();//Legt die Startzeit neu
    }
   verz1=millis()-Start1;
   KopfMannWinkel=KopfMann.read();
   if (KopfMannWinkel>zufallwinkel)
   {
     if (verz1>zufallgeschw)
     {
        KopfMannWinkel--;
        KopfMann.write(KopfMannWinkel);//Servo Kopf bewegen
        Start1=millis();
     }
   }
   if (KopfMannWinkel<zufallwinkel)
   {
     if (verz1>zufallgeschw)
     {
        KopfMannWinkel++;
        KopfMann.write(KopfMannWinkel);//Servo Kopf bewegen
        Start1=millis();
     }
   }
  }
  else
  {
    rcSignal5=map(rcSignal5,25,195,0,178);//Empfängersignal auf Servo umrechnen
    KopfMann.write(rcSignal5);//Servo Kopf bewegen
  }
}


//-------------------------------------------------------------------------------
//      06 Funktion Motorluke-oeffnen
//-------------------------------------------------------------------------------
void Motorlukeoeffnen()
{
  lukewinkel=Luke.read();//Winkel des Servo auslesen
  if (lukewinkel>2 && lukewinkel<179) //wenn der Winkel zwichen 3° und 179 ist...
  {
    lukewinkel++;//erhöht den winkelwert des Servos um 1 zum öffnen
    Luke.write(lukewinkel);//Servo Motorluke öffnen
  }
}

//-------------------------------------------------------------------------------
//      07 Funktion Motorluke-schliessen
//-------------------------------------------------------------------------------
void Motorlukeschliessen()
{
lukewinkel=Luke.read();//Winkel des Servo auslesen
if (lukewinkel>3) //wenn der Winkel > 3° ist...
{
   lukewinkel--;//erhöht den winkelwert des Servos um 1 zum öffnen
   Luke.write(lukewinkel);//Servo Motorluke schliessen
}
}
//--------------------------------------------------------------------------------------
// 08 Funktion FailSave Kanal 2 wird eigentlich nicht gebraucht sieht aber wichtig aus
//--------------------------------------------------------------------------------------
void failSave()
{
//Blinksignal des Scheinwerfer zur Erkennung das ein Fehler mit dem Empfänger vorliegt
  for (int i=0; i<5; i++)
  {
    digitalWrite(AusgabePin[0],HIGH);
    delay(100);
    digitalWrite(AusgabePin[0],LOW);
    delay(100);
  }
}

Es hat gefunzt.Big Grin

Kommentare sollten ausreichend vorhanden sein und wenn etwas nicht klar ist weis ich es sicher auch nicht.Sleepy

Schöne Grüße aus Harrislee
Sven

Nichts auf der Welt ist unnütz, es kann im schlimmsten Fall immer noch als schlechtes Beispiel dienen.
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.05.2014, 21:41
Beitrag #3
RE: Modellschiffchen mit einem Arduino Leben einhauchen
Guten Abend liebe Gemeinde,
Ich habe mir heute überlegt (nachdem ich Gestern mal wieder ein Akku leergespielt habe) ein, besser zwei Spannungsmesser zur Akkuüberwachung einzubauen. Das habe ich mir so gedacht: Einen Spannungsteiler mit zwei Wiederständen so ausrichten, das eine Spannung von ca.4.5v bei voll geladenem Akku ankommt. Dies kann an einem Analogen Eingang gemessen werden und die Abweichung lässt auf den Ladezustand des Akku schliessen. Wenn der Akku nun leer ist. Soll die Beleuchtung des Modell Blinken. Da ich zwei verschiedene Spannungen habe, brauche ich auch zwei überwachungen un damit zwei Blinkfrequenzen.

Gruß Sven

Nichts auf der Welt ist unnütz, es kann im schlimmsten Fall immer noch als schlechtes Beispiel dienen.
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.05.2014, 19:44
Beitrag #4
RE: Modellschiffchen mit einem Arduino Leben einhauchen
Guten Abend,Cool
hab mir heute die besagte Spannungsüberwachung in mein Modell und somit auch in den Ardu gepflanzt. Funzt großartig, ich hab gleich ein Akku leergsaugt. TongueTongue

Ich werde Euch in den nächsten Tagen mal ein kleines Video von dem Projekt einstellen.

Gruß Sven

Nichts auf der Welt ist unnütz, es kann im schlimmsten Fall immer noch als schlechtes Beispiel dienen.
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.05.2014, 12:21 (Dieser Beitrag wurde zuletzt bearbeitet: 19.05.2014 12:22 von Manni.)
Beitrag #5
RE: Modellschiffchen mit einem Arduino Leben einhauchen
Hallo,
du hast da echt ein Super Projekt am laufen.
Ich bin in der Richtung noch Anfänger und könnte ein paar Tipps gebrauchen.
Habe mir aus verschiedenen Sketch`s eins für die Akkuüberwachung zusammengebastelt.
Nun meine Frage, wie kann ich am einfachsten den Code bei mir einbauen, um auch über LED zu kennen geben das einer der Akkus fast leer ist (gelbe LED)
und wenn er leer ist ne rote LED blinkt.
Hier mein Code und ein Bild

Code:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// Anzahl der analogen Messungen pro Kanal
#define NUM_SAMPLES 10
// Spannungsteiler Kalibrierungswerte
#define DIV_1    10.800
#define DIV_2    10.982
#define DIV_3    11.088

// ACC-Referenzspannung / Eichwert
#define V_REF    5.030

LiquidCrystal_I2C lcd(0x3F,20,4);

int sum[4] = {0};                // sums of samples taken
unsigned char sample_count = 0;  // current sample number
float voltage[3] = {0.0};        // calculated voltages
char l_cnt = 0;                  // used in 'for' loops

void setup()
{
    lcd.init();
    lcd.setBacklight(HIGH);
}

void loop()
{
    // take a number of analog samples and add them up
    while (sample_count < NUM_SAMPLES) {
        // sample each channel A1 to A3
        for (l_cnt = 0; l_cnt < 3; l_cnt++) {
            sum[l_cnt] += analogRead(A1 + l_cnt);
        }
        sample_count++;
        delay(10);
    }
    // calculate the voltage for each channel
    for (l_cnt = 0; l_cnt < 3; l_cnt++) {
        voltage[l_cnt] = ((float)sum[l_cnt] / (float)NUM_SAMPLES * V_REF) / 1024.0;
    }
    // display voltages on LCD
    // each voltage is multiplied by the resistor network
    // division factor to calculate the actual voltage
    // voltage 1 - A (pin A1)
    lcd.setCursor(0, 0);
    lcd.print("Empfaenger ");
    lcd.print(voltage[0] * DIV_1, 1);
    lcd.print("V ");
    // voltage 2 - B (pin A2)
    lcd.setCursor(0, 1);
    lcd.print("Antrieb    ");
    lcd.print(voltage[1] * DIV_2, 1);
    lcd.print("V ");
    // voltge 3 - C (pin A3)
    lcd.setCursor(0, 2);
    lcd.print("Funktionen ");
    lcd.print(voltage[2] * DIV_3, 1);
    lcd.print("V ");
    //
    // reset count and sums
    sample_count = 0;
    for (l_cnt = 0; l_cnt < 3; l_cnt++) {
        sum[l_cnt] = 0;
    }
}
   
Vielen dank im voraus
Grus
Manni
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.05.2014, 19:46
Beitrag #6
RE: Modellschiffchen mit einem Arduino Leben einhauchen
Hallo Manni,
anfänger bin ich in der hinsicht auch. Habe vor ca. 2 Monaten mit dieser Sucht begonnen. Vielleicht kennt einer von Euch ne gute Therapie um von den Ardus los zu kommen? :-)

Zuerst solltest Du dann die LEDs anschliessen und im Programm natürlich mit Variablen einbinden.
Als nächstes musst Du deinen Schwellenwert, an dem die LEDs leuchten, oder blinken, sollen bestimmen.
In der Loop kannst Du dann mit einer If-Abfrage die LEDs Schalten.
Damit die Überwachungs-LEDs nicht bei jeder Spannungsschwankung umspringt, solltest Du die LEDs nur schalten, wenn die Spannung eine gewisse Zeit unter dem Schwellenwert ist. Noch ein kleiner Tip: es ist immer eine gute Idee bei solchen Projekten auf Delay beim Blinken zu verzichten. Wenn die millis() Funktion genutzt wird bremst man seinen Ardu nicht so aus.

Ich hoffe ich konnte Dir etwas weiter helfen. Solltest Du weitere Hilfestellung benötigen melde Dich ruhig. Sollte ich in der Lage sein Dir zu helfen, werde ich es auch sicher machen.

Gruß Sven

Nichts auf der Welt ist unnütz, es kann im schlimmsten Fall immer noch als schlechtes Beispiel dienen.
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.05.2014, 08:46
Beitrag #7
RE: Modellschiffchen mit einem Arduino Leben einhauchen
Vielen Dank erstmal, werde es mal versuchen....
Habe aber nochmal eine Frage, vielleicht kannst du mir da auch helfen.
Ich habe eine Futaba F14 mit ein 8 Kanal Switch Modul.
Kann ich mit den 8 Schaltern vom Switch Modul über den Empfänger auch aufs Arduino zugreifen?

Gruß
Manni
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.05.2014, 21:34
Beitrag #8
RE: Modellschiffchen mit einem Arduino Leben einhauchen
Hallo Manni,
sicher gibt es da Mittel und Wege. Schaltet dein Switch den Minus- oder den Pluspol?
Welche Spannung und welche Last (Ampere) sollen angehängt sein? Möchtest Du deinen Switch um weitere Kanäle erweitern?
Was möchtest Du mit dem Ardu machen wenn der Empfänger angeschlossen ist?

Da fällt mir grad... in diesem Forum hat ein User (Offshorer) ähnliches gefragt: http://www.rc-modellbau-schiffe.de/wbb2/...r=0&page=6

Vielleicht hilft es Dir weiter.
Gruß Sven

Nichts auf der Welt ist unnütz, es kann im schlimmsten Fall immer noch als schlechtes Beispiel dienen.
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Ardunio Anfänger mit vielen Fragen zu einem Design Projekt (mit Bildern) farbexot 0 1.547 01.08.2015 13:03
Letzter Beitrag: farbexot
  Positionsleuchten an einem Modellflugzeug benötige Hilfe thermikflieger 6 1.724 12.07.2015 09:28
Letzter Beitrag: thermikflieger
  Aus einem schlechten Signal ein gutes Signal machen Gelegenheitsbastler 3 1.260 07.03.2015 14:07
Letzter Beitrag: HaWe
  Arduino Neuling: Zugeklappten Laptop mit Arduino aufwecken + Kiste aufklappen? Ikearegal 2 2.531 02.02.2014 07:59
Letzter Beitrag: Ikearegal

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste