Ok, dann der Code:
// Yu Hin Hau
// Robotic Car via H-Bridge (L298)
// June 5, 2012
//See Low Level for Command Definitions
//Define Pins
int enableA = 6;
int pinA1 = 4;
int pinA2 = 7;
int enableB = 10;
int pinB1 = 8;
int pinB2 = 12;
//Define Run variable
boolean run;
void setup() {
pinMode(enableA, OUTPUT);
pinMode(pinA1, OUTPUT);
pinMode(pinA2, OUTPUT);
pinMode(enableB, OUTPUT);
pinMode(pinB1, OUTPUT);
pinMode(pinB2, OUTPUT);
run = true;
}
//command sequence
void loop() {
if(run)
{
delay(2000);
enableMotors();
forward(1000);
coast(500);
backward(1500);
coast(500);
forward(500);
brake(500);
turnLeft(500);
turnRight(500);
disableMotors();
run = false;
}
}
//Define Low Level H-Bridge Commands
//enable motors
void motorAOn()
{
digitalWrite(enableA, HIGH);
}
void motorBOn()
{
digitalWrite(enableB, HIGH);
}
//disable motors
void motorAOff()
{
digitalWrite(enableB, LOW);
}
void motorBOff()
{
digitalWrite(enableA, LOW);
}
//motor A controls
void motorAForward()
{
digitalWrite(pinA1, HIGH);
digitalWrite(pinA2, LOW);
}
void motorABackward()
{
digitalWrite(pinA1, LOW);
digitalWrite(pinA2, HIGH);
}
//motor B contorls
void motorBForward()
{
digitalWrite(pinB1, HIGH);
digitalWrite(pinB2, LOW);
}
void motorBBackward()
{
digitalWrite(pinB1, LOW);
digitalWrite(pinB2, HIGH);
}
//coasting and braking
void motorACoast()
{
digitalWrite(pinA1, LOW);
digitalWrite(pinA2, LOW);
}
void motorABrake()
{
digitalWrite(pinA1, HIGH);
digitalWrite(pinA2, HIGH);
}
void motorBCoast()
{
digitalWrite(pinB1, LOW);
digitalWrite(pinB2, LOW);
}
void motorBBrake()
{
digitalWrite(pinB1, HIGH);
digitalWrite(pinB2, HIGH);
}
//Define High Level Commands
void enableMotors()
{
motorAOn();
motorBOn();
}
void disableMotors()
{
motorAOff();
motorBOff();
}
void forward(int time)
{
motorAForward();
motorBForward();
delay(time);
}
void backward(int time)
{
motorABackward();
motorBBackward();
delay(time);
}
void turnLeft(int time)
{
motorABackward();
motorBForward();
delay(time);
}
void turnRight(int time)
{
motorAForward();
motorBBackward();
delay(time);
}
void coast(int time)
{
motorACoast();
motorBCoast();
delay(time);
}
void brake(int time)
{
motorABrake();
motorBBrake();
delay(time);
}
Das ist ein ein Code von:
(die Pins wurden angepasst)
Es passiert folgendes:
kanal b geht 1s an dann aus---->Kanal a geht1,5s an dann aus------>dann gehen beide für 1s an dann aus
Bei diesem selbst geschriebenen Code funktioniert es ein bisschen besser:
#include <IRremote.h>
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
int lc=0;
int enableA =6;
int pinA1 = 4;
int pinA2 = 7;
int enableB = 10;
int pinB1 = 12;
int pinB2 = 8;
void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
pinMode(enableA, OUTPUT);
pinMode(pinA1, OUTPUT);
pinMode(pinA2, OUTPUT);
pinMode(enableB, OUTPUT);
pinMode(pinB1, OUTPUT);
pinMode(pinB2, OUTPUT);
pinMode(13,OUTPUT);
delay(2000);
}
void loop() {
if (irrecv.decode(&results)) {
//Serial.println(results.value);
switch (results.value){
case 17754900 :
forward();
digitalWrite(13,HIGH);
Serial.println("ok 1");
lc=17754900;
break;
case 17701860 :
backward();
digitalWrite(13,HIGH);
Serial.println("ok 2");
lc=17701860;
break;
case 17734500 :
turnRight();
digitalWrite(13,HIGH);
Serial.println("ok 3");
lc=17734500;
break;
case 17718180 :
turnLeft();
digitalWrite(13,HIGH);
Serial.println("ok 4");
lc=17718180;
break;
case 4294967295 :
switch (lc){
case 17754900 :
forward();
digitalWrite(13,HIGH);
Serial.println("ok 1A");
break;
case 17701860 :
backward();
digitalWrite(13,HIGH);
Serial.println("ok 2B");
break;
case 17734500 :
turnRight();
digitalWrite(13,HIGH);
Serial.println("ok 3C");
break;
case 17718180 :
turnLeft();
digitalWrite(13,HIGH);
Serial.println("ok 4D");
break;
default:
digitalWrite(13,HIGH);
brake();
}
default:
brake();
digitalWrite(13,LOW);
}
digitalWrite(13,LOW);
irrecv.resume(); // Receive the next value
}
}
void forward()
{
digitalWrite(enableA,HIGH);
digitalWrite(pinA1, HIGH);
digitalWrite(pinA2, LOW);
digitalWrite(enableB,HIGH);
digitalWrite(pinB1, HIGH);
digitalWrite(pinB2, LOW);
}
void backward()
{
digitalWrite(enableA,HIGH);
digitalWrite(enableB,HIGH);
digitalWrite(pinA1, LOW);
digitalWrite(pinA2, HIGH);
digitalWrite(pinB1, LOW);
digitalWrite(pinB2, HIGH);
}
void turnLeft()
{
digitalWrite(enableA,HIGH);
digitalWrite(enableB,HIGH);
digitalWrite(pinB1, LOW);
digitalWrite(pinB2, HIGH);
digitalWrite(pinA1, HIGH);
digitalWrite(pinA2, LOW);
}
void turnRight()
{
digitalWrite(enableA,HIGH);
digitalWrite(enableB,HIGH);
digitalWrite(pinB1, HIGH);
digitalWrite(pinB2, LOW);
digitalWrite(pinA1, LOW);
digitalWrite(pinA2, HIGH);
}
void brake()
{
digitalWrite(enableA,LOW);
digitalWrite(enableB,LOW);
}
Kurze Erklärung:
Ich benutzte einen Infrarotempfänger um die einzelnen Befehle anzusteuern
Inder der ersten switch wird je nach Art der empfangen Zahl die passende Fahrfunktion aufgerufen
Kommt 4294967295 (kommt wenn eine Taste an der Fernbedienung länger gedrückt ist) wird der letzt empfangene Befehl aus geführt.
Es passiert: wenn die Zahl für Backward() kommt, fahren die Motoren einen kleinen Rucken rückwärts .
wenn die Zahl für turnLeft() oder turnRight() kommt ,bewegt sich nur ein Motorpaar kurz, eigentlich sollten beide Paare gegeneinander drehen.
wenn die Zahl für forward kommt passiert garnichts.
Wo ist/sind der/die Fehler?
Motortreiber: http://www.ebay.de/itm/Dual-H-Brucke-L298N-DC-Modul-Stepper-Motor-Driver-Controller-Brett-fur-Arduino-/261244330352?pt=Bauteile&hash=item3cd3602170
Chassis und Motoren: Sainsmart 4wd Robot Plattform