Quando estamos falando de superfícies multitoque, dentre várias técnicas de captação da posição dos dedos, temos o uso de placas de acrílico iluminadas com luz infravermelha. No que diz respeito a iluminação desta placa, existem duas formas mais populares: FTIR (Frustrated Total Internal Reflection) e DI (Diffuse Illumination).
Na primeira técnica, os LEDs infravermelhos iluminam a lateral do acrílico e quando o dedo é posicionado na sua superfície, ele frustra a luz que seria totalmente refletida fazendo com que a ponta do dedo se torne iluminada e isto permite que a imagem seja processada pelo programa de identificação de blobs com a câmera IR.
Frustrated Total Internal Reflection
Na segunda técnica de iluminação, uma fonte de raios infravermelhos (uma lanterna de leds infravemelhos) é direcionada para a superfície inferior do acrílico e quando o dedo é posicionado reflete parte da luz que incide sobre ele e assim identifica-se um blob na imagem.
Diffuse Illumination
Inspirado pela segunda técnica, construí essa lanterna de LEDs infravermelhos com a base de uma antiga webcam e ajeitando os componentes como descrito no esquemático abaixo. Foi minha primeira experiência com placas padrão e confesso que as soldas ficaram nojentas (não foi por nada que eu cobri parte do fundo com fita isolante ahuahuahuah).
Objetivo: testar o reacTIVision numa superfície transparente para poder chegar pelo menos perto de um dos projetos mais fodas que eu já vi: reactable.
Segundo teste com o Arduino: joystick + caixa de som.
Abaixo o programa que roda no Arduino.
int speakerOut = 8;
// pino de saida do alto-falante
int analogInput_1 = 3;
// pino de entrada do potenciometro 1 (P1)
int analogInput_2 = 5;
// pino de entrada do potenciometro 2 (P2)
int value_1 = 0;
// valor lido do P1
int value_2 = 0;
// valor lido do P2
int mapped_1 = 0;
// valor mapeado do P1
int mapped_2 = 0;
// valor mapeado do P2
void setup() {
pinMode(speakerOut, OUTPUT);
// setando o pino 8 como saida
pinMode(analogInput_1, INPUT);
// setando o pino 3 como entrada
pinMode(analogInput_2, INPUT);
// setando o pino 5 como entrada
}
void loop() {
// loop principal
value_1 = analogRead(analogInput_1);
// leitura do valor de P1
value_2 = analogRead(analogInput_2);
// leitura do valor de P1
digitalWrite(speakerOut, LOW);
// não manda sinal para o speaker
mapped_1 = map(value_1, 0, 1023, 1000000/261.63, 1000000/523.25);
// detalhes abaixo
mapped_2 = map(value_2, 0, 1023, 1000000/261.63, 1000000/523.25);
// detalhes abaixo
period = (mapped_1 + mapped_2)/2;
// faz apenas a média dos dois valores (escolha aleatória minha)
digitalWrite(speakerOut, HIGH);
// liga a caixa durante o period
delayMicroseconds(period);
digitalWrite(speakerOut, LOW);
// desliga a caixa durante o period
delayMicroseconds(period);
}
Os valores 1000000/ 261.63 e 1000000/523.25 representam o período em microsegundos das notas C4 (Dó 4) e C5 (Dó 5) na escala de notas. O C4 é considerado o Dó do meio. Para maiores informações, veja a lista das frequências das notas musicais.
Não é por nada que o vídeo de Johnny Chung Lee tá na categoria de “Rated most jaw-dropping” lá no TED.com. O cara botou muito quente em superutilizar um “mero” (há! de mero não tem nada) controle de Nintendo Wii para fazer uma coisa totalmente diferente do propósito do joystick. Seguindo os passos do nosso mestre inspirador, construí essas canetinhas cuja ponta é um LED infravermelho.
Bem, faz pouco tempo que eu comprei um Arduino motivado pela onda de posts nas minhas feeds (dentre elas o blog da MAKE Magazine) descrevendo milhões de projetos interessantíssimos que estavam sendo feitos com esse pedacinho de hardware. A plataforma dele é opensource, o que é um negócio arretado pra hardware pois dá um poder de comunidade extremamente forte. Sei que ainda vou escrever muito sobre a filosofia do Arduino, pois eu acho que tem tudo a ver com o momento que tá rolando (digo o meu momento e o momento no mundo também), mas meu objetivo agora é colocar aqui meu primeiro teste com Arduino.
Fui no site do Arduino (http://www.arduino.cc) e achei uma porrada de exemplos que me deixaram de queixo caído pelo resultado deles e pela simplicidade de botar eles para funcionar. Foquei em um projetinho bem bem simples, mas um sonho de criança para mim: controlar um motorzinho com precisão, mandar ele ir para lá e para cá sem que ele fique rodando idenfinidamente. Eu sei que eu tô subestimando o poder do Arduino, mas bah! é o primeiro teste…
O exemplo é o Knob. O código eu já tinha (peguei do site), o negócio agora era juntar os materiais. Potenciômetro: CHECKED! (facinho de encontrar em caixas de som velhas de computador). Protoboard: CHECKED! (frescura minha mesmo, dava pra fazer tudo na gambiarra dos fios). Servomotor: OPS! Bem, esse aí eu não tinha… mas nada mais instigante que ir na Rua da Concórdia e descobrir que eles vendem servomotor para controlar a posição de antena de televisão (eu acho que eles pensam que servomotor é só para isso, porque todos se espantaram quando eu falei que dava para controlar o servo pelo computador). Bem, servomotor é um negócio muito massa e dá pra controlar a posição do motor com precisão. Quem quiser saber mais: googleeia ae! (Tá, eu sou bonzinho: servomotor na wikipedia).
Vou botar logo o código e o vídeo que eu tô enrolando muito já.
// Controlling a servo position using a potentiometer (variable resistor)
// by Michal Rinott <http://people.interaction-ivrea.it/m.rinott>
#include <Servo.h>
Servo myservo; // create servo object to control a servo
int potpin = 0; // analog pin used to connect the potentiometer
int val; // variable to read the value from the analog pin
void setup()
{
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}
void loop()
{
val = analogRead(potpin); // reads the value of the potentiometer (value between 0 and 1023)
val = map(val, 0, 1023, 0, 179); // scale it to use it with the servo (value between 0 and 180)
myservo.write(val); // sets the servo position according to the scaled value
delay(15); // waits for the servo to get there
}
You are currently browsing the archives for the tinkering category.
Bio
Brazilian undergraduate Computer Science student of Informatics Center of Federal University of Pernambuco (UFPE), Brazil. Now doing an Erasmus exchange program at TU München, Germany.