Enkele servo langzaam laten bewegen met JAL

Beste Mensen,

Voor een kennis wil d.m.v. 2 drukknopjes een servo rustig van 0 tot 180 graden laten draaien en weer terug. Dit is om een grijper van een kolenkraan te bedienen. Momenteel doe ik dit met een 555 maar deze draait te snel.
Wat ik ik zoek is en procedure om via een PIC dit te doen. Helaas heb ik de boeken van Bert van Dam hier niets over gevonden.

met:
var bit "servo" is pin_a0

heb ik met:
servo = on
delay_10us (50) -- 0 graden
servo = off

en

servo = on
delay_10us (190) -- 180 graden
servo = off

wel de juiste beweging maar veel te snel.

wie kan mij helpen?

PIC mag zijn 12f675 of 16f628 zijn (liefst niet te groot)

Henny

Het leven is als een diode, je krijgt maar de helft van wat je verdient.

Huh, alle pret gewenst met de PIC - maar als het kan met een 555 behalve dat die te snel gaat, dan stop je er toch een grotere C in, en daarmee uit?

hoe beter de vraag geschreven, zoveel te meer kans op goed antwoord

wel de juiste beweging maar veel te snel.

Dan maak je de delay tijden toch gewoon wat langer?

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

Overigens, zonder me al te zeer in het project te willen inwerken - lijkt het me dat je enkel instructie geeft aan de servo om naar de ene positie te gaan, en daarna om naar de andere positie te gaan. Dat zal wel vooruitgaan, ja...

Ten eerste kun je iets opzetten als
ga naar de ene kant
(doe iets met de schep)
(of wacht gewoon een poos)
ga naar de andere kant
(doe iets anders)

Ten tweede kun je het "ga naar" implementeren als een opeenvolging van heel kleine stapjes, telkens met een vertraging ertussen. Ik denk wel dat je heel veel stapjes zult moeten gebruiken, om schokkend bewegen te vermijden.

Sta me tenslotte toe een aanbeveling toe: voeg eindloopschakelaars toe, microswitches bv.; om te vermijden dat de hele mechanica zichzelf in de vernieling draait als servo of PIC flippen.

hoe beter de vraag geschreven, zoveel te meer kans op goed antwoord

Zal wel zoiets zijn: (ik ken zelf geen JAL, dus moet misschien nog wat worden 'geJALd'... :) )

code:


For Cnt = 50 To 190
  servo = on
  delay_10us (Cnt)
  servo = off
  delay_ms(20)
Next Cnt
Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

Hallo mensen,

De delay maakt de puls voor de verdraaiing (0,5 tot maximaal 2 ms voor de verdraaiing van een servo).

De schakeling met de 555 gebruikt de RC tijd ook voor pulsen niet voor delay.
Een grotere C zorgt er voor dat de servo niet meer reageert.

Nu kan ik natuurlijk alle elektronica uit een servo halen en met een opamp en de servo potmeter een regeling maken. Maar met een PIC is toch ook een uitdaging.

Henny

Het leven is als een diode, je krijgt maar de helft van wat je verdient.

Beste Arco,

Dit begint er op te lijken. Ik heb ook iets gelezen met het toevoegen van een (klein getal) +1 of en en een korte delay en dan tellen van 50 tot 190 en voor de andere kant van 190 naar 50 maar dan met -1.

Jammer genoeg niet zoiets niet op het net gevonden.

Henny

Het leven is als een diode, je krijgt maar de helft van wat je verdient.

Ik neem aan dat JAL ook iets als FOR...NEXT heeft?

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

Hallo Arco
JAL kent ook zo iets ik ga van het weekend weer eens proberen.
Wel heb ik iets gevonden met een TIMER (in de PIC) maar dat is helemaal nieuw voor mij dus veel proberen.

Morgen wordt het even Lego Mindstorms op mijn werk (School) daarna nog een beetje Arduino en daarna in mijn vrije tijd JAL.
Donderdag avond nog een beetje Koploper voor de treinenclub in Middelburg.

Henny

Het leven is als een diode, je krijgt maar de helft van wat je verdient.

Zal morgen eens zoeken. Er is hier ooit een topic geweest over een zwaaiend poppetje in een modelvliegtuig.

Ik snap niks van JAL, maar ik kreeg het werkend in assembly, was ook een 12F675, maar het werkte ook met een 12F508.

@ big_fat_mamma dit gaat niet met een NE555, hiervoor is gewoon een NE556 nodig. Maar als je geen zin hebt om uit te zoeken hoe een servo werkt, ach laat dan maar.

De zinloosheid des levens is nog geen rechtvaardiging voor sisyphusarbeid.

Dat klinkt toch een beetje aanmatigend, @Hunter, ook al is het misschien niet zo bedoeld.

* ik weet best hoe een servo werkt, dankjewel. Stelde ik iets anders?

* het was T/S zelf die stelde dat het best lukt met een 555, alleen was de snelheid niet aanvaardbaar. Ik vond dat ook een beetje vreemd, maar probeerde verder te gaan op de openingspost, niet op mijn eigen al dan niet briljante ideetjes.

* je mag ook eens je cursus "lezen en overschrijven" hernemen - maar misschien strekt het je tot eer dat je m'n nick niet platweg kopieerde maar wel zelf probeerde te tikken

hoe beter de vraag geschreven, zoveel te meer kans op goed antwoord

@ big_fat_mama excuses, mijn onzorgvuldigheid in overtypen, tja dan blijkt de afkeer van knippen en plakken.

Het is absoluut niet aanmatigend bedoeld, maar het komt vaker voor dat ik niet begrepen word.

Zijn we het wel eens over de aansturing? Een servo dient iedere 20ms een puls te krijgen. De lengte van die puls bepaalt de positie 1ms is 0 graden, 2 ms is 180.

Dit is leuk te doen met een astabiele gevolgd door een monostabiele, dus is een NE556 op zijn plaats.

De zinloosheid des levens is nog geen rechtvaardiging voor sisyphusarbeid.

Een servo dient iedere 20ms een puls te krijgen. De lengte van die puls bepaalt de positie 1ms is 0 graden, 2 ms is 180.

Dat doet de loop die ik beschreef toch ook?

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

Sorry Arco, ik reageerde op big_fat_mama. Verder klopt het redelijk/ Is goed.

Heb eigenlijk niet naar jouw reactie gekeken.

Morgen ga ik zoeken naar mijn code.

De zinloosheid des levens is nog geen rechtvaardiging voor sisyphusarbeid.

Daar had ik ook mijn vragen bij, @Arco, maar het is een erg ijle discussie...
Ik lees jouw code (in een soort van pseudo-python) als

code:


 permanente_lus:
  output hoog # jawel, uiteraard
  delay (navenant gewenste positie) # nog steeds ok
  output laag # maakt het netjes af
  delay 20mS # de negatieve helft van de blokgolf

Die laatste regel stel ik in vraag, maar het kan een kwestie van syntax zijn: je wilt daar toch een wait van 20mS minus wat je al gewacht hebt om de servopositie te bepalen, niet een wait van 20mS sowieso?

@Hunter: ok, strijdbijl begraven, dank je. Ik zie ook niet zo goed hoe T/S het doet/deed met een enkele 555, maar zij/hij was er wel bijna tevreden mee, blijkbaar. Een schema van die bijna perfect aanvaardbare oplossing zou zeker helpen om in te zien wat er verlangd wordt.

hoe beter de vraag geschreven, zoveel te meer kans op goed antwoord

Als je gewoon botweg tussen beide standen schakelt (1mS v.s. 2mS) gaat dat natuurlijk veel te snel, net wat de servo maximaal mechanisch aan kan zwiept die de andere kant op.

Je hebt van de 555 zowiezo de control pin (5) nodig. Voor de 1-2mS brede puls te maken per 20mS.

Je zou via een wissel schakelaartje + weerstand + een grotere elco een pseudo zaagtand kunnen maken. Schakelaartje aan een kant tegen ground de andere kant Vcc, het middencontact via een weerstandje naar een elco (andere kant zit natuurlijk aan de ground) die je weer in de pin 5 van die 555 stopt.

Echt lineair zal het niet zijn maar je kunt met wat weerstanden en delers prutsen om te kijken hoever je komt met het aansturen van pin 5.

Henri's Law 1: De wet van behoud van ellende. Law 2: Ellende komt nooit alleen.

De pause tijd tussen 2 pulsen is meestal niet erg kritisch bij meeste servo's...

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

Ik vergeet soms dat er analoog vreselijk veel mogelijk is.

Met een NE555 is ongelooflijk veel te doen met de duty-cycle. Dan zijn we al vertrokken. Arco heeft ook gelijk, die 20ms is niet zo kritisch. Ik ben bang dat TS ergens een beetje uit de specificaties is gelopen, en dan is dat ook nog afhankelijk van de fabrikant van de servo.

Mijn code doet een rondje van 20ms. Op 0ms gaat de uitgang hoog, dan kan er vanalles gebeuren. 20ms later weer opnieuw.

De zinloosheid des levens is nog geen rechtvaardiging voor sisyphusarbeid.

Beste Hunter, Arco, Henri62 en big_fat_mama,

Bedankt voor het meedenken, jammer dat er een kleine discussie over de 555 is ontstaan. Dit bejaarde IC-tje heeft pas nog zijn jubileum gehaald en is volgens mij onder de electroboys niet meer weg te denken. Ik heb er beslist geen hekel aan. Sterker nog veel toegepast, klein maar dapper maakt deze allerlei pulsjes.

Maar waar het mij om ging is een manier om een servo rustig op commando van 0 - 180 graden en op een volgend commando van 180 - 0 graden te laten draaien. Mijn huidige schakeling, met de 555, reageert nogal snel en de lange stuurleiding pikt makkelijk storing op. Nu is de storing op de stuurlijn met twee optocouplers wel op te lossen. (zie schema in Word document).

Sinds ik de boeken van Bert van Dam over PIC microcontrollers heb die met JAL worden geprogrammeerd wil ik ook wel eens een PIC proberen. Dit gaat redelijk makkelijk maar mijn kennis van programmeren is beperkt. Nu heb ik wel een aantal projectjes gemaakt en dat werkt leuk. Vandaar mij poging om de servo eens softwarematig aan te sturen.
Mijn huidige projectje werkt wel maar is net zo snel als de 555..

Hunter heeft een asm bestandje bij gevoegd, dank naar voor, maar ik weet niet of mijn JAL met een Wasp628 programmer dit in een PIC kan zetten.
Maar dat is het proberen waard.
Weetje als het lukt heb ik altijd zo'n Eureka gevoel. Maar nu nog even niet, maar dat is ook hobby.

Henny (dit klinkt jong maar ik ben al sinds 1969 geabonneerd op Elektuur/Elektor)

Het leven is als een diode, je krijgt maar de helft van wat je verdient.
Lambiek

Special Member

Hier heb je een voorbeeld in basic, misschien kun je dat eenvoudig omzetten naar JALL.

pic basic code:


'*  Name    : TEST - SERVO LANGZAAM VERDRAAIEN.                                      
'*  Author  : H van Zwieten.                                   
'*  Notice  : Copyright (c) 2017 H.v.Z.                         
'*          : All Rights Reserved                               
'*  Date    : 29-9-2017                                         
'*  Version : 1.0                                               
'*  Notes   :                                                  
                                                  
Device 16F887                     ; Processor type

Xtal 10                           ; Cristal 10Mhz

Asm                               ; Config settings
CONFIG_REQ            
__CONFIG _CONFIG1, HS_OSC & WDT_OFF & DEBUG_OFF & FCMEN_OFF & LVP_OFF & IESO_OFF & BOR_OFF & CPD_OFF & CP_OFF & MCLRE_OFF & PWRTE_ON 
__CONFIG _CONFIG2, WRT_OFF & BOR40V 
EndAsm
   
All_Digital true                  ; Alle poorten digitaal

Symbol MOTOR = PORTC.0            ; Servo op poort C.0

Symbol S1 = PORTA.0               ; Schakelaar S1 op poort A.0

Dim POSITIE As Word               ; Variabele waarde positie

Clear                             ; Wis geheugen

         ;543210                  ; Hulpregel poort A
PORTA  = %000000                  ; Maak poort A laag
TRISA  = %111111                  ; Poort_A I/O

         ;543210                  ; Hulpregel poort B
PORTB  = %000000                  ; Maak poort B laag
TRISB  = %000000                  ; Poort_B I/O

         ;76543210                ; Hulpregel poort C
PORTC  = %00000000                ; Maak poort C laag
TRISC  = %00000000                ; Poort_C I/O

         ;76543210                ; Hulpregel poort D
PORTD  = %00000000                ; Maak poort D laag
TRISD  = %00000000                ; Poort_D I/O

         ;210                     ; Hulpregel poort E 
PORTE  = %000                     ; Maak poort E laag
TRISE  = %111                     ; Poort_E I/O

         ;76543210                ; Hulpregel analoog
ADCON0 = %00000001                ; ADCON0 register analoog

         ;76543210                ; Hulpregel analoog
;ADCON1 = %10000000               ; ADCON1 register analoog

         ;543210                  ; Hulpregel analoog poort_B
ANSELH = %000000                  ; ANSEL register analoog poort_B

;----------------------------
; VOORBEELD PROGRAMMA SERVO.
;----------------------------

POSITIE = 1000

RUN:

    If S1 = 1 Then
     GoTo RUN_R
    EndIf
    
    Servo MOTOR,POSITIE
    DelayMS 20
GoTo RUN

RUN_R: 

    For POSITIE = 1000 To 2600 Step 5
     Servo MOTOR,POSITIE
      DelayMS 20
      If POSITIE = 2600 Then
       GoTo HOLD_R
      EndIf
    Next                       
GoTo RUN_R

RUN_L:

    For POSITIE = 2600 To 1000 Step - 5
     Servo MOTOR,POSITIE 
      DelayMS 20
      If POSITIE = 1000 Then
       GoTo HOLD_L
      EndIf 
    Next  
GoTo RUN_L
    
HOLD_R:

    If S1 = 0 Then
     GoTo RUN_L
    EndIf
    
    Servo MOTOR,2600
     DelayMS 20 
GoTo HOLD_R

HOLD_L:

    If S1 = 1 Then
     GoTo RUN
    EndIf
    
    Servo MOTOR,1000
     DelayMS 20
GoTo HOLD_L

End

Heb het getest en het werkt goed. Als je de snelheid aan wil passen, moet je de waarde achter "STEP 5 of STEP - 5" aanpassen. Ook de waardes 1000 en 2600 kunnen verschillen per servo, daat moet je ook even naar kijken.

Schakelaar S1 bepaald de draairichting van de servo. De servo start in positie 1000.

Dit kun je ook zo omzetten naar een klein type pic, bijv. een 12F675 of een 16F628, of een ander type.

Als je haar maar goed zit, GROETEN LAMBIEK.

Beste Lambiek,

Bedankt voor inspanning.
Ik ga van het weekend eens puzzelen of dit is om te zetten naar JAL.

vriendelijke,

Henny

Het leven is als een diode, je krijgt maar de helft van wat je verdient.
Lambiek

Special Member

Geen dank, we horen het wel. :)

Als je haar maar goed zit, GROETEN LAMBIEK.