ARToolKit - Realidade Aumentada



Já a algum tempo vi no programa Prototype This o uso do software ARToolKit, que permite o uso de realidade aumentada, para o projeto de luta de robôs. Este fim de semana instalei o software no Ubuntu  e usei o adaptador USB Easycap ( exemplo no ML) para conectar uma camera Hi8 que tenho a tempos. O mais complicado na verdade foi fazer o adaptador USB funcionar no linux com o driver aberto. Para windows ele tem um software próprio que vem junto no pacote. Depois de muitas idas e vindas com dependências e reboots consegui estabilizar o sistema e fazer o teste com os exemplos que vem no pacote do ARToolKit.

É realmente muito bacana e divertido e os projetos que estão sendo desenvolvidos pelo mundo são sensacionais, desde manuais de montagem de móveis a livros infantis com recursos de realidade aumentada.

Vale a pena conhecer esta tecnologia que está ao alcance de todos sem custo além de uma camera, que pode ser uma webcam barata, e algum esforço de fim de semana.





Outros links


IR RECEIVER - CONTROLE REMOTO DE TV


A pouco tempo comprei dois receptores de ir por R$ 0,20 cada e fiquei pensando como utilizá-los com a arduino, depois de pesquisar um bocado entendi como funciona a transmissão dos comandos entre o controle remoto e a TV.
É realmente muito interessante pois a gente percebe como cada fabricante desenvolveu um protocolo próprio para seus sistemas, neste site http://www.ustr.net/infrared/infrared1.shtml existe uma explicação bem detalhada.

Usar um receptor de ir com o arduino é bastante simples, a conexão é feita com uma porta digital, no caso deste que usei a pinagem é a seguinte:


A única informação que achei sobre o sensor acima ( acredito que seja este) está neste link o modelo é 1838b e os detalhes:

Supply voltage: 2.7 to 5.5V
Transmission distance :18-20m .

No experimento deste post conectei o pino de dados na porta digital 2 e os de força direto nas portas do arduino (alimentando a bradboard). Usei um controle remoto universal programado com os códigos da TV da sony e usei o código abaixo. As possibilidades são muitas, fazer um controle remoto para robôs ou controlar os equipamentos de casa. Imagine entrar em uma sala e ligar automáticamente o som ou a tv no canal ou estação que você mais gosta?

O código analisa os pulsos recebidos pela porta digital e apresenta na saida serial da IDE do arduino usando o comando pulseIn e transforma em números que são os códigos dos controles remotos da sony, com adaptações é possível usar qualquer marca. Este link tem um exemplo sobre como determinar os códigos .

-----------------------------------------------------------------------
/* 
Program that reads key presses of a sony remote control
Created by Kurtis Waterston, March 6 2010
Realesed into the public domain
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1267950229
*/

int irDet = 2;
int key = 0;
int data[12];
int state;

void setup() {
 Serial.begin(9600);                         //For debugging
 pinMode(irDet, INPUT);                      //IR detector connected to digital pin 2
}

void loop() {                                //Main loop
 if (pulseIn(irDet, LOW) > 2200) {          //Check for start pulse
   getIRkey();
   Serial.print("Key press is = ");
   Serial.println(key);
 }

}

int getIRkey() {                             //Read pulses
 data[0] = pulseIn(irDet, LOW);
 data[1] = pulseIn(irDet, LOW);
 data[2] = pulseIn(irDet, LOW);
 data[3] = pulseIn(irDet, LOW);
 data[4] = pulseIn(irDet, LOW);
 data[5] = pulseIn(irDet, LOW);
 data[6] = pulseIn(irDet, LOW);
 data[7] = pulseIn(irDet, LOW);
 data[8] = pulseIn(irDet, LOW);
 data[9] = pulseIn(irDet, LOW);
 data[10] = pulseIn(irDet, LOW);
 data[11] = pulseIn(irDet, LOW);

 for(int x = 0; x <= 11; x++) {              //Decide wether pulses are 1's or 0's
   if(data[x] > 1000) {
     data[x] = 1;
   }
   else {
     data[x] = 0;
   }
 }

 int result = 0;                            //Convert array into interger
 int seed = 1;
 for(int i=0;i<11;i++) {
   if(data[i] == 1) {
     result += seed;
   }
   seed = seed * 2;
 }
 key = result;
 return result;
}

---------------------------------------------------------------------------------

Uma imagem do setup:








ARDUINO LASER TRIPWIRE - ARMADILHA LASER




No post passado eu estava analisando o uso de um LDR para produzir sons com a arduino, como já estava com o setup montado resolvi fazer a experiência da armadilha de laser dessas de filme de roubo de jóias ou obras de arte aonde os bandidos tem que passar pelos alarmes de laser para conseguir seu objetivo. Minha filha brincou um bocado tentado passar pelo raio do laser sem ser "detectada".

Estes são os elementos que usei:

1 Apontador laser barato - R$ 3,00
1 LDR de 5 mm
1 Alto-falante de 8 oms pequeno

O apontador laser é alimentado por 3 baterias botão bem pequenas, por isso tive que liga-lo a uma bateria mais potente, as baterias originais não aguentaram nem 5 minutos ligadas. Coloquei duas baterias de telefone sem fio de 2.4 volts NiMH ligadas em paralelo para obter 4.8 volts.

Soldei o positivo na carcaça de metal do apontador e o terra na mola que segura as baterias. Desta forma consegui uma fonte de laser bem forte e contante, isso é importante porque para fazer o alarme temos que medir a variação de voltagem vinda do sensor LDR.

No meu caso o valor da leitura do sensor na porta analógica 0 com iluminação ambiente foi de 300 e com o laser foi de 1000. Coloquei no código um valor de 800 para o disparo do alarme.



A montagem é a seguinte:

1. Alto falante com o fio vermelho ligado a porta digital 8 e o preto ao ground;
2. LDR com uma "perna" ligada a 5 volts e a outra ao ground por meio de um resistor de 10 kOhms ( marrom/preto/laranja/dourado) e a porta analógica 0. Existem muitos exemplos de montagem de LDR como estes

Neste exemplo estou usando a TATUINO NANO que é uma placa ótima para todos que querem experimentar com a IDE do arduino, ela pode ser conectada diretamnete na breadbord:



O código é muito simples:

------------------------------------------------------------------------------------------------

/*
 claudio miklos 16/05/2010
 
 */


void setup() {
Serial.begin(9600); 
}

void loop()
{
Serial.print("Analog reading = ");
Serial.println(analogRead(0)); // the raw analog reading
  
if(analogRead(0) <= 800){
  
tone(8, 1000, 10);
}

}
-----------------------------------------------------------------------------------------





Foi interessante conmhecer o TONE do arduino, no entanto tive problemas na comunicação serial, me parece que a comunicação serial interfere no comando tone.

ARDUINO TONE PITCH FOLLOWER



Para continuar meus experimentos com o osciloscópio, resolvi montar o exemplo do site arduino.cc chamado TonePitchFollower, neste exemplo é utilizado ama fotocélula ou light-dependent resistors (LDR),  para gerar variações de voltagem que são transformadas em tons divertidos e interessantes.

O código ensina como usar o comando tone para gerar notas ou barulhos .. um alarme ou outras coisas.

No vídeo eu tento mostrar a saída da leitura do osciloscópio na tela do PC.

Depois vou tentar montar um jogo de dardos de luz com esses apontadores laser baratos que vende na Santa Efigênia. Fica para o próximo fim de semana.

Osciloscópio com Microcontroladores



Neste projeto estou utilizando o osciloscópio descrito abaixo para verificar a variação de voltagem de um sensor de temperatura LM35 que já tem sua postagem neste blog. No vídeo, tento mostrar que quando coloco a mão no sensor a temperatura aumenta e a voltagem sobe em incrementos que podem ser  vistos na tela do PC.

Este post mostra como utilizei a controladora Axon para montar um osciloscópio conectado ao PC pela porta USB. A controladora Axon é desenvolvida pela Sor-Society of robots, o site Sor é muito interessante e é um misto de site caseiro e profissional. O fórum é muito bom apra resolver dúvidas sobre os mais diversos assuntos. A base do site da Sor é a montagem de um robot por USD 50, veja os vídeos e divirta-se com as experiências do John Palmisano e com seu conceito interessante de que fazer um robô é muito simples.. mas programar é outra história. O Sor é exatamente o contrário da arduino, nada IDE e suporte .. programação em C direta e você que se vire. Hoje a Axon é vendida em vários site como Robotshop.

Primeiro segui o tutorial e montei o robô de 50 dólares, é bastante divertido e instrutivo, porém, se eu soubesse da arduino não teria perido tempo com isso. Serviu para conhecer os processadores Atmel e a IDE de programação Avr Studio o que me abriu a possibilidade de entender mais profundamente a arduino.

Axon e AxonII são controladoras montadas em cima do processador Atmel Atmega640, esta placa oferece realmente recursos mais fáceis do que a arduino para quem vai montra robôs com vários servos, ela é desenvolvida para isso e tem muitos pinos para conexão de sensores, aliás sobram pinos para todo o lado.

A programação pode ser feita por USB com um programa em código aberto de linha de comando e também por programadores de hardware como STK500 e compatíveis como este vendido pela Sparkfun. A controladora Axon é muito sólida e bem construída, tem boas proteções elétricas e é uma excelente opção para que quer se aprofundar na programação e técnica.

Veja uma imagem da placa :






























No site da Sor existe para download gratuíto o software SorScope, com ele é possível montar um osciloscópio com até 16 canais , resolução de 10 bits e 1.5 ks/s.

























Fica claro (na foto acima) que não se trata de um sistema profissional, é comparável aos osciloscópios USB do mercado. Existem mais baratos que são conectados as portas de áudio do PC . A vantagem de usar uma placa controladora é que você não fica com um mais um produtto que serve só a um propósito. Tabém é possível montra um osciloscópio com a arduino e com as mesmas características como neste exemplo ou neste exemplo, como eu já tinha uma Axon resolvi montá-la em uma caixa e fazer um osciloscópio "portátil" com o que eu tinha a mão.

Montar um osciloscópio como este pode ensinar bastante sobre o funcionamento de sensores analógicos e outros sinais e também ajudar quando se tem problemas com um novo projeto.

SENSOR DE TEMPERATURA LM35 + LCD SERIAL



Continuando com as experiências com o LCD serial resolvi montar um termômetro usando o sensor LM35 que é um pequeno chip que gera corrente variável de acordo com a temperatura. Segundo os dados do fabricante este sensor gera uma voltagem de + 10.0 mV/°C , logo ele gera 0 V s para  0°C  celsius e + 1 V para 100 °C graus celsius com uma precisão de 0.5 °C.
Este sensor pode ser encontrado facilmente em qualquer loja de componentes e existem também várias placas ( shields) para o arduino com este sensor já montado e pronto para conexão no arduino.

A alimentação do sensor pode ser feita com 5.0 volts a partir do própria placa arduino, assim como o ground. Segue esquema da ligação abaixo:



Código

O código abaixo toma as leituras da porta analógica 0 da arduino 2009 geradas pelo LM35 e apresenta estas leituras após transformação ( veja abaixo) no LCD serial. Apresenta também as leituras de mínima e máxima. Para ver o exemplo da conexão do LCD serial procure o post sobre ele neste blog.

---------------------------------------------------------------------------------------------------
// Claudio miklos 05/2010 based on:
// http://www.arduino.cc/playground/Learning/SparkFunSerLCD
// http://www.danielandrade.net/2008/07/05/temperature-sensor-arduino

#include <SoftwareSerial.h>
#define txPin 2
int pin = 0; // analog pin
int tempc = 0,tempf=0; // temperature variables
int samples[8]; // variables to make a better precision
int maxi = -100,mini = 100; // to start max/min temperature
int i;
SoftwareSerial LCD = SoftwareSerial(0, txPin);

// referencia - http://www.arduino.cc/playground/Learning/SparkFunSerLCD

void setup()
{
pinMode(txPin, OUTPUT);
LCD.begin(2400);
clearLCD();
clearCURSOR();
}

void loop()

{

for(i = 0;i <= 7;i++){

samples[i] = ( 5.0 * analogRead(pin) * 100.0) / 1024.0;
tempc = tempc + samples[i];
delay(100);

}

tempc = tempc/8.0; // better precision
tempf = (tempc * 9)/ 5 + 32; // converts to fahrenheit

if(tempc > maxi) {maxi = tempc;} // set max temperature
if(tempc < mini) {mini = tempc;} // set min temperature

selectLineOne();
delay(100);
LCD.print(maxi,DEC); LCD.print(" Max "); LCD.print(mini,DEC); LCD.print(" Min ");
selectLineTwo();
delay(100);
LCD.print(tempc,DEC); LCD.print(" Celsius");LCD.print(" P0=");LCD.print(analogRead(pin));
delay(100);

tempc = 0;

delay(1000); // delay before loop
}

void selectLineOne(){  //puts the cursor at line 0 char 0.
   LCD.print(0xFE, BYTE);   //command flag
   LCD.print(128, BYTE);    //position
}
void selectLineTwo(){  //puts the cursor at line 0 char 0.
   LCD.print(0xFE, BYTE);   //command flag
   LCD.print(192, BYTE);    //position
}

void clearCURSOR(){
   LCD.print(0xFE, BYTE);   //command flag
   LCD.print(0xC, BYTE);   //clear command.
}

void clearLCD(){
   LCD.print(0xFE, BYTE);   //command flag
   LCD.print(0x01, BYTE);   //clear command.
}

void serCommand(){   //a general function to call the command flag for issuing all other commands   
  LCD.print(0xFE, BYTE);
}


----------------------------------------------------------------------------------------------------

Considerações sobre as leituras do LM35 e o código :

// samples[i] = ( 5.0 * analogRead(pin) * 100.0) / 1024.0; //


Se você está utilizando a alimentação do arduino com 5 v e conectando o sensor diretamente a porta analógica 0, será necessários utilizar a fórmula acima para converter a leitura de 10 bit do sensor na temperatura em graus celsius.

Exemplo:

Leitura = 48 mV

5.0 ( 5 VOLTS DE REFERENCIA)   x 48 ( LEITURA EM MILIVOLTS ) x 100  / 1024 ( SAMPLES DA PORTA ANALOGICA) = 23,4375 °C

Resultado a ser apresentado no LCD = 23°C

http://www.danielandrade.net/2008/07/05/temperature-sensor-arduino/

Internet of Things

LUX com arduino GPRS shield e sensor LDR.

/*
Graph: Feed 38642, Datastream lux
*/

Laboratórios, Lojas e Produtos

Blogs, Comunidades e Revistas