PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : robi mit servo, 2 motoren und us-sensor



Che Guevara
19.08.2008, 12:28
hallo leute,

ich bin gerade dabei mir einen robi zu bauen, der rechts und links einen motor besitzt und vorne sitzt ein us-sensor auf einem servo, welcher ganz vorne befestigt ist.

der servo soll sich drehen (in best. großen schritten) und wenn der us-sensor etwas ortet, soll der robi mit einer dementsprechenden richtungsänderung darauf reagieren. ansonsten soll der robi immer geradeausfahren.
im prinzip ist es also ein roboter, der sich mit nur einem sensor in einem raum bewegen kann, ohne anzuecken.

hier aber mein problem:

ich habe die hardware schon komplett fertig, nur die software fehlt noch.
ich habe einen atmega32, einen l293 als motortreiber und einen billigen bausatz vom großen blauen c als us-sensor.
[shadow=red:033799863b]hier mein code:[/shadow:033799863b]



'header
$regfile = "m32def.dat"
$crystal = 16000000
$framesize = 64
$hwstack = 32
$swstack = 10
'\header

'subs declarieren
Declare Sub Abfrage()
Declare Sub Berechnung()
Declare Sub Servo()
'\subs declarieren

'configurieren
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 8
Config Adc = Single , Prescaler = Auto
Config Servos = 1 , Servo1 = Portb.0 , Reload = 10 , Timer = Timer0
Config Portb.0 = Output
Config Portc.5 = Output
Config Porta.0 = Input
'\configurieren
'Motoren
Config Portb.0 = Output
Config Portb.1 = Output
Config Portc.6 = Output
Config Portc.7 = Output
'\Motoren

'alias-befehle
Ml1 Alias Portb.0
Ml2 Alias Portb.1
Mr1 Alias Portc.6
Mr2 Alias Portc.7
'\alias-befehle

'(
Pwm1a = Geschw. - - > Rechter Motor
Pwm1b = Geschw. - - > Linker Motor
')

'variablen deklarieren
Dim X As Word
Dim J As Word
Dim S As Word
Dim Pos As Word
Dim Nega As Word
'\variablen deklarieren

'hauptschleife
Do

Call Abfrage
Call Servo
'Call Berechnung

Loop
'\hauptschleife

'subs
Sub Abfrage
X = Getadc(0)
If X < 200 Then 'ultraschall-sensor ortet nichts
Portc.5 = 0 'alles ok - kein hinderrniss
Ml1 = 1
Ml2 = 0
Mr1 = 1
Mr2 = 0
Elseif X > 200 Then 'ultraschall-sensor ortet etwas
Call Berechnung
Portc.5 = 1 'hinderniss geortet
Ml1 = 0
Ml2 = 1
Mr1 = 0
Mr2 = 1
Waitms 800
End If
End Sub

Sub Berechnung
Pos = J - 20 'j = 20 to 170
Pwm1a = Pos + 50 'pwm1a & pwm1b = 50 to 200
Nega = Pos + 50
Pwm1b = 250 - Nega 'pwm1a & pwm1b = geschw. der motoren
End Sub

Sub Servo
If J < 170 Then
S = S + 30
Elseif J >= 170 Then
S = 20
End If
Servo(1) = J
Waitms 300
End Sub
'\subs

End


pwm1a und pwm1b sind für die geschwindigkeitsregelung der motoren.
ich weis, dass noch viele fehler drin sind, hab manches einfach so ohne zu überlegen hineingeschrieben, ich hoffe, ihr könnt mich auf ein paar fehler aufmerksammachen, und ggbf. sogar eine lösung mit mir bearbeiten?!

mein größtes problem ist allerdings, dass wenn ich das ganze complimieren will, eine fehlermeldung kommt:
assignment error (servo(1) .......) blablabla
anscheinend habe ich einen fehler beim servo-config gemacht, mir fällt er aber nicht auf!
könntet ihr mir sagen, wo der fehler liegt?!?!

ich bedanke mich jetzt schon für eure beiträge und freue mich auf anregungen/feststellungen.

mfg
chris

kalletronic
19.08.2008, 14:11
Hi, wenn mich nicht alles teuscht arbeitet der befehl Servo(1)=J mit einem Byte-Wert, du hast aber ne Word-Variable declariert. Versuchs mal mit Dim J As Byte passt von der Größe her doch auch noch

Mfg Kalle

Che Guevara
19.08.2008, 14:17
hallo kalle,

erst mal danke für deine antwort.
allerdings war das auch nicht der fehler!! :-(

gruß
chris

kalletronic
19.08.2008, 14:55
hi, mir is noch aufgefallen daß J nirgends einen definierten Wert bekommt, oder haste den Teil nur nich reinkopiert??

Che Guevara
19.08.2008, 15:23
oh, hab ich vergessen, funzt aber dann auch nicht, dann kommt noch eine fehlermeldung:

assignment error [j: 0 20: 112]

gruß
chris

holzi
19.08.2008, 18:09
Hi Che Guevara,
Dein Problem liegt wo anders. Du hast eine Sub mit dem Namen Servo() deklariert. Gleichzeitig rufst Du aber die Bewegung des Servos in der Sub Servo() mit Servo(1) auf. Das geht natürlich nicht. Entweder ist es eine Sub oder ein Befehl. Beides gleichzeitig mit ein und dem selben Namen muss schief gehen. Deklariere die Sub Servo() in Serv() um und benenne die Sub selbst und deren Aufruf auch entsprechend um und schon klappt das mit dem Nachbarn.

Hier einmal die Umbennungen als Beispiel:

Mache aus Declare Sub Servo() nun Declare Sub Serv()
Mache beim Aufruf aus Call Servo ein Call Serv und
benenne die Sub Servo in Sub Serv um. Das war es dann auch schon.

Tschuesss Peter

Che Guevara
19.08.2008, 18:21
hallo peter,

danke für deine antwort, jetzt funzts!!

daran habe ich gar nicht gedach, ist ja eigentlich logisch!! :-)
hast du sonst noch irgendwelche anregungen, was ich besser machen könnte?!?!
das gilt selbstverständlich an alle ;-)

gruß
chris

kalletronic
20.08.2008, 07:37
Son mist, das is mir doch glatt nich aufgefallen :-b

holzi
20.08.2008, 08:09
Guten morgen,
so genau bin ich Dein Programm nicht durchgegangen. Ich muss gestehen, als aller erstes habe ich erst einmal alles entsprechend eingerückt, damit es besser lesbar für mich war. Verstehen tue ich die folgenden Zeilen nicht:

If J < 170 Then
S = S + 30
Elseif J >= 170 Then
S = 20
End If

Die Variable S wird nirgends benötigt. Oder ist das hier nicht der ganze Source-Code?

Tschuesss Peter

Che Guevara
20.08.2008, 12:15
gutn mittag ;-)

danke, dass du mich draf aufmerksam machst!
natürlich sollte dort j stehen, damit sich der servo dreht :-)

gruß
chris

Che Guevara
21.08.2008, 22:09
jetzt habe ich nochmal ein problem.

ich hab das ganze jetzt aufn avr gebrannt, aber der servo dreht sich nicht!!
weiß jemand zufällig, wo der fehler ist???

gruß
chris

Che Guevara
23.08.2008, 00:06
hat den keiner eine idee???

gruß
chris

oberallgeier
23.08.2008, 09:17
... problem ... aufn avr gebrannt ... servo dreht sich nicht ...Ein beliebter Fehler (den ich selbst sehr gerne gemacht hatte) ist es, die Stromversorgung des Servo vom AVR zu nehmen. Der braucht einen Anschluss für GND und VB mit genügend Stromstärke (meist über 500 mA, auch mal deutlich höher), sonst läuft der nicht. Ausserdem sollte der Servo GND mit dem AVR-GND verbunden sein. Halt so "elementare" Dinge, die selbstverständlich sind - man vergisst sie selbstverständlich öfters.

Hilfreich zum Helfen wäre natürlich (D)eine Schaltung.