Dernière mise à jour :
30/06/2024
Présentation
Ce coeur est différent de
mon
premier coeur clignotant.
Il ne se met pas automatiquement en route à la tombée de la nuit, mais
il présente une caractéristique que ne possède pas son ancètre : il affiche un battement
caractéristique
de type "boum-boum...boum-boum...".
Trois versions sont proposées, toutes avec un microcontrôleur PIC 12F675 :
-
Schéma 002
: version de base pour 1 ou 2 LED (pas de dessin lumineux de coeur)
-
Schéma 002b
: avec LED en forme de coeur, pour LED ordinaires
-
Schéma 002c
: avec LED en forme de coeur, pour LED haute luminosité
Une réalisation à base de composants non programmable permettant
d'obtenir les mêmes résultats visuels était tout à fait
envisageable, mais dans le cas présent, j'ai opté pour un petit
microcontrôleur PIC, car il fallait pouvoir intégrer le
circuit 002 dans un socle de
faibles dimensions. Le choix d'utiliser un composant programmable
n'a donc été dicté ici que dans un soucis de simplification
maximale au niveau matériel, tout du moins pour la version de base 002.
Les deux versions 002b et 002c occupent plus d'espace et leur message
est plus "évident".
Schéma 002 - Pour une ou deux LED
Si ce montage est d'une complexité abominable, c'est parce qu'il
comporte
quatre potentiomètres de réglage.
La particularité de ce montage réside dans un réglage indépendant
des temps forts et faibles du "battement cardiaque", ce qui
justifie la présence des quatre terribles potentiomètres RV1 à RV4. On
peut
en effet
régler les temps suivants :
- Temps #1
(RV1) : durée d'allumage du premier coup du battement de coeur
- Temps #2 (RV2)
: durée d'extinction avant allumage du deuxième coup du
battement de coeur
- Temps #3
(RV3) : durée d'allumage du second coup du battement de coeur
- Temps #4
(RV4) : durée avant début du cycle suivant (temps entre deux boum-boum)
Le cavalier JP1/Mode permet de définir le type de transition entre allumage et extinction (et inversement) :
- JP1/Mode = 0
(GP5=0) : transitions franches (sans fondu)
- JP1/Mode = 1
(GP5=1) : transitions douces (avec fondu)
Le principe général de fonctionnement est très simple. Il consiste à
lire la
tension appliquée sur les quatre lignes d'entrée/sortie AN0 à AN3 du
PIC par les potentiomètres RV1 à RV4 et à utiliser les valeur lues pour
définir les quatre durées caractéristiques. Les tensions lues étant des
valeurs analogiques, le PIC doit les convertir grâce à son CAN intégré
(CAN =
Convertisseur
Analogique
Numérique, ADC en
anglais pour
Analog to Digital Convertor).
Le CAN du PIC12F675 est un modèle 10 bits (1024 échelons). Les valeurs
numérisée sont ensuite utilisées pour retarder l'action
suivante dans la séquence en cours et donc pour définir la durée des
événements, de manière individuelle.
Le détail du programme sera vu plus loin, après présentation
des autres schémas (programme identique pour toutes les versions).
Schéma 002b - Pour LED en forme de coeur (avec LED ordinaires)
Dans cette version, le nombre de LED a été porté à 18, c'est suffisant pour former le dessin d'un coeur.
Le PIC à lui seul n'est pas en mesure de fournir une grande intensité
de courant sur une ligne configurée en sortie (en général entre 20 mA
et 25 mA maximum). Pour cette raison, il faut ajouter un transistor pour
pouvoir commander plusieurs LED ordinaires branchées en
parallèle (rappelons qu'une LED ordinaire requière environ 20 mA et
qu'en en branchant plusieurs en parallèle, le courant consommé
augmente).
Nous
avons donc ici le transistor Q1 qui fait office de "tampon" entre
le PIC et le paquet de LED trop gourmand. Q1 peut être
un BC237 ou n'importe quel autre transistor NPN basse
puissance capable de commuter un courant d'au moins 200 mA (BC547,
BC517, 2N2222, etc). La valeur des
résistances R2 à R7 dépend des LED utilisées et de la tension
d'alimentation appliquée sur le connecteur J101. Si par exemple on
dispose d'une tension de 9V et que les LED sont de type "rouges 1,6V /
20 mA", alors on devra utiliser des résistances de valeur égale à :
Rx = 9 - (3 * 1,6) / 0,02 = 480 ohms (valeur la plus proche =
470R)
Voir page
Alimentation
d'une LED pour plus de détails.
Schéma 002c - Pour LED en forme de coeur (avec LED haute
luminosité)
Avec des LED haute luminosité, le courant de la LED peut être abaissé à
1 mA tout en garantissant un éclairement tout à fait suffisant. Ainsi,
même avec 18 LED branchées en parallèle, le courant total ne sera que
de 18 mA. On peut donc se passer du transistor tampon Q1 présent dans
le schéma 002b et brancher toutes les LED directement sur la sortie du
PIC (à travers une résistance série, tout de même).
La valeur des résistances R2x à R7x dépend toujours du type de LED utilisé
et de
la tension d'alimentation du PIC qui ici est fixée à 5 V. Si par
exemple les LED sont de type
"bleues 4,0V / 20 mA" et qu'on les fait travailler à 1 mA, on devra
utiliser des résistances de valeur
égale à :
Rx = (5 - 4,0) / 0,001 = 1000 ohms (1k)
Certaines LED haute luminosité ont un rendement lumineux tel
qu'elles arrivent à éclairer de manière fort convenable avec un courant
de seulement 0,1 mA (100 uA). Dans ce cas, des résistances de
limitation de courant de 10k conviennent très bien :
Rx = (5 - 4,0) / 0,0001 = 10000 ohms (10k)
Voir page
Alimentation
d'une LED pour plus de détails.
Programme du PIC (base commune à toutes les versions)
Le programme complet (langage Pascal, éditeur-compilateur
MikroPascal de Mikroe) est visible ci-après (version sans fondu ni Auto-off) :
var
An0, An1, An2, An3: word;
Out_LED: sbit at GPIO.5;
procedure CPU_Init;
begin
CMCON := %00011111; // comparators OFF
NOT_GPPU_bit := 1; // disable
global pullup
WPU :=
$00;
// disable pullup for GPIO
TRISIO := %00011111;
ANSEL := %00011111; // use of ADC
ADFM_bit :=
1; //
right justified
ADC_Init;
end;
procedure ADC_GetValues;
begin
An0 := ADC_Get_Sample(0) shr 1;
An1 := ADC_Get_Sample(1) shr 1;
An2 := ADC_Get_Sample(2) shr 1;
An3 := ADC_Get_Sample(3);
end;
procedure Main_HeartBeat;
begin
Out_LED := 1;
VDelay_ms(An0);
Out_LED := 0;
VDelay_ms(An1);
Out_LED := 1;
VDelay_ms(An2);
Out_LED := 0;
VDelay_ms(An3);
end;
begin
CPU_Init;
while true do
begin
ADC_GetValues;
Main_HeartBeat;
end;
end.
Chacune des quatre données numérisées An0 à
An3 peut prendre n'importe quelle valeur entre 0 et 1023 (CAN 10 bits
=> 1024 échelons) et être directement utilisée pour créer
un délai exprimé en millisecondes. Ainsi, une tension de 2,5 V
correspond dans le cas présent à une valeur numérique de 511 et cette
valeur peut servir pour
créer un délai (retard) de 511 ms.
Remarques
- Les
valeurs numériques obtenues après lecture des tensions sur les lignes
An0 à An2 sont divisées par deux avec l'opération "shr 1", car les
durées
correspondantes seront très probablement réglées à des valeurs plus
faibles que 500 ms. Cette fonction mathématique n'est pas appliquée sur
An3 qui
correspond au temps entre deux boum-boum et dont la valeur peut être
plus
élevée. Cette façon de faire est totalement optionnelle, mais
en procédant ainsi, les réglages s'en trouvent facilités.
- La
fonction VDelay_ms de MikroPascal permet d'utiliser la valeur d'une
variable (ici An0 à An3), alors que la fonction Delay_ms ne le
permet pas. C'est un peu moins précis, mais absolument sans
importance ici.
Transitions franches ou progressives
Les
transitions entre allumage et extinction de la ou des LED peuvent être franches
(directes) ou douce (avec fondu
FadeIn et
FadeOut). Pour obtenir des transitions progressives, deux
solutions peuvent être mises en oeuvre :
- solution
matérielle :
ajout d'un ensemble
diode-condensateur-résistance-transistor entre la ligne GP5 du PIC
et LED. Cette solution évite toute modification du logiciel du
PIC,
mais les temps de montée (allumage) et de descente (extinction) étant
fixes, le résultat visuel peut ne pas convenir pour tous les
réglages autorisés par les potentiomètres RV1 à RV4 (sauf
éventuellement si les temps de montée et de descente
sont très courts).
- solution
logicielle :
utilisation d'un signal PWM (modulation de largeur
d'impulsion). Cette solution évite tout ajout de composants, mais rend
un peu
plus complexe le logiciel, car aucun module PWM n'est intégré dans ce
modèle de PIC et il faut le
créer de toute pièce avec les interruptions d'un timer.
La
solution adoptée ici est purement logicielle : un signal PWM (de faible
résolution mais suffisant pour cette application) est créé pour donner
l'illusion que la lumière émise par les LED croît et décroît
progressivement à chaque "pulsation cardiaque".
Extinction automatique (auto-off)
La
fonction d'extinction automatique (auto-off) a été prévue pour limiter
la consommation électrique au cas où on oublie d'éteindre le coeur
clignotant et que ce dernier est alimenté avec une pile de 9 V. Cette fonction provoque la mise en veille profonde du
système au bout de quelques minutes. Quand le circuit est en veille, la
consommation électrique du PIC est très réduite, de l'ordre de 3 nA
(0,003 uA). Pour cela, la fonction de mise en sommeil (SLEEP) est
précédée de la désactivation des modules qui ne servent plus, à savoir
la référence de tension (VREN=0), le convertisseur AD (ADON=0) et le
Timer1 (TMR1ON=0).
Important : pour bénéficier d'une consommation globale
très réduite, le régulateur de tension U101 doit lui aussi présenter
une consommation propre très faible. Le 78L05 que j'ai utilisé consomme
à lui seul 3 mA, ce qui ruine les efforts obtenus avec la mise en
veille du PIC. Pour bénéficier pleinement des bienfaits de la mise en
sommeil, il faut utiliser un régulateur de tension à très faible
consommation, par exemple le STLQ50C50R
de Texas Instrument dont le courant de repos est de seulement 3 uA
(courant max de sortie de 50 mA, amplement suffisant pour notre
application).
A noter que la mise en veille n'est pas "directe".
Avant d'y entrer, le coeur réduit la fréquence des battements comme
indiqué ci-après :
- entre la mise en route et la 2è minute de fonctionnement, les battements suivent la cadence réglée par l'utilisateur
- entre la 2è et la 4è minute, les battements sont espacés de 2 secondes
- entre la 4è et la 6è minute, les battements sont espacés de 5 secondes
- à la 6è minute, le système entre en mode sommeil (toutes LED éteintes, consommation minimale)
Pour réarmer le coeur, il suffit de l'éteindre et de le rallumer.
Comme
il n'y avait plus de broche libre sur le PIC, j'ai été contraint de
proposer plusieurs versions de logiciels. Une fois le programme de
votre choix flashé dans le PIC, la fonction sera ou non présente et non
modifiable (sauf bien sûr par reprogrammation du PIC).
Suppression des quatre potentiomètres ?
Il
est possible de remplacer les quatre potentiomètres ajustable
RV1
à RV4 par quatre ponts diviseurs résistifs fixes,
si on accepte une vitesse de clignotement (battement) fixe. Dans ce
cas, à vous de déterminer les valeurs de résistances qui vous
conviennent le mieux.
Il
est également possible de supprimer
totalement lesdits potentiomètres (sans les remplacer par quoi que ce
soit), là encore en acceptant une vitesse de
clignotement fixe. Mais dans ce cas, le logiciel doit être modifié
en donnant aux
variables An0 à An3 une valeur fixée "en dur" que vous
déterminerez expérimentalement. Vous pouvez le faire vous-même, puisque
le code source est fourni et que la taille du programme est inférieure
à la limite imposée par la version gratuite de MikroPascal.
Logiciel(s) du PIC
Programme compilé (*.hex) disponible en libre service dans l'archive
zip suivante (code source version sans fondu dans le texte ci-devant) :
Coeur
clignotant 002 - 12F675 - 24/06/2024
Trois fichiers compilés sont mis à disposition :
- electronique_coeur_clignotant_002_12f675_wo-fade.hex : version sans fondu et sans Auto-off (version d'origine)
- electronique_coeur_clignotant_002_12f675_w-fade_wo-autooff.hex : version avec fondu et sans Auto-off
- electronique_coeur_clignotant_002_12f675_w-fade_w-autooff.hex : version avec fondu et avec Auto-off
Pour les programmes avec fondu (*w-fade*), la présence de JP1 est requise (il ne faut pas laisser la ligne GP3/MCLR en l'air).
Si vous souhaitez recevoir par la poste un PIC préprogrammé et prêt à
utiliser, merci de consulter la page PIC - Sources.
Prototypes
Circuits 002 et 002b réalisés selon implantation visible plus
loin.
Testé
OK avec la version logicielle intégrant la fonction de fondu. Je trouve
l'effet sympa et "réaliste" avec les réglages adéquats, mais nul doute
que le rendu est nettement mieux avec les LED en forme de coeur.
A
noter les supports/entretoises de LED que j'ai placés pour deux raisons
: d'une part pour aligner les LED en hauteur, d'autre part pour étendre
la surface éclairée (les LED éclairent en effet un peu en dessous). Vu
de face, c'est un peu trop fort, la valeur des résistances de
limitation de courant que j'ai placées (6 x 470R) gagnerait ici à être
augmentée. Les LED sont données pour une tension nominale de 3V0 à 3V6,
je ne pensais pas qu'elles éclaireraient autant en étant
sous-alimentées (calcul R pour 2V8 sur chaque LED et courant de 1,2 mA).
Circuits imprimés (PCB)
PCB réalisés en double face pour les trois versions 002, 002b et 002c.
Je n'ai pas
inclus (volontairement) de connecteur ICSP sur les circuits, le PIC
doit
donc être programmé "à côté" (on peut se le permettre pour
un projet de ce type).
Version 002 pour 1 ou 2
LED
Version 002b et 002c
pour LED en forme de coeur
Dessins
PCB au format PDF
Historique
30/06/2024
- Ajout fonction d'extinction automatique (Auto-off) dans le programme du PIC. Détails dans le texte.
23/06/2024
- Ajout photos prototype version 002b (avec 18 LED en forme de coeur).
09/06/2024
- Ajout photos prototype version 002 (avec une seule LED).
26/05/2024
- Ajout mode fondu pour transitions douces dans le programme du PIC (même programme pour versions 002, 002b et 002c).
- Ajout schéma et PCB version 002b (avec dessin de coeur, pour LED standard).
- Ajout schéma et PCB version 002c (avec dessin de coeur, pour LED haute luminosité).
19/05/2024
- Première mise à disposition.