Problema con pro micro ATMEGA32U4

Salve a tutti

come da titolo ho in problema con una pro micro, sto realizzando una button box a 35 tasti, appena ho caricato lo sketch tutto e andato per il meglio, dopo di che il led tx si e spento. Facendo risultare il primo interruttore sempre a 1 sempre premuto. Dopo varie verifiche collegando la pro micro al pc senza fili il problema persiste.

La cosa che ho notato, i due led rx tx non sono uno verde e uno rosso ma entrambi rossi di cui il tx risulta spento.

Cosa mi sta sfuggendo?

Buonasera,
essendo il tuo primo post, nel rispetto del regolamento (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie.

Guglielmo

P.S.: Qui una serie di link utili, NON necessariamente inerenti alla tua domanda:
- serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections
- pinout delle varie schede by xxxPighi: Pinout
- link generali utili: Link Utili

perdonate il mio atteggiamento fuori dal regolamento

Per capire, parliamo di una Pro Micro originale Arduno o di un clone e, se clone, hai un link ?

Guglielmo

acquistata su amazon

Ok, è un clone ... hai uno schema dei collegamenti che hai fatto ?

Guglielmo

Ciao Andrea0414

Visto che non é un arduino originale ma un clone i colore dei due LED possono essere diversi da quelli del originale. Al colore non darei troppa attenzione.
Senza sketch e schema elettrico dei collegamenti coi pulsanti (anche disegnato su carta e fotografato) ho difficoltá di capire la causa del problema.

Ciao Uwe

lo schema

le mie perplessità sono inerenti agli interruttori a tre posizioni 1 0 1

... cortesemente, come ti ha chiesto anche Uwe, metti il codice che stai usando (... mi raccomando, in conformità al regolamento, punto 7, racchiuso tra i tag CODE che, in fase di edit, ti inserisce il bottone </> ... primo a sinistra).

Guglielmo

#include <Keyboard.h>

//BUTTON BOX 
#include <Keypad.h>
#include <Joystick.h>

#define ENABLE_PULLUPS
#define NUMROTARIES 4
#define NUMBUTTONS 35
#define NUMROWS 8
#define NUMCOLS 8


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},
  {24,25,26,27},
  {28,29,30,31},
  {32,33,34,35},
};

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, 35, 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);
    };
  }
}

quando ho provato lo sketch tutto andava bene inizialmente dopo il caricamento sulla scheda mi risultava il primo interruttore n 1 sempre attivo

Mmm ... onestamente non vedo cose particolari; usi anche i pin digitali della seriale Serial1 come pin di ingresso e questo non dovrebbe essere un problema, salvo che ... per non so quale motivo, il pin TX era a 1 e tu, con il commutatore a tre vie, lo hai collegato a GND ... facendo un bel corto e bruciando il pin ::slight_smile:

Per sicurezza, in questi casi, è sempre bene mettere tra i pin che vengono collegati a GND o Vcc, una resistenza da 220Ω così da limitare, in caso di errore (pin messo come OUTPUT ad un livello e collegato ad un altro), la corrente che scorre.

Guglielmo

faccio una domanda banale, l'alimentazione e presa dalla porta usb del pc, serve comunque una resistenza?
lo sketch che vedi Guglielmo caricato sulla pro micro senza collegare i fili alle varie entrate ed uscite in game mi segnava un interruttore sempre a 1, anche provando la scheda con un emulatore di tastiera per pc mi segnava sempre un interruttore sempre attivo a 1
ho solo resistenze da 320 Ω per led da 5V

La resistenza serve a limitare la corrente ...
... leggi QUESTO simpatico articolo, il tuo caso è il Method #1 ... :wink:

Ho idea che quel pin, essendo il TX della Serial1, venga inizialmente posto a HIGH (condizione di riposo per le seriali) ::slight_smile:

Vanno benissimo anche le 320Ω ... tanto gli ingressi sono ad alta impedenza e poche centinaia di Ohm non hanno alcuna influenza sulla lettura dello stato HIGH/LOW, ma, in compenso, proteggono dai corti non desiderati :slight_smile:

Guglielmo

sui connettori rx e tx va messo un encoder che viene visto sempre come un interruttore dal game il vantaggio sta nel fatto che ogni volta che giri c'è un incremento dei parametri come se premessi più volte un interruttore