IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Raspberry Pi Discussion :

Acquisition de données analogiques sur Raspberry Pi 2


Sujet :

Raspberry Pi

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 16
    Points : 7
    Points
    7
    Par défaut Acquisition de données analogiques sur Raspberry Pi 2
    Bonjour,

    Je suis actuellement sur un projet qui met en œuvre un*CAN (convertisseur analogique numérique)*MCP3208 et une carte Raspberry Pi 2. Pour ce projet il me faut récupérer une tension aux bornes du CAN sur ma Raspberry et à terme stocker ces valeurs dans un fichier. Pour l'instant j'ai mis en œuvre ce code qui est sensé renvoyer dans une consoles les valeurs de la tension. Cependant, lorsque je lance l'exécutable créé une console s'ouvre et se referme aussitôt sans me renvoyer de valeurs... Si cela vous inspire quoi que ce soit n'hésitez pas à m'en faire part.

    Merci d'avance,
    Tom.

    Mon code principal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    #include <stdio.h>
    #include <wiringPi.h>
    #include <wiringPiSPI.h>
    #include <stdint.h>
    #include <fcntl.h>
    #include <sys/ioctl.h>
    #include <linux/spi/spidev.h>
    
    #include "mcp3208.h"
    
    #define	SPI_SPEED	1000000
    
    #define	channel1	1
    
    float resultat = 0;
    
    int main (void)
    {
    	if(wiringPiSetup ()<0)
    		printf("erreur wiringPi\n");
    
    	if(wiringPiSPISetup (channel1, SPI_SPEED)<0)		//initialisation du SPI sur le "channel0" et a 1MHz
    		printf("erreur wiringPi SPI\n");
    
    
    	while(1){
    		resultat = (float)conversion_mcp3208(channel1, voie_1);
    		resultat = resultat * 5 / 4096;
    		system("clear");
    		printf("tension = %5.3f V\n",résultat);
    		delay(100);
    	}
    	return 0 ;
    
    }

    Et le code de mcp3208.h :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    /* MCP3208.h
    ** Controle un MCP3208 avec la librairie wiringPi sur Raspberry Pi */
    
    #define voie_1	0
    #define voie_2	1
    #define voie_3	2
    #define voie_4	3
    #define voie_5	4
    #define voie_6	5
    #define voie_7	6
    #define voie_8	7
    
    int conversion_mcp3208(uint8_t adc, uint8_t num_voie);
    
    int conversion_mcp3208(uint8_t adc, uint8_t num_voie){
    	int conversion = 0, configuration = 0;
    	unsigned char spiData[3] ;
    
    	configuration = (num_voie<<6)|0x0600;			// configuration du mumero de voie & bit de start et single mode Ã* 1 (voir documentation MCP3208)
    	spiData[0] = configuration>>8;				// les 8 bits de msb de configuration sont ranges dans spiData[0]
    	spiData[1] = configuration;				// les 8 bits de lsb de configuration sont ranges dans spiData[1]
    	spiData[2] = 0x00;					// spiData[2] permet juste de generer la clock pour recuperer le resultat de conversion
    	wiringPiSPIDataRW (adc, spiData, 3); 			// envoi des trois octets via le spi
    	conversion = (int)(((spiData[1]&0x0F)<<8)|spiData[2]);	// masquage et mise en forme du resultat de conversion (0 a FFF)
    	return conversion;
    
    }

  2. #2
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Comment ça une console s'ouvre ? Tu n'invoques pas ton programme depuis un terminal ?

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Tout d'abord merci pour ta réponse rapide !
    Non j'ai créé un executable avec la commande "gcc nom_du_programme.c -lwiringPi -o nom_executable" et après je le lance graphiquement depuis le gestionnaire de fichier.

  4. #4
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Oui alors non, ton programme est un exécutable console donc on va commencer par l'invoquer via la ligne de commande et on y verra sans doute plus clair.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ~$ cd my_dev_dir
    ~/my_dev_dir$ gcc my_prog.c -lwiringPi -o my_prog
    ~/my_dev_dir$ ./my_prog

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    J'ai rajouté des balises pour que ton code s'affiche correctement, il s'agit des balises [CODE](ici, mettre son code ^^)[/CODE]. Pense à les utiliser à l'avenir !

    C'est quoi ces étoiles dans le code ? C'est quoi cette fonction dans un .h ? Des if() sans accolades, il faut se méfier : tu ne veux faire que le printf() si le test est vrai ?

    Ton ADC (Analog to Digital Converter, mieux faut utiliser la version anglaise car le terme français de CAN entre en conflit avec le bus CAN) est interrogé en SPI ?

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Finalement j'ai résolu une partie du problème liée à l'ouverture du programme (c'était un problème d'autorisations...) je l'ouvre maintenant avec la commande ./ en superuser.
    Cependant le programme n'affiche tout le temps 0V... J'ai essayer le programme python suivant afin d'exclure une éventuelle erreur du MPC3208 ou de la liaison SPI.
    Ce dernier étant fonctionnel je me dis que j'ai faire une erreur au sein de mon programme en C. Si vous avez une idée à ce propos...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    
    import spidev
    import time
     
    spi = spidev.SpiDev()
    spi.open(0, 0)
     
    def readadc(adcnum):
    # lit la valeur des entres entre 1 et 8
        if adcnum > 7 or adcnum < 0:
            return -1
        r = spi.xfer2([1, 8 + adcnum << 4, 0])
        adcout = ((r[1] & 3) << 8) + r[2]
        return adcout
     
    while True:
        value1 = readadc(0)
        volts1 = (value1 * 3.3) / 1024
        print "1 :",value1, volts1
        time.sleep(0.5)
    Citation Envoyé par Bktero Voir le message
    J'ai rajouté des balises pour que ton code s'affiche correctement, il s'agit des balises [CODE](ici, mettre son code ^^)[/CODE]. Pense à les utiliser à l'avenir !

    C'est quoi ces étoiles dans le code ? C'est quoi cette fonction dans un .h ? Des if() sans accolades, il faut se méfier : tu ne veux faire que le printf() si le test est vrai ?

    Ton ADC (Analog to Digital Converter, mieux faut utiliser la version anglaise car le terme français de CAN entre en conflit avec le bus CAN) est interrogé en SPI ?
    Merci pour l'astuce !
    En fait je me suis trompé de code les étoiles et le getchar() n'ont aucun intérêt
    Le .h sert à définir les caractéristiques du MCP3208 qui n'est pas référencé dans la librairie WiringPi
    Bah pour le if je ne sais pas trop...
    Comment ça "Ton ADC est interrogé en SPI ?"

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 16
    Points : 7
    Points
    7
    Par défaut Résolu !
    C'est bon j'ai trouvé une solution je me suis inspiré d'un autre code qui fait de boulot

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    #include <stdio.h>
    #include <string.h>
    #include <errno.h>
    #include <stdlib.h>
    
    #include <wiringPi.h>
    #include <wiringPiSPI.h>
    
    #define CS_MCP3208  8       // BCM_GPIO8
    
    #define SPI_CHANNEL 0
    #define SPI_SPEED   100000
    
    
    int read_mcp3208_adc(unsigned char adcChannel)
    {
        unsigned char buff[3];
        int adcValue = 0;
        
        buff[0] = 0x06 | ((adcChannel & 0x07) >> 7);
        buff[1] = ((adcChannel & 0x07) << 6);
        buff[2] = 0x00;
        
        digitalWrite(CS_MCP3208, 0);  // Low : CS Active
        
        wiringPiSPIDataRW(SPI_CHANNEL, buff, 3);
        
        buff[1] = 0x0F & buff[1];
        adcValue = ( buff[1] << 8) | buff[2];
        
        digitalWrite(CS_MCP3208, 1);  // High : CS Inactive
        
        return adcValue;
    }
    
    
    int main (void)
    {
        int adc1Channel = 0;
        int adc1Value   = 0;
        
        if(wiringPiSetup() == -1)
        {
            fprintf (stdout, "Unable to start wiringPi: %s\n", strerror(errno));
            return 1 ;
        }
        
        if(wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1)
        {
            fprintf (stdout, "wiringPiSPISetup Failed: %s\n", strerror(errno));
            return 1 ;
        }
        
        pinMode(CS_MCP3208, OUTPUT);
        
        while(1)
        {
            //system("clear");
            adc1Value = read_mcp3208_adc(adc1Channel);
            printf("adc0 Value = %04u", adc1Value);
            printf("\tVoltage = %.3f\n", ((3.3/4096) * adc1Value));
            usleep(1000);
        }
        return 0;
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. acquisition de données sur port ethernet et GUI
    Par mbuemow dans le forum Général Conception Web
    Réponses: 1
    Dernier message: 19/04/2011, 13h40
  2. Acquisition de données sur carte "addi-data"
    Par semvarde dans le forum LabVIEW
    Réponses: 1
    Dernier message: 02/06/2010, 13h32
  3. [RS232] Procédure d'acquisition de données sur port serie
    Par kazaboua dans le forum Composants
    Réponses: 6
    Dernier message: 12/05/2007, 11h55
  4. acquisition des données sur port ethernet
    Par HELPME42 dans le forum Développement
    Réponses: 3
    Dernier message: 25/05/2006, 15h48
  5. Acquisition de données sur un port RS232
    Par Techbio dans le forum C
    Réponses: 13
    Dernier message: 30/01/2006, 15h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo