Cinémomètre à barrière infra rouge

marc67660

New Member
Bonjour à tous ,

Je suis nouveau dans le monde du Picaxe et me lance dans un cinémomètre .

J'ai fait une barrière infrarouge à deux faisceaux séparés de 50 cm et parallèles.
l'occultation du premier faisceau lance sur un autre picaxe 14m2 un decompte de temps et déverrouille un transistor qui par le biais du pwmout rentre sur une
entrée pulsin de lui même.

Le second faisceau occulté coupe la transmission de ce pwm vers l'entree pulsin.

le programme convertit enfin cette durée en km/h .

Jusqu'à là ça marche bien , maintenant j'aimerai mémoriser ses passages de voitures et leurs vitesses sur une mémoire eeprom externe car la mémoire du picaxe à
chaque reprogrammation s'efface ! mémoire style 24lc 16 ou 32 ...

Quelle commande puis je utiliser avec un picaxe 14m2 ou 18m2 . merci
 

PieM

Senior Member
Bonjour, et bienvenue,

Je pense que la précision de votre mesure, vu le principe utilisé ne doit pas être bien grande ! En principe on utilise les interruptions pour ce genre de problème et un seul Picaxe...
Sinon pour votre mise en mémoire, si vous avez peu de données, utilisez l'EEPROM du Picaxe: voir les instructions write et read.

Si vous voulez utiliser une EEPROM externe via les commandes hi2cin et hi2cout, faites une recherche sur le forum; il y a de multiples exemples.
 

marc67660

New Member
Bonjour,

Utiliser une interruption ? je croyais que Count bloquait les interruptions non ? c'est pour celà que la durée de l'impultion arrête l'emission de la fréquence sur l'entrée count via un transistor.

Les deux faisceaux infrarouge ont le même temps de latence à la mise à zero lors d'une détection , chacun est composé d'un picaxe 8m2 qui ne s'occupe que de détecter l'infrarouge à 38khz.

Sur le 14m2 en fait le transistor permet d'autoriser la sortie pwmout (11140 hz) vers l'entrée count en fait et non pulsin comme dit à mon premier post.

J'ai testé le calcul du 14m2 en générant un pulsout de 18 ms et effectivement j'ai 100 comme vitesse , ou 36 ms j'ai bien 50 en sortie affichage lcd .

Programme du 14m2:

pause 500
serout b.5,N2400,(254,1)
pause 400



PWMOUT c.0,90,200
debut:
;debug
if pinB.1 =0 then goto debut
switch on b.3 ;allumage d'une led de signalisation
switch on b.4 ;hold infra , bloque la génération de l'implultion en provenance du 8m2 qui détectecte l'état des infra (laisser le temps au 14m2 de traiter l'info)




count c.4,400,w3 ; comptage du nombre d'impultions pendant la durée entre le passage des deux faisceaux infrarouge sur 50 cm


let w2=19990/w3 ;SI 11000 hz alors div 20000 si 5557 hz alors div 10000 ;5040 si 2778 hz
if w2>112 then sup112
if w2 <5 then inf2

serout b.5,N2400,(254,1)
pause 30
serout b.5,N2400,("vitesse de ",#w2)


pause 400


switch off b.4 ;not hold infra , dit au 8m2 qu'on est prêt pour un nouveau passage


switch off b.3
goto debut


sup112:
serout b.5,N2400,(254,1)
pause 30
serout b.5,N2400,("superieur a 112 !")
pause 400
switch off b.4
switch off b.3


goto debut

inf2:

serout b.5,N2400,(254,1)
pause 30
serout b.5,N2400,("inferieur a 5 !")
pause 400
switch off b.4
switch off b.3

goto debut

Programme du 8m2 intermediaire :

setfreq m16


let w0=0


debut:


if pin4=1 and pin3=1 then debut ;pin 4 sortie d'un 8m2 detection 1er faisceau

if pin3=0 then sensnormal ; led verte sortie 0 a 1 sinon sens inverse ; pin 3 , entrée du deuxieme 8m2 faisceau 2
if pin4=0 then sensinverse
pause 40
goto debut

sensnormal:

high 2 ;vers entree 14m2 broche b1 lancement du comptage
pause 20
high 1 ;vers broche base transistor 2n3904 collecteur de pwout c0 emeteur vers c4 count
high 0

boucl:
if w0>8000 then erreur
inc w0
if pin4=1 then goto boucl
pause 20
low 1
pause 20
low 2
let w0=0

retour:
pause 30
if pin4=1 and pin3=1 then debut

goto retour

sensinverse:

high 2
pause 30
high 1
low 0

boucl1:
if w0>8000 then erreur
inc w0
if pin3=1 then boucl1 ; test si il y a bien un passage sur le deuxième infrarouge
pause 20
low 1
pause 20
low 2
let w0=0

retour1:
pause 30
if pin4=1 and pin3=1 then debut

goto retour1

erreur:

low 2
low 1
pause 1000

let w0=0
goto debut

Programme des 8m2 des recepteur IR :

setfreq m16
debut:
high 2


debutb:

pulsin 3,1,w0


if w0>12000 and w0 <13000 then goto debutb ;3100 3240 en m4 12000 13000 en m16


low 2
pause 20
boucle:
pulsin 3,1,w0

if w0<12000 or w0>13000 then boucle

high 2

goto debutb

Et enfin programme de l'émetteur infrarouge : (une led pour un recepteur , il ne faut surtout pas que la led du premier sature le deuxieme recepteur)


debut:

PWMOut 2, 25, 52 ' 26 ; 38.4 kHz
' pour 40 kHz, PWMOut 3, 24, 50
Pause 3


pwmout 2,off
pause 30
goto debut
 

PieM

Senior Member
J'ignorais que vous utilisiez la commande count.
Vous n'avez pas cherché la simplicité ! Si je comprends bien, 2 (ou 3 ?) Picaxes 08M2 un 14M2 et un transistor ?

Quand vous détectez la coupure du faisceau sur votre 08M2, il se passe beaucoup de temps avant que le 14M2 démarre le comptage. (plusieurs ms)
et au deuxième faisceau coupé, il n'y a pas le même temps d'exécution...

Vous auriez pu utiliser une bascule RS (faite avec un 7400) pour vos deux infos de cellules, qui elle, aurait donné un pulse mesurable par une simple instruction pulsin.
Un 7400 et un 08M2 auraient suffit.

Une autre solution était d'utiliser un 20X2 et son timer interne paramétrable. Les entrées capteurs étant chacun sur une interruption, vous lisiez la valeur dans la variable time, tout en pouvant faire autre chose dans le programme.
 

marc67660

New Member
Merci PieM pour vos conseils,

Quand le premier faisceau est détecté , il se passe 4 instructions et une pause 20 , je devrait donc rajouter un petit retard après détection de coupure du deuxieme faisceau .

J'ai utilisé uniquement des picaxes car tout y est configurable et comme c'est nouveau pour moi je peux pas m'empêcher d'en user et abuser .... ça me passera.

Je vais étudier les versions de picaxes plus évolués comme le 20x2 , surtout s'ils sont plus complet .

Merci encore
 

marc67660

New Member
Je me permet de recopier un de vos post PieM qui parle très bien du timer interne :

Bonsoir,

c'est un peu compliqué, c'est vrai :

il faut considérer qu'il il y a deux compteurs liés : un majeur et un mineur.

le majeur est incrémenté à chaque fois que le mineur atteint 65536.
la base de temps en secondes du compteur mineur se calcule ainsi : 256 /freq picaxe
un picaxe à 4 MHz aura donc pour base de temps 256 /4000000 soit 64 µs
32 µs à 8 MHz, 16 µs à 16 MHz etc ...

si on veut compter une seconde, il faut donc 1000000 µs / 64 soit 15625 impulsion du compteur mineur.
Mais comme le majeur n'est incrémenté que lorsque le mineur atteint 65536, il faut donc compter à partir de 65536 - 15625. soit 49910. Donc settimer = 49910
Par exemple, si on veut une base de comptage de 50 ms avec un picaxe à 8MHz, le settimer sera de :
65536 - 0,050 / (256/ 8.10^6 ) soit 63973.

Le compteur majeur sera donc incrémenté tous les 50 ms. Quand il atteindra lui aussi 65536, il passe en overflow et génère éventuellement une interruption, avec une variable toflag qui passe à un.
Ce compteur majeur peut être initialisé à n'importe quelle valeur par la variable timer.
si on met timer = 65436, l'interruption interviendra au bout de 100 fois 50 ms.
 

marc67660

New Member
En gros , stocker une valeur du timer à la coupure du premier faisceau et la retrancher à la valeur du timer à la coupure du deuxieme faisceau infrarouge ?

Par contre pour la détection des faisceaux infra rouge , j'utilise un 8m2 en pulsin après un récepteur 3 pattes récupéré sur un démo TV car je génère des impulsions de 38khz (je connais pas grand chose en infrarouge) , là j'ai 9 metres de portée , mais si j'alimente les leds infrarouge emettrices simplement en 38khz en continu ça va saturer les recepteur non ? donc comment décoder cette info avec le même picaxe qui fait le calcul de la vitesse ?
 

PieM

Senior Member
En gros , stocker une valeur du timer à la coupure du premier faisceau et la retrancher à la valeur du timer à la coupure du deuxieme faisceau infrarouge ?

Par contre pour la détection des faisceaux infra rouge , j'utilise un 8m2 en pulsin après un récepteur 3 pattes récupéré sur un démo TV car je génère des impulsions de 38khz (je connais pas grand chose en infrarouge) , là j'ai 9 metres de portée , mais si j'alimente les leds infrarouge emettrices simplement en 38khz en continu ça va saturer les recepteur non ? donc comment décoder cette info avec le même picaxe qui fait le calcul de la vitesse ?
Non, à la coupure du premier faisceau, vous mettez la variable timer à 0 (timer = 0), et vous lisez la valeur (0 à 65535) à la seconde coupure.

Je pense que vos récepteurs sont des TSOPxxxx. Si c'est le cas, la sortie est à 0 si ils reçoivent le 38kHz. Cette sortie passe à 1 dès rupture du faisceau. c'est ce front montant qui doit être envoyé sur une entrée interruption.

Il vous faut configurer vos interruptions sur deux entrées, avec SETINT OR.

dans l'interruption:
lire l'état d'un flag (par exemple bit0)
si le flag est à 0 mettre timer à 0 et monter le flag à 1
sinon lire la variable timer et mettre le flag à 0

PS: ce système fonctionne quel que soit le sens de passage...
 
Last edited:
Top