亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

摇晃 Arduino 骰子

组件和用品

Arduino Nano R3
× 1
3mm 8x8 点阵 MAX7219
× 1
倾斜开关模块和数字接口
× 1
滑动开关
× 1
MT3608 DC 2A 升压电源模块 2v-24v 至 5v/ 9v/12v/28V 升压转换器
× 1

必要的工具和机器

烙铁(通用)
热胶枪(通用)

应用和在线服务

Arduino IDE
Autodesk Fusion 360

关于这个项目

大约一年前我儿子和 建立了一个 带有 Arduino 的电子骰子 和几个 LED。这仍然是初学者的理想项目。今年我们学到了很多东西,现在是更新的时候了。

骰子仍然是一个完美的入门项目。功能对每个人都很清楚,很容易理解不同的领域:微控制器、简单的电子设备和编码。

2.0 版

骰子也很棒,更进一步:连接其他区域。

今天,几乎所有东西都有一个现成的组件。这在为 Arduino 或 Raspberry Pi 寻找入门套件时最容易看到。 LED、按钮和任何类型的传感器等组件都构建在电路板上,因此只需几根电线即可连接和使用到 GPIO。

简单但足够的 3D 打印机可在 ebay 上购买,价格不到 140 欧元。几乎所有的支架、安装或外壳变化都可以用它来创建。

还有更多的机会来开发自己的项目。这方面的一个例子是我们的新骰子 2.0。

倾斜传感器

我们以完全不同的方式实现骰子。在内部,由于空间原因,Arduino Nano 正在工作。仍然有一个开关,但没有按钮。切割是通过摇动整个立方体来完成的。

为此,使用倾斜传感器或振动传感器。它们就像一个按钮一样工作。在玻璃管中,一个球在移动。如果它碰到连接触点,则电路闭合。这种接触,有时很短,用于信号。

如果你摇动传感器,可以很好地听到金属球的运动。

通常,安装位置对于倾斜传感器是决定性的。它应该在某个角度位置触发信号。在我们的例子中,这是通过摇动外壳来实现的。这里的情况不是那么重要,因为当向任何方向摇晃时都会触发信号。为了安全起见,我们在项目中使用了两个传感器,它们彼此错开 90°。所以我们总能得到可靠的震动信号。

中断

为了能够识别抖动,必须在草图中查询倾斜传感器的输入引脚。但是,根据这种情况发生的时间以及草图还必须做什么,总是有可能会忽略一个或多个事件。

更好的解决方案是使用硬件中断。这是由函数 attachInterrupt 定义的。指定一个子程序作为参数,该子程序将在信号上调用。

Arduino 提供两个硬件中断:引脚 D2 和 D3。

显示

当然,骰子图像的显示也可以用 7 个单独的 LED 来完成。但是在这里使用一个成品组件也更有趣。

我们对这个项目的选择主要是使用 MAX7219 驱动器 IC 的 8x8 LED 矩阵。占用空间小,成本低,易于编码。

根据购买地点的不同,您必须将单个零件焊接在一起并组装起来。这通常没有问题。唯一可能犯的错误是将LED矩阵扭到插孔中。

这如上图所示。在这里,小心地将矩阵从插座中拉出并旋转 180° 就足够了。

一些物理

因此,LED 矩阵不应仅显示骰子图像。它应该提供一些展示效果。六个骰子的眼睛在矩阵上移动:它们从边缘反弹并慢慢失去速度。

通过两个倾斜传感器,我们可以看到做了多少震动。我们将这些信息作为骰子移动的“速度”。

我们在显示骰子结果时也使用了类似的效果。眼睛从随机位置滚动到立方体图像中的正确位置。

电源

首先,由于空间原因,我们安装了两个 3V CR2032 纽扣电池。刚开始的时候也挺好看的。 Arduino 和 LED 矩阵一起运行,一切正常。然而,在运行几分钟后,纽扣电池的电量就失效了。

如果您在每次掷骰子后关闭 Arduino,您就可以这样使用它。这并不完美,所以我们安装了更好的两节 AAA 电池。但是,这些只能一起提供 3V。所以我们还需要一个升压转换器,把电压升到5V。连接仍然发生在 Arduino 的 VIN 引脚上。

房屋设计

合适的外壳的最佳选择是通过 3D 打印自行设计和生产。有许多用于施工的应用程序。我们在这个项目中使用了 Autodesk Fusion 360。它具有强大的功能,并且 3D 打印与 Print Studio 软件很好地集成在一起。如果您对 Autodesk Fusion 360 感兴趣,您可以在博客文章参数化外壳(仅限德语​​)中找到一些建议。

我们的外壳由 3 部分组成:

  • 大写
  • 带有用于 AAA 电池的电池座的下壳
  • 有机玻璃罩(不一定必须)

LED矩阵在它前面有一个乳白色的有机玻璃罩看起来更好。这使得无法识别关闭的 LED 并且图像更清晰。

素描

要控制 LED 矩阵,需要 LedControl 库。如果还没有安装,可以从arduino.cc https://playground.arduino.cc/Main/LedControl 下载。

然后我们进行其他变量定义。首先,我们确定骰子的眼睛如何显示在矩阵上。骰子眼由 4 个 LED 点组成。在数组中,左上角指定为X/Y坐标(-1表示在显示外)。

int DicePic[8][6][2] ={ ... { //1:{4,4}, //1.朋克 {-1,-1}, //2.朋克 {-1,-1}, //3.朋克 {-1,-1}, //4.朋克 {-1,-1}, //5.朋克 {-1,-1} //6.朋克 }, { //2:{2,2}, //1.朋克 {6,6}, //2.朋克 {-1,-1}, //3.朋克 {-1,-1}, //4.朋克 {-1,-1}, //5.朋克 {-1,-1} //6.朋克 }, ... 

当然,这里一切皆有可能。让想象力自由驰骋。它并不总是必须是典型的眼睛图像。

您可以直接在代码中找到其他备注。

组装

我们将 Arduino 放在插座条上,作为一种屏蔽。 LED 矩阵的五个触点的连接方式相同。如果 Arduino 居中,则最好利用空间。因此,对于矩阵,最好将引脚 5、6、7 用于 CS、CLK 和 DIN。在这里,只有焊接点必须连接。通过一个小跳线连接到 5V 和 GND。

我们还用短线连接了两个倾斜传感器。它们连接到引脚 2 和 3 以及 5V 和 GND。

现在一切都可以组装了。有机玻璃首先用热胶固定。我们对 LED 矩阵做同样的事情。一小点热胶就够了。

接下来,安装开/关开关,用热胶固定并连接到适当的电线。

安装电源

电源有点小。根据您拥有的选项和组件,可以相应调整正负触点。

我们使用旧电池盒中的弹簧和销钉。为了连接到外壳的底部,我们再次使用电线和一点热胶。

升压转换器最好调整到大约。安装前5V。为此,必须稍微扭转阻力。

然后将大写和小写放在一起。由于 0.1 毫米的配合,无需进一步固定就可以插在一起。而且它们仍然可以再次打开以更换电池。

然后就完了!

骰子乐趣 2.0 可以开始了!

你需要什么

  • Arduino Nano(或 ESP8266)
  • 2 个倾斜传感器(带有集成电阻器)
  • 带有 MAX7219 IC、SPC 的 8x8 LED 矩阵
  • 插座板
  • 开/关开关
  • 印刷电路板
  • 2 节 AAA 电池

更多信息

如果您想阅读更多内容,请查看我们的网站 techpluscode.de/arduino-wuerfel-2-0。

抱歉,此扩展博客仅提供德语版本;-)

代码

  • wuerfel8x8.ino
wuerfel8x8.inoArduino
摇骰子代码
/*Blog-Artikel:Schttel-Wrfel mit LED Matrix 和 Bewegungssimulation https://techpluscode.de/schuettel-wuerfel-mit-led-matrix-und-bewegungssimulation/techpluscode.deCopyright 2019 von Thomas Angielsky *///Bibliothek fr die Ansteuerung der 8x8 LED-Matrix einbinden//包括8x8 LED矩阵的lib#include "LedControl.h"int PinTiltX =2; //Pin fr Tiltsensor Xint PinTiltY =3; //Pin fr Tiltsensor Y//Pins der LED-Matrix//LED矩阵的引脚int PinCLK =7; int PinCS =6;int PinDIN =5;LedControl lc =LedControl(PinDIN, PinCLK, PinCS, 1);//Koordinaten der Wrfelaugen in der LED-Matrix//LED矩阵中Dice点的坐标int DicePic[8][ 6][2] ={ { //leere 矩阵和起始位置:{9,9}, //1.朋克 {9,8},//2。朋克 {9,7},//3。朋克 {9,6},//4。朋克 {9,5},//5。朋克 {9,4} //6.朋克 }, { //1:{4,4}, //1.朋克 {-1,-1}, //2.朋克 {-1,-1}, //3.朋克 {-1,-1}, //4.朋克 {-1,-1}, //5.朋克 {-1,-1} //6.朋克 }, { //2:{2,2}, //1.朋克 {6,6}, //2.朋克 {-1,-1}, //3.朋克 {-1,-1}, //4.朋克 {-1,-1}, //5.朋克 {-1,-1} //6.朋克 }, { //3:{2,6}, //1.朋克 {6,2}, //2.朋克 {4,4}, //3。朋克 {-1,-1}, //4.朋克 {-1,-1}, //5.朋克 {-1,-1} //6.朋克 }, { //4:{2,2}, //1.朋克 {2,6}, //2.朋克 {6,2}, //3。朋克 {6,6},//4。朋克 {-1,-1}, //5.朋克 {-1,-1} //6.朋克 }, { //5:{2,2}, //1.朋克 {2,6}, //2.朋克 {6,2}, //3。朋克 {6,6},//4。朋克 {4,4},//5。朋克 {-1,-1} //6.朋克 }, { //6:{2,1}, //1.朋克 {2,4}, //2.朋克 {2,7}, //3。朋克 {6,1},//4。朋克 {6,4},//5。朋克 {6,7} //6. Punkt }, { //开始:{-1,-1}, //1.朋克 {-1,-1}, //2.朋克 {-1,-1}, //3.朋克 {-1,-1}, //4.朋克 {-1,-1}, //5.朋克 {-1,-1} //6. Punkt } };//Variablen der Wrfelaugen:Position, Richtung, Geschwindigkeit fr X und Y//骰子的变量:X 和 Y 的位置、方向、速度 DiceXpos[6];float DiceXdir[6];volatile byte DiceXspeed[ 6];float DiceYpos[6];float DiceYdir[6];volatile byte DiceYspeed[6];int DiceValue;unsigned long timestamp;byte Mode;int volatile Shakes;int ShakesPerSecond;int step;void InterruptChecks() { //Schttel -Anzahl zhlen //Count Shakesshakes=shakes+1; //Serial.println(millis()); timestamp=millis();}void SetSpeedX() { if (Mode==0) { //alle Wrfel in X beschleunigen //加速骰子在 X for (int i =0; i <6; i++) { if (DiceXspeed[i]<255) {DiceXspeed[i]=DiceXspeed[i]+5;} } } InterruptChecks();}void SetSpeedY() { if (Mode==0) { //alle Wrfel in Y beschleunigen / /加速骰子在 Y for (int i =0; i <6; i++) { if (DiceYspeed[i]<255) {DiceYspeed[i]=DiceYspeed[i]+5;} } } InterruptChecks(); }void ShowLed(int x, int y, bool onoff) {//LED nur anzeigen, wenn im sichtbaren Bereich//仅显示,当矩阵中的 x/y 时 if ((x<8) and (y<8) and ( x>=0) and (y>=0)) { lc.setLed(0, x, y, onoff); }}void ShowDot(int x, int y, bool onoff) {//Wrfel-Auge anzeigen oder ausblenden//显示或隐藏骰子点 ShowLed(x-1, y-1, onoff); ShowLed(x, y-1, onoff); ShowLed(x-1, y, onoff); ShowLed(x, y, onoff);}void ShowDicePic(int value) {//Wurf anzeigen//Show diceboolean done; //alle Punkte von der aktuellen Position aus zur Zielposition von DiceValue bewegen //将所有点从当前位置移动到 DiceValue 的目的地 for (int i =0; i <6; i++) { DiceXspeed[i]=100; DiceYspeed[i]=100; //Werte fr X berechnen //计算x值 DiceXdir[i]=0; if (int(DiceXpos[i])>DicePic[value][i][0]) {DiceXdir[i]=-1;} else if (int(DiceXpos[i])DicePic[value][i][1]) {DiceYdir[i]=-1;} else if (int(DiceYpos[i])7) { pos=7;目录=目录*(-1); } if (pos<1) { pos=1;目录=目录*(-1); } } // Geschwindigkeit wird pro Schritt langsamer // 速度每一步递减 if (sp>
0) {sp=sp-1;}}void MoveDots() { //alle Wrfel einen Schritt weiter bewegen //移动骰子点一步进一步 for (int i =0; i <6; i++) { //neue Koordinaten berechnen //计算新坐标 DoStep(DiceXpos[i],DiceXdir[i],DiceXspeed[i],true); DoStep(DiceYpos[i],DiceYdir[i],DiceYspeed[i],true); } //Wrfel-Augen anzeigen //显示骰子点数 lc.clearDisplay(0); for (int i =0; i <6; i++) { ShowDot(int(DiceXpos[i]), int(DiceYpos[i]), true); } }void setup() { //Der MAX7219 ist beim Starten im Power-Saving Modus, //er muss aufgeweckt werden. //启动时MAX7219处于省电模式,//我们必须做一个唤醒调用 lc.shutdown(0, false); // Helligkeit auf einen Mittelwert //将亮度设置为中等值 lc.setIntensity(0, 8); //und Display lschen //并清除显示 lc.clearDisplay(0);随机种子(模拟读取(0));骰子值=0; for (int i =0; i <6; i++) { DiceXpos[i]=DicePic[7][i][0]; DiceYpos[i]=DicePic[7][i][1]; DiceXdir[i]=random(3)-1; DiceYdir[i]=random(3)-1; DiceXspeed[i]=随机(126)+120; DiceYspeed[i]=random(126)+120; } //引脚einstellen //设置引脚pinMode(PinTiltX, INPUT_PULLUP); pinMode(PinTiltY, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(PinTiltX),SetSpeedX,CHANGE); attachInterrupt(digitalPinToInterrupt(PinTiltY),SetSpeedY,CHANGE); lc.clearDisplay(0);时间戳=毫秒();模式=1; ShowDicePic(6);延迟(1000); lc.clearDisplay(0);模式=0; Serial.begin(9600);步长=0;震动 =0;}void loop() { delay(50);步=步+1; if (step>
20) { //1 sek ist vorbei //1 sec is over step=0; ShakesPerSecond=震动;震动=0; } if (Mode==0) { MoveDots(); if (millis()-timestamp>
2000) { //seit 2 sek kein Schtteln mehr //自 2 sec Mode=1 以来没有抖动;骰子值=随机(6)+1; ShowDicePic(DiceValue); } } if (ShakesPerSecond>5) { //Es wird wieder geschttelt //再次摇晃 Mode=0; }}

定制零件和外壳

示意图

这是我的电路草图。

制造工艺

  1. 骰子
  2. 用于 FS2020 的带有 Arduino 的开关/LED 面板
  3. Arduino 数字骰子
  4. Arduino Spybot
  5. FlickMote
  6. 自制电视 B-Gone
  7. 主时钟
  8. 自制 16x8 矩阵上的 Arduino Nano 俄罗斯方块游戏
  9. 找到我
  10. Arduino Power
  11. 无线灯开关操纵器
  12. Tech-TicTacToe