Question pour PieM

Bob Champagne

New Member
En réponse au message suivant: http://www.picaxeforum.co.uk/showthread.php?18247-Aide-codage-PWM-(08M-pont-H-avec-relais)
vous m'avez gentiment suggéré le programme suivant qui fonctionne très bien.

Code:
SYMBOL ADCVALUE = W1 ;ASSIGN WORD 1

MAIN:
HIGH 0
LOW 1
GOSUB boucle

LOW 0
LOW 1
PWMOUT 2,OFF
PAUSE 2000

HIGH 1
LOW 0
GOSUB boucle

LOW 0
LOW 1
PWMOUT 2,OFF
PAUSE 2000
GOTO MAIN

Boucle: 'remplace la pause 5000
for b0= 0 to 9
READADC10 4,ADCVALUE
PWMOUT pwmdiv4,2, 249,ADCVALUE
pause 500
next
return
Je me suis rendu compte après l'avoir installé que le moteur d'essuie-glace que ce programme contrôle tourne moins vite en marche arrière qu'en marche avant.
Or ce moteur sert à mouvoir un câble entre deux poulies distantes d'environ 25 m. Un objet est attaché à ce câble et effectue un aller-retour continu entre les deux poulies.
Le moteur tournant moins vite en marche arriêre la distance parcourue par le câble est moindre au retour qu'à l'aller et donc l'objet ira éventuellement heurter une poulie.
Il me faut donc augmenter le temps de rotation en marche arrière afin que l'objet parcoure exactement la même distance dans les deux sens. Est-ce que le programme peut être modifié
pour obtenir l'effet désiré. Je vous remercie à l'avance pour vos fructueux conseils. Bob.
 

PieM

Senior Member
Bonjour,

En général, c'est une très mauvaise solution que de contrôler un mouvement mécanique uniquement par une temporisation. (proscrit dans le monde industriel !)
Le temps de l'action est fonction de la consigne vitesse du moteur mais aussi du couple résistant, et de la tension de l'alimentation.
Donc l'idéal serait de mettre un contact de fin course pouvant agir sur les deux sens de marche. je vous ferais un petit croquis de principe si nécessaire.

Résoudre le problème avec des tempo variables présente un risque si vous modifiez la vitesse du moteur via le pwm. !

Sinon pour répondre à la question : :)
il suffit de définir deux valeurs de tempo et de les affecter en fonction du mouvement à exécuter.

Code:
SYMBOL ADCVALUE = W1 ;ASSIGN WORD 1
[COLOR="#FF0000"]symbol  pausealler = 500 ' par exemple
symbol  pauseretour = 520  ' par exemple
symbol duree = w4[/COLOR]

MAIN:
HIGH 0 :LOW 1  '  Commande aller
[COLOR="#FF0000"]duree = pausealler[/COLOR]
GOSUB boucle
Gosub arret

HIGH 1 :LOW 0   ' commande retour
[COLOR="#FF0000"]duree = pauseretour[/COLOR]
GOSUB boucle
Gosub arret
GOTO MAIN

Boucle: 
for b0= 0 to 9
READADC10 4,ADCVALUE ' lecture de la consigne de vitesse
PWMOUT pwmdiv4,2, 249,ADCVALUE
[COLOR="#FF0000"]pause duree [/COLOR] ' fonction de l'aller ou du retour.
next
return

Arret:
LOW 0 ,1  
PWMOUT 2,OFF
PAUSE 2000
return
 

Bob Champagne

New Member
Encore une fois mille mercis, le programme fonctionne à souhait. Votre suggestion d'un contact de fin de course serait idéale mais difficile à réaliser puisque le moteur et les poulies se trouvent immergées sous environ 15 cm. d'eau. J'imagine un butoir fixé sur le câble qui viendrait heurter un contact qui signalerait au Picaxe d'interrompre le courant au moteur quelques secondes, puis le redémarrerait en sens inverse. Les photos incluses vous donnerons une meilleure idée de quoi il en retourne. Merci encore. Bob .
 

Attachments

PieM

Senior Member
Bonjour,

Sous l'eau, il y a la solution suivante : deux aimants fixés sur la corde, et deux ILS qui peuvent très facilement être étanches...

petit schéma de principe. Dans ce cas bien sûr le programme est à modifier ...
 

Attachments

Bob Champagne

New Member
Votre suggestion des aimants est excellente et facilement réalisable comme l'illustre votre schéma. Tout cela semble tellement facile pour vous que cela devient presque frustrant !!!
De plus avec ce dispositif plus besoin de commande de vitesse. J'ai déjà réalisé le typon avec 1 picaxe deux transistors et deux relais. Les pins 0 et 1 commandent les relais alors que les pins 3 et 4 sont reliés aux contacts. Je me permets (encore une fois direz-vous...) de vous soumettre le code qui fonctionne O.K. en simulation. Ainsi le moteur effectue une pause de deux secondes avant d'effectuer le changement de rotation au passage de l'un des deux aimants:
Code:
Aller:
low 0
pause 2000
do
If pin4=1 then Retour
low 0 
high 1
loop

Retour:
low 1 
pause 2000
do
If pin3=1 then Aller
low 1
high 0
loop
Je suis à court de formule de remerciement mais je vous en dois une... Bob.
 

PieM

Senior Member
Bonjour,

de retour après un petit break ...
Concernant le programme proprement dit, effectivement il va fonctionner.
Toutefois, je vous propose une alternative un peu plus structurée, qui est à généraliser en particulier pour des programmes plus longs avec une plus grande maintenabilité.

Dans le principe, mettre au minimum la directive du picaxe utilisé, et utiliser des symboles pour les entrées sorties. C'est plus parlant.
Préciser éventuellement la fréquence utilisée. (setfreq )
Utiliser un programme principal qui va faire appel à des sous-programmes. Plus parlant aussi.

Si on doit commander une sortie, il est inutile de mettre cette commande dans une boucle ...
Exécuter la commande ( low relaisA : high relaisB) puis effectuer la boucle de contrôle ensuite.
Dans cette boucle, en dehors du fin de course, peut être surveillé par exemple l'appui sur un Bouton d'arrêt d'urgence, l'intensité moteur... etc.


Code:
#picaxe 08M
'=========================
symbol R_retour = 0
symbol R_aller = 1
symbol fc_retour = pin3
symbol fc_aller = pin4
'==========================================

princ: ' programme principal
[INDENT]pause 2000
gosub Aller
pause 2000
gosub Retour[/INDENT]
goto princ
'_________________________________________________
Aller: 
[INDENT]low R_retour : high R_aller [I]'mise sous tension[/I]
do while fc_aller=0 [I]'boucle sous contrôle fin de course[/I]
'xxxxxxx   [I]'eventuellement d'autres contrôles[/I]
loop
low R_aller [I]'mise hors tension[/I][/INDENT]
return
'_________________________________________________
Retour:
[INDENT]low R_aller : high R_retour 'mise sous tension
do while fc_retour=0 [I]'boucle sous contrôle fin de course[/I]
'xxxxxxx 
loop
low R_retour [I]'mise hors tension[/I][/INDENT]
return
J'ignore quel est exactement l'utilisation de cette installation, mais une remarque:
si un évènement extérieur fait que le câble a été manoeuvré et se trouve avoir dépassé un fin de course, la commande systématique d'un aller risque de provoquer un problème mécanique.
Toute commande de mise en marche devrait donc se faire en s'assurant que le fin de course du mouvement inverse est actionné. Mais cela suppose aussi que le système ne s'arrête que sur un fin de course, en fonction de l'état d'un inter sur pin2 par exemple.
Dans le cas contraire, signaler un défaut si une sortie est encore disponible.

Pour expliciter, voir ce programme :
Un contact ONOFF a été ajouté sur le pin2

Code:
#picaxe 08M
'=========================
symbol R_retour = 0
symbol R_aller = 1
symbol ONOFF = pin2
symbol fc_retour = pin3
symbol fc_aller = pin4
'==========================================

princ: ' programme principal
[INDENT]do while ONOFF = 0: loop 'attente inter marche
pause 2000
If fc_retour = 1 then: gosub Aller
elseif fc_aller = 1 then :gosub Retour
else :gosub alarm
endif
[/INDENT]
goto princ
'_________________________________________________
Aller: 
low R_retour : high R_aller 
do while fc_aller=0 
'xxxxxxx 'eventuellement d'autres contrôles 
loop 
low R_aller
return
'_________________________________________________
Retour:
low R_aller : high R_retour
do while fc_retour=0
'xxxxxxx 
loop 
low R_retour
return
'_________________________________________________
Alarm:
'xxxxxxxxx
return
Avec ce principe, le programme attend que ONOFF soit sur 1 (do while ONOFF = 0: loop)
après une pause, si le système s'est arrêté sur fc_aller, alors le cycle retour est lancé, sinon, si le système s'est arrêté sur fc_retour, alors le cycle aller est lancé.
Dans le cas ou aucun fin de course n'est actionné, le programme va sur Alarm (à définir)
la mise de ONOFF sur 0 laisse le cycle en cours se terminer jusqu'à son fin de course, qui seul autorise le retour au programme principal.
 
Last edited:
Top