Go Down

Topic: Projekt funktioniert nicht, bitte um Hilfe bei Akkuversorugung des Arduinos!! (Read 2900 times) previous topic - next topic

sautd

Feb 15, 2015, 04:46 pm Last Edit: Feb 15, 2015, 11:58 pm by uwefed Reason: add CODE TAGs
Liebe Forumgemeinde,

ich benutze einen Arduino Uno, ein Motorshield und ein Prototype Shield. Wenn ich alles über USB und ein Netzteil an das Motorshield anschließe funktioniert das Projekt wunderbar  :D , aber es soll ein LKW mit Abstandssensoren werden, und wenn ich dann 12V auf das Motorshield gebe und von diesen 12V auch 7,1V für den Arduino Uno erzeuge funktionieren die Sensoren nicht mehr, sprich sie geben immer 0cm aus. Bin ratlos, hat jemand von euch eine Idee oder n Lösungsvorschlag, hier ist noch der Code und ein gezeichneter Schaltplan
Code: [Select]

#include <LiquidCrystal.h>             // Datei für das Display einbinden

LiquidCrystal lcd(9,8,7,6,5,4);        // Initialisierung der Bibliothek mit den Pin- Nummern

const int signalgeber = 2;

const int motor_eins_richtung   = 12;  // Bestimmung der Richtung von Motor eins am Pin 13
const int motor_eins_geschw     = 3;   // Bestimmung der GEschwindigkeit von Motor eins durch Pulsweitenmodulation an Pin 3

const int motor_zwei_richtung   = 13;  // Bestimmung der Richtung von Motor zwei an Pin 12
const int motor_zwei_geschw     = 11;  // Bestimmung der GEschwindigkeit von Motor zwei durch Pulsweitenmodulation an Pin 11

const int trig                  = 10;   // Sendesignal Sensor eins an Pin 1

const int echo_sensor_eins      = 14;   // Empfangssignal Sensor eins an Pin 0
const int echo_sensor_zwei      = 15;   // Empfangssignal Sensor zwei an Pin 2

const int taster_vorwaerts      = 16;  // taster_vorwaerts --> Tastersimulation für die Richtung vorwaerts auf Analog IN A0
const int taster_rueckwaerts    = 17;  // taster_rueckwaerts --> Tastersimulation für die Richtung rueckwaerts auf Analog IN A1

unsigned int wert_taster_vorwaerts    = LOW;   // Variable für das Signal von taster_vorwaerts und auf 0 setzen
unsigned int wert_taster_rueckwaerts  = LOW;   // Variable für das Signal von taster_rueckwaerts und auf 0 setzen

unsigned int vorwaerts                = LOW;   // Variable mit Name richtung_vorwaerts und auf 0 setzen
unsigned int rueckwaerts              = LOW;   // Variable mit Name richtung_rueckwaerts und auf 0 setzen

unsigned int laenge1                   = LOW;   // Für Umrechnung in die Laenge des Sensor Signals und auf 0 setzen
unsigned int laenge2                   = LOW;

unsigned int val_motor_eins           = LOW;   // Übergabeert für Pulsweitenmodulation an Motor eins und auf 0 setzen
unsigned int val_motor_zwei           = LOW;   // Übergabeert für Pulsweitenmodulation an Motor zwei und auf 0 setzen


void messung_sensor_zwei ()    // Unterprogramm für die Messung und Auswertung des Sensor eins

{
 digitalWrite (trig, LOW);        // trig_sensor_zwei Pin auf LOW setzen
 delayMicroseconds (2);                       // Verzögerung um zwei Millisekunden
 digitalWrite(trig, HIGH);        // trig_sensor_zwei Pin auf HIGH setzen
 delayMicroseconds (5);                       // Verzögerung um fünf Millisekunden
 digitalWrite (trig, LOW);        // trig_sensor_zwei Pin wieder auf LOW setzen
 
 laenge2 = pulseIn (echo_sensor_zwei, HIGH)*0.017;   // Signal aus echo_sensor_zwei einlesen ind in der Variable laenge speichern und in cm umrechnen
 
 lcd.clear();                  // start with a blank screen
 lcd.setCursor(0,0);           // set cursor to column 0, row 0 (the first row)
 lcd.print("<----- vorwaerts");    // change this text to whatever you like. keep it clean.
 lcd.setCursor(0,1);           // set cursor to column 0, row 1
 lcd.print(laenge1);
 lcd.print(" cm");
 
 Serial.print(laenge1);
 Serial.println(" cm Sensor 2");
}

void messung_sensor()
{  
 digitalWrite (trig, LOW);        // trig_sensor_eins Pin auf LOW setzen
 delayMicroseconds (2);                       // Verzögerung um zwei Millisekunden
 digitalWrite(trig, HIGH);        // trig_sensor_eins Pin auf HIGH setzen
 delayMicroseconds (5);                       // Verzögerung um fünf Millisekunden
 digitalWrite (trig, LOW);        // trig_sensor_eins Pin wieder auf LOW setzen
 
 laenge1 = pulseIn (echo_sensor_eins, HIGH)*0.017;   // Signal aus echo_sensor_eins einlesen ind in der Variable laenge speichern und in cm umrechnen
 
 lcd.clear();                  // start with a blank screen
 lcd.setCursor(0,0);           // set cursor to column 0, row 0 (the first row)
 lcd.print("rueckwaerts --->");    // change this text to whatever you like. keep it clean.
 lcd.setCursor(0,1);           // set cursor to column 0, row 1
 lcd.print(laenge2);
 lcd.print(" cm");
 
 Serial.print(laenge2);
 Serial.println(" cm Sensor 2");
}

void ausweichen ()
{
 Serial.println("ausweichen");
 
 val_motor_eins = 0;// Wert für PWM Motor eins --> 0 heißt STOPP!!
 analogWrite (motor_eins_geschw, val_motor_eins);
               
 val_motor_zwei = 0;// Wert für PWM Motor zwei --> 0 heißt STOPP!!
 analogWrite (motor_zwei_geschw, val_motor_zwei);
               
 digitalWrite (motor_eins_richtung, HIGH);
 val_motor_eins = 200;// Wert für PWM Motor eins
 analogWrite (motor_eins_geschw, val_motor_eins);
               
 digitalWrite (motor_zwei_richtung, LOW);
 val_motor_zwei = 200;// Wert für PWM Motor zwei
 analogWrite (motor_zwei_geschw, val_motor_zwei);
 
 digitalWrite (signalgeber, HIGH);
 delay (500);
 digitalWrite (signalgeber, LOW);
 delay (500);
 digitalWrite (signalgeber, HIGH);
 delay (500);
 digitalWrite (signalgeber, LOW);
 delay (500);
 digitalWrite (signalgeber, HIGH);
 delay (500);
 digitalWrite (signalgeber, LOW);
                         
 val_motor_eins = 0;// Wert für PWM Motor eins --> 0 heißt STOPP!!
 analogWrite (motor_eins_geschw, val_motor_eins);
               
 val_motor_zwei = 0;// Wert für PWM Motor zwei --> 0 heißt STOPP!!
 analogWrite (motor_zwei_geschw, val_motor_zwei);
}


void loop ()
{

wert_taster_vorwaerts   = digitalRead (taster_vorwaerts);
wert_taster_rueckwaerts = digitalRead (taster_rueckwaerts);
 
 if (wert_taster_vorwaerts == HIGH || wert_taster_rueckwaerts == HIGH)    
     {
        if (wert_taster_vorwaerts == HIGH)
       {
         vorwaerts = HIGH;
         rueckwaerts = LOW;
         
         Serial.println("vorwaerts");
       }
       if (wert_taster_rueckwaerts == HIGH)
       {
         rueckwaerts = HIGH;
         vorwaerts = LOW;
         
         Serial.println("rueckwaerts");
       }

        if (vorwaerts == HIGH) // D.h. wenn der Taster für Richtung vorwaerts gedrückt wurde
          {
            messung_sensor ();    // Wert aus Sensor eins ermitteln
           
            if(laenge1 >= 20)
              {
               val_motor_eins = 200; // Wert für PWM Motor eins übergeben
               analogWrite (motor_eins_geschw, val_motor_eins); // PWM- Signal an Motor eins übergeben
               digitalWrite (motor_eins_richtung, HIGH);  // Motor eins in HIGH Richtung drehen d.h. vorwaerts
               
               val_motor_zwei = 200; // Wert für PWM Motor zwei übergeben
               analogWrite (motor_zwei_geschw, val_motor_zwei); // PWM- Signal an Motor zwei übergeben
               digitalWrite (motor_zwei_richtung, HIGH);  // Motor zwei in High Richtung drehen d.h. vorwaerts
               
               delay (2000);  // Verzögerung von 2 Sekunden
              }
             
             else
             {
               ausweichen ();
             }
          }
       
       
         if (rueckwaerts == HIGH)                         // Wenn nicht dann
          {
           messung_sensor_zwei ();     // Wert aus Sensor zwei ermitteln
           
           if (laenge2 >= 20)
             {
               val_motor_eins = 200; // Wert für PWM Motor eins übergeben
               analogWrite (motor_eins_geschw, val_motor_eins);  // PWM- Signal an Motor eins übergeben
               digitalWrite (motor_eins_richtung, LOW); // Motor eins in LOW Richtung drehen d.h. rueckwaerts
               
               val_motor_zwei = 200;// Wert für PWM Motor zwei übergeben
               analogWrite (motor_zwei_geschw, val_motor_zwei); // PWM- Signal an Motor zwei übergeben
               digitalWrite (motor_zwei_richtung, LOW); // Motor zwei in LOW Richtung drehen d.h. rueckwaerts
               
               delay (2000);  // Verzögerung von 2 Sekunden
             }
            else
            {
              ausweichen ();
            }
               
          }
      }
             
  }  

sschultewolter

 :-X Warum muss man einen zweiten Thread aufmachen zu dem gleichen Thema?

http://forum.arduino.cc/index.php?topic=300294.msg2090380#msg2090380

Im "Schaltplan" befinden sich viele Ungereimheiten. Was sind das für C's am 7805. Welcher Strom fließt am Abgang des 7805?
Wie verhält sich die Spannung an den Messpunkten? Sktech gehört in Code-Tags
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

Serenifly

Wieso 7,1V? Du kannst mit 5V direkt auf den 5V Pin solange nicht gleichzeitig USB drinsteckt.

Besser als der 7805 wäre ein Stepdown-Wandler, d.h. ein Schaltregler, aber es geht im Prinzip solange mit nicht allzuviel Strom über 5V zieht.

mgcss

wozu 7,1 Volt? Wenn Du schon einen 7805 verwendest, kannst Du die 5 Volt auch direkt in den UNO speisen (logischer Weise an den +5V Pin). Du kannst auf den ganzen Kram aber auch verzichten, da der UNO über die Buchse für die Spannungsversorgung problemlos mit 12 V versorgt werden kann. Er hat dann intern selbst noch einen Spannungsregler drauf, mit dem er dann seine Versorgungsspannung von 5 Volt macht.

Die angegebenen 7 Volt kommen nur deshalb zustande, weil der interne Spannungsregler einen Offset von mindestens 2 Volt braucht um die 5 Volt sicher erzeugen zu können. Die Spezifikation lässt aber problemlos auch eine Einspeisung von 12 Volt zu.

Ich würde den UNO direkt mit 12V versorgen. So wie mgcss schon schrieb, dann sollten Sensoren auch funktionieren.

sautd

Die c´s am Spannungsregler sind für die Brummspannung und zur Rauschunterdrückung ;), ja aber ich habe die 7,1 Volt an der Klemme neben dem USB eingesteckt, damit der Arduino direkt 5Volt drauß machen kann :D vllt sollte ich das mal probieren, oder ihn direkt mit 12V betreiben :D, hast sonst noch jemand ne Idee, an was es liegen könnte??

sschultewolter

Das mit den C's hab ich geschrieben, weil dort keine Werte dran stehen und man nicht erkennen kann, ob es sich um Elkos, Tantals oder Kerkos handelt.
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

Theseus

Die c´s am Spannungsregler sind für die Brummspannung und zur Rauschunterdrückung ;), ja aber ich habe die 7,1 Volt an der Klemme neben dem USB eingesteckt, damit der Arduino direkt 5Volt drauß machen kann :D vllt sollte ich das mal probieren, oder ihn direkt mit 12V betreiben :D, hast sonst noch jemand ne Idee, an was es liegen könnte??
Hast du die 7,1V nachgemessen? Sind sie wirklich stabil?
Hast du auch mal die Versorgungsspannung der Sensoren nachgemessen?
Treten die Probleme immer auf oder nur wenn die Motoren laufen?

uwefed

Das Arduino-Motorshield verwendert A0 und A1 für die Messung des Motorstroms.

Grüße Uwe

sautd

@uwefed:

Ich habe aber alle Brücken auf dem Motorshield durchgetrennt, dann müsste das doch funktionieren oder nicht?

Im allgemeinen dachte ich mit den 7,1 Volt, dass dadurch die Verluste im Arduino gering sind ;) die 7,1 Volt sind immer konstant da, da stimmt schon... Ja nachgemessen habe ich alles das stimt, die Probleme kommen, wenn ich die Motoren einschalte, aber nur, wenn die Motoren und der Arduino über den AKku betrieben werden...

Theseus

Im allgemeinen dachte ich mit den 7,1 Volt, dass dadurch die Verluste im Arduino gering sind ;) die 7,1 Volt sind immer konstant da, da stimmt schon... Ja nachgemessen habe ich alles das stimt, die Probleme kommen, wenn ich die Motoren einschalte, aber nur, wenn die Motoren und der Arduino über den AKku betrieben werden...
Dann dürften das Störungen durch die Motoren sein. Du könntest versuchen den 47µF Elko zu vergrößeren. Auch den Elko nach dem 7805 könntest du etwas vergrößern. Leider hast du da keinen Wert angegeben.

Verlaufen evtl. Sensor und Motorleitungen parallel, so dass Störungen induziert werden können? Sind die Motoren entstört? Ansonsten könntest du da noch Entstörkondensatoren nachrüsten (http://www.bnhof.de/~ho1645/entstoer.htm).

Go Up