尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

基于STM32的智能桌面宠物:硬件选型与状态机设计实战

发布时间:2026/9/27 1:04:43

资讯中心
01
ARTICLE

基于STM32的智能桌面宠物:硬件选型与状态机设计实战

基于STM32的智能桌面宠物:硬件选型与状态机设计实战
很多人桌上都摆过手办、绿植、加湿器但能跟你互动的“桌面宠物”并不多见。我自己一直想做个能眨眼、会摇头、拍桌还会吓一跳的小东西正好手里的STM32单片机可以搞定这件事。这篇写的“STM32单片机智能桌面宠物”就是基于STM32F103这类主控做成的一只电子宠物它用OLED屏显示表情用舵机做动作用六轴传感器感知震动和手势整体成本不高、动手门槛也合适学生党拿来练手或者做毕业设计都很香。我打算把整个项目的设计过程、硬件选型、软件框架、调试踩坑和后续扩展一次写清楚内容偏实战适合有一定单片机基础但没完整做过交互项目的读者。文章不会讲那种“原理全会、上手全废”的空话重点是你照着这套思路真的能焊出一只会“活”的桌面宠物。1. 从“能动的摆件”到“桌面宠物”需求拆解与整体架构1.1 先想清楚宠物要干什么很多人做桌面宠物容易跑偏一上来就想着加屏幕、加摄像头、加语音识别结果东西越做越贵、代码越写越乱。我一开始就给自己定了个原则这只宠物首先要“像活的”其次才是“够聪明”。什么叫“像活的”你路过它时它会转头看你你拍一下桌子它会做出被吓到的表情你摸它一下它会开心地眨眼睛你长时间不理会它它会打瞌睡、低头眯眼。这些行为本质上就是“感知输入 状态切换 动作输出”的闭环不需要什么高级算法一个裸机状态机就能跑得很流畅。所以我把需求收敛成四个方向表情显示、肢体动作、输入感知、低功耗待机。四者缺一不可但都不需要复杂的硬件堆料。1.2 为什么用STM32而不是树莓派或ESP32淘宝上很多桌面机器人用的是树莓派或者ESP32-CAM功能确实强但代价是体积大、成本高、系统一多就吃电。对于桌面宠物这个场景STM32的优势非常明显实时性好裸机或者轻量RTOS下中断响应是微秒级拍桌子的信号能很快触发动作不像Linux会有调度延迟。成本低一片STM32F103C8T6蓝色板子十几块钱整机物料不超过五六十元。功耗可控正常运行时电流几十毫安做低功耗后能到微安级别放在桌面上长期通电完全没压力。生态成熟网上STM32的例程、搜索引擎里的笔记、各种学习视频多到看不完遇到问题至少能找到排错方向。有一个很容易忽略的点桌面宠物是近距离交互设备它的“聪明”不需要云端算力而在于响应速度和行为逻辑的设计。STM32的定位刚好卡在这里。1.3 系统架构传感器、状态机和输出模块如何配合整个系统的结构可以用一句话概括输入事件经过状态机处理后驱动显示和外设动作。输入侧我选了三个来源MPU6050六轴传感器检测震动/倾斜/拍击物理按键作为确认输入RTC定时器作为日历闹钟。输出侧是0.96寸OLED屏幕、SG90舵机、小蜂鸣器和LED灯。核心逻辑不放在某个中断里而是放在一个主循环的状态机中。中断只负责把“发生了什么事”记录到一个事件标志里主循环读取标志后查询当前状态、切换状态、给出对应的显示和动作输出。这个架构的好处是新增一种“宠物反应”时不用动硬件和底层驱动只要在状态机里加一个分支就行。比如我想让宠物在每天下午三点提醒我喝水只加一个RTC闹钟中断在状态机里加一个“提醒喝水”的待机行为完全不碰其他模块。1.4 项目物料清单我一共用到的物料如下仅供参考实际买配件时可以灵活替换模块型号/规格作用主控板STM32F103C8T6开发板核心控制与逻辑处理显示模块0.96寸OLEDI2C接口128x64像素表情、状态、动画显示姿态传感器MPU6050六轴模块震动、倾斜、拍打检测舵机SG90 180度模拟舵机头部偏转、点头摇头动作蜂鸣器有源蜂鸣器模块声音反馈按键轻触开关手动交互光敏电阻5537光敏电阻模块桌面光线感知自动调亮度电源USB 5V供电 AMS1117-3.3 LDO给主控和舵机供电如果你手头有STM32F401或STM32G030也完全可以Boot引脚换一下、时钟树重新配一下就行。不要被具体型号限制住思路。2. 硬件选型主控、屏幕、传感器与舵机的取舍逻辑2.1 主控板STM32F103C8T6为什么够用先说结论对于桌面宠物这个项目STM32F103C8T6是性价比很合理的芯片。它有一颗Cortex-M3内核最高72MHz主频Flash 64KBRAM 20KB。这个资源级别跑一个128x64的OLED显示、一路PWM舵机、I2C读取六轴传感器、一个小型状态机绰绰有余。更别说芯片库里现成的DMP姿态解算代码在F103上跑得动只是稍微吃一点CPU时间。我特意留了USB接口因为开发阶段要频繁下载程序USB转串口同时也能当调试日志输出通道。C8T6没有板载ST-Link但用一根SWD四线下载线接到ST-Link/V2或者DAP-Link上就行。有一点要提醒C8T6的Flash只有64KB如果后面想加OTA功能会非常紧张。OTA本身不难但BootLoader加App双分区会把可用Flash削减到40KB左右表情动画多了可能会挤爆。真打算系统化升级建议换F103RET6或者其他256KB以上的型号。这块我在第六部分还会展开说。2.2 OLED选择I2C接口更省引脚SPI接口刷得更快0.96寸OLED有两种常见接口I2C和SPI。I2C版本只有四根线VCC、GND、SCL、SDA占用两个引脚接线非常省事F103的PB6/PB7硬件I2C或者任意GPIO模拟I2C都能驱动。缺点是刷新率低全屏刷一帧大概要十几毫秒做“眨眼”这种小范围动画倒是够用。如果想让表情变化更流畅建议用SPI接口多接几根线但刷新速度快了不止一个量级。我在这个项目里先用I2C版本点亮是为了减少前期排线问题。说实话后面做动画的时候确实感觉I2C刷新有点拖沓但配合局部刷新技术肉眼看不出来卡顿。推荐做法前期用I2C版省心后期想要更细腻动画直接换SPI屏驱动代码可以用U8g2库统一适配U8g2对这两种接口都有现成移植省去不少重复造轮子时间。2.3 MPU6050手势传感器一拍就吓一跳的秘密MPU6050是六轴传感器意思是它内部集成了三轴加速度计和三轴陀螺仪用来测量物体的加速度和角速度。在桌面宠物项目里它的主要作用是判断“有没有被拍、有没有被移动、当前是不是倾斜状态”。我第一次做的时候只用了三轴加速度采集到的原始数据范围某个轴上大幅跳变就判定为“震动”。比如手拍桌面瞬间桌子上的传感器Z轴加速度会瞬间冲到好几个g这个跳变量级比平时说话震动的噪声大得多用阈值判断就能稳定触发。陀螺仪的用处是判断宠物姿态的旋转速度比如我把宠物底座转了一下它就能感知到旋转运动从而做出“晕头转向”的表情。当然你也可以直接用DMP库解算出欧拉角给宠物增加一个“身体倾斜时表情不变”的稳定功能这部分我在第三节会说具体实现。2.4 SG90舵机动作感的来源SG90是很常见的9g微型模拟舵机三根线红色电源、棕色地线、橙色信号线。信号线接到STM32的定时器PWM输出引脚通过改变PWM占空比控制舵机转动角度。很多人听到舵机就觉得难其实它内部有电机、减速齿轮和反馈电位器是一个闭环系统MCU只要给它标准50Hz、脉宽0.5ms到2.5ms的控制信号它就会自动转到对应角度。这意味着我们完全不需要关心电机电流和位置反馈算法代码里只需要算好CCR寄存器的值。需要注意SG90的启动电流经常在500mA甚至更高如果直接和单片机共用一颗稳压芯片供电舵机一转就会把电压拉低然后MCU就复位了。我一开始就吃过这个亏后来把舵机电源改成从USB 5V经过二极管降压后单独供电共地但各自走独立的供电路径问题才解决。这个坑后面会细说。3. 表情、动作与感知让宠物真正“活”起来的工作机制3.1 OLED表情与动画不只是画一个笑脸OLED要显示“活”的表情本质是给位图数组加上时间和状态管理。最简单的表情是一帧静态图例如一个圆圆的像素笑脸。但“活”起来需要多帧切换眨眼的动画从“睁眼”到“半闭”再到“闭眼”再回来受到惊吓时从“平静”突然变成“嘴巴张大、眼睛瞪圆”。做法是用取模工具把每帧表情都做成一个const uint8_t frame_x[]数组然后用一个全局变量保存当前帧序号定时器每隔几十毫秒切换一帧。我推荐用PCtoLCD2002或者Image2Lcd这类取模软件把128x64的图形转成字节数组。注意取模方向要跟OLED驱动的清屏扫描方向一致否则画面会像被切碎的拼图一样错位。显示上有一个细节整屏刷新会产生拖影尤其是切换表情时上一帧残留会在屏幕上留下一道“扫”的痕迹。我实际用的方案是局部刷新只更新有变化的那一页页内存区域不动的地方保持显存数据不变。0.96寸OLED为128列x64行按纵向8个像素为一个“页”一共8页可以只写变化的页速度快而且画面干净。3.2 舵机PWM驱动定时器计算和角度换算STM32F103的定时器非常强大我选择TIM2的CH1通道输出PWM控制头部舵机。要把SG90驱动到指定角度核心是算好PSC预分频和ARR自动重载值。系统主时钟72MHzAPB1总线时钟36MHz定时器时钟在预分频系数不为1时是APB1时钟的两倍也就是72MHz。为了得到50Hz的PWM我这样设置// 定时器时钟 72MHz // 预分频 PSC 71则计数频率 72MHz / (711) 1MHz即每计数1次 1us // 自动重载 ARR 19999则 PWM 周期 (199991)us 20ms 50Hz TIM_TimeBaseInitTypeDef.TIM_Prescaler 71; TIM_TimeBaseInitTypeDef.TIM_Period 19999;SG90的角度对应关系0.5ms脉宽是0度1.5ms脉宽是90度2.5ms脉宽是180度。由于计数频率1MHz脉宽时间微秒数值上就等于CCR值。所以50%占空比也就是90度位置时CCR1500。这个思路可以推广到其他任意舵机只要知道目标角度线性换算CCR即可uint16_t angle_to_ccr(uint8_t angle) { // angle: 0~180 // 对应脉宽 500us~2500us return 500 (uint16_t)((uint16_t)angle * 2000 / 180); }3.3 MPU6050手势识别阈值判定和滤波MPU6050读取原始数据后加速度计每个轴返回的ADC字不是直接的物理量要先换算。我把量程设为±2g此时灵敏度是16384 LSB/g。也就是说读取到的原始值除以16384得到的就是以g为单位的加速度。float ax_g (float)raw_ax / 16384.0f;手势识别的逻辑不能直接用原始数据我加了一层滑动平均滤波取最近20次样本的平均值作为静态基准。当实时值与基准值之差超过0.5g时判定为一次震动。“拍桌”检测的关键在于窗口震动信号是一个很陡的尖峰持续时间大约几十毫秒。我检测到超阈值后并不会立即触发吓一跳动画而是再等100ms读取一次如果接近恢复基准值才确认为单次拍击。这个防抖窗口能挡住很多误触发比如旁边的人关门。MPU6050还负责“被拿起来”的检测。当宠物长时间静止在某一个姿态然后突然发生较大的角度变化我判定为“被移动了”这时候状态机会让宠物做一个“好奇左右看”的动作组合先低头再左右摇头最后正视前方。3.4 状态机的设计事件驱动而不是轮询堆积桌面宠物的行为逻辑我建议用一个简单的状态机来管理不要把所有判断写在一个几百行的while(1)循环里。状态机枚举大致长这样typedef enum { PET_IDLE, // 待机偶尔眨眼 PET_CURIOS, // 好奇左右看 PET_SCARED, // 受惊瞪眼张嘴 PET_HAPPY, // 开心快速点头 PET_SLEEPY, // 犯困慢速眨眼 PET_SLEEP // 睡眠屏幕关闭 } pet_state_e;事件来源由中断置位比如拍桌事件后置event_flags | EVENT_TAP然后在主循环里读取并清空。状态转移则根据当前状态和事件查询一张二维表或者用switch-case配合子函数处理。这个设计最大的好处是调试很容易每个状态下宠物的行为是确定的。出了bug只要在串口里打印状态编号和触发事件就能快速定位是不是某条转移条件写错了。4. 软件工程化时钟树、定时器、中断与代码组织4.1 时钟树必须自己心里有数说句掏心窝的话STM32入门绕过时钟树后期多半要踩坑。很多新手第一次用F103代码里直接抄网上的RCC_Configuration一旦换了外部晶振频率或者换了芯片型号外设彻底不转。F103默认可以使用内部8MHz HSI但为了更精准的PWM和串口波特率我用的是外部8MHz晶振通过PLL倍频到72MHz。系统时钟72MHzAHB不分频APB1分频/2得到36MHzAPB2分频/1得到72MHz。这里有个容易忽略点APB1预分频系数不等于1时定时器时钟自动翻倍所以挂在APB1上的TIM2/TIM3/TIM4最终时钟还是72MHz串口和I2C的时钟则可能是36MHz。搞不清没关系用STM32CubeMX图形化配置一遍能直观看到时钟树每条路径的最终频率。我强烈建议新手先打开CubeMX把时钟树点一遍再回到Keil工程里代码就有了底层支撑。4.2 SysTick系统时钟一切时间调度的基石桌面宠物需要很多定时场景表情切换、眨眼间隔、防抖窗口、低功耗进入延时、喂食提醒。我不建议每个功能各开一个TIM定时器那样资源很快就会被耗尽。我的做法是统一使用SysTick滴答定时器配置成1ms中断一次在中断里累加一个tick_ms全局变量。所有非实时性定时都基于这个tick_ms做差值判断。volatile uint32_t tick_ms 0; void SysTick_Handler(void) { tick_ms; } bool time_elapsed(uint32_t *last, uint32_t interval) { if (tick_ms - *last interval) { *last tick_ms; return true; } return false; }SysTick响应很快1ms中断一次对状态机来说足够。真正需要精确高频的任务比如舵机PWM、I2C时序才交给硬件定时器或DMA处理。4.3 中断优先级与事件标志避免中断里做重活桌面宠物项目里中断通常有这几个SysTick1ms、串口接收、外部按键、RTC闹钟、MPU6050数据就绪。如果中断里都去处理业务逻辑嵌套一多整个系统的实时性就崩了。我的原则是中断里只做“置标志最小数据处理”主循环里再做“业务逻辑外设操作”。比如MPU6050有数据就绪中断里只把原始数据搬进一个全局缓冲区并置位“新数据标志”主循环发现标志后去读缓冲、做滤波、更新姿态。软件I2C读取MPU6050的过程中若被其他中断打断时序就会乱这个架构能有效避免。STM32的NVIC中断优先级一定要配置合理SysTick设成最高的优先级舵机和I2C相关的中断也要比普通外设高半级。否则PWM输出会抖SPI/I2C传输偶尔会失败。4.4 代码分层和模块划分我按下面的目录组织工程代码这种风格兼顾了可读性和可维护性user/ main.c, stm32f10x_it.c bsp/ bsp_oled.c, bsp_mpu6050.c, bsp_servo.c, bsp_key.c app/ app_pet_fsm.c, app_expression.c, app_event.c drivers/ oled_font.c, oled_gui.c, mpu6050_dmp.cBSP层只负责具体的硬件初始化和读写操作比如bsp_servo_set_angle()、bsp_oled_show_frame()。APP层是行为逻辑所有“宠物应该表现出什么反应”的代码都放在这里。这样做的好处非常明显重新换一块屏幕或者换一种传感器我只需要重写对应的BSP文件APP层的状态机完全不用动。开发工具上我是用Keil MDK为主的同时也在VSCode里装了EIDE插件做备选日常调试还是Keil顺手。如果你同时要写C51和STM32Keil里注意用Pack Installer安装对应的芯片支持包不要混在两个工程里导致编译器选项互相干扰。4.5 关于“单片机没有堆栈吗”这个问题也顺便说一下热搜里总有人问“单片机C语言没有堆栈吗为什么”。其实是有的而且很关键。STM32的启动文件startup_stm32f10x_hd.s会分配一块RAM作为主堆栈Cortex-M3的MSP主堆栈指针就指向这里。局部变量、函数调用、中断压栈都靠这块内存。Keil里魔术棒Options → Target → Stack/Heap里那个Stack大小默认0x4001KB我实际调试过如果状态机和DMP库一起用1KB的栈在某些分支下会溢出表现就是程序随机跑飞。建议把Stack加到0x800以上并多测试递归/浮点运算比较多的分支。这个坑普通教程里几乎没人提。5. 调试与避坑从刷不进程序到舵机抖动5.1 程序下不进芯片Boot引脚与ST-Link排查新手最容易卡住的就是“明明点了下载芯片没反应”。我做成这项目的过程中也遇过几次排查顺序基本是固定的检查Boot0和Boot1引脚正常从Flash启动时Boot0必须接低电平GNDBoot1接低电平。如果Boot0被拉到高芯片会进入ISP模式SWD下载可能连不上。检查ST-Link是否被识别设备管理器里能看到“ST-Link”或者“CMSIS-DAP”看不到就换USB线、换USB口尤其注意有些USB线只能充电不能传数据。检查接线SWD只需要SWDIO、SWCLK、GND三根线部分调试器还需要接3.3V给目标板供电。检查Keil中Debugger设置ST-Link接口要选SW模式不要选JTAG速率可以调低到1MHz尤其杜邦线较长时高速下载经常失败。如果你手上是STM32F103C8T6核心板90%的情况是Boot0没拉低或者ST-Link驱动没装干净。5.2 F103硬件I2C的坑与解决软件I2C更省心F103的硬件I2C模块一直是很多人的噩梦。标准外设库下配置I2C1读MPU6050有时候初始化的确能出数据但跑一段时间后状态寄存器卡在BUSY整个I2C总线瘫掉。而且这种问题不是每次都能稳定复现特别难调试。我后来直接改成软件模拟I2C用两个GPIO引脚手动拉高拉低时钟和数据线按照I2C时序读写。代码如下风格示意#define I2C_SCL_H GPIO_SetBits(GPIOB, GPIO_Pin_6) #define I2C_SCL_L GPIO_ResetBits(GPIOB, GPIO_Pin_6) #define I2C_SDA_H GPIO_SetBits(GPIOB, GPIO_Pin_7) #define I2C_SDA_L GPIO_ResetBits(GPIOB, GPIO_Pin_7)为什么软件I2C反而稳因为不依赖芯片内部状态机的时序错误只要GPIO配置正确时序就是准确的。OLED和MPU6050速率要求都不高400kHz的快速模式完全不必需200kHz左右的软件I2C也能流畅跑。前提是中断别太多或者在使用过程中临时关闭能打断数据传输的中断。5.3 舵机抖动和单片机复位供电问题是罪魁祸首第一版时我把SG90直接接在开发板的3.3V上舵机一旦转动屏幕就闪一下然后程序重启。用万用表一测舵机转动时3.3V电压跌到了2.5V以下单片机的供电完全达不到工作电压。SG90在堵转时瞬间电流能到几百毫安但没有哪个核心板的AMS1117能稳压输出那么大电流。正确做法是单独给舵机供电外部5V电源比如USB转出的5V经过一个100uF电容之后接到舵机红线MCU的电源仍然用3.3V两者只共地。如果你也想用一个电源搞定至少要选择输出能力1A以上的稳压芯片并给舵机电源加滤波电容。即便如此我还是建议“共地分离供电”这是最稳妥的。5.4 程序随机跑飞堆栈和看门狗的联合排查跑飞是最让人头秃的bug通常我先排除两个最可能的原因。第一是堆栈溢出前面说过Stack大小从0x400调到0x800第二是printf重定向到了串口但发送缓冲区处理不当导致在调试代码里卡死。印象最深的是第一次加DMP库FPU单元或者浮点运算比较频繁栈消耗增大明显MSP直接冲破有效栈顶程序跳进HardFault_Handler。用Keil的调试器开着HardFault的调用栈看能定位具体是哪个函数越界。加看门狗也不能乱加。独立看门狗IWDG设置的时间如果太短比如喂狗隔了500ms但窗口设成300ms反而会把原本正常的程序砸死。IWDG的超时时间要根据主循环最长执行时间加余量来设置我目前用0.5秒超时配合主循环内喂狗。5.5 OLED显示异常和MPU6050数据漂移OLED显示错乱先检查取模方向和显存扫描方向。U8g2库有一个麻烦点它默认的缓冲区布局和手里的屏有时不匹配需要按资料调整u8x8的初始化和翻页顺序。MPU6050的数据漂移主要是没有做陀螺仪零偏校准。拿到的模块静止放置读取至少100个样本的陀螺仪原始值取平均写入偏移寄存器效果立刻改善很多。DMP库如果版本太老在F103上会出现输出角度漂移可以换用较新的运动驱动库版本或者直接用自写的互补滤波代码量不大但稳定性很直观。6. 进阶玩法低功耗、OTA、RTOS和联动房间设备6.1 低功耗设计白天陪伴深夜沉睡桌面宠物大多数时间是“摆着”并没有必要满负荷运行。STM32F103支持睡眠、停止、待机三种低功耗模式。我平时用的是停止模式Stop这模式下CPU时钟关闭但SRAM和寄存器内容保持可以由外部中断或RTC闹钟唤醒。进入停止模式前先把OLED刷新暂停、关闭不必要的LED、把I2C总线切换到高阻态。实测停止模式电流可以降到20uA左右对一片USB长期供电的主控来说几乎可以忽略。唤醒后重新做外设初始化再按当前状态和上次保存的时间判断下一步行为。关键点是停止模式唤醒后要重新配置外设时钟比如SysTick会停掉需要重新开启并用上一次tick恢复时间基。否则表情动画的延时判断会全部错乱。6.2 OTA升级给桌面宠物“补丁”能力如果想让宠物持续维护OTA是很好的加分项。最简方案是做IAP升级BootLoader区负责接收串口或无线传来的固件写入App区然后跳转执行App区运行主逻辑。F103C8T6的64KB确实紧张我把BootLoader压缩到8KBApp区40KB剩下留给参数存储。跳转前查中断向量表和系统内存布局时App里的SCB-VTOR要设置为FLASH_BASE | APP_OFFSET否则一切中断都会失败。我踩过一次Boot跳转后屏幕能亮但串口中断不工作就是这个偏移没设置。6.3 FreeRTOS化任务划分的可行性如果你的宠物功能越来越多比如加语音识别、加多个表情菜单、加联网对时裸机状态机会变得复杂这时候可以换FreeRTOS。任务划分我会这么安排显示任务阻塞等待“显示队列”收到消息后刷新OLED。感知任务周期读取MPU6050滤波并发布事件。动作任务接收动作指令控制舵机角度和蜂鸣器。低功耗任务无事可做时进入休眠。任务间传递数据建议用一个事件队列结构体里带事件类型和参数。FreeRTOS的优先级设置上感知任务要高于显示任务否则拍桌反馈会滞后。6.4 联网联动ESP8266串口透传和本地提醒桌面宠物再往前一步就是接入房间网络。最简单的方式是接一个ESP8266模块使用AT指令通过串口转发数据。宠物可以把当前状态如“开心”“犯困”上报到局域网服务器端或者手机APP可以查询它的心情反过来手机也能下发一条“摸摸头”指令让宠物做一个开心的动作。我自己的习惯是这类联动功能尽量放在BSP层做避免破坏状态机结构。模块通信采用独立的串口用队列缓冲协议数据。如果你愿意还可以利用MQTT协议接到智能家居平台实现“宠物在你回家时自动挥手”之类的玩法。6.5 可扩展的方向和建议硬件上还能加很多好玩的东西离线语音识别模块如SU-03T让宠物听懂名字TF卡模块播放音效PS2摇杆作为遥控器甚至手写一个手机蓝牙小程序通过HC-05控制它。软件上也可以给表情动画加更多帧、用像素画工具做不同主题皮肤。但我想说的是精力的投入要按性价比排序。最影响“像活物”的是状态机的行为逻辑和表情动画的节奏而不是硬件数量。先把“眨眼、受惊、开心、犯困”四种基本反应做到位再去堆外围模块也不迟。写在最后的一点个人经验这类“智能桌面宠物”项目真正收获最大的不是让它转起来那一刻而是盯着状态机一点点把行为调“像”的过程。我实际上手时光是调整拍桌检测的阈值和眨眼动画的切换间隔就花了两三个晚上但这段时间学到的东西比单纯看教程多得多。建议第一次动手的人别急着把所有模块一次焊完分三步走先用OLED点亮一个眨眼的表情动画再接舵机让头部会动最后加上MPU6050感知。每一步都跑通了再进入下一步出现bug时就能很快判断是显示问题、驱动问题还是逻辑问题。如果你也准备做一个我的建议是把代码仓库好好整理一下BSP和APP分层清楚。这样不管是你自己半年后再看还是把项目开源出来给其他爱好者参考都很舒服。有声音会动、会感知的桌面宠物真的能让每天对着屏幕干活的日子稍微有趣一点。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。