PanoBot - Projektvorstellung und DREI Anfänger Fragen zum Code.

PanoBot - Projektvorstellung und DREI Anfänger Fragen zum Code.

Hallo, ich bräuchte ein bisschen Hilfe, ich hab einen denke wirklich schönen „Panorama Bot“ gebaut aber bin absoluter Anfänger was Anduino und Programmieren angeht. :frowning:

Ich hab mein bestes als Anfänger getan aber komme nicht mehr weiter…

Kommen wir aber erstmal zur Projektvorstellung Hier:

Alle 40 Bilder im Album/Galerie anschauen:

Mein Code mit „DREI FRAGEN“ Bitte Hier Downloaden:

Der Code ist leider länger als 9500 zeichen und ich kann ihn deswegen nicht normal Posten :frowning:

Ich benutz eigentlich nie nen Filehoster aber heute ist es das einzige was mir einfällt
(code aufteilen wäre blöd)

Den ersten Filehoster den Googgle auspuckte= www.file-upload.net

Also unter:

Datum:23.03.2014
Dateigröße:0.04 MB
Downloads:1

Downloadlink: panobot_final_einfachste_VIER_Buttons_version_0_0_1_ino.ino

„der kleiste Download Button dort ist der richtige, alles andere ist werbung, etc...“

Ahhh, hab dass erst gerade am Ende gefunden :slight_smile: additional options und dann Attach File........und ich mach hier den Affen.... LOL

Ich könnte jetzt sehr viel zum Code und warum dass alles so ist schreiben...der Code ist aufs einfachste zusammengewürfelt aus einzelnen Tutorials durch viele try&errors entstanden, es ist das einzige funktionierende was ich soweit hinbekommen habe. Für weiteres hab ich denke noch nicht genug andere Codes gesehen und noch nicht genug gelernt. Es gibt Tutorials von denen ich dachte sie würden mich weiterbringen aber ich konnte es als Anfänger nicht auf meinen Code übertragen.

ich denke es ist alles selbsterklärend genug, ich hab viele Bilder gemacht (die sich übrigens weit Zoomen lassen) und alles im Code kommentiert etc. Und die Drei Fragen stehen übrigens ziemlich am Anfang von „void Loop“.

Ich hoffe einfach mal dass ihr alles versteht und Helfen könnt.

Diese Drei Fragen stehen im Code:

// Frage 01: ich wollte hier noch ne servo bewegung am Anfang aber es wiederholt sich alles laufend... Der Anfang sollte nur einmal beim Anschalten und sich nicht laufend Wiederholen. wie kann ich das machen???

// Frage 02:
// Es ist gerade so das ich viele "Buttons" hätte (buttonPin 01-05), wie kann ich machen das ich wenige habe und z.b bei Button doppel drücken, drei mal drücken, oder 5sek gedrückt halten etc. meine ereignisse statfinden, die da wären: ………………im Code schauen…..

//Frage03:
// Wie kann ich machen das nicht dannach sondern während die "(untere drehscheibe) auf 30 grad" gleichzeitig der Servo "(seitliche drehscheibe) von -45 zu 90 grad" geht ???

panobot_final_einfachste_VIER_Buttons_version_0_0_1_ino.ino (41 KB)

Bitte mach die Fotos des Stativs vor einem neutraleren und gegenüber dem Stativ neutraleren Hintergrund. Dieser unruhige Weis-Schwarz Hintergrund ist für die Umrißverschleierung von Miltiäreinrichtungen super aber nicht für dokumentarische Fotos. :wink: :wink: :wink:

Die Mittelanzapfung des Batterieblockes ist möglich und funktioniert. Du wirst aber die Batterien ungleichmäßig schnell leer haben.

Du hast wenige Arduinoausgänge verwendet. Laß darum Pin 1 frei; das braucht es für die Serielle Übertragung von Daten oder des Sketches.

Laß alle ich sage allle delays() weg!!! einzige Ausnahme kann ein kurzes Delay zum Tastenentprellen sein. Ein delay (1000) hält den arduino für 1 Sekunde an. In dieser Zeit kannst Du keine Tastaturabfragen machen. Für Doppeldrücken oder Lang-Kurz Drücken ist das aber notwendig.

Entschuldige; Das was Du schreibst ist schlimmster Spaghettikode.

Funktionen kannst Du einen oder mehrere Parameter übergeben zb statt:
stepper_plus_30_grad() und stepper_minus_30_grad() einfach Stepper_drehen (Drehrichtung, Winkel) oder noch einfacher Stepper_drehen (Winkel): den Winkel als positive bzw negative Zahl übergeben.
Das gleiche mit servopos01(), servopos02()., servopos03() und servopos04() einfach servopos(position) und in der Funktion per switch case die min und max Werte speichern und mit diesen dann die Bewegung steuern Das mußt Du dann aber anders machen siehe Punkt 3).

Wenn die Drehung nicht so genau sein muß und da das Microstepping sowieso nicht richtig funktioniert (wegen der kleinen Versorgungsspannung) schalte den Easydriver auf Vollschritt um und so brauchst Du weniger Schritte.

  1. gib den Kode in setup() oder nimm eine Variable die Du nach den ausführen auf 0 setzt Wenn die Varable 1 ist führst Du die Aktion aus und setzt die variable auf 0
byte statusausführen=1:
...

loop()
{
  if(statusausführen ==1)
    {
    Servo bewegen;
    statusausführen =0;
    }
...
}
  1. Du mußt mit millis() kontrollieren ob nach einer bestimmten Zeit losgelassen wurde und ob dann wieder gedrückt wurde ecc. Mehrfachdruck ist aufwendiger; kurz-lang Drücken einfacher. Auf allen Fällen kann die Aktion dann aber erst nach einer gewissen Zeit erfolgen. Bei kurz-lang erst nach loslassen des Tasters. Bei Mehrfachdrücken erst nach Ablauf der Wiederholzeit.
    Die Taster müssen entprellt werden!!!
    Kurz-Lang: Beim Tastendruck speicherst Du millis() in einer unsigned long Variablen ab. Nach dem Loslassen des Tasters kontrollierst Du ob die vergangene Zeit größer als die Kurzdrückzeit ist. Alternativ kannst Du auch zusätzlich nach verstreichen der Kurzdrückzeit die Langdrückzeit-Aktion starten.
    Mehrfachdrücken: Sagen wir mal Du mußt innerhalb 1 Sekunde den nächsten Tastendruck machen damit der Mehrfachdruck erkannt wird. Du speicherst die millis() beim ersten mal drücken ab. Dann wartest Du ob innerhalb der 1 Sekunde nochmal gedrückt wird. wenn ja speicherst Du das Drücken als Doppeldrücken an zb mit Taste2++; Du kannst dann nochmal die 1 sekunde warten um das dreifachdrücken zu erkennen. achteil ist daß du nach einem Tastendruck mindestens 1 Sekune warten mußt um zu wissen ob es ein einfac- doppel- dreifach-Druck ist.

zu 3)

for(int i=0; i < steps; i++){ 
    digitalWrite(STEP_PIN, HIGH); 
    delayMicroseconds(usDelay); 

    digitalWrite(STEP_PIN, LOW); 
    delayMicroseconds(usDelay); 
  }

So ist nur eine Bewegung auf einmal möglich da Du Arduino damit blockierst.
Du mußt alle x millisekunden Kontrollieren ob eine Bewegung zu machen ist ( zB einen Schritt des Schrittmotors alle 2mS; einen Schritt des Servos alle 50mS) wieviele Schritte noch zu machen sind speicherst Du in einer Variablen auch wieviele mS noch für die nächsten Schritt zu warten ist.

Grüße Uwe

Smokyyo:
//Frage03:
// Wie kann ich machen das nicht dannach sondern während die "(untere drehscheibe) auf 30 grad" gleichzeitig der Servo "(seitliche drehscheibe) von -45 zu 90 grad" geht ???

ich fürchte, da mußt du dein Programm komplett umstrukturieren.

Momentan ruft du eine Bewegungsfunktion auf, dir führt die Bewegung komplett aus und kehrt dann wieder zurück.
Dadurch hast du zwangsläufig eine streng sequnzielle Abarbeitung aller Bewegungsabläufe.

Was du brauchst, sind Bewegungsfunktionen, denen zu einen Zielwert übergibst, und die jedes mal, wenn sie aufgerufen werden, einen kleinen Schritt ausführen.
Da hast du anstelle von vielen Funktionen servopos01, servopos02..... nur noch

boolean servopos(int ZielPos){  
  static int aktPos;
  if (aktPos < ZielPos)    myservo.write(++aktPos);  
  if (aktPos > ZielPos)    myservo.write(--aktPos);  
  return (aktPos == Zielpos);  // Rückgabe true wenn Position erreicht
}

Die Funktion gint true zurück, wenn die Position erreicht ist, dann hast du eine Kontrolle darüber. (z.B. zum Kamera auslösen etc).

Genauso kannst du auch deine Funktion für den Stepper umarbeiten.

Da diese Funktionen ja aber ständig wieder neu aufgerufen werden müssen, mußt du aber deinen Hauptprogramm ablauf komplett neu gestalten.
Anstatt alle deine anzufahrenden Postionen hintereinnander in die Loop() zu schreiben, könntest du dir ein Array erzeugen, in dem alle deine anzufahrenden Positionen abgespeichert sind:

int AktionsArray[][2] = {{  0,   0},  // Array im dem die Positionen von Servo und 
			{ 30,  40},   // Schrittmotor für jede einzelne Aktions-
			{ 30,  85},   // stellung gespeichert sind.
			{ 30, 120},
			{ 60,  40},
			{ 60,  85},
			{ 60, 120}};

Hier nur mit einigen wenigen Schritten. Erste Spalte ist die position des Motors, zweite Spalten ist das Servo.

Der Aufruf in der loop könnte so aussehen:

void loop() {  
  // in dieser Zeile werden die Funktionen  stepperpos und servopos aufgerufen, und dabei als Argument die Sollposition
  // aus dem AktionsArray übergeben. Die Zeile des AktionsArrays wird mit Aktion ausgewählt.
  // Die Rückgabewerte der Funktionen werden logisch verknüpft und der Variablen inPosition zugewiesen.
 // inPosition ist also true, wenn beide ihre Zielpodition erreicht habe.
  int inPosition = stepperpos(AktionsArray[Aktion][0])  && servopos(AktionsArray[Aktion][1]); 

  if (inPosition){    // jetzt ist die Zielposition erreicht, die gewünschnten Aktionen (Kamera) können ausgelöst werden.
    Serial.print("  Position  ");    Serial.print(Aktion);    Serial.println("  erreicht!");

    Aktion++;                                                              // die nächste Aktion.
    if (Aktion >= sizeof(AktionsArray)/4) Aktion=0;  // Ist das Ende des Arrays errecht? dann wieder von vorne.
  }
}

Das, wie gesagt, nur als Anregung. Es gibt sicherlich auch andere Möglichkeiten, aber mit dieser Struktur kriegst du maximale Flexibilität. Um mehr positionen anzufahen, brauchst du nur das Array zu erweitern.

guntherb:
Das, wie gesagt, nur als Anregung. Es gibt sicherlich auch andere Möglichkeiten, aber mit dieser Struktur kriegst du maximale Flexibilität. Um mehr positionen anzufahen, brauchst du nur das Array zu erweitern.

Außerdem erhälst Du einen kleinen kompakten Sketch.
Grüße Uwe

Zitat:
"ich fürchte, da mußt du dein Programm komplett umstrukturieren."

Ich fürchtete auch, und ich werde wohl noch ne weile brauchen um alles zu verstehen damit ich das überhaupt jemals kann.

Ich bin heute auch noch irgendwie lustlos, hab noch mehrere andere Projekte darunter schon seit 1 1/2 Jahren ne 85cm Holz Yacht. Ich werd wohl warten bis ich wieder Arduino Lust bekomme, dann klappt’s am besten.

Was ihr geschrieben habt ist verständlich und wird aufjedenfall Hilfreich sein und ich geb ein großes Danke dafür!
Ich werde es eben erst die Woche weiter versuchen, also nicht heute und vieleicht auch nicht morgen.

Ich hatte gerade aber dennoch kurz den Eindruck, es sind mal wieder zu viele schnipsel, von kompletteren Sachen lerne ich glaub bis jetzt am besten.

@uwefed

Das erste mal das ich was negatives zu meiner Tür Fototapete zu hören bekomme, ich hätts nichtmehr
für möglich gehalten :slight_smile:

In dem Raum gibts leider nicht viele andere Möglichkeiten, zwei Dachschrägen, ne Balkenwand mit led's :slight_smile: und die
andere gerade Wand hat auch ne Fototapete die so ähnlich ist, und da steht noch das Sofa :slight_smile: sonst stehen überall schränke oder Regale, oder meine gestapelten Projekte nehmen auch ne Menge Platz weg.
Es war gestern nunmal schon dunkel deswegen hab ich im Haus mit ner Fotolampe die Aufnahmen gemacht.
Es ist wirklich schwer in unserm haus einen neutralen Hintergrund oder ne 100% gerade wand/ecke zu finden :slight_smile:

Werd wohl in Zukunft nen Handtuch oder ne Leinwand dafür aufhängen müssen.

-zu den Akkus, ich hab dafür zwei 6x AA etc. Ladegeräte die Balancieren es wieder aus.

-Pin 1 frei = Danke für den Hinweis

-und ok, alle delays :slight_smile:

-zuerst meine Tapete und jetzt auch noch Spaghetti :slight_smile:

zum Glück sind dir nicht die Augen rausgefallen etc...ich hatte meine Bedenken was wohl mit einem Programmierer passieren würde, als ich den Anfänger Code Postete.

Zitat:
"schalte den Easydriver auf Vollschritt um und so brauchst Du weniger Schritte."

Als ich noch alles auf dem Steckbrett hatte hab ich mal mit ms1 und ms2 und eben den schritten ausprobiert aber der ausgebaute Drucker/Scanner Motor funktioniert so wie es jetzt ist am besten/schnellsten.

Bei vielen anderen versuchen hatte er nur gerattert oder gesummt.

Es gibt auch kein Datasheet zu dem Motor, die einzige Information die ich finden konnte: 360/ 96 step = 3,75 deg

Ich hab alle versuche außerdem mit nem gekauftem nema17 0.33a gegen getestet, dort hat es funktioniert nur beim ausgebautem Motor eben nicht alles.

Smokyyo:
@uwefed

Das erste mal das ich was negatives zu meiner Tür Fototapete zu hören bekomme, ich hätts nichtmehr
für möglich gehalten :slight_smile:

Ich habe ja nicht die Fototapete als solche bemängelt sondern den Aufbau Deines Fotos. Benutze einfach ein färbiges Handtuch oder Bettlaken das eine andere Farbe als das zu fotografierende Objekt hat. Auf einen oder 2 Stühle werfen und teilweise auf dem Boden liegen lassen damit das ganze Foto den gleichen Hintergrund hat; Statif draufstellen. Als angehender Fotograf mußt Du auch ein Auge auf den Hintergrund haben damit Deine Fotos perfekt werden.

Smokyyo:
-zuerst meine Tapete und jetzt auch noch Spaghetti :slight_smile:
zum Glück sind dir nicht die Augen rausgefallen etc...ich hatte meine Bedenken was wohl mit einem Programmierer passieren würde, als ich den Anfänger Code Postete.

Ja, ich bin Äh die Welt ist unbarmherzig.
Wir haben alle mal klein, äh dünn und lange (eben Spaghetti) angefangen :wink: :wink: :wink: :wink:

Du mußt lernen daß Funktionen eine feine Schache sind. Du kannst aber nicht für jede Situation eine nur auf diese Situation maßgeschneiderte Funktion schreiben. Wenn Du Stunden und Miuten in Sekunden umrechnen willst schreibst Du dann auch 1440 Funktionen; für jede Minute-Stundenkombination eine?

Smokyyo:
Zitat:
"schalte den Easydriver auf Vollschritt um und so brauchst Du weniger Schritte."

Als ich noch alles auf dem Steckbrett hatte hab ich mal mit ms1 und ms2 und eben den schritten ausprobiert aber der ausgebaute Drucker/Scanner Motor funktioniert so wie es jetzt ist am besten/schnellsten.

Bei vielen anderen versuchen hatte er nur gerattert oder gesummt.

Es gibt auch kein Datasheet zu dem Motor, die einzige Information die ich finden konnte: 360/ 96 step = 3,75 deg

Ich hab alle versuche außerdem mit nem gekauftem nema17 0.33a gegen getestet, dort hat es funktioniert nur beim ausgebautem Motor eben nicht alles.

Der Easydriver ist ein Schrittmotortreiber mit Stromansteuerung. Der Drucker/Scanner-Schrittmotor wird aber ein Motor mit Spannungsansteuerung sein da er wahrscheinlich mit ca 12V bzw 20 V angesteuert wurde. Miß mal den Innenwiderstand eine Spule. Wenn sie über einigen Ohm liegt ist de Motor für Spannungsansteuerung ausgelegt. Mit eine Versorgungsspannung die kleiner oder nicht viel größer als die Nennspannung des Motors ist, kannst Du keine ordentliche Stromsteuerung zustandebringen da der Motor durch den Innenwiderstand/Wicklungsinduktivität den Strom begrenzt und nicht der Treiber.

Grüße Uwe

Miß mal den Innenwiderstand einer Spule:

Ich hab 5 ohm gemessen.

so ziemlich das einige was ich heute gemacht hab :slight_smile: muss erstmal mal wieder den kopf für weiteres frei kriegen.

Das ist weniger als ich erwartet habe.
Grüße Uwe