PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Vergleich zweier werte für aktion



Capper
29.10.2013, 18:52
Hallo zusammen,

vorweg möchte ich erwähnen, dass ich ein neuling in sachen programmieren bin...;)

Verwendete hardware :
- Arduino Uno
- Adafruit Motorshield
- Handelsüblicher Servo
- HC-SR04

gewollter ablauf:
- wenn der abstand den wert X unterschreitet, sollen die beiden DC-motoren stoppen. Im anschluss dreht der servo mit dem darauf montierten Sensor jeweils nach rechts und links und vergleicht die werte mit anschließender reaktion (links- o. rechtsdrehung)

Ich sitze bereits seit etwa 2 monaten an dem programm welches den kleinen steuern soll und bin nun gänzlich am verzweifeln. Bei meinen recherchen nach einem ähnlichen code, kam leider nichts brauchbares zu tage und ich bitte um nachsicht, sollte ich etwas übersehen haben.
Immerhin habe ich es geschafft ein compilierbares programm zu schreiben, welches in etwa das tut was ich mir vorstelle.

Leider hapert es an dem punkt wo der servo den sensor in die jeweiligen richtungen dreht und die abstände vergleichen soll. Er macht es nämlich nicht, sondern beginnt die schleife von vorn.

Ich habe zur festlegung der einzelnen werte "int" verwendet. Könnte das mein problem sein ?
Müsste ich die werte im eeprom speichern ? - Wenn ja, wäre es möglich mir eine bessere beschreibung zu zeigen als jene die im arduinoforum zu finden ist ?


vielen dank für konstruktive hilfe im vorhinein :)

oberallgeier
29.10.2013, 22:29
... gewollter ablauf ... seit etwa 2 monaten an dem programm ...Dann zeig doch mal das Programm

Capper
01.11.2013, 06:50
#define servoPin 10
#define trigPin A1
#define echoPin A2

#include <Servo.h>
int b;
int c;
int pos;

Servo scanservo;

void setup()
{
scanservo.attach(servoPin);
Serial.begin(9600);
Serial.println("bereit");
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
scanservo.attach(servoPin);


}

int range()
{
int duration;
digitalWrite(trigPin, HIGH);
delay(100);
digitalWrite (trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
delay (50);
//duration => cm
return duration/58.2;
}
/////////////////////////////////////////////////////////////////
void loop()
{
Serial.println(range());
int a = range();
if (a <=5)
{
Serial.println("Stop");
for(pos=90;pos>=10;pos-=1)
{
scanservo.write(pos);
}
delay(1500);
int b= range();
delay(600);

//Links//

for(pos=10;pos<169; pos+=1)
{
scanservo.write(pos);
}
delay(1500);
int c= range();
delay(600);

//rechts//

for (pos=170;pos>=90; pos-=1)
{
scanservo.write(pos);

}
delay(1000);
scanservo.write(90);
delay(20);

if (b<c)
{
//motoren links
Serial.println("links");
delay(200);

}
else if (c<b)
{
//motor rechts
Serial.println("rechts");
delay(200);
}
else if (c=b)
{
//rückwärts
Serial.println("rückwärts");
delay(200);

}
else
{
//go
Serial.println("go");
}

}

}



nun... wie gesagt, bis zur Bewegung des Servo ist alles scheints zu klappen. Ich bekomme nur keine Ausgabe ob Rechts oder Links.

Arkon
01.11.2013, 07:28
Zuerst der Hinweis und die Bitte, Code bitte in dem dafür vorgesehenen Blöcken zu posten. Dann werden auch die Tabulatoren zum Einrücken berücksichtig und der Code ist deutlich lesbarer. Dazu einfach den kleinen Button mit dem # klicken oder den Code zwischen [*CODE][*/CODE] (ohne die *) schreiben.

Ich habe den Code nur kurz überflogen. Ein Problem ist, dass du den Sensor schwenken lässt, aber die Werte außerhalb der Schleife ausliest


//Links//

for(pos=10;pos<169; pos+=1)
{
scanservo.write(pos);
}
delay(1500);
int c= range();
delay(600);

Dazu kommt, dass du den Sensor erst von 10 - 170 drehen lässt und im Anschluss von 170 zurück auf 90. Jeweils am Ende führst du, wie oben erwähnt eine Messung durch. Also effektiv nur bei 170 und bei 90.

Ich gehe mal davon aus, dass mit diesen Werten die Stellung des Servos in Grad gemeint ist wobei 90 eine Ausichtung nach vorne entspricht.

Um jetzt einen Vergleich zwischen Links und Rechts vorzunehmen wäre folgendes Beispiel ein einfacher Ansatz.

Du lässt den Servo von 10°-90° drehen um den Bereich links zu scannen. Nach jedem Schritt, den sich der Sensor dreht liest du den Wert aus und überprüfst ob er größer als der bisherige Maximalwert ist. (sollte der Sensor mit abnehmendem Abstand auch abnehmende Werte erzeugen ist der Code entsprechend anzupassen.



for(i=10; i<90; i++)
{
scanservo.wirte(i);
links_aktuell = range();
if(links_aktuell > links_max)
{
links_max = links_aktuell;
}
}

(Code erhebt keinen Anspruch auf Funktionalität sondern soll das Prinzip erklären)

Damit erhälst du, nachdem der Sensor von 10°-90° geschwenkt wurde einen Maximalen für den Bereich links des Roboters.Die gleiche Prozedur lässt du für den rechten Bereich laufen. Dann solltest du zwei Werte (links_max und rechts_max) haben die du vergleichen kannst.

Den Servo in 1°-Schritten drehen zu lassen ist wahrscheinlich etwas übertrieben. ich denke 5° oder gar 10°-Schritte sollten ausreichen. Das kommt aber auf die Hindernisse, Empfindlichkeit des Sensors, "Blickwinkel" des Sensors und einigen anderen Parametern an.

Bei weiteren Fragen weißt du ja, wo du uns findest.

Capper
04.11.2013, 20:12
soo, hab das mal eben geändert :rolleyes:


also so wie du es beschreibst hatte ich es eig auch gedacht. die int b und c sind jeweils rechts / links ( hatte keinen tieferen sinn diese belegung).

meine frage ,die sich mir stellt um den fehler zu verstehen, worin liegt der unterschied die sensorerfassung nicht nach beenden der servobewegung laufen zu lassen sondern bis zum max punkt?
oder habe ich das falsch interpretiert/gelesen :confused:?


edit:

hat auf jedenfall hingehauen, danke nochmals :)