using System;
using System.Runtime.InteropServices;
namespace ttt
{
class MainClass
{
[DllImport("user32")]
static extern bool SetCursorPos(int X, int Y);
using System;
using System.Runtime.InteropServices;
namespace ttt
{
class MainClass
{
[DllImport("user32")]
static extern bool SetCursorPos(int X, int Y);
全球手機攝影機主要供應廠商
※ 主要 CIS 廠商 Aptina、OmniVision、Samsung、STMicro 與 Toshiba 共占有行動電話應用市場的 85%
還有一篇基本篇可參考:http://lolikitty.pixnet.net/blog/post/163032620
#include <Wire.h> // LSM303DLHC 的 i2c 地址。由於 Arduino i2c 資料空間是 7 bit 所以要右移一個位元 int i2cAddress = 0x32 >> 1; void setup() { Serial.begin(9600); Serial.println("-------------------"); Wire.begin(); // 啟用 i2c writeReg(0x20,0b00100111); // 打開三軸加速計的電源 ,設定每秒讀取10次,啟用XYZ軸 } void loop() { Wire.beginTransmission(i2cAddress); Wire.write(0x28 | (1 << 7)); Wire.endTransmission(); Wire.requestFrom(i2cAddress, 6); byte xla = Wire.read(); byte xha = Wire.read(); byte yla = Wire.read(); byte yha = Wire.read(); byte zla = Wire.read(); byte zha = Wire.read(); int x = (xha << 8 | xla) >> 4; int y = (yha << 8 | yla) >> 4; int z = (zha << 8 | zla) >> 4; Serial.print("X : "); Serial.print(x); Serial.print(" Y : "); Serial.print(y); Serial.print(" Z : "); Serial.println(z); delay(500); } /************************************************************* * 寫入佔存器:writeReg(int reg, int value) * reg:佔存器地址 * value:要寫入的值 */ void writeReg(int reg, int value){ Wire.beginTransmission(i2cAddress); Wire.write(reg); Wire.write(value); Wire.endTransmission(); } /************************************************************* * 讀取佔存器:readReg(int reg) * reg:要讀取的佔存器地址 */ int readReg(int reg){ Wire.beginTransmission(i2cAddress); Wire.write(reg); Wire.endTransmission(); Wire.requestFrom(i2cAddress, 1); int value = Wire.read(); Wire.endTransmission(); return value; }
執行結果:
還有一篇進階篇可參考:http://lolikitty.pixnet.net/blog/post/163257851
#include <Wire.h> // LSM303DLHC 的 i2c 地址。由於 Arduino i2c 資料空間是 7 bit 所以要右移一個位元 int i2cAddress = 0x32 >> 1; void setup() { Serial.begin(9600); Serial.println("-------------------"); Wire.begin(); // 啟用 i2c writeReg(0x20,0b00100111); // 打開三軸加速計的電源 ,設定每秒讀取10次,啟用XYZ軸 } void loop() { Serial.print("X : "); Serial.print(readReg(0x29)); Serial.print(" Y : "); Serial.print(readReg(0x2B)); Serial.print(" Z : "); Serial.println(readReg(0x2D)); delay(500); } /************************************************************* * 寫入佔存器:writeReg(int reg, int value) * reg:佔存器地址 * value:要寫入的值 */ void writeReg(int reg, int value){ Wire.beginTransmission(i2cAddress); Wire.write(reg); Wire.write(value); Wire.endTransmission(); } /************************************************************* * 讀取佔存器:readReg(int reg) * reg:要讀取的佔存器地址 */ int readReg(int reg){ Wire.beginTransmission(i2cAddress); Wire.write(reg); Wire.endTransmission(); Wire.requestFrom(i2cAddress, 1); int value = Wire.read(); Wire.endTransmission(); return value; }
輸出結果:
資料手冊說明:(查看完整請資料手冊請點我)
針對上面 writeReg(0x20,0b00100111); 程式碼的說明
// 資料手冊 i2c 的 TC74 A0 地址是寫 1001000
#include <Wire.h> int i2cAddress = 72; // TC74 A0 的 i2c 地址 ( 2 進制 1001000 轉成 10 進制後為 72 ) void setup() { Serial.begin(9600); Serial.println("-------------------"); Wire.begin(); // 一定要寫 } void loop() { Wire.beginTransmission(i2cAddress); Wire.write(0); Wire.endTransmission(); Wire.requestFrom(i2cAddress, 1); // 一定要寫 while(Wire.available() == 0); // 等待回應 Serial.println(Wire.read()); // 讀取溫度並傳送至電腦顯示 delay(500); // 延遲0.5秒 }