Ascenseur pour maison de poupées
Cette page est issue d'une demande sur un forum d'électronique que l'on retrouve dans ce lien.
Dans le cahier des charges initial, il s'agit d'une simple commande par interrupteurs d'un petit moteur continu et des fins de courses ILS (interrupteurs à lames souples).
Ce projet a été étoffé avec une gestion par µC picaxe 20M2. Le schéma proposé demande un minimum de composants et le programme codé en basic reste très simple, avec la facilité de programmation que donne le mode pseudo multitâches de la série M2.
En mode pseudo multitâches, le programme est constitué de plusieurs programmes "indépendants", introduits par une étiquette "startX" avec le 20M2, X peut varier de 0 à 7, soit huit programmes exécutés en parallèle (4 pour le 08M2).
L'exécution donne l'illusion que ces programmes s'exécutent en même temps, en réalité, ils sont "scannés" rapidement, les pauses rencontrées ne bloquent pas l'exécution des autres programmes et la modification d'une variable est immédiatement mise à jour dans les autres programmes.
Cahier des charges:
L'ascenseur déssert trois étages (une extension est possible).
La cabine est entrainée par un moteur à courant continu avec démultiplication.
La position des étages est repérée par des interrupteurs ILS, fermés par un aimant fixé sur la cabine.
L'inversion de sens se fait par deux mini relais R/T.
La sélection de l'étage se fait par poussoirs ou touches sensitives capacitives (deux options), mémorisation par leds.
Demande supplémentaire: affichage de l'étage sur afficheur leds 7 segments.
Le schéma avec sélection par poussoirs:
Le code:
; ASCENSEUR POUPÉE MM 09052016
;programme en pseudo multitâches
start0:
#picaxe 20M2
#no_data ;pour gagner 2 s de chargement programme
;#simtask all ;pour simulateur, enlever ";"
dirsB=%1111111 ;B.0 à B.6 en sorties
dirsC=%00000011 ;C.0 et C.1 en sorties
pullup %1111110000000000 ;pullup sur C.2 à C.7
;**** noms des broches *****
symbol niv0=pinC.5
symbol niv1=pinC.6
symbol niv2=pinC.7
symbol pous2=pinC.4
symbol pous1=pinC.3
symbol pous0=pinC.2
symbol led0=B.0
symbol led1=B.1
symbol led2=B.2
symbol monte=B.3
symbol desc=B.4
;***noms des variables ****
symbol niveau=b1 ;var niveau de 0 à 2
symbol dest=b2 ;var destination de 0 à 2
symbol led=b3 ;var leds , n° des broches leds,ici de 0 à 2
;********** initialisation **********************
if niv1=0 then ;on est au niveau 1, on y reste
dest=1 :niveau=1 ;mise en conformité
elseif niv2=0 then ;on est au niveau 2, on y reste
dest=2 :niveau=2 ;mise en conformité
else
time=100 ;pas de niveau défini, afficheur éteint (voir start3:)
Do while niv0<>0 ;on est au niveau 0, ou ailleurs...
high desc ;si on y est pas, on descent
loop ;
low desc ;on est arrivé, on arrête le moteur
time=0 ;on rallume l'afficheur
dest=0 : niveau=0 ;mise en conformité
endif
;*** boucle principale ***************************
Do
if pous0=0 then ;appui sur la poussoir 0
dest=0 ;mémorisation dans la var dest
elseif pous1=0 then
dest=1
elseif pous2=0 then
dest=2
endif
Do while dest<>niveau ;appui poussoir, la dest n'est plus = au niveau
time=0 ;raz time (compte secondes)
high dest ;allumage led destination
pause 1000 ;pour réalisme
if dest>niveau then ;on va au dessus
high monte ;moteur montée on
elseif dest<niveau then ;sinon, c'est en dessous
high desc ;descente on
endif
Loop
low dest ;on est arrivé, on éteint la led
low monte ;on arrête tout
low desc
loop
;*************************************************
start1: ;surveillance des niveaux
Do
if niv0=0 then ;on est au niveau 0
niveau=0 ;mise à jour de la var niveau
elseif niv1=0 then
niveau=1
elseif niv2=0 then
niveau=2
endif
loop
;****************************************************
start2: ;affichage niveau sur un 7 segments
Do
pinsC=niveau ;sur C.0 et C.1 déclarés en sorties
loop
;******************************************************
start3: ;extinction du 7 segments au bout de 60 s d'inactivité
Do
if time<60 then ;si time < 60 s
low B.6 ;Bl=0 sur CD4543 allume l'afficheur
else high B.6 ;Bl=1,l'éteint
endif
loop
Option avec sélection par touches sensitives capacitives.
Il faut modifier l'organisation des entrées et choisir les broches compatibles avec la commande "touche16".
Supprimer la programmation des résistances de pullup sur ces entrées.
Cette nouvelle distribution conviendrait également pour l'option poussoirs.
Les touches sensitives se fabriquent très simplement, un petit bout de PCB cuivré une ou deux faces, une rondelle de la taille du bout du doigt sous une face avant en plastique,etc...le doigt ne doit pas toucher le métal relié à la broche du picaxe, le picaxe ne mesure que l'augmentation de capacité de la touche.
Le schéma:

Le code:
; ASCENSEUR POUPÉE MM 08052016
;programme en pseudo multitâches
start0:
#picaxe 20M2
;#simtask all ;pour simulateur, supprimer le ";"
dirsB=%1111111 ;B.0 à B.6 en sorties
dirsC=%00000011 ;C.0 et C.1 en sorties
pullup %111000000000000 ;pullup sur C.4 à C.6
;**** noms des broches *****
symbol niv0=pinC.4
symbol niv1=pinC.5
symbol niv2=pinC.6
symbol tch2=C.7
symbol tch1=C.3
symbol tch0=C.2
symbol led0=B.0
symbol led1=B.1
symbol led2=B.2
symbol monte=B.3
symbol desc=B.4
;***noms des variables ****
symbol niveau=b1 ;var niveau de 0 à 2
symbol dest=b2 ;var destination de 0 à 2
symbol led=b3 ;var leds , n? des broches leds,ici de 0 à 2
symbol tch=w10
symbol sth0=w11
symbol sth1=w12
symbol sth2=w13
;******** initialisation **********************
;réglage des seuils touches sensitives
touch16 tch0 ,tch ;renvoie une valeur de 0 à 65535
sth0=tch+2000 ;enregistrement valeur retournée + marge de 2000
touch16 tch1,tch
sth1=tch+2000
touch16 tch2,tch
sth2=tch+2000
;initialisation niveau
if niv1=0 then ;on est au niveau 1, on y reste
dest=1 :niveau=1 ;mise en conformité
elseif niv2=0 then ;on est au niveau 2, on y reste
dest=2 :niveau=2 ;mise en conformité
else
time= 100 ;afficheur éteint voir start3:
Do while niv0<>0 ;on est au niveau 0, ou ailleurs...
high desc ;si on y est pas, on descent
loop
low desc ;on s'arrête au niveau 0
time=0 ;afficheur allumé
dest=0 : niveau=0 ;mise en conformité
endif
;*** boucle principale ***************************
Do
touch16 tch0 ,tch ;lecture de la touche 0
if tch>sth0 then ;test si appui sur la touche
dest=0 ;mémorisation dans la var dest
endif
touch16 tch1 ,tch
if tch>sth1 then
dest=1
endif
touch16 tch2,tch
if tch>sth2 then
dest=2
endif
Do while dest<>niveau ;appui poussoir, la dest n'est plus = au niveau
time=0 ;raz time (compte secondes)
high dest ;allumage led destination
pause 500
if dest>niveau then ;on va au dessus
high monte ;moteur montée on
elseif dest<niveau then ;sinon, c'est en dessous
high desc ;descente on
endif
Loop
low dest ;on est arrivé, on éteint la led
low monte ;on arrête tout
low desc
loop
;*************************************************
start1: ;surveillance des niveaux
Do
if niv0=0 then ;on est au niveau 0
niveau=0 ;mise à jour de la var niveau
elseif niv1=0 then
niveau=1
elseif niv2=0 then
niveau=2
endif
loop
;****************************************************
start2: ;affichage niveau sur un 7 segments
Do
pinsC=niveau ;sur C.0 et C.1 déclarés en sorties
loop
;******************************************************
start3: ;extinction du 7 segments au bout de 60 s d'inactivité
Do
if time<60 then ;si time < 60 s
low B.6 ;Bl=0 sur CD4543 allume l'afficheur
else high B.6 ;Bl=1,l'éteint
endif
loop
Amusez vous...