HIGH bei Arduino MEGA nur bei 1,6V

hallo,
mein ARduino Mega gibt trotz Deklaration der Pins als Ausgänge nur eine HIGH-Spannung von 1,6V aus. Kann mir jemand heirbei helfen woran dies liegt?

Vielen Dank,
flar2000

Warum ist dein Code geheim?
Irgendwas an dem Mega angeschlossen?

Geheim nicht aber lange

//prüfvariablen fuer beendung des vorgangs
bool finished=false;
bool finishedloeffel=false;
bool finishedarm=false;
bool finishedstiel=false;
bool drivingloeffel=true;
bool drivingarm=true;
bool drivingstiel=true;
bool drivingeverything=true;

//Winkel an den gelenken
int angleloeffel;           //je groeßer desto weiter auf ist der Loeffel
int angleloeffelmin;
int motorloeffelnew;
int motorloeffelold;

int anglearm;               //Je groeßer desto hoher ist der Arm
int anglearmmin;
int motorarmnew;
int motorarmold;

int anglestiel;             //je groeßer desto hoher ist der Stiel
int anglestielmin;
int motorstielnew;
int motorstielold;
  
//Pins am Arduino Hbrücke
char hloeffelup=5;
char hloeffeldown=4;
char harmup=10;
char harmdown=9;
char hstielup=7;
char hstieldown=6;

//Ausgangsposistion
short _loef=230;      //230
short _stiel=70;      //70
short _arm=40;        //40

//Toleranzen
char toleranz=8;
char toleranzloeffel=10;

//pointer
int i=0;

#define LENGTH 200
char incoming[LENGTH+1];

void setup() {
  //Hbruecke
  pinMode(hloeffelup,OUTPUT);
  pinMode(hloeffeldown,OUTPUT);
  pinMode(harmup,OUTPUT);
  pinMode(harmdown,OUTPUT);
  pinMode(hstielup,OUTPUT);
  pinMode(hstieldown,OUTPUT);
  
  Serial.begin(9600);

  delay(50);
  start_the_angle();
}

void loop() {
  if(Serial.available())
      {
        _loef=0;
        _arm=0;
        _stiel=0;
        i=0;  

        for (int i=0; i<LENGTH+1; i++) 
          incoming[i]=0;
      
        while(Serial.available())
        {
          char value=Serial.read();
          incoming[i] = value;
          i++;
        }
        sscanf(incoming, "%i:%i:%i", &_loef, &_stiel, &_arm);
        
        _loef+=angleloeffelmin;
        _arm+=anglearmmin;
        _stiel+=anglestielmin;
        finished=0;
      }
    
   Driving();
}
void start_the_angle(){
  if(drivingeverything){
    //Loeffeldown
    delay(10);
    motorloeffelnew=analogRead(0);
    digitalWrite(hloeffelup,LOW);        //LOW
    digitalWrite(hloeffeldown,HIGH);       //HIGH
  
    if(motorloeffelnew==motorloeffelold);
    {
      digitalWrite(hloeffelup,LOW);
      digitalWrite(hloeffeldown,LOW);
      angleloeffelmin=analogRead(0);       //als min speichern
      drivingloeffel=false;
    }  
    motorloeffelold=motorloeffelnew;
    
  
    //Armdown
    delay(10);
    motorarmnew=analogRead(2);
    digitalWrite(harmup, LOW);
    digitalWrite(harmdown, HIGH);
  
    if(motorarmnew==motorarmold)
    {
      digitalWrite(harmup, LOW);
      digitalWrite(harmdown, LOW);
      anglearmmin=analogRead(2);           //als min speichern
      drivingarm=false;
    }
    motorarmold=motorarmnew;
  
  
    //Stieldown
    delay(10);
    motorstielnew=analogRead(1);
    digitalWrite(hstielup, LOW);
    digitalWrite(hstieldown, HIGH);
  
    if(motorstielnew==motorstielold)
    {
       digitalWrite(hstielup, LOW);
       digitalWrite(hstieldown, LOW);
       anglestielmin=analogRead(1);        //als min speichern
       drivingstiel=false;
    }
    motorstielold=motorstielnew;

    if(drivingloeffel==false && drivingstiel==false && drivingarm==false)
      drivingeverything=false;
  }
  _loef=230; //Ausgangsposition
  _stiel=70;    //Ausgangsposiiton
  _arm=40;      //Ausgangspoiton
  //Driving();
}
void Driving(){      
  while(!finished)
  {    
    anglearm=analogRead(2);
    anglestiel=analogRead(1);
    angleloeffel=analogRead(0);
/*
    angleloeffel=map(angleloeffel,0,1023,0,270);
    anglestiel=map(anglestiel,0,1023,0,270);
    anglearm=map(anglearm,0,1023,0,270);
    */
    anglearm=(anglearm*1023)/270;
    anglestiel=(anglestiel*1023)/270;
    angleloeffel=(angleloeffel*1023)/270;
    
    //LOEFFEL    
    if(angleloeffel<(_loef-toleranzloeffel))   //abfragen ob die Werte kleiner sind und wenn, dann den Motor in Richtung "größer" schalten
    {
      analogWrite(hloeffelup,191);
      digitalWrite(hloeffeldown,LOW);
      if(angleloeffel<(_loef-20))
      {
        analogWrite(hloeffelup,80);
        digitalWrite(hloeffeldown,LOW);
      }
      finishedloeffel=false;
    }
    if(angleloeffel>(_loef+toleranzloeffel)) //abfragen ob der Winkel kleiner ist und wenn ja, dann den Motor in Richtung "kleiner" schalten
    {
      digitalWrite(hloeffelup,LOW);
      analogWrite(hloeffeldown,191);
      if(angleloeffel>(_loef+20))
      {
        analogWrite(hloeffeldown,80);
        digitalWrite(hloeffelup,LOW);
      }
      finishedloeffel=false;
    }
    if(angleloeffel>(_loef-toleranzloeffel)&&angleloeffel<(_loef+toleranzloeffel))  //wenn der Winkel im Toleranzbereich liegt, dann die Relais ausschalten
    {                                                                             //und melden, dass der Winkel am Löffel eingestellt ist
      digitalWrite(hloeffelup,LOW);
      digitalWrite(hloeffeldown,LOW);
      finishedloeffel=true;
    }

    //ARM
    if(anglearm<(_arm-toleranz))
    {
      analogWrite(harmup, 191);
      digitalWrite(harmdown, LOW);
      if(anglearm<(_arm-20))
      {
        analogWrite(harmup, 80);
        digitalWrite(harmdown, LOW);
      }
      finishedarm=false;
    }
    if(anglearm>(_arm+toleranz))
    {
      digitalWrite(harmup,LOW);
      analogWrite(harmdown, 191);
      if(anglearm>(_arm+20))
      {
        analogWrite(harmdown, 80);
        digitalWrite(harmup, LOW);
      }
      finishedarm=false;
    }
    if(anglearm>(_arm-toleranz)&&anglearm<(_arm+toleranz))
    {
      digitalWrite(harmup,LOW);
      digitalWrite(harmdown, LOW);
      finishedarm=true;
    }

    //Stiel
     if(anglestiel<(_stiel-toleranz))
    {
      analogWrite(hstielup, 191);
      digitalWrite(hstieldown, LOW);
      if(anglestiel<(_stiel-20))
      {
         analogWrite(hstielup, 80);
         digitalWrite(hstieldown, LOW);
      }
      finishedstiel=false;
    }
    if(anglestiel>(_stiel+toleranz))
    {
      digitalWrite(hstielup,LOW);
      analogWrite(hstieldown,191);
      if(anglestiel>(_stiel+20))
      {
         analogWrite(hstieldown, 80);
         digitalWrite(hstielup, LOW);
      }
      finishedstiel=false;
    }
    if(anglestiel>(_stiel-toleranz)&&anglestiel<(_stiel+toleranz))
    {
      digitalWrite(hstielup,LOW);
      digitalWrite(hstieldown, LOW);
      finishedstiel=true;
    }
    
    
   
    

    //Vorgang beenden
    if(finishedarm&&finishedloeffel&&finishedstiel)
    {
      finished=true;
      Serial.println("finished");   //An C# schreiben dass fertig
    }
    
  }
}

Hallo,

ich würde mal einen Ozzi ranhängen ...... da scheint dein Code instabil zu sein. Oder die Nachfolgende Schaltung braucht mehr wie 40 mA. Mach doch mal ein böses Delay(100) ans ende der Lopp. Und schau mal was dann passiert.

Gruss Temucin alias TFT

Mehr als 40mA
Ich schalte damit 2 H-Brücken und versorge drei Potentiometer für meine analogRead Funktion.... ist das zu Viel?

Aber die viel wichtigere Information ist das ich diese 1,6V auch messe wenn nichts angehängt ist also einfach nur Steckleisten eingesteckts sind die mit meinem Multimeter verbunden sind
Bzw. in welchem Sinne meinst du das mein Code in stabil ist?

Auch auf den Pins,die du als Ausgang definiert hast ?
Mit welcher Spannung an welchem Anschluss betreibst du den Mega ?

Hi,

ich würde mal ein standard sketch benuzen und eine LED über 220 Ohm anschliessen, und nur den Ausgang auf 1 sezt, und dann noch mal messen, Gegenprobe mit 0 noch mal messen. Selbst wenn Du nix zu messen hast kannst Du das Ergebniss einfach an der LED sehen. Eventuell das Ergebniss mit einem anderen Asgang vergleichen.

damit schliesst Du dann das Thema Software aus. Wenn er auch nur 1,6 V hat ist er tot. Wenn nicht liegt es an der Software und irgendwo wird der Ausgang ein und aus geschaltete.

MEga wird ganz normal über USB mit 5V betrieben.
Das Problem liegt eben nur bei diesem Projekt vor also die Pins sind nicht kaputt

Ich habe versucht, mich in deinen Sketch einzulesen.....ohne jeglichen Kommentar nicht möglich.
Da wird der Fehler versteckt sein.

Du solltest den einfach mal reduzieren und langsam wieder aufbauen, um den Fehler zu finden.

analogWrite(hloeffelup,80);

Das ist jetzt nicht zufällig ein Problem-Pin?

Hi,

um welche Ausgänge geht es denn ? Alle nur einer oder was ? Hab ich das überlesen :slight_smile:

Nur eine kleine Anmerkung:

  if(motorloeffelnew==motorloeffelold);
    {
      digitalWrite(hloeffelup,LOW);
      digitalWrite(hloeffeldown,LOW);
      angleloeffelmin=analogRead(0);       //als min speichern
      drivingloeffel=false;
    }

Der Codeblock hinter der Abfrage wird niemals immer ausgeführt, wegen dem Abschließenden ; in der Zeile mit if.
Ich glaube nicht, dass das so sein soll...

Edit: es ist natürlich "immer" - Danke Combie für die Berichtigung (#14)

Hi noch mal ich,

hab gerade versucht mich in Dein Programm einzulesen, sorry ist mir nicht gelungen.

Was soll das Programm eigentlich machen ? so wie ich das verstanden habe wird da was verfahren. Ich würde die einzelnen Bewegungen in logische Schritte aufteilen. Dann kanst Du das in einer Ablaufsteuerung (Schrittkette) unterbringen. In jedem Schritt erfolgt nur eine Bewegung oder mehere die dann aber gleichzeitig stattfinden sollen. Mit Wartezeiten arbeitete man dann wenn es keine Rückmeldung gibt. Wenn alle Bedingungen eines Schrittes erledigt sind gehts in den nächsten Schritt. Doof wirds nur dann wenn es aus irgendeinem Grund in Schritt 4 plötzlich in Schritt 8 weitergehen soll, also vermeiden.

Ich vermute irgendwo wird bei deinen ganzen IF abfragen mal was zuück gesetzt ohne das Du das eigendlich willst. Um das rauszubekommen finde ich die Lösung mit den delay an verschieden stellen gut, da kannst Du das dann eventuell finden.

Um Schrittketten zu organisieren gibt es mehrere Möglichkeiten eine findest Du unter einem Beitrag von mir zum Thema Servomotoren.

Heinz

Der Codeblock hinter der Abfrage wird niemals ausgeführt, wegen dem Abschließenden ; in der Zeile mit if.

Das stimmt nicht!
Er wird jedes mal ausgeführt, wegen dem abschließendem ;

Ich glaube nicht, dass das so sein soll...

Da wiederum, möchte ich dir zustimmen.

Du hast natürlich recht! :slight_smile:

Naja was mein Code eigentlich macht ist nicht einfach erklärt.
Ein Bagger wird über zwei H-Brücken nach einer Benutzeroberfläche gesteuert und muss bei jedem Arbeits Auftrag die Minima anfahren (start_the_angle).

Hast du das mit dem Semikolon verstanden?
Ist das Verhalten beabsichtigt, was dadurch erzeugt wird?

Naja was mein Code eigentlich macht ist nicht einfach erklärt.
Ein Bagger wird über zwei H-Brücken nach einer Benutzeroberfläche gesteuert und muss bei jedem Arbeits Auftrag die Minima anfahren (start_the_angle).

Das Problem ist aber einfach erklärt: Ein (oder alle ? ) Ausgangspin zeigt nur 1.6V

flar2000:
Das Problem liegt eben nur bei diesem Projekt vor also die Pins sind nicht kaputt

analogWrite(hloeffelup,80);

Damit erzeugst du sowas ähnliches wie 1.6V am Pin hloeffelup, wenn du mit einem Multimeter nachmisst.
Wofür ist das analogWrite gut, du willst vermutlich langsam den Löffel bewegen?