Go Down

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

gpb01

... solito "Print-Screen" dei devices con le COM espanse (in modo che si vede chiaramente cosa riconosce) con Arduino connesso.

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

DanteAuditore

#16
May 27, 2015, 06:27 pm Last Edit: May 27, 2015, 06:52 pm by DanteAuditore
Ho reinstallato i driver:

Dispositivi

ORA, sono corretti.

su consiglio di un prof. ho cambiato il programma:

Code: [Select]
#include <SoftwareSerial.h>

SoftwareSerial mySerial(, 13);

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

//QUA CI SONO LE PREMESSE

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

  pinMode(6, INPUT);

  pinMode(7, INPUT);

  pinMode(8, INPUT);

  pinMode(9, INPUT);

  pinMode(10, INPUT);

  pinMode(11, INPUT);





  pinMode(13, OUTPUT);


  delay(50)

}



//QUI C'è IL MAIN



void loop()

{
  char carattere[6];
  int i;

  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(char *str)

{

  char *chp = str;
  while (*chp) {

      switch (*chp) {
        case '1':
          buf= 0x04; // a
          break;
        case '2':
          buf= 0x26; // w
          break;
        case '4':
          buf= 0x22; // s
          break;
        case '8':
          buf= 0x07; // d
          break;
        case '16':
          buf= 0x44; // space
          break;
        case '32':
          buf= 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); // Send keypress
    buf= 0;
  }
}



Il problema adesso è cambiato, ora posso caricare programmi sull'arduino ( prima era un problema di driver, sbagliavo ad aggiornare) però non so perchè, lo sketch ha problemi:

nella compilazione e nel caricamento su arduino ( che presumo esegua anche la compilazione), lo sketch non compila: non nel senso che da errori di compilazione, ma che la barretta del caricamento della compilazione non va avanti neanche se lo lascio fermo 20 minuti:

Errore di compilazione

il COM e la board selezionati sono giusti:

COM e Board

non è quello il problema, gli errori legati ad esso sono differenti (se non sbaglio)

DanteAuditore

Nessuno sa il motivo di questo errore ? D:

gpb01

Mi spieghi perché includi la SoftwareSerial ? ? ?  :o :o :o

1. La istanzi male (manca il primo parametro)

2. ma soprattutto ... NON la utilizzi nel programma

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

DanteAuditore

perchè avevo letto che per inviare un dato seriale avevo bisogno della softwareserial, e poi:

- in che senso la istanzio male?

-nel programma principale non c'è, ma nella funzione: Serial.write(), non è un comando della software serial ?


thomas

uwefed

perchè avevo letto che per inviare un dato seriale avevo bisogno della softwareserial, e poi:
- in che senso la istanzio male?
-nel programma principale non c'è, ma nella funzione: Serial.write(), non è un comando della software serial ?
thomas
Serial.write() si riferiece alla seriale hardware che é collegato con USB al Tuo PC.
Code: [Select]
SoftwareSerial mySerial(, 13);
Manca il parmetro prima della virgola. La chiamata si aspetta almeno 2 valori che sono i 2 pin che fungono da RX e TX.
vedi arduino.cc/en/Reference/SoftwareSerial

Ciao Uwe

gpb01

A costo di sembrare pedante, ripeto quanto già detto QUI ...
... prima di mettersi a fare qualsiasi cosa, sarebbe bene STUDIARE le BASI su cui quello che si vuole fare si fonda, altrimenti ... si fanno dei semplici copia/incolla senza capire ciò che si sta facendo ! ::)

Prenditi un testo di C, studia il reference di Arduino, guardati come funziona la SoftwerSerial e solo DOPO riavvicinati al tuo programma ... vedrai che sarai sicuramente molto più produttivo.

Guarda, puoi cominciare con QUESTO e puoi scaricarti QUESTO libro (... tranquillo, è un sito legale, purché per esclusivo uso PERSONALE).

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

DanteAuditore

#22
May 29, 2015, 02:43 pm Last Edit: May 29, 2015, 04:16 pm by DanteAuditore
Accetto il tuo parere, adesso me li guarderó e mi documenterò, purtroppo peró non ho molto tempo prima dell'esame di stato, non sapresti dirmi come fare a risolvere quel problema ?

gpb01

Mah ... tanto per cominciare, visto che NON la stai usando, elimina qualsiasi riferimento alla SoftwareSerial (sia l'include che la riga con mySerial) e riprova ...

Se ancora si blocca in compilazione, elimina la cartella dell'IDE e reinstallalo, magari si sarà corrotta qualche cosa ... ::)

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

DanteAuditore

Serial.write() si riferiece alla seriale hardware che é collegato con USB al Tuo PC.
Code: [Select]
SoftwareSerial mySerial(, 13);
Manca il parmetro prima della virgola. La chiamata si aspetta almeno 2 valori che sono i 2 pin che fungono da RX e TX.
vedi arduino.cc/en/Reference/SoftwareSerial

Ciao Uwe

eh l'avevo letta, soltanto che non ho capito come va utilizzata, nel senso: bisogna mettere i due pin rx e tx giusto ?, ma se io non ricevo nulla, nel senso, tutti i miei input vanno all'arduino e poi in un vettore che poi devo mandare al pc tramite un trasmettitore... non capisco che rx dovrei mettere, se è interno il vettore non ho pin di ricezione. e poi, io mando i dati seriali sul piedino 13, collegato ad un trasmettitore che invia ad un modulino di ricezione direttamente collegato all'usb.

Mah ... tanto per cominciare, visto che NON la stai usando, elimina qualsiasi riferimento alla SoftwareSerial (sia l'include che la riga con mySerial) e riprova ...

Se ancora si blocca in compilazione, elimina la cartella dell'IDE e reinstallalo, magari si sarà corrotta qualche cosa ... ::)

Guglielmo
ok, adesso provo

gpb01

Allora, la SoftwareSerial serve la dove la sola seriale di Arduino UNO NON ti basta e ti occorrono altre porte seriali che vengono simulate via software usando coppie di piedini (uno per RX ed uno per TX).

Nel tuo programma tu stai usando (... e per quello che devi fare DEVI usare) la seriale hardware di Arduino UNO (Serial) e, salvo non ti serva parlare in seriale con qualche altra cosa, NON hai bisogno della SoftwareSerial.

Nel caso uno a bisogno di più porte seriali hardware vere (... e non simulate da Software), c'è sempre Arduino Mega2560 che ne mette a disposizione quattro, quella classica che si ha su Arduino UNO (Serial) più altre tre (Serial1, Serial2 e Serial3).

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

DanteAuditore

#26
Jun 14, 2015, 08:43 am Last Edit: Jun 14, 2015, 08:05 pm by DanteAuditore
Mi scuso per essere stato esente dal post per tanto tempo ma avevo da studiare.. taaanto da studiare, allora: ho risolto tutti i problemi,ho ricreato il programma su consiglio di un mio prof, ovvero: crea un programma che sai usare,leggere e riconoscere.
a quel punto io ho creato questo:

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()

{
  char carattere[6];

  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(char *str)

{

  char *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 che mi sono chiarito le idee su alcune cose programmo e riprogrammo l'atmel abbastanza facilmente e velocemente... unico piccolo problema... il programma... non funziona.....premo un pulsante e non scrive...

qualche aiuto ?

tra pochi giorni ho l'esame D:

DanteAuditore

non riesco a capire come mai non fa quel che voglio D:

DanteAuditore

nessuno mi riesce ad aiutare ? T.T

gpb01

#29
Jun 15, 2015, 07:50 pm Last Edit: Jun 15, 2015, 07:51 pm by gpb01
Scusa eh, ma se leggo bene, tu stai mettendo in un ARRAY di char (... per l'esattezza un array di 6 char) dei valori distinti 0 e 1 ...
... quindi, alla fine, tu ti trovi un oggetto che è composto da 6 bytes che valgono ciascuno o 0 o 1.

Come pensi di fare una switch, che accetta in ingresso un intero, passando un array di 6 bytes (48 bits) e confrontandolo con dei caratteri (es. '1', '2', ...) ? ? ?  :o :o :o

Sarà il caso che prima converti quell'array in un valore numerico non ti pare ?

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

Go Up