Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp
00001 #include "mbed.h" 00002 00003 // Adapted from kako's source code: http://www.kako.com/neta/2008-009/2008-009.html 00004 // i2c protocol details from - http://blog.makezine.com/archive/2008/11/hacking_the_wiimote_ir_ca.html 00005 // wiring from - http://translate.google.com/translate?u=http://www.kako.com/neta/2007-001/2007-001.html&hl=en&ie=UTF-8&sl=ja&tl=en 00006 // obviously mbed is 3.3v so no level translation is needed 00007 // using built in i2c on pins 9/10 00008 // 00009 // PC GUI client here: http://code.google.com/p/wii-cam-blobtrack/ 00010 // 00011 // Interfacing details here: http://www.bot-thoughts.com/2010/12/connecting-mbed-to-wiimote-ir-camera.html 00012 // 00013 00014 DigitalOut myled(LED1); 00015 PwmOut servo(p21); 00016 Serial pc(USBTX, USBRX); // tx, rx 00017 I2C i2c(p9, p10); // sda, scl 00018 const int addr = 0xB0; // define the I2C Address of camera 00019 00020 void i2c_write2(int addr, char a, char b) 00021 { 00022 char cmd[2]; 00023 00024 cmd[0] = a; 00025 cmd[1] = b; 00026 i2c.write(addr, cmd, 2); 00027 wait(0.07); // delay 70ms 00028 } 00029 00030 void clock_init() 00031 { 00032 // set up ~20-25MHz clock on p21 00033 LPC_PWM1->TCR = (1 << 1); // Reset counter, disable PWM 00034 LPC_SC->PCLKSEL0 &= ~(0x3 << 12); 00035 LPC_SC->PCLKSEL0 |= (1 << 12); // Set peripheral clock divider to /1, i.e. system clock 00036 LPC_PWM1->MR0 = 4; // Match Register 0 is shared period counter for all PWM1 00037 LPC_PWM1->MR6 = 2; // Pin 21 is PWM output 6, so Match Register 6 00038 LPC_PWM1->LER |= 1; // Start updating at next period start 00039 LPC_PWM1->TCR = (1 << 0) || (1 << 3); // Enable counter and PWM 00040 } 00041 00042 void cam_init() 00043 { 00044 // Init IR Camera sensor 00045 i2c_write2(addr, 0x30, 0x01); 00046 i2c_write2(addr, 0x30, 0x08); 00047 i2c_write2(addr, 0x06, 0x90); 00048 i2c_write2(addr, 0x08, 0xC0); 00049 i2c_write2(addr, 0x1A, 0x40); 00050 i2c_write2(addr, 0x33, 0x33); 00051 wait(0.1); 00052 } 00053 00054 int main() { 00055 char cmd[8]; 00056 char buf[16]; 00057 int Ix1,Iy1,Ix2,Iy2; 00058 int Ix3,Iy3,Ix4,Iy4; 00059 int s; 00060 00061 clock_init(); 00062 00063 // PC serial output 00064 pc.baud(115200); 00065 //pc.printf("Initializing camera..."); 00066 00067 cam_init(); 00068 00069 //pc.printf("complete\n"); 00070 00071 // read I2C stuff 00072 while(1) { 00073 myled = 1; 00074 // IR Sensor read 00075 cmd[0] = 0x36; 00076 i2c.write(addr, cmd, 1); 00077 i2c.read(addr, buf, 16); // read the 16-byte result 00078 00079 myled = 0; 00080 00081 Ix1 = buf[1]; 00082 Iy1 = buf[2]; 00083 s = buf[3]; 00084 Ix1 += (s & 0x30) <<4; 00085 Iy1 += (s & 0xC0) <<2; 00086 00087 Ix2 = buf[4]; 00088 Iy2 = buf[5]; 00089 s = buf[6]; 00090 Ix2 += (s & 0x30) <<4; 00091 Iy2 += (s & 0xC0) <<2; 00092 00093 Ix3 = buf[7]; 00094 Iy3 = buf[8]; 00095 s = buf[9]; 00096 Ix3 += (s & 0x30) <<4; 00097 Iy3 += (s & 0xC0) <<2; 00098 00099 Ix4 = buf[10]; 00100 Iy4 = buf[11]; 00101 s = buf[12]; 00102 Ix4 += (s & 0x30) <<4; 00103 Iy4 += (s & 0xC0) <<2; 00104 00105 // print the coordinate data 00106 //pc.printf("Ix1: %4d, Iy1: %4d\n", Ix1, Iy1 ); 00107 //pc.printf("Ix2: %4d, Iy2: %4d\n", Ix2, Iy2 ); 00108 pc.printf("%d,%d,%d,%d,%d,%d,%d,%d\r\n", Ix1, Iy1, Ix2, Iy2, Ix3, Iy3, Ix4, Iy4); 00109 00110 wait(0.050); 00111 } 00112 00113 }
Generated on Sat Jul 16 2022 09:56:38 by
1.7.2