26浏览
查看: 26|回复: 2

[项目] 【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 游戏机图1

【Arduino 动手做】基于 ATtiny85 的微型 DIY 游戏机图2

【Arduino 动手做】基于 ATtiny85 的微型 DIY 游戏机图3

【Arduino 动手做】基于 ATtiny85 的微型 DIY 游戏机图4

【Arduino 动手做】基于 ATtiny85 的微型 DIY 游戏机图5

【Arduino 动手做】基于 ATtiny85 的微型 DIY 游戏机图6

【Arduino 动手做】基于 ATtiny85 的微型 DIY 游戏机图7

【Arduino 动手做】基于 ATtiny85 的微型 DIY 游戏机图8

【Arduino 动手做】基于 ATtiny85 的微型 DIY 游戏机图9

【Arduino 动手做】基于 ATtiny85 的微型 DIY 游戏机图10

【Arduino 动手做】基于 ATtiny85 的微型 DIY 游戏机图11

【Arduino 动手做】基于 ATtiny85 的微型 DIY 游戏机图12

【Arduino 动手做】基于 ATtiny85 的微型 DIY 游戏机图13

【Arduino 动手做】基于 ATtiny85 的微型 DIY 游戏机图14

驴友花雕  中级技神
 楼主|

发表于 15 小时前

【Arduino 动手做】基于 ATtiny85 的微型 DIY 游戏机

项目代码

  1. #include < EEPROM.h>
  2. #include “font6x8AJ.h”
  3. #include < avr/sleep.h>
  4. #include < avr/interrupt.h> // 额外中断需要
  5. #define DIGITAL_WRITE_HIGH(端口) 端口b |= (1 <<端口)
  6. #define DIGITAL_WRITE_LOW(端口) 端口B &= ~(1 <<端口)
  7. 设置和清除位的例程(用于 sleep 代码)
  8. #define CBI(SFR, 位) (_SFR_BYTE(SFR) &= ~_BV(位))
  9. #define SBI(SFR, bit) (_SFR_BYTE(SFR) |= _BV(bit))
  10. 定义 OLED 输出
  11. #define SSD1306XLED_H
  12. #define SSD1306_SCL PORTB4 // SCL,SSD1306板上的引脚 4 - 用于 webbogles 板
  13. #define SSD1306_SDA 端口 B3 // SDA,SSD1306板上的引脚 3 - 用于 webbogles 板
  14. #define SSD1306_SA 0x78 // Slave 地址
  15. #define WINSCORE 7
  16. 函数原型
  17. 无效 startGame(void);
  18. 无效 drawPlatform(void);
  19. 无效 drawPlatform2(无效);
  20. 无效 sendBlock(int);
  21. 无效 playPong(void);
  22. 无效蜂鸣(int,int);
  23. 无效 drawBall(int x, int y);
  24. 无效 blankBall(int x, int y);
  25. 无效 doDrawLS(长,字节);
  26. 无效 doDrawRS(long, byte);
  27. 无效 doNumber (int x, int y, int value);
  28. 无效 ssd1306_init(void);
  29. 无效 ssd1306_xfer_start(void);
  30. 无效 ssd1306_xfer_stop(void);
  31. 无效 ssd1306_send_byte(uint8_t 字节);
  32. void ssd1306_send_command(uint8_t 命令);
  33. 无效 ssd1306_send_data_start(void);
  34. 无效 ssd1306_send_data_stop(void);
  35. 无效 ssd1306_setpos(uint8_t x, uint8_t y);
  36. 无效 ssd1306_fillscreen(uint8_t fill_Data);
  37. 无效 ssd1306_char_f6x8(uint8_t x, uint8_t y, const char ch[]);
  38. 无效 ssd1306_draw_bmp(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t bitmap[]);
  39. int 播放器;0 到 128-platformWidth - 这是玩家的位置
  40. int 玩家 2;0 到 128-platformWidth - 这是玩家的位置
  41. int lastPlayer;
  42. int lastPlayer2;
  43. int platformWidth = 16;
  44. 布尔值 stopAnimate = 0;检测到碰撞时,此项设置为 1
  45. 布尔值 mute = 0;
  46. 布尔值 newHigh = 0;
  47. int 分数 = 0;分数 - 这会影响游戏的难度
  48. int 分数 2 = 0;分数 - 这会影响游戏的难度
  49. int ballx = 62*8;球的坐标
  50. int bally = 50*4;球的坐标
  51. int vdir = -4;垂直方向和步长距离
  52. int hdir = -8;水平方向和步距
  53. int 模式 = 0;
  54. int 扰动 = 0;
  55. int pFactor = 12;
  56. 中断处理程序
  57. ISR(PCINT0_vect){ // PB0 引脚按钮中断
  58. }
  59. void playerIncPong(){ // PB2 引脚按钮中断
  60. }
  61. Arduino 东西 - 设置
  62. 无效 setup() {
  63. DDRB = 0b00000010;将 PB1 设置为输出(用于扬声器)
  64. PCMSK = 0b00000001;引脚更改掩码:侦听 PortB 位 1
  65. 吉姆斯克 |= 0b00100000;启用 PCINT 中断
  66. sei();启用所有中断
  67. }
  68. Arduino 东西 - loop
  69. void loop() {
  70. ssd1306_init();
  71. ssd1306_fillscreen(0x00);
  72. 小写字符集受到严重损害,因为我不得不截断 ASCII 表
  73. 为可执行代码释放空间 - 因此小写 y 和 w 分别重新映射到 h 和 /。
  74. 表格中没有 z(或 h!),因为它们在文本的任何地方都没有使用,而且大多数
  75. 由于同样的原因,符号也丢失了(有关更多详细信息,请参阅我的 Hacked 版本的 font6x8.h - font6x8AJ.h)
  76. ssd1306_char_f6x8(0, 1, “ --------------- ”);
  77. ssd1306_char_f6x8(0, 2, “ B A T ”);
  78. ssd1306_char_f6x8(0, 4, “ B O N A N Z A ”);
  79. ssd1306_char_f6x8(0, 5, “ --------------- ”);
  80. ssd1306_char_f6x8(0, 7, “ BH Andh Jackson ”);请参阅上面的评论!
  81. 长 startT = millis();
  82. long nowT =0;
  83. 布尔值 sChange = 0;
  84. while(digitalRead(0) == 高) {
  85. nowT = millis();
  86. if (nowT - startT > 2000) {
  87. sChange = 1;
  88. EEPROM.write(0,0);
  89. EEPROM.write(1,1);
  90. ssd1306_char_f6x8(16, 0, “- 系统重置 -”);
  91. 破;
  92. }
  93. if (sChange == 1) break;
  94. }
  95. while(digitalRead(0) == 高);
  96. mute=EEPROM.read(0);
  97. 模式=EEPROM.read(1);
  98. if (mute != 0 & mute != 1) {
  99. 静音 = 0;
  100. EEPROM.write(0,0);
  101. }
  102. if (mode != 1 & mode != 3 && mode != 4) {
  103. mode = 1;
  104. EEPROM.write(1,1);
  105. }
  106. if (sChange != 1) {
  107. 延迟 (1500);
  108. ssd1306_init();
  109. ssd1306_fillscreen(0x00);
  110. 停止动画 = 0;
  111. 分数 = 0;
  112. 分数 2 = 0;
  113. playPong() 的 ;
  114. 延迟 (3500);
  115. }
  116. system_sleep();
  117. }
复制代码



回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 15 小时前

【Arduino 动手做】基于 ATtiny85 的微型 DIY 游戏机

回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail