2 o più BARCODE PS/2

Salve a tutti, sto cercando di realizzare un dispositivo che mi legga dei barcode ( 4 scanner in tutto ) e mi memorizzi i dati su di una sd. La scelta è caduta su di un arduino mega 2560 con shield ethernet.

Sto adoperando la libreria PS2Keyboard ( ver. 2.3)

il problema mi sorge nel momento in cui configuro il secondo barcode, ovvero:

// imposta PIN KeyBoard_1
const int DataPin_KB_1 = 22;
const int IRQpin_KB_1 =  18;

// imposta PIN KeyBoard_2
const int DataPin_KB_2 = 24;
const int IRQpin_KB_2 =  19;

// assegna variabile KeyBoard_1
PS2Keyboard KB_1;
// assegna variabile KeyBoard_2
PS2Keyboard KB_2;

void setup() {
  delay(1000);
  // apre connessione KeyBoard_1
  KB_1.begin(DataPin_KB_1, IRQpin_KB_1);
  // apre connessione KeyBoard_2
  KB_2.begin(DataPin_KB_2, IRQpin_KB_2);

//OMISSIS

void loop() {
  // legge dati da KeyBoard_1
  if (KB_1.available()) {
    // read the next key
    char c = KB_1.read();
    Serial.print(c);
  }

  // legge dati da KeyBoard_2
  if (KB_2.available()) {
    // read the next key
    char c = KB_2.read();
    Serial.print(c);
  }

}

con un solo barcode funziona perfettamente, con la seconda apertura della connessione, la prima non funziona più, la seconda si.

Dovrebbero leggere entrambi, ed io ne vorrei addiritura 4.

Soluzioni e/o consigli ?

Grazie, Carlo

Non l'ho mai usata e quindi vado a naso ... .... sicuro che quella libreria può essere istanziata più volte e tutte le istanze funzionare [u]contemporaneamente[/u] ???

Perché QUI leggo :

The PS2Keyboard library uses one of the two available external interrupts to react on keyboard input. Once such input is received, it's stored in a one-byte buffer and is available to be read.

... quindi è legata agli interrupt e ... mi sa che quando una istanza è in uso le altre non vanno ... un po' come la SoftwareSerial, puoi definirne più di una, ma una sola per volta funziona ... :roll_eyes:

Guglielmo

Non so se quanto dice Guglielmo è giusto. La lib si aggancia agli interrupt d tipo INT, e la Mega ne ha 4, rispettivamente sui pin 18/19/20/21. Ogni interrupt ha la sua ISR, quindi in teoria se ne dovrebbe poter usare tante istanze quanti interrupt ha il chip.

Però non ho guardato bene il codice per capire meglio cosa faccia.

leo72: Non so se quanto dice Guglielmo è giusto. ....

Aspetta ... io mi ero limitato a riportare quanto dice l'autore, non avevo guardato il codice della Lib ... ;)

Ora, guardandolo, possiamo estrarre il seguente pezzo (che è quello che ci interessa) dal file PS2Keyboard.cpp :

#ifdef CORE_INT_EVERY_PIN
  irq_num = irq_pin;

#else
  switch(irq_pin) {
    #ifdef CORE_INT0_PIN
    case CORE_INT0_PIN:
      irq_num = 0;
      break;
    #endif
    #ifdef CORE_INT1_PIN
    case CORE_INT1_PIN:
      irq_num = 1;
      break;
    #endif
    #ifdef CORE_INT2_PIN
    case CORE_INT2_PIN:
      irq_num = 2;
      break;
    #endif
    #ifdef CORE_INT3_PIN
    case CORE_INT3_PIN:
      irq_num = 3;
      break;
    #endif
    #ifdef CORE_INT4_PIN
    case CORE_INT4_PIN:
      irq_num = 4;
      break;
    #endif
    #ifdef CORE_INT5_PIN
    case CORE_INT5_PIN:
      irq_num = 5;
      break;
    #endif
    #ifdef CORE_INT6_PIN
    case CORE_INT6_PIN:
      irq_num = 6;
      break;
    #endif
    #ifdef CORE_INT7_PIN
    case CORE_INT7_PIN:
      irq_num = 7;
      break;
    #endif
  }
#endif

e quest'altro dal file int_pins.h :

// interrupt pins for known boards

// Teensy and maybe others automatically define this info
#if !defined(CORE_INT0_PIN)

// Arduino Mega
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) // Arduino Mega
  #define CORE_INT0_PIN  2
  #define CORE_INT1_PIN  3
  #define CORE_INT2_PIN  21
  #define CORE_INT3_PIN  20
  #define CORE_INT4_PIN  19
  #define CORE_INT5_PIN  18

// Arduino Due (untested)
#elif defined(__SAM3X8E__) 
  #define CORE_INT_EVERY_PIN
  #ifndef PROGMEM
  #define PROGMEM
  #endif
  #ifndef pgm_read_byte
  #define pgm_read_byte(addr) (*(const unsigned char *)(addr))
  #endif

// Arduino Leonardo (untested)
#elif defined(__AVR_ATmega32U4__) && !defined(CORE_TEENSY)
  #define CORE_INT0_PIN  3
  #define CORE_INT1_PIN  2
  #define CORE_INT2_PIN  0
  #define CORE_INT3_PIN  1

// Sanguino (untested)
#elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644__) // Sanguino
  #define CORE_INT0_PIN  10
  #define CORE_INT1_PIN  11
  #define CORE_INT2_PIN  2

// Chipkit Uno32 (untested)
#elif defined(__PIC32MX__) && defined(_BOARD_UNO_)
  #define CORE_INT0_PIN  38
  #define CORE_INT1_PIN  2
  #define CORE_INT2_PIN  7
  #define CORE_INT3_PIN  8
  #define CORE_INT4_PIN  35

// Chipkit Mega32 (untested)
#elif defined(__PIC32MX__) && defined(_BOARD_MEGA_)
  #define CORE_INT0_PIN  3
  #define CORE_INT1_PIN  2
  #define CORE_INT2_PIN  7
  #define CORE_INT3_PIN  21
  #define CORE_INT4_PIN  20

// http://hlt.media.mit.edu/?p=1229
#elif defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
  #define CORE_INT0_PIN  2

// Arduino Uno, Duemilanove, LilyPad, Mini, Fio, etc...
#else
  #define CORE_INT0_PIN  2
  #define CORE_INT1_PIN  3

#endif
#endif

Quindi, effettivamente, sembrerebbe che, almeno la versione che ho scaricato (2.4) gestisca correttamente i possibili pin di interrupt ... sembra anche a te Leo ???

Guglielmo

Sì, è così. Il dubbio derivava proprio dal fatto che: 1) se stesse cercando di utilizzare 2 volte la stessa ISR, il compilatore gli darebbe un errore di riutilizzo dello stesso vector; 2) la lib si aggancia con un attachInterrupt all'interrupt INTx utilizzato.

Però vado a "naso", perché materialmente non posso fare provo. L'unica idea che mi viene in mente è quella di commentare la parte relativa all'uso della 1a istanza, quella KB_1, e provare solo KB_2: magari è solo un problema di collegamenti?

... comunque ... non si è più fatto vivo dal 13 Ottobre ... magari ha risolto ... :roll_eyes: :roll_eyes: :roll_eyes:

Guglielmo

I lettori Barcode PS/2 hanno 2 connettori e si mettono in serie alla tastiera. Per quello teoreticamente (non ho provato) dovresti poter mettere anche piú lettori barcode PS/2 in serie. Ciao Uwe