GÉNÉRER

des

SONS

Partie 1

 
PICAXE permet de générer des sons ou de lire des airs existants ou, éventuellement, de commander des lecteurs externes.
Dans ce premier article nous allons faire connaissance avec les "fonctions SON", en utilisant seulement le circuit didactique.
MATÉRIEL :
Encore et toujours le circuit didactique :
 
 
Penser à basculer les micro-switchs sur ON.
 
Remarque :
Sur le circuit didactique, la sortie C2 (broche 5) du 08M2 permet de commander un transducteur piézoélectrique.
Ce n'est pas un transducteur sonore d'une qualité exceptionnelle mais il est suffisant pour les premiers essais.
 
 
 
PREMIER PROGRAMME : jouer un air existant
 
Eh oui, PICAXE propose d'origine 3 airs, dont "Happy Birthday".
Sympa, non ?
Vous allez pouvoir épater votre entourage !
 
Dans l'exemple ci-dessous on utilise la fonction [Lire l'air].
 
Aucune difficulté.
Je vous laisse écrire le programme.
 
Bon. OK. Au bout de trois répétitions ça devient lassant, je vous l'accorde.
 
Rien n'empêche d'agrémenter le programme, du genre "variations sur un même thème" :
 
<< LOGICATOR ou BLOCKLY >> 
Cette fois l'air ne sera déclenché que si on appuie brièvement sur le poussoir (entrée C3, broche 4 du 08M2).
 
 
 
 
DEUXIÉME PROGRAMME :
jouer un air enregistré sous forme de texte.
 
Pour cela nous allons utiliser la fonction [Lire air utilisateur].
L'installation de LOGICATOR a créé un répertoire RTTTL qui ne contient pas moins de 700 fichiers de mélodies sous forme de texte (*.txt)
Ces petits fichiers de 1kilo-octets contiennent une description codée simple des mélodies.
La fonction [Lire air utilisateur] est capable de les lire.
 
Le bouton [Ouvrir un fichier] donne accès au répertoire RTTTL.
Le choix d'une mélodie dans la liste va importer le texte de la mélodie dans la fenêtre :
[Données des sonneries RTTTL].
Avouez que PICAXE fait bien les choses.
 
 
 
Complément :
Lorsque vous avez choisi une mélodie (visible dans la fenêtre [Données des sonneries RTTTL]), le bouton [Générer un .Wav] permet de créer un fichier de simulation pour pré-écouter votre choix.
 
En maintenant le bouton [Test] appuyé, le haut parleur de l'ordinateur va diffuser le son de la mélodie.
 
Cette possibilité constitue un pré-contrôle et ne modifie en rien le fonctionnement même du programme.
 
 
Remarque :
 
Les fichiers textes des mélodies (sonneries) peuvent être éditées et modifiées dans un éditeur de texte, comme par exemple "Bloc Note".
Rien n'empêche d'écrire vos propres mélodies.
 

GÉNÉRER

des

SONS

Partie 2

 
Pour générer les trois tons de la sirène on utilise trois fois la fonction [Son].
Chacune des 3 fonctions est paramétrée pour générer la tonalité adéquate pendant 160 ms sur la sortie C2 :
  • note A4 pour le premier et le troisième son,
  • note C5 pour le deuxième son.
 
 
Quésaco "A4", "C5" etc. ?
Pourquoi pas la notation latine "Do,Ré, Mi..." comme nous l'avons apprise  il y a bien longtemps déjà ?
 
Tout simplement parce que LOGICATOR utilise la notation musicale Grégorienne chère à nos voisins anglais et allemands.
 
 
 
Notation musicale grégorienne
 
Tableau des correspondances entre les notations

latine et grégorienne ou anglo-allemande, et leurs fréquences :
[Appeler procédure] :
ARDUBLOCKLY_num-377_(2020-05-05_18-04).p
 
Le tableau complet est ICI.
 
 
Tableau récapitulatif des tonalités françaises normalisées
pour les véhicules de pompiers, police, ambulances,
SAMU et gendarmerie
 
Ce tableau nous a été communiqué par notre camarade José.
 
Ce document est disponible en téléchargement ICI.
Ce tableau comporte aussi des liens internet qui permettent d'écouter les différentes sirènes.
Il donne les caractéristiques de 5 sirènes : police, gendarmerie, SAMU, pompiers, ambulances.
 
Petit extrait : sirène d'ambulance
 
Tonalités telles que les définit la réglementation
 
Les notes les plus proches des fréquences préconisées sont donc A4 (440 Hz au lieu de 420) et C5 (523 Hz au lieu de 516).
N.B. Dans le programme ci-dessus les notes ont été choisies toutes les deux par excès de la fréquence, pour conserver à peu près le même rapport entre les tonalités.
 
 
 
 
Limitations des instructions [SON] de LOGICATOR
 
 
Comme on peut le constater sur le tableau de la notation musicale grégorienne, la gamme s'étend sur 7 octaves plus 3 notes (87 demi-tons), de [A0] à [C8] soit de 27,5 Hz à 4185 Hz.
(Il s'agit de la gamme courante des fréquences musicales fondamentales d'un piano, mais pas de la totalité du spectre sonore).
 
Aïe !!!
 
LOGICATOR n'autorise que la gamme [C1] à [C5] soit une plage de fréquences de 32,7 Hz à 523 Hz.
 
C'est sympa mais très insuffisant pour permettre de programmer les sirènes de police, gendarmerie, et SAMU :
  • police : premier ton = 435 Hz ; deuxième ton = 580 Hz,
  • gendarmerie : premier ton = 435 Hz ; deuxième ton = 732 Hz,
  • SAMU : premier ton = 435 Hz ; deuxième ton = 651 Hz,
 
Sommes-nous en présence d'une impossibilité ?
 
Que nenni !
 
Pas de panique !
 
LOGICATOR a plus d'un tour dans son sac : il s'agit de l'instruction [Code en BASIC] qui va nous permettre de contourner les limitations précédentes.
 
 
Quatrième programme et premières instructions en BASIC :
sirène d'ambulance
Le document fourni pas José va nous aider.
En effet, à la fin du document on trouve les morceaux de codes qui correspondent aux différentes sirènes.
 
La sirène d'ambulance est composée de 3 tons : 420 Hz / 516 Hz / 420 Hz.
 
Pour obtenir ces tons on utilise la fonction BASIC :
PWMOUT,PWMDIV16, broche, période, rapport_cyclique
La documentation de cette fonction dans le manuel français est assez... obscure.

Le chapitre suivant détaille l'utilisation de cette fonction.
Résumé des formules utiles issues de cet article
 
Cette fonction génère un signal en créneaux (PWM) sur la sortie C.2 du 08M2.
Ce signal pourra être perçu comme un son si sa fréquence est située entre 30 et 8000 Hz et si, bien entendu, on a branché un transducteur sur la sortie C2 du PICAXE.
 
On utilise la boite [Code en BASIC] que l'on nome "Ambulance", et on y entre le code BASIC ci-dessous :
 
En quelque sorte, grâce à cette possibilité, nous venons de créer une 
fonction supplémentaire et personnelle.
 
 
Analyse du paramétrage de l'instruction pwmout pwmdiv16, 2, 148, 298
Les formules ci-dessus, appliquées aux 3 tons normalisés 420 Hz,  516 Hz et 420 Hz, permettent le paramétrage de la fonction pwmout.
Remarque : avec l'utilisation de pwmdiv16
période = 1 000 000 / fréquence PWM devient : période = 62500 / fréquence PWM
 
  • Pour le ton à 420 Hz
période = 62500 / 420  soit : période = 148,9
(l'auteur a choisi la valeur 148 ! )
Pour un rapport_cyclique_vrai de 50% (0,5) on calcule le paramètre "rapport_cyclique" :
(rapport_cyclique) = 4 x 149 x 0,5 soit : (rapport_cyclique) = 298
  • Pour le ton à 516 Hz
période = 62500 / 516  soit : période = 121,12
(l'auteur a choisi la valeur 120 ! )
Pour un rapport_cyclique_vrai de 50% (0,5) on calcule le paramètre "rapport_cyclique" :
(rapport_cyclique) = 4 x 121,12 x 0,5 soit : (rapport_cyclique) = 242
 
 
Analyse rapide du programme
La sirène d'ambulance est composée de 3 tons consécutifs d'une durée de 166 millisecondes chacun, suivis d'un temps d'arrêt de 1,5 secondes.
Le petit programme BASIC comporte donc 3 groupes d'instructions du genre :
pwmout pwmdiv16, 2, 148, 298
pause 166
  • la valeur "2" représente la sortie C2, (broche 4) du 08M2, utilisée pour la diffusion du son ;
  • la valeur "148" représente la période totale du signal ;
  • la valeur "298" représente la période de "travail" du signal (duty cycles).
  • pause 166 correspond à l'émission du ton pendant 166 ms.
    (C'est la fonction [Attendre] bien connue dans LOGICATOR).
  • l'instruction pause 1500 correspond à un temps d'attente de 1500 ms (soit 1,5 seconde) avant de redémarrer un nouveau cycle de 3 tons.
  • l'instruction pwmout 2, off bloque la sortie "son" pendant l'attente de 1,5 s.
  • l'instruction du début, setfreq m4, impose au 08M2 de fonctionner à 4 méga-Hertz.
    (c'est en fait le réglage "naturel" du 08M2 et donc on pourrait se passer de cette instruction).
    Si le 08M2 était réglé à 8 mHz par exemple (setfreq m8), tous les sons seraient générés une octave plus haute et les temps d'attente divisés par deux.
 
 
Essais comparés des deux programmes "ambulance"
  • le programme n°3 avec les instructions "son" ;
  • le programme n°4 avec les instructions PWM en BASIC.
 
Note : à la place du buzzer je vous recommande de brancher un petit haut-parleur en série avec une résistance de 47 Ohms / 1/4 Watt. Le son ne sera pas très fort mais de bien meilleure qualité.
Si en plus le petit HP est logé dans une petite boite qui lui sert d'enceinte acoustique, alors là... !
Dans la partie n°3 (article n°14) nous verrons comment obtenir un son plus fort, de façon très simple.
 
Télécharger successivement l'un puis l'autre programme et comparer la qualité sonore :
  • entre chaque son généré par le programme n°3 on entend un petit claquement assez gênant et si on tend l'oreille on constate que le son contient un petit grésillement. Pas très bon tout ça !
     
  • le son généré par le petit programme en BASIC est d'une bien meilleure qualité.
    Pas de grésillement.
    Pas de claquement entre chaque note et un timbre plus agréable à l'oreille et plus proche du réel.
 
D'autre part, grâce au paramétrage des instructions pwmout pwmdiv16, 2, x, y on respecte mieux les fréquences "officielles".
 
 
Pour les bidouilleurs :
 
Dans l'instruction pwmout pwmdiv16, 2, 148, 298 le paramètre 298 correspond au rapport travail / repos du signal sonore PWM.
Amusez-vous à le modifier, entre 50 et 500 par exemple (soit un rapport_cyclique_vrai d'environ 8% à environ 84%) : la fréquence du son va rester la même mais le timbre  va changer ⇒ plus "rond", plus "sec", plus "métal" suivant la valeur du paramètre.
Essayez. Ça vaut la peine.
En quelque sorte, et dans une faible mesure, ce paramètre permet un filtrage du son en faisant varier sa composition en fréquences harmoniques.
 
 
POLICE, GENDARMERIE, SAMU, POMPIERS
 
Extraits du document "Tableau récapitulatif des tonalités françaises", voici les 6 bouts de programmes que vous pouvez copier/coller dans la boite de paramétrage de la fonction [Code en BASIC] :
Sirène d'ambulance (exemple traité dans cet article)
setfreq m4
pwmout pwmdiv16, 2, 148, 298
pause 166
pwmout pwmdiv16, 2, 120, 242
pause 166
pwmout pwmdiv16, 2, 148, 298
pause 166
pwmout 2, off
pause 1500
Sirène de police
setfreq m4
pwmout pwmdiv16, 2, 143, 287
pause 545
pwmout pwmdiv16, 2, 127, 256
pause 545

 
Sirène de gendarmerie
setfreq m4
pwmout pwmdiv16, 2, 143, 287
pause 545
pwmout pwmdiv16, 2, 84, 171
pause 545

 
 
Sirène du SAMU
setfreq m4
pwmout pwmdiv16, 2, 143, 286
pause 545
pwmout pwmdiv16, 2, 95, 190
pause 545
 
Sirène de pompiers
setfreq m4
pwmout pwmdiv16, 2, 143, 287
pause 1070
pwmout pwmdiv16, 2, 127, 256
pause 1070
 
Sirène de pompiers américains
setfreq m4
b2=205
w9=b2*2
b4=65
b5=205
do
random w10                          'w10= (b21, b20)
w10=5*b20 +400                   'w10 aléatoire de 0 à 765
do
dec b2                                  'glissement fréquence
w9=b2*2                               'rapp cyclique 50%
pwmout pwmdiv16, 2, b2, w9
pause 30
loop while b2>b4                    'b4=65 -->940 Hz
pause w10
random w10                           '(b21,b20)
w10=4*b20                            'B20 = 0 à 255 --> w10= 0 à 765
b21=b21//4                            'b21=0,1,2
b5=51*b21+100                     'b5 aléatoire
do
inc b2 w9=b2*2
pwmout pwmdiv16, 2, b2, w9
pause 50
loop while b2<b5                    'b5=205-->303Hz; 253-->246Hz
loop
 
N.B. tous ces programmes ont été testés et fonctionnent correctement.
 
 
Conclusion
 
En dehors du programme "Sirène de pompiers américains", les autres programmes BASIC sont très simples.
Simples à comprendre mais aussi très simples à modifier.
Il ne faut pas se priver de les adapter pour d'autres besoins.
 
 
Et surtout, ne vous privez plus de contourner les limitations de LOGICATOR (ou de BLOCKLY) en créant vos propres bouts de programmes en BASIC.
 

Fonction

PWMOUT

 
 
(Cet article n'est pas un sujet d'exercice. C'est juste une explication)
 
 
PWMOUT, broche, période, rapport_cyclique
PWMOUT,PWMDIV4, broche, période, rapport_cyclique
PWMOUT,PWMDIV16, broche, période, rapport_cyclique
PWMOUT,PWMDIV64, broche, période, rapport_cyclique
PWMOUT, broche, OFF
 
Que sont les paramètres "période" et "rapport_cyclique" ?
On s'attend logiquement à ce que "période" soit exprimée en secondes et "rapport_cyclique" en %.
Eh bien pas du tout !
 
En réalité, le manuel PICAXE, en français ou en anglais, entretient un certaine confusion dans les termes.
 
Dans l'explication de la fonction pwmout on peut par exemple lire ceci : 

« -- Période est une constante ou une variable (0 à 255) définissant la période (fréquence) du PWM. ».
Cette phrase est un chef-d'oeuvre !
On y confond "période" et "fréquence". On y utilise le même mot "période" pour désigner le paramètre de la fonction pwmout et la période effective du signal (en secondes) !
Note importante : si les développements mathématiques vous font cet effet là...
gaston4.jpg
... cliquez sur la tête de Gaston pour allez tout de suite à l'essentiel.
Essayons d'y voir clair
J'ai été aidé par la traduction du manuel en tchèque. Eh oui !
Les formules y sont écrites ainsi :
perioda PWM = (period + 1) x 4 x perioda procesoru 
plnění PWM = (duty) x perioda procesoru
perioda procesoru = 1 / frekvence procesoru
perioda procesoru pro frekvenci 4 MHz = 1/4 000 000 s = 0,25 µs
 
 
  • "période" est le paramètre de la fonction pwmout. C'est une constante ou une variable qui peut prendre les valeurs 0 à 255 ;
  • "période_PWM" est la vraie période du signal PWM, exprimée en secondes ;
  • "fréquence PWM" est la vraie fréquence du signal PWM, exprimée en Hz ;
  • "vitesse d'horloge" est en réalité la "période de l'horloge du PICAXE".
    Elle est égale à "1 / fréquence d'horloge du PICAXE"
    (perioda procesoru = 1 / frekvence procesoru en tchèque).
 
période_PWM = (période+1) x 4 x vitesse horloge
devient donc :
période_PWM = (période + 1) x 4 / fréquence d'horloge du PICAXE
et
période_PWM = 1 / fréquence PWM
(en secondes)                   (En Hz)
 
Note : pour les calculs qui suivent on admet que (période + 1) est quasiment égale à (période).
Pour les puristes, dans toutes les formules qui suivent, il suffit de remplacer (période) par (période + 1).
 
Donc, en combinant les 2 formules, et pour une fréquence d'horloge de 4 MHz, on obtient la formule suivante :
 
1 / fréquence PWM = période x 4 / fréquence d'horloge du PICAXE
1 / fréquence PWM = période / 1 000 000
 
PWMDIVxx 
Un autre paramètre intervient : pwmdiv.
Ce paramètre optionnel peut prendre les valeurs pwmdiv4, pwmdiv16 ou pwmdiv64.
Les nombres 4, 16 ou 64 interviennent comme des diviseurs de la fréquence d'horloge du PICAXE.
Si on utilise le paramètre pwmdiv4, la formule ci-dessus devient : 
période = 1 000 000 / 4 / fréquence PWM
période = 250 000 / fréquence PWM
Si on utilise le paramètre pwmdiv16 : 
période = 1 000 000 / 16 / fréquence PWM
période = 62500 / fréquence PWM
Si on utilise le paramètre pwmdiv64 : 
période = 1 000 000 / 64 / fréquence PWM
période = 15625 / fréquence PWM
... et bien entendu :
fréquence PWM = [250 000] ou [62500] ou [15625] / période
 
L'utilisation de ces paramètres permet de produire des fréquences PWM basses.
Voici les fréquences minimales qu'on peut obtenir avec les différents paramètres :
  • sans pwmdiv : fréquence PWM minimale = 1 000 000 / 255 soit environ 3920 Hz
  • avec pwmdiv4 : fréquence PWM minimale = 250 000 / 255 soit environ 980 Hz
  • avec pwmdiv16 : fréquence PWM minimale = 62500 / 255 soit environ 245 Hz
  • avec pwmdiv64 : fréquence PWM minimale = 15625 / 255 soit environ 61 Hz
 
 
 
rapport_cyclique, "duty cycles", PWM duty cycle, etc.
Ici encore les deux notices (la française en particulier) entretiennent une confusion coupable sur les termes.
La notice anglaise  précise :
PWMOUT,PWMDIV4, pin, period, duty cycles
... et donne la relation :
PWM duty cycle = (duty) x resonator speed.
 
 
La notice française dit :
PWMOUT,PWMDIV4, broche, période, rapport_cyclique
... et donne la relation :
rapport_cyclique_PWM = (rapport_cyclique) x vitesse horloge.
 
 
Que recouvrent les dénominations "rapport_cyclique_PWM" et (rapport_cyclique) ?
... et les mêmes en anglais ?
 
 
 
  • (rapport_cyclique) = (duty cycles) = (duty)
 
Tel que le terme est employé dans la formule, ce n'est en aucun cas un rapport entre 2 grandeurs.
En effet :
– dans le cas d'une fréquence PWM, le vrai rapport cyclique c'est le rapport entre la période de conduction et la période totale de l'onde, ces deux grandeurs étant exprimées en secondes,
⇒ s'il est exprimé en décimal, ce rapport peut prendre des valeurs de 0 à 1 au maximum,
⇒ s'il est exprimé en "%", il peut prendre des valeurs de 0% à 100% au maximum,
... alors que, dans la fonction pwmout :
– la gamme des valeurs de ce paramètre, s'étend de 0 à 1023,
– cependant sa valeur ne peut en aucun cas être supérieure à 4 fois la valeur du paramètre "période",
– il permet au microcontrôleur de calculer la vraie durée pendant laquelle l'impulsion est "ON".
 
​Vous suivez toujours ?
Bon, alors je vous en remets une couche (petite) :
 
  • "PWM duty cycles", alias "rapport_cyclique_PWM"
Ben ce n'est pas non plus – comme on pourrait s'y attendre – le vrai rapport cyclique.
C'est en réalité la valeur de la période "ON" d'une alternance PWM, exprimée en secondes.
 
... oui, moi aussi !
Comment va-t-on se sortir de ce merdier ? 
Cool ! Le dénouement est proche.
 
Reprenons les deux formules sous leur forme francisée :
période_PWM = (période + 1) x 4 / fréquence d'horloge du PICAXE
rapport_cyclique_PWM = (rapport_cyclique) x vitesse horloge.
Compte-tenu de ce qui précède et après simplification, on devrait les écrire :
 
période_PWM = (période) x 4 / fréquence d'horloge du PICAXE (4)
période "ON" PWM = (rapport_cyclique) / fréquence d'horloge du PICAXE (5)
(En bleu les dénominations douteuses mais qu'on n'a pas le choix d'employer).
 
 
Or la voici notre porte de sortie. (Qui a dit «... enfin ! » ? Si, si, j'ai entendu ! ) 
 
En effet, période_PWM et période "ON" PWM sont précisément liées par le "rapport_cyclique_vrai".
Nous sommes bien forcés de l'appeler ainsi, pour le distinguer de "rapport_cyclique", le paramètre.
 
(rapport_cyclique_vrai) = période "ON" PWM / période_PWM 
Ah ! nous y voilà !
période "ON" PWM (4) = (rapport_cyclique_vrai) x période_PWM (5)
Ce qui est vrai pour les premiers membres l'est aussi pour les deuxièmes membres :
(rapport_cyclique) / fréquence d'horloge du PICAXE (4) =
(rapport_cyclique_vrai) x période x 4 / fréquence d'horloge du PICAXE (5)
 
soit, après simplification : 
 
 (rapport_cyclique) = 4 x période x (rapport_cyclique_vrai) (2) 
(rapport_cyclique_vrai) est exprimé sous forme décimale. Il est compris entre 0 et 1.
(période), le paramètre, est compris entre 0 et 255.
(rapport_cyclique) est compris entre 0 et 1023.
 
En résumé
Je vois que vous avez cliqué sur la tête de Gaston !
Non ? Hé bien vous êtes sacrément courageux. Félicitations.
En résumé, vous pouvez respirer à fond et oublier tout ce qui précède !
Les trois formules ci-dessous suffiront à votre bonheur :
 
 
 
Si on utilise pwmdivxx, la première formule s'écrira :
période = 250 000 / fréquence PWM  avec pwmdiv4
période = 62500 / fréquence PWM avec pwmdiv16
période = 15625 / fréquence PWM  avec pwmdiv64
 
 
 
Remarque concernant le paramètre "rapport_cyclique"
Il ne dépend en fait que du paramètre "période" et du "rapport_cyclique_vrai" (2).
Si on veut modifier la fréquence du signal PWM  donc la valeur du paramètre "période" – tout en maintenant un "rapport_cyclique_vrai" constant, il faudra aussi modifier la valeur du paramètre "rapport_cyclique".
Exprimé autrement : 
pour maintenir constant un "rapport_cyclique_vrai", le paramètre "rapport_cyclique" varie si le paramètre "période" varie.
 
Exemples d'écritures de la fonction pwmout
– fréquence PWM souhaitée = 100 Hz
– rapport_cyclique_vrai = 50%, soit 0,5
⇒ on utilise pwmdiv64
⇒ période = 15625 / 100, soit période = 156
⇒ rapport_cyclique = 4 x 156 x 0,5, soit rapport_cyclique = 312
On obtient : pwmout,pwmdiv64, [n° sortie],156, 312 
 
 
– fréquence PWM souhaitée = 1000 Hz
– rapport_cyclique_vrai = 50%, soit 0,5
⇒ on utilise pwmdiv16
⇒ période = 62500 / 1000, soit période = 62 (ou 63)
⇒ rapport_cyclique = 4 x 62 x 0,5, soit rapport_cyclique = 124
On obtient : pwmout,pwmdiv16, [n° sortie], 62, 124 
 
ou bien on utilise pwmdiv4 :
 
⇒ période = 250000 / 1000, soit période = 250 (c'est juste inférieur à 255, donc c'est OK)
⇒ rapport_cyclique = 4 x 250 x 0,5, soit rapport_cyclique = 500
On obtient : pwmout,pwmdiv4, [n° sortie], 250, 500
 
ou bien on utilise pwmdiv64 :
⇒ période = 15625 / 1000, soit période = 16
⇒ rapport_cyclique = 4 x 16 x 0,5, soit rapport_cyclique = 32
On obtient : pwmout,pwmdiv64, [n° sortie], 16, 32
 
Décryptage de l'écriture d'une fonction pwmout
période = 1 000 000 / fréquence PWM (1)  donc :
fréquence PWM = 1 000 000 / période
(rapport_cyclique) = 4 x période x (rapport_cyclique_vrai) (2) donc :
 
(rapport_cyclique_vrai) = (rapport_cyclique) / 4 / période
 
pwmout, [n° sortie], 16, 32
fréquence PWM = 1 000 000 / 16 donc fréquence PWM = 62500 Hz
rapport_cyclique_vrai = 32 / 4 / 16 donc rapport_cyclique_vrai = 0,5 soit 50%
pwmout, [n° sortie], 32, 32
fréquence PWM = 1 000 000 / 32 donc fréquence PWM = 31250 Hz
rapport_cyclique_vrai = 32 / 4 / 32 donc rapport_cyclique_vrai = 0,25 soit 25%
pwmout, [n° sortie], 120, 240
fréquence PWM = 1 000 000 / 120 donc fréquence PWM = 8333 Hz
rapport_cyclique_vrai = 240 / 4 / 120 donc rapport_cyclique_vrai = 0,5 soit 50% (encore)
pwmout, [n° sortie], 250, 1000
fréquence PWM = 1 000 000 / 250 donc fréquence PWM = 4000 Hz
rapport_cyclique_vrai = 1000 / 4 / 250 donc rapport_cyclique_vrai = 1 soit 100% 
⇒ rapport_cyclique = 4 x période et dans ce cas, la sortie est "ON" en permanence.
pwmout,pwmdiv64, [n° sortie], 60, 180
fréquence PWM = 15625 / 60 donc fréquence PWM = 260 Hz
rapport_cyclique_vrai = 180 / 4 / 60 donc rapport_cyclique_vrai = 0,75 soit 75% 
pwmout,pwmdiv16, [n° sortie], 240, 720
fréquence PWM = 62500 / 240 donc fréquence PWM = 260 Hz
rapport_cyclique_vrai = 720 / 4 / 240 donc rapport_cyclique_vrai = 0,75 soit 75%
pwmout,pwmdiv16, [n° sortie], 240, 96
fréquence PWM = 62500 / 240 donc fréquence PWM = 260 Hz
rapport_cyclique_vrai = 96 / 4 / 240 donc rapport_cyclique_vrai = 0,1 soit 10%
 
 
 
PWMDUTY
PWMDUTY, broche, rapport_cyclique
 
Cette fonction est associée à pwmout.
Elle permet d'agir sur le rapport_cyclique de la fonction pwmout en cours de fonctionnement sur la même broche, sans ré-écrire toute la fonction pwmout. 
Exemple
Init: 
pwmout C.2, 150, 100 ; sortie pwm sur la broche C.2, à 6600 Hz environ 
                        ; et rapport_cyclique_vrai = 16%
do                      ; début de boucle 
pwmduty C.2, 150     ; augmente le rapport_cyclique_vrai à 25% 
pause 1000           ; pause 1 s 
pwmduty C.2, 50      ; diminue le rapport_cyclique_vrai à environ 8% 
pause 1000           ; pause 1 s 
loop                    ; fin de boucle do
 
⇒ si une LED est branchée sur C.2, son éclat variera entre 8 et 25%, sur un rythme de 1 seconde.
 

Générer

des

sons

Partie 3

 
 
PRÉAMBULE :
 
PICAXE offre encore quelques autres possibilités de générer des sons.
Cependant ne rêvons pas trop : à lui tout seul, un PICAXE ne jouera pas un air avec la qualité MP3 ou WAV.
En effet les signaux générés sont de forme "carrée" et sur un seul canal.
On obtient grâce à cela une bonne approche des sirènes de police et autres pompiers... et pour cause : les vraies sirènes sont à base de signaux carrés.
Buzzers, alertes sonores, bips et autres tut-tut sont le domaine privilégié du PICAXE.
On pourra même obtenir, si on se débrouille bien, une approximation raisonnable du bruit de la soudure à l'arc ou du tintement d'une cloche.
 
Cependant le meuglement des vaches, la sonnerie du passage à niveau, le bruit d'un train qui passe... sont hors de son champ d'applications.
Il faudra pour cela recourir à des dispositifs extérieurs prévus ou pas pour être pilotés par PICAXE.
Les fonctions LOGICATOR et BASIC  existent. Les accessoires aussi :
Module VMusic2 - [USB030]  [RAX-USB030] chez A4 technology
... ou chez Gotronic
 
Ces possibilités ne seront pas traitées ici.
 
 
 
AMPLI SON "PUSH-PULL" ULTRA-SIMPLE :
 
Dans les deux parties précédentes c'est le circuit didactique seul qui actionnait le haut-parleur, à travers une résistance de 47 Ohms sur la sortie C2.
Le volume sonore obtenu est très faible mais on ne peut pas faire plus : la sortie C2 est déjà largement assez chargée.
Disons que c'était un pis-aller.
 
Voici un amplificateur de puissance ultra-simple avec seulement 5 composants.
Il est de type "push-pull", sans aucune fioriture autour.
Tout ce qu'on lui demande c'est de commuter le haut-parleur alternativement au +5Volts et au zéro Volt, conformément au signal de la sortie C2 mais avec une capacité en courant bien supérieure.
 
Ah ! j'avais prévenu : c'est brutal !
 
Description très rapide du schéma :
C'est un ampli de commutation. On ne lui demande pas de jouer La Traviata !
  • les deux transistors doivent pouvoir supporter au moins 1 Ampère (BD 433 et 434 par exemple),
  • ils n'ont pas besoin d'être équipés de radiateur puisqu'ils fonctionnent en commutation,
  • la résistance de 220 Ohms est là par sécurité. On peut s'en passer mais en cas de court-circuit accidentel la sortie C2 sera protégée et son courant sera limité à environ 20 mA.
  • le condensateur polarisé assure la liaison avec le haut-parleur. Sa valeur n'est pas critique mais il est raisonnable de ne pas descendre en dessous de 47 µF.
  • le haut-parleur est en série avec une résistance. Sa valeur sera déterminée ci-après.
    Cette résistance est directement soudée sur le HP. Cela facilite son remplacement si on doit modifier la puissance du son.
     

Pas très académique tout ça ! Explications :
 
En fait, avec ce type de montage en commutation, le haut-parleur est alimenté par un signal d'amplitude 5 Volts.
Sans entrer dans des calculs exacts de valeur efficace ou de valeur RMS on s'aperçoit que, dans ces conditions, un HP d'impédance 8 Ohms est parcouru par un courant de plus de 600 mA.
Si l'impédance du HP est 4 Ohms, ce courant est de l'ordre de 1200 mA !
 
... et la puissance ?
 
De l'ordre de 3 Watts pour un HP de 8 Ohms et environ 6 Watts pour un HP de 4 Ohms !
Aïe !!! les voisins ne vont pas être contents !
Le HP non plus.
 
Il est donc impératif de limiter le courant dans le haut-parleur. C'est le rôle de la résistance de 10 à 47 Ohms.
 
En fait, pour une écoute HiFi confortable en appartement, on sait que la puissance moyenne fournie aux enceintes acoustiques va de 0,1 Watt à 2 Watts par canal.
0,25 Watts, c'est bien.
2 Watts c'est déjà fort.
 
Pour un HP d'impédance 8 Ohms il suffira donc qu'il soit actionné par une tension  U telle que  :
U² = P x R(HP) soit U² = 0,25 x 8
U² = 2
U(HP) = 1,4 Volts
La résistance talon devra absorber la différence soit environ (5 - 1,4) = 3,6 Volts.
Cette résistance sera de l'ordre de :
R = (3,6/1,4) x 8 soit environ 20 Ohms
On choisira une résistance talon de 22 Ohms / 1 Watt
 
 
Les mêmes calculs sommaires donnent les valeurs suivantes pour un HP d'impédance 4 Ohms :
U² = P x R(HP) soit U² = 0,25 x 4
U² = 1
U(HP) = 1 Volts
R = (5-1)/1 x 4 soit environ 16 Ohms
On choisira une résistance talon de 15 ou 18 Ohms / 1 Watt
 
Si on veut réduire ou augmenter le volume sonore on fera varier la valeur de la résistance talon autour de la valeur ci-dessus.
Je recommande de ne pas descendre en dessous de 10 Ohms dans l'un et l'autre cas.
 
 
Remarques :
Tout d'abord les calculs ci-dessus sont volontairement très simplifiés.
Les spécialistes de la sonorisation ou les profs d'électrotechnique y trouveront certainement à redire.
Qu'ils me pardonnent de ne pas avoir été puriste.
 
D'autre part on peut reprocher à ce montage de ne pas posséder de potentiomètre de réglage de volume.
 
Cela dit, pour une animation sonore sur un réseau ferroviaire, a-t-on besoin de régler le volume du son en permanence ?
Une fois, et ensuite plus jamais.
La résistance talon s'acquitte très très bien de cette tâche. C'est simple et pas cher.
 
 
 
UN PROTOTYPE DE L'AMPLI PUSH-PULL :
 
Pour un premier essai on peut se contenter de monter les composants de l'ampli PUSH-PULL sur une plaquette d'essai en bakélite pré-percée, à bandes.
 
La résistance talon de 10 à 47 Ohms n'est pas montée sur cette plaquette. Elle est soudée sur une des cosses du haut-parleur.
 
Voici deux vues de cette petite plaquette qui mesure environ 15 x 32 mm.
 
La vue de dessous montre les trois interruptions des pistes.
Leur emplacement est aussi visible sur la vue de dessus, sous forme de pastilles argentées.
 
 
Vous savez quoi ?
Il ne reste plus qu'à RE-essayer les programmes sonores des parties 1 et 2 en utilisant cet ampli.
 
 
Complément :
 
Pour ceux qui désirent un "vrai" ampli avec réglage du volume etc., voici un lien vers un excellent article sur le site de SONELEC :
 
http://www.sonelec-musique.com/electronique_realisations_ampli_bf_003.html
 
L'ampli proposé dans cette description est basé sur un LM386.
C'est un composant bon marché et facile à mettre en œuvre.
 
Si vous êtes tenté par des puissances supérieures ou si tout simplement vous disposez d'autres modèles de circuits intégrés, SONELEC propose une série d'amplificateurs de 0,5 à 100 Watts :
 
http://www.sonelec-musique.com/electronique_realisations_amplis.html
 
 
 
 
Matériel
Le petit circuit didactique AXE092 a déjà rendu de grands services et il va continuer à le faire.

PICAXE

et

INFRAROUGE

Partie 1

 
 
Circuit additionnel pour détecteur infrarouge :
 
Un petit ajout va permettre de l'utiliser avec la télécommande infrarouge.
 
Il suffit de construire une petite plaquette pour le détecteur infrarouge TSOP4838 et les composants associés :
(Cliquer sur les images pour agrandir)
La vue de dessous montre les deux interruptions de pistes.
Le détecteur TSOP peut être soudé directement sur la plaquette d'essai en bakélite pré-percée à bandes.
 
Pour les inconditionnels du circuit imprimé voici le dessin du PCB, vu depuis le côté composants :
IR_SENSOR_1.bmp
 
La télécommande TVR010 :
C'est la partie émettrice des ordres infrarouges.
PICAXE est pré-programmé pour décoder les informations infra-rouges à 38 kHz, norme TV SONY.
D'autres télécommandes universelles peuvent être employées à la place de la TVR010 pour autant qu'on puisse les régler sur cette norme.
Le mode d'emploi rapide de la télécommande TVR010 est téléchargeable ICI.
 
 
CONNECTER LE CIRCUIT DE DÉTECTION INFRAROUGE SUR AXE092 :
 
L' AXE092 dispose d'une rangée de connexions, au bord du circuit, sur lesquelles sont ramenées les alimentations, les sorties C1, C2 et les entrées C3, C4 :
08mecole-3.jpg
axe092_3.jpg
 
Le petit circuit du détecteur infrarouge sera relié sur ces connexions
(entourées en jaune sur l'image de droite) :
  • sortie C3 du circuit de détection IR vers l'entrée "3" du circuit AXE092 ;
  • le circuit de détection prend son alimentation sur "0V" et "V+" de AXE092 ;
  • switchs SW2-1 et SW2-2 sur ON ;
  • switchs SW2-3 et SW2-4 sur OFF.
 
Ainsi le capteur infrarouge ne sera pas "gêné" par le switch SW2-3.
Par contre les 3 LED's sont disponibles pour visualiser les sorties.
 
 
 
NOUVELLES FONCTIONS LOGICATOR :
 
[Entrée Infrarouge] :
La fonction qui permet au PICAXE de décoder les ordres infrarouges s'appelle [Entrée Infrarouge] et se trouve dans [Autres E/S].
Programme_IR_1.png
 
(cliquer sur l'image pour agrandir)
 
  • la boite de dialogue de droite indique que c'est l'entrée 3 (C3) qui est concernée.
    Conserver ce réglage : C3 est la seule entrée du 08M2 qui peut recevoir et décoder les signaux infrarouges.
  • le code IR sera stocké dans la variable "A". On ne change rien pour l'instant ;
  • le temps écoulé est à "0". Ne rien changer.
    L'utilité de ce paramètre sera expliquée ultérieurement.
  • décocher la case "Activer la compatibilité..." (voir remarque ci-dessous) ;
  • le bouton [?] permet d'ouvrir la boite de gauche qui récapitule les codes disponibles sur la TVR010.
     
 
Remarque importante :
La table des codes montre qu'il y a un décalage de 1 entre le n° des touches et le code qu'elles renvoient :
 
code IR = touche numérique - 1.
 
L'activation de la compatibilité rétablit la correspondance exacte.
Conseil personnel : décocher SYSTÉMATIQUEMENT la case de compatibilité.
En effet, la compatibilité apporte d'autres inconvénients :
  • l'activation de la compatibilité décale TOUS les codes, et donc il faudra être très attentif quand on utilise les autres touches ;
  • par programmation interne au PICAXE, la compatibilité ajoute "1" à chaque passage dans l'instruction [Entrée Infrarouge].
    Si, comme c'est presque toujours le cas, cette instruction est incluse dans une boucle de programme, la variable "A" sera incrémentée à notre insu et on aura parfois du mal à comprendre pourquoi les tests sur cette variable "A" ne donnent pas les résultats escomptés.
 
 
[EXPRESSION] :
Instruction_EXPRESSION.png
 
 
Cette instruction se trouve dans le volet [Variables].
 
Elle permet d'assigner une expression mathématique à une variable.
Les variables "A" à "T" peuvent prendre des valeurs de 0 à 255.
 
 
[COMPARER] :
Instruction_COMPARER.png
 
 
Cette instruction se trouve dans le volet [Variables].
 
Elle permet de comparer la valeur d'une variable à une valeur chiffrée entre 0 et 255 ou à une autre variable.
Plusieurs opérateurs mathématiques possibles  :
 
=  <  >  <=  >=  <>
 
 
[BASCULER] :
Instruction_BASCULER.png
 
 
Cette instruction se trouve dans le volet [Variables].
 
Elle permet de changer l'état de la sortie choisie :
La sortie devient active si elle était inactive.
La sortie devient inactive si elle était active.
 
 
PREMIER PROGRAMME :
 
Objectif du programme :
  • un appui court sur les touches "1", "2" et "3" fait allumer respectivement les LED's rouge, jaune et verte (sorties C0,C1 et C2) ;
  • un deuxième appui sur ces touches fait éteindre les LED's correspondantes ;
  • le programme attend indéfiniment le code infrarouge suivant.
 
 
 
Programme LOGICATOR :
Programme_IR_2.png
 
 
Analyse du programme :
  • [A=255] force la variable A à une valeur hors du champ des codes IR possibles. C'est une initialisation.
  • la fonction [Entrée Infrarouge] attend indéfiniment l'arrivée d'un code. (elle boucle à l'intérieur d'elle-même)
    Le programme ne se poursuit que si un code est reçu.
  • la fonction [Attendre 0,5] permet d'avoir le temps de relâcher la touche de la télécommande.
    Autrement dit l'appui sur une touche de la télécommande ne doit pas durer plus de 0,5 secondes sans quoi le code de la même touche est de nouveau détecté et la sortie re-bascule.

    Essayez de rester appuyé en permanence sur une touche. C'est amusant.
     
  • si le code reçu est "0" (c'est la touche "1" de la télécommande qui a été actionnée) ⇒ on agit sur la sortie C0 (LED rouge) ;
  • sinon on teste si c'est le code "1" qui a été reçu (touche 2 de la TVR010) ⇒ on agit sur la sortie C1 (LED jaune) ;
  • etc. ;
  • si aucun des trois codes attendus n'a été détecté alors on retourne attendre un nouveau code.
 
 
NOTES :
 
Ce tandem TVR010 / 08M2 fonctionne, comme la télécommande de votre téléviseur, par signaux codés à 38kHz ce qui procure de nombreux avantages par rapport à des commandes optiques non codées :
  • insensibilité à la lumière ambiante ;
  • grande distance de détection : plusieurs mètres même en utilisant la réflexion sur les murs !
  • possibilité de transmettre une vingtaine d'ordres différents avec un seul boitier de télécommande.
Les micro-contrôleurs de la série PICAXE sont programmés en interne pour pouvoir aussi émettre des codes infrarouges à la norme TV SONY.
Ceci permet d'exploiter au total 127 codes différents.
On peut donc imaginer par exemple des barrières lumineuses infrarouges codées, donc très sûres, qui utilisent des codes hors de ceux de la TVR010.
 
 
Version BLOCKLY
(ajoutée le 8 mai 2016)
 
Sympa, non ?
 
Je sens que vous entrevoyez des possibilités attrayantes !
 

PICAXE

et

INFRAROUGE

Partie 2

 
INFRAROUGE ET MULTI-TÂCHES
 
MATÉRIEL :
Encore et toujours le circuit didactique AXE092 auquel s'ajoute le petit circuit du détecteur infrarouge.
UN CODE POUR ACTIVER, UN AUTRE POUR DÉSACTIVER :
 
Le programme précédent (partie 1) a un tout petit défaut : on constate un phénomène d'allumages et d'extinctions successifs aussi longtemps que dure l'appui sur la touche, au delà de 0,5 secondes.
 
Ce défaut disparaît si on utilise deux codes différents, un pour activer et un pour désactiver.
 
Objectif du programme ci-dessous :
  • Le code 1 (touche 2) active la sortie C0
  • Le code 2 (touche 3) active C1
  • Le code 3 (touche 4) active C2
  • Le code 0 (touche 1) désactive les trois sorties.
La désactivation des trois sorties est donc commune.
Ce n'est qu'un exercice.
 
Analyse rapide du programme :
  • la fonction infrarouge attend indéfiniment un code ( [Temps écoulé] = 0) ;
  • à la réception d'un code les fonctions de tests traitent le code pour décider de l'action à effectuer ;
  • le programme retourne attendre un nouveau code ;
  • si on reste appuyé longtemps sur une touche il ne se passe rien de plus : le même code engendre LA MÊME action.
 
Important à retenir :
  • le test et le déclenchement de l'action correspondante ne durent que quelques micro-secondes ;
  • cette action est mémorisée tant qu'un code valide ne vient pas la modifier.
 
 
On peut retirer un petit avantage de ce mode de fonctionnement : dans des conditions difficiles de transmission (distance importante, récepteur IR partiellement masqué) l'appui long sur la touche "donne des chances supplémentaires" que le dialogue entre émetteur et récepteur IR s'établisse.
 
Remarque : l'instruction [Attendre 0,5 s] est maintenant inutile. On peut la supprimer.
 
UN PROGRAMME POUR FAIRE CLIGNOTER UNE SORTIE :
Objectif :
  • l'appui sur la touche 2 (code 1) enclenche le clignotement de la sortie C1, avec un tempo de 1 s + 1 s ;
  • l'appui sur la touche 1 (code 0) stoppe le clignotement.
 
 
Description du fonctionnement du  programme :
  • comme d'habitude, avant la fonction infrarouge, on initialise la variable « A » avec la valeur 255 ;
  • la boucle de clignotement commence juste en dessous ;
  • cette boucle contient OBLIGATOIREMENT l'instruction [Entrée infrarouge], sans quoi il serait impossible d'intercepter le code qui stoppe la séquence de clignotement ;
  • la première instruction de test provoque la sortie de la boucle si le code reçu est « 0 » ;
  • la deuxième empêche d'attaquer la séquence de clignotement si le code reçu est différent de « 1 ».
 
Un problème se pose pourtant :
Lorsque la séquence de clignotement aura été parcourue 1 fois, le programme reviendra sur l'instruction [Entrée infrarouge].
Or, quand le paramètre [Temps écoulé] vaut 0, cette instruction est BLOQUANTE et le cycle s'arrête.
Pour éviter cela on règle ce paramètre sur [Temps écoule] = 0,1 seconde.
De cette façon l'instruction [Entrée infrarouge] attendra l'arrivée d'un code pendant 1/10 ème de seconde.
 
En l'absence de réception d'un nouveau code, l'exécution de la boucle se poursuit avec l'ancienne valeur de la variable « A ».
 
Remarque : dans la partie 1 j'avais fortement recommandé de ne pas activer la compatibilité entre le n° de touche et le code reçu.
Eh bien c'est précisément pour des cas comme celui-ci : si on oublie de décocher la case de compatibilité, la variable « A » sera incrémenté de « +1 » à chaque passage dans la fonction [Entrée infrarouge] et les tests qui suivent seront inopérants ou donneront des résultats inattendus.
Autre remarque : le temps d'attente de 0,1 seconde dans l'instruction infrarouge vient s'ajouter au temps du cycle de clignotement.
C'est pourquoi le temps d'attente après la désactivation est ramené à 0,9 seconde puisqu'il précède directement le temps d'attente de 0,1 seconde de l'instruction infrarouge. Le total des deux fait donc bien 1 seconde.
 
Que penser de ce petit programme ?
Pas que du bien !
Son principal handicap est qu'avec cette structure de programme on peut commander UNE séquence de clignotement mais pas plus.
Dommage !
Eh puis cette imbrication acrobatique de la fonction infrarouge dans la boucle de clignotement n'est pas très élégante.
Si, a la place d'un simple clignotement lent, la séquence demande une rapidité d'exécution, le temps d'attente de 1/10 ème de seconde dans l'instruction infrarouge va "plomber" le déroulement de cette séquence ou même la rendre impossible.
 
Deuxième handicap, et non des moindres :
La séquence de clignotement dure 1,9 seconde.
Si on cherche à en sortir alors que le programme vient juste d'activer la sortie C0, il faudra rester appuyé 1,9 seconde — et même un peu plus — sur la touche 1 (code 0) pour que le code IR soit pris en compte !
Pas très sympa.
Tout cela parce que la fréquence de scrutation de l'entrée infrarouge est beaucoup trop lente.
La boucle [Entrée infrarouge] → [Test] → [Actions] doit absolument être parcourue le plus rapidement possible.
⇒ cette boucle ne doit donc comporter que des actions mémorisables et courtes. Pas de temporisations.
 
Le paragraphe suivant traite de cela.
 
Eh oui, on apprend AUSSI avec les choses qui ne marchent pas bien !
 
 
 
LE MÊME PROGRAMME, PLUS ÉLÉGANT ET PLUS EFFICACE :
 
Il utilise les possibilités multi-tâches des PICAXES.
 
La séquence de clignotement est assurée pas la tâche [Début1],
Plus simple, on peut pas : une toute petite boucle qui fait basculer la sortie C0 toutes les 0,5 seconde.
C'est un programme autonome.
 
Le programme principal ne s'occupe que de la capture des codes infrarouges et de leurs traitements.
(CLIC sur l'image pour agrandir >>>)
Il est assuré par la tâche [Début].
On a donc la cohabitation de DEUX TÂCHES ou PROGRAMMES à l'intérieur du même PICAXE.
Programme_TEST_IR_4.png
 
Analyse rapide du programme :
  • si on ne prend aucune disposition particulière les deux tâches démarrent et fonctionnent simultanément ;
 
Or au départ on veut que le programme soit en standby : pas de clignotement.
Pour cela on bloque le fonctionnement de la tâche [Début1] avec l'instruction [Suspendre 1].
 
  • comme d'habitude [A = 255] force la variable « A » à une valeur non générée par la télécommande ;
  • [Entrée infrarouge] est réglée avec un temps d'attente de 1/10 ème de seconde.
 
 
Tout ceci devient de la routine n'est-ce pas ?
 
Mais le plus intéressant est ici :
  • lorsque le code « 1 » est détecté, le test [A = 1] libère la tâche [Début1] qui jusque là était en sommeil.
    ⇒ le programme [Début 1] est donc mis en route et tourne en boucle mais ne gêne absolument pas le programme principal qui boucle indépendamment dans l'attende d'un nouveau code IR.
  • lorsque le code « 0 » est détecté, le test [A = 0] bloque à nouveau la tâche [Début1] et le clignotement s'arrête.
Les instructions [Reprendre 1] et [Suspendre 1] sont des instructions non bloquantes dont l'exécution ne demande que quelques microsecondes.

Une fois qu'elles ont été exécutées, les actions correspondantes se déroulent HORS DU PROGRAMME PRINCIPAL.
 
Ainsi la boucle [Entrée infrarouge] → [Test] → [Actions] est parcourue en 1/10 ème de seconde ce qui signifie que 10 fois par seconde le programme est en situation d'intercepter un code infrarouge.
C'est bien plus court que le temps de réaction de notre doigt sur une touche.
 
Pas mal, non ?
 
 
Tout ceci n'était que de petits exercices destinés à décortiquer tranquillement les mécanismes du multi-tâches.
 
Les vrais programmes sont développés dans la partie 3, ci-dessous.
 
 
 
 

PICAXE

et

INFRAROUGE

Partie 3

 
INFRAROUGE ET MULTI-TÂCHES (suite et fin)
 
PETIT RETOUR SUR LE PROGRAMME PRÉCÉDENT (partie 2)
Comment ce programme est-il structuré ?
  • un programme principal ;
  • une partie "initialisation" générale contenue dans le programme principal : instruction [Suspendre 1] ;
  • une deuxième tâche.
 
 
 
Le programme suivant sera structuré de la même façon :
  • un programme principal ;
  • une partie "initialisations générales" sous forme d'une procédure appelée par le programme principal ;
  • TROIS tâches.
 
 
 
TROIS SORTIES - TROIS TÂCHES
 
 
 
Ce programme ne diffère du précédent que par le nombre des sorties pilotées.
Chaque sortie mobilise deux codes : un pour reprendre la tâche et un pour la suspendre :
  • touche 2 pour activer le clignotement sur la sortie C0 et touche 1 pour le stopper ;
  • touches 4 et 3 pour la sortie C1 ;
  • touches 6 et 5 pour la sortie C2.
 
Pour alléger le logigramme et faciliter sa compréhension, la partie "initialisations" a été sortie du corps du programme. Elle est écrite sous forme d'une procédure appelée [INITIAL].
 
 
Joli, non ?
 
Presque.
 
Il subsiste un petit défaut :
Lorsqu'on décide d'interrompre une sortie, l'instruction [Suspendre x] stoppe INSTANTANÉMENT la tâche correspondante... dans l'état où elle se trouve.
La sortie correspondante peut donc se trouver stoppée dans l'état "activé" ou "inactivé".
 
⇒ pas génial !
 
 
 
PROGRAMME CORRIGÉ
Les instructions [Suspendre x] dans le corps du programme sont remplacées par une procédure [STOP_x].
 
Ci-contre la procédure [STOP_1] concernant la sortie C0 :
  • elle commence par bloquer la sortie C0 dans la position "désactivée" ;
  • ensuite elle suspend la tâche [Début 1].
 
 
Le programme ci-dessous comporte donc trois procédures supplémentaires pour arrêter "proprement" chacune des sorties.
 
Bien entendu les tâches peuvent contenir autre chose que des séquences de clignotement.
Place à l'imagination !
 
 
Petit clin d'œil à notre camarade José : voici un programme déjà imposant pour un débutant, mais qui n'est composé QUE de tous petits blocs TRÈS simples !
Amusez-vous bien !
 
 
That's all Folks !

 

 

© 2020 par Hubert SPERI – Créé avec Wix.com

WIX.png
BB1601_loco_2A.png