Code:
/* ========================================================================== */
/* */
/* Linienfolger mit Arduino Pro Mini und Tamiya Chassis & Antrieb */
/* */
/* ========================================================================== */
/* */
/* tamiya_lf.c */
/* (c) 2013 Gerhard Hinze */
/* */
/* Beschreibung: */
/* Tamiya Chassis und Ketten Antrieb als Lininienfolger */
/* (auch als Radmodell verwendbar ) */
/* */
/* ========================================================================== */
/* verwendetete Tamiya Baugruppen : */
/* ========================================================================== */
/* */
/* 1x Double Gear-Box ITEM 70168 */
/* 1x Universal-Plate Set ITEM 70098 */
/* 1x Universal-Plate Set ITEM 70157 *) */
/* 1x TRUCK and Wheel Set ITEM 70100 */
/* 1x Truck Tire Set ITEM 70101 *) */
/* */
/* ========================================================================== */
/* */
/* Pololu Ball Caster 3/8" m. Kunststoffkugel *) */
/* */
/* *) je nach Bedarf (als Radmodell, andere Erweiterungen usw..) */
/* ========================================================================== */
/* */
/* Elektrische Komponenten: */
/* ========================================================================== */
/* Arduino Pro Mini 5V/16-MHz */
/* FETB6612 Miniatur - Motortreiber von robotikhardware.de */
/* 2 x TCRT5000 Optosensor (Linienfolger) Eigenbaumodul */
/* 1 Batteriehalter für 3xAA 1,5V als Motorspannung */
/* Batterieblock 9V mit Anschluss Clip, (f.Elektronikspannung) */
/* Baustein mit LS7805, als 5V Regelung U-Betr. für Elektronik, Eigenbau */
/* */
/* ========================================================================== */
/* */
/* Beschreibungen unter http://robot.oderlachs.de */
/* */
/* ========================================================================== */
/* */
/* #include usw... */
/* */
/* ========================================================================== */
/* */
/* Bezeichnung Pin Arduino Erklaerung zur Bezeichnung */
/* */
/* ========================================================================== */
#define M1_SPEED 5 // Motor left Speed
#define M2_SPEED 6 // Motor right Speed
#define AIN_1 4 // Motordirektion 1_1
#define AIN_2 7 // Motordirektion 1_2
#define BIN_1 8 // Motordirektion 2_1
#define BIN_2 9 // Motordirektion 2_2
#define STANDBY 10 // Motordriver Standby(ON)) = LOW
#define IRS_LEFT 14 // IR Linien Sensor left, analog Eingang A0
#define IRS_RIGHT 15 // IR Linien Sensor right, analog Eingang A1
#define LED_1 12 // IRS left = LOW
#define LED_2 13 // IRS right = LOW
#define BUMP_L 16 // Frontkollosion left
#define BUMP_R 17 // Frontkollosion right
#define INT_0 2 // External Interrupt 0
#define INT_1 3 // External Interrupt 1
/* ========================================================================== */
/* Änderungen bei Verwendung der L298 Dual Bridge ( Bodo ) */
/* ========================================================================== */
/* #define STANDBY 10 Motordriver Standby entfällt, also "//" davor */
/* */
/* alle Codezeilen mit STANDBY im Programm-CODE sind zu löschen! */
/* */
/* ========================================================================== */
/* die 4 oberen #define ( AIN_1..., AIN_2, BIN_1, BIN_2 ) */
/* sind hiermit zu ersetzen : */
/* */
/* #define IN_1 4 // Motordirektion 1_1 */
/* #define IN_2 7 // Motordirektion 1_2 */
/* #define IN_3 8 // Motordirektion 2_1 */
/* #define IN_4 9 // Motordirektion 2_2 */
/* */
/* #define EN_A 5 // vorher M1_SPEED Motor left Speed */
/* #define EN_B 6 // vorher M2_SPEED Motor right Speed */
/* */
/* Die nun anderen #define-Variablennamen sind im Code */
/* dementsprechend zu aendern, Suchen/Ersetzen funktion verwenden */
/* */
/* ========================================================================== */
/* Werte der Variablen voreinstellen im Hex-Format */
/* ========================================================================== */
#define SPEED_NULL 0x00 // Speed Wert NULL
#define SPEED_MAX 0xFF // Speed Wert Maximum
#define SPEED_HALF 0x80 // Speed Wert halbeKraft
#define SPEED_KURV 0xC8 // Speed Wert für Kurvenfahrt (opt. Wert ermitteln)
#define IRS_OFFSET 0x00 // optm. Wert ermitteln, Speed = Speed - IRS_OFFSET
/* ========================================================================== */
/* IRS_OFFSETT : */
/* Befinden sich beide Sensoren über den schwarzen Streifen, sind */
/* beide IRS Ausgänge auf HIGH, schaltet einer der Sensoren auf LOW, d.h. Ab- */
/* weichung von der Mitte, wird jeweils der Motorspeed der anderen Seite um */
/* den IRS_OFFSETT Wert vermindert. Experimentell zu ermitteln 0x00...0x80 */
/* */
/* ========================================================================== */
void setup()
//
{
pinMode(M1_SPEED,OUTPUT);
pinMode(M2_SPEED,OUTPUT);
pinMode(AIN_1,OUTPUT);
pinMode(AIN_2,OUTPUT);
pinMode(BIN_1,OUTPUT);
pinMode(BIN_2,OUTPUT);
pinMode(LED_1,OUTPUT);
pinMode(LED_2,OUTPUT);
pinMode(STANDBY,OUTPUT);
pinMode(IRS_LEFT,INPUT);
pinMode(IRS_RIGHT,INPUT);
pinMode(BUMP_L,INPUT);
pinMode(BUMP_R,INPUT);
digitalWrite(STANDBY,HIGH);
}
void m1_forw() // Motor 1 (left) forward
{
digitalWrite(AIN_1, LOW);
digitalWrite(AIN_2, HIGH);
}
void m1_rew() // Motor 1 (left) reverse
{
digitalWrite(AIN_1, HIGH);
digitalWrite(AIN_2, LOW);
digitalWrite(STANDBY, HIGH);
}
void m2_forw() // Motor 2 (right) forward
{
digitalWrite(BIN_1, LOW);
digitalWrite(BIN_2, HIGH);
digitalWrite(STANDBY, HIGH);
}
void m2_rew() // Motor 2 (right) reverse
{
digitalWrite(BIN_1, HIGH);
digitalWrite(BIN_2, LOW);
digitalWrite(STANDBY, HIGH);
}
void stopp() // Motor 1 + 2 stopp
{
digitalWrite(STANDBY, LOW);
analogWrite(M1_SPEED, 0x00);
analogWrite(M2_SPEED, 0x00);
}
void speed(int m1, int m2) // Speed Motor 1 und 2
{
analogWrite(M1_SPEED, m1);
analogWrite(M2_SPEED, m2);
}
void coll_l() // Collosion left
{
stopp();
delay(500);
m2_rew();
speed(0,SPEED_KURV);
delay(500);
stopp();
}
void coll_r() // Collosion right
{
stopp();
delay(500);
m1_rew();
speed(SPEED_KURV,0);
delay(500);
stopp();
}
void coll_c() // Collosion center
{
stopp();
delay(500);
m1_rew();
m2_rew();
speed(SPEED_HALF,SPEED_HALF);
delay(500);
stopp();
}
void brake_l() // Bremse left
{
;
}
void brake_r() // Bremse right
{
;
}
void loop()
// Ab hier wird "gearbeitet ;)"
{
m1_forw(); // Motor1(links) vorwärtz
m2_forw(); // Motor2(rechts) vorwärtz
digitalWrite(STANDBY, HIGH); // Motortreiber aus denm Standby aufwecken
speed(SPEED_MAX,SPEED_MAX); // Beide Motoren mit 255 ansteuern: 0xFF
}
Lesezeichen