Mein UNO spinnt.

Moin moin aus HU.
Ich bin Fernmelder und Netzwerker im Ruhestand und bin dem 3D Virus verfallen. . Dafür habe ich mir einen 3D Fotoscanner gebaut, der ja nun gesteuert werden muss.
Daher beschäftige ich mich seit Kurzem mit der Arduino UNO Programmierung. Ich möchte damit den Foto Scanner steuern. Bisher hat das auch gut geklappt. Nun möchte ich ein Poti einbinden, um die Bilderzahl pro Umdrehung einzustellen.
Ich habe auf dem UNO ein CNC Shield und steuere damit 4 Stepper Nema 17 und den Fotoapparat. Tasten für Hoch, Runter, Kippen sowie Relaissteuerung für den Auslöser, Umkehrtaste und Starttaste für den Scann mit Drehteller sind da auch dran. Nun habe ich das Problem, das die FOR Schleife für den Drehteller nicht funktioniert. Die Schleife fängt bei 13 an und spring auch in unregelmäßigen Abständen nach oben. Das Programm sieht momentan etwas zerfleddert aus, weil ich versucht habe, den Fehler ein zu grenzen. Vielleicht hat ja jemand einen Tip für mich. Der Drehteller mach eine Umdrehung bei 6400 Steps.
Hier das Programm:

#define Poti 0 
// --------------------PIN Benennung----------------------------------
int Kamera=10;                  // Kameraauslöser Servosteuerung alt Y Endstop
//int Servo2=11;                // frei                        alt Z endstop
int StepStpHoch=4;              // step Hoch                    alt step z
int StepStpDreh=3;              // Step Drehen  Dreehteller     alt step y 
int StepStpKipp=2;              // Step  Kippen                 alt step x  
int StepDirHoch=7;              // Die Hoch  Hoch               alt z Dir
int StepDirDreh=6;              // Drehteller                   alt y DIR
int StepDirKipp=5;              // Kippen                       alt x Dir
int StepAllEna=8;               // alle Stepper einschalten
int EndstopHoch=9;              // Endstop x Achse              alt Endstop X
int Start=0;                    // schwarz                       alt RX min
int TastePlusMinus=1;           // Gelb   Plus Minus             alt TX Endstop
int TasteHochtief=12;           // grün   Hoch/tief             alt enable spin
int TasteKippen=13;             // braun  Kippen                alt spin dir
//----------------------------Variablen----------------------------------
int Dauer=6400;                 //6443 Umdrehungen Teller hier 2 x 360°  12886
int Tempo=10;                    // Umdrehungsgeschwindigkeit
int Hub=1;                      //Hubgeschwindigkeit
int Kipp=3;                     //Kippgeschwindigkeit
int Klick=0;
int Servopause=1500;             //Zeit für die Einstellung des Servos auf Klick
int Klickmenge=200;             // Fotos pro Umdrehung  Wert 200 ca 30 Fotos
int Speicherpause=3500;         //Die Zeit. die ein Foto digital abgespeichert wird
int Bilder=0;


void setup()                           
{
Serial.begin(9600);
pinMode(Poti,INPUT);             
//--------------------Ausgabe/ Lesen/Schreiben--------------------------
 // Pin Funktion einstellen
 pinMode(Kamera, OUTPUT);        // rRXals digital für Kamerasteuerung
 pinMode(1, OUTPUT);             //TX als digital-   für Kamerasteuerung  
 pinMode(StepAllEna, OUTPUT);
 pinMode(StepDirHoch, OUTPUT);
 pinMode(StepStpHoch, OUTPUT); 
 pinMode(StepDirDreh, OUTPUT); 
 pinMode(StepStpDreh, OUTPUT);  
 pinMode(StepDirKipp, OUTPUT);  
 pinMode(StepStpKipp, OUTPUT); 
 pinMode(EndstopHoch,INPUT);      // Endstop für Spindel unten  alt X Endstop   
 pinMode(Start,INPUT);            // Start Knopf      alt Y Endstop
 pinMode(TastePlusMinus,INPUT);   // Plus Minus      alt Z endstop
 pinMode(TasteHochtief,INPUT);    // Hoch/tief       alt enable spin
 pinMode(TasteKippen,INPUT);      // Kippen          alt spin dir

 // Pullup Widerstände für die Tasten einschalten
 pinMode(EndstopHoch, INPUT_PULLUP);       //9 Pullup ein 
 pinMode(Start, INPUT_PULLUP);             //10 Pullup ein 
 pinMode(TastePlusMinus, INPUT_PULLUP);    //11 Pullup ein 
 pinMode(TasteHochtief,INPUT_PULLUP);      //12 Pullup ein 
 pinMode(TasteKippen, INPUT_PULLUP);       //13 Pullup ein  
 digitalWrite(StepAllEna,HIGH);            // set Ena aus 

}
//---------------------------------Programmablauf----------------------
void loop(){ 
 int schleifer = analogRead(Poti);
 Serial.print("Schleiferposition: ");
 Serial.println(schleifer)  ;
 if(schleifer < 10)
 {
 schleifer=10;
 }
 Klickmenge=Dauer/schleifer;
 
 digitalWrite(StepAllEna,LOW);                // Motoren an
if (digitalRead(Start)==LOW)           //Unterprogramm Teller drehen
{
     Drehen();
}  
if (digitalRead(TasteHochtief)==LOW){   //Unterprogramm Hoch/Tief fahren
     Heben();
}
if (digitalRead(TasteKippen)==LOW){     //Unterprogramm Kamera kippen
     Kippen();
}
}   



//-------------------------Unterprogramme-----------------------------
void Drehen()
{
 Klick=0;

for (int Durchlauf=0; Durchlauf<Dauer;Durchlauf++)               //Zeitschleife für eine Umdrehung
{
// Abbruch einleiten-------------------------------------------------- 
     if(digitalRead(TastePlusMinus)==LOW)   //Start zum Abbruch gedrückt
     {
//      int Durchlauf=(Dauer);                         // i auf Endwert setzen.
     continue;                              // Schleife verlassen
// Abbruch einleiten-------------------------------------------------- 
     }
 Serial.print("Klicks: ");
 Serial.println(Klick);
 Serial.print("Durchlauf: ");
 Serial.println(Durchlauf);
 delay(500);

//Kamera starten------------------------------------------------------------
//  if(Klick > Klickmenge)             // Zeitpunkt für Klick
// {
//   Klick=0;                          // Klickzeit neu szarten
//   digitalWrite(Kamera,HIGH);       // Kamera an
//   delay(Servopause);               // Zeit bis Servo drausen ist//
//   digitalWrite(Kamera,LOW);        // Kamera aus
//   delay(Speicherpause);

//   }
//Kamera Starten  -------------------------------------------------------------     
// Motor drehen------------------------------------------- 
   digitalWrite(StepStpDreh,HIGH);     //Takt High
   delay(10);                       //Verzögerung
   digitalWrite(StepStpDreh,LOW);      //Takt low
   delay(10); 
// Motor drehen------------------------------------------- 

  Klick=Klick+1;                  // Zeitpunkt für Klick raufrechnen
  }
}
//---------------------------heben/Senken---------------------------
   void  Heben() 
{
//digitalWrite(StepAllEna,LOW);                // Motoren an

    do   
   {
     if(digitalRead(TastePlusMinus)==LOW)   //Plus/ MinusTaste gedrückt
     {
     digitalWrite(StepDirHoch, LOW);        //Nach oben drehen
     } else 
     {
     digitalWrite(StepDirHoch, HIGH);       //Wenn Plus/Minus nicht gedrückt, 
                                            // nach unten drehen
     }
   if (digitalRead(EndstopHoch)==HIGH)       //Wenn Endstop ausgelöst
   {
    digitalWrite(StepDirHoch, LOW);          //Dann nach oben drehen
   }
   digitalWrite(StepStpHoch,HIGH);           //Takt High
   digitalWrite(StepStpHoch,LOW);            //Takt low
   } 
   while (digitalRead(TasteHochtief)==LOW);  // Ausführen, so lange 
                                             // Wie  Taste HT gedrückt ist

//digitalWrite(StepAllEna,HIGH);               // Motoren aus  

} 
//-----------------------Kippen--------------------------
void Kippen(){
//digitalWrite(StepAllEna,LOW);               // Motoren an
  do 
  {
     if (digitalRead(TastePlusMinus)==LOW) // Wenn Plus/Minus gedrückt
     {
     digitalWrite(StepDirKipp, HIGH);      //Kippen nach Plus drehen
     } 
     else 
     {
     digitalWrite(StepDirKipp, LOW);       //Sonst nach Minus drehen
     } 
   digitalWrite(StepStpKipp,HIGH);         //Takt High
   delay(Kipp);                            //Verzögerung
   digitalWrite(StepStpKipp,LOW);          //Takt LOW
   delay(Kipp);                            //Verzögerung
   }
  while (digitalRead(TasteKippen)==LOW);   //Solange Taste Kippen gedrückt ist
//digitalWrite(StepAllEna,HIGH);              // Motoren aus 

}

Setze Deinen Sketch bitte in Codetags (</>-Button oben links im Forumseditor), dann ist er von allen gut lesbar.
Potentiometer (zumindest die einfachen) haben oft schlechten Kontakt zwischen Schleifer und Widerstandsbahn. Dadurch sind sie für feinfühlige Einstellungen nicht wirklich geeignet.

Evtl. wäre ein guter Drehencoder eine bessere Lösung.

Gruß Tommy

Hi

Packe den Code bitte in Code-Tags (</>).
continue macht nicht, was Du erwartest - bzw. zumindest nicht Das, was im Kommentar steht.
Denke, Du meinst break; (verlassen der aktuellen Schleife - continue bricht NUR den aktuellen Durchlauf ab, die Schleife geht bei Durchlauf++ weiter!!)

MfG

Ja, kann ich machen. Das habe ich mir auch schon gedacht. Deswegen setze ich die Durchlauf auf auf den max Wert. Das sollte die Schleife verlassen. Aber das löst nicht mein momentanes Problem, dass der UNO falsch zählt. Der Stepper dreht nicht kontinuierlich. Wieso fängt er als ersten Wert mit 14 an, obwohl ich den mit 0 starte.

fridi:
Ja, kann ich machen.

Wenn Du damit meinst, dass Du den Sketch in „code-Tags“ fassen kannst, dann TUs BITTE AUCH!
Wenn Du etwas Anderes meinst, TUs TROTZDEM.

Gruß

Gregor

Dann muß ich mich erst einmal einlesen, was code-Tags" sind. Habe keine Ahnung. Werde mich einlesen. Danke für den Tip. Ist fürn alten Kopf nicht mehr so einfach.

fridi:
Dann muß ich mich erst einmal einlesen, was code-Tags" sind. Habe keine Ahnung. Werde mich einlesen. Danke für den Tip. Ist fürn alten Kopf nicht mehr so einfach.

Das hat Tommy dir doch schon beschrieben.
Also wo ist da noch ein Problem.

So ist dieser Sketch für viel nicht lesbar und man kann sich das nicht antun.

fridi:
Dann muß ich mich erst einmal einlesen, was code-Tags" sind. Habe keine Ahnung. Werde mich einlesen. Danke für den Tip. Ist fürn alten Kopf nicht mehr so einfach.

fridi:
Dann muß ich mich erst einmal einlesen, was code-Tags" sind. Habe keine Ahnung. Werde mich einlesen. Danke für den Tip. Ist fürn alten Kopf nicht mehr so einfach.

Klick auf "Reply". Dann hast Du oben ein paar Buttons. Einer davon (der linke) ist </>.
Der erzeugt [ code][ /code] (ohne Leerzeichen). Dazwischen setzt Du Deinen Sketch.

Gruß Tommy

So, ich hoffe, dass ich das jetzt richtig gemacht habe. Treibe mich schon seit 5 Jahren im REPRAP Forum rum und weiß, wie schwer das für Anfänger ist.

Moin moin aus HU.
Ich habe das jetzt mit einem anderen UNO ausprobiert. Da fängt die Schleife auch mit 14 an zu zählen. Die Zahl 14 erinnert mich an HEX Code. Kann es damit zusammen hängen?

Moin moin aus HU. Habe den Fehler gefunden. Hatte TX ubd RX als Eingänge genommen, weil ich das vom Mega kenne, wo die 2 mal vorhanden sind. Habe jetzt 2 analoge Ports als Eingänge genommen und jetzt gehts.

fridi:
Hatte TX ubd RX als Eingänge genommen, weil ich das vom Mega kenne, wo die 2 mal vorhanden sind.

Ein Mega hat 4 serielle Schnittstellen.

Na gut, dann eben 4. Jedenfalls mehr als eine.

Hi

int Start=0;                    // schwarz                       alt RX min]
int TastePlusMinus=1;           // Gelb   Plus Minus             alt TX Endstop

Jupp, hätte man sehen können :o (aber Ehrlich: ohne Code-Tags habe ich Das auch nur überflogen)

Mit dem Continue soll so?

MfG

PS: Pin-Definitionen sind sinnvoller als

const byte LED = 13   //  Blink-LED zur Fehlersignalisierung

angepasst nach Korrektur in #14
Vorteil: byte statt int kostet nur 1 Byte Platz (statt 2), Wertebereich 0...255 statt -32767...32768 - sollte für eine Vielzahl an µC ausreichend sein - und negative Pin-Nummern werden auch selten vergeben :wink:
Nebenbei kann der Compiler so diesen Wert 'fest codieren' (dann braucht's gar keinen Platz, zumindest nicht zusätzlich).
Bei anderen konstanten Werten hat Er außerdem die Möglichkeit zu überprüfen, ob der Typ passt - bei einem Define wird nur der eine Text durch den anderen Text ersetzt, bevor der Compiler mit Werkzeug an die Sache ran geht.

PPS: Wenn man nicht Alles kompiliert ... :wink:
(ebenfalls erst nach der Korrektur in #14 ... gg)
Edit
Code-Tag zurecht gerückt

Vielleicht eher

const byte LED = 13;   //  Blink-LED zur Fehlersignalisierung

Danke Jungs für die Hilfe. Habe echt was dazu gelernt.

Aber immer der Wichtigste Wahlspruch eines Fernmelders. Geht nicht geht nicht. Es gibt für alles eine Lösung. Man hat sie nur noch nicht gefunden.
Ich habe gerade meinen ersten Scan gemacht. Hatte heute noch den Polfilter bekommen. Nun werde ich die Fotos mal auswerten.