La porte des étoiles
gestion par picaxe 20M2
Destiny226 est un passionné de d'origamie 3D. Entre autres réalisations, il y a une belle porte des étoiles et pour l'animer, il a demandé de l'aide sur un forum électronique. La discussion originale est
ICI.
Le fonctionnement de la porte des étoiles :
Comme vous le savez, cette porte ouvre un trou de ver de Lorenz, ce qui permet de relier instantanément deux points de l’univers (sérieux, c’est scientifique, et les trous de ver de Lorenz sont réversibles, heureusement ).
La succession de symboles verrouillés par les chevrons défini une destination (planète).
Dans un premier temps, cette séquence était purement aléatoire. Notre origamiste 3D a souhaité pouvoir programmer des destinations particulières (ben oui, vaut mieux savoir ou on va).
Chaque programmation est associée à une touche d’une télécommande IR. Mais il faut alors partir d’une position de référence pour que l’enchainement des rotations aboutisse toujours sur les mêmes symboles, sinon, ça sert à rien.
En résumé :
Si on appuie sur une touche programmée par un « select case », un bip long accuse réception :
Le code programmé est reconnu (bip court) et la porte tourne à la recherche de la position de référence (fermeture d’un inter ILS par un aimant). Pendant cette phase, rien ne s’allume.
Arrivé à la position de référence, trois bips ascendants sont émis et la porte effectue le programme défini, enchainement des temps de rotations programmés dans un lookup et allumage des chevrons jusqu’au bouquet final.
Si la position de référence n’est pas trouvée (time out correspondant à un tour complet), émission de trois bips descendants et la porte effectue un cycle aléatoire.
Si on appuie sur une touche non programmée, un bip long accuse réception :
Pas de bip court, pas de recherche de référence et exécution d’un cycle aléatoire (histoire de faire quelque chose).
Un poussoir de « démarrage manuel et test » lance un cycle aléatoire.
Modifs simples possibles :
Pendant la recherche de référence, la porte tourne sans autre signalisation (perturbant ?) il serait possible d’allumer quelque chose : chevron central ou leds flash (en fixe).
Ou de lancer cette phase à la fin d’un cycle, et non au début, pour partir directement sur un cycle chevrons.
L’inter « sony/autre » permet d’utiliser une télécommande non compatible code SIRC. Celle utilisée est compatible et cet inter perd son utilité. La broche du µC (E/S) est utilisable pour une autre fonction.
Le schéma:
Le programme:
#picaxe 20M2
#no_data
symbol telecom=pinC.0 ;choix télécommande
symbol flash=B.7 ;sortie flash
symbol ILS=pinC.1 ;entrée ILS
symbol PWMmot=C.3 ;PWM moteur
symbol gauche=C.4 ;commande moteur à gauche
symbol droite=C.5 ;commande moteur à droite
symbol InfR =C.6 ;entrée TSOP
symbol pouss=pinC.7 ;entrée poussoir
symbol son= C.2 ;sortie HP
symbol sens=bit0 ;sens moteur
symbol led=b1 ;n° leds
symbol datinf=b2 ;data télécommande
symbol cpt=b3 ;compteur
symbol cpt2=b4
symbol vmax=60 ;de 0 à 100 %, ici 50 =2,5 Volt
symbol memtps=w10 ;mémo temps rotation précédent
symbol vit =w11 ;valeur vitesse
symbol alea =w12 ;valeur léatoire
symbol temps=w13 ;temps rotation moteur
pullup %1100001100000000 ;pullup sur C.0, C.1,C.6 et C.7
dirsC=%0111100 ;broches C.2,C.3,C.4,C.5,en sorties
dirsB=%11111111 ;broches B en sorties
pinsB=0 ;extinction des chevrons ->1 en sortie ULN ->leds en anodes communes éteintes)
low flash
pwmout C.3,249,0 ;pwm 1000Hz sur C.3, RC 100%=1000
do ;boucle principale
debut: ; adresse timeout pour tester le poussoir toutes les 500ms
datinf=255 ;adresse par défaut (alatoire)
do while pouss=1 ;attente appui poussoir
random alea
if telecom=0 then ;si inter sur SONY
irin [500,debut],InfR,datinf ;attente IR, passage par pouss tous les 500ms
if datinf = 21 then debut
exit ;irin a reçu une adresse, sortie boucle
else ;inter sur NON SONY
if pinC.6=0 then exit ;sortie TSOP hors SONY
endif
loop
sound son,(91,50) ;son départ
gosub destination ;c'est parti pour les 6 chevrons latéraux
;********** C'EST LA FIN **********************************
gosub posILS ;pour allumage chevron central
high flash ;allume leds flash
sound son,(252,5000) ; bruit blanc 5 S ";" devant pour supprimer
time=0
time500: ;adresse sortie timeout pour tester time
do while time < 600 ;temps max 10 minutes
irin [500,time500],InfR,datinf ;attente IR, passage par pouss tous les 500ms
if datinf=21 then exit
loop
pinsB=0 ;extinction des chevrons avec 1 en sortie uln
low flash ;teint leds flash
sound son,(100,10,120,10,110,10) ;son de fin
pause 3000 ;on se repose 3 s
loop ;fin boucle principale
;***** sous programmes ************************************
destination:
sens=0 ;init sens de rotation
select datinf
;*********************************************************************
case 0 ;touche 1 code SONY
for led=0 to 5
lookup led, (4520,3890,5600,7200,6200,2800),temps ;en ms
gosub rotation
next
;********************************************************************
case 1 ;touche 2 code SONY
for led=0 to 5
lookup led, (1000,1000,1000,1000,1000,1000),temps
gosub rotation
next
;********************************************************************
case 2 ;touche 3 code SONY
for led=0 to 5
lookup led, (2000,6500,3000,5000,2500,7000),temps
gosub rotation
next
;***********************************************************************
case 3 ;touche 4 code SONY
for led=0 to 5
lookup led, (2000,6500,3000,5000,2500,7000),temps
gosub rotation
next
;***********************************************************************
case 4 ;touche 4 code SONY
for led=0 to 5
lookup led, (2000,6500,3000,5000,2500,7000),temps
gosub rotation
next
;***********************************************************************
else ;génération aléatoire
for led=0 to 5 ;boucle sur 7 leds
do
random alea ;nombre aléatoire
temps=alea//24
loop while memtps=temps;pas de répétition
memtps=temps
temps=temps*1000 + 1000 ;de 1s à 24 s par 23 paliers de 1 s
gosub rotation
next
endselect
return
rotation:
If sens=0 then
high gauche ;tourne à gauche :C.4 SUR ON
gosub accel
pause temps
gosub decel
low gauche ;arret tout off
else
high droite ;tourne à droite : C.5 SUR ON
gosub accel
pause temps
gosub decel
low droite
endif
high 6 ;allumage led du haut (led n°6)
pause 500 ;500ms
high led ;allumage led suivant séquence
pause 300
low 6 ;led du haut éteinte
sound son,(108,10)
pause 1000 ;pause cycle
sens=not sens ;inversion sens
return
posILS: ;recherche position ILS
high gauche
gosub accel
time=0
do
loop while ILS=1 and time <30 ; arret sur ILS=0 ou temps max>=30 s
low gauche
if ILS=0 then
sound son,(110,5,112,5,114,5) ;ILS trouvé
else
sound son,(110,10,108,10,106,10);ILS pas trouvé
endif
high 6 ;chevron central allumé
return
accel: ;accélération contrôlée
for cpt=3 to 10
vit=cpt*vmax ;de 3 à Vmax
pwmduty PWMmot,vit
pause 200 ;réglage temps d'accélération
next
return
decel: ;décélération contrôlée
for cpt=10 to 0 step -1
vit=cpt*vmax ;de Vmax à 0
pwmduty PWMmot,vit
pause 200
next
return