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 :

Utilisation du CAN mcp3202


Sujet :

Raspberry Pi

  1. #1
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    Février 2020
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Février 2020
    Messages : 29
    Points : 11
    Points
    11
    Par défaut Utilisation du CAN mcp3202
    Bonjour a tous
    je profite de mon temps libre , maintenant a la retraite pour m’initier a python et Raspberry.
    Je suis aujourd'hui devant un problème :
    je me sers de l'excellent document de https://deusyss.developpez.com/tutor...Gpio/#LIII-C-5
    pour essayer de mettre en œuvre un CAN mcp3202, pour cela je m'inspire très fortement du listing d'Alexandre Galode, Mais je ne parviens a lire que sur ch0 , quand j'envoie ma tension a lire en ch1 , j'ai toujours 0 V . pour le cablage j'utilise cette carte http://https://www.amazon.fr/gp/prod...?ie=UTF8&psc=1
    Pouvez vous me dire ou je déconne . Merci

    Code python : 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
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    #
    #  test_CAN_2.py
    #  
    #  Copyright 2020  <pi@raspberrypi>
    #  
    # source devellopez.com Raspberry et le port GPIO par Alexandre Galode
    # et https://scruss.com/blog/2013/02/02/simple-adc-with-the-raspberry-pi/
     
    import spidev 
    import time
     
     
    def lire_analog(puce_spi , entree_analog ):#entrée_analog = cho :0  ou ch1 :1
        liaison = spidev.SpiDev(puce_spi ,entree_analog) 
     
        liaison.max_speed_hz = 300000 # en Hertz 
     
        # Initialisation des parametres de lecture
        # (cf datasheet pour les curieux) mcp3202mcp3202
     
        if entree_analog == 0: 
            value = 128 
        else: 
            value = 160 
        to_send = [value, 0] 
        print (value)
        # Lecture 
        rd_octets = liaison.xfer2(to_send) 
     
        # La reponse arrive sur deux octets 
        msb = rd_octets[0] 
     
        lsb = rd_octets[1] 
     
        value = (msb << 8) + lsb 
     
        calcul = 2 * (value * 3.3) / 4096.0 
     
        return calcul 
     
     
     
    while True:
        entree_analog = 1  # 0 pour lire en ch0   pour lire en ch1
        puce_spi = 0
     
        calcul = lire_analog(puce_spi , entree_analog )
     
        print ("{:2.3f}". format(calcul))
     
        time.sleep(2)

  2. #2
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 601
    Points : 56 700
    Points
    56 700
    Billets dans le blog
    40
    Par défaut
    Bonjour,

    Très rapidement, ce ne serait pas 192 au lieu de 160 ?

  3. #3
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    Février 2020
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Février 2020
    Messages : 29
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par f-leb Voir le message

    Très rapidement, ce ne serait pas 192 au lieu de 160 ?
    bonjour f-leb
    hélas non, même en changeant 160 par 192, e résultat est toujours 0.000.
    j'en suis venu a douter du mcp3202, je l'ai donc changé et c'est pas mieux.

    Voici le message que j'ai , quand j'essaie de capturer une tension sur ch1 Nom : Capture d’écran du 2020-11-23 17-57-54.png
Affichages : 433
Taille : 31,9 Ko

    je change juste la valeur de : entree_analog dans mon programme et bien-sur j'applique une tension en ch1

  4. #4
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 601
    Points : 56 700
    Points
    56 700
    Billets dans le blog
    40
    Par défaut
    Alors là, il faut fouiller les datasheets car quelque chose m'échappe...

    Avec le MCP3202, il y a 3 octets échangés d'après la doc :
    Nom : trameSPI_mcp3202.PNG
Affichages : 410
Taille : 85,7 Ko

    Dans le programme Python, il n'y a que deux octets...
    A moins qu'il y ait confusion avec le MCP3002...
    Nom : trameSPI_mcp3002.PNG
Affichages : 429
Taille : 81,4 Ko

    Mais dans ce cas je ne vois pas d'où viennent ces valeurs de 128 ou 160...

    Je cherche

  5. #5
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 601
    Points : 56 700
    Points
    56 700
    Billets dans le blog
    40
    Par défaut
    Le lien amazon de ton premier message indique une erreur, est-on sûr d'avoir un MCP3202 et non un MCP3002 ou autre ?

  6. #6
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    Février 2020
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Février 2020
    Messages : 29
    Points : 11
    Points
    11
    Par défaut
    pour moi 128 initialise bien Ch0 et comme tu disais 192 semblerait correcte pour initialiser ch1 , mais j'ai tester le prog d'Alexandre Galode sans changer une ligne et ça fonctionne sur ch1 avec init a 160 ???.
    Peut être que Alexandre Passera par la un de ces jours et nous éclairerait

  7. #7
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 601
    Points : 56 700
    Points
    56 700
    Billets dans le blog
    40
    Par défaut
    Citation Envoyé par sergio1958 Voir le message
    ... mais j'ai tester le prog d'Alexandre Galode sans changer une ligne et ça fonctionne sur ch1 avec init a 160 ??
    Et maintenant tu nous dis que cela fonctionne aussi sur ch1 avec le programme initial. Heu... problème résolu ?

  8. #8
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    Février 2020
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Février 2020
    Messages : 29
    Points : 11
    Points
    11
    Par défaut
    Euh Pardon , c'est le programme d'Alexandre qui fonctionne sur les deux voies, le miens non toujours pas. je pourrais, me direz vous me contenter de ce qu'a fait Alexandre.
    mais je suis comme çà , j'aime aller au fond et comprendre le pourquoi . Pourquoi mon programme ne fonctionne pas . Pour info , je débute en Python et je fait tout ca pour apprendre.
    C'est certainement un problème dans mon script

  9. #9
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 601
    Points : 56 700
    Points
    56 700
    Billets dans le blog
    40
    Par défaut
    Ah ok, je me rends compte maintenant que ton programme n'est pas tout à fait celui d'Alexandre.

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    liaison = spidev.SpiDev(puce_spi ,entree_analog)

    Le N° de channel du MCP3208 n'a rien à faire dans l'initialisation du port SPI.

    Dans un terminal, si tu tapes :
    Tu devrais voir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /dev/spidev0.0  /dev/spidev0.1
    la syntaxe est /dev/spidev<bus>.<device>.
    bus=0 (il y en a qu'un seul sur RPi) et si tu câbles avec la broche de sélection CE0, device=0

    Il faut écrire :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    liaison = spidev.SpiDev(0, puce_spi)
    avec puce_spi=0 probablement

    EDIT :
    Sur ta copie d'écran du message #3, on voit même spidev.SpiDev(entree_analog, puce_spi), et là ça plante forcément quand le premier paramètre est =1, car le bus=1 n'existe pas...

  10. #10
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    Février 2020
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Février 2020
    Messages : 29
    Points : 11
    Points
    11
    Par défaut
    Merci f-leb
    cela fonctionne, je vais maintenant étudier ça pour bien comprendre.
    Mon idée de départ était de faire une fonction : lire_analog avec passage de paramètre du ch0 ou ch1.
    Pour pouvoir dans un programme futur, interroger plusieurs capteurs.
    C'est pourquoi j'ai trituré le script d'Alexandre, qu'il m'en excuse
    il y a encore des points obscures, dans ce script , mais c'est du python pur qu'il me faut bucher

  11. #11
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 601
    Points : 56 700
    Points
    56 700
    Billets dans le blog
    40
    Par défaut
    A dire vrai, je ne comprends pas pourquoi ça fonctionne

    Je ne comprends pas cette transaction en 2 octets alors qu'il en faudrait 3, et je ne comprends pas ces valeurs 128 et 160. Quelque chose m'échappe encore...

    Est-tu certain que les tensions récupérées sont correctes ? (comparaison avec un voltmètre ?)

  12. #12
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    Février 2020
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Février 2020
    Messages : 29
    Points : 11
    Points
    11
    Par défaut
    Bonjour a tous, j'ai comparé sur les deux entrées ch0 et ch1, les tensions envoyées et les résultats donnés par le CAN, elles sont parfaites. MAIS
    ça marche que si je n'utilise qu'une entrée (ch0 ou ch1) a la fois. j'ai fait un dessin pour expliquerNom : schema.png
Affichages : 391
Taille : 403,2 Ko

    Bon après d'autres tests: je constate que si je veux lire une variation de tension de 0 a VDD sur ch0 , il faut que l'autre entrée soit a 0v ( Valable aussi pour ch1 ) sinon on lit le differentiel entre les deux entrées. Quelque soit init du Ci => 160 ou 192.
    Images attachées Images attachées  

  13. #13
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 601
    Points : 56 700
    Points
    56 700
    Billets dans le blog
    40
    Par défaut
    Hé bien on y est ! Tu es configuré en mode différentiel. La configuration était donc fausse dès le départ, et si ça semblait fonctionner au début, c'était un peu du bol

    Il faut donc reprendre la doc et faire la transaction sur 3 octets comme c'est décrit.

    Je reviens ce soir pour expliquer au besoin

  14. #14
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    Février 2020
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Février 2020
    Messages : 29
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par f-leb Voir le message
    Je reviens ce soir pour expliquer au besoin
    Oui je veux bien , un complément d'info pour transmettre sur 3 octets, car j'ai repris la doc ce matin et je ne vois pas , j'ai encore beaucoup a apprendre

  15. #15
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 601
    Points : 56 700
    Points
    56 700
    Billets dans le blog
    40
    Par défaut
    Cet extrait décrit le protocole :
    Nom : trameSPI_mcp3202.PNG
Affichages : 399
Taille : 65,7 Ko

    1er octet : avec le bit Start=1, en binaire ==> 0000 0001, soit 1.

    2è octet : | SGL/DIFF | ODD/SIGN | MSBF | X | X | X | X | X |
    SGL/DIFF = 1 en mode single ended
    ODD/SIGN = 0 ou 1 selon la chaîne choisie
    MSBF = 1, on va prendre le format MSB first
    X valeur indifférente, mais on va mettre les X = 0

    Ce qui donne
    ==> 1010 0000, soit 160 pour la chaîne 0
    ==> 1110 0000, soit 224 pour la chaîne 1

    3è octet, indifférent, on va mettre = 0

    Ce qui donne pour l'envoi :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if entree_analog == 0: 
            value = 160
        else: 
            value = 224
        to_send = [1, value, 0] 
     
        # Lecture 
        rd_octets = liaison.xfer2(to_send)

    en retour, on a 3 octets, avec les données utiles dans rd_octets[1] et rd_octets[2]. Après, opération de masquage et décalage de bits font l'affaire :

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        msb = rd_octets[1] 
     
        lsb = rd_octets[2] 
     
        value = ( (msb & 15) << 8 ) | lsb    # 15 = 0000 1111 en binaire pour récupérer les bits B11-B10-B9-B8
     
        ...

    à voir...

  16. #16
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    Février 2020
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Février 2020
    Messages : 29
    Points : 11
    Points
    11
    Par défaut
    Yes , ça fonctionne. je peux lire variation de tension sur ch0 et ch1

    après avoir changé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    calcul = 2 * (value * 3.3) / 4096
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    calcul = 2 * (value * 3.3) / 8192
    sinon le resultat est double de la tension d'entrée

    Merci encore pour votre aide et patience
    demain je me penche sur cette ligne de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    value = ((msb & 15) << 8) | lsb + lsb
    et oui je débute en python

  17. #17
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 601
    Points : 56 700
    Points
    56 700
    Billets dans le blog
    40
    Par défaut
    Bonjour,

    La doc écrit bien : Vin=value*3,3/4096
    Là encore, je ne comprends pas d'où vient ce facteur 2

    Je reviens plus tard pour expliquer la formule magique si quelqu'un ne l'a pas fait avant

  18. #18
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    Février 2020
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Février 2020
    Messages : 29
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par f-leb Voir le message
    Bonjour,

    La doc écrit bien : Vin=value*3,3/4096
    Là encore, je ne comprends pas d'où vient ce facteur 2
    j'ai la réponse: dans le script d'origine, qui m'a servi de base de départ la formule est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    calcul = 2* (value*3.3)/4096.0
    Pourquoi
    Après modif du code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    calcul = (value*3.3)/4096.0
    c'est bon.

  19. #19
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 601
    Points : 56 700
    Points
    56 700
    Billets dans le blog
    40
    Par défaut
    Une fois que tu as les deux octets msb (poids fort) et lsb (poids faible) :
    Nom : trameSPI_mcp3202.PNG
Affichages : 387
Taille : 67,1 Ko

    Il faut faire un masquage de msb avec un ET logique (symbole &). Les X peuvent être n'importe quoi, 0 ou 1 et il faut les mettre à 0 :
    msb :  X X X 0 B11 B10  B9  B8
    ET (&)
    15  :  0 0 0 0  1   1   1   1
    ______________________________
           0 0 0 0 B11 B10  B9  B8
    
    avec un décalage de 8 bits vers la gauche (avec << 8), tu obtiens un nombre 16 bits :
    0 0 0 0 B11 B10 B9 B8    0 0 0 0 0 0 0 0
    
    Il reste à faire un OU logique (symbole |) avec lsb :
           0 0 0 0 B11 B10 B9 B8    0  0  0  0  0  0  0  0
    OU (|)
    lsb :  0 0 0 0  0   0  0  0     B7 B6 B5 B4 B3 B2 B1 B0
    ___________________________________________
           0 0 0 0 B11 B10 B9 B8    B7 B6 B5 B4 B3 B2 B1 B0   <-- résultat
    
    Avec le résultat souhaité dans un nombre 16 bits

  20. #20
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    Février 2020
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Février 2020
    Messages : 29
    Points : 11
    Points
    11
    Par défaut
    Merci f_leb
    il y a 40ans j'aurai du être plus attentif en cours, mais a cette époque j’étais plus branché électronique analogique.
    je vais ressortir mes bouquins

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Python 3.X] Utiliser 'bold' dans can.create_text
    Par Invité dans le forum Tkinter
    Réponses: 1
    Dernier message: 23/05/2015, 13h58
  2. Réponses: 0
    Dernier message: 25/07/2014, 15h42
  3. [CR 2008] Utilisation de la propriété can growl sur un champ
    Par arnfi1987 dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 05/12/2012, 09h34
  4. Net::SSH::Perl Can't bind socket to port 1023: Adresse déjà utilisée
    Par sohnic dans le forum Programmation et administration système
    Réponses: 2
    Dernier message: 27/11/2006, 21h32
  5. utiliser DBI (Can't locate DBI.pm)
    Par milka dans le forum SGBD
    Réponses: 5
    Dernier message: 12/08/2005, 19h36

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