verstelbare poten

Lambiek

Special Member

Probeer nu eerst eens één poot aan de gang te krijgen, lees een encoder in en kijk wat het doet met bijv. een teller die je aanmaakt in je programma. Daar kan ik je niet bij helpen, want ik gebruik geen arduino's. Zelf werk ik met andere controllers.

Als je haar maar goed zit, GROETEN LAMBIEK.

Maar dan nog. Eerst 1 poot, dan begin je te snappen dat je een aantal signalen naar de motor-driver INSTELLINGEN zijn die niet veranderen. Als je zoiets al 100x gedaan hebt dan kan je aan het begin tellen hoeveel IO je nodig hebt, maar als het je eerste projectje is, dan weet je dat nog niet. Klein beginnen, opdelen in behapbare deel-projectjes.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Lambiek

Special Member

Op 24 februari 2020 09:51:52 schreef rew:
Maar dan nog. Eerst 1 poot, dan begin je te snappen dat je een aantal signalen naar de motor-driver.......

Natuurlijk, maar je moet ergens beginnen. Gewoon een beetje spelen met één poot, kijk wat een encoder doet "van mij part met een display erbij" dan zie je wat er gebeurt en hoe je programma daar op reageert.

En als de TS nog geen ervaring heeft met Controllers, ja dan kon het nog wel eens een moeilijk project worden.

EDIT:
Ik heb wel een voorbeeld hoe je een encoder uit kunt lezen, maar dat is in picbasic. Maar dat kun je omzetten naar het Arduino gebrabbel. En met een display erbij kun je precies zien wat er gebeurt, heb het hier getest met een encoder 500 pulsen/omwenteling. Het telt prima op en af zonder een puls te missen.

pic basic code:


Device 16F887                               ; Processor type

Xtal 10                                     ; Cristal 10Mhz

On_Interrupt ROTARY_ENCODER                 ; Interrupt routine timer 0

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 Adin_Res = 8                        ; resolutie 8 bits
Declare Adin_Tad = frc                      ; set RC osc
Declare Adin_Stime = 50                     ; sample tijd 5

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 Rsin_Pin  PORTB.2 ;                 ; Data in   ; LET OP
Declare Rsout_Pin PORTB.3 ;                 ; Data uit  ; LET OP

Declare Serial_Baud 9600                    ; Baudrate 9600

Declare CCP1_Pin PORTC.2                    ; HPWM 1 op poort C.2
Declare CCP2_Pin PORTC.1                    ; HPWM 2 op poort C.1

Symbol INTF = INTCON.1                      ; RB0 Extern interrupt vlag      
Symbol INTE = INTCON.4                      ; RB0 Extern interrupt enabel   
Symbol GIE  = INTCON.7                      ; Global Interrupt enabel

Symbol PULS_A = PORTB.0                     ; Encoder puls a
Symbol PULS_B = PORTB.1                     ; Encoder puls b

Symbol LED = PORTA.1                        ; Controle led puls

Dim TELLER As Word                          ; Variabele teller

Cls                                         ; Wis display

DelayMS 500                                 ; Pauze 0.5 sec 

Clear                                       ; Wis geheugen

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

         ;543210                            ; Hulpregel poort B
PORTB  = %000000                            ; Maak poort B laag
TRISB  = %000011                            ; 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

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

;-----------------------------------------
; VOORBEELD - INLEZEN - OPTISCHE ENCODER.
;-----------------------------------------

TELLER = 1

GoTo OVER_IRQ

ROTARY_ENCODER:


Context Save
    If PULS_A = 1 Then
       If PULS_B = 1 Then
          Dec TELLER  
          Else
          Inc TELLER
       EndIf
          Toggle LED
    EndIf
    
    INTF = 0
Context Restore

OVER_IRQ:

    GIE  = 0
    INTE = 1
    GIE  = 1
    
RUN:

    Print At 1,1,Dec5 TELLER,
                
GoTo RUN

End

Als je haar maar goed zit, GROETEN LAMBIEK.

pic basic code:

Context Save
    If PULS_A = 1 Then
       If PULS_B = 1 Then
          Dec TELLER  
          Else
          Inc TELLER
       EndIf
          Toggle LED
    EndIf

Je moet je wel realiseren dat dit niet nauwkeurig is.

Als de boel tot stilstand komt met A=1 en B=0. Dat zou kunnen want allevier de combinaties komen voor. Als ie nu een micrometer achteruit gaat zodat A weer nul wordt. Geen interrupt als je die op positive edge triggert, en als dat wel gebeurt dan zorgt de eerste if dat er niets gebeurt. Maar als ie nu weer een micrometer naar voren kruipt, dan is B nogsteeds nul en incrementeert de teller. Deze voor/achter, kan gebeuren omdat je encoder fysiek staat te trillen maar ook als de encoder precies op een randje staat en het elektrisch niveau precies rond het omslagpunt zit, dan kan je deze situatie krijgen.

Wat ik wel eens gedaan heb is dat ik een 16-entry array heb gemaakt en dan zet ik A en B in een twee-bit variabele en die vul ik aan met A en B uit de vorige interrupt. De array vertelt dan wat er moet gebeuren. op 0b0000 staat dan: oude waarde AB=00, nieuwe waarde AB=00 dan.... doe niets: er is niets veranderd. Als het goed is krijg je dan geen interrupt, zo is de helft van de entries in de tabel voor nop. op positie 1, 0b0001 staat dan als AB van 00 naar 01 gaat. Deze overgang zit in bovenstaande code als een decrement. -1 in de tabel (Daar zal wel geen interrupt gebeuren en er zal wel niet geteld worden: mijn code telt op alle flanken en zal 4x sneller tellen, dus met de 500 counts encoder tot 2000 tellen in 1 omwenteling). De volgende entry: 2 = 0b0010 is de enige waar bovenstaande code van lambiek een telactie deed. Dit is van 00 naar 10, dus A is hoog geworden, terwijl B laag bleef: increment: +1 in de tabel.

code:


interrupt pcint (void)
{
  static unsigned char old;
  unsigned char cur;
  static const signed char table [16] = {
    0, -1, 1, 0, 
    -1, 0, 0, 1, 
   ... };
  cur = (digitalRead (PIN_A) << 1) | digitalRead (PIN_B);
  count += table[(old << 2) | cur];
  old = cur;
}

}

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Lambiek

Special Member

Op 25 februari 2020 08:40:11 schreef rew:
Je moet je wel realiseren dat dit niet nauwkeurig is.

Als de boel tot stilstand komt met A=1 en B=0. Dat zou kunnen want allevier de combinaties komen voor. Als ie nu een micrometer achteruit gaat zodat A weer nul wordt.

Ja, daar heb je helemaal gelijk in rew. Dat had ik me nog niet gerealiseerd.

Als je haar maar goed zit, GROETEN LAMBIEK.

goedemiddag Heren/dames

ik ben bezig met een project hierbij maak ik een systeem. waarmee ik meubels in hoogte kan verplaatsen. dit doe ik met behulp van een PLC.
deze plc stuurt een controlbox aan die weer gekoppeld zit aan de actuatoren.

nu wil ik graag de hoogte meten van de meubel per poot.

weet iemand wat voor sensor ik hiervoor kan gebruiken.
ik dacht zelf misschien aan een:
- laser afstand meter.
- ultra soon sensor.
- sonar sensor

het gaat om een afstand van 200/300 MM

alle tips zijn welkom

bedankt alvast!

Anoniem

kun je niet het aantal pulsen van de actuatoren uitlezen? je kan dan meten/berekenen dat x aantal pulsen overeen komt met xx mm.

GJ_

Moderator

Dat denk ik ook: als je actuatoren hebt zonder positie terugkoppeling is er in de engineeringsfase iets heel erg fout gegaan.

Ultrasoon en sonar zie ik even geen verschil tussen. Hou er rekening mee dat de meeste sensoren het eerste stuk blind zijn.

nee ik kan hierbij niet gebruik maken van de encoder en pulsen aangezien dit wordt overgenomen door de controllebox

Werk je met stappenmotoren? dan weet je hoeveel stappen je uitstuurt, en wat er gaat gebeuren. je zou een home schakelaar / routine kunnen maken waardoor als ze van slag af zijn, of bij nieuw installatie of vervangen ook makkelijk zich kunnen instellen. Ik werkte ooit ergens en die machine werkte zo over lengtes van meer dan 1500 mm en op een 0,01 - 0,02 mm.

[Bericht gewijzigd door andre1973 op vrijdag 13 maart 2020 15:19:50 (17%)

zit sinds 2009 in de PV.
GJ_

Moderator

Op 13 maart 2020 15:12:46 schreef Gkanis:
nee ik kan hierbij niet gebruik maken van de encoder en pulsen aangezien dit wordt overgenomen door de controllebox

Dan kun je het signaal toch opsplitsen?

Lambiek

Special Member

Op 13 maart 2020 14:01:52 schreef Gkanis:
dit doe ik met behulp van een PLC.
deze plc stuurt een controlbox aan die weer gekoppeld zit aan de actuatoren.

Wat doet die controlbox precies? Want dit is weer nieuw, daar heb je het eerst niet over gehad.

Dus wat zit daar in?, heb je daar info over?, hoe stuur je die aan, met wat voor signaal?

Als je haar maar goed zit, GROETEN LAMBIEK.

Voor hoogte meting kan je ook een lineaire potmeter nemen of glaslineaal die je op bv digitale draaibanken zit.

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.