Ich habe in den letzten Tagen etwas am Ausweich Algorithmus rumgebastelt.
Das kam dabei heraus:
http://video.google.com/videoplay?do...15966325617087
Wobei ich im Moment das Problem habe, dass er recht schnell abschmiert:
http://video.google.com/videoplay?do...20286733390890
Entweder reagieren die Sensoren zu langsam oder ich habe ein anderes Problem.
Das Programm dazu:
Code:
$regfile = "m32def.dat"
$crystal = 4000000
$baud = 19200
'I2C
Config Sda = Portc.1
Config Scl = Portc.0
Const Pcf8574_i = &H70
'Motoren
Config Pind.5 = Output 'Links
Config Pind.4 = Output 'Rechts
Config Pinc.5 = Output
R_1 Alias Portc.5
Config Pinc.4 = Output
R_2 Alias Portc.4
Config Pinc.3 = Output
L_1 Alias Portc.3
Config Pinc.2 = Output
L_2 Alias Portc.2
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
'Ultraschall
Dim Zeitmessung As Word
Dim Entfernung As Word
Config Pind.6 = Output
'Boden
Config Adc = Single , Prescaler = Auto , Reference = Internal
Dim Entf_vorne_l As Word
Dim Entf_vorne_r As Word
Dim Entf_hinten As Word
'
Dim Ultraschall As Byte '1=Gegenstand : 0=Frei
Dim Kante_l As Byte '2=Kante : 0=Frei
Dim Kante_r As Byte '3=Kante : 0=Frei
Dim Kante_m As Byte '8=Kante : 0=Frei
Dim Additionsergebnis As Byte 'Additionsergebnis aus Ultraschall, Kante_l, Kante_r und Kante_m
'-------------------------------------------------------------------------------
Start Adc
I2csend Pcf8574_i , &B11001111
Waitms 2500
I2csend Pcf8574_i , &B00111111
Waitms 2500
I2csend Pcf8574_i , &B11110000
'-------------------------------------------------------------------------------
Do
Gosub Sensorabfrage
If Additionsergebnis = 0 Then Gosub M_vor
If Additionsergebnis = 1 Then Gosub M_links
If Additionsergebnis = 2 Then Gosub M_rechts
If Additionsergebnis = 3 Then Gosub M_hinten_rechts
If Additionsergebnis = 4 Then Gosub M_links
If Additionsergebnis = 5 Then Gosub M_hinten_links
If Additionsergebnis = 6 Then Gosub M_hinten_rechts
If Additionsergebnis = 7 Then Gosub M_hinten_links
If Additionsergebnis = 8 Then Gosub M_vor
If Additionsergebnis = 9 Then Gosub M_links
If Additionsergebnis = 10 Then Gosub M_vor_rechts
If Additionsergebnis = 11 Then Gosub M_stop
If Additionsergebnis = 12 Then Gosub M_vor_links
If Additionsergebnis = 13 Then Gosub M_stop
If Additionsergebnis = 14 Then Gosub M_stop
If Additionsergebnis = 15 Then Gosub M_stop
If Additionsergebnis > 15 Then Gosub M_stop
Loop
End
'-------------------------------------------------------------------------------
Sensorabfrage:
'Ultraschall:
Portd.6 = 0
Pulseout Portd , 6 , 40
Pulsein Zeitmessung , Pind , 6 , 1
Zeitmessung = Zeitmessung * 10
Entfernung = Zeitmessung / 62.5
If Entfernung < 30 Then
Ultraschall = 1
Else
Ultraschall = 0
End If
'Kante_vorne_l:
Entf_vorne_l = Getadc(0)
If Entf_vorne_l < 710 Then
Kante_l = 2
Else
Kante_l = 0
End If
'Kante_vorne_r:
Entf_vorne_r = Getadc(1)
If Entf_vorne_r < 590 Then
Kante_r = 4
Else
Kante_r = 0
End If
'Kante_hinten_m:
Entf_hinten = Getadc(2)
If Entf_vorne_l > 635 Then
Kante_m = 8
Else
Kante_m = 0
End If
Additionsergebnis = Ultraschall + Kante_l
Additionsergebnis = Additionsergebnis + Kante_r
Additionsergebnis = Additionsergebnis + Kante_m
Return
'-------------------------------------------------------------------------------
M_stop:
R_1 = 1
R_2 = 1
Pwm1b = 0
L_1 = 1
L_2 = 1
Pwm1a = 0
Return
M_vor:
R_1 = 0
R_2 = 1
Pwm1b = 50
L_1 = 0
L_2 = 1
Pwm1a = 50
Return
M_hinter:
R_1 = 1
R_2 = 0
Pwm1b = 0
L_1 = 1
L_2 = 0
Pwm1a = 0
Waitms 500
Return
M_rechts:
R_1 = 1
R_2 = 0
Pwm1b = 0
L_1 = 0
L_2 = 1
Pwm1a = 0
Waitms 500
Return
M_links:
R_1 = 0
R_2 = 1
Pwm1b = 0
L_1 = 1
L_2 = 0
Pwm1a = 0
Waitms 500
Return
M_hinten_rechts:
Gosub M_hinter
Waitms 500
Gosub M_rechts
Waitms 500
Return
M_hinten_links:
Gosub M_hinter
Waitms 500
Gosub M_links
Waitms 500
Return
M_vor_rechts:
Gosub M_vor
Waitms 500
Gosub M_rechts
Waitms 500
Return
M_vor_links:
Gosub M_vor
Waitms 500
Gosub M_links
Waitms 500
Return
Ich gehe im Programm alle 16 Möglichkeiten durch, die es mit den vier verschiedenen Sensoren geben kann. Wobei es Situationen gibt, die nicht zustande kommen können. Deswegen habe ich bei denen nur die Anweisung "stop" drinnen.
Ich werde an IMADEIT jetzt nichts mehr an der Hardware ändern, nur noch an der Software. In der zweiten Hälfte der Sommerferien habe ich vor eine Version 2 von IMADEIT zu bauen, die Größer sein soll, etwas schneller und ein selbstgebaute Getriebe haben soll. Die Planungen laufen noch.
jon
Lesezeichen