Modifications

Sauter à la navigation Sauter à la recherche
4 564 octets ajoutés ,  10 janvier 2016 à 21:53
Ligne 279 : Ligne 279 :  
Nous allons également réutiliser la fonction {{fname|arduino_map}} découvert dans le tutoriel dédié à la "[[MicroPython-Hack-Analogique|lecture analogique]]".
 
Nous allons également réutiliser la fonction {{fname|arduino_map}} découvert dans le tutoriel dédié à la "[[MicroPython-Hack-Analogique|lecture analogique]]".
   −
Voici un programme qui fait évoluer constamment la couleur de la LED.
+
Voici un programme qui permet de fixer une couleur arbitraire.
*
+
 
 +
En prime, il y a quelques autres fonctions intéressante (que nous aborderons dans la section. "Plus Plus et encore plus".
 +
 
 +
<nowiki>from pyb import Timer
 +
from time import sleep
 +
 
 +
# Definir des couleurs (valeur RGB (red, green, blue)
 +
ROUGE  = (255, 0, 0)
 +
ORANGE = (83, 4, 0)
 +
JAUNE  = (255, 255, 0)
 +
VERT  = (0, 255, 0)
 +
BLEU  = (0, 0, 255)
 +
INDIGO = (4, 0, 19)
 +
VIOLET = (23, 0, 22)
 +
CYAN  = (0, 255, 255)
 +
MAGENTA= (255, 0, 255)
 +
BLANC  = (255, 255, 255)
 +
NOIR  = (0, 0, 0)
 +
ROSE  = (158, 4, 79)
 +
 +
class PWM_RGB:
 +
    """ Permet de controler une LED RGB en PWM. """
 +
    PWM_FREQ = 100 # Frequence 100 Hz
 +
   
 +
    def __init__(self, pwn_red, pwm_green, pwm_blue ):
 +
        """ Initialise l objet avec les informations de controle PWM.
 +
            :param pwm_red: pour led rouge. dictionnaire avec pin, timer, channel à utiliser
 +
            :param pwm_green: pour led verte. idem
 +
            :param pwm_blue: pour led bleue. idem"""
 +
        self.__red = pwn_red
 +
        self.__green = pwm_green
 +
        self.__blue = pwm_blue
 +
       
 +
        for pwm_for in [self.__red, self.__green, self.__blue]:
 +
            # Cree le timer et le channel et stocke les references dans le
 +
            # dictionnaire PWM_FOR_x
 +
            pwm_for['tim'] = pyb.Timer( pwm_for['timer'], freq=self.PWM_FREQ )
 +
            pwm_for['pchannel'] = pwm_for['tim'].channel( pwm_for['channel'], Timer.PWM, pin=pwm_for['pin'], pulse_width_percent=100 )
 +
 
 +
    def arduino_map(self, x, in_min, in_max, out_min, out_max):
 +
        """ fonction qui permet de passer d'un range de valeur (in_) à une autre
 +
            (out_) en appliquant une règle de trois. """
 +
        return int( (x - in_min) * (out_max - out_min) // (in_max - in_min) + out_min )
 +
   
 +
    def set_color(self, color ):
 +
        """ Assign une couleur (r,g,b) pour la LED RGB.
 +
            :param pwm_rgb: la definition des canaux PWM de la LED RGB
 +
            :param color: un tuple pour les valeurs ( R, G, B ). Valeurs de 0 à 255 """
 +
       
 +
        # Attention couleur pleine = 0% cycle utile
 +
        #          pas de couleur = 100% cycle utile -> logique inversée
 +
        percent_width = self.arduino_map( color[0], 0, 255, 100, 0 )
 +
        self.__red['pchannel'].pulse_width_percent( percent_width )
 +
        percent_width = self.arduino_map( color[1], 0, 255, 100, 0 )
 +
        self.__green['pchannel'].pulse_width_percent( percent_width )
 +
        percent_width = self.arduino_map( color[2], 0, 255, 100, 0 )
 +
        self.__blue['pchannel'].pulse_width_percent( percent_width )
 +
 
 +
    def fade_to_color( self, from_color, to_color, delay_ms ):
 +
        """ Passe d'une couleur à l'autre. insère un delay de x ms entre
 +
            chaque modification de couleur (donc influence la vitesse
 +
            de changement
 +
 
 +
            :param from_color: Couleur de depart. Tuple (r,g,b). Valeur de 0 à 255
 +
            :param to_color: Couleur de fin.
 +
            :param delay_ms: Temps entre deux étape (en milliseconde)
 +
        """
 +
        changedRed  = to_color[0] - from_color[0]
 +
        changedGreen = to_color[1] - from_color[1]
 +
        changedBlue  = to_color[2] - from_color[2]
 +
        steps = max( abs(changedRed), abs(changedGreen), abs(changedBlue) )
 +
       
 +
        for i in range( steps ):
 +
            newRed  = from_color[0] + (i * changedRed / steps)
 +
            newGreen = from_color[1] + (i * changedGreen / steps)
 +
            newBlue  = from_color[2] + (i * changedBlue / steps)
 +
            self.set_color( (newRed, newGreen, newBlue) )
 +
            pyb.delay( delay_ms )
 +
 
 +
# Déclaration des broches, timers et channels pour controler une LED
 +
# RGB en PWM
 +
PWM_FOR_RED  = { 'pin' : pyb.Pin.board.X8 , 'timer' :14, 'channel' : 1, 'tim': None, 'pchannel' : None }
 +
PWM_FOR_GREEN = { 'pin' : pyb.Pin.board.Y9 , 'timer' : 2, 'channel' : 3, 'tim': None, 'pchannel' : None }
 +
PWM_FOR_BLUE  = { 'pin' : pyb.Pin.board.Y10, 'timer' : 2, 'channel' : 4, 'tim': None, 'pchannel' : None } 
 +
 
 +
# Creation de l'objet LED
 +
led = PWM_RGB( PWM_FOR_RED, PWM_FOR_GREEN, PWM_FOR_BLUE )
 +
led.set_color( NOIR )
 +
 
 +
# Affichage d'une couleur prédéfinie
 +
led.set_color( ROSE )
 +
 
 +
# Affichage d'une couleur de votre choix
 +
# led.set_color( (12,34,12) )
 +
 
 +
# Passer d'une couleur à l'autre avec un delay de 10ms par étapes
 +
# Le délais determine la vitesse de chg de couleur.
 +
# led.fade_to_color( ROUGE, VERT, 10 )
 +
 
 +
# Roue des couleurs
 +
#COLORS = [ROUGE,JAUNE,VERT,CYAN,BLEU,MAGENTA,ROUGE]
 +
#for current_color, next_color in zip( COLORS, COLORS[1:] ):
 +
#    led.fade_to_color( current_color, next_color, 10 )
 +
#
 +
#led.set_color( NOIR )</nowiki>
    
== Plus, plus et encore plus ==
 
== Plus, plus et encore plus ==
29 836

modifications

Menu de navigation