Répondre à la discussion
Affichage des résultats 1 à 16 sur 16

Commande de pic par interrupteur.



  1. #1
    Iks

    Commande de pic par interrupteur.


    ------

    Bonjour,

    J'aimerais pourvoir commander à mon pic d'allumer une LED si je pousse un bouton poussoir. Et d'en allumer une autre si je pousse un autre bouton poussoir.
    Alors j'ai pensé relier le bouton a une patte du pic et au +5V comme ca dès que l'on bouge le bouton, le +5v arrive sur la patte du pic. Après je pensais la lire avec un if(PORTXbits.RX# ==1).

    Mais le fait est que je crois que c'est pas une idée terrible et que en fait ca marche pas très bien. Est ce que c'est la bonne solution ?

    Merci

    -----

  2. Publicité
  3. #2
    DAUDET78

    Re : Commande de pic par interrupteur.

    Citation Envoyé par Iks Voir le message
    Alors j'ai pensé relier le bouton a une patte du pic et au +5V comme ca dès que l'on bouge le bouton, le +5v arrive sur la patte du pic.
    et quand tu ne pousses pas le bouton, la patte du PIC en l'air !!!! mets une résistance de PullDown de 10K entre la patte et le 0V

    PS : et faire un antirebond par soft
    J'aime pas le Grec

  4. #3
    Iks

    Re : Commande de pic par interrupteur.

    Compris, une résistance quand le bouton est pas pressé entre la patte et la masse et le +5v quand on appuie.

    C'est quoi un antirebond par soft ?

    Merci de ta réponse !

  5. #4
    vede

    Cool Re : Commande de pic par interrupteur.

    Citation Envoyé par Iks Voir le message
    Compris, une résistance quand le bouton est pas pressé entre la patte et la masse et le +5v quand on appuie.

    C'est quoi un antirebond par soft ?

    Merci de ta réponse !
    Bonjour,

    un anti-rebonds soft, c'est une petite temporisation (dizaines de ms)
    après la détection de la touche pressée, afin de ne pas prendre en
    compte les "rebonds" du Bouton...

    exemple :

    si bouton = 1
    . delay_ms(50)
    . la suite...
    fin de si

    le "problème" des rebonds est par exemple expliquè là:
    http://www.ptitrain.com/electronique...02/poussar.htm
    mais eux utilisent une solution hardware (RC)...

    vede
    ;O]
    _____________
    ...
    Dernière modification par vede ; 17/05/2010 à 18h58.

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

    Re : Commande de pic par interrupteur.

    Okay merci.

  8. #6
    Iks

    Question Re : Commande de pic par interrupteur.

    Hello, c'est encore moi

    J'ai fais le montage et j'ai un code qui marche pas mal pour le moment mais j'ai juste une dernière question.

    En fait quand je suis sur protoboard et je veux faire bouger des servos avec des interrupteurs (genre un interrupteur par servo, plus on appuie, plus ca tourne).

    Pour le moment j'utilise que des fils et 5 servos.
    Le problème est que parfois quand je connecte un des fil pour mettre une patte de pic au 5V, pour faire bouger un servo, les autres ont des espèces de soubresauts chelous .

    Dans le code, en passant les consignes de Décimal à Hexadécimal, j'ai noté un mieux (bizarre non ?).

    Et sinon j'ai un alim de 500mA peut être que c'est pas assez ?

    Sinon quelqu'un à une idée ? Ca ressemble à des interférences j'ai l'impression...

    Merci d'avance !!

  9. Publicité
  10. #7
    vede

    Cool Re : Commande de pic par interrupteur.

    Hello ;O]

    faudrait voir le schéma et le code...
    pour pouvoir tenter de te donner une réponse précise...

    vede
    ;O]
    ______________
    ...

  11. #8
    Iks

    Re : Commande de pic par interrupteur.

    Okay, attention préparez vous ca arrive !!

    Voila déja la Board Eagle.

    http://h.imagehost.org/0124/BoardEagle.jpg

    Le schématics Eagle

    http://h.imagehost.org/0673/SchemaEagle.jpg


    Voila le code :

    Code:
    // Programme de Pince Robotisée à 2 degrés de liberté (pince à un degré de liberté).
    
    #include <p18f4520.h>
    #include <timers.h>
    #include <delays.h>
    
    // Définition des entrées des servomoteurs.
    #define IO_Servo0 PORTBbits.RB0
    #define IO_Servo1 PORTBbits.RB1
    #define IO_Servo2 PORTBbits.RB2
    #define IO_Servo3 PORTBbits.RB3
    #define IO_Servo4 PORTBbits.RB4
    
    // Définition des boutons pour contrôler la pince.
    #define SW_Vertical_Up PORTDbits.RD4			//	D4
    #define SW_Vertical_Down PORTDbits.RD5			//	D5
    #define SW_Horizontal_Right PORTDbits.RD6		//	D6
    #define SW_Horizontal_Left PORTDbits.RD7		//	D7
    #define SW_Grippers_Open PORTCbits.RC7			//	C7
    #define SW_Grippers_Close PORTCbits.RC6			//	C6
    
    // Définition des DEL pour l'alimentation et l'indication des mouvements.
    #define DEL_ALIM PORTAbits.RA0
    #define DEL_DDL1 PORTAbits.RA1
    #define DEL_DDL2 PORTAbits.RA2
    #define DEL_GRIP PORTAbits.RA3
    
    // Les commandes servos permettent de générer le PWM.
    int CMD_Servo0 = 0xF63B;
    int CMD_Servo1 = 0xF63B;
    int CMD_Servo2 = 0xF63B;
    int CMD_Servo3 = 0xF63B;
    int CMD_Servo4 = 0xF63B;
    
    // Le compteur permet de passer d'un servo à l'autre.
    int cpt = 0;
    
    void Move(int,int,int,int,int);
    void MyInterrupt (void);
    
    void main(void)
    {
    	ADCON1 = 15;
    	TRISA = 0;PORTA = 0;
    	TRISB = 0;PORTB = 0;TRISC = 0;
    	TRISCbits.TRISC7 = 1;TRISCbits.TRISC6 = 1;PORTC = 0;
    	TRISD = 1;PORTD = 0;
    	TRISE = 0;PORTE = 0;
    
    	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(0x3CAF);		// PWM arrêté à 20 ms
    	WriteTimer1(0xFBF4);		// Délai initial du PWM pour les servos.
    
    
    	INTCONbits.GIE = 1;
    	INTCONbits.PEIE = 1; 
    	// On allume une DEL pour vérifier que le PIC fonctionne.
    	DEL_ALIM = 1;
    
    	while(1)
    	{	
    	/*	// Phase de Test.
    		// Petite Macarena générale avant les choses sérieuses.
    		CMD_Servo0 = 60535;			// 0°.
    		CMD_Servo1 = 64285;			// 90°.
    		CMD_Servo2 = 60535;			// 90°.
    		CMD_Servo3 = 64285;			// 90°.
    		CMD_Servo4 = 60535;			// 90°.
    		
    		Delay10KTCYx(250);		// Delai d'une demi-seconde.
    		Delay10KTCYx(250);		// Delai d'une demi-seconde.
    		
    		CMD_Servo0 = 63035;			// 45°.
    		CMD_Servo1 = 63035;			// 45°.
    		CMD_Servo2 = 63035;			// 90°.
    		CMD_Servo3 = 63035;			// 90°.
    		CMD_Servo4 = 63035;			// 90°.
    		
    		Delay10KTCYx(250);
    		Delay10KTCYx(250);
    		
    		CMD_Servo0 = 64285;			// 90°.
    		CMD_Servo1 = 60535;			// 0°.
    		CMD_Servo2 = 64285;			// 90°.
    		CMD_Servo3 = 60535;			// 90°.
    		CMD_Servo4 = 64285;			// 90°.
    
    		Delay10KTCYx(250);
    		Delay10KTCYx(250);
    */
    
    /*
    
    Conversion Décimal en Hexadécimal
    
    64000 = FA00
    61000 = EE48
    256 = 100
    512 = 200
    63035 = F63B
    60535 = EC77
    64500 = FBF4
    15535 = 3CAF
    60000 = EA60
    128 = 80
    */
    
    		if(SW_Vertical_Up && CMD_Servo1 < 0xF80C)
    		{
    			Delay10KTCYx(25);
    			DEL_DDL1 = 1;
    			DEL_DDL2 = 0;
    			DEL_GRIP = 0;
    			Move(0,(CMD_Servo1 + 0x100),CMD_Servo2 + 0x100,0,0);
    		}
    		if(SW_Vertical_Down && CMD_Servo1 > 0xEA60)
    		{
    			Delay10KTCYx(25);
    			DEL_DDL1 = 1;
    			DEL_DDL2 = 0;
    			DEL_GRIP = 0;
    			Move(0,(CMD_Servo1 - 0x100),CMD_Servo2 - 0x100,0,0);
    		}
    		if(SW_Horizontal_Right && CMD_Servo0 < 0xF80C)
    		{
    			Delay10KTCYx(25);
    			DEL_DDL2 = 1;			
    			DEL_DDL1 = 0;
    			DEL_GRIP = 0;	
    			Move((CMD_Servo0 + 0x200),0,0,0,0);
    		}	
    		if(SW_Horizontal_Left && CMD_Servo0 > 0xEA60)
    		{
    			Delay10KTCYx(25);
    			DEL_DDL2 = 1;			
    			DEL_DDL1 = 0;
    			DEL_GRIP = 0;
    			Move((CMD_Servo0 - 0x200),0,0,0,0);
    		}
    		if(SW_Grippers_Open)
    		{
    			Delay10KTCYx(25);
    			DEL_GRIP = 1;
    			DEL_DDL1 = 0;			
    			DEL_DDL2 = 0;
    			Move(0,0,0,0xF63B,0xF63B);
    		}
    		if(SW_Grippers_Close)
    		{
    			Delay10KTCYx(25);
    			DEL_GRIP = 1;
    			DEL_DDL1 = 0;			
    			DEL_DDL2 = 0;
    			Move(0,0,0,0xEC77,0xEC77);
    		}
    	}
    }
    
    // Cette fonction permet de donner les instructions aux servomoteurs.
    void Move(int CMD_Premier, int CMD_Second, int CMD_Troisieme, int CMD_Quatrieme, int CMD_Cinquieme)
    {
    	if(CMD_Premier)
    		CMD_Servo0 = CMD_Premier;
    	if(CMD_Second)
    		CMD_Servo1 = CMD_Second;
    	if(CMD_Troisieme)
    		CMD_Servo2 = CMD_Troisieme;
    	if(CMD_Quatrieme)
    		CMD_Servo3 = CMD_Quatrieme;
    	if(CMD_Cinquieme)
    		CMD_Servo4 = CMD_Cinquieme;
    }
    
    #pragma code InterruptVectorHigh = 0x08
    void InterruptVectorHigh (void)
    {
     	_asm
        goto MyInterrupt
        _endasm
    }
    #pragma code
    #pragma interrupt MyInterrupt
    
    void MyInterrupt(void)
    {
    	if(INTCONbits.TMR0IF)
        {
    		WriteTimer0(15535);
    		WriteTimer1(64500);
    		cpt = 0;
    		INTCONbits.TMR0IF = 0;
        }
        if(PIR1bits.TMR1IF == 1)
        {
    		PORTB = 0;
    		cpt++;	
    		switch(cpt)
    		{		
    			case 1 : IO_Servo0 = 1;				// Rotation du corps.
    				     WriteTimer1(CMD_Servo0);
    					 break;
    			case 2 : IO_Servo1 = 1;				// Montée/Descente Premier Etage.
    					 WriteTimer1(CMD_Servo1);
    					 break;
    			case 3 : IO_Servo2 = 1;				// Montée/Descente Second Etage.
    					 WriteTimer1(CMD_Servo2);
    					 break;
    			case 4 : IO_Servo3 = 1;				// Gripper Gauche.
    					 WriteTimer1(CMD_Servo3);
    					 break;
    			case 5 : IO_Servo4 = 1;				// Gripper Droit.
    					 WriteTimer1(CMD_Servo4);
    					 break;
    		}
            PIR1bits.TMR1IF = 0;
       }
    }

    En gros, pour le code : Deux parties, le main capte les instructions sur les pattes du pic, envoie ca à une fonction qui attribue les commandes des servos à mettre dans les timers.

    La fonction interruption permet de créer un PWM commun pour tous les servos avec le switch.

    Tous les schémas sont théoriques hein, j'utilise une protoboard pour mes tests, je ferai la carte finales avec une plaque préperforée quand je serais sur de moi.
    Dernière modification par Iks ; 20/05/2010 à 11h01.

  12. #9
    PIXEL

    Re : Commande de pic par interrupteur.

    apparemment pas de découplage de l'alim aux bornes du µ...

    à corriger en priorité ! surtout si il y a des moteurs sur la même alimentation.

  13. #10
    DAUDET78

    Re : Commande de pic par interrupteur.

    Citation Envoyé par PIXEL Voir le message
    apparemment pas de découplage de l'alim aux bornes du µ...
    et pas de résistance de PullUP (10K) sur les switchs
    J'aime pas le Grec

  14. #11
    Iks

    Re : Commande de pic par interrupteur.

    C'est quoi un découplage ?
    Parce que si c'est un condensateur entre la masse et le +5V j'en ai mis un mais j'ai oublié de le mettre sur le schéma. Il fait 100µF

    Je dois avouer que j'ai oublié les résistances. Honte à moi
    Mais même avec ca change pas grand-chose (je viens de tester).

  15. #12
    DAUDET78

    Re : Commande de pic par interrupteur.

    Citation Envoyé par Iks Voir le message
    mais j'ai oublié de le mettre sur le schéma. Il fait 100µF
    en parallèle avec un 0,1µF
    J'aime pas le Grec

  16. Publicité
  17. #13
    Iks

    Re : Commande de pic par interrupteur.

    Okay, demain je vais chercher un condo 1µF. Je le met en parralèle avec l'autre alors c'est ca ?

    La j'avoue que je suis perdu

    Si je met un condo de 0.1µF avec mon 100µF c'est équivalent à un condo de 0.1 µF, quel interet d'en mettre un si petit ?

    Bon bé alors demain soir je vous dit ca

    En plus j'avoue que mon schematics est un peu mauvais niveau interrupteur, j'ai en fait mis le +5V sur la patte milieu pour envoyer le signal

  18. #14
    vede

    Cool Re : Commande de pic par interrupteur.

    Hi,

    Citation Envoyé par DAUDET78 Voir le message
    (...)
    __________________
    Je suis en vacances du 21 au 25 Mai ... bon forum
    encore une p'tite tranchée à creuser? ;O] ;O] ;O]

    vede
    ;O]
    ______________
    ...

  19. #15
    Iks

    Re : Commande de pic par interrupteur.

    Hello, voila les schémas corrigés.

    http://h.imagehost.org/0554/EagleSchematics.jpg

    http://h.imagehost.org/0946/EagleBoard.jpg

    J'ai mis un condo de 0.1µF en découplage.

    En fait il semble y'avoir un léger mieux, les servos font moins de soubresauts bizarres. Seuls les servos de moins bonnes qualités (des vieux carson et un futaba) font encore un peu des trucs bizarre mais sinon c'est mieux.

    Si vous avez une autre idée je suis preneur, sinon même si c'est pas parfait ca peut suffir.

    Seulement je vais peut être prendre une alim de 1A parce que la mienne chauffe pas mal au bout d'un moment.

    Merci.

  20. #16
    vede

    Cool Re : Commande de pic par interrupteur.

    Hello,

    jsuis pas un spécialiste des moteurs, mais tu peux
    tenter en rajoutant des condos de différentes
    valeurs en // avec le 0.1uF (exemple 0.01uF // 1uF // 100uf //)...
    et même des petits (pF) aux bornes des moteurs...
    ça fait filtre...

    car ça ressemble à des "oscillations" parasites...

    vede
    ;O]
    ___________
    ...

Discussions similaires

  1. 'interrupteur' 12v commandé par 3.3v
    Par matt276 dans le forum Électronique
    Réponses: 12
    Dernier message: 11/05/2009, 16h39
  2. commande interrupteur par PC
    Par Tymk dans le forum Électronique
    Réponses: 3
    Dernier message: 22/03/2009, 18h00
  3. Interrupteur commandé par un PIC
    Par guk92 dans le forum Électronique
    Réponses: 4
    Dernier message: 10/04/2008, 11h42
  4. Interrupteur commandé par un courant...
    Par benjdev dans le forum Électronique
    Réponses: 1
    Dernier message: 31/10/2006, 20h59
  5. Interrupteur commandé par PC
    Par jdbaranger dans le forum Électronique
    Réponses: 1
    Dernier message: 26/04/2004, 14h00
Découvrez nos comparatifs produits sur l'informatique et les technologies.