INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Selbstfahrender Roboter Programm änderung hilfe ?
26.06.2016, 13:18
Beitrag #1
Selbstfahrender Roboter Programm änderung hilfe ?
Guten Tag,
ich bin neu hier und habe eine Frage bezüglich eines Programms für einen selbst laufenden Roboter mit dem Sharp entfernungssensor.
Ich habe das Problem das in dem Program beschrieben wir das sich der Roboter solangen drehen soll bis er eine 10% weitere entfernung misst, ich möchte aber das er sich nach dem Ihm was zu nah gekommen ist 2 sekunden lang dreht, ich kriege das nicht hin und brauche deshalb dringen hilfe von euch.
schon mal vielen Dank im vorraus.





/*****************************************************************************/
/*** Datei: WMRprogrammcode.ino ***/
/*** Version: 1.0 ***/
/*** Datum: 15.02.2013 ***/
/*** ***/
/*** ***/
/*** Weiter-Entwicklung erwünscht! Aber bitte erzählt uns davon... ;-) ***/
/*** ***/
/*** ***/
/*****************************************************************************/

// Nützliche Funktionen für die Servo Ansteuerung kommen von hier:
#include <Servo.h>

// Welcher Pin hat welche Funktion???
// Funktion Pin Beschreibung
#define IR_SENSOR 2 // Der Sharp IR Sesor ist an Pin 2
#define DIR_B 13 // Richtung B
#define DIR_A 12 // Richtung A
#define PWM_B 11 // Geschwindigkeit B
#define BRAKE_A 9 // Bremse A
#define BRAKE_B 8 // Bremse B
#define PWM_A 3 // Geschwindigkeit A
#define SERVO 5 // Servo wird an Pin 5 angesteuert

// Nützliche Einstellungen:
#define FULL_SPEED 160 // Vollgas ist 255, höher geht nicht. Erstmal nur die halbe Geschwindigkeit...
#define TURN_SPEED 160 // schnell Drehen
#define LEFT LOW // Links drehen bei LOW
#define RIGHT HIGH // ... und Rechts bei HIGH
#define CLOSEST_DISTANCE 110 // Bei diesem Wert am IR Sensor soll der Roboter anhalten --> Ist der Wert KLEINER hält der Roboter FRÜHER an
#define SERVO_RIGHT 55 // Mit welchem Winkel stößt der Sensor auf dem Servo Rechts an?
#define SERVO_LEFT 125 // Das gleiche mit Links

Servo SensorServo; // Mit diesem Element wird der Servo gesteuert

// An welcher Servo Position ist die Distanz zur Gefahr am geringsten?
int SeekingPositionWithClosestDanger()
{
// Erst mal anhalten
digitalWrite(BRAKE_A, HIGH);
digitalWrite(BRAKE_B, HIGH);
int ServoPosition;
int MinimumDistance = 0;
int MinimumServoPosition = 0;

// Von Rechts (SERVO_RIGHT = 55) nach Links (SERVO_LEFT=125) alle Servo Positionen anfahren. mit ServoPosition++ wird Wert immer um 1 erhöht
for(ServoPosition = SERVO_RIGHT;ServoPosition <= SERVO_LEFT; ServoPosition++)
{
// Servo Wert einstellen
SensorServo.write(ServoPosition);
delay(1);
// ist der aktuelle Wert näher, als der minimale Wert?
if(analogRead( IR_SENSOR ) > MinimumDistance )
{
// Ja: aktueller Wert ist neues Minimum
MinimumDistance = analogRead( IR_SENSOR );
// Außerdem merken wir uns die Servo Position
MinimumServoPosition = ServoPosition;
}
}
// Die gefundene Position wieder einstellen und Wert zurückgeben
SensorServo.write(MinimumServoPosition);
return MinimumServoPosition;
}

byte ServoPosition = 90;
boolean TurnServo = RIGHT;
// Vorwärts fahren und dabei den Sensor hin und her schwenken
void DriveForward()

{
SensorServo.write( ServoPosition );
//Beide Motoren auf Geradeaus stellen, ...
digitalWrite( DIR_A, HIGH );
digitalWrite( DIR_B, HIGH );

// ... Vollgas und ...
analogWrite( PWM_A, FULL_SPEED );
analogWrite( PWM_B, FULL_SPEED );

// ..Bremsen lösen!
digitalWrite( BRAKE_A, LOW );
digitalWrite( BRAKE_B, LOW );

// Dreht sich der Servo nach Rechts?
if( TurnServo == LEFT )
ServoPosition = ServoPosition+1; // Weiter nach Rechts drehen. d.h. Wert um 1 erhöhen
if( TurnServo == RIGHT )
ServoPosition = ServoPosition-1; // Sonst nach Links drehen, also 1 vom Wert abziehen

// Hat der Servo das Linke Ende erreicht?
if( ServoPosition > SERVO_LEFT )
TurnServo = RIGHT; // Jetzt nach Rechts drehen
if( ServoPosition < SERVO_RIGHT )
TurnServo = LEFT; // Sonst nach Links drehen...
}

// Drehen! Aber in welche Richtung??? LEFT für Links(gegen den Uhrzeiger) RIGHT für Rechts (im Uhrzeigersinn)
void Turn( boolean Direction )
{
// Bremsen
digitalWrite( BRAKE_A, HIGH );
digitalWrite( BRAKE_B, HIGH );
delay( 5 );

digitalWrite( DIR_A, Direction ); // Motor A in die "RICHTUNG" drehen
digitalWrite( DIR_B, !Direction ); // Motor B in entgegen der "RICHTUNG" drehen



// Geschwindigkeit für das Drehen einstellen
analogWrite( PWM_A, TURN_SPEED );
analogWrite( PWM_B, TURN_SPEED );

// Bremsen lösen
digitalWrite( BRAKE_A, LOW );
digitalWrite( BRAKE_B, LOW );


// Solange drehen, bis der Sensor eine 10% weitere Entfernung misst
while( ( CLOSEST_DISTANCE * 1 ) < analogRead( IR_SENSOR ) )
delay (1);

// Halt!
digitalWrite( BRAKE_A, HIGH );
digitalWrite( BRAKE_B, HIGH );
delay( 1 );
}

// Bevor es los geht... Diese Funktion wird am Anfang genau einmal ausgeführt
void setup( )
{
//Motor A (rechts) initialisieren
pinMode( DIR_A, OUTPUT ); // Pin für Richtung Motor A als Ausgang definieren
pinMode( BRAKE_A, OUTPUT ); // Pin für Bremse Motor A als Ausgang definieren
//Motor B (links) initialisieren
pinMode( DIR_B, OUTPUT ); // Pin für Richtung Motor B als Ausgang definieren
pinMode( BRAKE_B, OUTPUT ); // Pin für Bremse Motor B als Ausgang definieren

// Beide Bremsen anziehen, HIGH = Bremsen!
digitalWrite( BRAKE_A, HIGH );
digitalWrite( BRAKE_B, HIGH );

// Servo initialiseren und auf 90° stellen
SensorServo.attach( SERVO );
SensorServo.write( 90 );
delay( 5 );

// Warten bis etwas vor dem Sensor ist
while( CLOSEST_DISTANCE > analogRead( IR_SENSOR ) )
{
// solange warten...
delay( 1 );
}

// Los geht's!!!
}

// Der eigentliche Programmablauf. Nachdem setup() fertig ist wird die Funktion loop() endlos nacheinander ausgeführt
void loop( )
{
int DangerPosition;
int Distance;

Distance = analogRead( IR_SENSOR ); // was misst der Sensor?
if(Distance > CLOSEST_DISTANCE ) // nah genug? Ist ein Hindernis nah, kommt ein großer Wert zurück. Sonst ein kleiner.
{
DangerPosition = SeekingPositionWithClosestDanger(); // Nochmal alles scannen um zu wissen, wo genau die Gefahr am nächsten ist...

// Gefahr Links?
if(DangerPosition <= 90)
{
Turn( RIGHT ); // Rechts drehen
}
// Oder doch Rechts?
if( DangerPosition > 90 )
{
Turn( LEFT ); // dann Links drehen
}
}
DriveForward(); // Immer gerade aus!!!
delay( 10 );
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.06.2016, 14:31
Beitrag #2
RE: Selbstfahrender Roboter Programm änderung hilfe ?
Der Sketch gehört in Code-Tags, so kann ich den nicht lesen.

Und am einfachsten wäre es doch, wenn du den Autor des Sketches dazu befragst.
Wir haben keinerlei Infos über die verwendete Hardware.

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.06.2016, 15:24
Beitrag #3
RE: Selbstfahrender Roboter Programm änderung hilfe ?
(26.06.2016 14:31)hotsystems schrieb:  Der Sketch gehört in Code-Tags, so kann ich den nicht lesen.
.....

..also so langsam brauchst du aber ne Brille...*tippgebe*

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.06.2016, 15:34
Beitrag #4
RE: Selbstfahrender Roboter Programm änderung hilfe ?
(26.06.2016 15:24)Bitklopfer schrieb:  ..also so langsam brauchst du aber ne Brille...*tippgebe*

Neee, das ist schon länger so, aber dennoch daaankee für den Tipp.

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.06.2016, 15:02
Beitrag #5
RE: Selbstfahrender Roboter Programm änderung hilfe ?
Hallo arekklone,

wenn wir mal nur den reinen Loop betrachten, kann man ja gut erkennen was der Roboter da machen soll:
Code:
// Der eigentliche Programmablauf. Nachdem setup() fertig ist wird die Funktion loop() endlos nacheinander ausgeführt
void loop( )
{
int DangerPosition;
int Distance;

Distance = analogRead( IR_SENSOR ); // was misst der Sensor?
if(Distance > CLOSEST_DISTANCE ) // nah genug? Ist ein Hindernis nah, kommt ein großer Wert zurück. Sonst ein kleiner.
{
DangerPosition = SeekingPositionWithClosestDanger(); // Nochmal alles scannen um zu wissen, wo genau die Gefahr am nächsten ist...

// Gefahr Links?
if(DangerPosition <= 90)
{
Turn( RIGHT ); // Rechts drehen
}
// Oder doch Rechts?
if( DangerPosition > 90 )
{
Turn( LEFT ); // dann Links drehen
}
}
DriveForward(); // Immer gerade aus!!!
delay( 10 );
}

Jetzt möchtest du dass der Roboter nach dem Erkennen eines Hindernisses 2sec. in eine Richtung drehen soll. Schau dir doch mal an, was in der Funktion Turn() so passiert. Denn diese ist ja für das Drehen des Roboters zuständig.

Erzeuge dann eine eigene Turn-Funktion (um die originale nicht zu zerschießen), in der du die jeweiligen Programmschritte einfügst. Denn in Turn() ist ja bereits alles nötige vorhanden. Also, erst einmal selbst Code erzeugen und diesen dann hier diskutieren...

Gruß
Torsten
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.07.2016, 16:25
Beitrag #6
RE: Selbstfahrender Roboter Programm änderung hilfe ?
Vielen Dank, für den Tipp
Mein Problem ist das der Roboter ja auch genau das tut was er soll.
Wenn er an die Wand vom Pool zu nah kommt dreht der Roboter Sich aber nur so lange bis er eine
10 % größere Entfernung misst und das ist ein Problem da ja der Roboter auch die Mitte des Pools säubern soll, ich möchte jetzt aber das er sich nicht dreht bis die 10 % Distanz erreicht ist sonder das er sich 1mal so um 120* grad drehen soll.
Bei meinem Versuch eine 2 secündige Pause beim drehen rein zu bringen macht der Roboter nix mehr außer grade aus fahren.

Ich wäre echt dankbar wenn da jemand wüsste wir das geht,
Da ich mit arduino nicht sehr besonders viel zu tun habe.

MfG
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.07.2016, 22:17
Beitrag #7
RE: Selbstfahrender Roboter Programm änderung hilfe ?
Wenn du schon ein Problem damit hast, wenn der Roboter das tut was er machen soll, musst du dich einfach mal mit dem Sketch auseinander setzen und dazu die Basics lernen.
Oder besser den Autor des Sketches befragen.
Mit copy and paste alleine kommt man beim Arduino nicht klar.
Thorsten_156 hat dir doch schon den passenden Tipp gegeben.

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.07.2016, 07:17
Beitrag #8
RE: Selbstfahrender Roboter Programm änderung hilfe ?
(05.07.2016 16:25)arekklone schrieb:  Bei meinem Versuch eine 2 secündige Pause beim drehen rein zu bringen macht der Roboter nix mehr außer grade aus fahren.
Dann zeig doch mal deinen Code. Dann können wir dir bei der Fehlersuche behilflich sein.

Zitat:Ich wäre echt dankbar wenn da jemand wüsste wir das geht,
Da ich mit arduino nicht sehr besonders viel zu tun habe.

Wir wissen bestimmt wie das gehtCool Du möchtest jetzt aber die Lösung nicht von uns Präsentiert bekommen, oder? Denn das ist der falsche Weg! Du solltest (mit Unterstützung dieses Forums) die Lösung schon selbst erarbeiten. Denn aus Erfahrung kann ich sagen, dass die erste Lösung (...er soll sich um ca.120° drehen) nicht immer die richtige ist. Denn da werden bestimmt noch weitere Anforderungen kommenWink
Wie gesagt, zeig uns deinen Lösungsansatz und wir werden dir bestimmt bei der Lösung behilflich sein.

Viele Grüße
Torsten
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Fehler in meinem Programm Franz54 7 139 01.12.2016 23:58
Letzter Beitrag: hotsystems
  Hilfe: IR Remote Steuerung, MSGEQ7 + RGB-LED Streifen dastob 1 117 14.10.2016 21:40
Letzter Beitrag: hotsystems
Sad Ich brauche Hilfe Prosac 4 230 09.10.2016 18:39
Letzter Beitrag: Prosac
  at24c256 Hilfe Gandalf 6 247 29.08.2016 18:59
Letzter Beitrag: MKc
Smile Progammier Neuling Codeschloss bittet um Hilfe Donalonso 2 284 27.08.2016 18:23
Letzter Beitrag: Binatone
  Hilfe gesucht. Webserver Statsiche und Dynamische HTMl Seite b3ta 11 447 22.08.2016 08:07
Letzter Beitrag: b3ta
  Hilfe: Mega2560 - ENC 28J60 - MYSQL Gandalf 1 178 28.07.2016 16:30
Letzter Beitrag: Gandalf
  kleiner Roboter blichi 24 784 27.07.2016 14:02
Letzter Beitrag: torsten_156
  Roboter-Bau Probleme blebbens 8 374 12.07.2016 07:35
Letzter Beitrag: Binatone
  Hilfe beim Arduino Shield reimundko 6 453 05.06.2016 11:28
Letzter Beitrag: rpt007

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste