PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Probleme mit dem Antrieb



Toran
12.04.2018, 13:44
Guten Tag Zusammen,
ich bin gerade dabei einen Roboter zu bauen, der sich autonom bewegen soll. Dafür verwende ich zwei von diesen Motoren:
https://www.conrad.de/de/getriebemotor-com-motor01-gelb-schwarz-1573543.html
und diesen Motortreiber:
https://www.conrad.de/de/entwickler-platine-sbc-motodriver2-arduino-banana-pi-cubieboard-pcduino-raspberry-pi-raspberry-pi-2-b-raspberry-1573541.html.

Momentan sieht das ganze so aus, dass ich einen Ultraschall-Sensor vorne angebracht habe und die Motoren so lange nach vorne fahren lasse bis sich ein Objekt in einer nähe von 15 cm befindet.
Ich habe 4 Funktionen erstellt, turnRight(), turnLeft, driveForward(), driveBackward(). Mein Plan war es kurz stehen zu bleiben, wenn er was "sieht" dann nach hinten zu fahren (driveBackward()) und dann nach rechts zu drehen und wieder abzufragen, ob er was sieht.
Das Problem an der Sache ist, dass die Motoren hängen bleiben, wenn man die Fahrtrichtung ändern will. Anfangs hatte ich bei den Abbiegefunktionen beide Motoren in verschiedene Richtungen angesteuert und nur einer hat mit dem Signal arbeiten können, nämlich der für die Vorwärtsbewegung. Der andere blieb einfach stehen. Aus diesem Grund habe ich dann einen Motor einfach ausgeschaltet und nur den anderen angesteuert um ab zu biegen. Als ich den Roboter von Anfang an Rückwärts fahren ließ, weißte er keine Probleme auf. Ich habe auch schon versucht vor der Änderung der Fahrtrichtung die Motoren zum Stillstand zu bringen und mit delay(...) zu arbeiten, aber selbst das erwies sich als hoffnungslos. Außerdem habe ich meinen Roboter an eine ytärkere Quelle geschlossen, aber auch das zeigte keinen Erfolg. Habt ihr eine Ahnung, was ich da machen kann ?
Gruß, Thomas.

Ceos
12.04.2018, 14:01
Hättest du mal etwas Code mit dem man arbeiten kann?!
Und eventuell auch die Frage ob du richtig verdrahtet hast.

Toran
12.04.2018, 14:15
peinlich, peinlich... ich wollte eigentlich beides hochladen und habe es vergessen, aber ja klar, hier siehst du beides:

Code:
const int s0 = 53;
const int s1 = 52;
const int s2 = 51;
const int s3 = 50;
const int out = 40;
const int motor1 = 10;
const int motor2 = 11;
const int motor3 = 12;
const int motor4 = 13;
const int trigger = A1;
const int echo = A0;
float red=0,green=0,blue=0;
float redA[10], greenA[10], blueA[10];
float rav=0,gav=0,bav=0;
int counter;
int state=0;
unsigned long time=0;
int currentTime=0;
int previosTime=0;


void setup()
{
pinMode(motor1, OUTPUT);
pinMode(motor2, OUTPUT);
pinMode(motor3, OUTPUT);
pinMode(motor4,OUTPUT);

pinMode(trigger, OUTPUT);
pinMode(echo, INPUT);
// pinMode(irPin,INPUT);

pinMode(s0, OUTPUT);
pinMode(s1, OUTPUT);
pinMode(s2, OUTPUT);
pinMode(s3, OUTPUT);
pinMode(out, INPUT);

//Scaling to 20% frequency
digitalWrite(s0, HIGH);
digitalWrite(s1, LOW);
Serial.begin(9600);

}

int getDistance()
{
long distance=0;
long t=0;
digitalWrite(trigger,LOW);
delayMicroseconds(3);
noInterrupts();
digitalWrite(trigger,HIGH);
delayMicroseconds(10);
digitalWrite(trigger,LOW);
t=pulseIn(echo,HIGH);
noInterrupts();
t=(t/2);
distance=(t/29.1);
return(distance);
}

void driveForward()
{
analogWrite(motor1,200);
analogWrite(motor4,223);
}

void driveBackward()
{
analogWrite(motor2,200);
analogWrite(motor3,223);
}

void turnLeft()
{
analogWrite(motor1,0);
analogWrite(motor4,200);
}
void turnRight()
{

analogWrite(motor1,200);
analogWrite(motor4,0);
}
void brake()
{
analogWrite(motor1,0);
analogWrite(motor2,0);
analogWrite(motor3,0);
analogWrite(motor4,0);
}


void loop()
{

int distance=getDistance();
Serial.println(distance);
if(distance<15)
{
turnRight();
// driveBackward();

}
else
{
driveForward();
}
Achtung nicht alle Variablen werden benutzt. Das liegt daran, dass ich nur den problematischen Code kopiert habe, alles andere läuft.

Und hier das Bild:
33416

Ceos
12.04.2018, 14:18
PS pack den code bitte in sog. code-tags, also "[ C O D E ] dein code [ / C O D E ]" ... nur ohne die leerzeichen dann wird der code umformatiert und ist besser lesbar :)

und das bild ist irgendwie kaum lesbar, keine ahnung ob beim hochladen umskalliert worden ist

Toran
12.04.2018, 15:55
okay.



const int s0 = 53;
const int s1 = 52;
const int s2 = 51;
const int s3 = 50;
const int out = 40;
const int motor1 = 10;
const int motor2 = 11;
const int motor3 = 12;
const int motor4 = 13;
const int trigger = A1;
const int echo = A0;
float red=0,green=0,blue=0;
float redA[10], greenA[10], blueA[10];
float rav=0,gav=0,bav=0;
int counter;
int state=0;
unsigned long time=0;
int currentTime=0;
int previosTime=0;


void setup()
{
pinMode(motor1, OUTPUT);
pinMode(motor2, OUTPUT);
pinMode(motor3, OUTPUT);
pinMode(motor4,OUTPUT);

pinMode(trigger, OUTPUT);
pinMode(echo, INPUT);
// pinMode(irPin,INPUT);

pinMode(s0, OUTPUT);
pinMode(s1, OUTPUT);
pinMode(s2, OUTPUT);
pinMode(s3, OUTPUT);
pinMode(out, INPUT);

//Scaling to 20% frequency
digitalWrite(s0, HIGH);
digitalWrite(s1, LOW);
Serial.begin(9600);

}

int getDistance()
{
long distance=0;
long t=0;
digitalWrite(trigger,LOW);
delayMicroseconds(3);
noInterrupts();
digitalWrite(trigger,HIGH);
delayMicroseconds(10);
digitalWrite(trigger,LOW);
t=pulseIn(echo,HIGH);
noInterrupts();
t=(t/2);
distance=(t/29.1);
return(distance);
}

void driveForward()
{
analogWrite(motor1,200);
analogWrite(motor4,223);
}

void driveBackward()
{
analogWrite(motor2,200);
analogWrite(motor3,223);
}

void turnLeft()
{
analogWrite(motor1,0);
analogWrite(motor4,200);
}
void turnRight()
{

analogWrite(motor1,200);
analogWrite(motor4,0);
}
void brake()
{
analogWrite(motor1,0);
analogWrite(motor2,0);
analogWrite(motor3,0);
analogWrite(motor4,0);
}


void loop()
{

int distance=getDistance();
Serial.println(distance);
if(distance<15)
{
turnRight();
// driveBackward();

}
else
{
driveForward();
}




}



https://www.pic-upload.de/view-35155840/Schaltplan_Schaltplan.jpg.html

- - - Aktualisiert - - -

Problem gelöst. Danke für die Hilfe.

i_make_it
13.04.2018, 17:34
Soweit ich das sehe, ist void brake() die einzige Stelle an der gegebene Fahrbefehle zurückgenommen werden.
Versuche doch einmal den Code wie unten anzupassen.
Da wird jeweils alle 4 Pins definiert. Damit werden vorhergehende Anweisungen auch zurückgenommen.



void driveForward()
{
analogWrite(motor1,200);
analogWrite(motor2,0);
analogWrite(motor3,0);
analogWrite(motor4,223);
}

void driveBackward()
{
analogWrite(motor1,0);
analogWrite(motor2,200);
analogWrite(motor3,223);
analogWrite(motor4,0);
}

void turnLeft()
{
analogWrite(motor1,0);
analogWrite(motor2,0);
analogWrite(motor3,0);
analogWrite(motor4,200);
}
void turnRight()
{

analogWrite(motor1,200);
analogWrite(motor2,0);
analogWrite(motor3,0);
analogWrite(motor4,0);
}