Wii Remote 前端的紅外線攝影頭
可以辨識 1024x768 而且最多四個點的 IR 光源
視野範圍以鏡頭為中心左右 33o(左右各 15.5o),上下 23o (上下各 11.5o)
回傳值原始為 16 byte 資料,以右上座標為 (0, 0),左下座標為(1023, 768)
reference from http://wukcsoft.blogspot.tw/2014/07/avr-wiimote-camera.html
// Example of using the PVision library for interaction with the Pixart sensor on a WiiMote
// This work was derived from Kako's excellent Japanese website
// http://www.kako.com/neta/2007-001/2007-001.html
// Steve Hobley 2009
#include <Wire.h>
#include <PVision.h>
PVision ircam;
byte result;
void setup(){
Serial.begin(9600);
ircam.init();
}
void loop(){
result = ircam.read();
if(result & BLOB1){
Serial.print("BLOB1 detected. X:");
Serial.print(ircam.Blob1.X);
Serial.print(" Y:");
Serial.print(ircam.Blob1.Y);
Serial.print(" Size:");
Serial.println(ircam.Blob1.Size);
}
if(result & BLOB2){
Serial.print("BLOB2 detected. X:");
Serial.print(ircam.Blob2.X);
Serial.print(" Y:");
Serial.print(ircam.Blob2.Y);
Serial.print(" Size:");
Serial.println(ircam.Blob2.Size);
}
if(result & BLOB3){
Serial.print("BLOB3 detected. X:");
Serial.print(ircam.Blob3.X);
Serial.print(" Y:");
Serial.print(ircam.Blob3.Y);
Serial.print(" Size:");
Serial.println(ircam.Blob3.Size);
}
if(result & BLOB4){
Serial.print("BLOB4 detected. X:");
Serial.print(ircam.Blob4.X);
Serial.print(" Y:");
Serial.print(ircam.Blob4.Y);
Serial.print(" Size:");
Serial.println(ircam.Blob4.Size);
}
// Short delay...
delay(100);
}
==============================================================
//上(110)下(30平)
//順時(20)逆時(140平)
#include <Wire.h>
#include <PVision.h>
#include <Servo.h>
Servo myservo[2];
volatile int xPos,yPos;
PVision ircam;
byte result;
int xIR,yIR;
boolean ifMsg=false;
void setup(){
Serial.begin(9600);
ircam.init();
myservo[0].attach(9);
myservo[0].write(80);
myservo[1].attach(10);
myservo[1].write(40);
}
void loop(){
result = ircam.read();
if(result & BLOB1){
xIR = ircam.Blob1.X;
yIR = ircam.Blob1.Y;
ifMsg=true;
Serial.print("BLOB1 detected. X:");
Serial.print(ircam.Blob1.X);
Serial.print(" Y:");
Serial.print(ircam.Blob1.Y);
Serial.print(" Size:");
Serial.println(ircam.Blob1.Size);
}
if(!ifMsg & result & BLOB2){
xIR = ircam.Blob2.X;
yIR = ircam.Blob2.Y;
ifMsg=true;
Serial.print("BLOB2 detected. X:");
Serial.print(ircam.Blob2.X);
Serial.print(" Y:");
Serial.print(ircam.Blob2.Y);
Serial.print(" Size:");
Serial.println(ircam.Blob2.Size);
}
if(!ifMsg & result & BLOB3){
xIR = ircam.Blob3.X;
yIR = ircam.Blob3.Y;
ifMsg=true;
Serial.print("BLOB3 detected. X:");
Serial.print(ircam.Blob3.X);
Serial.print(" Y:");
Serial.print(ircam.Blob3.Y);
Serial.print(" Size:");
Serial.println(ircam.Blob3.Size);
}
if(!ifMsg & result & BLOB4){
xIR = ircam.Blob4.X;
yIR = ircam.Blob4.Y;
ifMsg=true;
Serial.print("BLOB4 detected. X:");
Serial.print(ircam.Blob4.X);
Serial.print(" Y:");
Serial.print(ircam.Blob4.Y);
Serial.print(" Size:");
Serial.println(ircam.Blob4.Size);
}
if(ifMsg){
moveAction();
ifMsg=false;
}
// Short delay...
delay(10);
}
void moveAction(){
xPos = myservo[0].read();
yPos = myservo[1].read();
if(xIR<512){
//順時
if(xPos>20){
myservo[0].write(--xPos);
delay(2);
}
}else{
//逆時
if(xPos<140){
myservo[0].write(++xPos);
delay(2);
}
}
if(yIR>384){
//低頭
if(yPos>30){
myservo[1].write(--yPos);
delay(2);
}
}else{
//抬頭
if(yPos<110){
myservo[1].write(++yPos);
delay(2);
}
}
xIR=512;
yIR=384;
}