terça-feira, 5 de outubro de 2010

Arduino USBMultiHID

Depois de um bom tempo sem brincar com meu arduino, como dá pra perceber pela data do post anterior, recentemente voltei e tô me divertindo muito com ele.

Para um projeto que estou montando (e em breve posto mais detalhes), precisava que meu arduino fosse reconhecido como um teclado e/ou mouse e/ou joystick pelo PC e que de preferência funcionassem com plug-and-play. Nisso, fui estudar um pouco sobre Human Interface Devices (HID) - teclados e mouses USB são reconhecidos como dispositivos do tipo HID pelos PCs.

Nessas pesquisas encontrei o projeto V-USB (Virtual USB port for AVR Microcontrollers), que nada mais é que uma implementação por software para dispositivos USB de baixa velocidade para microcontroladores Atmel AVR, e que por a caso é o tipo de controlador utilizado pelo arduino! Ai sim fomos surpreendidos! hehehehehe... Já existe um conjunto de bibliotecas para fazer o que eu precisava! Além de muita informação sobre o assunto e projetos reais de exemplo.

Procurando também outras referências achei algumas bem interessantes:
http://code.rancidbacon.com/ProjectLogArduinoUSB - Qualquer fonte de informação sobre Arduino + USB-HID faz referência a esse cara! Muito explicativo, conta todos os detalhes da sua implementação e de como resolver os problemas (inclusive de como fazer a biblioteca funcionar nas versões mais recentes da IDE Arduino). O CARA MANJA PRA CARAMBA! ME AJUDOU MUITO!
http://www.practicalarduino.com/projects/virtual-usb-keyboard - Exemplo do livro Practical Arduino (ótimo livro sobre arduino, com projetos bem legais), criando um teclado USB simplificado para PC.
http://orbduino.sourceforge.net/ - Projeto OrbDuino e OrbShield, com biblioteca e shield para arduino, e que foi desenvolvido para converter joysticks seriais antigos (principalmente da série SpaceOrbs) em controle USB-HID plug-and-play, totalmente customizável por programação, e que permite que os comandos do joystick sejam representados por mais de um HID simultaneamente.
http://www.obdev.at/products/vusb/projects.html - No site da Objective Development (responsável pela biblioteca V-USB) tem esta lista para vários projetos baseados na sua biblioteca, separados por categoria, e com link para os projetos que na sua maioria disponibilizam seus códigos-fonte, esquemas e contam detalhes da implementação.

A partir disso tudo montei a biblioteca USBMultiHID, que me possibilita ter uma interface simultânea a múltiplos dispositivos de entradas em um PC (múltiplos HIDs) a partir de um único dispositivo, O ARDUINO! Desta forma, qualquer comando de Teclado e/ou Mouse e/ou Joystick pode ser enviado ao PC a partir de todo o tipo de atuador que possa ser conectado ao arduino (sensores de movimento, potenciometros, botões, etc.).

Para fazer uma demonstração utilizei um WiiChuck para leitura de movimentos e de botões (hora o WiiChuck é usado como Mouse e hora como Joystick) e uma pequena montagem com botões representando um teclado. Abaixo o vídeo com a demonstração e algumas explicações:


Abaixo estão mais alguns detalhes sobre a montagem e os códigos utilizados:

Esquema para a Virtual-USB. Deve ser respeitada a utilização das portas digitais 2 e 4 do arduino devido à implementação da biblioteca AVRUSB.

Montagem, em protoboard, utilizada na demonstração com o circuito da Virtual-USB à esquerda e o "teclado" logo a baixo do arduino. Não está representado nesta montagem o WiiChuck que foi conectado utilizando as portas analógicas 2, 3, 4 e 5 do arduino.

Códigos:
Biblioteca WiiChuck - Biblioteca WiiChuck com alguns ajustes e que utiliza as portas analógicas 2 e 3 como terra e fonte, respectivamente, devido ao uso do conector. Deve ser disponibilizada na pasta "libraries" utilizada pela sua versão da IDE Arduino.
Biblioteca USBMultiHID - Biblioteca que define a comunicação USB com o PC e os dispositivos que serão representados. Nela estão os códigos customizados e as bibliotecas do AVRUSB. Deve ser disponibilizada na pasta "libraries" utilizada pela sua versão da IDE Arduino.
UsbMultiHID_Demo.pde - Código Arduino da Demonstração.

Rodei sem problemas utilizando as versões 18 e 19 da IDE Arduino

Abraços!

sexta-feira, 15 de janeiro de 2010

arDRUMino

Lá vai o meu primeiro post...
A pouco tempo comecei a mexer com um brinquedo novo (que eu me dei), um Arduino.

Mas o que é essa bagaça?
É uma placa com um microcontrolador, onde eu posso criar programas que podem interagir com os mais diversos dispositivos, através de portas de entrada e saída. Posso ligar todo tipo de sensor, motores, leds, GPS, e todo tipo de dispositivo eletrônico.

Nela eu vi a possibilidade de mexer com uma coisa que sempre tive vontade, que é ELETRÔNICA, mas nunca encontrei o "gancho" certo. Esse cara tá me possibilitando aprender eletrônica de uma maneira mais fácil para mim, que sou desenvolvedor, através de uma coisa que estou habituado e que gosto, apesar de esbarrar todo dia com ela, que é programação.

Mas vamos ao que interessa... AÇÃO!
Num dias desses resolvi montar uma "bateria eletrônica" usando meu Arduino. Assim arrumei um jeito de dar uma estudada também no Processing, que é uma linguagem de programação voltada pra programação de imagens, animações e todo tipo de interação, e se encaixa como uma luva para o Arduino conversar com o seu PC.

Disso nasceu o: arDRUMino


Como funciona?
São dois elementos piezoelétricos, cada um conectado a um resistor de 1M, e ligados cada um a uma porta analógica do Arduíno.

Quando os piezos recebem alguma pancada, o Arduino interpreta a variação de leitura e envia, via porta serial, qual piezo sofreu a pancada e a "intensidade" da batida.

O Processing, que está rodando em paralelo e escutando a porta serial, recebe a mensagem e através da utilização biblioteca SoundCipher (ela não vem por padrão com o Processing, mas é muito legal e simples de usar!) reproduz um som específico para cada elemento utilizando a interface MIDI do PC, inclusive com a variação de altura do som de acordo com a intensidade informada.

Ambas as aplicações (Arduino e Processing) já estão preparadas para utilizar até as 6 portas analógicas do Arduíno, bastando ajustar no código da aplicação Arduino quantas e quais portas estão sendo utilizadas.

Código Arduíno: arDRUMino.pde
Código Processing: arDRUMino_p.pde

Todos os detalhes e controles de leitura que tive que fazer estão comentados nos códigos.

Abaixo estão algumas imagens e o esquema da brincadeira:




Abraço!