USBMultiHID

Fala galera, boa noite.

Estou montando um projeto onde preciso que o Arduino seja reconhecido pelo meu PC como um dispositivo HID (Human Interface Device), e fazendo algumas pesquisas sobre o assunto encontrei bastante material interessante e montei uma biblioteca onde o consegui emular 3 HIDs simultaneamente (teclado, mouse e joystick).

Caso isso interesse para mais alguém, segue link do meu blog com as informações, códigos e uma demonstração: http://labpicareta.blogspot.com/2010/10/arduino-usbmultihid.html

Caso tenham sugestões ou dúvidas, fiquem à vontade para falar!

Abraço!

Ai, show de bola hem =)

E fazer um harware próprio, tem alguma coisa sobre isso? por exemplo, fazer um acelerômetro, mandar pela serial x:y a cada 2 segs por exemplo

Digo isso por que notei que na UsbMultiHID.h só existe keyboard e joystick (apesar de que eu não abri ela pra olhar dentro dela)

Teria como fazer algo assim usando o seu principio? se fosse serial legal, pois o meu arduino não possui usb, mas preciso do usb para comunicação somente, ai daria para montar como você fez.

Poxa, você abriu um laque de possibilidades pra mim =)

Não consegui gravar o código, qual o esquema hem? você não usa a IDE do arduino pelo jeito, mas procurei um Makefile ou algo e também não encontrei. Da uma diquinha ai, que to na fissura aqui ;)

Fala Bruno, desculpa a demora mas ontem eu estava enrolado!

Quanto a fazer um esquema mandando algo pra serial é o que mais tem por ai, tenho esse aqui em baixo justamente fazendo a leitura do acelerômetro do WiiChuck, usando a mesma biblioteca do WiiChuck que usei na demo, mas se for utilizar um acelerômetro avulso basta fazer a leitura.

#include <math.h>

#include "Wire.h"
#include "WiiChuck.h"
//#include "nunchuck_funcs.h"

#define MAXANGLE 90
#define MINANGLE -90


WiiChuck chuck = WiiChuck();
int angleStart, currentAngle;
int tillerStart = 0;
double angle;

void setup() {
  //nunchuck_init();
  Serial.begin(115200);
  chuck.setPowerPins();
  chuck.begin();
  chuck.update();
  //chuck.calibrateJoy();
}


void loop() {
  //delay(20);
  delay(100);
  chuck.update(); 

  Serial.print(chuck.readRoll());
  Serial.print(", ");  
  Serial.print(chuck.readPitch());
  Serial.print(", ");  

  Serial.print((int)chuck.readAccelX()); 
  Serial.print(", ");  
  Serial.print((int)chuck.readAccelY()); 
  Serial.print(", ");  
  Serial.print((int)chuck.readAccelZ()); 

  Serial.print(", ");  
  Serial.print((int)chuck.cPressed()); 
  Serial.print(", ");  
  Serial.print((int)chuck.zPressed()); 
  Serial.print(", ");  
  Serial.print((int)chuck.readJoyX()); 
  Serial.print(", ");  
  Serial.print((int)chuck.readJoyY()); 

  Serial.println();

}

Para mandar para o serial você não precisa do USBMultiHID, que serve unicamente para fazer a comunicação do seu microcontrolador AVR como um dispositivo USB low-speed, e inclusive não permite controles de delay longos pois quebra o esquema de comunicação. Logo, esse esquema do USBMultiHID serve para fazer seu Arduino emular vários dispositivos USB, mas não para fazer comunicação serial pois isso tem que ser feito utilizando RX-TX ou FTD232 para USB.

Quanto a biblioteca USBMultiHID.h, o descritor HID que está sendo utlizado “monta” simultaneamente os 3 dispositivos (teclado, mouse e joystick). No meu caso, testei no Windows XP, e no Gerenciador de Hardware quando conecto o USB aparecem os 3 dispositivos distintos e não 1 único.

E agora, quanto a não conseguir rodar, qual o problema que teve? Qual erro deu? Qual SO está utilizando? Qual versão da IDE usa?

Eu utilizo e só testei no Windows XP até agora, mas já vi demonstrações de códigos similares rodando em outros SOs sem necessidade de qualquer tipo de alteração.
Também utilizo a IDE do Arduino, testei nas versões 18 - 19 e 21 funcionando, e inclusive tive que fazer uns ajustes de código da biblioteca para funcionar apartir da versão 18 pois o esquema original recomendava rodar na versão 16. Hoje não sei se roda na versão 16 pois não testei depois dos ajustes.
Uma coisa importante, não sei se leu no Post do blog mas o pacote USBMultiHID.rar é na verdade uma biblioteca em C para o Arduino e deve ser descompactado na pasta “libraries” utilizada pela sua IDE, e realmente não editei essa parte na IDE do Arduino pq não é prático. O que editei na IDE foi o programa UsbMultiHID_Demo.pde que é uma demonstração de um scketch Arduino utilizando a biblioteca e as suas funções.

Ufa… Deixa eu respirar agora… Hehehehe… Sacou? Informação pacas, né? Espero ter ajudado, mas fique a vontade pra tirar outras dúvidas.

Abraço!

Nossa, muita informação mesmo.

Entao, eu nao utilizei nenhuma IDE, pois nao consegui jogar na libraries do arduino IDE para fazer a importação. Tambem achei estranho pois achei umas 3 versões para download, a ultima que achei foi a vusb-20100715, e dentro dela tem um monte de diretório, o que devo jogar para o lobraries da IDE? tudo? tentei por tudo e tentei por a “libs-device”, mas nao vai diz que nao encontra

Tem um outro que eu achei, vusb-for-arduino-005, (ultima versao saiu a 3 dias atraz [http://code.google.com/p/vusb-for-arduino/]) e la tem um UsbStream, que faz exatamente o que eu quero, porem na hora de compilar da um erro:

In file included from sketch_oct21a.cpp:2:
/usr/share/arduino/libraries/UsbStream/rx_buffer.h:7: erro: 'uchar' does not name a type

Pelo exemplo que tem nos fontes, acho que vai funcionar exatamente pro que eu quero, veja

#include <UsbStream.h>
void setup() {
    UsbStream.begin();
    
    UsbStream.write(0xff);
}

int pins[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0};

void loop() {
  UsbStream.refresh();
  
  if (UsbStream.available() > 0) {
    int pin = UsbStream.read();
    pins[pin] = !pins[pin];
    digitalWrite(pin, pins[pin]);
    UsbStream.write(pin);
  }
}

Acho que to confundindo tudo né?

Véio, vc tá atravessando a banda! Misturou toda a parada!

Os links para outros sites que coloquei no post são as referências que utilizei para montar a biblioteca USBMultiHID. A biblioteca (USBMultiHID) diponível para download no final do post já vem com tudo oque precisa (incluindo os códigos da biblioteca VUSB, pasta usbdrv) pra rodar o esquema de emular múltiplos devices através de um sketch arduino. Basta dar um include da biblioteca no seu código, como foi feito no código da demontração.

Quanto à biblioteca UsbStream que está querendo usar, nunca testei, mas também está num dos sites que botei como referência o http://code.rancidbacon.com/ProjectLogArduinoUSB. Como disse no Post, esse é o melhor site com material sobre o assunto, e se isso pode ser útil para algum projeto seu, então fica a dica: faça como eu fiz, leia toda a sequência de posts desse cara, pois está tudo muito bem explicado, inclusive com os problemas e soluções que passou em cada fase da implementação, e com certeza deve ter a explicação de como usar a biblioteca UsbStream ou vai te clarear a cabeça pra conseguir fazer ela funcionar.

No mais, acho que é isso.

Abraço

acho que vale a pena citar este link! http://www.obdev.at/products/vusb/projects.html

Boa Radamés!

Eu tinha colocado um link para o site da biblioteca, no meio do post, mas tinha esquecido de colocar como referência a página de projetos!

Valeu!