Youpsy
Posts: 12
Joined: Thu Apr 05, 2018 6:09 pm

Problème lecture channel mcp3008

Thu Apr 05, 2018 6:17 pm

Bonjour à tous le forum !
Je viens de m'acheter mon première raspberry avec pour idée de faire un peu de domotique.
jusqu à maintenant tous coulais de source ^^
Mais depuis quelques jours j'ai un petit soucis....
Je me suis mis en tête d'utiliser un convertisseur de donnée numérique/analogique MCP3008

https://cdn-shop.adafruit.com/datasheets/MCP3008.pdf

pour celà j'ai suivi plusieurs tuto qui pour moi je trouve était très bien expliquer

voici les sources :

http://electroniqueamateur.blogspot.ch/ ... ur-le.html
http://blog.v1kings.io/jeedom-ajout-dun ... uminosite/
http://nagashur.com/blog/2013/01/13/lir ... e-mcp3008/

sauf que une fois que je lance le script python j'ai toutes les valeurs des 8 channels à 0...
pourtant j'ai bien une tension différentes à la sortie chaque capteur analogique

J'ai contrôler :

- le branchement, plus d'une fois ( et à l'aide de wiringpi )pour savoir si j'utilisai les mauvais gpio..
- que le spi sois actif et à chaque démarrage
- J'ai vérifier que le librairie d'adafruit soit bien installer..
345d524a78935bd97a21fed6ddd5c254 (copie).png
345d524a78935bd97a21fed6ddd5c254 (copie).png (223.61 KiB) Viewed 531 times
1er test (script python/spidev):

Code: Select all

    #!/usr/bin/python
    # -*- coding: utf-8 -*-

    # Lecture de valeurs analogiques par un MCP3008 branché au Raspberry Pi
    # Un potentiomètre est branché au canal 0 du MCP3008, un autre est branché
    # au canal 1.
    # http://electroniqueamateur.blogspot.com/2014/03/lecture-de-capteurs-analogiques-sur-le.html
     
    import spidev
    import time
    import os
    import sys

    # Ouverture du bus SPI
    spi = spidev.SpiDev()
    spi.open(0,0)  # car j'utilise la pin CE0:  serait spi.open(0,1) si j'utilisais la pin CE1
    spi.max_speed_hz = 7629
    # Fonction qui lit l'information en provenance du MCP3008
    # L'argument channel est le numéro de canal du MCP3008:  entier de 0 à 7
    def ReadChannel(adcnum):
     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

     
    # Lecture du premier capteur, branché au canal 0 du MCP3008
    valeur1 = ReadChannel(0)
    valeur2 = ReadChannel(1)
    valeur3 = ReadChannel(2)
    valeur4 = ReadChannel(3)
    valeur5 = ReadChannel(4)
    valeur6 = ReadChannel(5)
    valeur7 = ReadChannel(6)
    valeur8 = ReadChannel(7)

    # Affichage des résulats à l'écran
    print( "Valeur 1: " + str( valeur1 ))
    print( "Valeur 2: " + str( valeur2 ))
    print( "Valeur 3: " + str( valeur3 ))
    print( "Valeur 4: " + str( valeur4 ))
    print( "Valeur 5: " + str( valeur5 ))
    print( "Valeur 6: " + str( valeur6 ))
    print( "Valeur 7: " + str( valeur7 ))
    print( "Valeur 8: " + str( valeur8 ))

    # Pause syndicale:  on attend une seconde avant la prochaine prise de mesure.
    time.sleep(1)

2eme test : avec le script simpletest.py fourni par adafruit dans la librairie MCP3008

Code: Select all

 # Simple example of reading the MCP3008 analog input channels and printing
    # them all out.
    # Author: Tony DiCola
    # License: Public Domain
    import time

    # Import SPI library (for hardware SPI) and MCP3008 library.
    import Adafruit_GPIO.SPI as SPI
    import Adafruit_MCP3008


    # Software SPI configuration:
    CLK  = 11
    MISO = 9
    MOSI = 10
    CS   = 8
    mcp = Adafruit_MCP3008.MCP3008(clk=CLK, cs=CS, miso=MISO, mosi=MOSI)

    # Hardware SPI configuration:
    # SPI_PORT   = 0
    # SPI_DEVICE = 0
    # mcp = Adafruit_MCP3008.MCP3008(spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE))


    print('Reading MCP3008 values, press Ctrl-C to quit...')
    # Print nice channel column headers.
    print('| {0:>4} | {1:>4} | {2:>4} | {3:>4} | {4:>4} | {5:>4} | {6:>4} | {7:>4} |'.format(*range(8)))
    print('-' * 57)
    # Main program loop.
    while True:
        # Read all the ADC channel values in a list.
        values = [0]*8
        for i in range(8):
            # The read_adc function will get the value of the specified channel (0-7).
            values[i] = mcp.read_adc(i)
        # Print the ADC values.
        print('| {0:>4} | {1:>4} | {2:>4} | {3:>4} | {4:>4} | {5:>4} | {6:>4} | {7:>4} |'.format(*values))
        # Pause for half a second.
    time.sleep(0.5)


mais la je suis a court d'idée..
Last edited by Youpsy on Thu Apr 05, 2018 6:55 pm, edited 1 time in total.

danjperron
Posts: 2854
Joined: Thu Dec 27, 2012 4:05 am
Location: Québec, Canada

Re: Problème lecture channel mcp3008

Thu Apr 05, 2018 6:40 pm

En regardant vitement ton code j'ai remarqué que ton clock n'est pas bon. Il est tellement lent que je ne suis pas certain que le Pi va si bas.

1.3Mhz à 3.3v et 3Mhz à 5V selon les specs.

spi.max_speed_hz = 1300000

Youpsy
Posts: 12
Joined: Thu Apr 05, 2018 6:09 pm

Re: Problème lecture channel mcp3008

Thu Apr 05, 2018 6:48 pm

Merci pour ta réponse ! ;) Mais ca n'a rien changé

danjperron
Posts: 2854
Joined: Thu Dec 27, 2012 4:05 am
Location: Québec, Canada

Re: Problème lecture channel mcp3008

Thu Apr 05, 2018 7:41 pm

Une photo de ton montage, en haute définition, avec la valeur que tu as.Je veux voir les connections.

Peux-tu brancher les entrées analogiques non utilisées a zéro et une à 3.3v.

totoharibo
Posts: 3773
Joined: Thu Jan 24, 2013 8:43 am

Re: Problème lecture channel mcp3008

Thu Apr 05, 2018 7:47 pm

question con (je suis spécialiste) : le SPI est activé (cf raspi-config) ?

Youpsy
Posts: 12
Joined: Thu Apr 05, 2018 6:09 pm

Re: Problème lecture channel mcp3008

Thu Apr 05, 2018 8:03 pm

oui oui il est activé
spiactif.png
spiactif.png (129.44 KiB) Viewed 506 times

Youpsy
Posts: 12
Joined: Thu Apr 05, 2018 6:09 pm

Re: Problème lecture channel mcp3008

Thu Apr 05, 2018 8:13 pm

Voici les photos,

http://www.sendbox.fr/99963216fcb4ae86/ ... 215357.jpg
http://www.sendbox.fr/1f59cf12685f21f7/ ... 215206.jpg


et le résultat après avoir branché toutes les channels restant à 0 et le dernier à 3.3V
simpletest.png
simpletest.png (67.32 KiB) Viewed 497 times
Et si je prend la tension du signal de sortie aux bornes de mes capteurs j'ai 2.1V pour le 1er, 1.6V pour le 2eme, 0.6V pour la 3eme, après j'ai cables les channel 4 à 7 à 0V et le 8 à 3.3V...

Donc je devrais avoir approximativement ces valeurs CH0 = 651; CH1 = 496 ; CH2 = 186 ; CH3 = 0 ; CH4 = 0 ; CH5 = 0 ; CH6 = 0 ; CH7 = 1024
mais comme vous pouvez le voir j'ai 0 partout.... :(

Est ce que j'aurai cramé le convertisseur ? y a t'il moyen de le tester autrement ?

danjperron
Posts: 2854
Joined: Thu Dec 27, 2012 4:05 am
Location: Québec, Canada

Re: Problème lecture channel mcp3008

Thu Apr 05, 2018 9:06 pm

Oops c'est un 16 Pins les fils concordent!

Pin 1 3.3V fils couleur incertaine -> ??? devrait aller sur la pin 14 et 13 3.3V
pin 6 GND fils couleur incertains -> ??? devrait aller sur pin 12 et 7.

Je suppose que tu utilises le 3.3V comme référence.



Pour vérifier si le spi fonctionne

branche 3.3V à MISO et effectue avec python une commande pour lire le spi

spi.xfer2([0]) elle devrait te retourner [255]
ensuite branche le ground et elle devrait te retourner [0]

et finallement branche miso avec mosi et essaie

spi.xfer2([0xaa]) et elle devrait te retourner [0xaa]


P.S. Aussi en dessous du pcb comment est-ce soudé?

Youpsy
Posts: 12
Joined: Thu Apr 05, 2018 6:09 pm

Re: Problème lecture channel mcp3008

Thu Apr 05, 2018 9:43 pm

Oui j'utilise le 3.3V comme référence et oui en dessous cela à été soudé

pour être sur de ce que je fais ca dois ressembler a ça la commande python ??

Code: Select all

import sys

import spidev

print('Starting test code')

adc_channel = 7
print('initializing the spi bus instance')

spi_bus = spidev.SpiDev()

print('opening the spi bus')

spi_bus.open(0, 0) 
print('getting the adc output ')

adc_output = spi_bus.xfer2([0])
print('adc read complete')

danjperron
Posts: 2854
Joined: Thu Dec 27, 2012 4:05 am
Location: Québec, Canada

Re: Problème lecture channel mcp3008

Fri Apr 06, 2018 3:35 am

oui c'est cela mais ne pas oublier de changer la vitesse du spi

spi.max_speed_hz=100000

J'ai essayé ton code ,la première version , mais je n'ai que des MCP3208. J'ai donc ajouté une fonction pour les lires et ton code devrait fonctionner. J'ai vérifier la fonction pour le MCP3008 et elle est correcte!
P.S. il ne faut pas oublier que le clock du SPI ne doit pas dépasser 1.3Mhz en 3.3V.
Image

Voici mon code avec l'ajout du mcp3208

Code: Select all

#!/usr/bin/python
# -*- coding: utf-8 -*-

# Lecture de valeurs analogiques par un MCP3008 branché au Raspberry Pi
# Un potentiomètre est branché au canal 0 du MCP3008, un autre est branché
# au canal 1.
# http://electroniqueamateur.blogspot.com/2014/03/lecture-de-capteurs-analogiques-sur-le.html

# D.J.P. Avril 2018 ajout du pcm3208 12bit A/D

import spidev
import time
import os
import sys

# Ouverture du bus SPI
spi = spidev.SpiDev()
spi.open(0,0)  # car j'utilise la pin CE0:  serait spi.open(0,1) si j'utilisais la pin CE1
spi.max_speed_hz = 1000000

# Fonction qui lit l'information en provenance du MCP3008
# L'argument channel est le numéro de canal du MCP3008:  entier de 0 à 7


def Read3008(adcnum):
   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

def Read3208(adcnum):
  if adcnum >7 or adcnum <0 :
     return -1
  r = spi.xfer2([6+(adcnum>>2),(adcnum&3)<<6,0])
  adcout = ((r[1] & 15) << 8) + r[2]
  return adcout


# Lecture du premier capteur, branché au canal 0 du MCP3008

valeur=[]
for channel in range(8):
   valeur.append(Read3208(channel))


# Affichage des résulats à l'écran
for channel in range(8):
   print( "Valeur " + str(channel) + ": " + str(valeur[channel]))
Sur la photo j'ai ajouté en série sur chaque entrée une diode 1n4148 en série avec une résistance de 4k7 sur 3.3V. J'ai donc une rampe entre chaque entrée.

Code: Select all

pi@Pi3:~ $ chmod +x ad1.py
pi@Pi3:~ $ ./ad1.py
Valeur 0: 4054
Valeur 1: 3647
Valeur 2: 3041
Valeur 3: 2435
Valeur 4: 1827
Valeur 5: 1219
Valeur 6: 609
Valeur 7: 0
Le MCP3208 est 12bits alors le maximum est de 4095.

Youpsy
Posts: 12
Joined: Thu Apr 05, 2018 6:09 pm

Re: Problème lecture channel mcp3008

Fri Apr 06, 2018 7:41 pm

Hello !
Désolé de ne répondre que maintenant.. alors j'ai tester ce que tu m'a dit en branchant le 3.3V sur le pin miso du raspberry et la valeur est de 0 si je ne suis pas trompé.. pareil avec le gnd évidamment.

Code: Select all

import sys
import spidev

adc_output = spi_bus.xfer2([0])

print(adc_output [0])
par contre j ai pas tout compris comment procéder avec spi.xfer2([0xaa]) pour le miso et mosi...

et quand je lance le code que tu as modifié toutes le valeurs sont toujours à 0...

danjperron
Posts: 2854
Joined: Thu Dec 27, 2012 4:05 am
Location: Québec, Canada

Re: Problème lecture channel mcp3008

Fri Apr 06, 2018 8:27 pm

quand je lance le code que tu as modifié toutes le valeurs sont toujours à 0...
J'espère que tu n'as pas oublié d'utiliser Read3008 au lieu de Read3208 !


OK . La raison de brancher MISO (Master IN Slave OUT) à GND c'est pour vérifier que le xfer2 va te donner uniquement des zéros puisque nous forçons zéro (GND). De la même façon avec un branchement de MISO à 3.3V nous forçons la réception série à recevoir uniquement des uns.

Pour ce qui est de brancher MISO et MOSI ensemble (brancher GPIO9 avec GPIO10 seulement), c'est juste pour vérifier ce que tu envoies est la même chose que tu reçois.
De cette façon tu vérifies facilement si ton SPI fonctionne sans brancher de périphérique.

P.S. il ne faut pas brancher ton MCP3008 lorsque tu vérifies le SPI. et le clock doit être configurer sinon il est tellement rapide que le signal est faussé.


Quel est la longueur de tes fils? Un ruban de fils peut engendrer de la diaphonie (crosstalk) puisque l'effet capacitif est élevé.
https://fr.wikipedia.org/wiki/Diaphonie

Peut être séparer les fils et aussi ajouter un condensateur de 0.1uF entre le DGND et VCC directement sur le C.I. Les puces CMOS sont très sensible au bruit.

Youpsy
Posts: 12
Joined: Thu Apr 05, 2018 6:09 pm

Re: Problème lecture channel mcp3008

Fri Apr 06, 2018 8:42 pm

Alors la longeur des fils entre le rpi et le mcp = 10cm
et oui j'ai bien modifier la partie

Code: Select all

# Lecture du premier capteur, branché au canal 0 du MCP3008

valeur=[]
for channel in range(8):
   valeur.append(Read3008(channel))
J'ai effectué un petit test en suivant le tuto ci-dessous (shunt MISO et MOSI -> spidev_test)

https://wolfgangklenk.wordpress.com/201 ... pberry-pi/
spidevtest.png
spidevtest.png (78.96 KiB) Viewed 400 times

danjperron
Posts: 2854
Joined: Thu Dec 27, 2012 4:05 am
Location: Québec, Canada

Re: Problème lecture channel mcp3008

Fri Apr 06, 2018 11:58 pm

En passant le lien pour spidev_test.c n'est plus! Il n'existe plus dans la plus récente version mais je l'ai trouvé dans un code source que j'ai.

Il y a de forte chance que ton mcp3008 fonctionne . Il semble que tu as un problème avec ton spidev!

J'espère que tu as utilisé "sudo raspi-config" ou le config dans le gui pour l'activer parceque le lien que tu as au début est désuet.


Voici ce que tu devrais avoir avec spidev_test

La pin MISO branché au GND(0V).

Code: Select all

pi@Pi3:~ $ ./spidev_test -D /dev/spidev0.0
spi mode: 0x0
bits per word: 8
max speed: 500000 Hz (500 KHz)
RX | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  | ................................
La pin MISO branché sur 3.3V

Code: Select all

pi@Pi3:~ $ ./spidev_test -D /dev/spidev0.0
spi mode: 0x0
bits per word: 8
max speed: 500000 Hz (500 KHz)
RX | FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF  | ................................
La pin MISO et MOSI branché ensemble

Code: Select all

pi@Pi3:~ $ ./spidev_test -D /dev/spidev0.0
spi mode: 0x0
bits per word: 8
max speed: 500000 Hz (500 KHz)
RX | FF FF FF FF FF FF 40 00 00 00 00 95 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F0 0D  | ......@....?..................?.
Si tu n'as pas ce résultat j'opterais fortement pour vérifier comment tu as activé le SPI.

Quel version d'OS utilises-tu? Est-ce un PI3+ ou un PI3?

Youpsy
Posts: 12
Joined: Thu Apr 05, 2018 6:09 pm

Re: Problème lecture channel mcp3008

Sat Apr 07, 2018 8:26 am

Alors la première fois je suis passé par le GUI (activation/reboot)
SpiGUI.png
SpiGUI.png (87.91 KiB) Viewed 311 times
Vu que ca ne fonctionnais pas je l'ai désactiver puis rebooter..
Ensuite je suis passé par le terminal "sudo raspi-config"(activation/reboot)
SPIconfig.png
SPIconfig.png (90.12 KiB) Viewed 311 times
et je me suis permis de retirer le "#" à "dtparam=spi=on" dans le fichier /boot/config.txt
Bootconfig.png
Bootconfig.png (131.38 KiB) Viewed 311 times
Sinon j'ai un raspberry pi 3 model B rev 1.2

Pour le spidev_test je ferai d'autres essais dans la journée.

danjperron
Posts: 2854
Joined: Thu Dec 27, 2012 4:05 am
Location: Québec, Canada

Re: Problème lecture channel mcp3008

Sat Apr 07, 2018 12:28 pm

et je me suis permis de retirer le "#" à "dtparam=spi=on" dans le fichier /boot/config.txt
Vraiment bizarre que tu as été obligé d'enlever le '#' après raspi-config.

Je te suggère d'écrire une nouvelle carte SD avec raspian et de configurer avec sudo raspi-config seulement (hostname,password,location, time zone et évidemment le SPI).

Une fois le tout fait et que le PI3 a redémarré, regarde ton /boot/config et le spi devrait être sans le '#'.

Si tout est bon alors vérifie avec spi_test.

Youpsy
Posts: 12
Joined: Thu Apr 05, 2018 6:09 pm

Re: Problème lecture channel mcp3008

Sat Apr 07, 2018 7:11 pm

Salut !

Oui je pense que je vais réinstaller rasabian sur une nouvelle SD car y a des choses pas très claire..

mais j'ai quand même fait le spidev_test (procédure que tu m'a indiquée, 1. MISO -> Gnd / 2. MISO -> 3.3V / 3. MISO -> MOSI

Résultat :
spidevtestReussi.png
spidevtestReussi.png (64.64 KiB) Viewed 262 times
:D :D :D

Je branche le mcp3008 je lance le script des zéros partout :?: :roll:

je refais le spidev_test et la... :shock: :o
spidevtestapMCP.png
spidevtestapMCP.png (85.75 KiB) Viewed 262 times
Pour que le spidev_test refonctionne j'ai du éteindre et débrancher l'alimentation car rebooter n'y changai rien

danjperron
Posts: 2854
Joined: Thu Dec 27, 2012 4:05 am
Location: Québec, Canada

Re: Problème lecture channel mcp3008

Sat Apr 07, 2018 7:17 pm

Vraiment étrange.

Aussi si tu as une plaque de test (breadboard) j'essaierais avec tout en neuf sans soudure.

Youpsy
Posts: 12
Joined: Thu Apr 05, 2018 6:09 pm

Re: Problème lecture channel mcp3008

Wed Apr 18, 2018 8:57 pm

Voilà un nouveau Rpi 3 et après tous fonctionne.. donc le problème venai du bus SPI du raspberry et non de la micro SD!

Merci @danjperron pour ton aide !

Return to “Français”

Who is online

Users browsing this forum: No registered users and 7 guests