极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 20923|回复: 9

求助‘鼠标传感器改制16*16像素摄像头

[复制链接]
发表于 2013-2-15 12:11:50 | 显示全部楼层 |阅读模式
本帖最后由 橙红年代 于 2013-2-15 12:18 编辑

原文地址http://www.bidouille.org/hack/mousecam
谷歌自动翻译的网页文字帖出来
OK,所以最后决定让我制作在Arduino平台上,看到所有的图像是真的。我必须说,我留下深刻的印象。这是迄今为止我所见过的大多数开发人员友好的开发平台。它的主要优点:

这很简单。硬件是非常简单的,并使用标准的,通常可用的组件。的软件IDE是基本的,但功能:编辑器窗口,状态窗口,集成了串行终端。就是这样。
这是相当强大的。Arduino的diecimilla,我用基于ATmega168微控制器时钟频率为16MHz。
它是基于开放源码硬件和软件(如果你省略了商标争议商标的Arduino)。电路板设计是公开的。这导致了创造的几个变种和的克隆(Freeduino)的平台的普及做出了贡献。
电源,固件更新和串行通信通过一个单一的USB电缆。
它的可扩展性。Arduino板的主要之上,可堆叠的“盾牌”的概念是天才作为一个事实上,一个小的原型盾的第一件事是我做了这个平台。
所以,前一段时间,我遇到了这个伟大的光电鼠标黑客雪碧。我决定,这将是我做的第一个Arduino的项目(超越“Blinky LED”的例子,那是。)

第一步,剥离的无线鼠标便宜的台风无线鼠标/键盘组合。


ADNS-2051光学传感器,中间是一个不寻常的芯片。该芯片持有一个16×16,64水平的灰度图像传感器和一个DSP计算从所捕获的图像的光流的变动:


ADNS-2051针        Arduino的脚
1 SCLK        数字2
16 SDIO        数字3
15 PD        数字4
13 VDD        +5 V
12 GND        GND
  1. #define SCLK 2
  2. #define SDIO 3
  3. #define PD 4

  4. #define REG_PRODUCT_ID 0x00
  5. #define REG_REVISION_ID 0x01
  6. #define REG_MOTION 0x02
  7. #define REG_DELTA_X 0x03
  8. #define REG_DELTA_Y 0x04
  9. #define REG_SQUAL 0x05
  10. #define REG_AVERAGE_PIXEL 0x06
  11. #define REG_MAXIMUM_PIXEL 0x07
  12. #define REG_CONFIG_BITS 0x0A
  13. #define REG_DATA_OUT_LOWER 0x0C
  14. #define REG_DATA_OUT_UPPER 0x0D
  15. #define REG_SHUTTER_LOWER 0x0E
  16. #define REG_SHUTTER_UPPER 0x0F
  17. #define REG_FRAME_PERIOD_LOWER 0x10
  18. #define REG_FRAME_PERIOD_UPPER 0x11

  19. int dumpWidth = 256; // Number of pixels to read for each frame.
  20. byte frame[256];

  21. void setup() {
  22.   Serial.begin(115200);

  23.   reset();
  24.   byte productId = readRegister(REG_PRODUCT_ID);
  25.   byte revisionId = readRegister(REG_REVISION_ID);
  26.   Serial.print("Found productId ");
  27.   Serial.print(productId, HEX);
  28.   Serial.print(", rev. ");
  29.   Serial.print(revisionId, HEX);
  30.   Serial.println(productId == 0x02 ? " OK." : " Unknown productID. Carry on.");

  31.   byte config = readRegister(REG_CONFIG_BITS);
  32.   config |= B00000001; // Don't sleep (LED always powered on).
  33.   writeRegister(REG_CONFIG_BITS, config);
  34. }

  35. void loop() {
  36.   // Allows to set the dump window by sending the number of lines to read via the serial port.
  37.   if(Serial.available() > 0) {
  38.     dumpWidth = 16 * Serial.read();
  39.     dumpWidth = constrain(dumpWidth, 0, 256);
  40.   }

  41.   readRegister(REG_MOTION); // Freezes DX and DY until they are read or MOTION is read again.
  42.   char dx = readRegister(REG_DELTA_X);
  43.   char dy = readRegister(REG_DELTA_Y);
  44.   Serial.print("DELTA:");
  45.   Serial.print(dx, DEC);
  46.   Serial.print(" ");
  47.   Serial.println(dy, DEC);

  48.   if( dumpWidth > 0 )
  49.     dumpFrame();
  50. }

  51. void dumpFrame() {
  52.   byte config = readRegister(REG_CONFIG_BITS);
  53.   config |= B00001000; // PixDump
  54.   writeRegister(REG_CONFIG_BITS, config);

  55.   int count = 0;
  56.   do {
  57.     byte data = readRegister(REG_DATA_OUT_LOWER);
  58.     if( (data & 0x80) == 0 ) { // Data is valid
  59.       frame[count++] = data;
  60.     }
  61.   }
  62.   while (count != dumpWidth);

  63.   config = readRegister(REG_CONFIG_BITS);
  64.   config &= B11110111;
  65.   writeRegister(REG_CONFIG_BITS, config);

  66.   Serial.print("FRAME:");
  67.   for(int i = 0; i < dumpWidth; i++) {
  68.     byte pix = frame[i];
  69.     if( pix < 0x10 )
  70.       Serial.print("0");
  71.     Serial.print(pix, HEX);
  72.   }
  73.   Serial.println();
  74. }

  75. void reset() {
  76.   pinMode(SCLK, OUTPUT);
  77.   pinMode(SDIO, INPUT);
  78.   pinMode(PD, OUTPUT);
  79.   digitalWrite(SCLK, LOW);
  80.   digitalWrite(PD, HIGH);
  81.   delayMicroseconds(1);
  82.   digitalWrite(PD, LOW);
  83. }

  84. byte readRegister(byte address) {
  85.   pinMode (SDIO, OUTPUT);

  86.   for (byte i=128; i >0 ; i >>= 1) {
  87.     digitalWrite (SCLK, LOW);
  88.     digitalWrite (SDIO, (address & i) != 0 ? HIGH : LOW);
  89.     digitalWrite (SCLK, HIGH);
  90.   }

  91.   pinMode (SDIO, INPUT);

  92.   delayMicroseconds(100); // tHOLD = 100us min.

  93.   byte res = 0;
  94.   for (byte i=128; i >0 ; i >>= 1) {
  95.     digitalWrite (SCLK, LOW);
  96.     digitalWrite (SCLK, HIGH);
  97.     if( digitalRead (SDIO) == HIGH )
  98.       res |= i;
  99.   }

  100.   return res;
  101. }

  102. void writeRegister(byte address, byte data) {
  103.   address |= 0x80; // MSB indicates write mode.
  104.   pinMode (SDIO, OUTPUT);

  105.   for (byte i = 128; i > 0 ; i >>= 1) {
  106.     digitalWrite (SCLK, LOW);
  107.     digitalWrite (SDIO, (address & i) != 0 ? HIGH : LOW);
  108.     digitalWrite (SCLK, HIGH);
  109.   }

  110.   for (byte i = 128; i > 0 ; i >>= 1) {
  111.     digitalWrite (SCLK, LOW);
  112.     digitalWrite (SDIO, (data & i) != 0 ? HIGH : LOW);
  113.     digitalWrite (SCLK, HIGH);
  114.   }

  115.   delayMicroseconds(100); // tSWW, tSWR = 100us min.
  116. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

 楼主| 发表于 2013-2-15 12:20:39 | 显示全部楼层
我现在碰到的问题是图像不知道怎样设置才能显示出来{:soso_e135:}
回复 支持 反对

使用道具 举报

发表于 2013-2-15 18:51:41 | 显示全部楼层
高端!!!!!!!
回复 支持 反对

使用道具 举报

发表于 2013-2-15 21:02:58 | 显示全部楼层
arduino越来越好玩了
回复 支持 反对

使用道具 举报

发表于 2013-2-15 22:57:53 | 显示全部楼层
橙红年代 发表于 2013-2-15 12:20
我现在碰到的问题是图像不知道怎样设置才能显示出来

这个是挑鼠标芯片的
基本思路如下
1. 确认鼠标芯片(最好跟作者的一致吧)
2. 查看芯片的datasheet确认协议(不是所有的鼠标芯片都支持像素数据传输的)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-2-15 23:28:39 | 显示全部楼层
幻生幻灭 发表于 2013-2-15 22:57
这个是挑鼠标芯片的
基本思路如下
1. 确认鼠标芯片(最好跟作者的一致吧)

不是,电路连接没有问题,通信没有问题,就是图像没有,不知道那个软件怎么样设置
回复 支持 反对

使用道具 举报

发表于 2013-2-16 06:55:22 | 显示全部楼层
橙红年代 发表于 2013-2-15 23:28
不是,电路连接没有问题,通信没有问题,就是图像没有,不知道那个软件怎么样设置

要不要把芯片摘下来连接啊,我猜猜而已。。。。
回复 支持 反对

使用道具 举报

发表于 2013-2-17 14:31:56 | 显示全部楼层
蛮好玩呵,上传文字?
回复 支持 反对

使用道具 举报

发表于 2013-4-28 00:52:14 | 显示全部楼层
感谢分享,估计芯片不好找吧.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-6 12:22 , Processed in 0.115804 second(s), 25 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表