Hoi Lucky,
Nog steeds sneller dan je eigen schaduw 
DDR = tris%000000 bedoel je?
haakjes bij until slikt proton niet (syntax error)
Ik heb zojuist weereens getest met het volgende resultaat:
Tijdens het rijden, of vanuit stilstand kan ik WEL de ultrasoon aanspreken, en met toets5 beeindigen (ik weet het niet voor 100% zeker of dat voorheen ook zo was) Maar nu heb ik alleen nog het probleem met die IR-sensor.
Op het moment dat ik toets1 indruk (IR_sens) komt het keurig op het display staan, en dan draait er 1 motor 2 sec.
Dit staat ook in de code (delayms 2000)
Maar waarom maar 1 motor?
Ik heb die IR-sensors nog niet aangesloten, maar zou het hiermee te maken kunnen hebben?
Ik ga er eens eentje aansluiten.
Lucky Luke
Eluke.nl | handgetypt | I'm a poor, lonesome cowboy, with a long, long way to go.
Inderdaad TRIS. DDR is van de AVR...
Als het bij de ultrasoon wel werkt zit het niet in de repeat-until.
(Het enige verschil is toets1 of toets3... Toets5 moet bij allebij werken)
Ingangen waar niks aan hangt geven vaak rare resultaten, geef ze anders een pullup of pulldown, als de sensors nog niet goed werken.
Pullups op ongebruikte ingangen gaven geen resultaat.
Ook heb ik geprobeerd alle ongebruikte ingangen als uitgang in te stellen, zonder resultaat.
Door enkele printopdrachten er tussendoor te zetten bleek dat de IR- ingang helemaal niet hoog werd bij toets1.
Er bleef continu een laag signaal aanwezig dus de robot bleef rondjes draaien.
Nu heb ik alles uit hun voetjes gehaald en een simpele code in elkaar gezet met alleen de IR-sensor en de L293D
Ook dit gaf geen resultaat irsens1 bleef laag.
Helemaal opnieuw begonnen op een breadboard werkte het ook niet.
Zomaar eens een andere poort geprobeerd en op de 2 overige B ingangen werkte het WEL.
Ik heb even de datasheet eens goed bekeken, en ik ben bang dat de verkeerde poorten als ingang heb gekozen 
Klopt mijn vermoeden?
Als het inderdaad zo is, dan moet ik drastisch mijn printje aanpassen.
Ik gebruikte voor de IR als ingang RE.0, RA.4 en voor de Ultrasoon RB.0
Voor het testje heb ik onderstaande code gebruikt:
Symbol ir = PORTB.0 'op portB.0 werkt het wel
'maar op geen enkele E poort
DelayMS 500
Cls
While 1 = 1
If ir = 0 Then
Print At 1, 1, "detect"
High PORTD.1
Else PORTD.1 = 0
EndIf
If ir = 1 Then
Print At 1, 1, "vrij "
EndIf
Wend
EndGroetjes Karel
Lucky Luke
Eluke.nl | handgetypt | I'm a poor, lonesome cowboy, with a long, long way to go.
Dus als er echt 5V op staat, leest 'ie alsnog geen 1 in (begrijp ik dat goed?)
Dan staat de pin niet ingesteld als digitale ingang. Als je dieper in die datasheet duikt kom je tegen waar 'ie standaard op staat ingesteld. (ik zou daarvoor ook even in de datasheet moeten duiken, ik weet het zo even niet) Maar misschien staat 'ie standaard op analoog of op een andere speciale functie, waardoor je 'm niet als ingang kunt gebruiken.
Probeer anders all_digital = true bovenaan je programma (het kleine testprogramma).
Hoi Lucky,
Dus als er echt 5V op staat, leest 'ie alsnog geen 1 in (begrijp ik dat goed?)
Geen detectie = hoog, detectie = laag
Het probleem is, dat ik die portE.0 niet hoog krijg.
Op het moment dat het programma loopt, geeft hij al meteen 'Detect' aan, terwijl ik toch aan geef dat die poort HOOG op moet starten
PORTA = %00111111
PORTB = %00000000
PORTC = %00000000
PORTD = %00000000
PORTE = %00000011
TRISA = %00111111
TRISB = %11111101
TRISC = %11110000
TRISD = %11111100
TRISE = %00000011
w.b. portA.4, is net als bij de 16F628 een open drain, die kun je helemaal niet hoog maken.(picbasic.nl)
Hoe het met de rest van poortA zit, weet ik ook niet echt.
Hoewel ik die datasheet toch veel bestudeerd heb, is het meeste voor mij nog abacadabra.
Wat ik er wel uit begrepen heb, is dat de E poorten analoge poorten (kunnen)zijn.
Maar wat is parralel slave mode?
Het ontwerp van dat printje wijzigen en opnieuw etsen en bestukken wil ik het komende weekend wel doen, maar dan moet ik toch eerst die poorten toch beter leren begrijpen.
Probeer anders all_digital = true bovenaan je programma (het kleine testprogramma).
Dat ga ik morgen meteen proberen, evenals het lcd scherm proberen op de A poorten te krijgen als die voor mijn sensors echt problemen op gaan leveren.
Dit is de makkelijkste manier om het printje te wijzigen, en dan kan ik gelijk enkele kleine onvolkomenheden wegwerken, zoals die MCLR aansluiting (die ik vergeten was)
Tja... het was misschien wel wat overhaast om gelijk een printje te etsen maar ik kom ook weinig printjes tegen met versie 1.0 erop 
Hopelijk kun je mij straks iets meer vertellen over die poorten A en E
Hiervoor al bij voorbaat dank.
Groetjes Karel
Lucky Luke
Eluke.nl | handgetypt | I'm a poor, lonesome cowboy, with a long, long way to go.
Porte.0 is gewoon bruikbaar voor die sensor, als je 'm instelt op digitale ingang.
maar volgens mij kun je 'm niet op deze manier hoog maken / de ingang een pull-up geven... Bij de AVR werkt dat zo (zet DDRx.y op input, zet portx.y hoog, gebruik pinx.y om ingang te lezen), en kun je op die manier pinnen pullups geven.
Bij de PIC werkt het anders. Zo ver ik weet met een appart register voor de pull-ups, wat ook nog eens verschilt per pic.
Verder kun je beter even wachten op iemand die wat dichter op de hardware zit dan ik...
Picbasic heeft wel zoiets als portb_pullups on, wat iig werkt op de 16f628a. Maar het gaat nu niet om portb en het is een andere PIC, dus ik vrees dat je daar weinig aan hebt.
Maar als je die porte.o als ingang zet, zorgt dat 'ie ook digitaal is (all_digital = true) en niet als analoge ingang wordt gebruikt, en 'm extern een pull-up (of pull-down, afhankelijk hoe je IR sensor schakelt, en misschien heeft die sensor intern al een pull-up) geeft, dan moet het werken.
Hoi Lucky,
Probeer anders all_digital = true bovenaan je programma (het kleine testprogramma).
Dit was een schot in de roos 
Al mijn ingangen zijn nu bruikbaar voor mijn sensoren, zowel die 3 E ingangen als alle A ingangen.
Dus versie 1.2 van mijn printje kan nog even wachten.
Mij IR-sensoren werken nu prima en mijn ultrasoon (hetzij nog erg nerveus) reageerd nu ook.
Waaschijnlijk moet ik hiervoor de delay time nog even aanpassen.
Ik gebruik nu een 20 Mhz kristal i.p.v. 4 Mhz
Of ik heb niet de juiste C's hierover geplaatst.
Hier kom ik (denk ik) zelf wel uit.
Nu is het nog even uitvogelen om de motoren de juiste handelingen te laten doen, die ze moeten doen als er een opstakel is.
Er zijn momenten dat beide uitgangen van 1 motor van de L293D 12 volt geven, wat wil zeggen dat beide ingangen op dat moment hoog zijn.
Dit is dan ook de reden dat er bij het draaien maar 1 motor loopt.
Dit ga ik eerst eens proberen zelfstandig op te lossen alvorens "NEED INPUT" te roepen.
1 vraagje over mijn code heb ik wel:
ik gebruik nu voor bv. rechtsaf :
If toets6 = hoog Then 'rechtsaf draaien
motorlv = hoog
motorra = hoog
motorrv = laag
motorla = laag
EndIfKan dit simpeler? deze 4 commandos als 1 commando defineren?
wederom bedankt voor de broodnodige input.
Lucky Luke
Eluke.nl | handgetypt | I'm a poor, lonesome cowboy, with a long, long way to go.
Voor het kristal: Daar is die xtal = 20 declare voor. Dan weet de compiler welk kristal er aan de pic hangt zodat 'ie de delays daar op kan aanpassen (de delays in delayms en in diverse comunicatie, als serin, serout, busout, hbusout, rc5in etc.)
Voor de motoren:
Er zijn momenten dat beide uitgangen van 1 motor van de L293D 12 volt geven, wat wil zeggen dat beide ingangen op dat moment hoog zijn.
Dit is dan ook de reden dat er bij het draaien maar 1 motor loopt.
Dit ga ik eerst eens proberen zelfstandig op te lossen alvorens "NEED INPUT" te roepen.
Hier snap ik niet helemaal wat je bedoeld, dus kan ik ook nog niet mee helpen.
En wat het inkorten van die code betreft:
Nee, dat kan voor zover ik weet niet korter. Wel kan het misschien handig zijn als je subroutines hebt voor linksaf, rechtsaf etc. Dan hoef je niet te onthouden welke motoren er daarvoor ook alweer aanmoesten, maar zet je simpelweg "gosub rechtsaf". Zo heb ik het bij KLM3 opgelost.
Hoi Lucky,
Het was inderdaad geen erg duidelijke uitleg van mijn kant w.b. Die L293D.
Ik zal proberen hierin iets duidelijker te zijn.
Een L293D heeft 2 ingangen + de bijbehorende uitgangen en nog een enable.
ingang 1 hoog = uitgang 1 12V = motor rechtsom
ingang 2 hoog = uitgang 2 12V = motor linksom
Beide ingangen hoog = beide uitgangen 12V waardoor die motor niet kan lopen.
En dat is, wat er nog haperde in mijn code, ik vond dit ook raar, dat dit kon, maar dat is wat ik meette toen er 1 motor niet wou lopen.
Hopelijk is dit nu duidelijker.
Wel kan het misschien handig zijn als je subroutines hebt voor linksaf, rechtsaf etc. Dan hoef je niet te onthouden welke motoren er daarvoor ook alweer aanmoesten
Dit lijkt mij een goede oplossing, en dat ga ik in het weekend eens uitproberen.
Ik wordt helemaal gek van motorrv, motorlv etc.
Voor ik het weet staat er iets dubbel of verkeerd om.
Morgen eerst weer aan het mechanische gedeelte werken.
Weeral bedankt, en ik heb je een PM gestuurd.
Kevinoud
Een zak tuinaarde opescheuren
Op 15 juni 2010 23:20:18 schreef Kareltje:
Hoi Lucky,[...]
Geen detectie = hoog, detectie = laag
Het probleem is, dat ik die portE.0 niet hoog krijg.
Op het moment dat het programma loopt, geeft hij al meteen 'Detect' aan, terwijl ik toch aan geef dat die poort HOOG op moet startenPORTA = %00111111 PORTB = %00000000 PORTC = %00000000 PORTD = %00000000 PORTE = %00000011 TRISA = %00111111 TRISB = %11111101 TRISC = %11110000 TRISD = %11111100 TRISE = %00000011
Ik vind het zoiezo vreemd eerst ga je de compiler vertellen dat hij de I/O's als uitgang laag maak en A0 t/m A5 en E0, E1 als hoog.
En vervolgens ga je met het tristate comando de compiler vertellen of de poorten in of uitgangen moeten zijn
Eerst de poorten instellen en dan de pinnen pas toewijzen hoog of laag je hebt het nu omgedraait.
If toets6 = hoog Then 'rechtsaf draaien
motorlv = hoog
motorra = hoog
motorrv = laag
motorla = laag
EndIf
Dit kan wel simpeler en ruimte besparender door het direct in het register te zetten.
Stel motor lv ra rv en la zijn bit 8,7,6,5 van ( ik zeg maar wat ) poort A dan kun je het commando PORTA = %1100XXXX gebruiken (X maakt niet uit dat is afhankelijk van wat je met de andere vier pennen wilt doen.)
Mijn kennis is ook nog redelijk mager dus het kan zijn dat ik een fout maak.
(inmiddels een paar keer Geëdit)
[Bericht gewijzigd door Kevinoud op (25%)]
Nu begin ik zelf even aan mijn code te twijfelen. Juist op het moment dat het enigzins begint te werken.
met PortA = %00111111 geef ik toch aan of die poorten hoog of laag op moeten starten?
De uitgangen voor de motoren moeten laag opstarten en de sensoren juist hoog, want die geeven met vrij zicht namelijk een hoog signaal af.
Zit ik hier nu echt mis?
Even voor de duidelijkheid, als de uitgangen voor de motoren hoog worden beginnen de motoren te lopen.
Bij de sensoren werkt het juist andersom.
A0 t/m A5 en E0, E1 zijn de ingangen voor de sensoren.
Hoe zou dit er volgens jou er uit moeten zien?
Je begrijpt inmiddels wel dat ik een leek ben op dit gebied en alles graag wil leren.
Alle info is welkom.
Lucky Luke
Eluke.nl | handgetypt | I'm a poor, lonesome cowboy, with a long, long way to go.
Op 18 juni 2010 19:31:48 schreef Kevinoud:
If toets6 = hoog Then 'rechtsaf draaien motorlv = hoog motorra = hoog motorrv = laag motorla = laag EndIfDit kan wel simpeler en ruimte besparender door het direct in het register te zetten.
Stel motor lv ra rv en la zijn bit 8,7,6,5 van ( ik zeg maar wat ) poort A dan kun je het commando PORTA = %1100XXXX gebruiken (X maakt niet uit dat is afhankelijk van wat je met de andere vier pennen wilt doen.)Mijn kennis is ook nog redelijk mager dus het kan zijn dat ik een fout maak.
Hmm, daar heb je een punt, op die manier kan het inderdaad korter. Alleen moet je dan wel kijken dat je de andere bits van die poort niet veranderd. (Dat kan, al zou ik even moeten proberen hoe ook alweer. Iets door te AND-en met 1 op de plek waar je een bit wil aanpassen en 0 waar je dat niet wil.)
Wel ingewikkelder, hoewel, 1x uitzoeken en in een subroutine zetten is genoeg.
Wat de volgorde betreft: Die PIC loopt zodanig snel dat je niet bang hoeft te zijn dat de motoren gaan lopen als je de poort eerst als uitgang insteld en daarna een waarde toekent. Ze lopen dan misschien 1/5000000 seconde... (20Mhz, dus 5.000.000 instructies per seconde. 1 instructie stelt de boel als uitgangen in en de volgende maakt ze laag, als ze dat niet al waren).
Ok. misschien kost het instellen wat meer instructies, dan zou ik in de asm moeten kijken. Laten ze 10/5000000 van een seconde draaien, dat merk je volgens mij niet eens.
Sensoren zelfde verhaal, die ingangen krijgen vanzelf al de goede waarde door wat er aan hangt. Ik weet niet eens of je ze op deze manier een waarde kan geven in je programma...
Ik heb inmiddels die ultrasoon een heel stuk minder nerveus kunnen krijgen (Valium
)
Er zat toch wel degelijk een verschil in de kristalwaarde w.b. die pulsout.
Wat proton hierover schrijft:
The resolution of Pulsout is dependent upon the oscillator frequency. If a 4MHz oscillator is used, the Period of the generated pulse will be in 10us increments. If a 20MHz oscillator is used, Period will have a 2us resolution. Declaring an XTAL value has no effect on Pulsout. The resolution always changes with the actual oscillator speed.
Dus, ik heb nu de period-time veranderd van 1 naar 20 wat dezelfde period-time geeft
wb die motorbesturing, ga ik toch voor de subroutines, dit lijkt mij de eenvoudigste weg.
inmiddels heb ik alle sensoren naar behorend werkende, alleen nu reset hij de hele pic na de eerste detectie van mijn IR-sensor.
Ik ga nu eerst eens mijn hele code veranderen naar subroutines voor linksaf, rechtsaf etc.
Lucky Luke
Eluke.nl | handgetypt | I'm a poor, lonesome cowboy, with a long, long way to go.
En ben je geboren met zowel een linker als een rechterhand... gebruik dan zowel handen als hoofd
Gebruik je een 4 of een 20Mhz kristal?
1*10 =!= 20*2 trouwens... Dus ik geloof dat ik het niet helemaal volg, ik zou dan 5 verwachten... (d'r vanuit gaande dat je eerst een 4 Mhz kristal had, en nu een 20Mhz kristal hebt)
Maar als de sensoren beter werken met een period-time van 20, prima.
[Bericht gewijzigd door Lucky Luke op (12%)]
Sorry voor mijn verwarrende uitleg.
Syntax
PULSOUT Pin , Period, { Initial State }
PulsOut pulsuit, 1 ; zend puls
DelayUS 40 ; wacht op echo
afstand = PulsIn ontvang,1 ; ontvang de echo
Print At 1, 1, Dec afstand /5,8 ; zet waarde op lcddit gebruikte ik bij 4Mhz.
1*10 uS met een wachttijd van 40 uS op de echo
nu gebruik ik met een 20 Mhz x-tal:
PulsOut pulsuit, 20 'zend puls
DelayUS 300 'wacht op echo
afstand = PulsIn ontvang,1 'ontvant de echo
afstand = afstand /29 'deel de waarde door 29 voor cmNu dus 20*2 Us met een wachttijd van 300 Us
Ik zat in het begin echt aan het minimum van 10 Us wat voorgeschreven werd.
(flinke)edit:
de gehele code inmiddels veranderd (subroutines)
De ultrasoon werkt nu perfect (alleen metingen)en akelig nauwkeurig.
Maar de IR-sensor is nog een flink probleem
Het rare is is nu, dat hij een mooi laag signaal afgeeft wanneer er detectie is (+/- 13mV)en met vrij zicht een mooi hoog signaal 5.04V
als ik nu de ir-sensor aktiveer krijg ik bij detect 3.9V en bij vrij zicht toch 5.04V
Alleen hij reageerd nu als detect, dus de motoren beginnen gelijk als detect te draaien en veranderen niet meer.
waar komt die 3.9V vandaan?
edit:
STOM!!!!
Ik was vergeten, bij deze vernieuwde code de ingangen digitaal te zetten 
Alles werkt nu perfect YESS!!
Nu kan ik eindelijk verder 
volgende stap is de servo
Hallo,
Tijd voor een update (en een kick
)
Wat hebben we nu?
Wat werkt, en wat niet?
Ik heb de totale code veranderd en alles in subroutines onder gebracht.
De IR-sensoren werken nu perfect, bij detectie draait de robot meteen naar rechts cq links en blijft nog 2 sec. doordraaien.
In de ultrasoonmode stopt de robot bij nadering van een obstakel binnen 30cm, dan draait de servo 2x naar links en rechts om daarna weer rechtdoor te rijden.In deze periode moet de robot een vrije doorgang vinden.
Lucky Luke schreef:
Als je de sensor met een servo kunt laten ronddraaien kun je kijken bij welke servopositie de sensor de grootste afstand meet. Daar zit dan de vrije doorgang. Vervolgens stuur je je robot die richting op (eerst bijdraaien tot je bij rechtdoor kijkende sensor die grote
afstand hebt, vervolgens rechtdoor). Als je je sensor niet kunt laten draaien laat je de hele robot draaien, dan sta je ook gelijk in de goeie richting.
Nou, de servo werkt, maar verder weet ik met het voorbeeldje geen raad.
Is een beetje een duidelijker voorbeeld mogelijk voor een 'leek'?
De code, zover ik nu ben w.b. de ultrasoonsensor:
ultrasoon: 'Ultrasoon inschakelen
Cls
Repeat
GoSub ping 'effe een meting doen
Print At 1, 1, "afstand is:"
Print At 1, 12, DEC3 afstand 'zet waarde op lcd
If afstand < 30 Then 'als de waarde van afstand nu kleiner is dan 30:
Print At 2,1, " Opstakel " 'tekst op het scherm zetten.
GoSub stoppen 'stoppen en servo inschakelen om een vrije doorgang te vinden
GoSub servo_aan
ElseIf afstand > 50 Then 'als de waarde van afstand nu Groter is dan 50:
Print At 2,1, "vrije doorgang" 'tekst op het scherm zetten.
GoSub rechtdoor
EndIf
Until toets1 = hoog xor toets5 = hoog xor toets7 = hoog xor toets9 = hoog
Return
servo_aan:
For teller = 1 To 2
For positie = 1500 To 2050 Step 20 'Omhoog tellen met stapjes van 10uSec vanuit de middenpositie
GoSub ping 'bij elke stap even meten
Print At 1, 12, DEC3 afstand 'zet waarde op lcd
Servo servopos, positie 'Stuur 'Positie' pulsjes naar PORTE.1
DelayMS 18
Next
For positie = 2050 To 950 Step -20 'Terug tellen met stapjes 20uSec
GoSub ping 'bij elke stap even meten
Print At 1, 12, DEC3 afstand 'zet waarde op lcd
Servo servopos, positie 'Stuur 'Positie' pulsjes naar PORTE.1
DelayMS 18
Next
For positie = 950 To 1500 Step 20 'en weer terug naar de middenpositie
GoSub ping 'bij elke stap even meten
Print At 1, 12, DEC3 afstand 'zet waarde op lcd
Servo servopos, positie
DelayMS 18
Next
Next
Returnzoals je ziet heb ik tijdens het draaien van de servo bij elke stap een meting uit laten voeren.
Ik weet anders niet hoe ik die servo kan laten draaien en tegelijk metingen kan laten doen.
Wat de mechanische vorderingen betreft..
Ik had een foutje gemaakt bij het tekenen van de kettingwieltjes 
Dus nieuwe wieltjes getekend en de files naar de laserboer gestuurd en weer afwachten.
Dus de eerste proefrit is weer uitgesteld 
(wordt vervolgd)
Lucky Luke
Eluke.nl | handgetypt | I'm a poor, lonesome cowboy, with a long, long way to go.
Meting uitvoeren per stapje is prima. Microcontrollers kunnen niet multitasken 
Je zet nu de waarden tijdens het meten op het scherm. Je zou daar nog iets aan toe kunnen voegen dat ze ook opslaat. Je hebt dan 2 variabelen nodig: 1 voor de afstand, en 1 voor de servopositie.
Dan kun je hetvolgende doen (pseudocode)
initialiseer variabelen (op 0 is goed genoeg, dus als je clear hebt staan onder de lijst met declaraties is het goed)
1
Draai naar volgende servopositie (zoals je al doet)
Doe een meting (zoals je al doet)
Als de meting een grotere afstand aangeeft dan je had:
sla afstand op
sla bijbehorende servopositie op
eindals 
herhaal vanaf 1 tot je zoals je nu al doet 2x naar links en rechts gedraaid hebt.
Daarna kun je de servo weer naar het midden draaien (hij is toch al in het midden na de meting?), kijken of de servopositie aangeeft dat je naar links of naar rechts moet draaien, en dan de hele robot draaien in de goede richting. Tussentijds meten, en als je weer die grote afstand meet: rechtdoor gaan. (Beter: als je nét iets minder dan die grootste afstand meet. Dit om te voorkomen dat 'ie rondjes blijft draaien omdat de afstand net iets kleiner is of er wat "speling" zit in de meetwaarden)
Mooier nog is het om de servo terug te laten draaien terwijl de robot heen draait. Dus dat de sensor naar de doorgang gericht blijft terwijl de robot bijdraait.
Ideetje daarvoor:
Sensor 2x heen en weer laten zwiepen zoals bij de andere methode, metingen weer opslaan. Je komt volgens mij in het midden uit na de meting, dus dan zou je 'm weer naar de positie moeten laten draaien waar de grootste afstand was. Vervolgens laat je de een stukje in de goede richting draaien, en draai je de servo vervolgens bij tot 'ie weer naar de grootste afstand kijkt (een stukje meer naar het midden draaien, bij elk stapje meten, en stoppen bij net iets minder dan de grootste afstand). Als de servo in het midden staan is de robot ver genoeg gedraaid en kun je rechtdoor.
Misschien moet je nog iets maken dat het opvangt als de robot te ver doorgedraaid is.
Er zijn natuurlijke vele wegen die naar Rome leiden. Hierboven staan 2 mogelijkheden. Ik ben niet verantwoordelijk voor kuilen in de weg en reizigers die eigenlijk niet naar Rome, maar naar Groesbeek willen. Maar hopelijk zit er wat bruikbaars tussen.
Hoi Lucky,
Over deze funktie loop ik al een tijdje te brainstormen , en hoewel jij mij hiermee een eind probeerd op weg te helpen heb ik best wel enkele vragen, en mogelijke andere opties.
Servo servopos, 1500Deze regel staat bovenaan in het hoofdprogramma, dus, hij zet meteen zijn hoofd recht vooruit.
En ook na het meten ook weer in deze positie terug.
Wat ik eerst wil doen, is de metingen tijdens het zoeken terug brengen van 50 (per 180°)naar 8 stapjes van 22.5°
Dit maakt straks het meten en vergelijken eenvoudiger.
Als de robot eenmaal rijdende is, kan ik proefondervindelijk vaststellen hoeveel seconden de robot nodig heeft om 180° graden te draaien, zodat ik meteen weet hoeveel Ms ik de motoren moet laten draaien per 22.5° want het zijn nu eenmaal geen servo's.
Als de meting een grotere afstand aangeeft dan je had:
sla afstand op
sla bijbehorende servopositie op
Hoe sla ik metingen op? en hoe lees ik ze weer terug?
Met cwrite en cread?
Of kan ik beter een soort data tabel maken van een gradenboog en de metingen hiermee vergelijken?
Als ik dat allemaal heb dan lijk de rest ook niet meer zo moeilijk (hoop ik).
Bijvoorbeeld:
Obstakel!! robot stopt, bukt, weg vrij....doorijden
Nog steeds obstakel.. robot kijkt rond, slaat de hoogste waarde op, kijkt weer vooruit, en begint te draaien.
Hij draait nu dus het aantal sec. dat corepondeerd met de hoek waarin de hoogste waarde werd gemeten.
Klopt dit allemaal een beetje?
Een hele andere optie is een digitaal compas.
Dan is het een stuk eenvoudiger te navigeren.
Je laat immers de motoren zolang draaien totdat het aantal graden bereikt is, waarin de servo stond bij de hoogste meting.
Ken jij (of iemand op CO) dit soort compas van parallax
of evt. die andere van deze site?
Ik heb de voorbeelden eens bekeken, en proberen te begrijpen, maar ik kan geen wijs uit deze programmeertaal.
Verder staat op deze site
een filmpje van de boe-bot en voorbeelden van de bijbehorende source
Dit is geschreven in basic stamp.
Is dit makkelijk om te zetten naar picbasic?
Wederom bedankt voor het meedenken!
Lucky Luke
Eluke.nl | handgetypt | I'm a poor, lonesome cowboy, with a long, long way to go.
Wat ik eerst wil doen, is de metingen tijdens het zoeken terug brengen van 50 (per 180°)naar 8 stapjes van 22.5°
Dit maakt straks het meten en vergelijken eenvoudiger.
Als de robot eenmaal rijdende is, kan ik proefondervindelijk vaststellen hoeveel seconden de robot nodig heeft om 180° graden te draaien, zodat ik meteen weet hoeveel Ms ik de motoren moet laten draaien per 22.5° want het zijn nu eenmaal geen servo's.
Is ook een optie. Er zijn vele wegen...
Opslaan en teruglezen van metingen:
Dat doe je al
In de subroutine Ping doe je een meting, waarvan het resultaat opgeslagen wordt in de variabele "afstand".
Teruglezen doe je door die variabele weer te gebruiken in een vergelijking.
Eread en ewrite zijn bedoeld om dingen op te slaan in intern EEPROM.
cwrite en cread... Hmm, was dat niet net zoiets maar dan voor code memory?
nog nooit gebruikt... EEPROM ook maar zelden...
Meten wat de grootste afstand was wordt dan zoiets:
Gosub ping
if afstand > vorige then
vorige = afstand
servoposDoorgang = servopos
end if
binnen zo'n lusje wat de servoposities 1 voor een probeert.
compas heb ik geen ervaring mee. Lijkt me eigenlijk overkill...
Obstakel!! robot stopt, bukt, weg vrij....doorijden
Nog steeds obstakel.. robot kijkt rond, slaat de hoogste waarde op, kijkt weer vooruit, en begint te draaien.
Hij draait nu dus het aantal sec. dat corepondeerd met de hoek waarin de hoogste waarde werd gemeten.
Klopt! eventueel kun je dan ook de servo in stapjes terugdraaien terwijl de gehele robot tegelijkertijd heen draait, als dat er mooi uit ziet.
Basicstamp omzetten... Hmmm, als je die taal kan lezen en iets maakt wat hetzelfde doet in picbasic... De talen komen wel deels overeen, maar niet 1 op 1. 't is niet zo'n lastige taal, dus moet wel te doen zijn... Of het makkelijk is hangt af van hoeveel ervaring je hebt.
Eindelijk mijn kettingwieltjes klaar, en de aandrijving zoals ik hebben wil.
Het resultaat: 
Hij loopt nu lekker soepel, en morgen hoop ik de eerste testrit te kunnen maken 'ben benieuwd'
wat de software betreft...
Er zit een erg eigenaardig probleem in.
Als ik vóór het hoofdprogramma opgeef:
servo servopos, positie = 1500symbol servopos = PORTE.1zou de servo toch moeten centreren.
Maar bij het opstarten draait de servo helemaal naar links (positie 2000)
Ik heb een printopdracht gegeven om de servostanden te bekijken en 1500 is toch echt de middenpositie.
Waarom centreert die servo niet?
Iemand een idee?
een stukje code bij het opstarten:
DelayMS 500
Cls
'welkomst boodschap
Print At 1, 6, "Hallo"
Print At 2, 2, "Ik ben Johnny 6"
DelayMS 2000
Print At 1, 3, "READY TO GO !!"
Print At 2, 1, " "
DelayMS 2000
Cls
Print At 1,1, "start" 'vanaf hier klaar voor gebruik
Clear
Servo servopos, 1500 'hier zou de servo naar de middenpositie moeten gaan
GoTo hoofdprogramma
Lucky Luke
Eluke.nl | handgetypt | I'm a poor, lonesome cowboy, with a long, long way to go.
Moet dat servocommando niet een paar keer herhaalt worden? Dat het 1 puls stuurt en er dus nog een lusje omheen moet wat ervoor zorgt dat er tig keer (50? 100?) per seconde een pulsje komt.
dus iets als:
...
clear
for tellertje = 0 to 50 ; misschien lukt het ook met minder. Of juist meer nodig.
servo servopos, 1500
delayms 18
next
goto hoofdprogramma
...
wat dan meerdere pulsjes stuurt bij het opstarten.
Ben benieuwd naar het resultaat van de testrit 
dat lusje gebruik ik ook, maar dan tijdens het meten
Ik laat die dan 2 keer rondkijken
Onderstaande code komt van Pic-basic:
;Hoofdprogramma
Positie = 1500 ;Eerst de servo centreren
WHILE 1 = 1 ;Oneindige lus
IF RechtsOm = LAAG AND Positie < 2300 THEN Positie = Positie + Snelheid
IF LinksOm = LAAG AND Positie > 700 THEN Positie = Positie - Snelheid
SERVO Motor, Positie ;Stuur 'Positie' pulsjes naar poort 'Motor'
DELAYMS 20 ;20mSec = 50Hz, eventueel wijzigen bij ander type motor
WEND ;Terug naar WHILEHierin laat Frits ook eerst de servo centreren met:
Positie = 1500 ;Eerst de servo centrerenIk heb het ook al eens geprobeerd met:
servo servopos, 1500Dit geeft hetzelfde resultaat
edit: wat nog vreemder is:
Als ik de programmer (wisp648) los koppel, dan start de pic op, en de servo komt WEL in de middenpositie.
Haal ik de voeding los, en sluit deze weer aan, dan draait de servo bij het starten naar links.
Vreemd??
Toch ergens een hardware foutje?
[Bericht gewijzigd door Kareltje op (14%)]
Vandaag de eerste proefrit gemaakt.
Helaas was deze erg teleurstellend.
De motoren waren inderdaad te licht (zoals mede forumgangers al voorspelden).
Ook de L293D was niet erg blij met die zware belasting.
Hij werdt erg heet.
Toch was het erg leuk, dat ding te zien rijden, hetzij erg moeizaam.
Sturen was er al helemaal niet bij.
Toch een filmpje van gemaakt, hetzij van erbarmelijke kwaliteit (gsm)
johnny6
Ik moest hem in het begin een schop onder zijn kont geven 
Nieuwe motoren zijn inmiddels besteld, evenals de L298N
Deze nieuwe motoren zouden een factor 5 krachtiger moeten zijn.
En ik hoef aan de motorophanging niet erg veel te veranderen.
Ben benieuwd
Jeroen13
//Project Quadrocopter 2.0 in progress //dsESC4x //PIC32Flight
Wow vette robot, mooi uitgewerkt.
Volgens mij heb je ook een mooie werktplaats tot je beschikking
, die mis ik nog.
Als je toevallig nog een sterkere kant en klare H-Brug zoek moet je de volgende eens bekijken.
VNH3SP30-E
Voor motoren zou ik hier eens kijken:
http://stores.shop.ebay.nl/zwiebelkoenig__W0QQ_armrsZ1
Deze hebben heel wat meer koppel en dat heb je zeker nodig.
Ga zo door.
[Bericht gewijzigd door Jeroen13 op (19%)]
Zonder een goed uitgeruste werkplaats zou dit project onbetaalbaar zijn.
Wij werken veel met RVS en dat bied mij enorm veel mogelijkheden.
Denk maar aan het laser snijwerk... vraag maar eens wat dat kost, als jet het ergens wil laten maken.
Zo laat ik straks ook die mooie zijschermpjes, en het bedieningspaneeltje uitsnijden in 1 mm RVS.
Ik ben nu het hoofd aan het ontwerpen.
Die wordt met een servo aangedreven en voorzien van een ultrasoon sensor (srf05)
Wat die H-bridge betreft....30 Amp.!! een beetje overkill??
Ik heb een L298N besteld, dit is wel op het randje, maar ik monteer die op een flink koelblok, wat tevens het rugschild gaat worden.
Die L298N kan ik zonder veel aanpassingen met soldeerpennen op de plaats van die 293 monteren.
Later komt er toch een nieuwe definitieve versie van het mainboard.
Volgende weekend verwacht ik de 2de proefrit met die nieuwe motoren.