Arduino Mega ADK e lettore codice a barre USB

Buonasera a tutti!

Sto cercando di realizzare un progetto in cui un Arduino Mega ADK (quindi con Max3421e e porta USB integrati) comunichi con un lettore di codice a barre USB.

Ho scaricato da Github la libreria USB hostshield (questa
GitHub - felis/USB_Host_Shield_2.0: Revision 2.0 of USB Host Library for Arduino.) e modificato il file settings.h come consigliato verso il fondo della pagina del link (cosa peraltro non obbligatoria per le ultime versioni dell'IDE).

Quindi ho preso il codice d'esempio della libreria proprio dedicato alle comunicazioni con un reader USB ma compilando ottengo questo errore:

""Never include libraryx.h directly; include Usb.h instead" dove al posto di libraryx.h mi compaiono tutte le librerie scaricate da github: avrpins.h, max3421e.h etc etc...
Inoltre mi dice che non può compilare il codice su Arduino ADK (non ricordo le parole precise, ma lascia appunto pensare a problemi di compatibilità tra l'hardware e la libreria).

Qualcuno può aiutarmi? Grazie mille! :slight_smile:

#include<hid.h>
#include<hiduniversal.h>


#include <LiquidCrystal.h>
#include <avr/pgmspace.h>
 
//#include <avrpins.h>
//#include <max3421e.h>
//#include <usbhost.h>
//#include <usb_ch9.h>
#include <Usb.h>
#include <usbhub.h>
#include <avr/pgmspace.h>
//#include <address.h>
#include <hidboot.h>
 
//#include <printhex.h>
//#include <message.h>
//#include <hexdump.h>
//#include <parsetools.h>
 
#define DISPLAY_WIDTH 16
 
// initialize the LCD library with the numbers of the interface pins
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
 
USB     Usb;
USBHub     Hub(&Usb);
HIDUniversal Hid(&Usb);
HIDBoot<USB_HID_PROTOCOL_KEYBOARD>    Keyboard(&Usb);
 
class KbdRptParser : public KeyboardReportParser
{
  void PrintKey(uint8_t mod, uint8_t key);
protected:
  virtual void OnKeyDown  (uint8_t mod, uint8_t key);
  virtual void OnKeyPressed(uint8_t key);
};
 
void KbdRptParser::OnKeyDown(uint8_t mod, uint8_t key)  
{
    uint8_t c = OemToAscii(mod, key);
 
    if (c)
        OnKeyPressed(c);
}
 
/* what to do when symbol arrives */
void KbdRptParser::OnKeyPressed(uint8_t key)  
{
static uint32_t next_time = 0;      //watchdog
static uint8_t current_cursor = 0;  //tracks current cursor position  
 
    if( millis() > next_time ) {
      lcd.clear();
      current_cursor = 0;
      delay( 5 );  //LCD-specific 
      lcd.setCursor( 0,0 );
    }//if( millis() > next_time ...
 
    next_time = millis() + 200;  //reset watchdog
 
    if( current_cursor++ == ( DISPLAY_WIDTH + 1 )) {  //switch to second line if cursor outside the screen
      lcd.setCursor( 0,1 );
    }
 
    Serial.print( (char)key );
    lcd.print( (char)key );
};
 
KbdRptParser Prs;
 
void setup()
{
    Serial.begin( 115200 );
    Serial.println("Start");
 
    if (Usb.Init() == -1) {
        Serial.println("OSC did not start.");
    }
 
    delay( 200 );
 
    Hid.SetReportParser(0, (HIDReportParser*)&Prs);
    // set up the LCD's number of columns and rows: 
    lcd.begin(DISPLAY_WIDTH, 2);
    lcd.clear();
    lcd.noAutoscroll();
    lcd.print("Ready");
    delay( 200 );
}
 
void loop()
{
  Usb.Task();
}

Ho risolto il problema seguendo un tutorial su youtube e un topic precedentemente aperto sul forum. Per ricapitolare, ecco cosa ho fatto:

-Ho aggiunto #include<hid.h> e #include<hiduniversal.h> a inizio codice (hid.h non era inclusa nella USB hostshield library)
-Ho commentato tutte le librerie che mi davano problemi
-Ho aggiunto queste due righe: a) USBHub Hub(&Usb); and **b)**HIDUniversal Hid(&Usb);
-Ho aggiunto USB_ alla riga successiva per compensare a un aggiornamento della libreria successivo al codice di esempio
-Ho aggiunto (char) al serial e lcd print

Ora però ho un altro problema: vorrei salvare il mio codice a barre in un array ma il codice che ho scritto non funziona. Eccolo:

uint8_t key_all[]={0,0,0,0,0,0,0,0,0,0,0,0,0};
int i;

    //crea array
    if (i<12) {
      key_all[i]= key;
      i++;
    }

    else if (i==12) {
      //key_all[12]=key;
      i=0;
      int t=0;
      for(t=0; t<13;t++){
      Serial.print( (char)key_all[t]);
    }
    }

L'ho aggiunto alla fine di void KbdRptParser::OnKeyPressed(uint8_t key).
Credo sia una domanda piuttosto basilare ma non riesco a venirne a capo :confused: