PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mein erster "Mehrebenen" Roboter



Che Guevara
11.10.2009, 20:07
Hallo Freunde,

an dieser Stelle möchte ich nun meinen ersten Roboter vorstellen, der insgesamt aus 4 Ebenen besteht. Ich finde das sehr praktisch, da es gut aussieht und man das ganze jederzeit um ein paar Ebenen erweitern kann. Die einzelnen Ebenen sind alle aus 3mm starkem Plexiglas "freihändig" ausgeschnitten, deshalb sitzen sie nicht richtig übereinander, aber wenn ich einmal Zeit habe, werde ich mir etwas überlegen, wie ich die Teile schön gleichmäßig rund ausschneiden kann. An dieser Stelle sind natürlich Anregungen sehr erwünscht.
Hier nun die Funktionen der Ebenen (von unten):

1. Ebene: an der Unterseite das Tamya Twin-Motorset und oben der
Motortreiber
2. Ebene: der Slave-Controller, ein Atmega32 (läuft mit 16MHz)
3. Ebene: der Master-Controller, ein Atmega644P (läuft ebenfalls mit 16MHz)
4. Ebene: an der Unterseite die kleine Stromversorgungsplatine, mit einem L7805, einem L7806 und einer Verpolschutzdiode und diversen Elkos, usw. . ; und an der Oberseite ein Display (4*20 mit grüner Hintergrundbeleuchtung), ein SRF02 und ein GP2D12

Die beiden Controller kommunizieren über RS232 miteinander. Wie sind alle Periphergeräte angeschlossen (und wo)?

am Atmega644P: LCD, Motoren
am Atmega32: GP2D12, SRF02 (über RS232)

Folgendes habe ich mit dem "Kleinen" noch vor:
- Linienverfolgung mittels 3 CNY70
- Schallortung über 3 Mikrophone
- Drehzahlmessung zur Geradeausfahrt mittels PID-Regler (wahrscheinlich)
- Funkverbindung mit PC herstellen (entweder über RFM12 oder Easy Radio)

Das wichtigste jedoch ist zur Zeit die Drehzahlmessung. Wenn jemand Anregungen dazu hat oder auch zu anderen geplanten Erweiterungen, dann nur raus damit :-)

Hier nun die beiden Codes.
Atmega644P


$regfile = "m644pdef.dat"
$crystal = 16000000
$baud = 19200
$framesize = 140
$hwstack = 140
$swstack = 140


Declare Sub Serial0charmatch()
Declare Sub Direction(byval Direction_motors As String , Byval Pwm_left As Word , Byval Pwm_right As Word)


Config Serialin = Buffered , Size = 30 , Bytematch = 13


Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.2 = Output
Config Portb.3 = Output
Config Portd.4 = Output
Config Portd.5 = Output
Portb.0 = 0
Portb.1 = 0
Portb.2 = 0
Portb.3 = 0

Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
Config Lcdbus = 4
Initlcd
Cls
Cursor Off Noblink

Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 8
Pwm1a = 0
Pwm1b = 0

Config Timer0 = Timer , Prescale = 1024
Timer0 = 150
On Timer0 Isr_von_timer0
Enable Timer0

Dim J As Byte
Dim Tmp As Byte
Dim Lenght As Byte
Dim Timer_counter As Byte
Dim Ar(6) As String * 30
Dim Input_command As String * 30
Dim Distance_srf02 As Integer
Dim Distance_gp2d12 As Integer
Dim Start_flag As Bit
Dim Distance_limit As Byte

Start_flag = 0
Distance_limit = 50


Locate 1 , 1
Lcd "MEGA644P - Master"
Locate 2 , 1
Lcd "MEGA32 - Slave"
Locate 3 , 1
Lcd "SRF02 / GP2D12"
Locate 4 , 1
Lcd "MOTOR-PLATINE"
Wait 2
Cls


Enable Interrupts


Do


If Start_flag = 1 Then
If Distance_gp2d12 <= Distance_limit Or Distance_srf02 <= Distance_limit Then
Call Direction( "left" , 480 , 600)
Waitms 10
Else
Call Direction( "vorward" , 580 , 700)
End If
End If


Loop

End


Sub Direction(byval Direction_motors As String , Byval Pwm_left As Word , Byval Pwm_right As Word)
If Pwm_left >= 800 Then Pwm_left = 800
If Pwm_right >= 800 Then Pwm_right = 800
Pwm1a = Pwm_right
Pwm1b = Pwm_left
Select Case Direction_motors
Case "vorward"
Portb = &B00000101
Case "right"
Portb = &B00001001
Case "left"
Portb = &B00000110
Case "backward"
Portb = &B00001010
Case "stop"
Portb = &B00000000
Case Else
Portb = &B00000000
End Select
End Sub


Sub Serial0charmatch()
Input Input_command Noecho
Input_command = Lcase(input_command)
If Asc(input_command) = 10 Then
Lenght = Len(input_command)
Lenght = Lenght - 1
Input_command = Right(input_command , Lenght)
End If
Tmp = Split(input_command , Ar(1) , ":")
Input_command = ""
Cls
If Ar(1) = "mega32" Then
Locate 1 , 1
Lcd Ar(1) , " "
Locate 2 , 1
Lcd Ar(2) , " "
Locate 3 , 1
Lcd Ar(3) ; " cm SRF02"
Locate 4 , 1
Lcd Ar(4) ; " cm GP2D12"
Distance_srf02 = Val(ar(3))
Distance_gp2d12 = Val(ar(4))
End If
Start_flag = 1
For J = 1 To Tmp
Ar(j) = ""
Next J
End Sub

Isr_von_timer0:
Timer0 = 150
Incr Timer_counter
If Timer_counter = 50 Then
Timer_counter = 0
Print "mega32:distance"
End If
Return


Atmega32


$regfile = "m32def.dat"
$crystal = 16000000
$baud = 19200
$framesize = 150
$hwstack = 150
$swstack = 150


Declare Function Srf02_entfernung(byval Slaveid As Byte) As Integer
Declare Sub Serial0charmatch()
Declare Function Gp2() As Integer


Open "COMB.0:9600,8,N,2" For Input As #2
Open "COMB.1:9600,8,N,2" For Output As #1


Config Serialin = Buffered , Size = 25 , Bytematch = 13

Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc

Config Pina.0 = Input
Porta.0 = 0

Const Srf02_slaveid = 0

Dim Distance_srf02 As Integer
Dim Distance_gp2d12 As Integer
Dim Distance_gp2d12_array(4) As Integer
Dim Ab As Single
Dim J As Byte
Dim I As Byte
Dim Tmp As Byte
Dim Lenght As Byte
Dim Input_command As String * 25
Dim Ar(5) As String * 25

Dim D As Single
Dim X As Word
Dim Xi(3) As Word
Dim Volt As Single
Const A = 24.93
Const B = 0.0695
Const Ref = 5 / 1023



Enable Interrupts

Distance_srf02 = Srf02_entfernung(srf02_slaveid)
Distance_gp2d12 = Gp2()


Do

!nop

Loop

End


Sub Serial0charmatch()
Input Input_command Noecho
Input_command = Lcase(input_command)
If Asc(input_command) = 10 Then
Lenght = Len(input_command)
Lenght = Lenght - 1
Input_command = Right(input_command , Lenght)
End If
Tmp = Split(input_command , Ar(1) , ":")
Input_command = ""
If Ar(1) = "mega32" Then
If Ar(2) = "distance" Then
Distance_srf02 = Srf02_entfernung(srf02_slaveid)
Distance_gp2d12 = Gp2()
Print "mega32:distance:" ; Distance_srf02 ; ":" ; Distance_gp2d12 , Noecho
End If
Else
Print "Unknown SLAVE"
End If
For J = 1 To Tmp
Ar(j) = ""
Next J
End Sub


Function Srf02_entfernung(byval Slaveid As Byte) As Integer
Local Lob As Byte
Local Hib As Byte
Print #1 , Chr(slaveid) ; Chr(84);
Inputbin #2 , Hib , Lob
Srf02_entfernung = Makeint(lob , Hib)
End Function

Function Gp2() As Integer
For I = 1 To 3
Xi(i) = Getadc(0)
Next I
X = Xi(1) + Xi(2)
X = X + Xi(3)
X = X / 3
If X >= 77 And X <= 650 Then
Volt = X * Ref
D = Volt - B
Ab = A / D
Gp2 = Ab
Else
Gp2 = 90
End If
End Function


Bilder folgen später noch, muss erst noch meine Digicam aufladen.

Ich bin natürlich über jede Anregung, Kritik aber auch Idee und Lob sehr erfreut.

Gruß
Chris

Edit:
Hier nun wie versprochen die Bilder (wenn jemand einen bestimmen Ausschnitt genauer sehen möchte, schreibt mir einfach)

Searcher
12.10.2009, 06:59
Hallo Che,

Gratulation zum erste Roboter. Ich finde erweiterbare, flexible Konzepte sehr gut. Die kann man schnell umbauen und bieten damit gute Möglichkeiten zum Experimentieren.

Kann es sein, daß ich da kein drittes Rad sehe? Die Metallstange unter den Akkus muß doch arg bremsem?


etwas überlegen, wie ich die Teile schön gleichmäßig rund ausschneiden kann
Ich hab mir folgende Spannvorrichtung dafür gemacht:
Ein möglichst dickwandiges Rohr, daß man noch in die Bohrmaschine eingespannt bekommt. Dazu eine längere Schraube, die möglichst genau in das Rohr paßt. Eine Mutter, passend zur Schraube, abgefeilt, so daß sie kleiner als der Außendurchmesser des Rohres ist, Unterlegscheibe.

Das Teil, daß mal rund werden soll möglichst genau mit Laubsäge ausschneiden, in das Zirkelloch des runden Teils ein Loch bohren, so daß das Rohr möglichst stramm da noch rein paßt. Das Rohr ins Loch schieben aber nicht ganz durchführen. Unterlegscheibe, Schraube und Mutter drauf und noch nicht festziehen. Das Ganze in die Bohrmaschine einspannen und mit der Schraube etwas festziehen. Bohrmaschine im Bohrständer oder mit Schraubzwinge festmachen. Bohrmaschine laufen lassen und mit Raspel/Feile/Schleifpapier rund schleifen.
https://www.roboternetz.de/phpBB2/album_pic.php?pic_id=2393 https://www.roboternetz.de/phpBB2/album_pic.php?pic_id=2394
Das ist auch nur ein Behelf aber funktionierte auch mit größeren Teilen wie auf dem Bild. Vielleicht kommen hier ja weitere Vorschläge, die mit ohne Kauf von teuren Maschinen verbunden sind. Dann hast Du zwar ein Loch in der Mitte, sollte aber nicht weiter stören? Alle Platten aufeinander legen, mit doppelseitigem Klebeband oder Schraubzwingen gegen Verrutschen sichern und die Löcher für die Gewindestangen gemeinsam durch alle Platten bohren.

EDIT: Hier gibt's auch was Rundes: https://www.roboternetz.de/phpBB2/viewtopic.php?p=425178#425178
Muß noch erwähnen, daß "meine" Methode aus der Notwendigkeit entstand, ein Loch mit genau dem Rohrdurchmesser zu haben. Die Einspannmethode mit Gewindestange nach o.g. Link ist viel praktischer.

Viel Erfolg weiterhin
Searcher

HannoHupmann
12.10.2009, 13:20
Gute Idee die Akkus senkrecht einzubauen, gefällt mir. Wenn alle 3 Platten gleich aussehen sollen, dann schraub sie vorher zusammen und säg sie auf einen rutsch gleichzeitig aus. Oder du machst dir eine Zeichnung und schickst die an den Horst Eltner von cnc Technik Landshut der fräst die dir dann aus einem Stück Dibond raus. Dann sind sie alle gleich, nur nicht durchsichtig. Achja mehr als 10€ würde das nicht kosten.

021aet04
12.10.2009, 14:02
Bei Plexi musst du immer beachten, damit es nicht warm wird, damit es nicht schmilzt. Am Besten ist es entweder mit Druckluft oder mit Wasser kühlen. Bei Wasser musst du aufpassen, wenn du mit E-Geräten arbeitest.

Che Guevara
12.10.2009, 14:29
Hallo Searcher,

vielen Dank für deine Antwort! Deinen Tipp finde ich auch sehr gut, tolle Idee :-) Ich werds mal probieren und melde mich dann wieder.
Also eigentlich war auf der Metallstange immer so ein kleines Gummiteil, das habe ich aber vor ein paar Tagen leider verloren!

Edit:
habe gerade erst die anderen zwei Antworten gesehen, tut mir leid! Das mit dem CNC ist wirklich ausgezeichnet und DER Preis?!?! Na da werd ich mich doch mal schlau machen!
Das Plexiglas ist mir beim schneiden des öfteren geschmolzen, aber glücklicherweise lässt es sich dann leicht brechen.

Wenn ich Neuigkeiten habe, melde ich mich wieder.

Gruß
Chris

Maxxtro
12.10.2009, 16:04
Hallo! Auch von mir Gratulation zu deinem Roboter! Sieht schon sehr gut aus!

Für die Drehzahlmessung gibts entweder einen Reedkontakt, eine Lichtschranke mit Decoderscheibe, oder wenns etwas aufwendiger werden darf einige schöne Sensoren von Austrianmicrosystems mit denen du teilweise sogar die Strecke auf µm genau messen könntest O:)

Aber ein Video zeigst du uns auch noch? Das mit den Fahrkünsten ist bei manchen ja immer so ne Sache *husthust* :mrgreen:

Grüße aus Passau,
Maxx

Bammel
12.10.2009, 16:19
hallo,

auch ich finde dein projekt toll.. bin ja auch gerade an meinem ersten richtigem dran. da hab ich die elektronik auhc modular aufgebaut das ist schon echt praktisch.

ich hab noch nen kleinen tip für dich:
und zwar sieht es auf den bildern so aus als wären die platten nicht alle parallel also die abstände auf den gewindestangen sind unterschiedlich. wenn du dir ein alu-rohr mit dem innendurchmesser von den gewindestangen besorgst und die alle gleichlang absägst kannst du die immer zwischen den ebenen stecken udn hast so automatisch ohne großes fummeln den selben abstand.

mfg Bammel

Che Guevara
12.10.2009, 17:31
Vielen Dank für das positive Feedback.
Eigentlich möchte ich einen CNY70 pro Rad für die Drehzahlmessung verwenden, aber ich weis noch nicht so genau, wie ich diesen befestigen soll.

Den Video link füge ich später noch per EDIT an, sobald es ins YOUTUBE hochgeladen ist.
@Bammel:
Ob du es glaubst oder nicht, die selbe Idee mit den Alu-Rohren hatte ich auch schon ;-) aber trotzdem danke für die wertvolle Idee.
Hast du schon einen Thread über deinen "kleinen Freund" eröffnet?? Wenn ja, könntest du mir mal den Link schicken, das interresiert mich nämlich sehr, vor allem, weil du ja eine ähnliche Technik wie ich benutzt.

Gruß
Chris

Bammel
12.10.2009, 18:29
Hallo,

nein habe noch keinen thread. soll aber die tage folgen. habe aber einen über die elektronik.

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=49911&highlight=

ich werde dich aber in kenntnis setzten wnen du interesse hast.

zu deinem problem mit dem CNY70 du könntest die räder seitlich mit weißer farben markieren. also eine quasie encoderscheibe aufmalen. und dnan den optokoppler von oben oder unten an das plexi kleben.

gruß bammel

Che Guevara
12.10.2009, 19:01
ja, wäre toll, wenn du mir bescheids gibst, evtl auch mit PN.

Das mit den Rädern anmalen hab ich mir schon mal durch den Kopf gehen lassen, aber
1. in Kombination mit dem Tamya Twin-Motorset haben sie ein seeeehr großes Spiel
2. Kleben möchte ich eigentlich vermeiden, also brauche ich eine andere Möglichkeit, die Optokoppler zu befestigen.

Gruß
Chris

Bammel
12.10.2009, 19:04
naja du optokoppler kannst dua uch per doppelseitigem klebeband befestigen. hatte ich so bei meinem eigenen cybot umbau geamcht aber mehr als das anbringen und nicht zufriedenstellenden ergebnis hab ich es dann verfallen lassen.

du könntst den koppler auch festschrauben... es gibt so aluprofile im baumarkt die wei eine schelle im querschnitt ist



__ __
|__|


nur wie willst du sonst eine odometrie aufbauen.. ansonsten musst du das twinset umbauen. evtl. wnen platz ist an dem motorende eine kleine encoderscheibe aus einer alten kugelmaus befestigen udn dann per gabellichtschranke.

Che Guevara
13.10.2009, 20:40
Sorry, dass ich mich jetzt erst melde, aber ich hatte sehr viel zu tun! *blödes G8*
Mittlerweile habe ich mir nicht so viele Gedanken um die Befestigung des Sensors gemacht, sondern viel mehr um das Programm selbst! Zu einem PID-Regler habe ich aber noch ein paar Fragen, vielleicht kann mir die ja jemand hier beantworten?

1. Sollte ich die PID-Wert berechnung in der Hautpschleife dauernd machen lassen, oder nur immer, wenn wieder der Sensor ausgelesen wird (also nach ta)??
2. Wie kann ich beide Motoren zum Synchronlauf "zwingen"? Also wie ich einen Motor auf einer const. Geschwindigkeit halte, das ist mir jetzt klar (auch wenn ich mir nicht sicher bin, ob ichs richtig umgesetzt habe).
3. Muss der Wert KPID_buffer (in meinem Beispiel) zum alten PWM-Wert addiert werden, also:


pwm1a = pwm1a + kpid_buffer

oder sollen die beiden miteinander multipliziert werden, also:


pwm1a = pwm1a * kpid_buffer

oder soll der PWM-Wert durch den KPID_buffer wert ersetzt werden, also:


pwm1a = kpid_buffer


Ich persönlich tendiere ja dazu, die Werte zu addieren, aber 100%ig sicher bin ich mir da nicht!
hier mal mein derzeitiger Code:


$regfile = "m32def.dat"
$crystal = 16000000
$hwstack = 150
$swstack = 150
$framesize = 150
$baud = 19200



Config Portc.0 = Output
Portc.0 = 0


Config Pind.2 = Input
Config Portd.4 = Output
Config Portd.5 = Output
Config Portb.0 = Output
Config Portb.1 = Output
Portb.0 = 1
Portb.1 = 0
Portd.2 = 1


Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 8
Pwm1a = 0
Pwm1b = 0

Config Timer2 = Timer , Prescale = 64
Timer2 = 6
On Timer2 Isr_von_timer2
Enable Timer2

Config Int0 = Rising
On Int0 Isr_von_int0
Enable Int0


Dim Abtastrate_flag As Byte
Dim Drehzahl_links As Word


'3
'10
'70

Const Kp = 1.2 '0.5
Const Ki = 0 '0.6
Const Kd = 0


Dim Esum As Single
Dim E As Single
Dim Ta As Single
Dim Ealt As Single

Dim Soll As Word
Dim Ist As Word

Dim Kp_buffer As Single
Dim Ki_buffer As Single
Dim Kd_buffer As Single
Dim Kpid_buffer As Single

'Dim Y As Word
Dim Y As Integer


Ta = 0.1 'ta = 0.1 --> 10 mal pro sek abtasten

Soll = 250


Print "Let's go"
Print
Wait 1
Portc.0 = 1

Pwm1a = 400

Enable Interrupts

Waitms 500



Do


E = Soll - Ist

'Esum = Esum * 0.95
Esum = Esum + E

Kp_buffer = Kp * E

Ki_buffer = Ki * Ta
Ki_buffer = Ki_buffer * Esum

Kd_buffer = E - Ealt
Kd_buffer = Kd_buffer / Ta
Kd_buffer = Kd_buffer * Kd

Kpid_buffer = Kp_buffer + Ki_buffer
Kpid_buffer = Kpid_buffer + Kd_buffer

Ealt = E

'Pwm1a = Pwm1a * Kpid_buffer

'Y = Kpid_buffer

If Kpid_buffer <= 0 Then
Y = Abs(kpid_buffer)
Pwm1a = Pwm1a - Y
Elseif Kpid_buffer >= 32000 Then
Y = 32000
Pwm1a = Pwm1a + Y
Else
Y = Kpid_buffer
Pwm1a = Pwm1a + Y
End If

'Pwm1a = Pwm1a + Y
'Pwm1a = Pwm1a + Kpid_buffer

'
Print "Ist = " ; Ist
Print "Soll = " ; Soll
Print "PWM1A = " ; Pwm1a
Print "kp_buffer = " ; Kp_buffer
Print "ki_buffer = " ; Ki_buffer
Print "kd_buffer = " ; Kd_buffer
Print "kpid_buffer = " ; Kpid_buffer
Print "Y = " ; Y
Print
'

Loop

End

Isr_von_timer2:
Timer2 = 6
Incr Abtastrate_flag
If Abtastrate_flag = 100 Then
Abtastrate_flag = 0
Ist = Drehzahl_links
Drehzahl_links = 0
End If
Return

Isr_von_int0:
Incr Drehzahl_links
Return


Natürlich kommen die Prints raus, wenns mal funktioniert ;-)
Derzeit habe ich einfach einen Motor mit einem Holzzylinder auf der Achse (welcher halb weiß und halb schwarz ist) über einen CNY70 mittels Tape geklebt, nur Probeweise. Die Auswertung der fiktiven Drehzahl funzt sehr gut, da ich den CNY70 mittels einem 74HC14N (Schmitttrigger) auswerte.
Bitte nehmt die Werte für Kp, Ki und Kd nicht so ernst, sind nur testweise!

Meine eigentlich Frage ist einfach nur, ob die Programmstruktur hier stimmt, also die ganzen multi- und additionen im Hauptteil?!

Gruß
Chris

Bammel
21.10.2009, 21:38
hallo was macht dein roboter eigentlich?

wollte dir ne pn schreiben aber das hast du iwie net freigeschaltet.
habe gerade ein eigenen thread zu meine robby aufgemacht.
https://www.roboternetz.de/phpBB2/viewtopic.php?p=466563#466563

gruß bammel

Che Guevara
22.10.2009, 15:03
Hallo,

er macht das was er soll: er fährt ;-)
wegen der pn muss ich nochmal schauen. Ich bin gerade dabei, mir informationen und evtl. auch einen Schaltplan von einem Ladegerät für Akkus zu besorgen. Könnt ihr mir eventuell sagen, wieviel Ah (mAh) 8 normale AA Batterien haben??! Den mit den Batterien bewegt er sich nach 15 min. nur noch sehr langsam . .

Welchen Akkutyp würdet ihr mir den empfehlen? Hier hab ich einen NiCd-Akku mit Ladegerät! Dieser hat allerdings nur 9,6V, was glaube ich sehr wenig ist bei einem L7806.

@Bammel:
Dein Roboter sieht wirklich sehr gut aus, ich werde hierzo aber noch in deinen Thread schreiben.

Gruß
Chris

Bammel
23.10.2009, 13:49
also die voltzahl ist im prinzip egal wenn deine schaltungen für 9,6bolt ausgelegt ist ist das gut so.. um längere fahrzeiten zu haben musst du auf die mAh achten. mein lipo hat 11,1volt und 3200mAh

bei den standart AA akkus gibt es keine feste mAh die haben ja nachdem unterschiedlich das fängt (schätzungsweise) bei 400mAh udn das höchste was ich gesehen habe waren 2700mAh dies waren dann NiHm-Akkus.

in bezug auf ladegeräte habe ich keine ahnung benutzze immer fertige dinger

Che Guevara
29.10.2009, 21:28
mir geht es eigentlich darum, wie hoch die mindestspannung sein muss, damit der L7806 noch zuverlässig seine 6V liefert!?

Kann man den davon ausgehen, dass akkus und batterien in etwa die gleiche Kapazität haben?

Gruß
Chris

Bammel
29.10.2009, 21:39
bei aa zellen haben batterien 1,5 volt und akkus 1,2 volt. von den mAh ist das je nach dem unterschiedlich steht aber auf den zellen drauf

Besserwessi
29.10.2009, 22:11
Für einen 7806 wird man wenigstens 8 V brauchen um stabil 6 V rauszubekommen. Bei mehr Strom sind vielleicht auch 8,5 V nötig. Das werden dann als 7 Akkus zu 1,2 V je Zelle. Oder theoretisch 6 Einwegzellen zu je 1,5 V. Es gibt aber auch low Drop Regler die mit etwa 6,2 V auskommen können.
Bei Batteriebtreib sind Regler wie 7806 , 7805 oder ähnliches eigenlich nur für eine kleine Leistung sinnvoll. Bei mehr Leistung sollte man ein Schaltregler oder Lowdrop Regler in Betracht ziehen. Wozu eigentlich 6 V ?
Die Motoren sollte man direkt aus den Akkus beteiben können (ggf. weniger Spannung bei den Akkus), und die µCs brauchen 4,5 - 5 V.


Bei den Akkus steht die Kapazität fast immer drauf. Das sollten bei neueren Akkus der Größe AA gut 2000 mAh sein. Bei Batterien hat man vielleicht etwas mehr Kapazität, aber nicht viel. Steht nur sehr selten drauf.