Salve a tutti è un pò che uso arduino, e ora volevo impegnarmi in un progetto che esegue l'emulazione di una tastiera usb interfacciata con un tastierino numerico 4x3 con libreria I2c e wire.
Gli sketch separati funzionano (quelli di esempio nella libreria) ma se vado a interfacciarli insieme no.
Nel senso che il programma viene ottimamente compilato e scaricato all'interno di arduino, ma quando inserisco l'USB ne mio pc da 2 suoni continui come se venisse riconosciuta 2 volte la tastiera e quando premo un tasto del 4x3 non succede nulla.
Lo sketch di seguito dovrebbe scrivere "Hello World" quando viene premuto un qualsiasi tasto, ma non succede nulla.
Aiutatemi sto impazzendo da una settimana!
Grazie in anticipo.
// Configure button inputs and set up the USB connection to the host
void setup()
{
Wire.begin(); //Inizializza La Libreria Wire
kpd.init(); //Inizializza oggetto Keypad
// Disable timer0 since it can mess with the USB timing. Note that
// this means some functions such as delay() will no longer work.
TIMSK0&=!(1<<TOIE0);
// Clear interrupts while performing time-critical operations
cli();
// Force re-enumeration so the host will detect us
usbDeviceDisconnect();
delayMs(250);
usbDeviceConnect();
// Set interrupts again
sei();
}
/**
Main program loop. Scan for keypresses and send a matching keypress
event to the host
FIXME: currently repeats as fast as it can. Add transition detection
*/
void loop()
{
UsbKeyboard.update();
char key=kpd.get_key();
if (key != '\0') {
UsbKeyboard.sendKeyStroke(KEY_H, MOD_SHIFT_LEFT);
UsbKeyboard.sendKeyStroke(KEY_E);
UsbKeyboard.sendKeyStroke(KEY_L);
UsbKeyboard.sendKeyStroke(KEY_L);
UsbKeyboard.sendKeyStroke(KEY_O);
UsbKeyboard.sendKeyStroke(KEY_SPACE);
UsbKeyboard.sendKeyStroke(KEY_W, MOD_SHIFT_LEFT);
UsbKeyboard.sendKeyStroke(KEY_O);
UsbKeyboard.sendKeyStroke(KEY_R);
UsbKeyboard.sendKeyStroke(KEY_L);
UsbKeyboard.sendKeyStroke(KEY_D);
UsbKeyboard.sendKeyStroke(KEY_ENTER);
//digitalWrite(ledPin, !digitalRead(ledPin)); // Toggle status LED
}
}
/**
Define our own delay function so that we don't have to rely on
operation of timer0, the interrupt used by the internal delay()
*/
void delayMs(unsigned int ms)
{
for (int i = 0; i < ms; i++) {
delayMicroseconds(1000);
}
}
non ho mai usato queste librerie quindi con il codice non so aiutarti ma so che quando windows fa 2 suoni consecutivi vuole dire che non ha riconosciuto il dispositivo...
spero che ti possa essere di aiuto
fare "bumping" (cioè continuare a scrivere "help me") è una cosa antipatica che su questo forum non ci piace.
inoltre la tua domanda non specifica che hardware stai utilizzando etc...
ale92 ti ha già risposto che nessuno ha usato quella libreria perciò non ricevi risposte.
hai letto la topic "Aiutateci ad aiutarvi??" li c'è spiegato come aumentare le possibilità di risposta.
Immagino che tu stia utilizzando un usb host shield. ti consiglio di rivolgerti a chi ti ha venduto lo shield per aiuto. se l'hai comprato su ebay mi spiace ma sei solo e abbandonato..
Massimo scusa x tutti gli help me,
ma x la usb shield l'ho costruita da me e con la sola libreria usbKeyboard funziona, purtroppo se la interfaccio con la libreria wire no.
l'hardware che uso è arduino Uno.
Ciao, puoi pubblicare i link delle librerie che usi?
Prova inoltre a commentare l'include della Wire o a scambiarle di posto. Spesso capita che una libreria sia richiamata da un'altra libreria e siccome è già definita non viene caricata la seconda volta.
Credo che il problema possa essere la disabilitazione del Timer0. Questo crea incompatibilità tra le due librerie. Potresti provare a cercare su internet una libreria che usa un'altro timer oppure aspettare che qualcuno più competente di me ti dia una mano.
Io non sono ancora in grado di gestire e modificare i timer interni di Arduino.
Grazie Paolo,
Ho notato una cosa, che praticamente è solo l'istruzione:
char key=kpd.get_key();
è solo questa che provoca il non riconoscimento della periferica USB, ma non posso eliminarla perchè è quella che praticamente riceve il dato dal tastierino numerico!
se la commento infatti il programma funziona e la periferica viene riconosciuta regolarmente.