如何利用树莓派和Python,将显示屏改造为一个简单却富有表现力的机器人面部
机器人并不总是需要复杂的显示屏或摄像头才能展现个性。有时,一双简单的动画眼睛就足以让机器人显得更具互动性。
本项目使用树莓派5和1.8英寸ST7735 TFT显示屏,制作了一个小型的动态机器人面部。显示屏上的两只表情生动的眼睛可以移动、眨眼并改变形状,以传达不同的情绪。
该项目的核心理念是通过眼睛本身的形状和运动来表达情绪,无需瞳孔或复杂的图形设计。这使得系统更轻便,适合基于树莓派的小型机器人使用。
我为何打造它
我想创建一个简单直观的视觉界面,可直接添加到机器人上,而无需配备大型显示屏或强大的图形处理系统。
小型的ST7735 TFT显示屏价格低廉、体积小巧,通过SPI接口与树莓派连接非常方便。然而,仅显示静态的眼睛并不能让机器人显得足够有互动感。
因此,目标是创建一个动画引擎,使其眼睛能够自然移动,并对不同事件做出反应。
该项目围绕三个主要需求设计:
- 简单的图形,可在小型TFT显示屏上运行;
- 平滑的眼部运动,避免突然跳跃;
- 多种表情,可由另一个Python程序控制。
硬件
该项目的硬件非常简单。
组件:
•Raspberry Pi 5
•1.8英寸ST7735 TFT LCD,分辨率为128 × 160
•跳线(母对母)
Raspberry Pi负责图形和动画处理,而ST7735显示屏则作为机器人的“面孔”。
显示屏连接
ST7735显示屏通过SPI协议与Raspberry Pi通信。显示屏的SDA引脚用作SPI的MOSI/数据线,而非I2C的SDA接口。
接线方式如下:
设置显示屏
我参考了以下指南:《如何让1.8英寸ST7735 LCD显示屏与Raspberry Pi Zero W配合使用》
为解决此错误,请使用以下命令:
此外,还需要安装以下库:
因此,你需要使用以下命令编辑已安装的ST7735库的主文件:
显示屏配置为SPI通信,并旋转至水平方向,以使用160×124的工作区域。
显示屏初始化如下:
在实现显示屏功能之前,先完成这一工作,有助于在开发动画系统前更早地分离硬件与软件问题。
设计机器人眼睛
项目最初版本使用的是简单的矩形眼型。
机器人的眼睛形状本身被用来传达其状态,而不是在眼睛内部绘制图像。
例如,当机器人感到惊讶时,眼睛会变大;当它睡觉时,眼睛会变窄;当它生气时,眼睛则会倾斜。
该项目实现的主要表情包括:
•正常
•快乐
•生气
•惊讶
•睡眠
•眨眼
•向左转
•向右转
这种方法在保持图形简单的同时,仍能让机器人表现出不同的表情。
机器人眼睛引擎
主要的软件组件是 robot_eyes_engine.py。
该文件负责与显示屏通信、绘制眼睛形状以及控制动画效果。
它提供了改变机器人表情和移动眼睛的功能。
例如:
一段简短的 robot_eyes_engine.py 代码,展示了 RobotEyes 类及其初始化过程。
平滑的眼部运动
项目中最重要的部分之一是眼部运动。
如果实现简单,眼睛的位置可能会直接从一个位置快速移动到另一个位置,但这样会导致机械化的运动效果。
相反,动画引擎会计算出从起始位置到目标位置之间的中间位置。
通过使用缓动函数(ease-in/ease-out),在多个帧之间持续更新眼球的运动。眼睛开始快速移动,接近目标位置时逐渐减速,最终稳定在原位。
这种设计使运动看起来更加自然,而无需复杂的图形处理。
表情也可以与运动结合使用。例如,机器人可以一边侧头,同时表现出惊讶的表情。
控制机器人面部
第二个主要程序是 robot_face.py。
虽然眼睛引擎负责实际的图形和动画处理,但 robot_face.py 负责控制机器人的行为。
它可以随机触发各种动作,例如朝不同方向看、眨眼或改变表情。
这种分离使得系统更容易扩展。另一个机器人程序可以使用相同的视觉引擎,并在发生任何情况时触发表情。
例如,当机器人的超声波传感器检测到障碍物时,它就可以显示惊讶的表情。
完整的 robot_face.py 文件应上传至 Hackster Code 部分。
运行项目
连接显示屏并安装所需的 Python 库后,即可从 Raspberry Pi 的终端启动机器人面部程序。
使用以下命令可启动主行为程序:
该程序将初始化显示屏并开始机器人面部动画。
程序运行后,显示屏会持续进行不同的动作和表情。
项目结构
该项目包含多个版本的机器人眼睛软件。不同版本支持基于瞳孔的眼睛、无瞳孔的眼睛以及不同的动画行为。
robot_eyes_engine.py
这是主的基于瞳孔的机器人眼睛引擎。它负责处理ST7735显示屏,绘制眼睛和瞳孔,提供多种表情,并使瞳孔在不同方向上平滑移动。此外,还包含眨眼、眯眼、扫描以及随机眼球运动功能。
robot_face.py
这是一个简单的行为程序,使用robot_eyes_engine.py实现。它演示机器人向前看、向左看、向右看、返回中心以及持续眨眼的效果。
robot_eyes_engine_nop.py
这是无瞳孔版本的眼部引擎。该版本不使用瞳孔来指示方向,而是整个眼睛形状在显示屏上移动。眼睛形状本身也会变化,以产生如正常、开心、生气、惊讶、睡觉、眨眼和眯眼等表情。
NOP表示“无瞳孔”。在此版本中,眼睛只是黑色背景上的白色形状,没有独立的瞳孔。
robot_face_nop.py
这是无学员版本的演示程序。它展示了不同的表情、眨眼、眨眼、对角运动、扫描以及空闲动画。
robot_face_nop_fast.py
此版本注重快速、流畅且无缝的运行效果。通过缩短动作持续时间并采用随机化行为,使机器人看起来更加自然且反应灵敏。它可以四处观察、眨眼、双闪、聆听,并表现出开心、惊讶和生气等反应。
robot_eyes.py
这是一个简单的独立版本,直接在ST7735显示屏上绘制两个基本的机器人眼睛。在开发更复杂的动画引擎之前,该程序曾作为显示眼睛的基本起点。
README.md
该文件包含有关项目、其文件、设置和使用方法的附加信息。
两个主要版本
因此,该项目可视为具有两种主要实现方式。
基于瞳孔的眼睛
眼睛保持不动,而瞳孔移动以指示机器人注视的方向。
无瞳孔的眼睛
整个眼睛形状会移动并变化,从而产生机器人的表情和注意力方向。
无瞳孔方案旨在仅通过眼睛形状本身来创建更简洁、更简约的机器人面部。Hackster建议使用清晰的章节标题,并将代码与主要说明性文本分开,因此完整的.py文件应上传至代码部分,而故事中只显示简短的相关片段。
测试
项目通过分别测试不同的表达和运动功能,再将它们组合成主机器人行为进行验证。
主要测试内容包括:
•显示初始化
•眼睛渲染
•左右移动
•上下移动
•对角移动
•闪烁
•眨眼
•表情变化
•平滑过渡
•持续空闲运行
最终呈现的是一张小型机器人脸,能够完全由树莓派驱动,持续移动并变换表情。
结论
本项目展示了如何利用树莓派和Python,将一块1.8英寸的ST7735 TFT显示屏改造为一个简单却富有表现力的机器人面部。
该项目注重保持图形轻量的同时,使动画效果流畅自然。通过将动画引擎与机器人的行为分离,相同的视觉系统也可在不同的机器人项目中重复使用。
最终成果是一个紧凑的可视化界面,赋予基于树莓派的机器人鲜明的个性,并通过动作和表情来传达其状态。
本文编译自hackster.io





