网站首页 趣味美术 生活小制作 儿童制作 亲子互动 陶艺制作 传统手工 民间手艺 岁月绽放 创意与设计

123D电路的加速计骰子手工电子DIY教程

栏目: 电子DIY / 发布于: / 人气:9.18K

123D电路的加速计骰子

以下是该装置如何运作的:拿起骰子,摇动它,并观察当其不再变动,停止在某个1-6之间的数字。它就是那样简单……就好像是一个真实的骰子,只是它很大,有一个电路和3D打印的外壳。因此,我承认,它比一个微小的塑料骰子要高级一些。
但是不要完全采取我所说的,你自己也可以制作一个,文件都是在线的,请继续阅读下去。

主要材料

  橡皮  开口圈
  工艺铁丝

所需工具:

  热胶枪  锥子
  钳子  定位针
  马克笔

制作步骤:

第1步:

123D电路的加速计骰子 第2张

第一步:线上模拟
你应该从“123D电路装置”中看到一个虚拟试验板的嵌入式查看器。它就类似于上图。
如果你需要帮助,可以参考阅读:
你在查看器中可以滚动鼠标,实现放大和缩小。如果你想开始模拟,或者进行修改,首先需要自己做出这个电路。点击链接来打开123D 电路编辑器中的加速骰子电路。一旦为了好玩随意按动“叉”来进行复制时,不要担心会让其变乱,当你添加你自己的材料时,我们的原始装置依然会保持不变。

第2步:

123D电路的加速计骰子 第3张

第二步:获取更多能量
上一步骤中的模拟板视图是一个很好的模拟模具,你可以从中学到很多东西,但建造这条电路使用了较大的7字段显示器,我们需要稍微不同的设计,以适应其需要的更多的能量,下一步将会探索更深入的设计
较大的7字段显示器比开源硬件会分配更多的电流,可以提供每针到达12.4伏特以上,因此整个电路需要一个更大的电源,并使用离散晶体管停止和启动电流。开源硬件的运作更像大脑,而非肌肉。我们使用两个9伏电池串联,18伏特可以提供充足的空间,以确保在使用时随着电池的消耗依然能完好运行。

第3步:

123D电路的加速计骰子 第4张

第三步:零件清单
以下是里面所涵盖的你所需要的零件。这一步有三幅图供你参考。
材料清单:
1 个套件 (可以是任何一个采取标准防护的开源硬件)
1个123D 电路设计的电路板()
1个三轴加速器- MMA7361 from Sparkfun
一个巨型6.5’’高的7字段显示器
一个开关
一个直流电源连接器,尺寸为中号;一系列电池(至少14伏特,我们现在用的是18伏特);电池座;电线

第4步:

123D电路的加速计骰子 第5张

第5步:

123D电路的加速计骰子 第6张

一个巨型6.5’’高的7字段显示器

第6步:

123D电路的加速计骰子 第7张

第四步:建构代码
这个项目有两种稍微不同的代码库,因为试验电路板的电路相对更强大的版本而言需要轻微不同的代码。因为较大的版本使用真正的加速度计,而试验电路板使用一个虚拟的加速度计。顺便说一句,想要摇动虚拟加速度计,只需要点击它就可以了。
1、试验电路板的Arduino代码存在于123 Dcircuits中,只要在Arduino上单击,然后点击“Arduino代码编辑器”即可。
2、较大版本的Arduino代码在本页-通过滚动下拉进行查看。
#include <AcceleroMMA7361.h> //should be in Documents/Arduino/Libraries (on a Mac)
//download it here

//mapping of the Arduino board to the large 7-segment from Sparkfun, letter is segment, number is Aruino Digital Output
//
// a
// f b
// g
// e c
// d

int a = 0;
int b = 6;
int c = 5;
int d = 4;
int e = 3;
int f = 1;
int g = 2;

//mapping of the accelerometer board from sparkfun, these are Arduino outputs
//

int st = 8; //self test (output from Arduino)
int gsel = 9; //g-force range, +-1.5g and +-6g (output from Arduino)
int zg = 10; //zero g (input to Arduino)
int slp = 11; //sleep (output from Arduino)

AcceleroMMA7361 accelero; //create the accelero object

// the setup routine runs once when you press reset button on Arduino or power up:
void setup() {

// initialize the digital pin as an output.
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
pinMode(f, OUTPUT);
pinMode(g, OUTPUT);

writeDigit(-1); // turn off all segments

// n(9600); //uncomment this line for debugging, it will otherwise mess with the numbers!
n(slp, st, zg, gsel, A0, A1, A2); //config the accelero to use the pins from above and to read analog values from A0, A1, A2
RefVoltage(5); //telling accelero that the AREF voltage is 5V (to get higher resolution you'd set this to 3.3 and blue-wire it on the board)
ensitivity(LOW); //sets the sensitivity to +-1.5G
brate(); //you need to do this for brake light, probably not for dice.

}

void writeDigit(int digit) { //calling this function sets the segments to look like an intiger 0-9, we never show 0, or 9. -1 is all off.
t("digit: ");
t(digit);
t("n");

switch(digit) {
case 0:
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, LOW);
break;
case 1:
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
break;
case 2:
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
break;
case 3:
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
break;
case 4:
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case 5:
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case 6:
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case 7:
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
break;
case 8:
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case 9:
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case -1:
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
break;
}
}

int get_g() { //gets the length of the g force vectors
int x = Accel();
int y = Accel();
int z = Accel();

int gf = abs(sqrt(x*x+y*y+z*z)-100); // the "-100" is roughly subtracting out gravity

if (gf > 50) {
t("g: ");
t(gf);
t("n");
}

return gf;
}

int digit = 0;
int count = 0; // counter
int count2 = 0; // another counter

int state = 0;
// 0 = idle
// 1 = shaking
// 2 = show_result

int sum = 0;
int cur = 0;
int res;

// the loop routine runs over and over again forever:
void loop() {
cur = get_g();
sum += cur;
if (sum < 0) sum = 0;

switch(state) {
case 0: // idle state, if cur is >70 then go to state 1
if (cur > 70) {
state = 1;
count = 0;
count2 = 0;
}
break;
case 1: // actively shaking,
if (count2 == 10) { // 10 is 100ms
writeDigit(sum % 6 + 1); // show a random number every 100ms. Sum is a random number depending on how long the code is running and how you shake the die.
count2=0;
} else {
count2++;
}
if (cur > 55) { // from here until the break it is checking how long it has been since shaking stopped, if over 250ms without seeing g>55 go to state 2
state = 1;
count = 0;
} else {
if (count > 25) {
state = 2;
count = 0;
} else {
count ++;
}
}
break;
case 2: // showing the result, the delay times are in ~ centi-seconds
if (count == 0) writeDigit(sum % 6 + 1);
if (count == 10) writeDigit(sum % 6 + 1);
if (count == 25) writeDigit(sum % 6 + 1);
if (count == 45) writeDigit(sum % 6 + 1);
if (count == 70) writeDigit(sum % 6 + 1);
if (count == 100) writeDigit(sum % 6 + 1);
if (count == 135) { // from here to close of {} it is showing the final result, slowing down as it goes
res = sum % 6 + 1;
writeDigit(res);
}


if (count == 185) writeDigit(-1);
if (count == 235) writeDigit(res);
if (count == 285) writeDigit(-1);
if (count == 335) {
writeDigit(res);
state = 0;
count = 0;
}
count++;
break;
}
delay(10);

//uncomment out this small loop to test that all segments are working. (comment out the other "void loop" lines)
//void loop() {
// writeDigit(8);
// delay(10);
}
 这是一个加速度计资源库的链接。

第7步:

123D电路的加速计骰子 第8张

第五步:Arduino扩展板
以下是Arduino扩展板所需的零件清单。
数量 描述
1 MMA7361倾角传感器加速度模块
24 0805-1k 欧姆的电阻
8 NPN SOT23晶体管
1 1x9 0.1" 头座

第8步:

123D电路的加速计骰子 第9张

第六步:原理图/电路布置
原理图和电路布置可以在123D Circuits 编辑器中很好地看到,但我也在参考中总结了一下。
如果需要更多指导,可以看如何使用123D Circuits.

第9步:

123D电路的加速计骰子 第10张

第七步:将7字段显示屏与Arduino 扩展板用电线连接起来
该图简洁地显示了如何连接电线,请注意电线自上而下都排成一排,除了连接7字段显示器的那根电线直接连接到电池上,这根电线一端连接7字段显示屏的中央,一端连接123D Circuits设计板上的加速度计。
请注意:这幅图是从123D Circuits的方向旋转了180度来展示整个装置。

第10步:

123D电路的加速计骰子 第11张

第八步:3D打印的外壳
这个本可以以很多方式去完成……直到我们发现了一种3D打印的方式来设计123D Circuits的外壳,我们使用了这个新发明,我也将在未来重新讨论这种方式。

第11步:

123D电路的加速计骰子 第12张

大型的7字段显示器有较宽松的容差……每一个都不太一样。为了得到一个能紧密贴合盒子的7字段显示器,我们将其放置在一个扫描仪(朝下)中,并追踪扫描的结果-创建字段排列的矢量和周长。我增加了大约2mm 的空间,以防放不下。

第12步:

123D电路的加速计骰子 第13张

然后我们用激光切割矢量文件,来判断它是否符合7字段组件。结果显示是符合的。我们将矢量文件导入到3D打印机,并在周围建了个盒子。您还可以使用Tinkercad,它将允许您导入矢量,通过挤压它们来构建盒子周围的一切细节(这里有一个视频进行详细的解释)。每个人都有他们最喜欢的工具,使用最适合你的,我建议使用Tinkercad。当三维模型准备好后,我们在一个Objet Connex 500 中使用 multimaterials进行打印。12小时后开始准备清洗和喷砂。

第13步:

123D电路的加速计骰子 第14张

当我放进机器中的电子盒已经准备好了,我知道经过经过激光切割试验后,它们都可以完好地贴合7字段显示屏组件。然后使用几团环氧树脂,就可以将电子设备牢固地粘贴到相应位置了。