Gepost door Jeroen Vreuls op maandag 30 december 2019 00:18
Ik ga eerst het programma tonen waar ik de afstandsbediening mee uitgelezen heb. Dat kan in principe met elke controller, als je maar genoeg I/O hebt voor de IR ontvanger en het display.
Ik heb hier een PIC16F887 voor gebruikt omdat die standaard op de controller print staat.
'* Name : UITLEZEN RC5 CODE MET 16F887.
'* Author : H.van Zwieten.
'* Notice : Copyright (c) 2009 H.v.Z.
'* : All Rights Reserved
'* Date : 30-12-2009
'* Version : 1.0
'* Notes : 468 programma woorden en 21 variabele gebruikt.
Device 16F887 ; Processor type
Xtal 10 ; Kristal 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
Declare LCD_RSPin PORTD.2 ; Reset display poort D.2
Declare LCD_ENPin PORTD.3 ; Enable display poort D.3
Declare LCD_DTPin PORTD.4 ; Data display poort D.4 t/m D.7
Declare RC5In_Pin PORTB.0 ; ir ontvanger op poort B.0
Dim rc5_commando As Byte ; variabele RC5 commando
Cls ; Wis display
Clear ; Wis geheugen
DelayMS 2000 ; Wacht 2 seconden
;543210 ; Hulpregel poort A
PORTA = %000000 ; Maak poort A laag
TRISA = %000000 ; Poort_A I/O
;543210 ; Hulpregel poort B
PORTB = %000000 ; Maak poort B laag
TRISB = %000001 ; 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 = %000 ; Poort_E I/O
;76543210 ; Hulpregel analoog
ADCON0 = %00000001 ; ADCON0 register analoog 8 bit
;76543210 ; Hupregel analoog
;ADCON1 = %10000000 ; ADCON1 register analoog 10 bit
;76543210 ; Hulpregel analoog poort_B
;ANSELH = %00000000 ; ANSEL register analoog poort_B
;---------------------------------
; PROGRAMMA UITLEZEN IR COMMANDO.
;---------------------------------
start:
Print At 1,1,"COMMANDO" ; Zet commando op het display
Repeat ; herhaal
rc5_commando = RC5In ; Lees ir ingang
Until rc5_commando <> 255 ; Waarde 0 t/m 255
Print At 1,10,Dec rc5_commando , " " ; Zet waarde op display
GoTo start
End
Zoals je kunt zien zijn er niet veel regels nodig om de afstandsbediening uit te lezen, het programma wacht net zo lang tot dat er een knop op de afstandsbediening wordt ingedrukt. De waarde die onder een bepaalde knop zit wordt nu op het display getoond, op deze manier kun je dus de hele afstandsbediening uitlezen en de waardes die daar uitkomen verwerken in een programma. Dat is dus precies wat ik ook gedaan heb met het programma voor de interfacecontroller.
Download het PICBASIC programma
Het programma vergt wel wat uitleg denk, onderSTART
wordt er gekeken of de SELECT_IN
schakelaar op IR staat of op PC. Als SELECT_IN
0 is dan kan de afstandsbediening gebruikt worden en als SELECT_IN
1 is dan kan de robotarm met de PC bediend worden.
Als je onder RUN_IR
kijkt kun je zien welke waardes er uitgelezen worden. Om de robotarm te starten moeten eerst de assen naar de home positie gestuurd worden, dit commando staat onder knop 1 van de afstandsbediening. Als er nu op knop 1 gedrukt wordt, wordt er naar START_HOMEN_ASSEN_IR
gegaan. Daar wordt een uitgang 1 en 0 gemaakt en wordt er terug gegaan naar RUN_IR
. Daar staat het programma weer te wachten op de volgende opdracht. De 1 wordt ingelezen door de hoofdcontroller en voert de opdracht uit, de assen worden nu naar de home positie gestuurd.
Als de SELECT_IN
schakelaar nu op PC staat, wordt er naar RUN_PC
gegaan. Daar kun je zien dat de waarde DATA_IN
5 het zelfde doet, maar nu wordt er naar START_HOMEN_ASSEN_PC
gegaan. Daar wordt dezelfde uitgang weer 1 en 0 gemaakt en wordt er terug gegaan naar RUN_PC
, daar blijft het programma weer wachten op het volgende commando. Ook nu wordt de 1 weer ingelezen door de hoofdcontroller en wordt de opdracht uitgevoerd. En zo werkt het eigenlijk met alle commando's.
Voordat we naar het programma van de hoofdcontroller gaan kijken, wil ik eerst wat uitleggen over de vertragingen van de stappenmotoren. De vier stappenmotoren zijn alle vier 200 stappen per omwenteling. We hebben drie grote motoren met een vertraging van 20:1 en één daarvan heeft nog een extra vertraging van 1,5:1. De kleine stappenmotor heeft een vertraging van 115,9:1.
De motor voor de basis heeft een extra vertraging in de vorm van een tandriem overbrenging. Waarom dit gedaan is, is in het begin al beschreven. Als we nu willen weten hoeveel stappen er gemaakt moeten worden voor een X aantal graden verdraaiing, moeten we een kleine berekening maken.
Voor de basis wordt dat:
De microstep driver stellen we in op 1/8 stap, dan krijgen we dus 200 stappen x 8 = 1600 x de 20:1 vertraging = 32000 x de tandriem vertraging van 1.5:1 = 48000. We moeten dus 48000 stappen maken om 360 graden te verdraaien. Dus 360 graden : 48000 = 0,0075 graden per stap. Willen we nu bijvoorbeeld 90 graden verdraaien dan moeten we 90 : 0,0075 = 12000 stappen doen.
Voor de boven en onderarm wordt dat:
De microstep driver stellen we hier ook in op 1/8 stap, dan krijgen we dus 200 stappen x 8 = 1600 x de vertraging van 20:1 = 32000. We hebben voor deze assen geen extra vertraging meer, nu wordt dat 360 graden : 32000 = 0,01125. Willen we weer 90 graden verdraaien dan moeten we dus 90 : 0,01125 = 8000 stappen doen.
Voor de pols wordt dat:
De microstep driver stellen we hier in op hele stappen, dus 200 stappen is één omwenteling van de stappenmotor. Op de motor zit een vertraging van 115.9:1, dan krijgen we dus 200 x 115,9 = 23180. Nu wordt het 360 graden : 23180 = 0,0155306298533218. Willen we nu 90 graden verdraaien dan moeten we 90 : 0,0155306298533218 = 5795 stappen doen.
Dit moeten we weten omdat je anders nooit een programma kunt maken dat automatisch de arm naar een bepaalde positie kan sturen. Voor de hand bediening maakt het verder niet uit, omdat je het hier zelf kunt bepalen. Je laat gewoon de assen bewegen totdat je het goed vindt.
Hier ook weer wat uitleg over het programma zelf.
Zoals je kunt zien gebruik ik vier verschillende frequenties, FREQUENTIE_BIGIN_POSITIE = 600
, FREQUENTIE_HOMEN = 400
, FREQUENTIE_HAND = 100
en FREQUENTIE_AUTO = 10
. De waardes zijn in microseconden. Daaronder staan de in en uitgangen, dat wijst voor zich denk. Daaronder staan de tellers, er zijn vier tellers aangemaakt om de positie van de assen bij te houden. De waardes van de tellers lopen van 0 tot 65535. De tellers worden op 0 gezet voordat er naar START
gegaan wordt.
Als we bij START
kijken dan zien we dat daar gevraagd wordt om het homen te starten. Als we nu op knop 1 van de afstandsbediening drukken zal er naar de HOME_POSTIE
gegaan worden, daar lopen de bovenarm, onderarm en de basis naar de eindschakelaars toe. Als de assen de eindschakelaars bereikt hebben wordt er naar BEGIN_POSITIE
gegaan. Daar lopen de bovenarm en de onderarm 800 stappen uit de eindschakelaars en de basis 2800 stappen. Als de waardes bereikt zijn worden de tellers weer op 0 gezet en er wordt naar RUN_HAND
gegaan, de drie assen staan nu in de 0 positie en vanuit die positie wordt er een as aangestuurd. De pols zit hier niet bij omdat de hand meestal recht staat, staat de hand niet recht dan kan die met de hand recht gezet worden via de afstandsbediening of via de PC. Daarna moet er wel nog een keer op home gedrukt worden om de teller van de pols ook weer op 0 te zetten, maar dat duurt maar een paar seconden omdat de assen al op 0 staan.
In RUN_HAND
kan nu ieder as afzonderlijk of allemaal tegelijk aangestuurd worden, de tellers houden nu de positie bij waar de assen zich bevinden. De assen worden ook door de tellers beveiligd, de basis kan niet verder draaien dan 90 graden naar links en naar rechts. Je ziet daar een maximale waarde van 12000 en 53535 staan. Voor de pols is dat 5795 en 59740, die is dus ook op 90 graden beveiligt. De bovenarm kan bewegen tussen 0 en 15000 en de onderarm tussen 0 en 12000. Er kan op deze manier nooit iets stuk draaien.
Ik gebruik de handbediening ook om een automatisch programma te maken, ik stuur de arm naar een bepaalde positie en noteer dan de teller standen. Deze standen neem ik dan op in het automatische programma, zo kan ik een enkele as sturen of een combinatie van assen.
Onder knop 3 van de afstandsbediening wordt er naar RUN_AUTO
gegaan, daar wordt het automatische programma afgewerkt. Dat gebeurt maar eenmaal, als je het automatische programma weer wil starten moet er weer op knop 3 van de afstandsbediening gedrukt worden. Dit kan natuurlijk ook via de PC als de PC geselecteerd is en het Profilab programma draait.
Zo dit was het weer, ik hoop dat dit meer mensen aanspoort tot het bouwen van een robotarm. Het is echt leuk om te doen, en ook het artikel schrijven is leuk en dat is dan weer leerzaam voor anderen hoop ik. Al moet ik wel zeggen dat dit geen beginnersproject is, maar je kunt het ook eenvoudiger maken met bijvoorbeeld modelbouw servo's. Maar zoals ik al eerder zei, daar is deze arm iets te groot voor.
Dit artikel is geschreven door Lambiek.
Als je ingelogd bent kun je een reactie plaatsen.
Fantastisch mooi gedaan èn uitgelegd, ik heb door de jaren heen een hoop spullen gespaard welke zich uitstekend lenen voor zoiets. Tijd is alleen zo lastig, iets met (te) veel willen maken
Bedankt. In "show your projects" staan nog een paar foto's en een filmpje.
https://www.youtube.com/watch?v=WsuQZvV28Xk
Het is leuk om te maken en als je de spullen hebt, wat let je zou ik zeggen.
De tijd moet je er inderdaad voor vrij maken, maar je krijgt er ook iets voor terug.