Ligne 105 : |
Ligne 105 : |
| <nowiki>#!/usr/bin/env python | | <nowiki>#!/usr/bin/env python |
| # -*- coding: latin-1 -*- | | # -*- coding: latin-1 -*- |
| + | |
| + | import time |
| + | import RPi.GPIO as GPIO |
| + | |
| + | GPIO.setmode( GPIO.BCM ) |
| + | DEBUG = 1 |
| + | |
| + | # Lit les données SPI d'une puce MCP3008, 8 canaux disponibles (adcnum de 0 à 7) |
| + | def readadc( adcnum, clockpin, mosipin, misopin, cspin ): |
| + | if( (adcnum > 7) or (adcnum < 0)): |
| + | return -1 |
| + | |
| + | GPIO.output( cspin, True ) |
| + | |
| + | GPIO.output( clockpin, False ) # met Clock à Low |
| + | GPIO.output( cspin, False ) # met CS à Low (active le module MCP3008) |
| + | |
| + | commandout = adcnum # numéro de channel |
| + | commandout |= 0x18 # OR pour ajouter Start bit + signle-ended bit |
| + | # 0x18 = 24d = 00011000b |
| + | commandout <<=3 # décalage de 3 bits à gauche |
| + | |
| + | # Envoi des Bits sur le bus SPI |
| + | for i in range(5): |
| + | # faire un AND pour determiner l'état du bit de poids le plus |
| + | # fort (0x80 = 128d = 10000000b) |
| + | if( commandout & 0x80 ): # faire un AND pour déterminer l'état du bit |
| + | GPIO.output( mosipin, True ) |
| + | else: |
| + | GPIO.output( mosipin, False ) |
| + | commandout <<= 1 # décalage de 1 bit sur la gauche |
| + | |
| + | # Envoi du bit mosipin avec signal d'horloge |
| + | GPIO.output( clockpin, True ) |
| + | GPIO.output( clockpin, False ) |
| + | |
| + | # lecture des bits renvoyés par le MCP3008 |
| + | # Lecture de 1 bit vide, 10 bits de données et un bit null |
| + | adcout = 0 |
| + | for i in range(12): |
| + | # Signal d'horloge pour que le MCP3008 place un bit |
| + | GPIO.output( clockpin, True ) |
| + | GPIO.output( clockpin, False ) |
| + | # décalage de 1 bit vers la gauche |
| + | adcout <<= 1 |
| + | # stockage du bit en fonction de la broche miso |
| + | if( GPIO.input(misopin)): |
| + | adcout |= 0x1 # active le bit avec une opération OR |
| + | |
| + | # Mettre Chip Select à High (désactive le MCP3008) |
| + | GPIO.output( cspin, True ) |
| + | |
| + | # Le tout premier bit (celui de poids le plus faible, le dernier lut) |
| + | # est null. Donc on l'elimine ce dernier bit en décalant vers la droite |
| + | adcout >>= 1 |
| + | |
| + | return adcout |
| + | |
| + | # Broches connectées sur l'interface SPI du MCP3008 depuis le Cobbler |
| + | # (changer selon vos besoins) |
| + | SPICLK = 18 |
| + | SPIMISO = 23 |
| + | SPIMOSI = 24 |
| + | SPICS = 25 |
| + | |
| + | # Initialisation de l'interface SPI |
| + | GPIO.setup(SPIMOSI, GPIO.OUT) |
| + | GPIO.setup(SPIMISO, GPIO.IN) |
| + | GPIO.setup(SPICLK, GPIO.OUT) |
| + | GPIO.setup(SPICS, GPIO.OUT) |
| + | |
| + | # Potentiomètre 10KOhms raccordés sur le canal ADC #0 |
| + | potentiometer_adc = 0 |
| + | |
| + | while True: |
| + | # Lecture analogique, retourne une valeur entre 0 et 1023 |
| + | # pour une valeur de tension entre 0 et VRef (3.3v) |
| + | trim_pot = readadc( potentiometer_adc, SPICLK, SPIMOSI, SPIMISO, SPICS ) |
| + | |
| + | print( "Valeur: " + str( trim_pot ) ) |
| + | |
| + | # convertir en tension |
| + | print( "tension: "+ str( (3.3*trim_pot)/1024 ) ) |
| + | |
| + | # attendre une demi-seconde |
| + | time.sleep(0.5) |
| + | </nowiki> |
| + | |
| + | Ce qui produit le résultat suivant: |
| + | |
| + | <nowiki>Valeur: 665 |
| + | tension: 2.14306640625 |
| + | Valeur: 666 |
| + | tension: 2.1462890625 |
| + | Valeur: 665 |
| + | tension: 2.14306640625 |
| + | Valeur: 668 |
| + | tension: 2.152734375 |
| + | Valeur: 665 |
| + | tension: 2.14306640625 |
| </nowiki> | | </nowiki> |
| | | |
| Pour savoir comment télécharger et exécuter ce programme sur votre Py, nous vous proposons de prendre connaissance de notre premiers articles sur [[Rasp-Hack-LED|Raspberry Pi et LED]] | | Pour savoir comment télécharger et exécuter ce programme sur votre Py, nous vous proposons de prendre connaissance de notre premiers articles sur [[Rasp-Hack-LED|Raspberry Pi et LED]] |
| + | |
| + | == Commande de volume == |
| + | AdaFruit propose un exemple plus avancé basé sur ce montage. |
| + | |
| + | L'exemple propose de modifier le volume du son en fonction de la position du potentiomètre. |
| + | |
| + | Cet exemple est disponible sur le site [http://learn.adafruit.com/reading-a-analog-in-and-controlling-audio-volume-with-the-raspberry-pi/script AdaFruit Learning System] |
| | | |
| Source: [http://learn.adafruit.com/reading-a-analog-in-and-controlling-audio-volume-with-the-raspberry-pi AdaFruit Learning System] | | Source: [http://learn.adafruit.com/reading-a-analog-in-and-controlling-audio-volume-with-the-raspberry-pi AdaFruit Learning System] |