Ardu-Megatank, ein Roboterkettenfahrzeug Projektvorstellung (In Progress)

Hallo, das hört sich wirklich interessant an!
Mit was für einer Fernbedienung steuerst du ihn?
Einer R/C Fernbedienung? iPhone?

Viele Grüße
Florian

Die Basis des Roboters

Dieses RC Panzermodel im Maßstab 1:16 dient als Basis für den Bau des Roboters.
Es handelt sich dasbei um das Model eines M1A2 Abrams, Khaki farben.
Dieser wurde schwarz umlakiert und sein Turm entfernt.
Er handelt vollkommen autonom und wird nicht ferngesteuert.

Die Beleuchtung

Die Beleuchtung besteht aus 2 Scheinwerfern (5mm Leds), Bremslicht (5mm Leds), Blinker (5mm Leds) und orange Signallichter (3mm und 5mm Leds).

Dies ist die Lichtsteuerung, ein Atmega328 und ein TLC5940NT.
Gesteuert wird die Lichtsteuerung durch den Sanguino über I2C.

Die Notwendigkeit für den Einschalten der Scheinwerfer wird durch die Umgebungshelligkeitmessung eines
LDR bestimmt.

Die LED's und dehren Kabel wurden mit Heisskleber befestigt.

Im Anhang befindet sich das PCB-Platinenlayout der Beleuchtungssteuerung für DipTrace, desweiteren der I2C-Master und I2C-Slave Sketch der Steuerung (Final Status).

Schematik: http://tlc5940arduino.googlecode.com/svn/wiki/images/breadboard-arduino-tlc5940_close.png

TLC Einzeln.dip (40.3 KB)

Ardu_Megatank_Beleuchtung.zip (3.02 KB)

Sehr schön, gefällt mir echt super.

Was kann der Arm gewichtsmäßig tragen/bewegen?

Die zentrale Steuerung, KI-Zentrum

Das Gehirn des Roboters bildet ein Sanguino mit einem Atmega644.
Der jederzeit durch einen Atmega1284 mit doppelter Speicherkapazität ersetzt werden kann.

Als Bootloader wird der BT Arduino Bootloader verwendet:
https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/brewtroller/BTArduino-0021-Win,r619.zip

Für die Stromversorgung werden zwei L4940V5 und ein LF33CV verwendet.
Beide 'VERY LOW DROP' Spannungsregler.

Die Lagesensorik

Dafür wird eine MPU9250 verwendet.

Damit der Roboter später auch weis wie schräg er in der Landschaft herumsteht !

Die Umgebungssensoren

PIR, Ultraschall- und Infrarotsensoren zur Entfernungsmessung.
Ein LDR zur Umgebungshelligkeitsmessung für die Scheinwerfersteuerung.

Mit diesen Sensoren tastet der Roboter seine Umgebung ab.

Benutzt werden 2 Ultraschallsensoren für die Vorwärtsfahrt und ein Infrarotsensor für die Rückwärtsfahrt.

2 Infrarotsensoren sind unterhalb des Panzer angebracht, sie dienen als FALL AVOIDING Sensoren.
Durch diese kann der Panzer sogar auf einer Tischplatte fahren ohne das die Gefahr des herunterfallens an der Tischkante besteht.

Auf jeder Seite des Panzers werden 3 Infrarotsensoren benutzt.

Ein PIR Sensor dient im GUARD-Modus des Panzers zur Bewegungswahrnehmung von Lebewesen.

Der Motortreiber

Die Basis der beiden Motortreiber ist der TLE5206:


Bei der blauen Farbe der Spannungsregler handelt es sich um 'Teslanol Schutz- und Isolationslack'.

Die Schaltung ist so ausgelegt das der TLE mehr Amper liefern kann als der Motor benötigt und der Spannungsregler kann mehr Amper liefern als der TLE benötigt !

Zu jedem Motortreiber gehört ein ACS712 Current Sensor, 20A Version, der zwischen Motor und Motortreiber geschaltet wird.

Da die Motortreiber für das Innenleben des Panzers zu gross sind werden diese ausserhalb des Panzers befestigt !
Zum Schutz vor der Umwelt befinden sich die Motortreiber jedoch jeder in einem separaten Gehäuse, aus diesem Grund werden Sie um eine aktive Kühlung erweitert.
Ein Atmega8 wird durch einen DS18B20 die Temperatur messen und gegebenenfalls zwei 5V Lüfter einschalten.
Einer an der Front des Motortreibergehäuses und einen am Deckel.
Der vordere saugt frische Luft ins Gehäuse und der obere drückt die Luft aus dem Gehäuse.


![](http://i.ebayimg.com/00/$(KGrHqUOKjkE1v7w!ogyBNjN4yLudw~~_35.JPG)

Alle Streifenrasterplatinen die in diesem Projekt benutzt werden sind reine Prototypen und werden später durch prof. gefertigte Platinen ersetzt ! Leiterplatenservice !

In den zwei grossen Gehäusen sind die Motortreiber eingebaut:

Die Programmierung des Motortreibers

Ein TLE5206 Motortreiber Sketch ohne Geschwindigkeitssteuerung:

// Motorsteuerung ohne Geschwindigkeitsregelung !
void setup()
{
  pinMode(5, OUTPUT);  // Linker Kettenantrieb (Motortreiber 1 - IN1)
  pinMode(6, OUTPUT);  // (Motortreiber 1 - IN2)
  pinMode(10, OUTPUT); // Rechter Kettenantrieb (Motortreiber 2 - IN1)
  pinMode(11, OUTPUT); // (Motortreiber 2 - IN2)
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
}

void loop()
{
  digitalWrite(5, LOW);   // Vorwärts
  digitalWrite(6, HIGH);
  digitalWrite(10, LOW);  // Vörwärts
  digitalWrite(11, HIGH);
  delay(10000);
  digitalWrite(5, LOW);  // Stop
  digitalWrite(6, LOW);
  digitalWrite(10, LOW); // Stop
  digitalWrite(11, LOW);
  delay(2000);
  digitalWrite(5, HIGH);  // Rückwärts
  digitalWrite(6, LOW);
  digitalWrite(10, HIGH); // Rückwärts
  digitalWrite(11, LOW);
  delay(10000);
  digitalWrite(5, LOW);  // Stop
  digitalWrite(6, LOW);
  digitalWrite(10, LOW); // Stop
  digitalWrite(11, LOW);
  delay(2000);
}

Ohne Geschwindigkeitssteuerung müssen die Arduino Pins welche mit IN1 und IN2 der Motortreiber verbunden werden nicht PWM fähig sein !
Die Motoren drehen sich hierbei immer mit der Höchstgeschwindigkeit !

Ein TLE5206 Motortreiber Sketch mit Geschwindigkeitsregelung:

// Motorsteuerung mit Geschwindigkeitsregelung !!!
// 255 = Stllstand, 1 = Höchstgeschwindigkeit
// 150 ist der Mindestwert, da die Motoren des Panzers sonst nicht anlaufen !!!

#define Motortreiber1_IN1_Pin 5  // PWM
#define Motortreiber1_IN2_Pin 6  // PWM
#define Motortreiber2_IN1_Pin 10 // PWM
#define Motortreiber2_IN2_Pin 11 // PWM

byte Speed;

void setup()
{
  pinMode(Motortreiber1_IN1_Pin, OUTPUT);  // Linker Kettenantrieb (Motortreiber 1 - IN1)
  pinMode(Motortreiber1_IN2_Pin, OUTPUT);  // (Motortreiber 1 - IN2)
  pinMode(Motortreiber2_IN1_Pin, OUTPUT); // Rechter Kettenantrieb (Motortreiber 2 - IN1)
  pinMode(Motortreiber2_IN2_Pin, OUTPUT); // (Motortreiber 2 - IN2)
  digitalWrite(Motortreiber1_IN1_Pin, LOW);
  digitalWrite(Motortreiber1_IN2_Pin, LOW);
  digitalWrite(Motortreiber2_IN1_Pin, LOW);
  digitalWrite(Motortreiber2_IN2_Pin, LOW);
}

void loop()
{  
  for (Speed = 150; Speed >= 1; Speed--) // Muss mindestens 1 sein, sonst läuft Motor nicht mehr an !!!
  {
    analogWrite(Motortreiber1_IN1_Pin, Speed);
    digitalWrite(Motortreiber1_IN2_Pin, HIGH);  // Linker Kettenantrieb vorwärts
    analogWrite(Motortreiber2_IN1_Pin, Speed);
    digitalWrite(Motortreiber2_IN2_Pin, HIGH); // Rechter Kettenantrieb vorwärts
    delay(200);
  }
  delay(1000);
  analogWrite(Motortreiber1_IN1_Pin, 255);   // Linker Kettenantrieb stop
  digitalWrite(Motortreiber1_IN2_Pin, HIGH);
  analogWrite(Motortreiber2_IN1_Pin, 255);  // Rechter Kettenantrieb stop
  digitalWrite(Motortreiber2_IN2_Pin, HIGH);
  delay(2000);
  
  for (Speed = 150; Speed >= 1; Speed--) // Muss mindestens 1 sein, sonst läuft Motor nicht mehr an !!!
  {
    digitalWrite(Motortreiber1_IN1_Pin, HIGH);
    analogWrite(Motortreiber1_IN2_Pin, Speed);  // Linker Kettenantrieb rückwärts
    digitalWrite(Motortreiber2_IN1_Pin, HIGH);
    analogWrite(Motortreiber2_IN2_Pin, Speed); // Rechter Kettenantrieb rückwärts
    delay(200);
  }
  delay(1000);
  digitalWrite(Motortreiber1_IN1_Pin, HIGH);
  analogWrite(Motortreiber1_IN2_Pin, 255);    // Linker Kettenantrieb stop
  digitalWrite(Motortreiber2_IN1_Pin, HIGH);
  analogWrite(Motortreiber2_IN2_Pin, 255);   // Rechter Kettenantrieb stop
  delay(2000);
}

Bei der Benutzung der Geschwindigkeitssteuerung müssen die Arduino Pins welche mit IN1 und IN2 der Motortreiber verbunden werden auf jeden Fall alle PWM fähig sein !
Es ist vom Minimum bis zum Maximum eine stufenlose Geschwindigkeitsregelung möglich !

Ein Video des ersten Test der beiden Motortreiber:

Die Geschwindigkeitsanzeige

Der Panzer hat vorne links und vorne rechts jeweils eine Ledbar montier für die Anzeige der vorwärts und rückwarts Fahrgeschwindigkeit.
3 Felder Rot, 7 Felder Grün.
Rot für rückwärts und grün für vorwärts.

Angesteuert werden beide Ledbars durch einen TLC5947.

Die Stromversorgung, unterer Panzerbereich

Stromversorgung der Logik und Sensoren.

Die Stromversorgung des unteren Panzerbereiches besteht aus zwei L4940 5V und einem LF33CV Spanungsregler.
Gespeist werden diese aus 8 Mignon-Akkus mit je 2700mAh, nur der Lüfter im unteren Panzerbereich wird direkt mit der Akkuspannung betrieben.
Die Spannung der Akkus wird während des Betriebes durch einen Voltage Sensor überwacht.

Über eine Ladebuchse im hinteren Panzerbereich können die Akkus direkt im Panzer selber geladen werden.
Dazu wird ein 8 Zellen Ladegerät aus dem RC-Bereich benutzt, der Ansmann Powerjack 8 Delta.

Im unteren Panzerbereich, zwischen der Stromversorgung und den beiden Motoren, befindet sich eine Lüftersteuerung welche über einen DS18B20 die Innentemperatur des Panzers überwacht und einen 12V Radiallüfter steuert.
Dieser wird beim Überschreitten einer vorgegebenen Temperatur (30°C) eingeschaltet und läuft solange bis das Innere des Panzers eine gewisse Mindestabkühlung (25°C) erreicht hat.
Den Kern der Lüftersteuerung bildet ein Arduino Pro Mini Enhancement:
![](http://i.ebayimg.com/t/Pro-Mini-Enhancement-3-3V-5V-adjustable-16MHz-MEGA328P-Arduino-compatible-/00/s/NjAwWDYwMA==/$(KGrHqJHJEEE-njyti9OBPvEJDDZig~~60_35.JPG)

Im Anhang befindet sich der Steuerungssketch, das PCB-Layout und der Schaltplan.
Das Layout und der Schaltplan wurden mit DipTrace entwickelt (Final Status).


Lueftersteuerung.zip (2.06 KB)

Panzerunterteil Lüftersteuerung.dip (37.4 KB)

Panzerunterteil Lüftersteuerung.dch (14.7 KB)

Die Stromversorgung, oberer Panzerbereich

Stromversorgung der Motortreiber, der Beleuchtung und des Roboterarms.

Die Spannung der Akkus wird während des Betriebes durch einen Voltage Sensor überwacht.

In diesen beiden Batteriefächern, jedes fasst 6 Batterien, werden 12 Sanyo Mignon-Akkus mit je 2700mAh benutzt:

Die Batteriefächer im angebauten Zustand:

Als Ladegerät wird ein Turningy Accucel 6 benutzt:

Die Stromversorgungsplatine im oberen Panzerbereich wird komplett aus SMD Bauteilen gefertigt werden.
Sie wird einen 5V 3A Spannungsregler und einen 6V 5A Spannungsregler enthalten.

Die Sprachausgabe

Die Sprachausgabeeinheit besteht aus dem Speakjet, einem TTS256 und einem 2 X 3W 4Ohm Class D Verstärker.
Der Verstärker besitzt einen PAM8803 Amplifier IC.

![](http://i.ebayimg.com/t/Mini-2-3W-4-PAM8803-Class-D-Audio-Amplifier-Board-For-PIC-AVR-/00/s/MTAwMFgxMDAw/$(KGrHqRHJDgE+BK88n6cBPw4h3!o,Q~~60_35.JPG)

Hier der Link zur audio Aufzeichnung vom Speakjet:
http://imageshack.us/clip/my-videos/195/hhu.mp4/

Im Anhang befindet sich der I2C-Master und der I2C-Slave Sketch der Sprachausgabeeinheit (Final Status).

Ardu_Megatank_Sprachausgabe.zip (3.23 KB)

Ich finde gut, dass du deine Projekte hier dokumentierst. Dein letztes Posting finde ich aber fehl am Platze, kannst du nicht das Startposting wie ein Inhaltsverzeichnis gestalten, dass man jeweils zum interesseerweckenden Eintrag kommst? Hast du ja schon ganz systematisch geordnet. Und wenn sich etwas neues ergibt, kann man das in der Inhaltsliste ja irgendwie als !!!NEU!!! deklarieren. :wink:

Die Uhr, RTC DS1307

Dies ist das Uhrenmodul des Roboters:
![](http://i.ebayimg.com/t/RTC-I2C-DS1307-AT24C32-Real-Time-Clock-Module-For-Arduino-AVR-ARM-PIC-/00/s/NTY2WDU2Ng==/z/18cAAOxy9eVRUXB8/$T2eC16NHJHoE9n3Kd2kKBRU(B8PoCQ~~60_35.JPG)
Mit der oberen Stiftleiste wird das Modul mit der MCU verbunden, an die untere kann ein weiterer I2C Teilnehmen angeschlossen werden.
An der unteren Stiftleiste ist auch das 'SQUARE-WAVE OUT' (SO) Signal des DS1307 zugänglich, DS ist das Signal des optional einbaubarem Thermometers DS18B20.

Ein Sketch zum stellen der Uhrzeit:

/*Reads the value from a Real Time Clock (RTC) DS1307 and displays it in the serial monitor
 *
 *Created by D. Sjunnesson 1scale1.com d.sjunnesson (at) 1scale1.com
 *
 *Created with combined information from 
 *http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1180908809
 *http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1191209057
 *
 *
 *Big credit to  mattt (please contact me for a more correct name...) from the Arduino forum 
 *which has written the main part of the library which I have modified
 *
 */

#include <WProgram.h>
#include <Wire.h>
#include <DS1307.h> // written by  mattt on the Arduino forum and modified by D. Sjunnesson

void setup()
{
  Serial.begin(9600);

  RTC.stop();
  RTC.set(DS1307_SEC,0);        //set the seconds
  RTC.set(DS1307_MIN,43);     //set the minutes
  RTC.set(DS1307_HR,0);       //set the hours
  RTC.set(DS1307_DOW,1);       //set the day of the week
  RTC.set(DS1307_DATE,1);       //set the date
  RTC.set(DS1307_MTH,7);        //set the month
  RTC.set(DS1307_YR,12);         //set the year
  RTC.start();
}

void loop()
{
  Serial.print(RTC.get(DS1307_HR,true)); //read the hour and also update all the values by pushing in true
  Serial.print(":");
  Serial.print(RTC.get(DS1307_MIN,false));//read minutes without update (false)
  Serial.print(":");
  Serial.print(RTC.get(DS1307_SEC,false));//read seconds
  Serial.print("      ");                 // some space for a more happy life
  Serial.print(RTC.get(DS1307_DATE,false));//read date
  Serial.print("/");
  Serial.print(RTC.get(DS1307_MTH,false));//read month
  Serial.print("/");
  Serial.print(RTC.get(DS1307_YR,false)); //read year 
  Serial.println();
  Wire.beginTransmission(1); 
  Wire.send(DS1307_HR);
  Wire.send(DS1307_MIN);
  Wire.endTransmission();  
}

Ein Sketch zur Ausgabe der Uhrzeit über das Terminal:

/*Reads the value from a Real Time Clock (RTC) DS1307 and displays it in the serial monitor
 *
 *Created by D. Sjunnesson 1scale1.com d.sjunnesson (at) 1scale1.com
 *
 *Created with combined information from 
 *http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1180908809
 *http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1191209057
 *
 *
 *Big credit to  mattt (please contact me for a more correct name...) from the Arduino forum 
 *which has written the main part of the library which I have modified
 *
 */

#include <WProgram.h>
#include <Wire.h>
#include <DS1307.h> // written by  mattt on the Arduino forum and modified by D. Sjunnesson

void setup()
{
  Serial.begin(9600);
}

void loop()
{

  Serial.print(RTC.get(DS1307_HR,true)); //read the hour and also update all the values by pushing in true
  Serial.print(":");
  Serial.print(RTC.get(DS1307_MIN,false));//read minutes without update (false)
  Serial.print(":");
  Serial.print(RTC.get(DS1307_SEC,false));//read seconds
  Serial.print("      ");                 // some space for a more happy life
  Serial.print(RTC.get(DS1307_DATE,false));//read date
  Serial.print("/");
  Serial.print(RTC.get(DS1307_MTH,false));//read month
  Serial.print("/");
  Serial.print(RTC.get(DS1307_YR,false)); //read year 
  Serial.println();
  Wire.beginTransmission(1); 
  Wire.send(DS1307_HR);
  Wire.send(DS1307_MIN);
  Wire.endTransmission();  
}

Die I2C Kommunikation

Manche der Bauteile die im Roboter verwendet werden kommunizieren über I2C.
RTC DS1307, MPU9250 9-Axis Gyro.

Dabei ist jedoch zu beachten das der DS1307 I2C 5V benötigt, die MPU9250 hingegen I2C 3,3V.

Hier kommt ein sogenanntes I2C Level Conversion Modul zum Einsatz:

Dieses Modul convertiert die 5V I2C Signale zu 3,3V I2C Signale und umgekehrt !

Der Temperatursensor

Im Inneren des Panzers befindet sich zwischen den Spannungsreglern und den Motoren ein DS18B20 Temperatursensor.

Die Programmierung der KI

Durch dieses Modul, welches in die Rückseite des Panzers eingebaut ist, kann der Sanguino über USB programmiert werden:

Die KI

Sketch kommt noch !

VFD sind zwar sehr schön, verbrauchen aber gegenüber LCD mit Hintergrundbeleuchtung sehr viel mehr Strom. (um die 5W)
Grüße Uwe