progetto esame 2015

salve, mi chiamo thomas, e faccio la 5^ in un istituto tecnico, indirizzo elettronico. per l'esame di stato ho deciso di creare un guanto con interruttori sulle punte delle dita che, tramite arduino( io ho un arduino uno rev 3), funzioni in modalità keyboard, per utilizzarlo per giocare a giochi come minecraft, league of legend, o altri. per fare ciò ho seguito questa guida:

http://mysideprojectsnsuch.blogspot.it/2012/06/arduino-as-rfid-to-hid-text-input.html

per trasformarlo in un interfaccia usb hid. qui vi chiedo: potreste aiutarmi e darmi consigli ? il mio professore ha detto che l'hid è una libreria e quindi ha comandi appositi, ma: 1: non trovo la libreria 2: qua si parla di una vera e propria riprogrammazione del chip di interfaccia usb, non di una semplice libreria.

quindi, avete qualche consiglio da darmi ? voi come agireste? e se è una libreria, potreste passarmela e spiegarmi l'utilizzo ?

mi affido a voi ;) vi ringrazio in anticipo per la visione e le risposte che mi darete ( se gentilmente me le darete ahahah :D)

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni e a leggere il regolamento: Regolamento - qui una serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections - qui le pinout delle varie schede by xxxPighi: Pinout - qui una serie di link [u]generali[/u] utili: Link Utili

presentato, letto il regolamento e letti i link che mi hai cortesemente fornito

Ciao, il tuo professore ... sbaglia ... :smiling_imp:

HID = "Human Interface Device" identifica, come dice il nome, interfacce che interagiscono direttamente con l'uomo (joystick, keyboard, ecc). Arduino UNO, di base, NON si presenta come un HID (contrariamente ad Arduino Leonardo, dove ciò è possibile), ma, riprogrammando opportunamente il Atmega16U2 (ovvero il chip che interfaccia la seriale di Arduino alla USB) è possibile farlo.

Attenzione, riprogrammando il Atmega16U2 si perde però la possibilità di caricare i programmi su Arduino via USB, cosa che si può fare ... ripristinando il FW originale che è scritto sul Atmega16U2 quando ti arriva.

Una bella rottura di scatole ... ... ma ... non ti conviene prendere un bel Arduino Leonardo e usare le apposite librerie che simulano device HID (es. tastiera) senza diventare matto con Arduino UNO ? ;)

Guglielmo

allora, intanto ti ringrazio INFINITAMENTE per il chiarimento, e per la risposta. Davvero grazie mille ! :)

purtroppo, non sapendo che con arduino leonardo è possibile fare una cosa simile, ho già preso l'uno, e avendoci speso 50 euro ( con kit ) a mio malgrado non ho altro da spendere ahahah

detto ciò: una volta settato come tale, ha dei consigli per la programmazione ?

grazie in anticipo, thomas

Ciao thomas,
se vuoi emulare una periferca HID a bassa velocità come la tastiera potresti prendere in considerazione l’utilizzo della libreria vusb:

Qui trovi un esempio completo basato su Arduino con schemi, ecc:
http://www.practicalarduino.com/projects/virtual-usb-keyboard

Ciao
Silvio

sisuino: Ciao thomas, se vuoi emulare una periferca HID a bassa velocità come la tastiera potresti prendere in considerazione l'utilizzo della libreria vusb: ...

SE funziona, e ribadisco il SE (... di problemi con vusb ne ho letti parecchi in giro), potrebbe essere una buona idea ... senza dover riprogrammare il Atmega16U2 ;)

Guglielmo

gpb01: SE funziona, e ribadisco il SE (... di problemi con vusb ne ho letti parecchi in giro),

Più che un se è una certezza, inoltre emulare completamente l'usb da software è un suicidio per la cpu come impegno di risorse, per non parlare del fatto che la USB è un bus differenziale mentre i GPIO di un AVR sono referenziati a GND. Una possibile soluzione, senza modificare Arduino, è usare un servizio di Windows per premere i tasti della keyboard, o muovere il mouse, in funzione dei comandi inviati da Arduino tramite seriale.

E' vero, emulare la USB completamente in software non è semplicissimo e in effetti ci ho messo un paio di giorni tra capire come usare la libreria e ottimizzare il tutto. Purtroppo non riesco a trovare lo schema e lo sketch che avevo usato, li avrei postati volentieri come punto di partenza perchè alla fine andava. Ci avevo costruito un piccolo token USB di autenticazione, in pratica metteva automaticamente user e password dei siti.

Io avevo scelto questa soluzione per evitare di dover avere del software specifico sul PC (perchè dipende dal sistema operativo ed è un po' una menata se ti sposti da Windows a Mac o Linux) però se thomas non ha questa esigenza la soluzione di un "proxy" che faccia il lavoro di trasformazione dei caratteri ricevuti da seriale in keystrokes è sicuramente una via più immediata.

Ciao Silvio

È meglio usare un Arduino Leonardo che ha la libreria per fingersi tastiera o mouse.
Dici di non avere soldi per comprati un altra scheda ma stai attento non hai neanche tanto tempo per realizzare il progetto. Devi sempre anche imparare le altre materie che vanno alla maturitá.
Ciao Uwe

continuo a ringraziarvi per l'aiuto e le considerazioni che mi sono veramente di grande aiuto! :) mi state togliendo dubbi che mi hanno tartassato per settimane ahah :) comunque, purtroppo [u]ho già mandato arduino in dfu mode e riprogrammato attraverso flip come se fosse una hid[/u], come spiegato in questa guida

http://mysideprojectsnsuch.blogspot.it/2012/06/arduino-as-rfid-to-hid-text-input.html

( infatti non riesco a programmarlo perchè l'ho letto alla fine che non era più riprogrammabile)

quindi adesso dovrei prendere l'integrato, programmarlo su un altro arduino non settato per essere un usb hid e rimetterlo nel mio xD praticamente il lavoro l'avrei già fatto, adesso io [u]non capisco come programmarlo[/u] D: non capisco che comandi usare, se di una libreria a se ( da integrare o già presente) o in semplice linguaggio arduino, questo è il mio principale dubbio amletico :/

thank you,

Thomas

DanteAuditore: ... adesso io [u]non capisco come programmarlo[/u] D:

... nella pagina che hai linkato c'è un bell'esempio fatto ... guarda/studia la funzione "void type(char str)" (*Function to send char[] to computer as keyboard presses ...) che simula la trasmissione come se i dati fossero generati da una kbd ;)

Guglielmo

oook, grazie per il consiglio.

purtroppo è da ieri che cerco informazioni su quella funzione, ma non ne trovo D: qualcuno potrebbe aiutarmi ? tra l’altro non riesco a leggere bene quel programma, è abbastanza articolato ( ma soprattutto non so cosa sia la parallax rfid, indi parecchi comandi sono, a me, sconosciuti)

questo per me è come aramaico antico ahahah

if ((*chp >= ‘a’) && (*chp <= ‘z’)) {
buf[2] = *chp - ‘a’ + 4; //Converts from char to usb code from HUT1_11.pdf
} else if ((*chp >= ‘A’) && (chp <= ‘Z’)) {
buf[0] = KEY_LEFT_SHIFT; /
Caps */
buf[2] = *chp - ‘A’ + 4; //Converts from char to usb code from HUT1_11.pdf
} else if ((*chp >= ‘0’) && (*chp <= ‘9’)) {
buf[2] = *chp - ‘0’ + 30; //Converts from char to usb code from HUT1_11.pdf
} else {
switch (*chp) {
case ’ ':
buf[2] = 0x2c; // Space
break;

C'è poco da spiegare ...

... la USB di Arduino, con il FW modificato sul Atmega16U2, si comporta come una KBD (Tastiera) e quindi, da programma, quello che tu scrivi sulla seriale esce da quella porta ... MA ... occorre conoscere i codici esatti che devono essere inviati per simulare un tasto.

In testa alla funzione c'è un bel commento ...

// Function to send char[] to computer as keyboard presses // This section is based on http://hunt.net.nz/users/darran/weblog/b3029/Arduino_UNO_Keyboard_HID_version_03.html // Modified to handle numerals

... che appunto ti spiega da dove sono state prese le informazioni.

La funzione richiede semplicemente in ingresso una stringa di char (un array di char terminato da 0x00) che rappresenta la sequenza di tasti da premere (... ovvero che vengono inviati alla USB).

Lascia stare tutto ciò che riguarda RFID, non ti interessa e lo puoi ignorare.

Guglielmo

ALLORA: dopo una giornata passata a studiare, tradurre, scaricare, caricare, scrivere ed intuire ho finalmente creato un programma

#include <SoftwareSerial.h>
uint8_t buf[8] = { 0 }; /* Keyboard report buffer */

#define KEY_LEFT_CTRL 0x01
#define KEY_LEFT_SHIFT 0x02
#define KEY_RIGHT_CTRL 0x10
#define KEY_RIGHT_SHIFT 0x20

void setup()  
{
  Serial.begin(9600); //connection between chips
  delay(200);


pinMode(8,INPUT);

pinMode(9,INPUT);

pinMode(10,INPUT);

pinMode(11,INPUT);

pinMode(12,INPUT);

pinMode(13,INPUT);

pinMode(7,OUTPUT);

}



void type(char *str) 

{  
    
    char *chp = str;
    delay(100);
    while (*chp) {
     
 if ((*chp >= 'a') && (*chp <= 'z')) {
     buf[2] = *chp - 'a' + 4; //Converts from char to usb code from HUT1_11.pdf 
 } else if ((*chp >= 'A') && (*chp <= 'Z')) {
     buf[0] = KEY_LEFT_SHIFT; /* Caps */
     buf[2] = *chp - 'A' + 4; //Converts from char to usb code from HUT1_11.pdf 
 } else if ((*chp >= '0') && (*chp <= '9')) {
     buf[2] = *chp - '0' + 30; //Converts from char to usb code from HUT1_11.pdf 
 } else {
     switch (*chp) {
     case '000001':
      buf[2] = 0x04; // a
  break;
     case '000010':
      buf[2] = 0x26; // w
  break;
     case '000100':
      buf[2] = 0x22; // s
  break;
     case '001000':
      buf[2] = 0x07; // d
  break;
     case '010000':
      buf[2] = 0x44; // space
  break;
     case '100000':
      buf[2] = 0x04; // q
  break;
     default:
         /* Character not handled. To do: add rest of chars from HUT1_11.pdf */
  //buf[2] = 0x37; // Period
  break;
     }
 }

 Serial.write(buf, 7); // Send keypress
 buf[0] = 0;
 buf[2] = 0;
 Serial.write(buf, 7); // Release key
 chp++;
    }
}



void loop() 

{ 
digitalRead(PORTB); 
  type(PORTB);

}

ringrazio tutti quelli che hanno risposto per avermi aiutato ad arrivare a questo punto!( in particolare Guglielmo, o gpb01, che mi ha aperto mondi interi facendomi notare cose che altrimenti non avrei notato)

aimè, mi rimane solo un piccolo problema da risolvere ( prima di caricare il programma e molto probabilmente trovare altri errori da aggiustare ahahahah)
ovvero questo

programma_arduino_keyboard.ino: In function 'void loop()':
programma_arduino_keyboard:89: error: invalid conversion from 'uint8_t {aka unsigned char}' to 'char*' [-fpermissive]
programma_arduino_keyboard:33: error: initializing argument 1 of 'void type(char*)' [-fpermissive]
invalid conversion from 'uint8_t {aka unsigned char}' to 'char*' [-fpermissive]

eeeeee non capisco quale dovrebbe essere il problema, forse il fatto che il PORTB ha solo 6 pin e non 8?
qualcuno sa il problema?
(ringrazio ancora tutti per accompagnarmi in questo progetto che per me è alquanto complicato, o almeno lo è stato riuscire a creare il programma)

Hai tutta una serie di errori ... comincia a correggere i primi, perché mica ti da solo quelli ... anche i warning sono importanti ...

sketch_may19a.ino:50:11: warning: character constant too long for its type
sketch_may19a.ino:53:11: warning: character constant too long for its type
sketch_may19a.ino:56:11: warning: character constant too long for its type
sketch_may19a.ino:59:11: warning: character constant too long for its type
sketch_may19a.ino:62:11: warning: character constant too long for its type
sketch_may19a.ino:65:11: warning: character constant too long for its type

... i valori nei vari case dello switch non vanno bene.

Poi ...

sketch_may19a:56: error: duplicate case value
sketch_may19a:53: error: previously used here
sketch_may19a.ino:59: warning: overflow in implicit constant conversion
sketch_may19a:59: error: duplicate case value
sketch_may19a:53: error: previously used here
sketch_may19a.ino:62: warning: overflow in implicit constant conversion
sketch_may19a:62: error: duplicate case value
sketch_may19a:53: error: previously used here
sketch_may19a.ino:65: warning: overflow in implicit constant conversion
sketch_may19a:65: error: duplicate case value
sketch_may19a:53: error: previously used here

Ed infine occupati della parte finale ...

sketch_may19a.ino: In function 'void loop()':
sketch_may19a:89: error: invalid conversion from 'volatile unsigned char' to 'char*'
sketch_may19a:89: error: initializing argument 1 of 'void type(char*)'

studiando BENE cosa vuole la digitalRead() ... ;)

Guglielmo

D: a me in realtà da solo questa parte

programma_arduino_keyboard.ino: In function 'void loop()':
programma_arduino_keyboard:90: error: invalid conversion from 'uint8_t {aka unsigned char}' to 'char*' [-fpermissive]
programma_arduino_keyboard:33: error: initializing argument 1 of 'void type(char*)' [-fpermissive]
invalid conversion from 'uint8_t {aka unsigned char}' to 'char*' [-fpermissive]

il resto non ce l'ho tra i problemi.

forse ho aggiustato la parte dei case che dicevi sostituendo il valore binario con i corrispondenti valori decimali

     switch (*chp) {
     case '1':
      buf[2] = 0x04; // a
  break;
     case '2':
      buf[2] = 0x26; // w
  break;
     case '4':
      buf[2] = 0x22; // s
  break;
     case '8':
      buf[2] = 0x07; // d
  break;
     case '16':
      buf[2] = 0x44; // space
  break;
     case '32':
      buf[2] = 0x04; // q
  break;

anche se in ogni caso non me lo segna come errore :/

... vai nelle preferenze dell'IDE è attiva "Show verbose output during: compliation" ;)

Guglielmo

ok, dopo aver fatto ciò ed aver sistemato un paio di errori che mi venivano fuori, alla fine mi è rimasto questo:

Arduino: 1.6.4 (Windows 7), Плата"Arduino Uno"

?????????? ?????????? SoftwareSerial ? ?????: C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SoftwareSerial 



C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10604 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR -IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino -IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard -IC:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SoftwareSerial C:\Users\KRIKKI~1\AppData\Local\Temp\build1776169019545733888.tmp\programma_arduino_keyboard.cpp -o C:\Users\KRIKKI~1\AppData\Local\Temp\build1776169019545733888.tmp\programma_arduino_keyboard.cpp.o 

programma_arduino_keyboard.ino: In function 'void loop()':
programma_arduino_keyboard.ino:38:13: error: invalid conversion from 'uint8_t {aka unsigned char}' to 'char*' [-fpermissive]
programma_arduino_keyboard.ino:4:6: error:   initializing argument 1 of 'void type(char*)' [-fpermissive]
invalid conversion from 'uint8_t {aka unsigned char}' to 'char*' [-fpermissive]

che alla fin fine è solo l'errore di prima, ahah, quello non riesco proprio a sistemarlo eh ahahah

Guarda, il problema è tutto qui :

void loop() 
{ 
  digitalRead(PORTB); 
  type(PORTB);
}

... ti sei guardato la sintassi della digitalRead() ? Cosa richiede in ingresso ? E cosa gli stai dando tu ?

Idem ... guarda la type() cosa vuole e cosa gli stai passando tu ... ::)

Guglielmo