Bammel's W.E.I.R.D.O. [Update: Neues Chassis]
Hallo,
Neues Chassis findet ihr ab hier. *KLICK*
Bild hier
Thema Regelung findet ihr hier. *KLICK*
hatte schon in anderen Threads erwähnt das ich einen roboter baue nun möchte ich diesen mal vorstellen.
sein name ist, dank an william: W.E.I.R.D.O.
was heisen soll: White Expedition Intelligent Roboter Drone One
Zuerst mal ein bild:
Bild hier
Also das Chassis ist von einem HengLong panzer.
Das getriebe ist derzeit im umbau da ich die EMG30 motoren gekauft habe. mir gefiehl das alte nicht. war zu laut, aus kunststoff und auch zu groß..
als akku verwende ich nun den lipo aus willas tricopter ;-) er hat eine nennspannung von 11,1Volt und 3200mAh und ist von kokam.
Das mainboard habe ich schon in einem anderen thread vorgestellt:
https://www.roboternetz.de/phpBB2/ze...911&highlight=
zusätzlich habe ich nun noch ein motorkontroller erstellt. mit zwei parallelgeschalteten L298 so nach dem motto viel hilft viel :-D naja hatte auch beide noch rumliegen. diese werden von einem Atmega8 @16Mhz angesteuert der seine befehle via I2C vom hauptkontroller bekommt.
zusätzlich ist noch ein 433Mhz easy-radio funkmodul, eine Real-Time-Clock + I2C-eeprom, ein I2C 16x2 LCD und vorne ist noch ein SRF04 US-Sensor verbaut.
wenn die motoren montiert sind wird die chassiswanne mit einer alu-plate verschlossen um darauf dann die elektronik und sensoren zu befestigen. lediglich der motortreiber bleib in der wanne. evtl auch noch wenn ich es umsetzte eine akkuüberwachung aber das ist erstmal nebensächlich.
Meine ziele für diese projekt sind folgene:
- relativ gute navigation bzw wegerfassung (sogut es ketten zulassen) dazu gehören dann anfahrrampen usw.
- implementierung einer funkkamera und fernsteuerung des roboters via pc
- installation von weiteren sensoren. Hinten und an den seiten jeweils zwei Sharp IR, vorne sollen zwei US sensoren platz finden und ein 3 achs beschleunigungssensor um die lage feststellen zu können. ggf noch mit gyros
- navigation per GPS
- entwicklung einer ladestation die der roboter selber anfahren kann... ideen sind schon vorhanden
- entwicklung und montage eines greifarms (manipulator)
- mit hilfe der kamera und bildverarbeitung objekterkennung + greifen dieser objekt (vollautonom)
optional:
- ich überleg vorne sowas wie ein auswechselbaren vorsatz zu entwicklen. sprich einen linienfolger oder einen bürstenvorsatz. das ganze sollte dann immer die selbe I2C slave addresse haben und am anfang frag der hauptkontroller ab um welchen vorsatz es sich handelt.
was meint ihr dazu?
- ein neueres tragfähigeres chassis dann aber marke eigenbau
für all diese aufgabe lasse ich mir länger zeit habe mir also keine grenze gesetzt. als erstes soll der roboter zu meiner zufriedenheit navigieren können.
hat sich bereicht erledigt:
nun stellt sich noch die frage nach einen name für den roboter. wollte ihn ers W.E.R.O. (White Expeditions Roboter One) nennen da ich ursprünglich ein chassis selber bauen wollte das sollte dann weiß werden. dies ist er ja nun nicht mehr.. gut ich könnte in umlackieren aber das zerlegen des chassis könnte sich als sehr schwierig erweisen.
also wer ideen oder anregungen hat oder einfach nur einen komentare abgeben möchte! immer her damit.
Freundlicher Gruß,
Bammel
Liste der Anhänge anzeigen (Anzahl: 1)
sooo.. nun ist das teil nach ein paar problemen verkabelt. hätte mir ja mal einer sagen können das sluminium leitet... dachte immer das leitet keinen strom. naja auf jedenfall habe ich irgendein potential auf den aluteilen. muss ich nochmal versuche rauszubekommen was.. weil eigentlich kann das net sein... aufjedenfall hat mein us sensor da die kapseln mit den aluteilen verbunden waren immer nen reset bzw. auch wirres zeug des motortreibers verursacht.
habe hier dann mal ein bild vom inneren angehangen (die gallery wollte das bild net schlucken). aber net wundern bei mir auf meinem basteltisch sieht es wüst aus da muss ich mal wieder aufräumen.
dann habe ich noch ein problem. ich habe jetzt ja die emg30 motoren mit drehgeben den habe ich wie folgt angeschlossen.
Code:
atmega8 int0 ---------------- Hall A
|
4,7k pullup (wie vom hersteller empfohlen)
|
+5V
12V Akku ---------------- VCC Hall
GND Akku ---------------- GND Hall
12V Akku ---------------- VCC Motor
GND Akku ---------------- GND Motor
nun bekomme ich mit folgenden Bascom-code keine werte:
Code:
'*******************************************************************************
'
'*******************************************************************************
'===============================================================================
'***| Mikrocontroller Config |**************************************************
'===============================================================================
'Microcontroller
'================
$regfile = "m8def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 10
$framesize = 40
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1
Config Portd.0 = Output
Config Portd.1 = Output
Config Portc.2 = Output
Config Portc.3 = Output
Config Int0 = Change
Config Int1 = Change
On Int0 Odo_r
On Int1 Odo_l
Enable Int0
Enable Int1
Enable Interrupts
Dim Twi_control As Byte
Dim Twi_status As Byte
Dim Command As Byte
Dim Index As Byte
Dim Newbyte As Byte
Dim Byte1 As Byte
Dim Byte2 As Byte
Dim Byte3 As Byte
Dim Byte4 As Byte
Dim Ticks_r As Byte
Dim Ticks_l As Byte
Declare Sub Twi_init_slave
Enable Interrupts
'Aliases
'========
M1 Alias Portd.0
M2 Alias Portd.1
M3 Alias Portc.2
M4 Alias Portc.3
'Init
'=====
Call Twi_init_slave
Ticks_r = 0
Ticks_l = 0
Command = 0
Index = 0
Byte1 = 0
Byte2 = 0
Byte3 = 0
Byte4 = 0
M1 = 0
M2 = 0
M3 = 0
M4 = 0
'-------------------------------------------------------------------------------
'***| Hauptprogramm |***********************************************************
'-------------------------------------------------------------------------------
Do
Newbyte = 0
'schauen ob TWINT gesetzt ist
Twi_control = Twcr And &H80 ' Bit7 von Controlregister
If Twi_control = &H80 Then
Twi_status = Twsr And &HF8 ' Status
'wurde ein Byte geschickt?
If Twi_status = &H80 Or Twi_status = &H88 Then
Command = Twdr ' neue Daten merken
Newbyte = 1 ' merken das ein neues Byte da ist
End If
'TWINT muss immer gelöscht werden, damit es auf dem Bus weiter geht
Twcr = &B11000100 ' TWINT löschen, erzeugt ACK
End If
'wenn ein neues Byte gekommen ist verarbeiten
If Newbyte <> 0 Then
'Register zuordnen -> Befehl
Select Case Command
Case 1
Gosub Ketten_stopp
Case 2
Gosub Move
Case 3
Gosub Ticks
End Select
End If
Loop
End
'-------------------------------------------------------------------------------
'***| Stoppt die Ketten |*******************************************************
'-------------------------------------------------------------------------------
Ketten_stopp:
Index = 1 '4 Byte holen
Gosub I2c_rx
If Byte1 = 1 Then
Pwm1a = 0
Pwm1b = 0
M1 = 0
M2 = 0
M3 = 0
M4 = 0
Else
Pwm1a = 0
Pwm1b = 0
M1 = 0
M2 = 0
M3 = 0
M4 = 0
End If
Return
'-------------------------------------------------------------------------------
'***| Move: Macht eine undefinierte bewegung (unendlich) |**********************
'-------------------------------------------------------------------------------
Move:
Index = 4 '4 Byte holen
Gosub I2c_rx
'rechts
If Byte1 = 1 Then
M3 = 0
M4 = 1
Elseif Byte1 = 2 Then
M3 = 1
M4 = 0
End If
Pwm1a = Byte2
'links
If Byte3 = 1 Then
M1 = 0
M2 = 1
Elseif Byte3 = 2 Then
M1 = 1
M2 = 0
End If
Pwm1b = Byte4
Return
'-------------------------------------------------------------------------------
'***| Turn: Macht eine definierte bewegung |************************************
'-------------------------------------------------------------------------------
Ticks:
Byte1 = Ticks_r
Byte2 = Ticks_l
'Ticks_r = 0
'Ticks_l = 0
Index = 2 '4 Byte senden
Gosub I2c_tx
Return
'-------------------------------------------------------------------------------
'***| I2C-BUS Daten Empfangsroutinen |******************************************
'-------------------------------------------------------------------------------
I2c_rx:
'erstes Byte empfangen
Newbyte = 0
Do
Twi_control = Twcr And &H80
If Twi_control = &H80 Then
Twi_status = Twsr And &HF8
If Twi_status = &H80 Or Twi_status = &H88 Then
Byte1 = Twdr
Newbyte = 2
End If
Twcr = &B11000100
End If
If Newbyte = 2 Then Exit Do
Loop
'Prüfen ob noch mehr empfangen werden soll
If Index = 1 Then Return
'zweites Byte empfangen
Newbyte = 0
Do
Twi_control = Twcr And &H80
If Twi_control = &H80 Then
Twi_status = Twsr And &HF8
If Twi_status = &H80 Or Twi_status = &H88 Then
Byte2 = Twdr
Newbyte = 2
End If
Twcr = &B11000100
End If
If Newbyte = 2 Then Exit Do
Loop
'Prüfen ob noch mehr empfangen werden soll
If Index = 2 Then Return
Newbyte = 0
Do
Twi_control = Twcr And &H80
If Twi_control = &H80 Then
Twi_status = Twsr And &HF8
If Twi_status = &H80 Or Twi_status = &H88 Then
Byte3 = Twdr
Newbyte = 2
End If
Twcr = &B11000100
End If
If Newbyte = 2 Then Exit Do
Loop
'Prüfen ob noch mehr empfangen werden soll
If Index = 3 Then Return
Newbyte = 0
Do
Twi_control = Twcr And &H80
If Twi_control = &H80 Then
Twi_status = Twsr And &HF8
If Twi_status = &H80 Or Twi_status = &H88 Then
Byte4 = Twdr
Newbyte = 2
End If
Twcr = &B11000100
End If
If Newbyte = 2 Then Exit Do
Loop
Return
'-------------------------------------------------------------------------------
'***| I2C-BUS Daten Senderoutinen |******************************************
'-------------------------------------------------------------------------------
I2c_tx:
'erstes Byte empfangen
Newbyte = 0
Do
Twi_control = Twcr And &H80
If Twi_control = &H80 Then
Twi_status = Twsr And &HF8
If Twi_status = &HA8 Or Twi_status = &HB8 Then
Twdr = Byte1
Newbyte = 2
End If
Twcr = &B11000100
End If
If Newbyte = 2 Then Exit Do
Loop
'Prüfen ob noch mehr empfangen werden soll
If Index = 1 Then Return
'zweites Byte empfangen
Newbyte = 0
Do
Twi_control = Twcr And &H80
If Twi_control = &H80 Then
Twi_status = Twsr And &HF8
If Twi_status = &HA8 Or Twi_status = &HB8 Then
Twdr = Byte2
Newbyte = 2
End If
Twcr = &B11000100
End If
If Newbyte = 2 Then Exit Do
Loop
'Prüfen ob noch mehr empfangen werden soll
If Index = 2 Then Return
Newbyte = 0
Do
Twi_control = Twcr And &H80
If Twi_control = &H80 Then
Twi_status = Twsr And &HF8
If Twi_status = &HA8 Or Twi_status = &HB8 Then
Twdr = Byte3
Newbyte = 2
End If
Twcr = &B11000100
End If
If Newbyte = 2 Then Exit Do
Loop
'Prüfen ob noch mehr empfangen werden soll
If Index = 3 Then Return
Newbyte = 0
Do
Twi_control = Twcr And &H80
If Twi_control = &H80 Then
Twi_status = Twsr And &HF8
If Twi_status = &HA8 Or Twi_status = &HB8 Then
Twdr = Byte4
Newbyte = 2
End If
Twcr = &B11000100
End If
If Newbyte = 2 Then Exit Do
Loop
Return
'-------------------------------------------------------------------------------
'***| Rechte Odometrie |********************************************************
'-------------------------------------------------------------------------------
Odo_r:
Incr Ticks_r
Return
'-------------------------------------------------------------------------------
'***| Linke Odometrie |*********************************************************
'-------------------------------------------------------------------------------
Odo_l:
Incr Ticks_l
Return
'-------------------------------------------------------------------------------
'***| Unterprogramme |**********************************************************
'-------------------------------------------------------------------------------
'TWI als slave aktivieren
Sub Twi_init_slave
Twsr = 0 ' status und Prescaler auf 0
Twdr = &HFF ' default
Twar = &H22 ' Slaveadresse setzen I2C-RX-Adr:Hex22
Twcr = &B01000100 ' TWI aktivieren, ACK einschalten
End Sub
sry ist nicht optimiert und groß kommentiert.
das empfangen der ticks mit dem master geht. habe testweise die ticks mal bei jedem loop durchlauf um einen erhöhen lassen. das kam alles an.
weiß jemand was da los ist?
wäre sehr dankebar wenn mir jemand helfen könnte.
vllt ist auch die verkabelung falsch aber bei einem fliegend aufgebautem test schwankte die spannung zwischen 0V und 5V
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
@oberallgeier: genau das mit der geschwindigkeit habe ich erwartet ;-)
ist ganz simpel warum er runter schneller ist als rauf. trotz der handtuchbespannung hat W.E.I.R.D.O. durch seine kunststoff-ketten nicht genügend grip! er rutsch schlichtweg. da kann ich dann leider auch nichts mehr regeln. die problematik mit dem bremsen habe ich zum glück nicht! da meine ketten erst ab den pwm-wert von 130 anfangen sich zu drehen. bei der bergabfahrt betrug, wenn ich mich noch recht entsinne, der wert ca 110 bis 120. die steigung betrug ca 60% bei meinen vorherrigen test kam ich auch eine steigung von 75% hoch. da allerding nur mit andruck von mir! also eine 60% steigung bei rauhem untergrund sollte kein problem darstellen. bin am überlegen an jedem kettenglied gummi anzukleben. jedoch habe ich dann auch bei drehungen eine enorme scher-kraft zu überwinden.
die thematik mit dem gewollten abbremsen hatte ich schonmal in betracht genommen. bzw. du hast mich durch dein miniD0 dazu angeregt. nur wie gesagt denke ich ist das bei mir so nicht nötig. das einzige was ich vllt nochmla probieren werde oder realisieren möchte ist das ich noch einen dritten regler programiere der das zusammenspeil beider ketten syncronisiert.
@ppppp:
foto ist im anhang! sind kegelzahnräder von conrad. sind schweine teuer aber auch so das beste was ich schnell fand. dazu habe ich das loch weiter aufgebohrt zusätzlich habe ich eine bohrung + gewinde für eine madenschraube eingearbeitet. die madenschrauben auf dem bild waren provisorisch da keine anderen vorhanden. sind nur durch "richtige" ersetzt worden. (dank an willa)
der einbau war "relativ" unaufwändig. nur halt den motor passend einzubauen fand ich recht nervig hat mir ganze 5 neuversuche gekostet. da die welle leider nicht mittig aus dem getriebe kommt. naja einenteils auch zum glück den sonst wäre der anbau so ich ich ihn gemacht habe nicht möglich.
Freundlicher gruß trotz dem schrecklichen wetters,
Bammel