Chenillard programmable -Animations de LED
Ce projet répond à une demande posée sur le forum d'aide Picaxe francophone. IL s'agissait de créer un panneau lumineux comportant un nom entouré d'un chenillard avec animations diverses. Le tout pouvant fonctionner indifféremment en 12 ou 24 volt. La conversation initiale conversation est sur
cette page.
Cahier des charges:
Panneau comprenant une inscription entourée d'un cadre chenillard.
L'inscription à une animation indépendante du cadre;
Choix de l'animation du cadre par poussoir ou enchainement automatique.
Choix de la luminosité du cadre.
Alimentation en 12 ou 24 volts
Ici, l'alimentation est fixée à 12 v par convertisseur. Une alimentation en 24 v augmente les possibilités
Voici le schéma proposé:
.
Le résultat obtenu sur maquette:
Le code :
Remarque: Les animations ont été écrites par le demandeur initial (non expérimenté) avec les commandes high et low. Il est possible de faire plus "élégant" avec des outpins, mais le résultat est le même.
#picaxe 20M2
'C.1 select Anim
'C.2 PWM sortie lumière cadre
'C.3 ADC vitesse
'C.5 PWM sortie lumière texte
'C.6 Commande lumière cadre
'******** 1er programme en temps partagé **********
'******** Descriptions et enchainement des animations ************
start0:
dirsB= %11111111 'définition des ports B en sortie (en vue utilisation possible de outpinsB)
'********** Nomination des variables ****************
symbol suite = bit0 'Mémorisation de la demande de changement par interruption
symbol vitesse= w13 'type word (sup à 255)
symbol choix= b1 'Choix de la vitesse
symbol intens= pinC.6 'Poussoir réglage de l'intensité lumineuse
'********* Nomination des ports *****************
symbol cadre = C.2
symbol texte = C.5
'***** Programme principal **************************************
Debut: '*** Enchainement des Animations *******************
Do
Gosub Anim1
Gosub Anim2
Gosub Anim3
Gosub Anim4
Gosub Anim5
Gosub Anim6
Gosub Anim7
Gosub Anim8
Gosub Anim9
Gosub Anim10
Gosub Anim11
Gosub Anim12
Loop
'***** Sous programmes Animations ******************************************
Anim1: 'chenillard simple aller'
suite =0 'Reset mémorisation pousoir
setint %00000010,%00000010 '(Ré)activation de l'interruption niveau haut sur C.1
Do 'Boucle Anim1
readadc c.3, vitesse 'Lecture de la vitesse à chaque boucle àde 0 à 255ms
vitesse=vitesse+100 'vitesse = de 100 à 355 ms
high B.0 'idem : outpinsB = %00000001
pause vitesse
low B.0
high B.1
pause vitesse
low B.1
high B.2
pause vitesse
low B.2
high B.3
pause vitesse
low B.3
high B.4
pause vitesse
low B.4
high B.5
pause vitesse
low B.5
high B.6
pause vitesse
low B.6
high B.7
pause vitesse
low B.7
if suite=1 then 'Si il y a eu action sur le poussoir,
exit ' on sort de la boucle
endif
loop 'Fin de boucle Anim1
return 'Retour programme principal pour Anim suivante
Anim2: 'chenillard simple retour'
suite =0
setint %00000010,%00000010 'sur C.1
Do
readadc c.3, vitesse
vitesse=vitesse+100
high B.7
pause vitesse
low B.7
high B.6
pause vitesse
low B.6
high B.5
pause vitesse
low B.5
high B.4
pause vitesse
low B.4
high B.3
pause vitesse
low B.3
high B.2
pause vitesse
low B.2
high B.1
pause vitesse
low B.1
high B.0
pause vitesse
low B.0
if suite=1 then
exit
endif
loop
return
Anim3: 'chenillard simple aller-retour'
suite =0
setint %00000010,%00000010 'sur C.1
Do
readadc c.3, vitesse
vitesse=vitesse+100
high B.0
pause vitesse
low B.0 : high B.1
pause vitesse
low B.1: high B.2
pause vitesse
low B.2 :high B.3
pause vitesse
low B.3 : high B.4
pause vitesse
low B.4 :high B.5
pause vitesse
low B.5 :high B.6
pause vitesse
low B.6 : high B.7
pause vitesse
low B.7 :high B.6
pause vitesse
low B.6 : high B.5
pause vitesse
low B.5 : high B.4
pause vitesse
low B.4 : high B.3
pause vitesse
low B.3 : high B.2
pause vitesse
low B.2 : high B.1
pause vitesse
low B.1 :high B.0
pause vitesse
low B.0
if suite=1 then
exit
endif
loop
return
Anim4: 'chenillard double aller'
suite =0
setint %00000010,%00000010 'sur C.1
Do
readadc c.3, vitesse
vitesse=vitesse+100
high B.0:high B.4
pause vitesse
low B.0:low B.4
high B.1:high B.5
pause vitesse
low B.1:low B.5
high B.2:high B.6
pause vitesse
low B.2:low B.6
high B.3:high B.7
pause vitesse
low B.3:low B.7
if suite=1 then
exit
endif
loop
return
Anim5: 'chenillard double retour'
suite =0
setint %00000010,%00000010 'sur C.1
Do
readadc c.3, vitesse
vitesse=vitesse+100
high B.0:high B.4
pause vitesse
low B.0:low B.4: high B.3:high B.7
pause vitesse
low B.3:low B.7 : high B.2:high B.6
pause vitesse
low B.2:low B.6 : high B.1:high B.5
pause vitesse
low B.1:low B.5
if suite=1 then
exit
endif
loop
return
Anim6: 'chenillard double aller-retour'
suite =0
setint %00000010,%00000010 'sur C.1
Do
readadc c.3, vitesse
vitesse=vitesse+100
high B.0:high B.4
pause vitesse
low B.0:low B.4 : high B.1:high B.5
pause vitesse
low B.1:low B.5 : high B.2:high B.6
pause vitesse
low B.2:low B.6 :high B.3:high B.7
pause vitesse
low B.3:low B.7: high B.0:high B.4
pause vitesse
low B.0:low B.4:high B.3:high B.7
pause vitesse
low B.3:low B.7:high B.2:high B.6
pause vitesse
low B.2:low B.6: high B.1:high B.5
pause vitesse
low B.1:low B.5
if suite=1 then
exit
endif
loop
return
Anim7: 'allumage progressif aller'
suite=0
setint %00000010,%00000010 'sur C.1
Do
readadc c.3, vitesse
vitesse=vitesse+100
high B.6
pause vitesse
high B.5:high B.7
pause vitesse
high B.0:high B.4
pause vitesse
high B.1:high B.3
pause vitesse
high B.2
pause vitesse
low B.0:low B.1:low B.2:low B.3:low B.4:low B.5:low B.6:low B.7
if suite=1 then
exit
endif
loop
return
Anim8: 'allumage progressif retour'
suite=0
setint %00000010,%00000010 'sur C.1
Do
readadc c.3, vitesse
vitesse=vitesse+100
high B.2
pause vitesse
high B.1:high B.3
pause vitesse
high B.0:high B.4
pause vitesse
high B.7:high B.5
pause vitesse
high B.6
pause vitesse
low B.0:low B.1:low B.2:low B.3:low B.4:low B.5:low B.6:low B.7
if suite=1 then
exit
endif
loop
return
Anim9: 'allumage progressif aller-retour haut'
suite=0
setint %00000010,%00000010 'sur C.1
Do
readadc c.3, vitesse
vitesse=vitesse+100
high B.6
pause vitesse
high B.5:high B.7
pause vitesse
high B.0:high B.4
pause vitesse
high B.1:high B.3
pause vitesse
high B.2
pause vitesse
low B.2
pause vitesse
low B.1:low B.3
pause vitesse
low B.0:low B.4
pause vitesse
low B.7:low B.5
pause vitesse
low B.6
if suite=1 then
exit
endif
loop
return
Anim10:'allumage progressif aller-retour bas'
suite=0
setint %00000010,%00000010 'sur C.1
Do
readadc c.3, vitesse
setint %00000010,%00000010 'sur C.1
high B.2
pause vitesse
high B.1:high B.3
pause vitesse
high B.0:high B.4
pause vitesse
high B.7:high B.5
pause vitesse
high B.6
pause vitesse
low B.6
pause vitesse
low B.7:low B.5
pause vitesse
low B.0:low B.4
pause vitesse
low B.1:low B.3
pause vitesse
low B.2
if suite=1 then
exit
endif
loop
return
Anim11:'allumage haut extinction bas'
suite =0
setint %00000010,%00000010 'sur C.1
Do
readadc c.3, vitesse
high B.2
pause vitesse
high B.1:high B.3
pause vitesse
high B.0:high B.4
pause vitesse
high B.7:high B.5
pause vitesse
high B.6
pause vitesse
low B.2
pause vitesse
low B.1: low B.3
pause vitesse
low B.0:low B.4
pause vitesse
low B.7: low B.5
pause vitesse
low B.6
if suite=1 then
exit
endif
loop
return
Anim12:'allumage bas extinction haut'
suite =0
readadc c.3, vitesse
setint %00000010,%00000010 'sur C.1
Do
readadc c.3, vitesse
high B.6
pause vitesse
high B.7:high B.5
pause vitesse
high B.0:high B.4
pause vitesse
high B.1:high B.3
pause vitesse
high B.2
pause vitesse
low B.6
pause vitesse
low B.7: low B.5
pause vitesse
low B.0:low B.4
pause vitesse
low B.1: low B.3
pause vitesse
low B.2
if suite=1 then
exit
endif
loop
return
'********* Sous programme d'interruption *********************
interrupt:
suite =1 ' bit suite positionné à 1
return
end
'***********************************************************************
'************* Variation lumière texte (future) ***********************
start1:
Do
'************** on augmente doucement ***********
w12=0
Do
pwmout pwmdiv16, C.5, 124, w12 'PWM à 500Hz sur C.5 : rap cyclique w12 = 0 ->0% ; w12= 500 ->100%
inc w12 'augmentation rap cyclique, la luminosité augmente
pause 10 'règle la vitesse
loop while w12 <500 'jusqu'au max de 500
'************ flash rapide **************
pause 500 'pause au max de lumière
pwmout texte, off 'arrêt du PWM
low texte 'extinction leds
pause 200 'temps extinction
high texte 'allumage max
w12=500 'retour w12 max pour suite
'*********** on redescent **********
Do
pwmout pwmdiv16, texte, 124, w12
dec w12
pause 10
loop while w12 >0
pause 1000
loop ' On recommence
end
'***************************************************************
'************** Variation lumière cadre ***************
start2:
choix=0
retour:
high cadre 'Allumage du cadre au départ
Do
if intens=1 then 'Pression sur poussoir
do: loop while intens=1 'Attente relachement poussoir
inc choix 'Incrémentation de choix
if choix=7 then 'Boucle sur 6 choix
choix=1
end if
select choix
case 1
w11=150
pwmout pwmdiv16, cadre, 124, w11
case 2
w11=50
pwmout pwmdiv16, cadre, 124, w11
case 3
w11=10
pwmout pwmdiv16, cadre, 124, w11
case 4
w11=2
pwmout pwmdiv16, cadre, 124, w11
case 5 'Voir Variation lumière texte
Do
w11=0
Do
if intens=1 then retour:
pwmout pwmdiv16, cadre, 124, w11
inc w11
pause 10
loop while w11 <500
pause 500
pwmout cadre, off
low cadre
pause 200
high cadre
w11=500
Do
if intens=1 then retour:
pwmout pwmdiv16, cadre, 124, w11
dec w11
pause 10
loop while w11 >0
pause 1000
loop
case 6
pwmout cadre, off
high cadre
end select
endif
loop
end