【Arduino 动手做】基于 ATtiny85 的微型 DIY 游戏机
我们都经历过。你当之无愧地从工作中休息一下,或者放下你一直在读的那本书,你伸手拿起手机,想着你只需要玩一个快速的游戏来放松一下。但在你知道之前,你已经花了三个小时沉浸在关于看起来像名人的猫的 TikTok 视频中,或者无休止地浏览 Instagram 卷轴,这些卷轴不知何故从烹饪技巧变成了阴谋论,关于为什么热狗是 10 个一包,而面包是 8 个一包。现代智能手机虽然功能强大,但已成为一把双刃剑。本应是片刻的放松变成了无休止的通知、社交媒体兔子洞和我们称之为“厄运滚动”的特殊形式的数字流沙。有时,您只想玩俄罗斯方块,而您的手机不会嗡嗡作响,而不会被工作电子邮件、新闻提醒或在凌晨 2 点发送模因的朋友嗡嗡作响。
这就是专用游戏设备的美妙之处。还记得启动 Game Boy 或在旧诺基亚上偷偷玩一轮 Snake 的纯粹乐趣吗?那些简单、专注的游戏体验有一些神奇之处,没有通知,没有社交媒体的诱惑,只有你和游戏。
对更简单游戏的怀旧渴望,加上逃离现代生活数字混乱的愿望,激发了我打造一些特别的东西:一款微型袖珍游戏机,它带回了经典游戏的精髓,同时与网络世界完全脱节。
愿景
我想创建一个设备:
• 可舒适地放在口袋里,并可以挂在钥匙扣上。
• 运行俄罗斯方块、青蛙和贪吃蛇等经典游戏
• 使用物理按钮获得令人满意的复古游戏体验
• 完全离线且无干扰
• 展示极简电子产品的强大功能
• 作为完美的对话开场白和 DIY 创造力的证明
我们正在构建什么
该项目以 ATtiny85 微控制器为中心——一种微小但功能强大的芯片,证明您不需要强大的处理能力即可创建引人入胜的游戏体验。我们的控制台功能:
核心组件:
• ATtiny85 微控制器(我们运营的大脑)

• SSD1306 OLED 显示屏(清晰的 128x64 像素游戏画布)

• 三个触觉按钮(用于导航和游戏)

• 主动蜂鸣器(适合那些令人满意的蜂鸣声和嘟嘟声)
• 小型电池组(用于便携式游戏)
• 定制 3D 打印外壳(在 Autodesk Fusion 360 中设计)
技术规格:
• 显示屏:0.96 英寸 OLED(128x64 分辨率)
• 电源:3.7V 锂聚合物电池
• 尺寸:约 45 毫米 x 35 毫米 x 20 毫米(便于携带!
• 游戏:俄罗斯方块、贪吃蛇、青蛙和更多经典
• 电池寿命: 连续游戏 4-6 天
为什么这很重要
在我们这个高度互联的世界中,创造和使用一款只做一件事的设备会让人深感满足:让你心烦意乱地娱乐。这不仅仅是构建游戏机;它是关于:
• 数字极简主义在行动:证明有时少即是多
• 重燃童年奇迹:带回简单游戏的纯粹乐趣
• 在制作中学习:通过动手创作了解电子产品和编程
• 可持续游戏:无需软件更新或计划报废即可工作多年的设备
• Conversation Starter:没有什么比拿出您自己构建的设备更好的了
未来的旅程
在本文中,我们将介绍构建过程的每一步,从选择组件和编写代码到设计外壳,并将所有内容组装成一个精美的、具有专业外观的设备。无论您是想要了解微控制器的初学者,还是想要尝试新事物的经验丰富的创客,这个项目都能提供挑战和奖励的完美平衡。
我们将介绍:
硬件设置:接线图和组件选择
编程:使用 Arduino IDE 为 ATtiny85 编写游戏(带有可免费下载的游戏包)
3D 设计:在 Autodesk Fusion 中创建自定义案例
组装:把所有东西放在一起
疑难解答:常见问题和解决方案
未来升级:扩展主机的想法
在此版本结束时,您不仅会拥有一个功能齐全的游戏机,还会对嵌入式系统、游戏编程和 3D 设计有更深入的了解。更重要的是,您将创造出在制作和使用过程中都能带来真正快乐的东西。
因此,让我们深入研究并构建一些东西,以证明最佳游戏体验并不总是来自最大的屏幕或最强大的处理器。有时,它们来自用自己的双手创造出令人敬畏的东西的满足感。
组件列表
在开始之前,让我们收集一下此版本所需的所有组件:
基本组成部分:
• 1 个 ATtiny85 微控制器(推荐使用 DigiSpark 兼容板)
• 1x SSD1306 OLED 显示屏(0.96 英寸、128x64、I2C)
• 3 个触摸按钮 (6mm x 6mm)
• 1 个无源蜂鸣器(兼容 5V)
• 1 节 3.7V 锂聚合物电池 (500-1000mAh) 或 3 节 AAA 电池座
• 1 个滑动开关(用于电源)
• 用于原型设计的跳线和试验板
• 用于最终组装的穿孔板或定制 PCB
• 3D 打印机耗材(推荐 PLA)
所需工具:
• 烙铁和焊料
• 剥线钳
• 3D 打印机
• 安装了 Arduino IDE 的计算机
• 用于编程的 USB 电缆
这个项目的美妙之处在于它的简单性。ATtiny85 只有 5 个 I/O 引脚,因此我们需要对连接有策略
引脚分配:
引脚 0 (PB0):按钮 1(向左/旋转)
引脚 1 (PB1):蜂鸣器
引脚 2 (PB2):按钮 2(右/下)
引脚 3 (PB3):SDA(用于 OLED 的 I2C 数据)
引脚 4 (PB4):SCL (OLED 的 I2C 时钟)
引脚 5 (PB5):按钮 3(选择/暂停)
连接详细信息:
OLED 显示器:将 VCC 连接到 3.3V,GND 连接到地,SDA 连接到 PB3,SCL 连接到 PB4
按钮:每个按钮都连接在其分配的引脚和接地之间(使用外部下拉电阻器)
蜂鸣器:正极端子到 PB2,负极端地
电源:电池正极对 VCC,负极对地,通过电源开关
【Arduino 动手做】基于 ATtiny85 的微型 DIY 游戏机
项目代码#include < EEPROM.h>
#include “font6x8AJ.h”
#include < avr/sleep.h>
#include < avr/interrupt.h> // 额外中断需要
#define DIGITAL_WRITE_HIGH(端口) 端口b |= (1 <<端口)
#define DIGITAL_WRITE_LOW(端口) 端口B &= ~(1 <<端口)
设置和清除位的例程(用于 sleep 代码)
#define CBI(SFR, 位) (_SFR_BYTE(SFR) &= ~_BV(位))
#define SBI(SFR, bit) (_SFR_BYTE(SFR) |= _BV(bit))
定义 OLED 输出
#define SSD1306XLED_H
#define SSD1306_SCL PORTB4 // SCL,SSD1306板上的引脚 4 - 用于 webbogles 板
#define SSD1306_SDA 端口 B3 // SDA,SSD1306板上的引脚 3 - 用于 webbogles 板
#define SSD1306_SA 0x78 // Slave 地址
#define WINSCORE 7
函数原型
无效 startGame(void);
无效 drawPlatform(void);
无效 drawPlatform2(无效);
无效 sendBlock(int);
无效 playPong(void);
无效蜂鸣(int,int);
无效 drawBall(int x, int y);
无效 blankBall(int x, int y);
无效 doDrawLS(长,字节);
无效 doDrawRS(long, byte);
无效 doNumber (int x, int y, int value);
无效 ssd1306_init(void);
无效 ssd1306_xfer_start(void);
无效 ssd1306_xfer_stop(void);
无效 ssd1306_send_byte(uint8_t 字节);
void ssd1306_send_command(uint8_t 命令);
无效 ssd1306_send_data_start(void);
无效 ssd1306_send_data_stop(void);
无效 ssd1306_setpos(uint8_t x, uint8_t y);
无效 ssd1306_fillscreen(uint8_t fill_Data);
无效 ssd1306_char_f6x8(uint8_t x, uint8_t y, const char ch[]);
无效 ssd1306_draw_bmp(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t bitmap[]);
int 播放器;0 到 128-platformWidth - 这是玩家的位置
int 玩家 2;0 到 128-platformWidth - 这是玩家的位置
int lastPlayer;
int lastPlayer2;
int platformWidth = 16;
布尔值 stopAnimate = 0;检测到碰撞时,此项设置为 1
布尔值 mute = 0;
布尔值 newHigh = 0;
int 分数 = 0;分数 - 这会影响游戏的难度
int 分数 2 = 0;分数 - 这会影响游戏的难度
int ballx = 62*8;球的坐标
int bally = 50*4;球的坐标
int vdir = -4;垂直方向和步长距离
int hdir = -8;水平方向和步距
int 模式 = 0;
int 扰动 = 0;
int pFactor = 12;
中断处理程序
ISR(PCINT0_vect){ // PB0 引脚按钮中断
}
void playerIncPong(){ // PB2 引脚按钮中断
}
Arduino 东西 - 设置
无效 setup() {
DDRB = 0b00000010;将 PB1 设置为输出(用于扬声器)
PCMSK = 0b00000001;引脚更改掩码:侦听 PortB 位 1
吉姆斯克 |= 0b00100000;启用 PCINT 中断
sei();启用所有中断
}
Arduino 东西 - loop
void loop() {
ssd1306_init();
ssd1306_fillscreen(0x00);
小写字符集受到严重损害,因为我不得不截断 ASCII 表
为可执行代码释放空间 - 因此小写 y 和 w 分别重新映射到 h 和 /。
表格中没有 z(或 h!),因为它们在文本的任何地方都没有使用,而且大多数
由于同样的原因,符号也丢失了(有关更多详细信息,请参阅我的 Hacked 版本的 font6x8.h - font6x8AJ.h)
ssd1306_char_f6x8(0, 1, “ --------------- ”);
ssd1306_char_f6x8(0, 2, “ B A T ”);
ssd1306_char_f6x8(0, 4, “ B O N A N Z A ”);
ssd1306_char_f6x8(0, 5, “ --------------- ”);
ssd1306_char_f6x8(0, 7, “ BH Andh Jackson ”);请参阅上面的评论!
长 startT = millis();
long nowT =0;
布尔值 sChange = 0;
while(digitalRead(0) == 高) {
nowT = millis();
if (nowT - startT > 2000) {
sChange = 1;
EEPROM.write(0,0);
EEPROM.write(1,1);
ssd1306_char_f6x8(16, 0, “- 系统重置 -”);
破;
}
if (sChange == 1) break;
}
while(digitalRead(0) == 高);
mute=EEPROM.read(0);
模式=EEPROM.read(1);
if (mute != 0 & mute != 1) {
静音 = 0;
EEPROM.write(0,0);
}
if (mode != 1 & mode != 3 && mode != 4) {
mode = 1;
EEPROM.write(1,1);
}
if (sChange != 1) {
延迟 (1500);
ssd1306_init();
ssd1306_fillscreen(0x00);
停止动画 = 0;
分数 = 0;
分数 2 = 0;
playPong() 的 ;
延迟 (3500);
}
system_sleep();
}
【Arduino 动手做】基于 ATtiny85 的微型 DIY 游戏机
【Arduino 动手做】基于 ATtiny85 的微型 DIY 游戏机项目链接:https://www.instructables.com/Tiny-DIY-Game-Console-Based-on-ATtiny85/
项目作者:tech_nickk
项目视频:https://www.youtube.com/watch?v=WD0GYdtmzSc
项目代码:https://www.instructables.com/Tiny-DIY-Game-Console-Based-on-ATtiny85/
游戏库:https://hacksterio.s3.amazonaws.com/uploads/attachments/1860077/ATtiny_Games.zip
3D打印文件:
https://hacksterio.s3.amazonaws.com/uploads/attachments/1860078/atboy_cover_v2_3bMfqsHiGw.stl
https://hacksterio.s3.amazonaws.com/uploads/attachments/1860079/atboy_body_v2_eTU2XlQajh.stl
页:
[1]