Voor KLM5... je weet dat ik ze over heb
Ik weet alleen nog niet of je ze ook aan mij gaat geven
(zoja bestaat de kans dat KLM5 eerder af is dan KLM4... Draait m'n nummering in de soep... Nouja, is ook wel grappig. Net zoals er eigenlijk nooit een KLM1 is geweest omdat die mislukte. KLM is begonnen met KLM2)
Anyway, de ultrasoon. Het gebeurt hier:
pic basic code:
servo_aan:
For teller = 1 To 2
For positie = 1500 To 2250 Step 20
GoSub ping
Print At 1, 13, DEC3 afstand
Servo servo1, positie
Next
For positie = 2250 To 850 Step -20
GoSub ping
Print At 1, 13, DEC3 afstand
Servo servo1, positie
Next
For positie = 850 To 1500 Step 20
GoSub ping
Print At 1, 13, DEC3 afstand
Servo servo1, positie
If afstand > afstand_oud Then
afstand_oud = afstand
servoposdoorgang = positie
EndIf
DelayMS 18
Next
Next
Print At 1,1, "doorgang op:"
Print At 1,13, DEC3 servoposdoorgang
DelayMS 3000
Servo servo1, servoposdoorgang
Return
Het probleem (of iig een probleem) is dat niet bij elke meting de afstand vergeleken wordt met de vorige positie. Eerst is er een for-next die de afstanden meet bij de servoposities 1500 tot 2250, daarna een die datzelfde doet voor 2250 tot 850, en dan een voor 850 tot 1500, en alleen in die laatste worden ook echt metingen vergeleken en zonodig opgeslagen. (die for-next lussen worden dan door de for -next die eromheen zit 2x uitgevoerd, waardoor de servo dus 2x heen en weer draait.)
Wat er dus moet gebeuren is dat in elke for-next de afstanden worden vergeleken zoals in die laatste van 850 tot 1500. Anders kun je alleen doorgangen vinden in dat stuk.
Zijsprong: Als je toch de servo 2x heen en weer zwiept kun je eigenlijk gelijk foute metingen eruit vissen door metingen die te erg verschillen van de vorige zwiep niet mee te laten doen. Of makkelijker: het gemiddelde van de 2 metingen nemen, zodat het niet te ver afwijkt.
Verder wijst de servo aan het eind van servo_aan de positie aan met de grootste doorgang (van het stukje tussen 850 en 1500), maar wordt de robot daar nog niet heengestuurt.
En over je vars: meestal zet men de grootste vars bovenaan. Dus eerst de arrays, dan de dwords, dan de words, dan de bytes, dan de bits. Dit om te voorkomen dat een grote var wordt opgedeelt over meerdere memmory-banks. PICbasic geeft in dat geval trouwens gewoon een warning, zodat je wat met vars kan gaan schuiven, en zonodig ergens een dummy byte in kan voegen om de boel mooi uit te lijnen. Vooral lange arrays moeten echt als eerste gedeclareerd worden, want als die bijna net zo groot zijn als een geheugenbank en er staan een paar words voor die er voor zorgen dat 'ie in de volgende bank terecht komt, dan is dat vervelend. Maargoed, al je vars passen nu nog in 1 bank, dus de volgorde maakt nog niet uit. Maar misschien komt 't van pas mocht je met grote arrays aan de gang.
aangepaste
pic basic code:
servo_aan:
For teller = 1 To 2
For positie = 1500 To 2250 Step 20
GoSub ping
Print At 1, 13, DEC3 afstand
Servo servo1, positie
If afstand > afstand_oud Then
afstand_oud = afstand
servoposdoorgang = positie
EndIf
Next
For positie = 2250 To 850 Step -20
GoSub ping
Print At 1, 13, DEC3 afstand
Servo servo1, positie
If afstand > afstand_oud Then
afstand_oud = afstand
servoposdoorgang = positie
EndIf
Next
For positie = 850 To 1500 Step 20
GoSub ping
Print At 1, 13, DEC3 afstand
Servo servo1, positie
If afstand > afstand_oud Then
afstand_oud = afstand
servoposdoorgang = positie
EndIf
DelayMS 18
Next
Next
Print At 1,1, "doorgang op:"
Print At 1,13, DEC3 servoposdoorgang
DelayMS 3000
Servo servo1, servoposdoorgang
Return
Om Johny niet alleen de goede kant op te laten kijken, maar ook die kant op te laten rijden is nog wat extra code nodig.
[Luke start hardop denken -modus]
Even kijken. Hij gaat nu terug naar het hoofdprogramma als 'ie klaar is met meten, servo blijft dan de goede kant op wijzen. Maar wat gaat 'ie in het hoofdprogramma doen? Dat hangt af van de toets# ingangen, wat doen die ook alweer... Blijven ze staan op het laats ontvangen afstandsbedieningscommando of toggelen ze?
Op 7 juni 2010 00:29:07 schreef Kareltje:
Het is inderdaad zo dat de uitgangen van die ir-chip (16F630) op de ingangen van de 16F877 zitten.
Het maakt het proggen inderdaad eenvoudiger, en ik heb bewust de puls-versie gebruikt daar ik anders die ingangen niet softwarematig weer laag krijg.
Ah, puls. Ok. Dan blijft de robot dus ook stilstaan tot de afstandsbediening iets doet. Hmm. Dan zouden we 'm dus in servo_aan nog even in de goede richting kunnen laten draaien, en misschien zelfs een stukje rechtdoor kunnen laten gaan voor 'ie weer naar het hoofdprogramma gaat om te wachten op input van de afstandsbediening...
[/luke stopt met hardop denken (denkt nog wel verder, maar niet meer hardop)]
Om 'm de goede kant op te laten draaien moet 'ie weten of 'ie naar links of naar rechts moet gaan draaien, en hoelang dan wel.
(on-affe) code:
pic basic code:
if servoposdoorgang > 1500 then
gosub linksaf
delayms (servoposdoorgang - 1500 * factor)
elseif servoposdoorgang < 1500 then
gosub rechtsaf
delayms (1500 - servoposdoorgang) * factor
end if
Natuurlijk moet ook de servo weer terugdraaien naar het midden anders blijft Johny opzij kijken terwijl 'ie rechtdoor rijdt. Dat ziet er waarschijnlijk een beetje maf uit...
Dat terugdraaien is natuurlijk het mooist als de servo terugdraait terwijl de robot heendraait, en liefst nog even snel ook. Maar het is makkelijker om de servo gewoon terug te laten draaien vlak voordat de robot gaat draaien en hopen dat 'ie er even over doet. Dus: motoren van robot aanzetten in de juiste richting, servo naar nieuwe positie sturen, wachten tot robot juist staat, en ondertussen draait die servo ook nog bij. Zoiets. Dat heb ik nog niet in die on-affe code gezet.
Zo, je kan weer even vooruit