Go Down

Topic: Tastiera HID con Arduino UNO Rev 3 (Read 5992 times) previous topic - next topic

DanteAuditore

#30
Jun 16, 2015, 02:41 pm Last Edit: Jun 16, 2015, 02:47 pm by DanteAuditore
 grazie mille per aver risposto :D quando scrive lei, in particolare, sono estremamente felice, anche se mi spiace di farla tribolare, è sempre molto chiaro e spiega in maniera efficace.

tralasciando ciò: anche provando a cambiare in int e riprovando a caricare ecc.. il risultato non cambia e non ne capisco il problema.

Code: [Select]

int i;
uint8_t buf[8] = { 0 }; /* Keyboard report buffer */
uint8_t a[8]= {0,0,0,0,1,0,0,0};
uint8_t w[8]= {0,0,0,1,1,0,1,0};
uint8_t s[8]= {0,0,0,1,0,1,1,0};;
uint8_t d[8]= {0,0,0,0,0,1,1,1};;
uint8_t space[8]={0,0,1,0,1,1,0,0};;
uint8_t q[8]= {0,0,0,1,0,1,0,0};;


//QUA CI SONO LE PREMESSE

void setup()
{
    Serial.begin(9600);
  pinMode(6, INPUT);

  pinMode(7, INPUT);

  pinMode(8, INPUT);

  pinMode(9, INPUT);

  pinMode(10, INPUT);

  pinMode(11, INPUT);
}



//QUI C'è IL MAIN



void loop()

{
  int carattere[8];

  carattere[0] = digitalRead(6);
  carattere[1] = digitalRead(7);
  carattere[2] = digitalRead(8);
  carattere[3] = digitalRead(9);
  carattere[4] = digitalRead(10);
  carattere[5] = digitalRead(11);


  type(carattere);

}

// QUI INIZIA LA FUNZIONE CHE CONVERTE IN CHAR

void type(int *str)

{

  int *chp = str;
  while (chp) {

      switch (*chp) {
        case  1:
          for(i=0;i<8;i++)
             { buf[i]= a[i];
              } // a
          break;
        case 2 :
          for(i=0;i<8;i++)
             { buf[i]= w[i];
              } // w
          break;
        case 4 :
          for(i=0;i<8;i++)
             { buf[i]= s[i];
               }// s
          break;
        case 8 :
         for(i=0;i<8;i++)
             { buf[i]= d[i];
               }// d
          break;
        case 16 :
          for(i=0;i<8;i++)
             { buf[i]= space[i];
              } // space
          break;
        case 32 :
          for(i=0;i<8;i++)
             { buf[i]= q[i];
               }// q
          break;

        default:
          /* Character not handled. To do: add rest of chars from HUT1_11.pdf */
          //buf[2] = 0x37; // Period
          break;
      }
    }

    Serial.write(buf,8); // Send keypress
 for(i=0;i<8;i++)
             { buf[i]= 0;}
  }



adesso questa è la forma del programma, come prima non da errori di compilazione ecc.. ma non va...

mi chiedevo se non ci volessero dei deley o altro, forse ci sono discordanze sulle velocità, e anche se in breve tempo, forse, la conversione più di quanto non gliene venga dato. ma questa è solo un'ipotesi campata per aria, non so se possa essere costruttiva ahaha.

gpb01

#31
Jun 16, 2015, 03:12 pm Last Edit: Jun 16, 2015, 03:12 pm by gpb01
Scusa, però tu continui a passare un array di char ed a confrontarlo con degli int ...
... trasforma l'array di char in un int e poi passi alla funzione l'int che può essere confrontato nello switch !

Ovvero, dato che ogni elemento dell'array, se ho ben capito, rappresenta un bit ..

Code: [Select]
0,0,0,0,0,0 = 0x00
0,0,0,0,0,1 = 0x01
0,0,0,0,1,0 = 0x02
0,0,0,0,1,1 = 0x03
...
...
1,1,1,1,1,1 = 0x3F


... oppure ho capito male io ? ? ?

Guglielmo
Search is Your friend ... or I am Your enemy !

DanteAuditore

non capisco perchè dici un array di char

l'input che do dall'esterno è semplicemente 5 volt, così che il pin che prende il segnale diventi alto ( quindi 1)

l'array carattere{8} adesso è un int e così anche nella funzione è richiesta l'immissione di un int

e si, ogni elemento dell'array rappresenta un bit (0 o 1)

Code: [Select]
 
int carattere[8];

  carattere[0] = digitalRead(6);
  carattere[1] = digitalRead(7);
  carattere[2] = digitalRead(8);
  carattere[3] = digitalRead(9);
  carattere[4] = digitalRead(10);
  carattere[5] = digitalRead(11);



"carattere" è definito come int

gpb01

Non ci capiamo ... un array è una serie di elementi, lo switch lo devi fare su UN valore ... quindi ... tocca che trasformi l'array in UN VALORE ... come ti ho indicato ! :)

Guglielmo
Search is Your friend ... or I am Your enemy !

DanteAuditore

#34
Jun 16, 2015, 03:48 pm Last Edit: Jun 16, 2015, 03:51 pm by DanteAuditore
aaaah, scusa, non avevo capito...
beh, in tal caso, allora, posso sistemare la faccenda così:

Code: [Select]
void type(int *stringa)

{
if(stringa[0]==1)
  {for(i=0;i<8;i++)
             { buf[i]= a[i];
              } // a
   }
if(stringa[1]==1)
  {for(i=0;i<8;i++)
             { buf[i]= w[i];
              } // w
   }
if(stringa[2]==1)
  {for(i=0;i<8;i++)
             { buf[i]= s[i];
              } // s
   }
if(stringa[3]==1)
  {for(i=0;i<8;i++)
             { buf[i]= d[i];
              } // d
   }
if(stringa[4]==1)
  {for(i=0;i<8;i++)
             { buf[i]= space[i];
              } // space
   }
if(stringa[5]==1)
  {for(i=0;i<8;i++)
             { buf[i]= q[i];
              } // q
   }
 
    Serial.write(buf,8); // Send keypress
 for(i=0;i<8;i++)
             { buf[i]= 0;}
  }



o sbaglio ?
( ho messo l'asterisco su "stringa" poichè, non so come mai, altrimenti il compilatore me lo da errato.. probabilmente è una mia lacuna del c, dato che non capisco il motivo)

DanteAuditore

ho provato, per verificate il funzionamento ipotetico in modalità HID, a seguire ciò che vi è scritto qua:

http://mitchtech.net/arduino-usb-hid-keyboard/

a lui il programma funziona...

ho compilato, ed il programma andava bene, ho caricato, flashato, tutto secondo programma, anche il circuito l'ho fatto allo stesso identico modo..

c'è solo un problema: non va! non fa nulla.

ho provato il programma che cambia il volume e non va, potreste verificare?

gpb01

Perdona, ma ... non ricordo ...
... tu hai un Arduino UNO ORIGINALE o un clone ? E se è un clone, che chip usa per la conversione USB <--> Seriale ?

Guglielmo
Search is Your friend ... or I am Your enemy !

DanteAuditore

è originale, l'ho comprato su e-bay ma scritta ecc sono identici a quello originale percui direi che è originale. l'ho pagato 50 euro con il suo kit starter ( breadboard, fili, resistenze ecc...)

DanteAuditore

per questo non capisco il problema!

DanteAuditore

Quindi non c'è soluzione ? D:

gpb01

Sono stato all'estero e ... sono rientrato in questo momento ... appena ho un'attimo cerco di dare un'occhiata ...

Guglielmo
Search is Your friend ... or I am Your enemy !

DanteAuditore

oook, grazie mille ;) non ti preoccuèare e prenditi tutto il tempo ^^ spero tu abbia fatto un buon viaggio :)

gpb01

Tornando a bomba ...
... continui a non capire cosa ti dico ... la switch vuole un espressione che dia un risultato intero da comparare e non un puntatore.

Tu gli stai passando un array ovvero gli stai passando un puntatore e così non ti funzionerà mai.

DEVI tradurre la sequenza di bit data dai tuoi vari pulsanti in UN NUMERO (come da esempio che ti ho già fatto) e fare la switch su di quello !

Esempio :

Code: [Select]
int var;
...
...
switch (var) {
    case 1:
      //do something when var equals 1
      break;
    case 2:
      //do something when var equals 2
      break;
    default:
      // if nothing else matches, do the default
      // default is optional
  }

Guglielmo
Search is Your friend ... or I am Your enemy !

DanteAuditore

ok, adesso ho capito... però, posso evitare di usare uno switch ed utilizzare una sequenza di if ? magari togliendo la funzione e mettendolo direttamente nel loop

tipo:

Code: [Select]

int i;
uint8_t buf[8] = { 0 }; /* Keyboard report buffer */
uint8_t a[8]= {0,0,0,0,1,0,0,0};
uint8_t w[8]= {0,0,0,1,1,0,1,0};
uint8_t s[8]= {0,0,0,1,0,1,1,0};;
uint8_t d[8]= {0,0,0,0,0,1,1,1};;
uint8_t space[8]={0,0,1,0,1,1,0,0};;
uint8_t q[8]= {0,0,0,1,0,1,0,0};;


//QUA CI SONO LE PREMESSE

void setup()
{
    Serial.begin(9600);
  pinMode(6, INPUT);

  pinMode(7, INPUT);

  pinMode(8, INPUT);

  pinMode(9, INPUT);

  pinMode(10, INPUT);

  pinMode(11, INPUT);
}



//QUI C'è IL MAIN



void loop()

{
  int stringa[8];

  stringa[0] = digitalRead(6);
  stringa[1] = digitalRead(7);
  stringa[2] = digitalRead(8);
  stringa[3] = digitalRead(9);
  stringa[4] = digitalRead(10);
  stringa[5] = digitalRead(11);

if(stringa[0]==1)
  {for(i=0;i<8;i++)
             { buf[i]= a[i];
              } // a
   }
if(stringa[1]==1)
  {for(i=0;i<8;i++)
             { buf[i]= w[i];
              } // w
   }
if(stringa[2]==1)
  {for(i=0;i<8;i++)
             { buf[i]= s[i];
              } // s
   }
if(stringa[3]==1)
  {for(i=0;i<8;i++)
             { buf[i]= d[i];
              } // d
   }
if(stringa[4]==1)
  {for(i=0;i<8;i++)
             { buf[i]= space[i];
              } // space
   }
if(stringa[5]==1)
  {for(i=0;i<8;i++)
             { buf[i]= q[i];
              } // q
   }
 
    Serial.write(buf,8); // Send keypress
 for(i=0;i<8;i++)
             { buf[i]= 0;}
}


pensi possa funzionare?

gpb01

Con l'IF puoi fare i confronti che vuoi ... purché rispetti la sintassi ... quindi ... dovrebbe funzionare ... :)

Guglielmo
Search is Your friend ... or I am Your enemy !

Go Up