【Arduino 动手做】脑洞大开:与Arduino下国际象棋
Arduino是一个开放源码的电子原型平台,它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板,它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备。Arduino的编程是基于C/C++语言的,你可以使用Arduino IDE(集成开发环境)来编写、编译和上传代码到Arduino板上。Arduino还有一个丰富的库和社区,你可以利用它们来扩展Arduino的功能和学习Arduino的知识。Arduino的特点是:
1、开放源码:Arduino的硬件和软件都是开放源码的,你可以自由地修改、复制和分享它们。
2、易用:Arduino的硬件和软件都是为初学者和非专业人士设计的,你可以轻松地上手和使用它们。
3、便宜:Arduino的硬件和软件都是非常经济的,你可以用很低的成本来实现你的想法。
4、多样:Arduino有多种型号和版本,你可以根据你的需要和喜好来选择合适的Arduino板。
5、创新:Arduino可以让你用电子的方式来表达你的创意和想象,你可以用Arduino来制作各种有趣和有用的项目,如机器人、智能家居、艺术装置等。
【Arduino 动手做】脑洞大开:与Arduino下国际象棋
这个项目是在我心中以“游戏”竞赛为主题开发的,我希望你会喜欢它并投出你的一票:)这个项目的想法很简单。我想用一个简单的电子组件模拟尽可能多的棋盘游戏。当然,每个游戏都有自己的软件,必须加载到模拟器的微控制器中。这样,我可以模拟像飞行棋、梯子和蛇棋、莫里斯棋、西洋跳棋以及各种基于骰子的游戏……如今,不幸的是,孩子们对棋盘游戏失去了兴趣,真正吸引他们的是那些画面和音效最逼真、需要大容量存储空间和动态内存的电脑游戏。谁知道呢,也许通过和孩子们一起完成这个项目,我们能把孩子们的注意力从电脑屏幕上转移开,让他们去玩一些基础游戏。当然,我知道Arduino上还有很多其他的游戏项目,但大多数都是基于LCD或OLED显示屏的,我见过的类似项目很少,只用RGB LED组件来模拟游戏。
在项目的初稿中,我曾想过模拟游戏《梯子和贪吃蛇》,但最后我决定模拟有史以来最古老的策略游戏,数以百万计的人玩的游戏中之游戏,即国际象棋。我可以制作一个系统,连接到互联网并接管强大的国际象棋程序(例如stockfish ……)的走法。我可以使用混合系统,例如连接到 Raspberry Pi 的微控制器(在游戏模拟器中),我可以在 LCD 键盘上输入和显示走法,就像Arduino Mega上的micro-Max版本一样。但是我没有。我足够固执,要制作一个完全自主的系统来在……* 鼓声 * Arduino PRO MINI 和由 RGB led 阵列制成的显示器上下棋。
【Arduino 动手做】脑洞大开:与Arduino下国际象棋
【Arduino 动手做】脑洞大开:与Arduino下国际象棋
## 步骤 1:概述然而,使用 Arduino Mini Pro 时,我必须克服一个非常大的障碍,那就是 Atmega328p 微控制器 2kb 的内存限制!我找到了一个由 HG Muller 的micro-Max开发的国际象棋引擎,并将其移植到 Arduino UNO 平台,你可以在Hackaday上找到完整的项目。如你所见,在这个项目中,国际象棋游戏显示在串行线路监视器上。因此,你需要一台连接到 Arduino 的电脑才能玩。在我的项目中,模拟器由 256 个 WS2812 型 RGB LED(4 个 8x8 LED 阵列)组成,棋盘和棋子会出现在这里,并且可以通过触摸传感器指定走子。整个系统完全独立,我们只需要一个电源 :)
在第一阶段,我使用FastLed 库来驱动显示屏,*咳咳* 但是让我们做一些数学计算:每个 RGB led 的颜色由每种基本颜色(红色、绿色、蓝色)一个 led 组成,这 3 种颜色的值在 0-255 范围内(因此每个 led 可以有 255*255*255 = 16581375 种颜色)。对于每个 RGB led,每种基本颜色需要 8 位信息,RGB led 显示的颜色需要 24 位(3 字节)。对于 256 个 RGB LED,我们需要 3*256 = 768 字节,这将占用我们可用 2 KB 内存中的 768 字节。这非常非常多。我们只剩下 1280 字节。我还有程序本身,它占用了我在程序中使用的各种全局变量的内存,有一次我只有 680 个字节可用!内存太少,国际象棋程序无法正常运行。我尝试了几种方案,也尝试过最大化可用内存,但前4-5步之后系统就崩溃了。所以我不得不使用另一个库,用另一种方法来解决这个问题。
最常用的 RGB led 显示库是 Fastled 和 Neopixel,但由于内存问题,我无法使用它们。在寻找解决方案时,我偶然发现了一个我以前从未听说过的小型库,但它似乎解决了上述库的负面影响。它被称为FAB_LED,您可以在 github 上找到它。这个库是做什么的?它可以在特定的调色板中显示颜色,调色板可以以 8 位(一次 256 种颜色)、4 位(一次 16 种颜色)和 2 位(一次 4 种颜色)编码。使用这种调色板和 2 位颜色编码(一次 4 种颜色 - 我只需要 2 种颜色用于棋盘,2 种颜色用于棋子),如果我们做一些数学计算,我们会发现 256 个 RGB LED 将占用 256*2 = 512 位内存,也就是 64 字节 !!! 因此我们有足够的内存来运行国际象棋程序。
除了LED显示屏外,我还使用了3个触摸传感器(该项目最多允许使用8个触摸传感器)来控制“光标”向右和向前移动,以及选择位置。我使用的开发板是一块5伏Arduino Pro Mini开发板,内置ATMega 328p微控制器。
【Arduino 动手做】脑洞大开:与Arduino下国际象棋
## 第 2 步:构建项目所需物品:
对于外壳
- 木制相框(内部尺寸为 166x166mm - 我从一家相框制造公司在线订购);
- 165x165mm 3mm 灰色烟熏透明有机玻璃板;
- 一张 165x165 白色复印纸;
- 3D打印165x165mm 16x16塑料网格;
它的外壳和VERBIS 字钟的外壳非常相似,只是我没有用螺丝固定,而是用热胶枪把所有部件都粘了起来。上面的照片展示了所有零件和组装过程。
对于电子产品
- 65x65mm RGB 8x8 LedMatrix - 4 件;
- TTP223电容式触摸传感器模块-至少3个;
-Arduino Pro Mini 模块 5v/16Mhz;
- 母头 DC 连接器电缆 5.5mmx2.1mm(2.5mm);
- 5v/2A 电源,带 5.5mmx2.1mm(2.5mm)公头连接器;
- 一些 2.54 毫米 1 排直针(公)接头;
- 彩色电线;
原理图如下所示(也在上面的照片之间),在图片中您可以看到使用 Arduino Uno 进行第一次测试时的组装情况。
就像我说的,一开始我使用了 FastLed 库和 LED 矩阵库,以便于定义 16x16 LED 矩阵。四个 8x8 矩阵的排列必须如下图所示。
这样,当我想依次点亮 256 个 RGB LED 时,它们就会像下面的视频中那样亮起来,连接方式也完全一样。
但是我需要在二维坐标系中定义我的 LED,我选择原点在左下角,x 轴从左到右水平,y 轴从下到上,在下面的视频中你可以看到我在说什么(下一步会详细介绍)。
在此步骤的最后一张主图中,您可以看到最终的电子连接是什么样的。
【Arduino 动手做】脑洞大开:与Arduino下国际象棋
## 步骤3:软件正如我之前所说,为了驱动LED显示屏,我使用了LED_FAB库。我将尝试解释一下我使用的一些函数的作用:
ClearBoard - 在循环的每一步中,显示屏上每个 led 都初始化为 (1,1,1) RGB 颜色(深灰色),我认为重新绘制棋盘的棋盘方格模型和重新绘制棋子就足以擦除以前的颜色,但令我惊讶的是,并不是每个“像素”都被擦除了,我不知道为什么……
DisplayBoard - 使用此功能绘制棋桌的方形模型,使用深灰色(1,1,1)和浅灰色(8,8,8)(在调色板中编码为 0 和 1);
DisplayChessPieces - 函数名就说明了这个函数的用途。我觉得把棋子显示在棋盘上会很不错,你可以用这种方式下棋,或者你也可以用一个适合正方形尺寸的旧磁性棋盘(你可以在主视频中看到它的样子——下一步)。棋子显示如下:
典当 车 骑士 主教 女王 国王
ShowCursor - 它在板上显示一个 4 像素的闪烁方块(它改变了方块的四个单独的 led 颜色),并且由于它每 60 毫秒调用一次,因此闪烁频率相当低
ShowMove - 显示2个闪烁的方块,每20毫秒调用一次,因此闪烁频率相当高
buttonRIGHT、buttonUP - 接收触摸传感器信号并更新光标位置
按钮“确定” - 它选择人类移动的开始和结束位置,但也在机器移动显示后继续游戏
XY - 将 x、y 位置转换为显示屏上的 LED 数字
其余功能由国际象棋引擎使用。
我把代码上传到了github,你可以下载并编写你自己的 Arduino Pro Mini ChessMaster :)
【Arduino 动手做】脑洞大开:与Arduino下国际象棋
## 步骤 4:游戏正如您在代码中看到的,串口监视器未使用,因此您只能依赖棋盘的视觉反馈。但本质上,您需要使用右侧和上方的触摸传感器移动您想要移动的棋子下方缓慢闪烁的光标,使用“确定”触摸传感器选择起始点,光标将开始以更快的速度闪烁,再次以相同方式将光标移动到最终移动点,然后按“确定”按钮选择。使用实体棋子(如果您使用国际象棋)进行移动,并触摸“确定”按钮。您的移动将被执行,机器将进行移动,您将看到两个快速闪烁的方块显示的移动。移动机器的实体棋子(如果您使用国际象棋)。按“确定”即可继续游戏。就是这样。这看起来有点复杂,但过一段时间您就会习惯的。在上面的视频中,我拍摄了一小段对局。我的棋艺很差,所以我承认我作弊了。我使用了一个根据特定位置推荐下一步行动的网站。当然,Micro Max 肯定会被击败,但我认为它完成任务相当出色(Micro Max的 ELO 大约是 2000,这还不错)。
游戏玩法中仍然缺少的是,它没有更明显地显示非法移动(现在,实际程序没有移动,只有光标出现在初始位置),也没有发出游戏失败或获胜的信号(程序只是停止)。
然而,这种状态下的棋盘非常适合儿童理解国际象棋及其规则。
我希望尽可能多的人能够尝试构建这个项目,并尽可能地让它感到满意。
【Arduino 动手做】脑洞大开:与Arduino下国际象棋
附录项目链接:https://www.instructables.com/Playing-Chess-Against-Arduino/
项目作者:andrei.erdei
项目视频(15分钟):https://www.youtube.com/watch?v=b8A6UThnWm0
项目代码:https://github.com/ancalex/Arduino-Chess-Master
3D文件:https://www.tinkercad.com/things/hV8lZrrJvlH
外观参考:https://www.instructables.com/VERBIS-Desktop-8x8-RGB-LED-Matrix-Word-Clock/
页:
[1]