BENVENUTO!

Proggetto UFC Arduino Micro Tournament

Tournament

Pilota
Registrato
30 Settembre 2012
Messaggi
3.413
Buonasera a tutti.

Si anche io. Sto provando a fare un UFC per il mio amato A-10C.
Stuzzicato dal progetto di Tellurico prima, Harley e Thunder poi, ho già provveduto a comprare la prima attrezzatura e il materiale per imbattermi in questo progetto.

Ho scelto di utilizzare, come ha fatto Harley, arduino micro.
Nel video tutorial che anche lui ha seguito, vengono fornite già molte informazioni sul progetto, MA, io vorrei personalizzarmelo. Come? Innanzitutto dargli una forma un pò più realistica, come il progetto di tellu, ma con l'agiunta dei rotativi per regolare il volume delle tre radio di simple radio, dove nei momenti più concitati sarebbe molto utile gestire i vari volumi da manopole fisiche anchè cercare il comando con il mouse.

I materiali:

Software Arduino
Arduino micro
Potenziometri
Basetta millefori
Fili elettrici colorati
Pulsanti led arancio
Pulsanti led verde
Resistenze da 680 Ohm per i led dei pulsanti.

Per il box che dovrà contenere il tutto ci sto lavorando.
Per il pannello frontale, ho deciso che non lo farò con i pulsanti sporgenti, dove verrebbe fuori il problema come scrivere le funzioni frontalmente e retro illuminarli contemporaneamente, ma coprirò il tutto con un foglio in PVC stampato.
Capisco che cosi non è chiaro ma cercherò di spiegare meglio più avanti.

In allegato trovate:
un file word dove ho ripreso (come il buon Harley) gli schemi mostrati sul video. Ho fatto gli screen e li ho impaginati in modo di non dover fare avanti e indietro con il video.

Lo sketch da inserire sull'arduino micro.

Codice:
//BUTTON BOX 
//USE w ProMicro
//Tested in WIN10 + Assetto Corsa
//AMSTUDIO
//20.8.17

#include <Keypad.h>
#include <Joystick.h>

#define ENABLE_PULLUPS
#define NUMROTARIES 4
#define NUMBUTTONS 24
#define NUMROWS 5
#define NUMCOLS 5


byte buttons[NUMROWS][NUMCOLS] = {
  {0,1,2,3,4},
  {5,6,7,8,9},
  {10,11,12,13,14},
  {15,16,17,18,19},
  {20,21,22,23},
};

struct rotariesdef {
  byte pin1;
  byte pin2;
  int ccwchar;
  int cwchar;
  volatile unsigned char state;
};

rotariesdef rotaries[NUMROTARIES] {
  {0,1,24,25,0},
  {2,3,26,27,0},
  {4,5,28,29,0},
  {6,7,30,31,0},
};

#define DIR_CCW 0x10
#define DIR_CW 0x20
#define R_START 0x0

#ifdef HALF_STEP
#define R_CCW_BEGIN 0x1
#define R_CW_BEGIN 0x2
#define R_START_M 0x3
#define R_CW_BEGIN_M 0x4
#define R_CCW_BEGIN_M 0x5
const unsigned char ttable[6][4] = {
  // R_START (00)
  {R_START_M,            R_CW_BEGIN,     R_CCW_BEGIN,  R_START},
  // R_CCW_BEGIN
  {R_START_M | DIR_CCW, R_START,        R_CCW_BEGIN,  R_START},
  // R_CW_BEGIN
  {R_START_M | DIR_CW,  R_CW_BEGIN,     R_START,      R_START},
  // R_START_M (11)
  {R_START_M,            R_CCW_BEGIN_M,  R_CW_BEGIN_M, R_START},
  // R_CW_BEGIN_M
  {R_START_M,            R_START_M,      R_CW_BEGIN_M, R_START | DIR_CW},
  // R_CCW_BEGIN_M
  {R_START_M,            R_CCW_BEGIN_M,  R_START_M,    R_START | DIR_CCW},
};
#else
#define R_CW_FINAL 0x1
#define R_CW_BEGIN 0x2
#define R_CW_NEXT 0x3
#define R_CCW_BEGIN 0x4
#define R_CCW_FINAL 0x5
#define R_CCW_NEXT 0x6

const unsigned char ttable[7][4] = {
  // R_START
  {R_START,    R_CW_BEGIN,  R_CCW_BEGIN, R_START},
  // R_CW_FINAL
  {R_CW_NEXT,  R_START,     R_CW_FINAL,  R_START | DIR_CW},
  // R_CW_BEGIN
  {R_CW_NEXT,  R_CW_BEGIN,  R_START,     R_START},
  // R_CW_NEXT
  {R_CW_NEXT,  R_CW_BEGIN,  R_CW_FINAL,  R_START},
  // R_CCW_BEGIN
  {R_CCW_NEXT, R_START,     R_CCW_BEGIN, R_START},
  // R_CCW_FINAL
  {R_CCW_NEXT, R_CCW_FINAL, R_START,     R_START | DIR_CCW},
  // R_CCW_NEXT
  {R_CCW_NEXT, R_CCW_FINAL, R_CCW_BEGIN, R_START},
};
#endif

byte rowPins[NUMROWS] = {21,20,19,18,15}; 
byte colPins[NUMCOLS] = {14,16,10,9,8}; 

Keypad buttbx = Keypad( makeKeymap(buttons), rowPins, colPins, NUMROWS, NUMCOLS); 

Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID, 
  JOYSTICK_TYPE_JOYSTICK, 32, 0,
  false, false, false, false, false, false,
  false, false, false, false, false);

void setup() {
  Joystick.begin();
  rotary_init();}

void loop() { 

  CheckAllEncoders();

  CheckAllButtons();

}

void CheckAllButtons(void) {
      if (buttbx.getKeys())
    {
       for (int i=0; i<LIST_MAX; i++)   
        {
           if ( buttbx.key[i].stateChanged )   
            {
            switch (buttbx.key[i].kstate) {  
                    case PRESSED:
                    case HOLD:
                              Joystick.setButton(buttbx.key[i].kchar, 1);
                              break;
                    case RELEASED:
                    case IDLE:
                              Joystick.setButton(buttbx.key[i].kchar, 0);
                              break;
            }
           }   
         }
     }
}


void rotary_init() {
  for (int i=0;i<NUMROTARIES;i++) {
    pinMode(rotaries[i].pin1, INPUT);
    pinMode(rotaries[i].pin2, INPUT);
    #ifdef ENABLE_PULLUPS
      digitalWrite(rotaries[i].pin1, HIGH);
      digitalWrite(rotaries[i].pin2, HIGH);
    #endif
  }
}


unsigned char rotary_process(int _i) {
   unsigned char pinstate = (digitalRead(rotaries[_i].pin2) << 1) | digitalRead(rotaries[_i].pin1);
  rotaries[_i].state = ttable[rotaries[_i].state & 0xf][pinstate];
  return (rotaries[_i].state & 0x30);
}

void CheckAllEncoders(void) {
  for (int i=0;i<NUMROTARIES;i++) {
    unsigned char result = rotary_process(i);
    if (result == DIR_CCW) {
      Joystick.setButton(rotaries[i].ccwchar, 1); delay(50); Joystick.setButton(rotaries[i].ccwchar, 0);
    };
    if (result == DIR_CW) {
      Joystick.setButton(rotaries[i].cwchar, 1); delay(50); Joystick.setButton(rotaries[i].cwchar, 0);
    };
  }
}

Le librerie utilizzate.

Attenzione, manca la libreria "keypad", io ci ho perso mezz'ora per capire. Con l'aiuto di harley sono riuscito a scaricarla direttamente dal software di arduino.

Essendo la prima volta che faccio un lavoro del genere, ho dovuto acquistare anche dell'attrezzatura:

Calibro digitale
Supporto per saldature
Saldatore stagno
 

Allegati

  • 32-FUNCTION-BUTTON-BOX-master.zip
    2,1 KB · Visite: 105
  • ArduinoJoystickLibrary-master.zip
    32,5 KB · Visite: 89
  • Screen di lavorazione del video.odt
    1,7 MB · Visite: 140
Ho testato "alla meno peggio" lo schetch con alcuni pulsanti e con i rotativi e funziona.
Unico problema per me è far illuminare il "master caution" come ha fatto Tellurico.

Qualcuno più pratico di me con la programmazione potrebbe aiutarmi?
E' possibile farlo?

Grazie mille! ;) :)
 
sei riuscito a impostare sui controlli di SR i volumi?
Perche volevo faro anche io ma non li ho trovati, pensavo invece di usarlo con le frequenze, io hoprovatoa fare due pannelli ma vanno in conflitto i due processori forse bisogna cambiare qualcosa a livello di programmazione, ma su quello sonouna vera capra
 
Thunder ha scritto:
sei riuscito a impostare sui controlli di SR i volumi?
Perche volevo faro anche io ma non li ho trovati, pensavo invece di usarlo con le frequenze, io hoprovatoa fare due pannelli ma vanno in conflitto i due processori forse bisogna cambiare qualcosa a livello di programmazione, ma su quello sonouna vera capra

Purtroppo sono ancora in fase progettuale thunder, mi devono arrivare ancora i pulsanti led verdi.
A questo problema ancora non ci sono arrivato...  :(
 
Ma da dcs non c'é il comando da associare alle manopole dei volumi radio?

Inviato dal mio LG-H870 utilizzando Tapatalk

 
ah si forse per i cockpit cliccabili si... io usando il 25 e il 27 non ho i cockpit cliccabili...
 
Thunder ha scritto:
ah si forse per i cockpit cliccabili si... io usando il 25 e il 27 non ho i cockpit cliccabili...
Ah giusto! Non ci avevo pensato! Ma allora SR non offre questa possibilità?

Inviato dal mio LG-H870 utilizzando Tapatalk

 
Se non erro sia SR che dcs offrono la possibilità di abbinare dei tasti ai "volumi".. si tratta solo di trovarli..
 
Scusate se uno volesse aggiungere più pannellini esterni, ho visto che vanno in conflitto quindi probabilmente bisogna cambiare qualcosa a livello di programmazione del processore arduino per fargli prendere degli interrupt diversi.

Qualcuno sa come?
 
Stavo cercando anche io una soluzione del genere ma non ne ho le capacità....

Inviato dal mio LG-H870 utilizzando Tapatalk

 
Tournament ha scritto:
Stavo cercando anche io una soluzione del genere ma non ne ho le capacità....

Inviato dal mio LG-H870 utilizzando Tapatalk

secondo me quello giusto è tellurico
 

Ultimi Messaggi

Indietro
Alto Basso