使用这款diy电子d20模具,打造时尚的翻滚体验

想在下次游戏聚会上有点独特吗?看看这个DIY电子D20,具有定制的关键点击和失误图形。...

想为你的下一个桌面角色扮演游戏做点独特的东西吗?一款带有自定义图形的电子D20如何应对致命一击和失误?今天,我将向您展示如何使用Arduino和一些简单的部件构建自己的。

如果您以前从未使用过Arduino,请不要担心,我们有入门指南。

建造计划

这是一个简单的项目。Arduino将驱动OLED显示器,按钮将滚动模具。自定义图形将显示严重命中或严重未命中掷骰。您可以轻松地将代码修改为D8、D10或D12。

你需要什么

  • 1 x Arduino
  • 1 x 0.96英寸I2C OLED显示屏
  • 1个按钮
  • 1x10K?电阻
  • 1个试验板
  • 各种连接线
  • 如果您不想完全按照书面说明进行操作,请参阅此处的完整代码。

这些是构建自己的D20所需的核心部分。您可能希望将其安装到外壳中(如下所述),并将电路焊接到更永久的状态。以下是执行此操作所需的其他部分:

  • 4 x M2 x 10mm(0.4英寸)螺栓
  • 4个M2螺母
  • 4个7毫米(0.28英寸)垫圈
  • 9V电池扣(或合适的替代品)
  • 配套热缩管

这些OLED显示器非常酷。通常可以购买白色、蓝色、黄色或三种颜色的混合物。我买了一件蓝色的,与我的箱子相配。确保您使用的是I2C型号而不是SPI。

几乎任何Arduino都适合。我选择了Nano,因为它们足够小,可以放进箱子里。有关Arduino车型的更多信息,请查看我们的购买指南。

赛道

这是您需要的电路:

将OLED显示屏上的VCC和GND连接至Arduino+5V电源和接地。将Arduino上的模拟4连接到标有SDA的引脚。将模拟5连接至SCL引脚。这些引脚包含使用I2C总线驱动显示器所需的电路。确切的引脚将因型号而异,但A4和A5用于Nano和Uno。如果未使用Uno或Nano,请查看模型的Wire library文档。

将蓄电池连接至接地和VIN针脚。这表示输入电压,并接受各种不同的直流电压——但首先检查您的特定型号,有时可能会略有不同。

将按钮连接到数字引脚2。注意10k是如何连接的?电阻器接地。这是非常重要的!这被称为下拉电阻器,它可以防止Arduino在按下按钮时检测到虚假数据或干扰。它还起到保护董事会的作用。如果不使用该电阻器,+5V将直接接地。这被称为一个死短,是一个简单的方式杀死一个Arduino。

如果要焊接此电路,请使用热缩管保护连接:

确保不要将其加热太多,并且只有在确定电路工作正常后才进行此操作。您也可以将电缆绞成对。这可以让他们保持整洁,有助于保护他们免受过度压力:

按钮测试

现在您已经构建了电路,请上载此测试代码(确保从工具中选择正确的板和端口>电路板和工具>端口菜单):

c***t int buttonPin = 2; // the number of the button pinvoid setup() { pinMode(buttonPin, INPUT); // setup button Serial.begin(9600); // setup serial}void loop(){ if(digitalRead(buttonPin) == HIGH) { Serial.print("It Works"); delay(250); }}

上传后,保持Arduino通过USB连接,并打开串行监视器(右上角>串行监视器)。每次按下按钮时,您都会看到“它工作”字样。

如果什么也没发生,去仔细检查你的电路。

oled设置

您需要安装两个库来驱动显示器。从Github下载Adafruit_SSD1306和Adafruit GFX[不再可用]库,并将它们保存到您的库文件夹中。如果您不确定库文件夹在哪里,请阅读我的复古游戏教程,在那里我将更详细地配置相同的显示。

重新启动Arduino IDE并从文件中上载测试草图>示例菜单。选择Adafruit SSD1306,然后选择SSD1306_128x64_i2c。上传此代码(需要一段时间),您应该会在显示屏上看到许多形状和图案:

如果什么都没有发生,请仔细检查您的连接。如果在检查后仍然无法工作,则需要修改示例代码。

更改此行(在设置功能开始时):

display.begin(SSD1306_SWITCHCAPVCC, 0x3D);

为此:

display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

这将告诉库特定的有关您正在使用的显示的详细信息。您现在应该全部设置为继续构建。

案件

如果您是在试验板上构建这个,或者不希望将其装箱,那么您可以跳过此步骤。

我设计并3D打印了这个盒子。获取Thingiverse上的文件。如果没有3D打印机,不要担心——在线服务3D集线器和Shapeways提供在线打印服务。

你可以很容易地用木头**这个盒子,或者购买一个塑料项目盒。

盖子是一种简单的推入式设计,包含一些用于五金件的切口:

代码

现在一切都准备好了,是时候编写代码了。以下是它在伪代码中的工作方式:

if button is pressed generate random number if random number is 20 show graphic else if random number is 1 show graphic else show number

为了使其正常工作,需要生成一个随机数——这是模具的滚动。Arduino有一个名为random的随机数生成器,但不应该使用它。虽然它对于基本的随机任务来说已经足够好了,但是对于一个电子模具来说它还不够随机。原因有点复杂,但是如果你对boallen.com感兴趣,你可以阅读更多。

在Github上下载sirleech提供的TrueRandom库。将其添加到库文件夹并重新启动IDE。

现在创建一个新文件并设置初始代码(或者从GitHub获取完成的代码):

#include <SPI.h>#include <Wire.h>#include <Adafruit_GFX.h>#include <Adafruit_SSD1306.h>#include <TrueRandom.h> Adafruit_SSD1306 display(4);void setup() { display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // setup the OLED pinMode(buttonPin, INPUT); // setup button }void loop() { }

此代码配置OLED,包括与它通信所需的所有库以及新的随机数库。现在将其添加到主循环:

if(digitalRead(buttonPin) == HIGH) { delay(15); if(digitalRead(buttonPin) == HIGH) { display.fillScreen(BLACK); // erase the whole display display.setTextColor(WHITE); display.setTextSize(2); display.setCursor(0, 0); display.println(TrueRandom.random(1, 21)); // print random number display.display(); // write to display delay(100); }}

这是非常基本的时刻,但它是一个工作D20。无论何时按下按钮,屏幕上都会显示一个介于1和20之间的随机数:

这很管用,但有点无聊。让我们做得更好。创建两个新方法,drawDie和eraseDie:

void drawDie() { display.drawRect(32, 0, 64, 64, WHITE);}

这些将在屏幕中间画出一个骰子。您可能希望通过绘制D20或D12等使其更复杂,但绘制基本的六面模具更简单。以下是基本用法:

drawDie();

接下来,修改你的主循环来画随机数,只有大的和中间的。将文本大小和光标更改为:

display.setTextColor(WHITE);display.setCursor(57, 21);

现在看起来好多了:

唯一的问题是大于9的数字:

解决方法很简单。任何小于10的数字都会将光标设置到与那些大于或等于10的数字不同的位置。替换此行:

display.setCursor(57, 21);

为此:

int roll = TrueRandom.random(1, 21); // store the random numberif (roll < 10) { // single character number display.setCursor(57, 21); }else { // dual character number display.setCursor(47, 21); }

下面是现在的情况:

现在剩下的就是当你掷出致命一击或未命中时的图像。其中包括几个步骤,但这是一个足够简单的过程。

找到您想要使用的合适图像(越简单越好,因为显示器仅为单色)。以下是我使用的图像:

您希望使用的任何图像都需要转换为十六进制数组。这是以代码形式表示的图像。有很多工具可以实现这一点,其中一些是专门为OLED显示器编写的。最简单的方法是使用PicturetoC_Hex在线工具。以下是所需的设置:

上载图像,并将代码格式设置为十六进制:0x。设置用于所有绘制图像功能的黑色/白色。将所有其他选项保留为默认值。如果需要,可以在此处调整图像大小。按Get C String,您将看到图像数据出现:

您将需要在一分钟内生成此数据。创建两个名为drawExplosion和drawSkull的函数(或适合您的版本的名称)。代码如下:

void drawExplosion() { // store image in EEPROM static c***t unsigned char PROGMEM imExp[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x78,0x7f,0xff,0xc0,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xf0,0x00,0x00,0x00,0x3f,0xff,0xff,0xff,0xfb,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x07,0xff,0xff,0xf9,0xff,0xd8,0x00,0x00,0x00,0x3f,0xff,0xf0,0x0f,0x00,0x00,0x00,0x00,0x1f,0x1f,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0xff,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x01,0xbf,0xff,0xff,0xff,0x30,0x00,0x00,0x00,0x13,0xf7,0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }; display.drawBitmap(0, 0, imExp, 64, 62, 1); // draw mushroom cloud}void drawSkull() { // store image in EEPROM static c***t unsigned char PROGMEM imSku[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x78,0x00,0x07,0xf0,0x00,0x00,0x00,0x00,0xfc,0x00,0x07,0xf8,0x00,0x00,0x00,0x00,0xfe,0x00,0x07,0xf8,0x00,0x00,0x00,0x01,0xfe,0x00,0x07,0xfc,0x00,0x00,0x00,0x01,0xfe,0x00,0x07,0xfe,0x00,0x3f,0xc0,0x03,0xfe,0x00,0x01,0xff,0x81,0xff,0xfc,0x07,0xec,0x00,0x00,0x3f,0xc7,0xff,0xff,0x1f,0xc0,0x00,0x00,0x0f,0xcf,0xff,0xff,0xdf,0x00,0x00,0x00,0x07,0xbf,0xff,0xff,0xee,0x00,0x00,0x00,0x01,0x7f,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x1e,0x3f,0xff,0x3f,0xc7,0x80,0x00,0x00,0x1e,0x0c,0x0f,0x00,0x07,0x80,0x00,0x00,0x1e,0x00,0x0f,0x00,0x0f,0x80,0x00,0x00,0x1e,0x00,0x19,0x80,0x0f,0x00,0x00,0x00,0x0f,0x00,0x19,0x80,0x0f,0x00,0x00,0x00,0x0d,0x00,0x30,0xc0,0x1f,0x00,0x00,0x00,0x05,0x80,0x70,0xc0,0x1e,0x00,0x00,0x00,0x05,0xf0,0xe0,0xe0,0x36,0x00,0x00,0x00,0x01,0xff,0xe0,0x7f,0xf0,0x00,0x00,0x00,0x03,0xff,0xc4,0x7f,0xf0,0x00,0x00,0x00,0x03,0xff,0xcc,0x7f,0xf0,0x00,0x00,0x00,0x03,0xff,0xcc,0x7f,0xf0,0x00,0x00,0x00,0x03,0xff,0x9e,0x7f,0xf0,0x00,0x00,0x00,0x00,0xff,0xfe,0x7f,0xc0,0x00,0x00,0x00,0x00,0x01,0xff,0xf8,0x1c,0x00,0x00,0x00,0x03,0xe0,0x3f,0x01,0xbf,0x00,0x00,0x00,0x07,0xa6,0x40,0x09,0x9f,0x80,0x00,0x00,0x1f,0x27,0x5a,0x39,0x9f,0xf8,0x00,0x01,0xff,0x27,0xdb,0x39,0x0f,0xfc,0x00,0x03,0xfe,0x31,0x7f,0x39,0x07,0xfc,0x00,0x03,0xfc,0x10,0x1a,0x02,0x03,0xf8,0x00,0x03,0xf8,0x10,0x00,0x02,0x01,0xf0,0x00,0x01,0xf8,0x10,0x00,0x02,0x01,0xe0,0x00,0x00,0x78,0x10,0x00,0x02,0x00,0xe0,0x00,0x00,0x70,0x30,0x00,0x02,0x00,0x00,0x00,0x00,0x30,0x20,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x1b,0x00,0x00,0x00,0x00,0x00,0x73,0x55,0x63,0x00,0x00,0x00,0x00,0x00,0xf9,0x55,0x4f,0x00,0x00,0x00,0x00,0x00,0x7f,0x14,0x1f,0x00,0x00,0x00,0x00,0x00,0x1f,0xe0,0xfe,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }; display.drawBitmap(0, 0, imSku, 60, 64, 1); // draw skull cloud}

如果您希望使用我使用过的图像,请继续并复制代码。如果要使用先前生成的自己的映像,请根据需要将字节码复制到imSku和imExp数组中。

以下是显示屏上这些图像的外观:

该代码最重要的部分是这一行:

static c***t unsigned char PROGMEM imSku[]

这告诉Arduino将图像存储在EEPROM(什么是EEPROM?)中,而不是其RAM(RAM快速指南)。原因很简单,;Arduino具有有限的RAM,将其全部用于存储图像可能不会留下任何剩余的内存供代码执行

修改主if语句,以便在滚动1或20时显示这些新图形。请注意代码行以显示图像旁边滚动的数字:

if(roll == 20) { drawExplosion(); display.setCursor(80, 21); display.println("20"); }else if(roll == 1) { display.setCursor(24, 21); display.println("1"); drawSkull(); }else if (roll < 10) { // single character number display.setCursor(57, 21); display.println(roll); // write the roll drawDie(); // draw the outline}else { // dual character number display.setCursor(47, 21); display.println(roll); // write the roll drawDie(); // draw the outline}

以下是这些新卷的外观:

代码方面就这些了(如果跳过了这些,就从GitHub获取代码)。您可以轻松地将其修改为D12、D8等。

总装

既然其他一切都完成了,是时候把一切都打包了。用螺栓固定显示屏,确保不要过度拧紧螺栓。这可能是最困难的部分。这样做时,我弄坏了一个显示器,所以您可能希望使用一些塑料垫圈。我从塑料卡片上剪下了一些方块:

小螺母和螺栓可能很难连接。提示:在螺丝刀末端使用一小片Blu-Tack最初固定螺母:

拧上按钮,连接电池并盖上盖子。小心不要夹住任何电线,或将它们捆得太紧,可能导致短路。根据尾随导线的长度,您可能需要使用一些绝缘材料保护外露连接(串行接线盒工作良好):

下面是它的内部外观:

这是成品:

你现在应该是一个自豪的拥有电子D20!

你做了什么修改?你改变图像了吗?在评论中让我们知道,我们很想看看你做了什么!

Subscribe to our newsletter

Join our newsletter for tech tips, reviews, free ebooks, and exclusive deals!

Click here to subscribe

  • 发表于 2021-08-05 10:58
  • 阅读 ( 171 )
  • 分类:IT

你可能感兴趣的文章

有史以来最怪异最糟糕的7个diy技术项目

... 这台机器使用一个装在独立木箱内的肉质气囊。随着时间的推移,空气泵充满了空气,视觉上可以显示用户叹息的次数。它与一个胸部安装的呼吸带搭配,它检测叹息,并发送适当...

  • 发布于 2021-03-11 18:51
  • 阅读 ( 269 )

10个diy星球大战飞船和项目来释放你内心的绝地

...这一设计,这些设计都可以在指导手册上找到。Tom McGuire使用了更多的商店购买的零件,价格在200美元左右。 ...

  • 发布于 2021-03-12 04:47
  • 阅读 ( 247 )

arduino nano利弊:最便宜的arduino值得吗?

... 缺乏本地连接限制了物联网的可能使用。 有限的板载内存会使复杂的程序变得困难。 ...

  • 发布于 2021-03-13 04:51
  • 阅读 ( 314 )

32款手机和平板电脑天才diy黑客

...用户Mikeasaurus的指令结合了廉价宜家灯的手臂。这种设计使用了廉价的iPad螺纹支架,并充分利用了已有的固定装置,打造了一款功能强大的免提平板电脑浏览器。 ...

  • 发布于 2021-03-14 03:20
  • 阅读 ( 345 )

6个diy笔记本套件和项目,打造你自己的笔记本电脑

...你的树莓圆周率,连接到圆周率顶部的连接模块,并开始使用电脑。 ...

  • 发布于 2021-03-19 19:07
  • 阅读 ( 402 )

17个基本的在线桌面rpg软件和工具

...我们将介绍最好的在线桌面RPG软件以及您可以在任何地方使用的应用程序和工具。这些资源从简单到高级都有,所以每种类型的玩家都有自己的特色。如果您愿意,可以跳到特定的部分: ...

  • 发布于 2021-03-24 04:53
  • 阅读 ( 246 )

为2018年世界杯打造10个足球主题diy项目

... 这个巨大的记分牌是由YouTube频道**的我喜欢**东西。使用木框架,一些LED,3D打印扩散和Arduino,这个项目可以在一个周末完成。 ...

  • 发布于 2021-03-24 15:20
  • 阅读 ( 267 )

ds是任天堂最好和最奇怪的

...欢的概念之一是任天堂与卢浮宫的合作,在那里客人可以使用3DS作为他们游览的一部分。你绝对应该看这个视频马里奥创作者宫本茂和已故任天堂总裁岩田聪在美术馆闲逛。 当然,视频游戏平台来来往往,所以双屏掌机系列最...

  • 发布于 2021-04-17 23:57
  • 阅读 ( 180 )

pokémon go与法国时尚品牌合作,打造可爱的游戏背包

...将于美国东部时间10月2日上午11点开始提供。 这款背包以皮卡丘为主题,在黑白朗尚标志中加入了标志性的特征。这项活动将适用于一些神奇宝贝,他们将穿着特殊的领结和帽子。促销活动持续到10月8日,时间定在巴...

  • 发布于 2021-04-18 00:51
  • 阅读 ( 126 )

niantic与sleep no more creator合作,打造身临其境的ar影院体验

...世界探险家》的流行棋盘游戏《卡坦》的移动AR改编版。这款游戏是建立在Niantic的真实世界平台之上,与board game公司和法国游戏发行商A**odee合作开发的。Niantic现在说这款游戏将“很快”进入测试阶段 尼亚提克也这么说’s大楼...

  • 发布于 2021-04-19 05:25
  • 阅读 ( 163 )
ficaznlydj069
ficaznlydj069

0 篇文章

相关推荐