Main

Référence : Fonctions Pyduino

analogWrite()


Description

Génère une impulsion de largeur / période voulue sur une broche de la carte Arduino (onde PWM - Pulse Width Modulation en anglais ou MLI - Modulation de Largeur d'Impulsion en français). Ceci peut-être utilisé pour faire briller une LED avec une luminosité variable ou contrôler un moteur à des vitesses variables. Pour plus de détails sur les impulsions PWM voir : Comprendre les impulsions PWM

Après avoir appelé l'instruction analogWrite(), la broche générera une onde carrée stable avec un "duty cycle" (fraction de la période où la broche est au niveau haut) de longueur spécifiée (en largeur 0-255), jusqu'à l'appel suivant de l'instruction analogWrite() (ou bien encore l'appel d'une instruction digitalRead() ou digitalWrite() sur la même broche).

Cette fonction, basée sur le/les modules PWM intégrés dans la carte mini-PC utilisée, reproduit fidèlement la fonction analogWrite() Arduino native en générant la largeur d'impulsion voulue en fonction de la valeur 0-255 reçue. Il faut savoir que les modules PWM matériel des différentes cartes ont des plages PWM différentes pouvant aller de 0-20 à 0-1023 selon le paramétrage, la fréquence PWM, etc.. : la librairie Pyduino gère automatiquement tout cela de façon à fournir la largeur d'impulsion équivalente à une plage 0-255 quelque soit la plage utilisée par le matériel. Pas belle la vie ? Ceci est également vrai pour la fonction analogWritePercent(). La fonction analogWriteHardware par contre permet, au besoin, d'utiliser la plage native du PWM matériel.

La fréquence de l'onde PWM est :

  • nativement sur Arduino de 490 Hz environ.
  • sur le pcduino : 520 Hz par défaut sur les 6 voies, paramétrable avec setFrequencyPWM() au besoin de 125Hz à 2000Hz.
  • raspberryPi : 4400 Hz par défaut

Note technique :

  • Sur la carte mini-PC pcDuino, le PWM hardware fonctionne sur les broches 3,5, 6, 9, 10 et 11, comme pour une carte Arduino UNO ou équivalent.
  • Le Raspberry Pi, seule la broche 1 est disponible pour le PWM hardware !

Syntaxe

analogWrite(broche, valeur);

Paramètres

  • broche: la broche utilisée pour "écrire" l'impulsion. Cette broche devra être une broche ayant la fonction PWM. La librairie Pyduino autorise les identifiants de la forme PWMx pour désigner les broches PWM : ce qui donne PWM0, PWM1, etc... Sur le pcDuino, ce pourra être une des broches 3, 5 ,6 ,9 ,10 ou 11, comme Arduino. Sur le RaspberryPi, uniquement la broche I/O 1.
  • valeur: la largeur du "duty cycle" (proportion de l'onde carrée qui est au niveau HAUT) : entre 0 (0% HAUT donc toujours au niveau BAS) et 255 (100% HAUT donc toujours au niveau HAUT).

Pour stopper la génération PWM, simplement faire analogWrite(broche, 0)...

Valeur renvoyée

Aucune.

Notes

Il n'est pas nécessaire de faire appel à l'instruction pinMode() pour mettre la broche en sortie avant d'appeler la fonction analogWrite().

Exemple

Fixer la luminosité d'une LED proportionnellement à la valeur de la tension lue depuis un potentiomètre.

Code *.yno à copier/coller dans l'IDE Pyduino
Voir ici si vous préférez convertir le code Pyduino en code Python pour l'utiliser avec l'éditeur Geany par exemple.


# exemple pyDuino - par X. HINAULT - www.mon-club-elec.fr
# Juin 2013 - Tous droits réservés - GPLv3

# La luminosite d'une LED varie (PWM) en fonction mesure analogique

# entete declarative

#--- setup ---
def setup():
        return # si vide

# -- fin setup --

# -- loop --
def loop():

        #voie A2
        mesure=analogRead(A2) # mesure la voie A2
        tension=rescale(mesure,0,4095,0,3300.0) # voie A2 à A5 = 12 bits (0-4095) sur plage 0-3.3V
        #tension = mesure*3300.0/4095.0 # calcul équivalent

        Serial.println (" Voie A2 = " + str(mesure) + " soit " + str("%.2f" % tension) + " mV." )

        impuls=rescale(mesure,0,4095,0,255) # calcul largeur PWM par rescale 0-4095 vers 0-255
        analogWrite(PWM0, impuls) # applique la largeur fonction de la mesure analogique

        Serial.println("PWM=" + str(impuls)) # affiche largeur

        delay(200)# entre 2 mesures

# -- fin loop --
 

Commentaires utilisateurs

  • L'instruction analogWrite n'écrit pas à proprement parler une valeur analogique en tension mise sur une broche, mais permet de générer des phénomènes de variation "d'allure analogique" en jouant sur la largeur de l'impulsion générée. Pour générer une véritable tension analogique à partir d'une commande numérique, il faut utiliser un circuit intégré externe de conversion numérique analogique (DAC en anglais pour Digital to Analogic converter) qui sera commandé par plusieurs broches numériques.
  • Pour commander des servomoteurs, on utilisera les fonctions dédiées de la librairie PyDuino.

Voir également


Page d'accueil de la référence Pyduino en français

Corrections, suggestions et nouvelle documentation peuvent être postées à l'adresse suivante : support_at_mon-club-elec_point_fr

Cette page a été réalisée par Xavier HINAULT (2013) (www.mon-club-elec.fr) et est sous licence Creative Commons Attribution-ShareAlike 3.0.