Alpha2000
20.05.2012, 23:42
Hi
Also erstmal zur hardware.
Altes RC auto mit 2 motoren
Orangutan SV-328 Bord
Ultraschall SRF02
Funst auch alles recht gut der code selbst macht was er soll bis darauf das der abstand wo das auto bremst immer unterschiedlich ist. schätze mal das es an meinem code ligt und daran wan er messen tut aber ich weis nicht wie ich es verbessern soll. ist mein erster roboter.
Die derzeitige funktion ist halt Wen nix im weg ist langsam beschleunigen und wen ein gegenstand im weg ist bremsen. ist der gegenstand wieder weg wieder langsam anfahren.
ps. ja die motoren werden unterschiedlich angesteuert da der eine woll ein knacks weg hat und nicht die selbe leistung bringt. so wie er jetzt ist fahrt er gerade aus ungefäht :)
So hier noch der code ich hoffe ich könnt mir helfen was zu verbessern.
$prog &HFF , &HF6 , &HD9 , &HFC 'Standard Fusebits für Orangutan SV-328
'Die üblichen Definitionen bei Standardprogrammen für Orangutan B-328
$regfile = "m328pdef.dat"
$crystal = 20000000 'Quarzfrequenz
$hwstack = 32
$framesize = 64
$swstack = 32
' ------ Anwendungsspezifische Configurationen ---------
Declare Function Srf02_firmware(byval Slaveid As Byte) As Byte
Declare Function Srf02_entfernung(byval Slaveid As Byte) As Integer
Declare Sub Anhalten()
Declare Sub Ruckwarts()
'Ports benennen
Motor1a Alias Portd.6
Motor1b Alias Portd.5
Motor2a Alias Portd.3
Motor2b Alias Portb.3
Config Pind.1 = Output
Config Pinb.3 = Output
Config Pind.3 = Output
Config Pind.5 = Output
Config Pind.6 = Output
Config Scl = Portd.2 'Gelb Ports fuer IIC-Bus
Config Sda = Portd.0 'Lila
Config Pind.1 = Output
Red_led Alias Portd.1
Const Srf02_slaveid = &HE0 'Standard I2C Adresse von SRF02
'Variablen
Dim I As Integer
Dim A As Integer
Dim Entfernung As Integer
Dim V As Byte
Dim X As Byte
' PWM Register setzen
' see the ATmega48/168/328P datasheet for detailed register info
' configure for inverted PWM output on motor control pins
Tccr0a = &HF3
Tccr2a = &HF3
' use the system clock / 8 (2.5 MHz) as the timer clock
Tccr0b = &H02
Tccr2b = &H02
Main:
Wait 3 'Warte 3 Sekunden
I2cinit
V = 1
I = 0
A = 0
Do
Do
Entfernung = Srf02_entfernung(srf02_slaveid)
If Entfernung >= 40 Then
Ocr2a = 0 'Links
Ocr2b = I 'Links
Ocr0a = A 'Rechts
Ocr0b = 0 'Rechts
Else
Anhalten
End If
Waitms 500
If I < 50 Then
I = I + 5
A = A + 6
End If
Loop Until I > 50
Loop
End
'------------- Hilfsfunktionen für SRF02 ----------
Function Srf02_firmware(byval Slaveid As Byte) As Byte
Local Firmware As Byte
Local Slaveid_read As Byte
Slaveid_read = Slaveid + 1
I2cstart
I2cwbyte Slaveid
I2cwbyte 0 'Leseregister festlegen
I2cstop
I2cstart
I2cwbyte Slaveid_read
I2crbyte Firmware , Nack
I2cstop
Srf02_firmware = Firmware
End Function
Function Srf02_entfernung(byval Slaveid As Byte) As Integer
Local Lob As Byte
Local Hib As Byte
Local Firmware As Byte
Local Temp As Byte
Local Slaveid_read As Byte
Slaveid_read = Slaveid + 1
'Messvorgang in starten
I2cstart
I2cwbyte Slaveid
I2cwbyte 0
I2cwbyte 81 'in Zentimetern messen
I2cstop
Warteaufmessung:
Waitms 1
Firmware = Srf02_firmware(slaveid)
If Firmware = 255 Then Goto Warteaufmessung
I2cstart
I2cwbyte Slaveid
I2cwbyte 2 'Leseregister festlegen
I2cstop
I2cstart
I2cwbyte Slaveid_read
I2crbyte Hib , Ack
I2crbyte Lob , Nack
I2cstop
Srf02_entfernung = Makeint(lob , Hib)
End Function
Sub Anhalten()
I = 0
A = 0
Ocr2a = 0 'Links
Ocr2b = 0 'Links
Ocr0a = 0 'Rechts
Ocr0b = 0 'Rechts
End Sub
Sub Ruckwarts()
I = 0
A = 0
Do
Ocr2a = I 'Links
Ocr2b = 0 'Links
Ocr0a = 0 'Rechts
Ocr0b = A 'Rechts
Waitms 500
I = I + 5
A = A + 8
Loop Until I > 70
End Sub
Also erstmal zur hardware.
Altes RC auto mit 2 motoren
Orangutan SV-328 Bord
Ultraschall SRF02
Funst auch alles recht gut der code selbst macht was er soll bis darauf das der abstand wo das auto bremst immer unterschiedlich ist. schätze mal das es an meinem code ligt und daran wan er messen tut aber ich weis nicht wie ich es verbessern soll. ist mein erster roboter.
Die derzeitige funktion ist halt Wen nix im weg ist langsam beschleunigen und wen ein gegenstand im weg ist bremsen. ist der gegenstand wieder weg wieder langsam anfahren.
ps. ja die motoren werden unterschiedlich angesteuert da der eine woll ein knacks weg hat und nicht die selbe leistung bringt. so wie er jetzt ist fahrt er gerade aus ungefäht :)
So hier noch der code ich hoffe ich könnt mir helfen was zu verbessern.
$prog &HFF , &HF6 , &HD9 , &HFC 'Standard Fusebits für Orangutan SV-328
'Die üblichen Definitionen bei Standardprogrammen für Orangutan B-328
$regfile = "m328pdef.dat"
$crystal = 20000000 'Quarzfrequenz
$hwstack = 32
$framesize = 64
$swstack = 32
' ------ Anwendungsspezifische Configurationen ---------
Declare Function Srf02_firmware(byval Slaveid As Byte) As Byte
Declare Function Srf02_entfernung(byval Slaveid As Byte) As Integer
Declare Sub Anhalten()
Declare Sub Ruckwarts()
'Ports benennen
Motor1a Alias Portd.6
Motor1b Alias Portd.5
Motor2a Alias Portd.3
Motor2b Alias Portb.3
Config Pind.1 = Output
Config Pinb.3 = Output
Config Pind.3 = Output
Config Pind.5 = Output
Config Pind.6 = Output
Config Scl = Portd.2 'Gelb Ports fuer IIC-Bus
Config Sda = Portd.0 'Lila
Config Pind.1 = Output
Red_led Alias Portd.1
Const Srf02_slaveid = &HE0 'Standard I2C Adresse von SRF02
'Variablen
Dim I As Integer
Dim A As Integer
Dim Entfernung As Integer
Dim V As Byte
Dim X As Byte
' PWM Register setzen
' see the ATmega48/168/328P datasheet for detailed register info
' configure for inverted PWM output on motor control pins
Tccr0a = &HF3
Tccr2a = &HF3
' use the system clock / 8 (2.5 MHz) as the timer clock
Tccr0b = &H02
Tccr2b = &H02
Main:
Wait 3 'Warte 3 Sekunden
I2cinit
V = 1
I = 0
A = 0
Do
Do
Entfernung = Srf02_entfernung(srf02_slaveid)
If Entfernung >= 40 Then
Ocr2a = 0 'Links
Ocr2b = I 'Links
Ocr0a = A 'Rechts
Ocr0b = 0 'Rechts
Else
Anhalten
End If
Waitms 500
If I < 50 Then
I = I + 5
A = A + 6
End If
Loop Until I > 50
Loop
End
'------------- Hilfsfunktionen für SRF02 ----------
Function Srf02_firmware(byval Slaveid As Byte) As Byte
Local Firmware As Byte
Local Slaveid_read As Byte
Slaveid_read = Slaveid + 1
I2cstart
I2cwbyte Slaveid
I2cwbyte 0 'Leseregister festlegen
I2cstop
I2cstart
I2cwbyte Slaveid_read
I2crbyte Firmware , Nack
I2cstop
Srf02_firmware = Firmware
End Function
Function Srf02_entfernung(byval Slaveid As Byte) As Integer
Local Lob As Byte
Local Hib As Byte
Local Firmware As Byte
Local Temp As Byte
Local Slaveid_read As Byte
Slaveid_read = Slaveid + 1
'Messvorgang in starten
I2cstart
I2cwbyte Slaveid
I2cwbyte 0
I2cwbyte 81 'in Zentimetern messen
I2cstop
Warteaufmessung:
Waitms 1
Firmware = Srf02_firmware(slaveid)
If Firmware = 255 Then Goto Warteaufmessung
I2cstart
I2cwbyte Slaveid
I2cwbyte 2 'Leseregister festlegen
I2cstop
I2cstart
I2cwbyte Slaveid_read
I2crbyte Hib , Ack
I2crbyte Lob , Nack
I2cstop
Srf02_entfernung = Makeint(lob , Hib)
End Function
Sub Anhalten()
I = 0
A = 0
Ocr2a = 0 'Links
Ocr2b = 0 'Links
Ocr0a = 0 'Rechts
Ocr0b = 0 'Rechts
End Sub
Sub Ruckwarts()
I = 0
A = 0
Do
Ocr2a = I 'Links
Ocr2b = 0 'Links
Ocr0a = 0 'Rechts
Ocr0b = A 'Rechts
Waitms 500
I = I + 5
A = A + 8
Loop Until I > 70
End Sub