Envoyer la valeur d'un potentiomètre par Xbee
Répondre à la discussion
Affichage des résultats 1 à 9 sur 9

Envoyer la valeur d'un potentiomètre par Xbee



  1. #1
    Cotton

    Envoyer la valeur d'un potentiomètre par Xbee


    ------

    Bonjour,

    J'ai deux cartes. L'une est une carte Arduino et l'autre une carte électronique munie d'un PIC16F876 et d'un afficheur LCD. Les deux cartes communiquent par l'intermédiaire de deux modules XBee.

    La carte PIC est programmée pour réceptionner des informations issues du module Xbee et les afficher sur l'écran LCD. Le programme est disponible ci-dessous.

    Code:
    #include<pic16f876.h>
    #include <xc.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    #pragma config FOSC = XT        // Oscillator Selection bits (XT oscillator)
    #pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
    #pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
    #pragma config CP = OFF         // FLASH Program Memory Code Protection bits (Code protection off)
    #pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
    #pragma config LVP = OFF        // Low Voltage In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
    #pragma config CPD = OFF        // Data EE Memory Code Protection (Code Protection off)
    #pragma config WRT = ON         // FLASH Program Memory Write Enable (Unprotected program memory may be written to by EECON control)
    
    #define  _XTAL_FREQ 4000000
    #define  RS PORTCbits.RC1
    #define  EN PORTCbits.RC0
    #define  LED PORTAbits.RA0
    
    // RB7 -> D7 //Connectiques entre PIC et LCD
    // RB6 -> D6 //Connectiques entre PIC et LCD
    // RB5 -> D5 //Connectiques entre PIC et LCD
    // RB4 -> D4 //Connectiques entre PIC et LCD
    
    // INITIALISATION ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    void LCD_Init();
    void LCD_Cmde(unsigned char cmde);
    void LCD_data(unsigned char data);
    void LCD_goto(char position);
    
    char var1;
    char var2;
    char var3;
    int variable;
    
    void main(void) //PROGRAMME PRINCIPAL
    {
        //INITIALISATION ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
        TRISA = 0b00000000;
        ADCON1 = 0b00000110;
        TRISB = 0b11000000;
        TRISC = 0b11000000;
    
        TXSTA = 0b00000110;
        RCSTA = 0b10010000;
        SPBRG = 25;
        
        PIE1 = 0b00100000;
    
        PORTA = 0;
        PORTB = 0;
        RCREG = 0x00;
    
        //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
        LCD_Init(); //Initialisation LCD
    
        LCD_goto(0x03); //Décale le curseur ligne 1, position 3
    
        LCD_data('P');
        LCD_data('r');
        LCD_data('o');
        LCD_data('j');
        LCD_data('e');
        LCD_data('t');
        LCD_data(' ');
        LCD_data('B');
        LCD_data('T');
        LCD_data('S');
    
        LCD_goto(0x43); //Décale le curseur ligne 2, position 0
    
        LCD_data('G');
        LCD_data('i');
        LCD_data('g');
        LCD_data('a');
        LCD_data(' ');
        LCD_data('P');
        LCD_data('i');
        LCD_data('x');
        LCD_data('e');
        LCD_data('l');
    
        __delay_ms(3000);
    
        LCD_Cmde(0x01); //Efface LCD
    
        LCD_data('V');
        LCD_data('i');
        LCD_data('t');
        LCD_data('e');
        LCD_data('s');
        LCD_data('s');
        LCD_data('e');
        LCD_data(':');
    
        while (1)
        {
            if (RCIF == 1)
            {
                LED = !LED;
                variable = RCREG; //Contenu de RCREG stocké dans variable
            }
             
            var1 = variable/100;
     	    var2 = (variable%100)/10;
     	    var3 = variable%10;
    
     	    LCD_data(var1+'0'); //Ecrire les centaines sur LCD
            __delay_us(100);
     	    LCD_data(var2+'0'); //Ecrire les dizianes sur LCD
            __delay_us(100);
            LCD_data(var3+'0'); //Ecrire les unités sur LCD
            __delay_us(100);
            LCD_goto(0x08); //Décale le curseur ligne 1, position 8
            __delay_us(100);
        }
    }
    
    void LCD_Init (void) //FONCTION D'INITIALISATION LCD ~~~~~~~~~~~~~~~~~~~~~~~~~~~
    {
        __delay_ms(15);
        LCD_Cmde(0b00110000); //En mode 8 bits
        __delay_ms(5);
        LCD_Cmde(0b00110000); //En mode 8 bits
        __delay_ms(5);
        LCD_Cmde(0b00110010); //En mode 8 bits
        __delay_us(100);
        LCD_Cmde(0x28); //En mode 4 bits / 2 lignes
        __delay_us(100);
        LCD_Cmde(0x28);
        __delay_us(100);
        LCD_Cmde(0x0C); //Display ON/OFF / Cursor off
        __delay_us(100);
        LCD_Cmde(0x01); //Efface LCD
        __delay_us(100);
    }
    
    void LCD_Cmde(char cmde) //FONCTION ENVOI D'UNE COMMANDE LCD ~~~~~~~~~~~~~~~~~~~
    {
        RS = 0; //Ecrire une commande
        PORTB = cmde>>4; //Envoi des 4 bits de poids forts MSB
        __delay_ms(1);
        EN = 1;
        __delay_ms(1);
        EN = 0;
        PORTB = cmde; //Envoi des 4 bits de poids faible LSB
         __delay_ms(1);
        EN = 1;
        __delay_ms(1);
        EN = 0;
    }
    
    void LCD_data(unsigned char data) //ENVOI D'UNE DONNEE LCD ~~~~~~~~~~~~~~~~~~~~~
    {
        RS = 1; //Ecrire une donnée
        PORTB = data>>4; //Envoi des 4 bits de poids forts MSB
        __delay_ms(1);
        EN = 1;
        __delay_ms(1);
        EN = 0;
        PORTB = data; //Envoi des 4 bits de poids faible LSB
         __delay_ms(1);
        EN = 1;
        __delay_ms(1);
        EN = 0;
    }
    
    void LCD_goto(char position) //FONCTION POSITION CURSEUR LCD ~~~~~~~~~~~~~~~~~~~
    {
        RS = 0; //Ecrire une commande
        PORTB = (0x80+position)>>4; //0x80 = Ecrire dans la DDRAM / position curseur
        __delay_ms(1);
        EN = 1;
        __delay_ms(1);
        EN = 0;
        PORTB = (0x80+position); //0x80 = Ecrire dans la DDRAM / position curseur
         __delay_ms(1);
        EN = 1;
        __delay_ms(1);
        EN = 0;
    }
    La carte Arduino est programmée pour envoyer des informations grâce au module Xbee.

    Si j'envoie 'A' et 'B' depuis la carte Arduino vers la carte PIC, les nombres 65 et 66 s'affichent sur l'écran.

    Code:
    void setup
    {
       Serial.begin(9600);
    }
    
    voi loop
    {
       Serial.print('A');
       delay(1000);
       Serial.print('B');
       delay(1000);
    }
    Dans ce cas, tout fonctionne bien.




    Je cherche maintenant à numériser la tension issue d'un potentiomètre sur la carte Arduino puis l'envoyer à la carte PIC pour l'afficheur en temps réel sur l'écran.
    Code:
    int POT = A3;
    int val = 0;
    
    void setup()////////////////////////////////////
    {
      Serial.begin (9600);
    }
    
    void loop() 
    {
      val = analogRead (POT); 
      Serial.print(val);
      delay(1000);
    }
    Néanmoins, cela ne marche pas. Je reçois qu'une seule donnée puis plus rien. Sur la carte PIC, il y a une LED (sur RA0) qui change d'état à la réception d'un octet. Avec cette nouvelle programmation de la carte Arduino, la LED ne veut plus clignoter.


    Pouvez vous m'aiguiller ?

    Je vous remercie,

    Cordialement,

    Cotton.

    -----

  2. #2
    vincent66

    Re : Envoyer la valeur d'un potentiomètre par Xbee

    Hello,
    Pas de bol, drillé comme je l'ai été sur des langages de programmation bien ficelés comme pascal ou modula2 je fais une crise d'urticaire chaque foi que je vois "void" dans un programme...

    Mais es-tu sur que la led ne clignote pas..? Elle pourrait le faire trop vite pour que ce soit perceptible à l'oeil...
    Leonardo était ingénieur "sans papier", et moi diplômé juste...technicien...

  3. #3
    Cotton

    Re : Envoyer la valeur d'un potentiomètre par Xbee

    Merci de votre réponse,

    Je n'ai pas eu le temps de regarder le signal de sortie sur RA0 mais, à l’œil, j ne vois pas de clignotement.

    Mais "vrai" problème est d'avantage tourné vers le fait que je n'ai pas, dans le deuxième code, une réponse satisfaisante sur l'écran.

    Je ne retrouve pas les valeurs du potentiomètre sur mon écran.

  4. #4
    Yoruk

    Re : Envoyer la valeur d'un potentiomètre par Xbee

    Le code semble cohérent...

    Comment est branché ton potentiomètre ?

    La valeur retournée par l'ADC de l'arduino varie entre 0 et 1023. C'est bon pour toi ?
    La robotique, c'est fantastique !

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

    Re : Envoyer la valeur d'un potentiomètre par Xbee

    bonjour,


    Code:
      val = analogRead (POT); 
      Serial.print(val);

    il faut convertir val en ascii avant d el'nevoyer sur le port serie...

    Code:
    char txt[16];
    itoa(val,txt)
    Serial.print(txt);

  7. #6
    fdamien12

    Re : Envoyer la valeur d'un potentiomètre par Xbee

    Il me semble qu'un module XBEE est capable tout seul de faire une acquisition analogique et de l'envoyer... Tu n'aurais peut être même pas besoin de l'arduino !

  8. #7
    Cotton

    Re : Envoyer la valeur d'un potentiomètre par Xbee

    Bonjour,

    Merci de vos réponses.


    @paulfjujo Ce peut-il vraiment que le fait d'envoyer une valeur décimale (issue de la conversion analogique numérique), sans être au préalable changée en ASCII, peut engendrer ce genre de soucis ?

    @Yoruk J'ai essayé de diviser le résultat de la conversion par 4 pour avoir une valeur comprise entre 0 et 255 (un octet) mais cela ne marche pas plus.

    @Blue Sn4ke Je ne s'avais pas que le module Xbee était capable de cela. Mais dans mon cas, il e faut utiliser l'Arduino.


    D'ici à Mardi je ne pourrais pas effectuer de mesurer sur mes cartes. Je me suis penché sur la programmation de mon PIC mais je ne vois pas en quoi il pourrait être "faux".

    Je vous remercie,

    Cordialement,

    Cotton

  9. #8
    Yoruk

    Re : Envoyer la valeur d'un potentiomètre par Xbee

    Citation Envoyé par Cotton Voir le message
    Ce peut-il vraiment que le fait d'envoyer une valeur décimale (issue de la conversion analogique numérique), sans être au préalable changée en ASCII, peut engendrer ce genre de soucis ?
    Non, la valeur issue de la conversion est une valeur entière comprise entre 0 et 1023.

    Citation Envoyé par Cotton Voir le message
    J'ai essayé de diviser le résultat de la conversion par 4 pour avoir une valeur comprise entre 0 et 255 (un octet) mais cela ne marche pas plus.
    donne nous ton schéma de branchement, et le code...?

    Citation Envoyé par Cotton Voir le message
    Je me suis penché sur la programmation de mon PIC mais je ne vois pas en quoi il pourrait être "faux".
    Un PIC ???
    La robotique, c'est fantastique !

  10. #9
    paulfjujo

    Re : Envoyer la valeur d'un potentiomètre par Xbee

    Citation Envoyé par Cotton Voir le message
    Ce peut-il vraiment que le fait d'envoyer une valeur décimale (issue de la conversion analogique numérique),
    sans être au préalable changée en ASCII, peut engendrer ce genre de soucis ?
    ce qui me fait dire cela ,c'est que tu dis que l'envoi de

    Code:
      Serial.print('A');
       delay(1000);
       Serial.print('B');
     delay(1000);
    est OK...
    car envoi en ascii

    pour envoyer la valeur 1023 .. envoyer "1023" chaine de carateres
    ou les caracteres un a un : '1' '0' '2' '3'
    Dernière modification par paulfjujo ; 23/05/2015 à 12h36.

Discussions similaires

  1. Valeur de potentiometre
    Par invitebffa97ca dans le forum Électronique
    Réponses: 2
    Dernier message: 12/10/2012, 14h07
  2. Potentiomètre forte valeur
    Par Ravaner dans le forum Électronique
    Réponses: 7
    Dernier message: 16/11/2011, 15h19
  3. Acquérir une valeur de tension d'un capteur et l'envoyer sur un pc
    Par invite133b9b74 dans le forum Matériel - Hardware
    Réponses: 3
    Dernier message: 10/04/2009, 17h34
  4. Valeur de potentiométre???
    Par jojo86 dans le forum Électronique
    Réponses: 27
    Dernier message: 12/11/2005, 14h56
  5. valeur potentiometre...
    Par invite415585bd dans le forum Électronique
    Réponses: 4
    Dernier message: 27/03/2004, 11h04
Découvrez nos comparatifs produits sur l'informatique et les technologies.