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.

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


End

Groetjes Karel

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

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
    EndIf

Kan dit simpeler? deze 4 commandos als 1 commando defineren?

wederom bedankt voor de broodnodige input.

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.

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 starten

PORTA = %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.

Op 18 juni 2010 19:31:48 schreef Kevinoud:


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.

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.

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 lcd

dit 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 cm

Nu 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
Return

zoals 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)

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, 1500

Deze 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
http://www.active-robots.com/products/parallax/images/sensory/29323-500.jpg
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!

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:
http://www.uploadarchief.net/files/download/aandrijving.jpg
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 = 1500
symbol servopos = PORTE.1

zou 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

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 WHILE

Hierin laat Frits ook eerst de servo centreren met:

Positie = 1500                ;Eerst de servo centreren

Ik heb het ook al eens geprobeerd met:

servo servopos, 1500

Dit 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

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.