Tuto Robotique (Help !)
Répondre à la discussion
Affichage des résultats 1 à 7 sur 7

Tuto Robotique (Help !)



  1. #1
    invitea1145a44

    Tuto Robotique (Help !)


    ------

    Hello,

    J'ai commencé à m'interesser à la robotique y'a déja quelques temps et je suis en complète galère.
    J'essaie de faire fonctionner deux servos pour qu'ils fassent un début de pince articulée.

    J'ai donc commencé par voir des tutos sur les timers pour les sevos mais j'arrive pas à aller plus loin que un servo, un timer (avec un prescaler et tout). Je vois pas comment faire pour controler deux servos indépendamment avec deux timers.

    Je pourrais vous coller mon code mais je me suis dit que c'est pas une bonne idée, ce que je recherche c'est un tutorial sur les pics, sur les timers ou les servos ou alors un cours complet sur le net parce que j'ai beau essayer quand j'ai des résultats sur google je comprends difficilement.

    J'ai un pic 18F4520, et deux servos. Le schéma est bon (de ce coté au moins je suis pas largué). Pour la programmation c'est autre chose. Je suis en C sous MPLab.

    Est ce que quelqu'un pourrait m'aider svp ? Merci par avance.

    -----

  2. #2
    mortaurat

    Re : Tuto Robotique (Help !)

    Salut,
    Pour controller plusieurs servo simultanement ca ne s'invente pas vraiment. Il faut connaitre la methode que voici:
    http://www.digitalspirit.org/wiki/pr...tionde24servos

    J'ai moi aussi mis longtemps à trouver comment faire =)

  3. #3
    mortaurat

    Re : Tuto Robotique (Help !)

    Tu peut aussi utiliser des modules dejà tout fait, genre:
    http://www.sparkfun.com/commerce/pro...oducts_id=8897

    perso j'en est un qui gere 21 servo en même temps, jpeu tout faire avec. Ideal pour mon hexapode

  4. #4
    invitea1145a44

    Re : Tuto Robotique (Help !)

    Euwwwwwww.........Comment dire ?

    En fait il y'a juste deux légers problèmes. Deja, l'assembleur c'est pas mon truc (je fais du C), donc en fait j'ai beau avoir compris le principe j'ai pas vraiment avancé parce que je peux pas lire le fichier.

    Si tu veux, niveau timer j'ai compris avec ca : http://mathieu.agopian.free.fr/prog_pic/servobis/
    Enfin, j'ai le sentiment d'avoir compris ce qu'ils me disent.

    En fait, pour le moment je veux pouvoir controler deux servos avec deux boutons.

    Ma finalité c'est : Le bouton i en position haute fait bouger le servo i vers la gauche.
    Le bouton i en position basse fait bouger le servo i vers la droite.

    Mais avant je voulais donner une séquence prédeterminée à deux servos pour qu'il fassent des mouvements en même temps, avec un timers.

    Code HTML:
    		servo 1 0°
    		servo 2 90°
    		Delay10KTCYx(250);
    		Delay10KTCYx(250);
    
    		servo 1 45°
    		servo 2 45°
    		Delay10KTCYx(250);
    		Delay10KTCYx(250);
    
    		servo 1 90°
    		servo 2 45°
    		Delay10KTCYx(250);
    		Delay10KTCYx(250);
    Et la je vois pas du tout (même avec ton site).

    J'ai donc (après moult recherches sur internet) réussi à faire pivoter deux servos en même temps. Ils pivotent bien vers la droite.
    Pour les faire faire ce que je veux (à savoir les controler et les faire bouger en même temps), j'ai ceci :

    Code HTML:
    #include <p18f4520.h>
    #include <timers.h>
    #include <delays.h>
    
    #pragma config OSC = HS      // Désactive l'oscillateur interne.
    #pragma config MCLRE = OFF   // Désactive la patte de reset.
    #pragma config LVP = OFF     // Low Voltage Programming désactivé => RB5 I/O normale.
    
    
    // Etat initial (au pif).
    int servo0 = 58939; // Servo 0
    int servo1 = 61559; // Servo 1
    
    int count = 0;
    
    void InterruptHandlerHigh (void);
    
    void main(void)
    {
    
    TRISB = 0x00;
    PORTB = 0x00;
    
    RCON = 0b000000000; 
    INTCON = 0b10100000;
    
    OpenTimer0( TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_2 );
    OpenTimer1( TIMER_INT_ON & T1_16BIT_RW & T1_SOURCE_INT & T1_PS_1_2 & T1_OSC1EN_OFF & T1_SYNC_EXT_OFF );
    
    WriteTimer0(15535);
    WriteTimer1(63035);
     
    
    while(1){
    
    	servo0 = 60535; // Servo 0 - 0 Degres
    	servo1 = 64285; // Servo 1 - 90 Degres
    		Delay10KTCYx(250);	// 1 Second Delay
    		Delay10KTCYx(250);
    	servo0 = 63035; // Servo 0 - 45 Degres
    	servo1 = 63035; // Servo 1 - 45 Degres
    		Delay10KTCYx(250);	// 1 Second Delay
    		Delay10KTCYx(250);
    	servo0 = 64285; // Servo 0 - 90 Degres
    	servo1 = 63035; // Servo 1 - 45 Degres
    		Delay10KTCYx(250);	// 1 Second Delay
    		Delay10KTCYx(250);
    	}
    }
    
    //INTERRUPT CONTROL
    #pragma code InterruptVectorHigh = 0x08
    void InterruptVectorHigh (void)
    {
            _asm
            goto InterruptHandlerHigh 
            _endasm //assembly code ends
    }
    #pragma code
    #pragma interrupt InterruptHandlerHigh
    
    void InterruptHandlerHigh()        // declaration of InterruptHandler
    {//this gets ran when ever the timers flop over from FFFF->0000
            if(INTCONbits.TMR0IF)
            {
    				WriteTimer0(15535);
    				WriteTimer1(60535);/
    				count = 0;
    			    INTCONbits.TMR0IF = 0;flag               
            }
            if(PIR1bits.TMR1IF == 1 && PIE1bits.TMR1IE == 1)
            {
    		count++;	
    			switch(count) {		
    			case 1:     PORTB = 0x01;
    					WriteTimer1( servo0 );
    					break;
    			case 2:	PORTB = 0x00;
    					WriteTimer1( servo1 );
    					break;
    			}
                    PIR1bits.TMR1IF = 0;
                    PIE1bits.TMR1IE = 1;
            }
        INTCONbits.GIE = 1;
    }
    Voila, et ca, précisément, ca fait rien du tout
    Et je comprend pas pourquoi.

    Sinon, pour les cartes préfabriquées oui mais bon j'aurais aimé réussir à controler vraiment deux servos quoi.

  5. A voir en vidéo sur Futura
  6. #5
    mortaurat

    Re : Tuto Robotique (Help !)

    Le site que tu m'a montré explique la methode 1 du lien que je t'avais passé.

    En gros pour faire simple, tu as besoin de deux interruption:
    - une pour la liaison serie ou I2C qui te permettra de changer la consigne (tableau char en variable global).
    - une pour controller tes servo qui s'effectuera tout les 10µs (d'où la PLL) qui devra regarder si tu dois mettre oui ou non la PIN correspondante à ton servos à 0 ou 1.

  7. #6
    invitea1145a44

    Re : Tuto Robotique (Help !)

    Hello again !!

    Après mûre relfexion et quelques modification de code j'ai obtenu un demi-résultat. J'ai un servo qui fait ce que je lui dit et l'autre qui fait seulement un demi tour dans le sens inverse et qui s'arrete.

    Code:
    #include <p18f4520.h>
    #include <timers.h>
    #include <delays.h>
    
    #pragma config OSC = HS      // Désactive l'oscillateur interne.
    #pragma config MCLRE = OFF   // Désactive la patte de reset.
    #pragma config LVP = OFF     // Low Voltage Programming désactivé => RB5 I/O normale.
    
    // Etat initial (au pif).
    volatile long servo0 = 63035; // Servo 0
    volatile long servo1 = 61559; // Servo 1
    
    volatile long count = 0;
    
    void InterruptHandlerHigh (void);
    static void EnableAllInterrupt(void);
    static void DisableAllInterrupt(void);
    
    void main(void)
    {
    ADCON1 = 15;
    PORTA=0x00;
    TRISA=0x00;
    PORTE=0x00;
    TRISE=0x00;
    TRISB = 0x00;
    PORTB = 0x00;
    
    RCON = 0b000000000; 
    INTCON = 0b10100000;
    
    DisableAllInterrupt();
    
    OpenTimer0( TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_2 );
    OpenTimer1( TIMER_INT_ON & T1_16BIT_RW & T1_SOURCE_INT & T1_PS_1_2 & T1_OSC1EN_OFF & T1_SYNC_EXT_OFF );
    
    EnableAllInterrupt();
    
    WriteTimer0(15535);
    WriteTimer1(63035);
     
    
    while(1) {
    
    	// Servo0 = RB0;
    	servo0 = 60535;			// Move to 0 Degrees.
    	servo1 = 64285;			// Move to 90 Degrees.
    	
    	Delay10KTCYx(250);
    	Delay10KTCYx(250);
    	
    	servo0 = 63035;			// Move to 45 Degrees.
    	servo1 = 63035;			// Move to 45 Degrees.
    	
    	Delay10KTCYx(250);
    	Delay10KTCYx(250);
    	
    	servo0 = 64285;			// Move to 90 Degrees.
    	servo1 = 63035;			// Move to 45 Degrees.
    	
    	Delay10KTCYx(250);
    	Delay10KTCYx(250);
    
    	}
    }
    
    #pragma code InterruptVectorHigh = 0x08
    
    void InterruptVectorHigh (void)
    {
            _asm
            goto InterruptHandlerHigh
            _endasm
    }
    #pragma code
    
    #pragma interrupt InterruptHandlerHigh
    
    void InterruptHandlerHigh(void) {
    
    	unsigned char sauv1;
    	unsigned char sauv2;
    
    	// On sauvegarde le contenu des registres de calcul.
    	sauv1 = PRODL;
    	sauv2 = PRODH;	
    
            if(INTCONbits.TMR0IF == 1)
            {
    				WriteTimer0(15535);
    				WriteTimer1(64631);
    				count = 0;
    	    
    				INTCONbits.TMR0IF = 0;           
            }
            if(PIR1bits.TMR1IF == 1 && PIE1bits.TMR1IE == 1)
            {
    		count=0;	
    			switch(count) {		
    			case 1 :PORTB = 0x01;
    					WriteTimer1(servo0);
    					break;
    			case 2 :PORTB = 0x02;
    					WriteTimer1(servo1);
    					break;
    			}
                    PIR1bits.TMR1IF = 0;
                    PIE1bits.TMR1IE = 1;
            }
    
    	PRODL = sauv1;
    	PRODH = sauv2;
    }
    
    static void EnableAllInterrupt(void)
    {
    	INTCONbits.GIE = 1;
    	INTCONbits.PEIE = 1;
    }
    
    // Interdit les interruptions.
    static void DisableAllInterrupt(void)
    {
    	INTCONbits.GIE = 0;
    	INTCONbits.PEIE = 1;
    }
    Je pense que le problème vient de la ligne
    Code:
    PORTB = 0b02;
    Je pensais mettre à la main
    Code:
    PORTB = 0b00000010
    . Mais ca ne marche pas !

    Est ce que quelqu'un aurait une idée svp ?
    Merci !

  8. #7
    invitea1145a44

    Re : Tuto Robotique (Help !)

    Bon j'ai réussi à régler mon problème

    Mon servo comme je l'ai dit fesait pour l'un le bon truc et l'autre se bloquait au bout d'un demi tour ! Il était en roue libre en fait !

    Si vous regardez bien après le if, si count vaut 3, il n'y a aucun moment une remise à 0 des pins B0 et E0, donc un servo était remis à 0, le premier puisque le progrramme passait dans un case avec une remise à 0 du premier.

    L'autre n'est pas remis à 0. Donc il tourne à 1 constemment. Il est en roue libre. D'ou le problème !

    Voila voila mais comme j'ai l'impression que tout le monde s'en fout j'espère quand même que ca aidera quelqu'un.

Discussions similaires

  1. tuto matlab
    Par invite7789dbac dans le forum Logiciel - Software - Open Source
    Réponses: 4
    Dernier message: 03/11/2008, 15h22
  2. Actualisation du tuto Iris
    Par VLe dans le forum Matériel astronomique et photos d'amateurs
    Réponses: 1
    Dernier message: 04/01/2007, 05h05
  3. tuto photoshop
    Par nayx dans le forum Matériel astronomique et photos d'amateurs
    Réponses: 4
    Dernier message: 18/12/2006, 18h14
  4. tuto?
    Par invite28559b6a dans le forum Matériel astronomique et photos d'amateurs
    Réponses: 21
    Dernier message: 20/09/2006, 13h50
Découvrez nos comparatifs produits sur l'informatique et les technologies.