Accéléromètre pour picaxe

electrique5

Senior Member
Bonjour
Je suis actuellement de réalisé un flipper virtuel

PHT_22.jpg

A l'intérieur j'ai placer un système avec des interrupteur au mercure pour simuler les secousses

PHT_08.jpg

ses interrupteurs au mercure déclenche des relais qui simule les secousses sur l'écran
ca fonctionne bien mais je voudrait remplacer se système par un système d'accéléromètre moins dangereux que le mercure
et je voudrait savoir si un accéléromètre pourrais éventuellement faire l'affaire pour ce remplacement ?

j'en n'ai trouvé un ici
le souci c'est que je n'ai jamais travaillé avec ca et vu la photo de l'accéléromètre il y a plusieurs connections SCL,SDA,XDA,XCL,ADD,INT auquel je ne connait pas du tous.
je ne connait pas comment relier ca a un picaxe ni le code ni le fonctionnement.

Tous ce qui m'intéresse c'est la détection des secousses droite,gauche et au centre du flipper.
Je vous remercie
 

PieM

Senior Member
Belle réalisation...

Je suis étonné de voir encore des contacts à mercure. Ils sont interdits à la vente je crois et remplacés par des billes.
Sinon l'accéléromètre est tout a fait indiqué et permet de régler la sensibilité des tilts. Mais je ne comprends pas l'histoire des relais ...
Préférer le MPU6050 au 5060. ils communiquent en I2C. (avec SCL et SDA)

Si vous n'êtes pas trop fana de ce mode de liaison, utiliser un ADXL335 qui lui sort des valeurs analoqiques . Donc 2 entrées ana nécesssaires.
 

electrique5

Senior Member
en faite pour vous expliquer c'est un hack clavier

PHT_11.jpg

les 3 relais sert de boutons pour faire contact au clavier pour simulé les secousses
je pense que le ADXL335 en analogique serais le plus simple pour moi
mais je ne trouve aucune info comment le relié au picaxe ni même quel code utilisé.
j'ai trouvé quelques infos mais tous concerne l'arduino
 

PieM

Senior Member
Pas compris davantage mais c'est pas grave.

Il faut l'alimenter en 3.6V maxi.
relier la broche X et la broche Y à deux entrées ana du picaxe.

la valeur est donnée par un readadc10.
si le capteur est horizontal la sortie sera égale à 512 environ (la moitié de la valeur maxi 1024) sans accélération.
sur un choc elle variera en + et en - autour cette valeur ( 100 par g d'accélération)
 

electrique5

Senior Member
je viens de les commandés donc admettons que je prenne un 20m2
je relie le capteur a l'entrée 1 et 2 pour X et Y
vu qu'il y a 2 axe droite/gauche (X) et centre (Y)

et donc si j'ai bien compris il faut que je fasse 2 fois readadc

soit :
readadc 1,varA
readadc 2,varB

ensuite je joue selon la valeur de varA et varB

si varA est plus petit que 512 donc fonction (Droit)
si varA est plus grand que 512 donc fonction (gauche)
etc...

si je vois que c'est trop sensible je ferais par exemple

si varA est plus petit que 400 donc fonction (Droit)
si varA est plus grand que 600 donc fonction (gauche)

pour que ca soit moins sensible

j'ai fait vite fait un code sous logicator soit a peu près ce code
20m2.png

la c'est juste un exemple mais je voudrait juste savoir si mon raisonnement est correct
je vous remercie de votre aide
 

PieM

Senior Member
Oui, c'est bien le principe mais:

512 correspond à une valeur où: le picaxe et le capteur sont alimenté sous 3V à 3.6V, et que la lecture se fait avec readadc10 (résultat sur 10 bits soit max 1024)
pour le out centre ce peut être > ou < selon l'orientation du capteur, et être autre chose que 600 si le capteur n'est pas horizontal.

d'autre part, comme il s'agit d'un évènement de courte durée, il faudra temporiser la sortie en fonction de ce qui est à commander.
 

electrique5

Senior Member
Merci pour toutes ses informations
une dernière question suis-je obligé de faire cela sur 10bits ?
si je fait readadc 1,varA le résultat sera compris entre 0 et 255 non ?
si oui le principe sera le même mais avec des valeurs plus faible.
 

PieM

Senior Member
Merci pour toutes ses informations
une dernière question suis-je obligé de faire cela sur 10bits ?
si je fait readadc 1,varA le résultat sera compris entre 0 et 255 non ?
si oui le principe sera le même mais avec des valeurs plus faible.
Oui, parfaitement, mais la sensibilité sera un peu plus faible. Et la valeur moyenne sera donc de 127 au lieu de 512.
 

electrique5

Senior Member
bonjour
Je viens de recevoir les accéléromètres et je voudrait le faire comme vous l'aviez dit c'est a dire sur 10bits
j'ai donc fait une ligne :

Code:
readadc10 0,varA
et je voudrait lire la valeur sur écran LCD et j'ai cela

Code:
bintoascii varA,b8,b9,b10
serout 5,N2400_4,(254,128,b8,b9,b10,"             ")
la je teste uniquement que sur un seul axe et utilisant un 14M2
le souci ca n'affiche que sur 3 caractères quand je le laisse a plat j'ai la valeur : 045 et varie selon si je le bouge a droite ou sur la gauche
le souci c'est qu'il n'est assez sensible
je voudrait savoir quel serais le code pour lire sur 10bit sur 4 chiffres pour qu'il soit plus sensible ?
je vous remercie
 

BESQUEUT

Senior Member
bonjour
Je viens de recevoir les accéléromètres et je voudrait le faire comme vous l'aviez dit c'est a dire sur 10bits
j'ai donc fait une ligne :

Code:
readadc10 0,varA
et je voudrait lire la valeur sur écran LCD et j'ai cela

Code:
bintoascii varA,b8,b9,b10
serout 5,N2400_4,(254,128,b8,b9,b10,"             ")
la je teste uniquement que sur un seul axe et utilisant un 14M2
le souci ca n'affiche que sur 3 caractères quand je le laisse a plat j'ai la valeur : 045 et varie selon si je le bouge a droite ou sur la gauche
le souci c'est qu'il n'est assez sensible
je voudrait savoir quel serais le code pour lire sur 10bit sur 4 chiffres pour qu'il soit plus sensible ?
je vous remercie
En supposant que VarA soit defini comme un word,
essayez de remplacer :
bintoascii varA,b8,b9,b10
serout 5,N2400_4,(254,128,b8,b9,b10," ")
par
serout 5,N2400_4,(254,128,#varA," ")
 

PieM

Senior Member
varA est une variable byte du mode organigramme .
Il faut utiliser le basic et une variable word pour readadc10.
Code:
donc readadc10, 0, w7
et
Code:
bintoascii w7,b8,b9,b10,b11,b12 
serout 5,N2400_4,(254,128,b8,b9,b10,b11,b12,"             ")
 

electrique5

Senior Member
Alors voila j'ai réussi mais voila un autre problème
quand je tape le flipper a droite un coup il détecte que la frappe est a droite mais parfois il détecte que c'est la gauche.

Voila un exemple comment j'ai procéder :

admettons que ma valeur a plat est 50
si je penche le module a gauche on régresse dans le nombre 49.48.47...
quand je penche le module a droite ca augmente le nombre 51.52.53...
je laisse une marge a vide pour que ca ne détecte pas les vibrations quand on joue, on va dire 10 de chaque coté comme marge

donc 50 est la valeur a plat jusqu'à 40 on ne fait rien a partir de 39.38.37... on détecte comme quoi c'est la gauche
et pareille de l'autre coté jusqu'à 60 on ne fait rien a partir de 61.62.63... on détecte comme quoi c'est la droite

on faisant comme ca, ca fonctionne manuellement si je penche le module d'un coté ou de l'autre pas de souci
mais c'est quand je le pose dans le flipper ou même sur une table et que je tape d'un coté par exemple a droite
le circuit détecte bien a droite mais parfois il détecte en tant que gauche il ne détecte pas a tous les coups sur la droite
et pareille de l'autre coté.
Alors je me demande si un c'est un problème de l'accéléromètre en sachant que j'en ai testé 2 mais je ne pense pas
ou si c'est un problème de vibration avant la détection.
Je voudrait avoir votre avis ou si vous aviez une solution pour remédier a ce problème
ou peut être voir utilisé une autre technique autre que qu'un accéléromètre pour la détection mais je ne vois pas quoi
Je vous remercie
 

BESQUEUT

Senior Member
Alors voila j'ai réussi mais voila un autre problème
quand je tape le flipper a droite un coup il détecte que la frappe est a droite mais parfois il détecte que c'est la gauche.

Voila un exemple comment j'ai procéder :

admettons que ma valeur a plat est 50
si je penche le module a gauche on régresse dans le nombre 49.48.47...
quand je penche le module a droite ca augmente le nombre 51.52.53...
Houlà...
1) Merci de publier votre code actuel...
2) merci également d'indiquer quel broche de l'accéléromètre est connecté à quel broche du Picaxe, ou de préciser dans le code si vous lisez X,Y ou Z
3) Quand vous décrivez une expérimentation, mettez toujours la platine au départ dans la même position. Disons que X va à droite, Y va devant vous et Z va vers le haut.
4) Maintenant que vous savez lire une accélération, il faudrait utiliser les 3 valeurs.
5) Désolé, mais il va falloir faire un peu de physique.

Selon vos observations, il me semble que le matériel fonctionne parfaitement bien, mais c'est le code qui est trop simpliste...

Votre accéléromètre mesure 3 accélérations suivant les axes X, Y et Z
Normalement X et Y sont dessinés sur la platine.
Le Z est un point : imaginez qu'il y a une troisième flèche qui part de ce point et va vers le haut.

En partant de la position décrite ci-dessus, et en l'absence totale de mouvement (platine posée sur la table) :
- X et Y doivent être nuls puisqu'il n'y a pas d'accélération horizontale, (mais en fait vous devriez lire 512 puisque c'est l'équivalent du zéro)
- Z mesure l'accélération de la pesanteur (si cette notion n'est pas claire pour vous, dites le : je tenterai d'expliquer)

Si vous penchez à droite :
- Y ne doit pas changer (donc toujours 512)
- Z doit changer (à priori se rapprocher de 512)
- X doit augmenter (à priori au delà de 512)

En partant de la position décrite ci-dessus, si vous penchez à gauche:
- Y ne doit pas changer (donc toujours 512)
- Z doit changer (à priori se rapprocher de 512)
- X doit diminuer (à priori en dessous de 512)

Si vous ne faites pas de mouvement brusque, il n'y a pas d'autres accélérations que celle de la pesanteur.

Maintenant, si vous tapez horizontalement de la droite vers la gauche, vous créez une forte accélération suivant X, immédiatement suivie d'un décélération.
Probablement, vous tenez le module de la main gauche et tapez avec la droite.
Dans ce cas, instinctivement, la main gauche retient le module pour éviter qu'il ne s'envole. Le mouvement est humainement difficile à contrôler. Il y a probablement un mouvement involontaire vers la droite suivi d'un mouvement horizontal vers la gauche pour rétablir visuellement la position du bidule.
Il faudrait une camera rapide pour filmer tout ça.
Les valeurs sont lues un peu au hasard dans tous ces mouvements, ce qui explique des valeurs tantôt positives, tantôt négatives...

Comme dit par PieM en #6, il va falloir intégrer une série de mesures pour en déduire quelque chose de fiable...

Pour ça, il faudra avoir la courbe d'évolution des accélérations lors d'un choc typique. S'il n'y a pas de choc d'avant en arrière, on peut se contenter de X et Z
Soit on utilise un oscillo.
A défaut, suivant le Picaxe utilisé, on peut écrire un petit programme qui va charger en mémoire une série de valeurs et les restituer ensuite pour analyse. (c'est d'ailleurs exactement ce que fait un oscillo numérique...)

A défaut, il faudra se contenter de la théorie seule...
Il y a deux différences entre les modifications d'accélération produites par une rotation (on penche) et celles produites par un choc :
- dans le cas de la rotation, l'accélération est toujours la même pour une position donnée,
- dans le cas d'un choc à partir d'une position de départ, l'accélération évolue rapidement dans un sens puis dans l'autre et au final, la valeur est la même qu'au début.
- à noter que dans un choc il peut y avoir une accélération intense et brève dans un sens, compensée par une accélération plus faible pendant un temps plus long dans l'autre sens.
- la valeur absolue de l'accélération liée à la pesanteur est sur terre de 9,81 m/s/s Les accélérations liées à des rotations sont obligatoirement inférieures à cette valeur( en fait, c'est la pesanteur multipliée par le sinus de l'angle de rotation)
- l'accélération liée à un choc (en particulier la première, la plus intense) peut facilement atteindre plusieurs fois celle de la pesanteur.

Une seule mesure est insuffisante. Il faut disposer de plusieurs mesures successives et si possible sur les deux axes, pour savoir si c'est un choc, et dans quel sens.
L'intervalle entre les mesures doit être plus court que les variations à observer. Dans le cas d'un choc, ça se compte en ms.
Impossible d'observer ça avec un sertxd. Le code doit être optimisé en conséquence.
 
Last edited:

electrique5

Senior Member
En faite merci pour c'est infos mais je suis pas assez calé :(

La j'utilise un picaxe 40x et l'accéléromètre est connecté sur ADC 1 (3ème broche) et je suis revenu avec des variables type b0,b1
alors je teste qu'un seule axe pour l'instant X avec la ligne

Code:
readadc10 1,varD
GRAPH.PNG

qui stock la valeur dans la variable D (b3)
ensuite je fait une simple comparaison
a plat j'ai exactement 075 donc
si D est inférieur a 65 je dit gauche
si D est supérieur a 75 je dit droit

tant que ca varie entre 66 et 74 on ne fait rien car c'est trop sensible un écart de 10 c'est bon
ca fonctionne si je le penche a la main mais posé sur une table et que je tape d'un coté a droite par exemple bien il va détecté a droite mais pas dans tous les cas
parfois il va détecté comme quoi que le choc viens de la gauche.

je pensais que ce simple code serais suffisant mais il faut croire que non apparemment.
 

BESQUEUT

Senior Member
je pensais que ce simple code serais suffisant mais il faut croire que non apparemment.
C'est sans doute suffisant pour des événements lents comme le fait de basculer la carte.
Il faudrait voir le code BASIC généré, mais a priori c'est un peu trop simpliste pour des événements rapides et contradictoires comme un choc horizontal.
Est-ce possible de programmer en Basic ?
 

electrique5

Senior Member
c'est ce que je pense également voici le code généré:

Code:
main:
label_265:
readadc10 1,varD

		if varD < 65 then label_268	'Compare command
		if varD > 85 then label_269	'Compare command
		goto label_265

label_269:
high b.2
pause 500
low b.2
		goto label_265

label_268:
high b.1
pause 500
low b.1
		goto label_265
 

PieM

Senior Member
Je pensais naïvement que le principe était de détecter un choc trop important générant comme dans tout bon flipper, un TILT!
auquel cas que ça vienne de la droite ou la gauche n'avait que peu d'importance.

S'il faut différencier gauche droite, alors le problème est beaucoup plus ardu car comme souligné, un choc génère une accélération dans un sens suivi d'une décélération.
Il faut donc déterminer le maxi ou le mini des variations à chaque fois !
donc enregistrer les valeurs lues par des readadc avec un picaxe qui cavale au moins à 32 MHz (100µs sur un 14M2 pour un readadc)
et traiter les donnée pendant que le joueur boit son café.
Pas joué !
 

BESQUEUT

Senior Member
Pas joué !
Je pense que si on arrive à capter la première valeur qui dépasse le seuil, ça devrait le faire.
Le problème actuel, c'est la tempo de 500 ms qui fait que la mesure tombe n'importe quand, donc potentiellement aussi bien pendant l'accélération que dans le rebond...

Ouaip : pas joué effectivement.
Bien que pas vraiment optimisé, ce code détecte effectivement la première valeur qui dépasse le seuil.
A mon avis, c'est juste qu'il est trop lent.

Mais à 32 Mhz, ça devrait aller nettement mieux...
Il faudrait aussi essayer en changeant un peu les seuils.
 
Last edited:

electrique5

Senior Member
Oui en effet le système que je souhaite réalisé c'est de bien distingué la droite de la gauche
c'est pour simulé les secousses de la table du flipper qui dévie la bille du jeu soit par la droite ou la gauche selon le choc.
 

BESQUEUT

Senior Member
Oui en effet le système que je souhaite réalisé c'est de bien distingué la droite de la gauche
c'est pour simulé les secousses de la table du flipper qui dévie la bille du jeu soit par la droite ou la gauche selon le choc.
Ah ! dans ce cas, il faudrait de plus que la bille dévie plus ou moins selon l'intensité du choc ?
Juste par curiosité, la bille "virtuelle" c'est quoi en fait ?
Sauf erreur de ma part, l'image en #1 n'est pas un grand écran LCD mais un dessin "animé" par des électro-aimants.
 

electrique5

Senior Member
non l'intensité ne fonctionnera pas je veux juste pour capté uniquement le choc d'un coté ou de l'autre peu importe l'inténsité
en faite c'est un clavier démonté auquel j'ai sortie des fils pour les boutons du flipper

PHT_10.jpg

le système que je souhaite faire activera des relais du coté détecté qui eux ensuite feront contact au clavier qui simulera ensuite les secousses dans le jeux vidéo

le reste ca fonctionne comme un jeux vidéo classique auquel j'utilise Future Pinball qui permet de faire tourné des tables de jeux
et l'image est diffusé sur 3 écrans différent et c'est bien une TV démonté posé dans un cadre en tasseau qui sert de table.
et plein de table sont en téléchargement ICI
j'ai fait une petite vidéo

[video]www.youtube.com/watch?v=QzKFPGAo-70[/video]

par contre je voulais savoir comment fait-on pour mettre un picaxe 40x en 32Mhz ?
 

alainav1

Senior Member
Bonjour,
j'a irelu le post #1
objectif : remplacer des interrupteur au mercure
sot une masse métallique suspendu par un fil métallique (comme un pendule)
la masse metalique vient "frapper à droit à gauche ... suivan tle sens de l'impulsion de la frappe .
il suffit de détecter ou ça frappe.(petit interrupteur fin de course par exemple )
c'est pas suffisant comme détection ?
( je sais ! c'est pas necessaire de faire simple quand on peut faire compliqué:) )

Cordialement
Alain
Alain
 
Last edited:

electrique5

Senior Member
Je c'est pas si c'est X1 ou un X2 c'est pas indiqué dessus il est marqué PIC16F887
si vous pouviez me donnez le code au complet pour les 2 je testerais
Merci

pour répondre a alainav1 oui j'ai déjà testé le souci c'est que ca balance plusieurs fois du coup ca fait contact a plusieurs reprises
 

BESQUEUT

Senior Member
Je c'est pas si c'est X1 ou un X2 c'est pas indiqué dessus il est marqué PIC16F887
Voir Superseded-Parts
Pas de bol : c'est un X1

Donc, sans rien changer physiquement, rajouter au début du programme :
setfreq m8
Ça ira deux fois plus vite : pas sur que ça suffise, mais c'est déjà ça.
Attention : du coup les "pause 500" ne durent que 250 ms. Il faudra probablement les doubler.

Avec un résonnateur externe, vous pourriez monter jusqu'à :
setfreq em20

et du coup, ça tournerait 5 fois plus vite !
Même remarque pour la durée des pauses à multiplier en conséquence.

Si en plus du résonnateur externe, vous passez sur 40X2, pour pouvez monter à :
setfreq em64
et donc tourner 16 fois plus vite...
 
Last edited:

electrique5

Senior Member
la j'ai un souci j'ai ajouter setfreq m8 en début mais la j'ai mon écran lcd qui s'emballe il m'affiche des symboles bizzard
est-ce qu'il fait que je modifie mon code LCD ?
serout 7,N2400_4
 

MGU

Senior Member
Bonjour,

Bizarre, Le LCD est programmé avec N2400.
Mais il faut adapter la vitesse horloge
Pour 8 Mhz: N2400_8
Pour 16Mhz N2400_16

MM
 

electrique5

Senior Member
On dirais que ca va un peu mieux il va détecté du bon bon coté on va dire 4 fois sur 5
La je viens de retrouvé un X2 pour testé je voulais vous demandé c'est bien le même brochage ?
je viens d'essayé le même programme bon pour l'accéléromètre c'est bon pas de souci de changement de broche

par contre c'est les décision avec le X1 quand je fait une décision pour un bouton poussoir sous logicator et que je converti en basic
il me donne le code :
if pin0 = 1 then label_319
pin0 correspond a la broche 19 qui correspond a C.0

toutefois quand je met le X2 du coup ca ne correspond plus a C.0 mais a D.0 pour le X2 toujours sur la broche 19
et je voudrait savoir si il était possible de mettre D.0 sous logicator car impossible de le faire car je voudrait gardé le même brochage que le X1
car a chaque fois que je fait une décision il me propose 7 entrée mais toutes corresponde a C et impossible de choisir D sous logicator.
autrement si c'est pas faisable tempi je changerais de broche
 

electrique5

Senior Member
Je vient de testé sur un X2 même chose il détecte du bon coté 4fois sur 5 c'est déjà mieux qu'avant.
je pense que je vais resté comme ca , ca fonctionne déjà pas trop mal pour les broches tampi c'est pas grave j'ai juste changé rien de bien méchant.
en tous cas merci de votre aide ca m'a bien aider
 

BESQUEUT

Senior Member
Je vient de testé sur un X2 même chose il détecte du bon coté 4fois sur 5 c'est déjà mieux qu'avant.
Sur un X2 sans résonateur externe, vous pouvez aller jusqu'à :
setfreq m16

et bien sur il faut corriger tout ce qui dépend de la fréquence.
Pour le LCD, vous pouvez aussi revenir à une fréquence plus faible juste pour ça, et repartir à fond juste après.

Vous pouvez peut être également gagner un peu de fiabilité :
- en jouant sur la durée de la pause,
- en jouant sur les seuils.
 

dje8269

Senior Member
Bonjour à tous,

Avez vous songé à une approche purement plus "physique" de la chose ? qui serait peut etre moins contraignant et beaucoup plus facile à programmer .

Par exemple deux contact (genre bille avec ressort) de chaque côtés qui colle à un morceaux de ferraille. ce morceaux de ferraille relié a la masse servant de pull-down .

Vous exercer une frappe d'un coté:
le premier contacteur se décolle pendant la phase d'accélération tandis que le second reste (encore plus) collé pendant cette phase. le fait de décollé par exemple coupe la pull-down et envoi donc signal aux µC par interruption !
Pendant la phase de décélération les choses s'inverse bien évidement. le but étant d&#8217;inhiber cette deuxième phase une fois la première détectée !

un peu à la manière d'un encodeur rotatif !
c'est moins élégant qu'un accéléromètre mais bon ....

Bonne chance !
 
Last edited:

BESQUEUT

Senior Member
Pendant la phase de décélération les choses s'inverse bien évidement. le but étant d&#8217;inhiber cette deuxième phase une fois la première détectée !i
Donc on a exactement le même problème qu'avec l'accéléromètre...
Par contre, il est bien plus facile de changer les seuils par programme que d'avoir à le faire mécaniquement avec des ressorts et des vis de butée...(sans parler des rebonds sur des contacts électriques foireux...)
et en prime, ça ne se dérègle pas avec le temps, l'oxydation et les brutalités successives...
 

PieM

Senior Member
Je vient de testé sur un X2 même chose il détecte du bon coté 4fois sur 5 c'est déjà mieux qu'avant.
je pense que je vais resté comme ca , ca fonctionne déjà pas trop mal pour les broches tampi c'est pas grave j'ai juste changé rien de bien méchant.
en tous cas merci de votre aide ca m'a bien aider
Ne plus utiliser Logicator, mais au pire, le mode organigramme de PE6. les broches sont configurables en entrées sorties, sans compter d'autres améliorations !
 

electrique5

Senior Member
Voila en gros comment j'ai fait
au départ du programme je lit une variable d'écart qui est stocké dans une eeprom: read 1,varB
ensuite une première lecture de l'accéléromètre au repos (varA)
ensuite je fait 2 variable C et D par rapport a la première mesure de l'accéléromètre au démarrage du flipper une addition et une soustraction

let varC = varA - varB
let varD = varA + varB

ensuite je relis l'accéléromètre en permanence si il y a un choc et je compare la direction
si A est inférieur a C ou si A est supérieur a D

et une fonction de programmation via un ptit bouton poussoir qui va dans un sous programme qui me permet de régler la valeur de la marge et qui sera sauvegardé dans une eeprom.
l'eeprom m'est nécessaire pour récupérer le réglage a chaque démarrage du système.
ca a l'air de fonctionné sauf que de temps en temps ca ne détecte pas a tous les coups la bonne direction mais bon c'est déjà mieux que le mercure.
 
Top