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 == |