But gérer un stick d’arcade a switch ( 4 switch pour 8 directions ) depuis une entrée analogique pour limiter le nb d’entrées utilisées ( 4 normalement 1 pour chaque switch ) et utiliser un module digispark pro USB ( a base d’ATtiny167 ~3€ chez aliexpress ) et aussi gestion de 8 boutons sur le gamepad .
.
Pour gérer le signal analogique qui permettras de savoir quelle position a été actionné , j’utilise un pont diviseur de tension a résistance. :petit rappel U1 = (R1/(R1+R2)) x U
schéma du “stick analogique” :
j’utilise des résistances a 1% pour faciliter l’étalonnage du système et pour les tests un module arduino , code de test :
1 2 3 4 5 6 7 8 9 10 11 12 |
#include <Arduino.h> void setup() { Serial.begin(9600); } void loop() { int sensorValue = analogRead(A0); Serial.println(sensorValue); delay(200); } |
valeurs R=20K , R1=10K , R2=20K R3=82K R4=39K, VE alimentation du module: 5V
pour les positions en diagonale ( HD , BD , BG , HG ) on se retrouve avec 2 résistances en parallèle dans notre pont diviseur :
R5eq=(R1*R2)/(R1+R2) ( pour la position HD )
R6eq=(R3*R2)/(R3+R2) ( pour la position BD )
R7eq=(R3*R4)/(R3+R4) ( pour la position BG )
R8Eq=(R1*R4)/(R1+R4) ( pour la position HG )
pour chaque direction au auras en théorie :
Pos | VS | tension | resultat ADC | valeur réelle |
X | VE | 5.00 V | 1023 | 1023 |
H | (R1/(R+R1)) xVE | 1.67 V | 341 | 344 |
B | (R2/(R+R2)) xVE | 4.02 V | 823 | 825 |
G | (R4/(R+R4)) xVE | 3.31 V | 677 | 674 |
D | (R3/(R+R3)) xVE | 2.50V | 512 | 513 |
HD | (R5eq/(R+R5eq)) xVE | 1.25 V | 256 | 257 |
BD | (R6eq/(R+R6eq)) xVE | 2.23 V | 456 | 458 |
BG | (R7eq/(R+R7eq)) xVE | 2.85 V | 583 | 582 |
HG | (R8eq/(R+R8eq)) xVE | 1.42 V | 292 | 292 |
comme on le voit dans le tableau les valeurs réelle sont très proches des valeurs théoriques , grâce aux résistances de 1% , pas la peine de prendre des résistances plus précises
source arduino pour retourner les différentes positions
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#include <Arduino.h> #define NbPos 8 unsigned int MapPosition[]={256,292,341,456,512,583,823,677}; int MapPositionMin,MapPositionMax; String Position[]={"Haut Droit","Haut Gauche","Haut","Bas Droit","Droit","Bas Gauche","Bas","Gauche"}; float marge=1 ; // marge en % pour definir borne mini maxi void setup() { Serial.begin(9600); } void loop() { int i; int sensorValue = analogRead(A0); if (sensorValue<=1000) { for (i=0;i<NbPos;i++) { MapPositionMin = MapPosition[i]-(MapPosition[i]*marge/100); MapPositionMax = MapPosition[i]+(MapPosition[i]*marge/100); if ((sensorValue>=MapPositionMin) and (sensorValue<=MapPositionMax)) { Serial.println(Position[i]); } } } delay(200); } |
sortie depuis le terminal (depuis l’interface atom / platformio )
1 2 3 4 5 6 7 8 9 10 11 |
PS C:\Users\thierry\Seafile\Arcade\AnalogDir_Joystick\test> pio device monitor --port COM8 --- Miniterm on COM8 9600,8,N,1 --- --- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H --- Haut Haut Droit Droit Bas Bas Droit Bas Gauche Gauche Haut Gauche |
Firmware terminé sources dispos sur Gitlab