robot look like johnny 5 (leuk project)

Motoren zijn besteld!

Het gaan 2 HG62 Geared Motor 62:1
worden.
Ze zijn best heel sterk en simpel op de bestaande motorsteunen te bevestigen.

Als motordriver heb ik gekozen voor een DUAL VNH3SP30
Als ik de specs met elkaar vergelijk zou die driver het makkelijk aan moeten kunnen bij normaal gebruik.

Wat wordt verstaan onder "stall torque"?
Bedoelen ze daarmee, als de motor tegengehouden word, dus niet ronddraaid?
En Amps nominaal?
Ampere's bij totaal onbelaste motoren, of welke belasting anders?

Ik kan over een heatsink voor die driver nergens iets vinden.
Geen speciaal daarvoor ontworpen koellichaam.
Ik kan natuurlijk alle uitstekende componenten, zoals elko's en headers aan de achterzijde solderen en het printje met een klemmetje op een koelblok monteren.
Maar is een heatsink wel nodig?

Jullie mening? (voordat ik dat ding opblaas.)

Edit:

http://www.uploadarchief.net/files/download/001008000b.jpg
Het (voorlopige) ontwerp van het hoofd

Hallo,
Ik heb nog een vraagje over het aansluiten van die VNH3SP30 motordriver.
Aan de linkerzijde van het pcb wordt aan de middelste pin de +5V aangesloten
Daarlangs 2x de GND
Daar weer langs 2x VIN
Die VIN kan die gewoon samen met +5V aangesloten worden?
In het schema spreken ze weer van VBAT(batterij)
Of mag die VIN gewoon NC blijven?
VCC en VBAT lijken mij aan die zijde hetzelfde (+5V)

bij voorbaat dank

http://www.pololu.com/picture/0J121.280.jpg

PCB met pinbezetting.
http://www.pololu.com/picture/0J411.628.png

Het bijbehorende schema.

Denk niet dat deze H-bruggen voldoen aan met deze motor, en vooral bij het opstarten.

De motoren verbuiken bij 0RPM en volle belasting (stall torque) 32A, bij deze stroom zal de hbrug in beveiliging schieten.

Dit is op te lossen door gewoon softstart toe te passen.

VBAT is je motor spanning (dit zal geen 5V zijn denk ik).

zoek even naar een oude CPU koeler of kijk bij farnell voor een passend koelblok.

//Project Quadrocopter 2.0 in progress //dsESC4x //PIC32Flight

ik zou presoonlijk gewoon voor een oude cpu koeler gaan, kost niets en dan gewoon even een keer naar een rommelmarkt gaan en een oud computertje kopen voor 50cent

Henry Rolls (van Rolls- Royce): "The quality remains long after the price is forgotten,"

vbat is zeer zeker niet de motorspanning.
De 12V wordt aan de rechterkant met een printklem aangesloten.
Hierlangs zitten de aansluitingen voor de motor.

Daarom was het voor mij ook onduidelijk, w.b. die VCC
Hier gebruiken ze VCC voor zowel de 12V als de 5V
Aan de linkerzijde komt een header met alle (stuur)aansluitingen
En1 En2 in1 1n2 enz. en de stuurspanning van 5V

edit: @ robotter
Voor de koeling heb ik een mooie koelpaat op de kop weten te tikken die (bijna) precies het rugschild gaat vormen.
Hier monteer ik die H-bridge op en tevens mijn 7805

@ DJJeroen,
Ik moet mijn ongelijk erkennen, die VIN's aan de linkerzijde zitten wel degelijk op hetzelfde koperspoor, 12V dus, die hoef ik dan niet aan te sluiten, daar al via de andere zijde gevoed worden.

[Bericht gewijzigd door Kareltje op vrijdag 16 juli 2010 15:44:06 (16%)

Lucky Luke

Golden Member

Ik hoop dat dat goed gaat komen met die motoren... Ik had bij KLM3 eerst ook te slappe motoren (en die weegt in verhouding tot Johny 6 niks). Waren 12V motortjes zonder gearbox, op 6V. Dat ging niet. Nu zitten er onbekende motortjes in uit oude slangpompjes. Behoorlijk sterk, wel vrij sloom. Al valt de snelheid nog mee nu ik ze wat meer spanning geef.

Dat hoofd ziet er leuk uit trouwens. Ga je er ook servotjes inzetten om die "wenkbrouwklepjesdingen" te bewegen?

Eluke.nl | De mens onderscheid zich van (andere) dieren door o.a. complexe gereedschappen en bouwwerken te maken. Mens zijn is nerd zijn. Blijf Maken. (Of wordt, bijvoorbeeld, cultuurhistoricus)

Hey Lucky,

Ik verwacht die motoren komende week.
Ik heb intussen de pcb aangepast op die nieuwe H-bridge, en ga die dit weekend nog etsen en bestukken.
Verder heb ik ook die bukfunktie in orde (nu de software nog).

Het hoofd heb ik getekend naar de materialen die in de werkplaats te vinden zijn :)
En die wimpers...het was zeker de bedoeling dat hij met zijn ogen gaat knipperen, al is het maar met de bovenste wimpers.

Is KLM3 al ergens te zien?
En wat is het toerental van die motoren?

Lucky Luke

Golden Member

KLM3 is te zien in SYP. Alleen daar zit er nog de oude motorsturing in, die is inmiddels vervangen (er zat een fout in: de transistors konden niet volledig worden opengestuurt. 't was een zelf ontworpen H-brug recycled van KLM3, hij werkte dus wel maar met nogal een hoge spanningsval over de transistoren). En inmiddels heeft KLM3 ook een richtingsgevoelige IR sensor aan de zijkant. + de sensor voor muren is nu een TSOP1738 kloon ipv een TSOP1736, waardoor de eigen IR bron minder sterk hoeft te zijn. Er is dus nog het een en ander aan veranderd sindsdien, en ik werk ook nog aan de software.

De motoren (heb net even een minuutje zitten tellen) doen nu 57 omwentelingen per minuut. Dat is met volle batterijen. Puur omdat ik het zelf ook wel wil weten hieronder even een berekeningetje: de wieldoorsnede is zo'n 5cm, omtrek (Pi*d) dus 15,7CM. 15,7 * 57 = 894,9 CM / minuut. Dat is 894,9 /6000 = 0.15 m/s of (894,9 * 60) / 100000 = net iets meer dan een halve kilometer in 't uur.

KLM3 is dus niet bijster snel...

Eluke.nl | De mens onderscheid zich van (andere) dieren door o.a. complexe gereedschappen en bouwwerken te maken. Mens zijn is nerd zijn. Blijf Maken. (Of wordt, bijvoorbeeld, cultuurhistoricus)

Ik heb nog 2 van deze over.
KLM3 is ook een mooi project, veelzijdig, vooral op software gebied ziet het er erg mooi uit.
Aan zo'n keuze menu heb ik ook al eens aan zitten denken, maar laat ik eerst eens het simpeler programmeren onder de knie proberen te krijgen.
De vrije doorgang vinden met die ultrasoon krijg ik nog niet voor elkaar, da's toch moelijker dan ik dacht.

Lucky Luke

Golden Member

De hardware is inderdaad een dradenzooi ;). (Software ben ik ook nog mee bezig trouwens.) KLM4 gaat op gehackte servotjes rijgen (Ook niet echt snel. Wel klein).

Maar die RB-35 zijn mooie motoren... Voor een KLM achtige robot bijvoorbeeld :)
(KLM 5?)

Hoe ver ben je met het [vrije doorgang zoeken met ultrasoon]?
Gooi eventueel maar wat code hier neer. Ik kan wel even kijken.

Misschien kan dit van pas komen:
http://www.societyofrobots.com/ Heb ik een tijdje geleden ontdekt, en staan best veel leuke robots op, met uitleg over hoe ze werken. Misschien heb je iets aan de manier waarop stampy objecten zoekt. En anders staan er toch een hoop leuke robots op (zelfs een poging een robot te maken die over water kan lopen!)

Eluke.nl | De mens onderscheid zich van (andere) dieren door o.a. complexe gereedschappen en bouwwerken te maken. Mens zijn is nerd zijn. Blijf Maken. (Of wordt, bijvoorbeeld, cultuurhistoricus)

Voor KLM5... je weet dat ik ze over heb :)

Wat betreft, die Ultrsoon....
Ik kom er echt niet meer uit
1) hij ziet obstakel en de servo gaat 2x zoeken, prima
2) hij geeft mooi 3 sec. de grootste afstand op de lcd aan
3) Nu draait de servo naar een andere positie dan waar hij
de grootste afstand meette. Waarom?

Ik geef hieronder de voledige code zodat je ook de variabelen na kan checken.

pic basic code:

Device 16F877A
Config hs_osc, wdt_off, pwrte_off, BODEN_On, LVP_OFF
 XTAL = 20  
ALL_DIGITAL = true

Dim teller As Byte
Dim afstand As Word
Dim zendpuls As Word
Dim echo As Word
Dim positie As Word
Dim afstand_oud As Word 
Dim servoposdoorgang As Word

Symbol pulsuit = PORTB.1
Symbol ontvang = PORTB.0
Symbol toets1 = PORTD.7
Symbol toets2 = PORTD.6
Symbol toets3 = PORTD.5
Symbol toets4 = PORTD.4
Symbol toets5 = PORTC.7
Symbol toets6 = PORTC.6
Symbol toets7 = PORTD.2
Symbol toets8 = PORTD.3
Symbol toets9 = PORTC.4
Symbol toets0 = PORTC.5
Symbol motorlv =  PORTC.2
Symbol motorla =  PORTD.0
Symbol linksen =  PORTC.0
Symbol motorrv =  PORTC.1
Symbol motorra =  PORTC.3
Symbol rechtsen = PORTD.1
Symbol bukken =   PORTE.2
Symbol irsens1 =  PORTE.0
Symbol irsens2 =  PORTA.4
Symbol servo1 = PORTE.1
Symbol laag = 0
Symbol hoog = 1
 
        ;76543210
PORTA = %00111111 
PORTB = %00000000
PORTC = %00000000 
PORTD = %00000000
PORTE = %00000001
TRISA = %11111111
TRISB = %11111101
TRISC = %11110000 
TRISD = %11111100
TRISE = %00000001  
DelayMS 500
Cls
 
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
Clear


GoTo hoofdprogramma

rechtdoor:

        motorlv = hoog
        motorrv = hoog
        motorla = laag
        motorra = laag
    Return        
achteruit:

        motorla = hoog
        motorra = hoog
        motorrv = laag
        motorlv = laag
    Return
linksaf:

        motorrv = hoog
        motorla = hoog
        motorlv = laag
        motorra = laag
    Return
rechtsaf:

        motorlv = hoog
        motorra = hoog  
        motorrv = laag
        motorla = laag
    Return
stoppen:

        motorlv = laag
        motorrv = laag
        motorra = laag
        motorla = laag
    Return
    
ping:                                           'ultrasoon meting
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
            DelayMS 20                          'pauze om de metingen stabieler weer te geven
Return  
              
ir_aan:                                         'IR-sensor aan                                  
Repeat                                          'Herhalen                              
    If irsens1 = laag Then                      'linkersensor ziet opstakel
           Print At 2, 3, "detect"
           GoSub linksaf
           DelayMS 2000                         'robot draait nog 2 sec. door       
    EndIf
   If irsens1 = hoog Then
   Print At 2, 3, " vrij "
         GoSub rechtdoor
         EndIf                                            
    If irsens2 = laag Then                      'rechtersensor ziet opstakel
    Print At 2, 3, "detect"
           GoSub rechtsaf
           DelayMS 2000                         'robot draait nog 2 sec. door       
    EndIf
    If irsens2 = hoog Then
    Print At 2, 3, " vrij "
        GoSub rechtdoor
        EndIf
Until toets3 = hoog xor toets5 = hoog xor toets7 = hoog xor toets9 = hoog   'deze lus beeindigen wanneer er een aandere mode geselekteerd word
Return 

ultrasoon:                                      'Ultrasoon inschakelen
Cls                                     
     Repeat
GoSub ping                                      'metingen tijdens rijden
            Print At 1, 1, "afstand is:"
            Print At 1, 13, 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.     
        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 2250 Step 20             'Omhoog tellen met stapjes van 10uSec   vanuit de middenpositie
  GoSub ping                                     'bij elke stap even meten
  Print At 1, 13, DEC3 afstand                   'zet waarde op lcd
   Servo servo1, positie                         'Stuur 'Positie' pulsjes naar PORTE.1                                                                   
  Next

  For positie = 2250 To 850 Step -20             'Terug tellen met stapjes 20uSec
  GoSub ping                                     'bij elke stap even meten
  Print At 1, 13, DEC3 afstand                   'zet waarde op lcd 
    Servo servo1, positie                        'Stuur 'Positie' pulsjes naar PORTE.1                                      
  Next
  
   For positie = 850 To 1500 Step 20              'en weer terug naar de middenpositie
   GoSub ping                                     'bij elke stap even meten
   Print At 1, 13, DEC3 afstand                   'zet waarde op lcd 
     Servo servo1, positie                        'Stuur 'Positie' pulsjes naar PORTE.1 
     
     If afstand > afstand_oud Then
   afstand_oud = afstand
   servoposdoorgang = positie                    
   EndIf 
    DelayMS 18                                   'pauze van 18 Msec. voor de servo
   Next
Next
Print At 1,1, "doorgang op:"
Print At 1,13, DEC3 servoposdoorgang            'hier geeft hij de vrije doorgang aan
DelayMS 3000 
Servo servo1, servoposdoorgang                  'hier zou hij naar de vrije doorgang moeten gaan maar hij gaat naar een andere willekeurige positie
Return                                          'hierna zou de robot naar die vrije doorgang moeten draaien.

hoofdprogramma:


While 1 = 1

linksen = hoog  
rechtsen = hoog                            
    If toets2 = hoog Then                       'rechtdoor rijden
GoSub rechtdoor
    EndIf
    If toets4 = hoog Then                       'linksaf draaien
GoSub linksaf
    EndIf
    If toets5 = hoog Then                       'stop!!
        GoSub stoppen
    EndIf
    If toets6 = hoog Then                       'rechtsaf draaien
GoSub rechtsaf
    EndIf
    If toets8 = hoog Then                       'achteruit rijden
GoSub achteruit
    EndIf 
    If toets1 = hoog Then                       'IR-sensors aan
    Cls
    Print At 1, 1, "IR-sensors aan" 
    DelayMS 2000                  
GoSub ir_aan                        
    EndIf  
    If toets3 = hoog Then                       'ultrasoonsensor aan
    Cls
    Print At 1, 1, "ultrasoon"              
    Print At 2, 1, "sensor aan"
    DelayMS 2000
GoSub ultrasoon
    EndIf                              
Wend  
 
End
             

Hopelijk kun je hier wel iets van maken.
Wel graag uitleg, van wat je veranderd hebt, zodat ik hier ook lering uit kan trekken.
Bij voorbaat dank

Misschien kan dit van pas komen:
http://www.societyofrobots.com/

Mooie site, staat inmiddels bij mijn favorieten

Lucky Luke

Golden Member

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             'Omhoog tellen met stapjes van 10uSec   vanuit de middenpositie
  GoSub ping                                     'bij elke stap even meten
  Print At 1, 13, DEC3 afstand                   'zet waarde op lcd
   Servo servo1, positie                         'Stuur 'Positie' pulsjes naar PORTE.1                                                                   
  Next
 
  For positie = 2250 To 850 Step -20             'Terug tellen met stapjes 20uSec
  GoSub ping                                     'bij elke stap even meten
  Print At 1, 13, DEC3 afstand                   'zet waarde op lcd 
    Servo servo1, positie                        'Stuur 'Positie' pulsjes naar PORTE.1                                      
  Next
 
   For positie = 850 To 1500 Step 20              'en weer terug naar de middenpositie
   GoSub ping                                     'bij elke stap even meten
   Print At 1, 13, DEC3 afstand                   'zet waarde op lcd 
     Servo servo1, positie                        'Stuur 'Positie' pulsjes naar PORTE.1 
 
     If afstand > afstand_oud Then
   afstand_oud = afstand
   servoposdoorgang = positie                    
   EndIf 
    DelayMS 18                                   'pauze van 18 Msec. voor de servo
   Next
Next
Print At 1,1, "doorgang op:"
Print At 1,13, DEC3 servoposdoorgang            'hier geeft hij de vrije doorgang aan
DelayMS 3000 
Servo servo1, servoposdoorgang                  'hier zou hij naar de vrije doorgang moeten gaan maar hij gaat naar een andere willekeurige positie
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             'Omhoog tellen met stapjes van 10uSec   vanuit de middenpositie
  GoSub ping                                     'bij elke stap even meten
  Print At 1, 13, DEC3 afstand                   'zet waarde op lcd
   Servo servo1, positie                         'Stuur 'Positie' pulsjes naar PORTE.1                                                                   
    If afstand > afstand_oud Then
   afstand_oud = afstand
   servoposdoorgang = positie                    
   EndIf 
  Next
 
  For positie = 2250 To 850 Step -20             'Terug tellen met stapjes 20uSec
  GoSub ping                                     'bij elke stap even meten
  Print At 1, 13, DEC3 afstand                   'zet waarde op lcd 
    Servo servo1, positie                        'Stuur 'Positie' pulsjes naar PORTE.1                                      
     If afstand > afstand_oud Then
   afstand_oud = afstand
   servoposdoorgang = positie                    
   EndIf 
  Next
 
   For positie = 850 To 1500 Step 20              'en weer terug naar de middenpositie
   GoSub ping                                     'bij elke stap even meten
   Print At 1, 13, DEC3 afstand                   'zet waarde op lcd 
     Servo servo1, positie                        'Stuur 'Positie' pulsjes naar PORTE.1 
 
     If afstand > afstand_oud Then
   afstand_oud = afstand
   servoposdoorgang = positie                    
   EndIf 
    DelayMS 18                                   'pauze van 18 Msec. voor de servo
   Next
Next
Print At 1,1, "doorgang op:"
Print At 1,13, DEC3 servoposdoorgang            'hier geeft hij de vrije doorgang aan
DelayMS 3000 
Servo servo1, servoposdoorgang                  'hier zou hij naar de vrije doorgang moeten gaan maar hij gaat naar een andere willekeurige positie

'hier code die heel Johny in de goede richting zet ipv alleen de servo

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
'Links? Rechts? Ik gok nu links
gosub linksaf
'hoe lang? Dat hangt af van de servopositie
delayms (servoposdoorgang - 1500 * factor) 'weet niet of er een formule achter 
'delayms mag als waarde...
'zonee dan:
' bijdraaitijd = (servopos - 1500) * factor
' delayms bijdraaitijd
'factor is een constante die experimenteel vast te stellen is
' en dan maar hopen dat een variabele achter delayms wel mag, anders een 
' for-next met delayms 1 erin
elseif servoposdoorgang < 1500 then
'nu dus de andere kant op draaien
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 >:)

Eluke.nl | De mens onderscheid zich van (andere) dieren door o.a. complexe gereedschappen en bouwwerken te maken. Mens zijn is nerd zijn. Blijf Maken. (Of wordt, bijvoorbeeld, cultuurhistoricus)

Je hebt er weer werk van gemaakt, en dat op je vrije zondagmiddag.

Ik zie dat je nu bij elke servozwiep de hoogste waarde laat bepalen.

(servoposdoorgang - 1500 * factor)

Om achter die factor te komen moet ik dan eerst de tijd opnemen die Johnny nodig heeft om 180° te draaien, en deze weer te delen door het aantal stappen van de servo?
Lijkt me logisch, maar dan speelt de ondergrond ook weer een grote rol bij de draaisnelheid, of valt dat wel mee?

Ik ga hier in ieder geval mee aan de slag, en om het daadwerkelijk te testen is het wachten op de motoren (die ik hopelijk deze week binnen heb).

w.b. die 2 rb-35's....

Ik weet alleen nog niet of je ze ook aan mij gaat geven

Als je Johnny de goede weg helpt te vinden, zijn ze van jou.
Dus...een goede reden om...:+

@Luke,

Die aangepaste code werkt ook niet.
Ik heb onderstaande stukje code eens goed bekeken en nogeens, en nogeens, en hier is mij iets vreemds opgevallen.

pic basic code:

For positie = 2250 To 850 Step -20             'Terug tellen met stapjes 20uSec
  GoSub ping                                     'bij elke stap even meten
  Print At 1, 13, DEC3 afstand                   'zet waarde op lcd 
    Servo servo1, positie                        'Stuur 'Positie' pulsjes naar PORTE.1                                      
     If afstand > afstand_oud Then              
   afstand_oud = afstand                         'hier wordt 'afstand' de grootst gemeten afstand
   servoposdoorgang = positie                    'WAAR wordt 'servoposdoorgang met de hoogst gemeten afstand
   EndIf                                         'in veband gebracht?????
  Next

Hoe komt servoposdoorgang aan de hoogst gemeten afstand?
Als die geen metingen ontvangt wordt 'positie' een gegevensloze variabele.
Dus, hij zet dan de servo in een willekeurige positie, denk ik.

pic basic code:

Print At 1,1, "doorgang op:"
Print At 1,13, DEC3 servoposdoorgang            'hier geeft hij de vrije doorgang aan
DelayMS 3000 

Hier kwam elke keer 850 op het LCD te staan, dus, de beginpositie.
850 = 8,5 meter?? zo groot is mijn huiskamer nieteens.

Wat betreft, die Ultrsoon....
Ik kom er echt niet meer uit
1) hij ziet obstakel en de servo gaat 2x zoeken, prima
2) hij geeft mooi 3 sec. de grootste afstand op de lcd aan
3) Nu draait de servo naar een andere positie dan waar hij
de grootste afstand meette. Waarom?

dit verklaard punt 2) hij geeft de servostand aan, niet de US meting
3) hij draait gewoon wat naar links.

Dit is wat ik eruit op kan maken, misschien heb ik het grandioos mis, maar ik vermoed dat ik toch de juiste conclusie trek.

Wat vind jij ervan, Luke?

Lucky Luke

Golden Member

Hmmm, hier moet ik even op kauwen...

Het klopt dat Print At 1,13, DEC3 servoposdoorgang de servopositie print die bij de doorgang hoort.

Het klopt niet dat dat iedere keer 850 is... Of dat moet toevallig elke keer de plek met de grootste doorgang zijn, maar dat lijkt me heel stug. Dan toch een keertje 852 oid.

Als de afstand groter is dan de vorige gemeten afstand dan:
Sla de afstand op in afstand_oud
Sla de bijbehorende servopositie op in servoposdoorgang
eindals.

Daar wordt dus servoposdoorgang met de grootste gemeten afstand in verband gebracht.

Programeren wordt frustrerend als het stug volhoud niet te werken terwijl het Zou Moeten Kloppen ;)

Je zou die meetlus eigenlijk stapje voor stapje moeten kunnen volgen... Alle variabelen op het schermpje zetten en kijken waar het mis gaat. Probleem is alleen dat als je een voldoende lange delay inbouwt om die vars ook te kunnen lezen je problemen krijgt met de pulsjes naar de servo...

Misschien kan je ze via een serieel lijntje naar de PC duwen, dat vertraagt ook wel, maar toch minder. Dan komen ze allemaal netjes onder elkaar te staan in je terminal (druk 's f4 in picbasic, of gebruik hyperterminal oid) en kun je ze teruglezen.

(het mooiste is natuurlijk in circuit debugging... P-ICD. Maar daar heb ik zelf nog niet goed naar gekeken, dus kan ik ook verder niks over vertellen...)

Wat mij nu wel opvalt is de volgorde. Je meet eerst de afstand, stuurt dan de servo naar een positie, en slaat daarna eventueel afstand en positie op... Dan wijkt de positie dus 1 stap af... Maar dat verklaart nog niet waarom het altijd 850 is...

Hmmm... Ik kauw later verder...

Eluke.nl | De mens onderscheid zich van (andere) dieren door o.a. complexe gereedschappen en bouwwerken te maken. Mens zijn is nerd zijn. Blijf Maken. (Of wordt, bijvoorbeeld, cultuurhistoricus)

Flinke kluif om op te kauwen hè?

Sla de bijbehorende servopositie op in servoposdoorgang
eindals.

Daar wordt dus servoposdoorgang met de grootste gemeten afstand in verband gebracht.

Dit gedeelte is mijn grootste vraagstuk, nu.
Hoe wordt die servopositie opgeslagen in servoposdoorgang?
En hoe worden die 2 met elkaar in verband gebracht?

Ik heb inmiddels wel een voorbeeld gevonden op:
deze site
Is wel basic pro, maar misschien kun jij daar meer mee dan ik.

Misschien kan je ze via een serieel lijntje naar de PC duwen, dat vertraagt ook wel, maar toch minder. Dan komen ze allemaal netjes onder elkaar te staan in je terminal (druk 's f4 in picbasic, of gebruik hyperterminal oid) en kun je ze teruglezen.

Daar zeg je me wat....Ikke Dummy :+

Lucky Luke

Golden Member

Jij niet dummy, jij heel snel leren. Jij kijken 3 pagina's terug jij meer dummy dan nu :)

Goed, even het vraagstuk ontrafelen (er moet daarna alsnog wat bughunting gedaan worden... Een van de leukste stukken van het programeren, maar soms ook een van de meest frusterende. Het is leuk als je een probleem vindt en kan oplossen, maar als een bug zich blijft verstoppen...)

code:


Als de afstand groter is dan de vorige gemeten afstand dan:
Sla de afstand op in afstand_oud
Sla de bijbehorende servopositie op in servoposdoorgang
eindals.

ofwel in PICbasic:

pic basic code:


If afstand > afstand_oud Then              
   afstand_oud = afstand                         'hier wordt 'afstand' de grootst gemeten afstand
   servoposdoorgang = positie                    'WAAR wordt 'servoposdoorgang met de hoogst gemeten afstand
   EndIf              

De servo draait elke keer naar een positie, waarop een meting wordt gedaan (gosub ping). Door de for-next lussen meet de servo op alle posities, en dan nog 's 2x ook.

Je wilt weten waar je robot heen moet, dus waar de grootste afstand gemeten is.
Dan kun je natuurlijk alle gemeten afstanden met hun bijbehorende servopositie onthouden, ze later sorteren, de grootste pakken en de rest weggooien. Maar dat is niet handig want je slaat 'n hoop info op voor niks, en het kost allemaal processortijd en code.

In plaats daarvan kijken we al tijdens het meten of de gemeten afstand groter is dan de vorige keer, zoja, dan onthouden we die, en ook de servopositie die erbij hoort. Op die manier krijgen we dus uiteindelijk alleen de grootste afstand en de bijbehorende servopositie.

Nu, hoe worden die dingen opgeslagen.

code:


dim ditiseenvar as byte
ditiseenvar = 5

Hier wordt eerst de variabele ditiseenvar aangemaakt, daarna wordt het getal 5 in de variabele (geheugenplaats) ditiseenvar gestopt.

code:


dim ditiseenvar as byte
dim enditook as byte
ditiseenvar = 5
enditook = ditiseenvar

Hier worden 2 variabelen aangemaakt. Daarna wordt het getal 5 opgeslagen in ditiseenvar. Vervolgens wordt de waarde van ditiseenvar opgeslagen in enditook (gekopierd). Zodoende staat er dus 5 in enditook.

code:


dim invoerteller as byte
dim gebruikersinvoer as byte
dim grootsteinvoer as byte
dim hoeveelsteinvoer as byte
grootsteinvoer = 0
  for ditiseenvar = 1 to 5
  gosub voermaarwatin        'subroutine waarbij iemand een getal in gebruikersinvoer stopt
     if gebruikersinvoer > grootsteinvoer then
     enditook = gebruikersinvoer
     hoeveelsteinvoer =  ditiseenvar
     end if
   next
print at 1,1, "het ", DEC hoeveelsteinvoer, "e ingevoerde getal was"
print at 2,1, dec grootsteinvoer, "en is daarmee het grootste getal"
print at 3,1, "dat is ingevoerd" 

Analyzeer nu dit stukje maar 's regel voor regel, en vertel me wat er gebeurt.
(ongeveer hetzelfde als met die servometing)

EDIT:
Ok, dan nog even kort over het seriele lijntje:
m.b.h. hserout of serout valt er serieel data naar een computer te verzenden vanaf een PIC. Kijk maar eens naar de help van PICbasic bij deze commando's.
Het heet serieel omdat alle bitjes 1 voor 1 door 1 draadje verzonden worden ipv tegelijkertijd. Dat is welliswaar trager dan alles tegelijk via een eigen draadje, maar het bespaart een hoop draden.

EDIT2:
wat door die site zitten bladeren. Dat picbasic lijkt idd best wel op het picbasic dat ik ken (melab picbasic pro vs. crownhill proton+ picbasic).
Die voorbeeldcode valt ook wel te vertalen. Het stukje wat mapping doet is wel interesant. Niet per se om nu toe te passen, maar wat wel opvalt is dat ze eerst 500ms wachten voor ze een meting doen. Ze zorgen dus eerst dat de sensor stilstaat. Ik weet niet of beweging de gemeten sensorwaarde beïnvloed, maar het valt te proberen om eerst de sensor stil te zetten.

Eluke.nl | De mens onderscheid zich van (andere) dieren door o.a. complexe gereedschappen en bouwwerken te maken. Mens zijn is nerd zijn. Blijf Maken. (Of wordt, bijvoorbeeld, cultuurhistoricus)

Je hebt voor mij ook een hele kluif achter gelaten, om op te kauwen.
Hier ben ik wel effe zoet mee.

Een van de leukste stukken van het programeren, maar soms ook een van de meest frusterende. Het is leuk als je een probleem vindt en kan oplossen, maar als een bug zich blijft verstoppen...)

op mijn vakgebied sta ik best hoog op de ladder w.b. troubleshooting, maar hier heb ik alleen maar met beide handen de onderste sport vast.

pic basic code:

servoposdoorgang = positie                    

Ik begrijp nu dat de servopositie in servoposdoorgang gekopieerd word, maar die positie zegt niets over de grootste afstand.
Hoe wordt die erbij gevoegd?
Moet hier niet zoiets als

pic basic code:

servoposdoorgang = afstand

bijgezet worden?

Het vraagstuk:

pic basic code:

ditiseenvar = 5

die "5" is een waarde die jij (fictief) gegeven hebt?
Mis ik een dergelijke regel in mijn Johnny-code?

Ok, een beetje te snel aan het kauwen.
Ik ga deze puzzel eens op mijn gemak ontrafelen.

Lucky Luke

Golden Member

even wat peper en zout mocht dat makkelijker kauwen:

5 is een waarde die ik uit de lucht gegrepen heb om in "ditiseenvar" te stoppen. Ik heb de variabele ditiseenvar aangemaakt, en ik wil dat die de waarde 5 heeft. Dus zeg ik ditiseenvar = 5, waarbij = gelezen moet worden als "wordt".

bij

servopos = positie
servopos = afstand

gaat er nogal iets fout...
Eerst wordt de waarde van positie in servopos gestopt.
Daarna wordt de waarde van afstand in servopos gestopt.
Welke waarde heeft servopos daarna?

Even met constanten:

servopos = 5
servopos = 17
print at 1,1, dec servopos

Probeer het desnoods uit. Geldt ook voor de andere code. Voeg desnoods wat extra delays in, laat vars op het schermpje printen en kijk hoe ze veranderen.
(met een goede debugger kun je je programma op ieder willekeurig moment pauzeren en even kijken welke waarden de variabelen hebben, en het programma stapje voor stapje doorlopen om te kijken wat er gebeurt en waar het fout gaat.)

Verder zie ik zo gauw de fout in de zoek-de-grootste-afstand code niet, maar ik weet zeker dat 'ie boven water komt als je gaat kijken wat de vars doen. (En in mijn (lange) posts hierboven zitten wel een paar op en aanmerkingen. Mogelijk niet hèt probleem, maar wel een probleem. Of kleinigheidje.)

kauw ze! :)

Eluke.nl | De mens onderscheid zich van (andere) dieren door o.a. complexe gereedschappen en bouwwerken te maken. Mens zijn is nerd zijn. Blijf Maken. (Of wordt, bijvoorbeeld, cultuurhistoricus)

Aaaaahhhh....gisterenavond laat het vraagstuk gepost met nog wat tekst....vergeten op posten te drukken |:(
opnieuw dan maar

Er zaten wat harde stukjes tussen ;)

Wat die variabelen betreft, begrijp ik nu.
Het vraagstuk gisterenavond eens regel voor regel eens goed doorgenomen en het blijkt inderdaad te kloppen.

pic basic code:

Dim ditiseenvar As Byte                         'for/next lus van servo?
ditiseenvar = 5                                 
Dim enditook As Byte                            'servoposdoorgang
enditook = ditiseenvar                          'inderdaad: servoposddorgang = positie
Dim invoerteller As Byte                        'het aantal zwiepen?
Dim gebruikersinvoer As Byte                    'us metingen
Dim grootsteinvoer As Byte                      'grootste afstand
Dim hoeveelsteinvoer As Byte                    'gemeten op servostand: 
grootsteinvoer = 0                              'eerste meting

  For ditiseenvar = 1 To 5                      '5 servostanden+metingen
  GoSub voermaarwatin        'subroutine waarbij iemand een getal in gebruikersinvoer stopt  "zoals ping"
     If gebruikersinvoer > grootsteinvoer Then   'zou 25 moeten zijn
     enditook = gebruikersinvoer                 'enditook is nu 25
     hoeveelsteinvoer =  ditiseenvar            'gevonden op bv 3
     End If
   Next
Print At 1,1, "het ", Dec hoeveelsteinvoer, "e ingevoerde getal was"       '"het 3de ingevoerde getal was"
Print At 2,1, Dec grootsteinvoer, "en is daarmee het grootste getal"       ' "25" 
Print At 3,1, "dat is ingevoerd"                                           '"dat is ingevoerd"

voermaarwatin:

gebruikersinvoer = 25
Return
End

Ben ik geslaagd?

Ergens mis ik een vergelijking met de Johnny code, en ergens heb ik een vermoeden dat ik die gevonden heb.
Effe proberen:
ditiseenvar = positie
gebruikersinvoer = afstand
grootsteafstand = afstand_oud
enditook = servoposdoorgang
Hoeveelsteinvoer = servopositie??? ditiseenvar ook
een vergelijking van hoeveelsteinvoer met de johnnycode zie ik niet

Hier kom ik nog op terug, na wat meer puzzelen

Lucky Luke

Golden Member

Het klopt heel aardig, je hebt alleen wat kunstgrepen uitgehaald omdat ik een foutje had gemaakt... 2 zelfs.

geccorigeerd:

pic basic code:


dim invoerteller as byte
dim gebruikersinvoer as byte
dim grootsteinvoer as byte
dim hoeveelsteinvoer as byte
grootsteinvoer = 0
  for invoerteller = 1 to 5
  gosub voermaarwatin        'subroutine waarbij iemand een getal in gebruikersinvoer stopt
     if gebruikersinvoer > grootsteinvoer then
     grootsteinvoer = gebruikersinvoer
     hoeveelsteinvoer =  invoerteller
     end if
   next
print at 1,1, "het ", DEC hoeveelsteinvoer, "e ingevoerde getal was"
print at 2,1, dec grootsteinvoer, "en is daarmee het grootste getal"
print at 3,1, "dat is ingevoerd" 

Wbt de gebruikersinvoer: laten we zegen dat achtereenvolgens 5,3,25,11 en 23 worden ingevoerd.

Wat gebeurt er eigenlijk als er achtereenvolgens 5,3,25,11,25 wordt ingevoerd?
[spoiler]
alleen het eerst ingevoerde getal wordt geregistreerd. 25 is namelijk niet groter dan 25. Hoeft geen probleem te zijn.

[/spoiler]

Dit kauwt waarschijnlijk wat makkelijker... Zeker nadat je die vorige (met fouten en al) uitgepluist hebt.

En die vergelijking met de johnycode zie je goed:

Ping geeft elke keer een afstand (in mijn code voert de gebruiker elke keer een getal in). In beide gevallen wordt het grootste getal gezocht. Bij mijn code wordt ook gekeken het hoeveelste getal het grootst was, en bij johny wordt gekeken wat de servopositie is.

Sorry voor mijn foutjes... Maar je bent wel geslaagd.

Zoek als bonus nog even uit waarom ik grootsteinvoer in eerste instantie op 0 zet. (Wat zou er gebeurt zijn als ik dat was vergeten?)

Eluke.nl | De mens onderscheid zich van (andere) dieren door o.a. complexe gereedschappen en bouwwerken te maken. Mens zijn is nerd zijn. Blijf Maken. (Of wordt, bijvoorbeeld, cultuurhistoricus)
Lucky Luke

Golden Member

Nee hoor, er komt nog steeds keurig een getal uit...

(zolang ik niks een een variabele stop zit er "rommel" in, een willekeurige waarde. Die waarde kan dus ook hoger zijn dan het getal dat eigenlijk het hoogste getal is)

Heb je door hoe die if-then lus werkt?

[spoiler]

Als er 5 wordt ingevoerd: 5 > 0 is waar, dus grootsteinvoer wordt 5, en hoeveelsteinvoer wordt 1. Vervolgens wordt er 3 in gevoerd. 3 > 5 is niet waar, dus de if-then lus wordt niet uitgevoerd. Dan wordt er 25 ingevoerd. 25 > 5 is waar, dus wordt de if-then lus uitgevoerd. Grootsteinvoer wordt nu dus 25, en hoeveelsteinvoer wordt 3. Hierna wordt 11 ingevoerd. 11 > 25 is niet waar, dus de if-then lus wordt niet uitgevoerd. Daarna wordt 23 ingevoerd. 23 < 25, dus de If-then lus wordt weer niet uitgevoerd. Aan het eind van de routine is grootsteinvoer dus gelijk aan 25, en hoeveelsteinvoer = 3.

Als grootsteinvoer aan het begin niet op 0 was gezet, maar er zat de waarde 145 in, dan zou dit natuurlijk niet goed zijn gegaan.

[/spoiler]

Wat doet Johny nu trouwens? Scant 'ie al goed? Wat doen de variabelen?

Eluke.nl | De mens onderscheid zich van (andere) dieren door o.a. complexe gereedschappen en bouwwerken te maken. Mens zijn is nerd zijn. Blijf Maken. (Of wordt, bijvoorbeeld, cultuurhistoricus)

zolang ik niks een een variabele stop zit er "rommel" in, een willekeurige waarde.

Dit bedoelde ik eigenlijk, maar gezien het tijdsip van mijn snelle antwoord was er geen verder uitleg mogelijk.

pic basic code:

If gebruikersinvoer > grootsteinvoer Then   

groter dan wat?? vandaar een getal.

if, then else en elseif is geen probleem

pic basic code:

if ik iets wil leren then
goto circuitsonline
else goto picbasic.nl
elseif ik niets wil leren then
copie/paste mijn code wel
endif

Wat gebeurt er eigenlijk als er achtereenvolgens 5,3,25,11,25 wordt ingevoerd?

display geeft: 1ste meting [5]
2de meting [5]
3de meting [25]
4de meting [25]
5de meting [25}
Dus altijd de hoogste waarde

spoiler en eind spoiler??? wat moet ik daarmee?

Wat doet Johny nu trouwens? Scant 'ie al goed? Wat doen de variabelen?

Dinsdagavond is mijn klusavond, vandaar gisteren ook geen vragen en antwoorden.
Ik heb daarom nog niks aan de Johnnycode kunnen doen.
Ik ga straks eens proberen om die servo eerst eens goed te laten werken op mijn breadboard.
Ik heb nog altijd het probleem van het centreren van de servo.
Hij draait bij het opstarten naar de beginstand (850) ipv 1500
Dit doet hij niet, als ik het pcb met de wisp648 aangesloten hou bij het opstarten, daarom...vreemd
Ik ga ook eens proberen er een bat85 diode tussen te plaatsen, zoals Frits dat aan beveeld.
Mogelijk dat de servo mijn pic van slag brengt.
Jou mening hierover?

Ik was trouwens ook bezig om een nieuwe print te maken, omdat ik aan die L293D niets meer heb (i.v.m. de sterkere motoren)
Hierin verwerk ik meteen die Bat85

En het goede nieuws is:... ze zijn binnen :):) wat een beauty's!!
iets minder goed nieuws: ze passen niet :(
Ik moet nu een soort van wielkasten maken in mijn accubak en de ophanging drastisch aanpassen om ze alsnog te laten passen.
Dus..zaterdag, mechanical day

Lucky Luke

Golden Member

Hm, jammer dat ze niet passen. Maar wat ik op die eerdere foto's heb gezien denk ik dat je dat wel gefixed krijgt :)

Stuur je bij het opstarten wel meer dan 1 pulsje naar de servo?
(in je code van 18 juli zie ik nog helemaal geen servosturing bij het opstarten...

Over de storing: die ene keer dat ik een klein modelbouwservotje op een PIC aansloot en uit dezelfde voeding voedde had ik geen problemen. Maar ik hoor wel vaker dat zo'n servo piekstromen kan trekken die de PIC resetten. Frits' opslossing met weerstand, diode en condensator zal wel werken. Wat ook gedaan wordt (en misschien nog wel beter is) is 2 apparte voedingen gebruiken (2 7805's uit dezelfde accu van stroom voorzien, 1 voor de uC, 1 voor de servo's. Of zelfs de motoren direct uit de accu voeden en alleen de uC via een regelaar. Moeten de servo's wel de accuspanning lusten.). En er is altijd nog de dikke overkill oplossing oom 2 accu's te gebruiken, 1 voor de motoren en 1 voor de microcontroller / besturing. Dat werkt geheid, maar kost wel 2 accu's. (wel de - verbinden natuurlijk)

Spoiler en end spoiler ben je denk ik wel achtergekomen toen je me quote. Ik zette de tekst in wit, zodat het pas leesbaar zou worden als je 't selecteerd.

Al klopt je If-then nog niet helemaal (even muggenziften). Je gaat namelijk niet naar picbasic als je wel iets wilt leren, volgens je code. Er staat "else", wat dus betekend dat je pas naar picbasic gaat als er iets anders aan de hand is dan "ik wil iets leren". Terwijl PICbasic.nl met toch een prima educatieve site lijkt :). (en als je niet iets wilt leren, ga je zowel naar picbasic als copy-pasten. Dat klopt dan weer wel: copy pasten van picbasic.nl zul je weinig van leren)

Eluke.nl | De mens onderscheid zich van (andere) dieren door o.a. complexe gereedschappen en bouwwerken te maken. Mens zijn is nerd zijn. Blijf Maken. (Of wordt, bijvoorbeeld, cultuurhistoricus)