Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Tout ce qui n'a pas de catégorie !
Servomoteur puissant, asservissement en position d'un moteur CC
F6FCO
Avatar de l’utilisateur
Expert
Expert
Messages : 2846
Âge : 99
Enregistré en : décembre 2017
Localisation : Banlieue sud de Klyntar
Contact :

#1 Message par F6FCO » lun. 10 juin 2024 20:37

Hello tout le monde,
Ce sujet est en lien avec le sujet Rub1k et le défi de réaliser un servomoteur plus puissant que les petits servos de modélisme.
Le but étant de pouvoir élever un moteur NEMA16 glissant sur un rail vertical, les servos de modélisme ne peuvent le garder en haut une fois dé-alimentés. Le moteur redescend sous l'effet de son poids, l'idée est de partir sur un moteur CC avec une boite de démultiplication pour avoir du couple à vide et pouvoir contrer le poids du NEMA16 tenant son cube.
Il faut que le moteur soit équipé d'un disque codeur sur son axe, quand le moteur tourne il envoie des ticks sur l'entée T0CKI avec le Timer0 en mode compteur et le nombre de ticks est stocké dans TMR0L (et TMR0H si on veut faire beaucoup de tours et que le nb de ticks nécessaires dépasse 255). Quand le nombre de ticks atteint la consigne le moteur s'arrête. Une fois stoppé le moteur reste en position par la force de sa démultiplication.
Pour repartir dans l'autre sens on met TMR0L à zéro et on recommence en inversant l'alim.
Le moteur est interfaçé par un pont en H L298, il suffit de mettre les deux entrées du pont à 10, 01 ou 00 pour le faire tourner dans un sens, dans l'autre ou le stopper.

La course de déplacement du moteur est réglable par la valeur de consigne stipulée dans les #define

Code : Tout sélectionner

;**********************************************************************
;
                                                                    
;                Asservissement en position moteur CC   
;                       F6FCO - juin 2024                                                         
;                                                                     
;**********************************************************************

        Errorlevel-302             ; Supprime le message "Ensure that bank bits are correct" 
        list            p
=18f4525    ; processeur utilisé 
        
#include        <p18f4525.inc>    ; Définitions des constantes PIC
    
 CONFIG OSC 
= INTIO67                   ; Oscillateur interne 8MHz 
 CONFIG IESO 
= OFF                         ; Délai au démarrage (ON/OFF)
 CONFIG BOREN = OFF                        ; Reset si chute de tension (ON/OFF)
 CONFIG PWRT = ON                          ; Délai au démarrage (ON/OFF)
 CONFIG BORV = 0                           ; Tension de reset en 1/10ème Volts 
 CONFIG WDT 
= OFF                          ; Mise hors service du watchdog (ON/OFF)
 CONFIG PBADEN = OFF                       ; PORTB<4:0> les broches sont configurées comme E/S numériques lors de la réinitialisation
 CONFIG LPT1OSC 
= OFF                      ; Timer1 configuré pour un fonctionnement plus puissant
 CONFIG MCLRE 
= ON                         ; Mclr configuré comme entrée
 CONFIG STVREN 
= ON                        ; Reset sur débordement de pile (ON/OFF)
 CONFIG LVP = OFF                          ; Programmation basse tension autorisée (ON/OFF)
 CONFIG XINST = OFF                        ; L'extension du jeu d'instructions et le mode d'adressage indexé sont désactivés(mode hérité)
 CONFIG DEBUG = OFF                        ; Debugger hors service
 CONFIG CP0 = OFF                       ; Code protection sur block 0 (ON/OFF)
 CONFIG CP1 = OFF                       ; Code protection sur block 1 (ON/OFF)
 CONFIG CP2 = OFF                       ; Code protection sur block 2 (ON/OFF)
 CONFIG CPB = OFF                       ; Code protection sur bootblock  (ON/OFF)
 CONFIG CPD = OFF                          ; Code protection sur eeprom (ON/OFF)
 CONFIG WRT0 = OFF                         ; Protection écriture block 0 (ON/OFF)
 CONFIG WRT1 = OFF                         ; Protection écriture block 1 (ON/OFF)
 CONFIG WRT2 = OFF                         ; Protection écriture block 2 (ON/OFF)
 CONFIG WRTB = OFF                         ; Protection écriture bootblock (ON/OFF)
 CONFIG WRTC = OFF                         ; Protection écriture configurations (ON/OFF)
 CONFIG WRTD = OFF                         ; Protection écriture zone eeprom (ON/OFF)
 CONFIG EBTR0 = OFF                        ; Protection lecture de table block 0 (ON/OFF)
 CONFIG EBTR1 = OFF                        ; Protection lecture de table block 1 (ON/OFF)
 CONFIG EBTR2 = OFF                        ; Protection lecture de table block 2 (ON/OFF)
 CONFIG EBTRB = OFF                        ; Protection lecture de table bootblock (ON/OFF)

; --------- moteur à asservir
#define Namiki_mot1    PORTA,0    
#define Namiki_mot2    PORTA,1
#define Namiki_opto    PORTA,4        ; optocoupleur du moteur
#define consigne    d'
100

    CBLOCK 0x000C               
    w_temp         :1        ; Sauvegarde du registre W
    status_temp     :1        ; Sauvegarde du registre STATUS
    Reg_1        :1
    Reg_2        :1
    Reg_3        :1
    conchita    :2        ; variable bonne à tout faire
    ENDC                                      

    org    0x0000             ; Adresse de départ après reset
      bra        init            ; Adresse 0: initialiser

; ------------------------  Routines Interruptions                            
    ; sauvegarder registres    
    org     0x0008            ; adresse d'
interruption
    movwf   w_temp          
; sauver registre W
    swapf    STATUS
,w        ; swap status avec résultat dans w
    movwf    status_temp        
; sauver status swappé

    
; Interrupt TIMER0
    btfsc    INTCON
,TMR0IE        ; bit5. interrupt timer0 autorisée ?
    btfss    INTCON,TMR0IF        ; bit2. si oui, tester si interrupt timer en cours
    bra     restorereg
    call    inttimer0        
; vers routine interrupt timer0
    bcf    INTCON
,TMR0IF        ; effacer flag interrupt timer0
    
    
    
; restaurer registres
restorereg
    swapf    status_temp
,w        ; swap ancien status, résultat dans w
    movwf   STATUS            
; restaurer status
    swapf   w_temp
,f        ; Inversion L et H de l'ancien W, sans modifier Z
    swapf   w_temp,w          ; Réinversion de L et H dans W, W restauré sans modifier status
    retfie              ; return from interrupt

    ; Routine d'
interruption TIMER 0                            
inttimer0    return
    
    
; ------------------------ Init
init    clrf    EEADR            
; diminue la consommation
    
    movlw    0xff            
; init oscillateur à 8MHz
    movwf    OSCCON
    
    
; init Timer0
    movlw    0xA8            
; compteur 16bits sur pin TOCKI sans prescaler
    movwf    T0CON        
    
    
; init TMR0
    clrf    TMR0L
    clrf    TMR0
            
        
; inti ports
    clrf    PORTA
                
        movlw     0x0F
          movwf     ADCON1                
; mode digital
          
    movlw    b
'00010000'
    movwf    TRISA
    
    movlw    b
'10100000'        ; masque interruption
    movwf    INTCON            
; charger interrupt control
    
    clrf    conchita
    
    
; goto main
; -----------------------------------



Fichier main

Code : Tout sélectionner




#include<Asserv_CC_init.asm>

; Le moteur est branché sur un driver pont en H L298
; il nécessite des niveaux haut et/ou bas sur Namiki_mot1 et Namiki_mot2
; pour tourner dans un sens, dans l'autre ou stopper.
; Quand le nombre de ticks issus de l'
optocoupleur du moteur atteint
; la valeur de consigne le moteur stoppe.

main
    call    Namiki
    bra     main            
    
Namiki
    
; tourne sens horaire
    clrf    TMR0L
    bcf    Namiki_mot1
    bsf    Namiki_mot2

nm1    
; teste si consigne atteinte    
    movff    TMR0L
,conchita
    movf    conchita
,w
    sublw    consigne
    bnz    nm1
    
    
; stop moteur
    bcf    Namiki_mot1
    bcf    Namiki_mot2
    
    call    tempo1s
    
    
; tourne dans le sens anti-horaire
    clrf    TMR0L
    bsf    Namiki_mot1
    bcf    Namiki_mot2
    
nm2    
; teste si consigne atteinte
    movff    TMR0L
,conchita
    movf    conchita
,w
    sublw    consigne
    bnz    nm2

    
; stop moteur
    bcf    Namiki_mot1
    bcf    Namiki_mot2
    
    call    tempo1s
    return
    

tempo1s
    movlw       .93
    movwf       Reg_1
,1
    movlw       .38
    movwf       Reg_2
    movlw       .11
    movwf       Reg_3
    decfsz      Reg_1
,F,1
    bra         
$-2
    decfsz      Reg_2
    bra         
$-6
    decfsz      Reg_3
    bra         
$-.10
    nop
    nop
    return
    END                


https://www.youtube.com/watch?v=i0zfHCr5XsE

EDIT: je me suis gouré de forum, je voulais poster dans le forum ASM :sifflotte: . Jéremy, si tu passes par là.
Modifié en dernier par F6FCO le jeu. 27 juin 2024 20:32, modifié 4 fois.
Une porte nand prend 2 bits en entrée... :eek:

Asservissement en position d'un moteur CC. Gros servo.
F6FCO
Avatar de l’utilisateur
Expert
Expert
Messages : 2846
Âge : 99
Enregistré en : décembre 2017
Localisation : Banlieue sud de Klyntar
Contact :

#2 Message par F6FCO » mar. 11 juin 2024 19:58

Je me suis amusé à faire un test sur un moteur plus puissant avec boite de démultiplication. Ce moteur n'étant pas équipé de disque codeur je l'ai bidouillé pour lui en rajouter une en rajoutant un axe sur le premier pignon.

P1060912.JPG


P1060915.JPG


P1060916.JPG


P1060917.JPG


Essai concluant, le moteur fait du bruit mais c'était un moteur en panne que j'ai rafistolé pour le remettre en fonction.

https://www.youtube.com/watch?v=yUvOqXMw2i8
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Une porte nand prend 2 bits en entrée... :eek:

Servomoteur puissant, asservissement en position d'un moteur CC
F6FCO
Avatar de l’utilisateur
Expert
Expert
Messages : 2846
Âge : 99
Enregistré en : décembre 2017
Localisation : Banlieue sud de Klyntar
Contact :

#3 Message par F6FCO » mer. 11 déc. 2024 19:34

Hello,
Pause dans le projet Rub1k pour cause de matos défaillant, on va faire du DIY.

Le premier prototype était simple et fonctionnel mais se contentait de faire tourner l'axe jusqu'à une certaine position, c'est la force de la démultiplication du jeu de pignons qui le maintenait sur cette position, c'est déjà pas mal mais on va essayer de faire mieux.
Ayant des déboires en ce moment avec les servos de mon projet Rub1k qui ne tiennent pas la route, ce qui est normal n'étant pas conçus pour ce que je leur demande il me faut système qui maintienne la position avec un torque puissant. On va penser à un système similaire au premier mais avec une consigne, en cas d'efforts contraires il devra faire ce qu'il faut pour tenir cette consigne. J'ai trois petits moteurs démultipliés 12vcc, je ne sais pas si ce sera suffisant pour monter et maintenir le pap et sa pince dans le projet Rub1k mais le principe pourra se reporter sur des moteurs plus costauds au cas-ou.

Encore de la méca, la première chose est de rallonger un axe existant dans la boite de démultiplication du moteur pour y fixer soit une roue codeuse, soit un encodeur en quadrature. Je pars sur un encodeur, une roue codeuse nécessiterait deux fourches optiques et ce serait plus compliqué à mettre en place.

Les trois moteurs qui vont être DIYisés

P1070171.JPG


J'ai percé la partie arrière du boitier pour laisser sortir la rallonge d'axe. J'ai soudé à l'étain cette rallonge sur le pignon de sortie moteur, le choix à été arbitraire en espérant qu'il ne tournera pas trop vite et ne fournira pas plus de 255 impulsions pour le travail demandé, sinon çà compliquera un peu le code. On verra çà aux essais et si çà ne va pas je rallongerai le deuxième train de pignons sur les deux autres. J'ai vu un peu court, les prochaines auront quelques mm de plus.

P1070172.JPG


La modif terminée, reste à y fixer et rendre solidaire l'encodeur, çà reste de la bricole il risque de ne pas tourner très rond mais on fera avec.

P1070173.JPG
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Une porte nand prend 2 bits en entrée... :eek:

Servomoteur puissant, asservissement en position d'un moteur CC
gwion
Expert
Expert
Messages : 1122
Enregistré en : février 2022

#4 Message par gwion » mer. 11 déc. 2024 20:01


Servomoteur puissant, asservissement en position d'un moteur CC
F6FCO
Avatar de l’utilisateur
Expert
Expert
Messages : 2846
Âge : 99
Enregistré en : décembre 2017
Localisation : Banlieue sud de Klyntar
Contact :

#5 Message par F6FCO » mer. 11 déc. 2024 23:38

J'en ai utilisé ici, çà aurait pu être une solution mais çà implique de construire un lecteur de disque comme celui utilisé dans le lien, en plus simple mais quand même plus lourd à installer qu'un simple encodeur.
Mais si j'avais du utiliser un disque codeur plutôt qu'un code Gray j'aurai opté pour un disque à deux pistes, la première qui sert à l'incrémentation et la deuxième à la décrémentation, le code s'en serait trouvé simplifié.
Une porte nand prend 2 bits en entrée... :eek:

Servomoteur puissant, asservissement en position d'un moteur CC
gwion
Expert
Expert
Messages : 1122
Enregistré en : février 2022

#6 Message par gwion » jeu. 12 déc. 2024 06:29

Je proposais ça juste pour te compliquer la vie en fait :sifflotte:
L'avantage c'est que tu connais la position du moteur à la mise sous tension, mais c'est vrai que ça complique les choses pour l'encombrement, la mécanique et le code :lol:

Servomoteur puissant, asservissement en position d'un moteur CC
F6FCO
Avatar de l’utilisateur
Expert
Expert
Messages : 2846
Âge : 99
Enregistré en : décembre 2017
Localisation : Banlieue sud de Klyntar
Contact :

#7 Message par F6FCO » jeu. 12 déc. 2024 09:59

Tu ne trouves pas qu'elle est déjà bien assez compliquée comme çà :lol:

Au contraire çà aurait simplifié, plus simple que de gérer la quadrature car on aurait pu compter en avant ou en arrière plus simplement. Mais juste une histoire de place, vu la taille des fourches disponibles sur le marché ou de celles que j'ai en stock il aurait fallu faire des disques assez conséquents, surélever les moteurs et çà aurait pris trop de place sur le châssis, sans compter que dans tous les cas il va falloir rajouter un driver pour chaque moteur.

Par contre tu soulèves un problème auquel je n'avais pas pensé au départ et qui n'existait pas avec les servos conventionnels, que ce soit avec Gray ou en quadrature: connaître la position au démarrage !
Et connaître la position avec Gray n'aurait été valable seulement si le disque n'effectuait pas un tour complet entre pap reculé et pap avancé, dans ce cas il y a de fortes chances que je n'ai pas choisi le bon axe de sorti de boite du moteur. Ou alors faire un disque Gray avec un code plus conséquent ce qui augmenterait sa taille, pas jouable. Ou alors faire un système de comptage de tours du disque, çà devient compliqué.
Je ne vais pas non plus rajouter des prises de POM pour les trois servos, Rub1k est déjà assez usine à gaz comme çà.
A cogiter !!!

Re: idea ! Peut-être mettre une butée solide en position (reculée) basse du pap et on le positionne manuellement contre avant de démarrer le système. Une POM mécanique.


Re Re: Quand on a la mémoire courte !!! j'avais déjà été confronté au problème des POM dans ce cas-là, voir deuxième vidéo ici
Voilà pourquoi j'ai créé ce site web, c'est un aide-mémoire pour papy !
Une porte nand prend 2 bits en entrée... :eek:

Servomoteur puissant, asservissement en position d'un moteur CC
cyril13110
Avatar de l’utilisateur
Expert
Expert
Messages : 1679
Âge : 43
Enregistré en : avril 2016
Localisation : 13

#8 Message par cyril13110 » jeu. 12 déc. 2024 10:30

coucou tous le monde,

Et bein avec tous ca terminator n'est pas pret de courir avec sarha connord dehors!!

Rien qua imaginer la pince pour le cube ca fait une sacré usine à gaz , du coup la video qui a été mis au tous debut de la discution quel type de moteur le mec avait utilisé? pour que ca ne soit pas si complexe?
she ise heu lahive.......heu lahive......

Servomoteur puissant, asservissement en position d'un moteur CC
F6FCO
Avatar de l’utilisateur
Expert
Expert
Messages : 2846
Âge : 99
Enregistré en : décembre 2017
Localisation : Banlieue sud de Klyntar
Contact :

#9 Message par F6FCO » jeu. 12 déc. 2024 11:46

Le mec c'est oime, j'avais utilisé un petit moteur Namiki de caisse enregistreuse, il est équipé d'une roue codeuse et deux fourches opto à l'arrière. Des petits bijoux ces moteurs mais pas assez rustiques, j'ai fini par les détruire avec le bras ropot.
Une porte nand prend 2 bits en entrée... :eek:

Servomoteur puissant, asservissement en position d'un moteur CC
F6FCO
Avatar de l’utilisateur
Expert
Expert
Messages : 2846
Âge : 99
Enregistré en : décembre 2017
Localisation : Banlieue sud de Klyntar
Contact :

#10 Message par F6FCO » jeu. 12 déc. 2024 17:27

Servomoteur Steampunk. Il me faut à tout prix un chapeau haut de forme et des lunettes de soudeur.

https://www.youtube.com/watch?v=HgSYF3GeFus
Une porte nand prend 2 bits en entrée... :eek:


Retourner vers « Coin Fourre-tout »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 4 invités