Hallo!
Ich ein Problem mit meinem Roboter. Wenn ich ihn einschalte dreht sich immer nur das linke Rad. Wenn ich aber ein anderes Programm auf den Arduino hochlade, fährt der Roboter ganz normal. Zum Ansteuern der beiden Motoren verwende ich folgenden Motortreiber.
http://www.physicalcomputing.at/shop/article_A-1123300/DC-Motor-Treiber-1A%2C-Dual.html?sessid=Fahcu3BeyllTzv0Cg6LmU0BpKMjDXyjAPTFvvHD7eV2HFJy3QSmhQOi5aSriuIl8&shop_param=cid%3D23%26aid%3DA-1123300%26Bitte um Hilfe!
Roboter-Programm
#include <Servo.h>
#include <Ping.h>
#include <Motor.h>
const int PWMA_rechts=10; //rechter Motor
const int PWMB_links=11; //linker Motor
const int AIN1=2, AIN2=3, BIN1=4, BIN2=5; //AIN1,AIN2,BIN1 und BIN2 sind die steuereingänge des Motortreibers ( ob er Vorwährts oder Rückwährts fahren soll)
const int stby=6, pingPin=8, speedPin=0, servoPin=9;
const int mitte=89, links=0, rechts=179;
int roboSpeed, value;
long abstand, abstandLinks=1000, abstandRechts=1000;
Motor motor(PWMA_rechts,PWMB_links,AIN1,AIN2,BIN1,BIN2); //Motorinitialisierung
Ping sensor(pingPin);//Ultraschallsensorinitialisierung
Servo servo;
void setup()
{
Serial.begin(9600);
pinMode(stby,OUTPUT);
motor.Start(stby);
servo.attach(servoPin);
}
void loop()
{
abstand=sensor.Centimeters(); //auslesen des Ultraschallsensors
Serial.print(abstand);
Serial.println("cm");
value=analogRead(speedPin); //die Geschwindigkeit kann mit einem Potentiometer eingestellt werden
roboSpeed=map(value,0,1023,200,255);
motor.Move(1,roboSpeed,1); //vorwährts fahren
motor.Move(2,roboSpeed,1);
if(abstand<10)//wenn der Roboter ein Hinderniss in 10cm entfernung entdeckt
{
motor.Stop(stby); // Roboter bleibt stehen
servo.write(links);//Roboter sieht nach links
if(sensor.Centimeters()<abstandLinks)//der kleinste abstand wird abgespeichert
{
abstandLinks=sensor.Centimeters();
}
delay(1500);
servo.write(rechts);//Roboter sieht nach rechts
if(sensor.Centimeters()<abstandRechts)//der kleinste abstand wird abgespeichert
{
abstandRechts=sensor.Centimeters();
}
delay(1500);
servo.write(mitte);//Roboter sieht wieder nach vorne
if(abstandRechts>abstandLinks)//wenn der abstand rechts größer als der abstand links ist
{ //dann soll der Roboter nach rechts fahren
motor.Start(stby);
motor.Move(2,roboSpeed,1);
motor.Move(1,roboSpeed,2);
delay(2000);
}
else if(abstandRechts<abstandLinks)//wenn der abstand rechts kleiner als links ist
{ //dann soll er nach links fahren
motor.Start(stby);
motor.Move(1,roboSpeed,1);
motor.Move(2,roboSpeed,2);
delay(2000);
}
}
}
Test Programm für Motoren(mit diesem Programm fährt der Roboter ohne Probleme vorwährts)
#include <Motor.h>
const int pwmA_rechts=10; //rechter Motor
const int pwmB_links=11; //linker Motor
const int AIN1=2, AIN2=3, BIN1=4, BIN2=5; //AIN1,AIN2,BIN1 und BIN2 sind die steuereingänge des Motortreibers ( ob er Vorwährts oder Rückwährts fahren soll)
const int stby=6;
Motor motor(pwmA_rechts,pwmB_links,AIN1,AIN2,BIN1,BIN2); //Motorinitialisierung
void setup()
{
motor.Start(stby);
}
void loop()
{
motor.Move(1,200,1);
motor.Move(2,200,1);
delay(10);
}
Motor-Library:
Motor.h
/*
Motor.h - to controll a Motor
written by Michael Köfinger, 4. Jänner 2013
*/
#ifndef Motor_h
#define Motor_h
#include "Arduino.h"
class Motor
{
public:
Motor(int PWM_A, int PWM_B, int AIN_1, int AIN_2, int BIN_1, int BIN_2);
void Move(int motor, int motor_speed, int motor_direction);
void Start(int stbyPin);
void Stop(int stbyPin);
private:
int PWMA, PWMB,AIN1,AIN2,BIN1,BIN2;
};
#endif
Motor.cpp
/*
Motor.cpp - to controll a Motor
written by Michael Köfinger, 3. Jänner 2013
*/
#include "Arduino.h"
#include "Motor.h"
Motor::Motor(int PWM_A, int PWM_B, int AIN_1, int AIN_2, int BIN_1, int BIN_2)
{
PWMA = PWM_A; PWMB = PWM_B;
AIN1 = AIN_1; AIN2 = AIN_2; BIN1 = BIN_1; BIN2 = BIN_2;
pinMode(PWMA,OUTPUT);
pinMode(PWMB,OUTPUT);
pinMode(AIN1,OUTPUT);
pinMode(AIN2,OUTPUT);
pinMode(BIN1,OUTPUT);
pinMode(BIN2,OUTPUT);
}
void Motor::Move(int motor, int motor_speed, int motor_direction)
{// motor: 1 oder 2(1: Motor A, 2: Motor B), speed: 0-255, direction: 1 oder 2 (1: vorwährts, 2: rückwährts)
switch(motor)
{
case 1:
switch(motor_direction)
{
case 1:
digitalWrite(AIN1,HIGH);
digitalWrite(AIN2,LOW);
break;
case 2:
digitalWrite(AIN1,LOW);
digitalWrite(AIN2,HIGH);
break;
}
analogWrite(PWMA,motor_speed);
break;
case 2:
switch(motor_direction)
{
case 1:
digitalWrite(BIN1,HIGH);
digitalWrite(BIN2,LOW);
break;
case 2:
digitalWrite(BIN1,LOW);
digitalWrite(BIN2,HIGH);
break;
}
analogWrite(PWMB,motor_speed);
break;
}
}
void Motor::Start(int stbyPin)
{
digitalWrite(stbyPin,HIGH);
}
void Motor::Stop(int stbyPin)
{
digitalWrite(stbyPin,LOW);
}
mfg
Michael