arduino平台读取鼠标光电传感器
鼠标坏掉了,大抵是修不好了。(全剧终—)
但是爱动手的小明不会浪费这个鼠标,确认外观没有明显烧毁痕迹后,尝试从电路板上利用光电传感器进行位移的测量,光电传感器(型号:FCT3065)找不到datasheet,但查到内核仿的是PAW3205, 因此只需要参考后者的datasheet即可。
通过电路板的led找到LED引脚,确定引脚信息,开始操作
首先去掉鼠标主控芯片,然后飞线将vdd连接到电源正极,注意供电不能高于3.6v,再焊接4根杜邦线,引出SDIO、SCLK、电源正负极即可,盖上盖子,测试!
/*Program to interface FCT3065-XY Optical MouseSensor with Arduino.This code detects when mouse is moved and alsoprints the change in x direction and change in ydirection in the serial monitor.Author: Vineet SukhthankerDate: 6 October 2020*///Register Addresses from datasheet
#define PROD_ID1 0x00
#define PROD_ID2 0x01
#define MOTION_STATUS 0X02
#define DEL_X 0x03
#define DEL_Y 0x04
#define OP_MODE 0x05
#define CONF 0x06
#define IMG_QUALITY 0x07
#define OP_STATE 0x08
#define W_PROTECT 0x09
#define SLEEP1_SET 0x0A
#define ENTER_TIME 0x0B
#define SLEEP2_SET 0x0C
#define IMG_THRESHOLD 0x0D
#define IMG_RECOG 0x0Econst int SCLK = 13;
const int SDIO = 12;byte noSleep = 0xA0;int i = 0;
void setup() {Serial.begin(115200);pinMode (SCLK, OUTPUT);mouseInit();byte prodId1 = readRegister(PROD_ID1);Serial.print((prodId1 == 0x31) ? "\nDevice OK" : "\nUnknown Device"); // checks for product IDSerial.print(prodId1);
}void loop() {int motion = readRegister(MOTION_STATUS); // read motion status register// if(motion==0x81){Serial.print("\nMoved!");Serial.print(motion);int8_t delta_x = readRegister(DEL_X); // read delta x registerint8_t delta_y = readRegister(DEL_Y); // read delta y registerSerial.print("\nX:");Serial.print(delta_x);Serial.print(" Y:");Serial.print(delta_y);//}delay(1000);
}void mouseInit(void) // function to initialize optical sensor.
{digitalWrite(SCLK, HIGH);digitalWrite(SCLK, LOW);delayMicroseconds(1); // tRESYNC = 1us (mentioned in datasheet)digitalWrite(SCLK, HIGH);delay(320); // tSIWTT = 320ms (mentioned in datasheet)digitalWrite(SCLK, LOW);writeRegister(OP_MODE, noSleep); // disable sleep mode
}byte readRegister(byte address) {pinMode (SDIO, OUTPUT);for (byte i = 128; i > 0 ; i >>= 1) {digitalWrite (SCLK, LOW);digitalWrite (SDIO, (address & i) != 0 ? HIGH : LOW);digitalWrite (SCLK, HIGH);}pinMode (SDIO, INPUT);delayMicroseconds(3); // tHOLD = 3us (mentioned in datasheet)byte res = 0;for (byte i = 128; i > 0 ; i >>= 1) {digitalWrite (SCLK, LOW);digitalWrite (SCLK, HIGH);if ( digitalRead (SDIO) == HIGH )res |= i;}delayMicroseconds(3); // tHOLD = 3us min. (mentioned in datasheet)return res;
}void writeRegister(byte address, byte data) {address |= 0x80; // MSB indicates write mode.pinMode (SDIO, OUTPUT);for (byte i = 128; i > 0 ; i >>= 1) {digitalWrite (SCLK, LOW);digitalWrite (SDIO, (address & i) != 0 ? HIGH : LOW);digitalWrite (SCLK, HIGH);}for (byte i = 128; i > 0 ; i >>= 1) {digitalWrite (SCLK, LOW);digitalWrite (SDIO, (data & i) != 0 ? HIGH : LOW);digitalWrite (SCLK, HIGH);}delayMicroseconds(100);
}
效果如图,x和y坐标分别向下向右为正,寄存器补码形式存储8位位移量
大合照(或许旋转编码器还再可以玩一玩)
参考
如何优雅的DIY鼠标?
FCT3065-XY_MouseSensor。
相关文章:

arduino平台读取鼠标光电传感器
鼠标坏掉了,大抵是修不好了。(全剧终—) 但是爱动手的小明不会浪费这个鼠标,确认外观没有明显烧毁痕迹后,尝试从电路板上利用光电传感器进行位移的测量,光电传感器(型号:FCT3065&am…...

【Linux网络】网络层
网络层 在复杂的网络环境中确定一个合适的路径 IP 协议 IPV4 点分十进制[0,255].[0,255].[0,255].[0,255]IPV6 IP地址目标网格目标主机 基本概念 主机:配有IP地址,但是不进行路由控制的设备;路由器:即配有IP地址,又能进行路由控制;节点:主机和路由器的统称。 两个问题 路…...
力扣-98.验证二叉搜索树
题目描述 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 class Solutio…...
5.17本日总结
一、英语 复习list2list29 二、数学 学习14讲部分内容 三、408 学习计组1.2内容 四、总结 高数和计网明天结束当前章节,计网内容学完之后主要学习计组和操作系统 五、明日计划 英语:复习lsit3list28,完成07年第二篇阅读 数学&#…...

大模型学习:Deepseek+dify零成本部署本地运行实用教程(超级详细!建议收藏)
文章目录 大模型学习:Deepseekdify零成本部署本地运行实用教程(超级详细!建议收藏)一、Dify是什么二、Dify的安装部署1. 官网体验2. 本地部署2.1 linux环境下的Docker安装2.2 Windows环境下安装部署DockerDeskTop2.3启用虚拟机平台…...
VSCode launch.json 配置参数详解
使用 launch.json 配置调试环境时,会涉及到多个参数,用于定义调试器的行为和目标执行环境。以下是一些常用的配置参数: 1、"type" :指定调试器的类型,例如 "node" 表示 Node.js 调试器࿰…...
pytest多种断言类型封装为自动化断言规则库
以下是将多种断言类型封装为自动化断言规则库的完整实现方案,包含基础验证规则和扩展机制: import re import time from jsonschema import validate, ValidationError from typing import Dict, Any, Optional, Callableclass ResponseValidator:"""自动...
Oracle数据库如何进行冷备份和恢复
数据库的冷备份指的是数据库处于关闭或者MOUNT状态下的备份,备份文件包括数据文件、日志文件和控制文件。数据库冷备份所用的时间主要受数据库大小和磁盘I/O性能的影响。由于数据库需要关闭才能进行冷备份,所以这种备份技术并不适用724小时的系统。尽管冷…...

LeetCode Hot100 (2、3、4、5、6、8、9、12)
题2--字母异或位分词 class Solution { public:vector<vector<string>> groupAnagrams(vector<string>& strs) {// 一开始的思路是,对于其中的一个单词,遍历所有排序组合,然后判断这些组合是否在哈希表里//࿰…...

FastMCP:为大语言模型构建强大的上下文和工具服务
FastMCP:为大语言模型构建强大的上下文和工具服务 在人工智能快速发展的今天,大语言模型(LLM)已经成为许多应用的核心。然而,如何让这些模型更好地与外部世界交互,获取实时信息,执行特定任务&am…...

数据结构(3)线性表-链表-单链表
我们学习过顺序表时,一旦对头部或中间的数据进行处理,由于物理结构的连续性,为了不覆盖,都得移,就导致时间复杂度为O(n),还有一个潜在的问题就是扩容,假如我们扩容前是10…...

Java Solon v3.3.0 发布(国产优秀应用开发基座)
Solon 框架! Solon 是新一代,Java 企业级应用开发框架。从零开始构建(No Java-EE),有灵活的接口规范与开放生态。采用商用友好的 Apache 2.0 开源协议,是“杭州无耳科技有限公司”开源的根级项目ÿ…...

23种设计模式概述详述(C#代码示例)
文章目录 1. 引言1.1 设计模式的价值1.2 设计模式的分类 2. 面向对象设计原则2.1 单一职责原则 (SRP)2.2 开放封闭原则 (OCP)2.3 里氏替换原则 (LSP)2.4 接口隔离原则 (ISP)2.5 依赖倒置原则 (DIP)2.6 合成复用原则 (CRP)2.7 迪米特法则 (LoD) 3. 创建型设计模式3.1 单例模式 (…...

数字化工厂升级引擎:Modbus TCP转Profinet网关助力打造柔性生产系统
在当今的工业自动化领域,通信协议扮演着至关重要的角色。Modbus TCP和Profinet是两种广泛使用的工业通信协议,它们分别在不同的应用场景中发挥着重要作用。然而,有时我们可能需要将这两种协议进行转换,以实现不同设备之间的无缝通…...

FPGA生成随机数的方法
FPGA生成随机数的方法,目前有以下几种: 1、震荡采样法 实现方式一:通过低频时钟作为D触发器的时钟输入端,高频时钟作为D触发器的数据输入端,使用高频采样低频,利用亚稳态输出随机数。 实现方式二:使用三个…...

【Linux C/C++开发】轻量级关系型数据库SQLite开发(包含性能测试代码)
前言 之前的文件分享过基于内存的STL缓存、环形缓冲区,以及基于文件的队列缓存mqueue、hash存储、向量库annoy存储,这两种属于比较原始且高效的方式。 那么,有没有高级且高效的方式呢。有的,从数据角度上看,࿰…...
2025认证杯第二阶段数学建模B题:谣言在社交网络上的传播思路+模型+代码
2025认证杯数学建模第二阶段思路模型代码,详细内容见文末名片 一、引言 在当今数字化时代,社交网络已然成为人们生活中不可或缺的一部分。信息在社交网络上的传播速度犹如闪电,瞬间就能触及大量用户。然而,这也为谣言的滋生和扩…...

记录算法笔记(2025.5.17)验证二叉搜索树
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 示例 1: 输入&…...

flutter编译时 设置jdk版本
先查看flutter使用的版本 flutter doctor -v设置flutter的jdk目录 flutter config --jdk-dir "E:\soft\android-studio\jbr" 然后再验证下,看是否设置成功...

ctfshow——web入门254~258
目录 web入门254 web入门255 web入门256 web入门257 web入门258 反序列化 先来看看其他师傅的讲解 web入门254 源码: <?phperror_reporting(0); highlight_file(__FILE__); include(flag.php);class ctfShowUser{public $usernamexxxxxx;public $passwo…...

【数据处理】xarray 数据处理教程:从入门到精通
目录 xarray 数据处理教程:从入门到精通一、简介**核心优势** 二、安装与导入1. 安装2. 导入库 三、数据结构(一)DataArray(二) Dataset(三)关键说明 四、数据操作(一)索…...

qt5.14.2 opencv调用摄像头显示在label
ui界面添加一个Qlabel名字是默认的label 还有一个button名字是pushButton mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <opencv2/opencv.hpp> // 添加OpenCV头文件 #include <QTimer> // 添加定…...
科技的成就(六十八)
623、杰文斯悖论 杰文斯悖论是1865年经济学家威廉斯坦利杰文斯提出的一悖论:当技术进步提高了效率,资源消耗不仅没有减少,反而激增。例如,瓦特改良的蒸汽机让煤炭燃烧更加高效,但结果却是煤炭需求飙升。 624、代码混…...

芯片生态链深度解析(三):芯片设计篇——数字文明的造物主战争
【开篇:设计——数字文明的“造物主战场”】 当英伟达的H100芯片以576TB/s显存带宽重构AI算力边界,当阿里平头哥倚天710以RISC-V架构实现性能对标ARM的突破,这场围绕芯片设计的全球竞赛早已超越技术本身,成为算法、架构与生态标准…...

Rocky Linux 9.5 基于kubeadm部署k8s
一:部署说明 操作系统https://mirrors.aliyun.com/rockylinux/9.5/isos/x86_64/Rocky-9.5-x86_64-minimal.iso 主机名IP地址配置k8s- master192.168.1.1412颗CPU 4G内存 100G硬盘k8s- node-1192.168.1.1422颗CPU 4G内存 100G硬盘k8s- node-2192.168.1.1432…...
--openssl-legacy-provider is not allowed in NODE_OPTIONS 报错的处理方式
解决方案 Node.js 应用: 从 Node.js v17 开始,底层升级到 OpenSSL 3.0,可能导致旧代码报错(如 ERR_OSSL_EVP_UNSUPPORTED)。 通过以下命令启用旧算法支持: node --openssl-legacy-provider your_script.js…...

uart16550详细说明
一、介绍 uart16550 ip core异步串行通信IP连接高性能的微控制器总线AXI,并为异步串行通信提供了 控制接口。软核设计连接了axilite接口。 二、特性 1.axilite接口用于寄存器访问和数据传输 2.16650串口和16450串口的软件和硬件寄存器都是兼容的 3.默认的core配置参数…...
deepin v23.1 音量自动静音问题解决
有的机器上会有音量自动静音问题, 如果你的电脑上也遇到, 这个问题是 Linux 内核的原因, ubuntu上也可能会遇到相同问题(比如你升级了最新内核6.14), 而我测试得6.8.0的内核是不会自动静音的. Index of /mainline 到上面这个链接(linux 内核的官方链接)下载6.8.0的内核, s…...

抢跑「中央计算+区域控制」市场,芯驰科技高端智控MCU“芯”升级
伴随着整车EE架构的加速变革,中国高端车规MCU正在迎来“新格局”。 在4月23日开幕的上海国际车展期间,芯驰科技面向新一代AI座舱推出了X10系列芯片,以及面向区域控制器、电驱和动力域控、高阶辅助驾驶和舱驾融合系统等的高端智控MCU产品E3系…...
《算法导论(第4版)》阅读笔记:p82-p82
《算法导论(第4版)》学习第 17 天,p82-p82 总结,总计 1 页。 一、技术总结 1. Matrix Matrices(矩阵) (1)教材 因为第 4 章涉及到矩阵,矩阵属于线性代数(linear algebra)范畴,如果不熟悉,可以看一下作者推荐的两本…...