Capteur analogique Pic 16f88
Répondre à la discussion
Affichage des résultats 1 à 18 sur 18

Capteur analogique Pic 16f88



  1. #1
    invite6d844b84

    Capteur analogique Pic 16f88


    ------

    Plop,
    Je bosse sur un TPE dont l'oral est jeudi. J'utilise un pic 16f88 programmé en C avec le compilateur "microship PICmicro C compiler" (j'utilise l'IDE "pcw C Compiler IDE"). Mon programme marche parfaitement lorsqu'il s'agit des capteurs logiques, mais il me reste un point sur lequel je bloque tout le temps : le capteur de distance qui renvoie une fréquence directement lié à la distance.

    J'ai longuement cherché des témoignages comme le mien, mais je suis seulement tombé sur des sujets qui causait ASM ou un compilateur différent du mien.

    Dans mon programme, j'inclus les lignes suivantes pour configurer la conversion analogique d'entré sur le port A0 :
    Code:
       setup_adc_ports( PIN_A0 );          //Sélection du port A0 en analogique
       setup_adc( ADC_CLOCK_INTERNAL );    //Configuration de la fréquence en fonction de l'horloge interne
       set_adc_channel( 0 );               //Sélection du canal à convertir (ici A0)
    Puis pour convertir :
    Code:
    capteur_distance = read_adc();      //Conversion sur capteur_distance du port A0 dans la variable capteur_distance
    Ensuite j'utilise les valeur du graphique se trouvant à la deuxième page de ce PDF : lien (en rouge pour le 2d120X qui est mon capteur).

    Et je n'ai tout simplement aucune réponse de mon capteur. Tout est bien branché, dès fois le capteur réagit, mais c'est très aléatoire. Je me demande donc si quelqu'un a déjà réussi à faire fonctionner ce capteur avec ce Pic, ou si quelqu'un aurait un code qui pourrait m'aider pour ce compilateur.

    PS : désolé si ce n'est pas très compréhensible, c'est surement la fatigue...

    -----

  2. #2
    invite6d844b84

    Re : Capteur analogique Pic 16f88

    up...

  3. #3
    thundertom

    Re : Capteur analogique Pic 16f88

    Salut,

    donnes un lien vers la doc de ton capteur. Mais à première vue si ton capteur te renvoie une fréquence liée à la distance, c'est pas sur une entrée analogique que tu devras rentré dans ton PIC.
    Fabricando fit faber

  4. #4
    invitedb9b1ced

    Re : Capteur analogique Pic 16f88

    Salut,

    le capteur de distance qui renvoie une fréquence directement lié à la distance.
    Tu es sûr que c'est une fréquence ?!

    Ensuite j'utilise les valeur du graphique se trouvant à la deuxième page de ce PDF : lien (en rouge pour le 2d120X qui est mon capteur).
    Utilises plutôt la datasheet de ton composant, ce sera plus adéquate pour visualiser une courbe.

    Et je n'ai tout simplement aucune réponse de mon capteur. Tout est bien branché, dès fois le capteur réagit, mais c'est très aléatoire. Je me demande donc si quelqu'un a déjà réussi à faire fonctionner ce capteur avec ce Pic, ou si quelqu'un aurait un code qui pourrait m'aider pour ce compilateur.
    Avant de vouloir coder ton µC, fais fonctionner ton capteur tout seul. Tu le câbles et mesures la sortie tout en approchant un objet (noir de préférence) et tu regardes si, selon la distance, la tension en sortie correspondant à la courbe théorique. De là tu pourras savoir si ton capteur fonctionne ou non. S'il est défectueux, rien ne sert d'aller plus loin : il faut le changer.

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

    Re : Capteur analogique Pic 16f88

    Citation Envoyé par kindermoumoute Voir le message
    l je bloque tout le temps : le capteur de distance qui renvoie une fréquence directement lié à la distance.
    Bjr à toi,
    Quel domaine de fréquence ?
    Capture de DISTANCE entre quoi et quoi ?

    A+

  7. #6
    invite6d844b84

    Re : Capteur analogique Pic 16f88

    Pour vous répondre à tous en même temps : la data sheet de mon capteur.

  8. #7
    invite6d844b84

    Re : Capteur analogique Pic 16f88


  9. #8
    invitedb9b1ced

    Re : Capteur analogique Pic 16f88

    Pour vous répondre à tous en même temps : la data sheet de mon capteur.
    Tiens, la sortie est en tension... Fais un test du capteur à nu, sans µC, tu verras s'il fonctionne bien ou non.

    Et la data sheet de mon compilateur C.
    Ton lien ne renvoi vers rien.

  10. #9
    invite6d844b84

    Re : Capteur analogique Pic 16f88

    Comment faire un test à nu ? Je met 5 volts de chaque coté, et je relève la tension ?

    Et là ce lien marche ?

  11. #10
    invitedb9b1ced

    Re : Capteur analogique Pic 16f88

    Citation Envoyé par kindermoumoute Voir le message
    Comment faire un test à nu ? Je met 5 volts de chaque coté, et je relève la tension ?
    5V sur VCC, ta masse sur le GND, une petite capa' de découplage des fois que, puis tu relèves ta tension sur Vo en fonction de la distance entre ton capteur et l'objet. Tu devrais avoir quelques chose en rapport avec la courbe théorique, sinon c'est que ton capteur a un problème.

    Yes.

  12. #11
    invite6d844b84

    Re : Capteur analogique Pic 16f88

    Citation Envoyé par amoniaque Voir le message
    Tu devrais avoir quelques chose en rapport avec la courbe théorique, sinon c'est que ton capteur a un problème.
    Bon.. je crois que le problème est clair.. quelqu'un s'y connaîtrait en SHARPS 2d120x ?

  13. #12
    Qristoff
    Animateur Électronique

    Re : Capteur analogique Pic 16f88

    Salut,
    ici quelques explications et un moyen simple de linéariser la sortie du capteur.
    http://www.acroname.com/robotics/inf.../irlinear.html
    Tout existe, il suffit de le trouver...!

  14. #13
    invite6d844b84

    Re : Capteur analogique Pic 16f88

    J'ai déjà vu un document du même type : ici. Mais si cela vient du capteur je ne vois pas à quoi cela peut me servir. (dailleur, je ne vois pas à quoi ça sert en général de linéariser la sortie...

  15. #14
    invitedb9b1ced

    Re : Capteur analogique Pic 16f88

    Citation Envoyé par kindermoumoute Voir le message
    Bon.. je crois que le problème est clair.. quelqu'un s'y connaîtrait en SHARPS 2d120x ?
    Hello,

    J'ai déjà utilisé du GP2D15 et ça fonctionnait très bien. Il y a une légère dérive entre la théorie et la pratique lorsque la couleur de l'objet devant le capteur est très claire. Mais rien de bien méchant, la courbe a sensiblement la même forme.

    Tu obtiens quoi comme résultats avec un objet de couleur noire ?

  16. #15
    invite29971eb1

    Re : Capteur analogique Pic 16f88

    Bon l'oral est aujourd'hui,j'arrive trop tard...mais tant pis . Si ton projet t'as intéressé, tu voudras que ça marche, oral passé ou pas

    Tu poses ton capteur à la verticale, alimenté en 5V et un multimètre entre la masse et la sortie.

    Tu mets ta main au dessus et tu la lèves entre 3 et 40 cm de ton capteur. Plus tu t'éloignes, plus la tension doit baisser. La relation n'est pas linéaire, la tension doit varier d'autant plus rapidement que ta main est proche du capteur. Si la tension ne varie pas,ou pas comme il faut, tu peux mettre le capteur à la poubelle, il n'y a rien à y faire.

    Si ça fonctionne, tu le mets sur une entrée ADC, tu fais une conversion tension-distance à partir d'une look-up-table, et roule ma poule

  17. #16
    invite6d844b84

    Re : Capteur analogique Pic 16f88

    Je suis passé aujourd'hui, mais ce que je ne vous ai pas dit c'est que j'ai deux orales (à cause de la réforme des lycée), le deuxième est après les vacances et j'ai intérêt d'être au top.
    @amoniaque : aurais tu un source en C (ou même n'importe quel autre langage) que je puisse me mettre sous la main ? (juste pour regarder)

    Et pour revenir à ce qui a été dit plus haut, c'est bien une tension et non une fréquence (ils me l'ont gentiment fait remarqué à l'orale :'( ). J'ai récupéré un deuxième capteur, et il marchait dans les test. Il ne reste plus qu'à le faire fonctionner dans le programme. Malheureusement j'ai laissé le matériel au lycée.


    EDIT : pour les intéressés, le code source :
    Code:
    //***************************************************************
    //							Projet 421						                 |
    //TPE réalisé par le groupe 4									           |
    //Début de la programmation : 03/02/2011						        |
    //Fin de la programmation : XX/XX/2011							        |
    //															             	     |
    //																                 |
    //																                 |
    //																                 |
    //																                 |
    //Sorties :														              |
    //RB6 : servomoteur tourelle.									           |
    //RB7 : servomoteur lanceur de dés.									     |
    //																                 |
    //RB0 : mise en marche moteur 1.								           |
    //RB1 :	avancer/reculer moteur 1.	*à définir					     |
    //RB2 :	avancer/reculer moteur 1.	*à définir					     |
    //RB3 :	avancer/reculer moteur 2.	*à définir					     |
    //RB4 :	avancer/reculer moteur 2.	*à définir					     |
    //RB5 :	mise en marche moteur 2.								        |
    //																                 |
    //																                 |
    //Entrées :														              |
    //RA1 : capteur surface de jeu.									        |
    //RA0 :	capteur distanec 10 cm.									        |
    //																                 |
    //																                 |
    //																                 |
    //																                 |
    //																                 |
    //																                 |
    //																                 |
    //***************************************************************
    
    
    #include <16F88.h>				//bibliothèque du pic 16F88
    #device *=16 ADC=10           //Configuration de convertisseur en 10bits (soit un nombre entre 0 et 1023)
    
    #fuses HS,NOLVP,NOWDT,NOPROTECT    //Convention pour les pics
    #use delay (clock=4000000)         //Réglage de l'horloge interne à 4MHz
    
    unsigned char i;				   //Variable des boucles for
    
    int capteur_distance;         //Variable de la distance du capteur de distance, après conversion
    
    void moteurDroitAvant();
    void moteurDroitArriere();
    void moteurDroitStop();
    void moteurGaucheAvant();
    void moteurGaucheArriere();
    void moteurGaucheStop();
    void Avancer();
    void Reculer();
    void Arret();
    void Tourner_droite();
    void Tourner_gauche();
    void Tourner_tourelle_droit();
    void Tourner_tourelle_gauche();
    void init_pic();
    void Changer_direction();
    void Lancer_des();
    
    
    void moteurDroitAvant()                                                       //On avance le moteur droit
    {
    	output_bit( PIN_B1, 0); output_bit( PIN_B2, 1);      //Sortie : 0->B1 ; 1->B2
    }
    void moteurDroitArriere()                                                     //On recule le moteur droit
    {
    
    	output_bit( PIN_B1, 1); output_bit( PIN_B2, 0);      //Sortie : 1->B1 ; 0->B2
    }
    void moteurDroitStop()                                                        //On arrête le moteur droit
    {
    	output_bit( PIN_B1, 0); output_bit( PIN_B2, 0);      //Sortie : 0->B1 ; 0->B2
    }
    
    void moteurGaucheAvant()                                                      //On avance le moteur gauche
    {
    	output_bit( PIN_B3, 0); output_bit( PIN_B4, 1);      //Sortie : 0->B3 ; 1->B4
    }
    void moteurGaucheArriere()                                                    //On recule le moteur gauche
    {
    	output_bit( PIN_B3, 1); output_bit( PIN_B4, 0);      //Sortie : 1->B3 ; 0->B4
    }
    void moteurGaucheStop()                                                       //On arrête le moteur gauche
    {
    	output_bit( PIN_B3, 0); output_bit( PIN_B4, 0);      //Sortie : 0->B3 ; 0->B4
    }
    
    
    void Avancer()                                                                //On avance le robot
    {
    moteurDroitAvant();        //Les deux moteurs en avant
    moteurGaucheAvant();
    }
    void Reculer()                                                                //On recule le robot
    {
    moteurDroitArriere();      //Les deux moteurs en arrière
    moteurGaucheArriere();
    }
    void Arret()                                                                  //On arrête le robot
    {
    moteurDroitStop();         //Les deux moteurs se stopent
    moteurGaucheStop();
    }
    
    
    void Tourner_droite()		                                       //Le robot Tourne à droite
    {
       moteurDroitStop();      //Seule la roue gauche entraîne le robot à droite
          Delay_ms(1000);
    }
    
    
    
    void Tourner_gauche()	                                         //La robot tourne à gauche
    {
    		moteurGaucheStop();   //Seule la roue gauche entraîne le robot à droite
              Delay_ms(1000);
    }
    
    
    
     void Tourner_tourelle_droit()	                                //Tourne la tourelle de 90° vers la droite
    {
    	for (i=0; i<10; i++)		           //Boucle: Boucle 10 fois
    	{
    		output_bit( PIN_B6, 1);			  //Sortie: 1 -> B6
    		Delay_ms(2);			           //Pause: 2 ms
    		output_bit( PIN_B6, 0);			  //Sortie: 0 -> B6
    		Delay_ms(18);			           //Pause: 18 ms
    	}
    }
    
    
    void Tourner_tourelle_gauche()	                                 //Tourne la tourelle de 90° vers la gauche
    {
    
    	for (i=0; i<10; i++)		           //Boucle: Boucle 10 fois
    	{
    		output_bit( PIN_B6, 1);			  //Sortie: 1 -> B6
    		Delay_ms(1);			           //Pause: 1 ms
    		output_bit( PIN_B6, 0);		     //Sortie: 0 -> B6
    		Delay_ms(19);			           //Pause: 19 ms
    	}
    }
    
    
    void init_pic()			                                          //processus d'initialisation du pic
    {
    	SET_TRIS_A(3);		        //Configuration des entrées et sorties pour le port A (1 pour une entrée, et 0 pour une sortie)
    	SET_TRIS_B(0);	           //Configuration des entrées et sorties pour le port B
       output_a (0);
       output_b (0b100001);      //Mise en marche aucun mouvement sur le roues
    
       setup_adc_ports( PIN_A0 );          //Sélection du port A0 en analogique
       setup_adc( ADC_CLOCK_INTERNAL );    //Configuration de la fréquence en fonction de l'horloge interne
       set_adc_channel( 0 );               //Sélection du canal à convertir (ici 0)
       capteur_distance = read_adc();      //Conversion sur capteur_distance du port A0 dans la variable capteur_distance
    }
    
    
    void Changer_direction()                                         //Change de direction, même dans une impasse
    {
    	do
    	{
    		Tourner_tourelle_droit();        //On regarde à droite
    		capteur_distance = read_adc();
          Avancer();
    		if(capteur_distance>250)       //Si il y a un obtacle à droite
    		{
    			Tourner_gauche();
    		}                                //on tourne à gauche
    		else
    		{
    			Tourner_droite();             //ou sinon on tourne à droite
    		}
          Arret();
    		Tourner_tourelle_gauche();       //On replace la tourelle
    		capteur_distance = read_adc();
    	}while (capteur_distance>250);	   //Tant que l'on repère un obstacle
    }
    
    
    void Lancer_des()
    {
    	for (i=0; i<20; i++)		             //Boucle: Boucle 20 fois
    	{
    		output_bit( PIN_B7, 1);				//Sortie: 1-> B7__
    		Delay_ms(2);			            //Pause: 2 ms
    		output_bit( PIN_B7, 0);			   //Sortie: 0 -> B7
    		Delay_ms(18);			            //Pause: 18 ms
    	}
    	for (i=0; i<20; i++)		            //Boucle: Boucle 20 fois
    	{
    		output_bit( PIN_B7, 1);				//Sortie: 1-> B7
    		Delay_ms(1);			            //Pause: 1 ms
    		output_bit( PIN_B7, 0);			   //Sortie: 0 -> B7
    		Delay_ms(19);			            //Pause: 19 ms
    	}
    }
    
    
    
    
    void main(void)					         //Programme principale
    {
    	init_pic();					            //On initialise le PIC
    	while(1)					            //On répète notre programme tout le temps
    	{
    
    		capteur_distance = read_adc();
    		If (capteur_distance>250)	   //Si un obstacle est à 10cm, on change de direction
    		{
    			Changer_direction();
    		}
    		else						            //Sinon, si il n'y a pas 10cm
    		{
    			if( input(PIN_A1) )	         //et que l'on capte la pastille du terrain de jeu
    			{
    				Arret();
    				Lancer_des();	           	//on lance les dés
    			}
    		}
    		Avancer();				            //Quand rien n'est capté, on avance le robot
    
    
    	}
    }

  18. #17
    Qristoff
    Animateur Électronique

    Re : Capteur analogique Pic 16f88

    Avant d'attaquer le code, il faut savoir si le capteur fonctionne et d'après toutes tes explications trés confuses, on ne peut rien en tirer. Donc commence par tester ton capteur dans les bonnes conditions ! et dit nous s'il fonctionne !
    Tout existe, il suffit de le trouver...!

  19. #18
    invite6d844b84

    Re : Capteur analogique Pic 16f88

    Citation Envoyé par kindermoumoute Voir le message
    J'ai récupéré un deuxième capteur, et il marchait dans les test. Il ne reste plus qu'à le faire fonctionner dans le programme.
    En gros j'ai alimenté le capteur en 5V, puis j'ai relevé la tension entre la masse et la sortie analogique. Et il variait bien en fonction de la distance.

Discussions similaires

  1. pic 16F88
    Par invitef9ed8fd4 dans le forum Électronique
    Réponses: 9
    Dernier message: 01/03/2011, 20h30
  2. programmer le pic 16F88
    Par coeur noire dans le forum Électronique
    Réponses: 46
    Dernier message: 05/05/2010, 17h40
  3. pic 16f88 et SPI
    Par invite7973ef56 dans le forum Électronique
    Réponses: 21
    Dernier message: 17/07/2009, 08h14
  4. Pic 16f88
    Par invite61c07ffe dans le forum Électronique
    Réponses: 6
    Dernier message: 26/04/2009, 22h36
  5. MCP9700 ( capteur de T°C analogique ) + pic
    Par Toufinet dans le forum Électronique
    Réponses: 8
    Dernier message: 30/10/2007, 19h23
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...