Quelles solutions pour compter le nombre de tours d'une roues.

Pedro51

Member
Bonjour,

But: Je souhaite connaitre la distance parcouru de ma moto au plus juste car cette valeur va me servir a calculer l’autonomie de mes batteries.
Moyen: Un interrupteur magnétique, comme sur les vélos avec une résistance de pull-up et un condo anti rebond.

Avec le 40x2 je peut utiliser la fonction "count". Mais mon programme fait déjà pas mal de calculs et gère aussi l'affichage du lcd. La fonction ralenti l'ensemble et/ou le résultat est approximatif.

Je songe a utiliser un Picaxe additionnel qui ne ferait que cette fonction et enverrai la donnée au 40x2. Le problème c'est que un 08m2 par exemple n'a pas la fonction "count".

Du coup je ne voit trop comment régler mon problème.
 

dje8269

Senior Member
Bonjour,

Pour ne pas tout simplement utilisé l'incrementation ? Cela permet de compter à chaque tour de roue aussi.
 

PieM

Senior Member
Bonjour,

Il y a beaucoup de façons de résoudre le problème. Mais en aucun cas avec count sur le picaxe principal, puisque le comptage s'effectue pendant une période donnée, au maxi 65 secondes.
Inutile d'utiliser non plus un autre picaxe ! (pour info count existe avec le 08M2).
Il suffit comme dit dje8269 d'incrémenter une variable word, à chaque pulse. et vous surveillez cette variable en incrémentant une autre éventuellement dès qu'elle arrive à 65535.
et pensez à mettre ces valeur en mémoire avant mise hors tension!
Vous pouvez mettre votre entrée sur interruption si vous avez peur de rater une info....
 

Pedro51

Member
Bonjour dje8269,

J'ai essayer avec l’incrémentation mais cela ne fonctionne pas correctement.

Voici le programme
Code:
#picaxe08m2
setfreq m16
symbol baud=N4800


main:
	if pin1 = 0 then
		inc w0
		do : loop while pin1=0
	endif
	serout 2,baud,("ABC",#b0,#b1)
goto main
édit:
Comment surveiller une entrée pendant que le processeur fait autre chose? J'ai du mal a saisir.:confused:

Et oui, j'ai mal interpreté le message du manuel. Ils parlent des 08 tout cour.
 
Last edited:

PieM

Senior Member
Je pense que le serout vous fait perdre des impulsions !

mettez votre entrée capteur sur une entrée interruption hard du 40X2 (B.0 à B.2)
configurez avec setintflag, et faite le comptage dans un s/prog interrupt.
le do loop est inutile.
 

jojojo

Senior Member
Le rabat-joie de service.

D'après le titre du post, on veut ici connaitre précisemment la distance parcourue.

Ben ... C'est pas en comptant le nombre de tours de roue que l'on peut y arriver.

Désolé, mais, une roue, ça patine (même la non-motrice, suffit de freiner dans une flaque de boue, et ...).

Si ...

Un GPS, par contre, non. Donc, un simple module genre Holux GR-87, ferait bien mieux l'affaire.

Tout dépend de savoir ce que l'on entend par "précision".
-De l'ordre de 1m/km, 10m/km, 100m/km ?
-Sur enrobé, ou en tout terrain ?

Bref, faut reposer les choses.

Edit: Oui, penser aussi à la difficulté de faire simple et robuste, en matière de capteur, si solution Hall ou autre. Pas toujours aisé à installer.
 
Last edited:

Pedro51

Member
Ben ... C'est pas en comptant le nombre de tours de roue que l'on peut y arriver.

Désolé, mais, une roue, ça patine (même la non-motrice, suffit de freiner dans une flaque de boue, et ...).

Edit: Oui, penser aussi à la difficulté de faire simple et robuste, en matière de capteur, si solution Hall ou autre. Pas toujours aisé à installer.
Quand je parlait de précision, c’était surtout au niveau du programme. En gros ne pas perdre un seul changement d’état de l'entrée.
je souhaite savoir en gros le nombre de watts que je consomme par km, je suis pas a 100m prêt. C'est seulement informatif, çà n'engage pas la sécurité du système. Je produit en parallèle un BMS pour contrôler les batteries lorsque celles si seront déchargées.

Pour le capteur, c'est çà
View attachment 16500
Après, il y a toujours les capteurs hall du moteur mais il faut prendre en compte le rapport du kit chaine et le nombre de pôles du moteur. Sans parler du fait que l'alimentation 5v des capteurs n'est pas a la masse, donc je peut pas relier direct au picaxe. Un capteur a la roues semble bien plus simple.

Donc pour récapituler, exit le picaxe additionnel, ajout de la fonction setintflag dans mon prog avec un sub interupt.
Je voit çà et reviendrait donner mes résultats.
 

Pedro51

Member
Salut, un petit retex du sujet. Donc j'ai bien compris la fonction "setint". Cela a l'air de fonctionner, mais il faudra tester en situation réel. La fonction bloque le programme si le capteur reste malencontreusement sur l'aimant. J'ai donc dû inserer une condition avec interruption de relachement.

Code:
ex:
init:
                setint %00000000,%00000001,D   ' réactive fonction interruption si D.0 état bas

main:
                ...
                ...
                goto main

interrupt:
		if b37 = 0 then
		b37 = 1
		inc w0
		setint %00000001,%00000001,D   ' réactive fonction interruption si D.0 état haut
		else
		b37 = 0
		setint %00000000,%00000001,D   ' réactive fonction interruption si D.0 état bas
		endif
		return
 

dje8269

Senior Member
Bonjour,

Je ne suis pas un "AS" du picaxe, loin de la .

toute fois je ne comprends un truc :

Code:
interrupt:
		if b37 = 0 then
			b37 = 1
			inc w0
			setint %00000001,%00000001,D   ' réactive fonction interruption si D.0 état haut
		else
			[COLOR="#FF0000"]b37 = 0[/COLOR]
			setint %00000000,%00000001,D   ' réactive fonction interruption si D.0 état bas
		endif
		
		return
Pourquoi mettre b37 a 0 quand la condition est jsutement qu'il soit a 0 ? Ou plutot , quand b37=0 alors b37=0 , ca n'as âs trop de sens ? ou alors j'ai encore loupé quelques chose.
 

PieM

Senior Member
Salut, un petit retex du sujet. Donc j'ai bien compris la fonction "setint". Cela a l'air de fonctionner, mais il faudra tester en situation réel. La fonction bloque le programme si le capteur reste malencontreusement sur l'aimant. J'ai donc dû inserer une condition avec interruption de relachement.
Non revoir mon post #5: je vous ai parlé d'une interruption hard sur le X2. donc avec setintflag . Contrairement à l'autre elle est fonction du changement d'état et non de l'état. Voir hintsetup.
 

Pedro51

Member
Pour répondre a dje8269, en fait il faut anticiper sur deux boucle du programme.

Quand pinD.0 est en etat bas, la fonction interupt intervient, b37=0. Donc on met b37 a 1 et on incremente w0.


interrupt:
if b37 = 0 then
b37 = 1
inc w0
ensuite on place cette commande setint pour reactiver la surveillance de l'entrée.
setint %00000001,%00000001,D ' réactive fonction interruption si D.0 état haut
Le programme passe cette partie
else
b37 = 0
setint %00000000,%00000001,D ' réactive fonction interruption si D.0 état bas
endif
Le programme reprend a la tache ou il etait avant l'interuption puis pinD.0 passe a 1
on repasse a la fonction interupt
cette fois puisque b37<> de 0 il repasse b37 a 0 et réactive la commande setint dans l'attente que pinD.0 repasse a 0.

Pour PieM, j'ai pas trop calculer cette partie du manuel, mais c'est bien mieux et je comprend du coup pourquoi tu me disait qu'il n&#8217;était pas nécessaire de mettre un do : loop.
Je me replonge donc dans la prog pour corriger tout çà.
 

Pedro51

Member
Je viens de tester la fonction setintflags, le problème c'est qu'il doit passer sur la commande afin de valider le changement d&#8217;état de l'entrée.
Et c'est pas vraiment ce que je recherche ou bien alors peut être que j'ai absolument rien pigée.
 

PieM

Senior Member
Je viens de tester la fonction setintflags, le problème c'est qu'il doit passer sur la commande afin de valider le changement d’état de l'entrée.
Et c'est pas vraiment ce que je recherche ou bien alors peut être que j'ai absolument rien pigée.
quelle commande ? une interruption sur une entrée (une entrée INT : interruption hard du 40X2 (B.0 à B.2 exclusivement)) ne nécessite rien d'autre.
donnez votre progamme .
 
Last edited:

Pedro51

Member
Voici une partie de mon prog, cela fonctionne dans l'etat actuel mais pas sur que ce soit la bonne méthode.
init:
hintsetup %00000001
setintflags %00000001,%00000001 ; active l&#8217;interruption quand D.0=0

main:
'if b19 = 0 then gosub tempmoteur
'if compteur = 5 then : gosub calcul_fonction : endif
'if compteur = 10 then : gosub tempmoteur : gosub fonction_repos : endif
'if compteur = 15 then gosub ctl_regul
inc compteur

goto main

interrupt:
'if b37 = 0 then
'b37 = 1
inc w0
'setint %00000001,%00000001,D ' reactive fonction interruption
'else
'b37 = 0
'setint %00000001,%00000001,D ' reactive fonction interruption
setintflags %00000001,%00000001 ' reactive fonction interruption
flags=0
'endif
return
 

PieM

Senior Member
Voici une partie de mon prog, cela fonctionne dans l'etat actuel mais pas sur que ce soit la bonne méthode.
Code:
setintflags %00000001,%00000001 ; active l’interruption quand D.0=0
:mad: pour la troisième fois, les interruption hard sur 40X2 sont sur B.0, B.1, B.2
 

Pedro51

Member
Oui, c'est bien l'interruption avec B.0, c'est juste le commentaire qui n'est pas correct.

édit
init:
hintsetup %00000001
setintflags %00000001,%00000001 ; active l&#8217;interruption quand B.0=0

main:
'if b19 = 0 then gosub tempmoteur
'if compteur = 5 then : gosub calcul_fonction : endif
'if compteur = 10 then : gosub tempmoteur : gosub fonction_repos : endif
'if compteur = 15 then gosub ctl_regul
inc compteur

goto main

interrupt:

inc w0
setintflags %00000001,%00000001 ' reactive fonction interruption
hint0flag = 0
return
Voila corrigée pour plus de visibilité, hint0flag semble plus approprié.
 
Last edited:

PieM

Senior Member
Oui, c'est bien l'interruption avec B.0, c'est juste le commentaire qui n'est pas correct.

Voila corrigée pour plus de visibilité, hint0flag semble plus approprié.
OK!
Et le flags=0 n'avait pas trop de sens.
On peut utiliser hint0flag ou flag0 pour l'interruption INT0
 
Top