Digispark GamePad

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 :

#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

#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 )

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 de base en cours

Firmware terminé  sources dispos sur Gitlab