Tamiya Linienfolger entsteht...
Nachdem ich einiges im Web gesehen hatte, wie man mit Tamiya Baugruppen auch Roberter bauen kann, habe ich mich auch dazu entschlossen.
Durch die Tatsache nur Online kaufen zu können, weil nächster Händler fast 100km weiter ist, ist es natürlich auch um einiges schwieriger ,gleich das Passende zu finden, bzw. noch Fehlendes nachzukaufen.
Verwenden tue ich eine Grundplatte, Kettenantrieb und Doppelgetriebebox von Tamiya. Der SteuerComputer ist ein Arduino Pro Mini (5v/16Mhz), die Motoren werden von einem Pololu MiniMotortreiber gesteuert. Ein Selbstbau Liniensensor und 4 Taster an der Roboterfront, sorgen für die Steuerung der Fahrtrichtungs- bzw. Kollosionserkennung.
Hier einige Fotos von meinem Baugeschehen (wird lfd erneuert)
Für verbessernde Hinweise bin ich Euch allen dankbar.
Der Arduino-Code wird demnächst vorgestellt
Gerhard
Arduino-Code ( Entwurf, unfertig)
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
}