Hallo
Hat schon jemand ein Lienverfolgungs prog geschrieben.
Wäre froh wenn jemang so ein Prog mal posten kann.
Würde mich schon viel weiter bringen.
Danke schon im voraus
Druckbare Version
Hallo
Hat schon jemand ein Lienverfolgungs prog geschrieben.
Wäre froh wenn jemang so ein Prog mal posten kann.
Würde mich schon viel weiter bringen.
Danke schon im voraus
Wie hast du denn die Sensoren angeschlossen? Das da oben ist ja sicherlich nicht das ganze Programm. Hast du den ADC auch richtig eingestellt? Die jeweiligen Ports als Ein- und Ausgang eingestellt?
Hi mesli-andres,
ich denke Du hast da nen ganz trivialen bug in der Funktion Bewegungsmelder. Bei allen 3 Abfragen sind "End If" und "End Select" vertauscht.
If We < 1010 Then
Select Case We
Case 380 To 470
Bewegungsmelder = 3
Case 535 To 720
Bewegungsmelder = 3
End If
End Select
If B < 1010 Then
Select Case B
Case 612 To 820
Bewegungsmelder = 1
End If
End Select
If C < 1010 Then
Select Case C
Case 612 To 820
Bewegungsmelder = 2
End If
End Select
Verschachtelte Ifs, Selects, Schleifen usw müssen immer von innen nach aussen geschlossen werden.
Edit:
Hab grad noch mal Dein Progie angesehen und verstehe "Call Lienienverfolgung" unter "Case 3" nicht.
Dann dachte ich noch, Du solltest bei "Case 3 " vielleicht zuerst die Motoren abzuschalten, damit das Teil nicht fast 20 Sekunden lang einfach geradeaus weiterfährt.
Grüße
Marvin
Ich hab das mal anders dargestellt. Es mag sein, das ich mich täusche, aber denke eher das du If und Select vertauschst hast. Select ist innen und If ist aussen.Zitat:
If C < 1010 Then
Select Case C
Case 612 To 820
Bewegungsmelder = 2
End If
End Select
Hmm, bei genauer Betrachtung ist das If mitsamt dem End If eigentlich völlig überflüssig.
Wenn C >= 1010 ist, dann trifft der "Case 612 to 820" nicht zu und "Bewegungsmelder" wird nicht gesetzt.
Grüße
Marvin
@mesli-andres
hast du bei deinem ATMega die serielle Schnitstelle so beschaltet (max232), dass du Daten an den PC ausgeben kannst?
Dann würde ich bei Schleifen, Abfragen usw. Print Befehle zum Debuggen einfügen.
Damit findet man Fehler wie Marco78 und Marvin gefunden haben meist schneller, als wenn man über dem Quelltext brütet.
Hallo
Danke mal für die vielen tips. O:)
Mit Case 3 steuere ich eine Digicam die dann Fotos macht.
Später habe ich dann das Prog mit Print Befehlen ausgestattet aber das brachte mich nicht weiter.
Kannst du nicht mal den Schaltplan und das komplette Propgramm veröffentlichen?
Es stellt sich immer noch die Frage, ob der ADC überhaupt richtig eingestellt ist und ob die Spannung mit einem Spannungsteiler ermittelt wird...
Hallo
Hier ist das gesamte Prog.
Code:'###################################################
'Überwachungsroboter.bas
'Überwachungsroboter
'Projekt von Andres
'#######################################################
Declare Function Bewegungsmelder() As Byte
Declare Sub Linieverfolgung()
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
Dim I As Integer
Dim N As Integer
Dim Ton As Integer
$crystal = 16000000 'Quarzfrequenz
$baud = 9600
Config Adc = Single , Prescaler = Auto 'Für Tastenabfrage und Spannungsmessung
Config Pina.7 = Input 'Für Tastenabfrage
Porta.7 = 1 'Pullup Widerstand ein
Config Pina.5 = Input
Config Pina.6 = Input
Config Pina.2 = Input
Config Pina.3 = Input
Config Porta.4 = Output
Dim Taste As Byte
Dim Volt As Single
' Für Linieverfolgung
'Ports für linken Motor
Config Pinc.6 = Output 'Linker Motor Kanal 1
Config Pinc.7 = Output 'Linker Motor Kanal 2
Config Pind.4 = Output 'Linker Motor PWM
'Ports für rechten Motor
Config Pinb.0 = Output 'Rechter Motor Kanal 1
Config Pinb.1 = Output 'Rechter Motor Kanal 2
Config Pind.5 = Output 'Rechter Motor PWM
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Pwm1a = 0
Pwm1b = 0
Tccr1b = Tccr1b Or &H02 'Prescaler = 8
I = 0
Waitms 5000
Sound Portd.7 , 400 , 450 'BEEP
Sound Portd.7 , 400 , 250 'BEEP
Sound Portd.7 , 400 , 450
Print "**** RN-CONTROL 1.4 *****"
Print "Das neue Experimentier- und Roboterboard"
Print "Weitere passende Zusatzboards bei www.robotikhardware.de"
Print "Projekt Ueberwachungsroboter von Andres"
Do
Do
Taste = Bewegungsmelder()
If Taste <> 0 Then
Select Case Taste
Case 1
Pwm1a = 0 'Linker Motor aus
Waitms 1000
Pwm1a = 1023
Print "Rechts weisse Linie erkannt"
Case 2
Pwm1b = 0
Waitms 1000
Pwm1b = 1023
Print "Links weisse Linie erkannt"
Case 3
Waitms 2000
Porta.4 = 1
Waitms 800
Porta.4 = 0
Waitms 1000
Porta.4 = 1
Waitms 500
Porta.4 = 0
Waitms 4000
Porta.4 = 1
Waitms 500
Porta.4 = 0
Waitms 4000
Porta.4 = 1
Waitms 500
Porta.4 = 0
Print "Person gesichtet und fotografiert"
Waitms 5000
Call Linieverfolgung
End Select
End If
Waitms 100
Loop
End
Function Bewegungsmelder()
Local B As Word
Local C As Word
Local We As Word
Bewegungsmelder = 0
'Diese Unterfunktion überwacht den Raum und folgt Der Linie
Start Adc
B = Getadc(5)
C = Getadc(6)
We = Getadc(2)
If We < 1010 Then
Select Case We
Case 380 To 470
Bewegungsmelder = 3
Case 535 To 720
Bewegungsmelder = 3
End Select
End If
If B < 1010 Then
Select Case B
Case 412 To 820
Bewegungsmelder = 1
Case Else
' Print "Wert anpassen!ADC Wert B=" ; B
End Select
End If
If C < 1010 Then
Select Case C
Case 412 To 820
Bewegungsmelder = 2
Print "Wert anpassen!ADC Wert C=" ; C
End Select
End If
End Function
Sub Linieverfolgung()
Waitms 1000
'Linker Motor ein
Portc.6 = 1 'bestimmt Richtung
Portc.7 = 0 'bestimmt Richtung
Portd.4 = 1 'Linker Motor EIN
'Rechter Motor ein
Portb.0 = 1 'bestimmt Richtung rechter Motor
Portb.1 = 0 'bestimmt Richtung rechter Motor
Portd.5 = 1 'rechter Motor EIN
I = 0
Do
Pwm1a = I
Pwm1b = I
Waitms 10
I = I + 5
Loop Until I > 1023
'
Waitms 100
Do
Pwm1a = 1023
Pwm1b = 1023
End
End Sub
Loop
Loop
Und hier der Schaltplan zum ansteuern der CN70's
Und da sehe ich schon den ersten Fehler. Der ADC-Port ist hochohmig. Bedeutet es fließt kein Strom und es kann keine Spannung abfallen. Die Spannungsmessung muss als Spannungsteiler erfolgen. Du brauchst also noch ein Widerstand vom Analogport zu Masse.
Ein CNY70 ist ein Optokoppler, oder? Lässt der sich so 'fein' ansprechen, das man verschiedene Spannungen bekommt?