當前位置:製作窩 >

創意生活 >電子DIY >

123D電路的加速計骰子手工電子DIY教程

123D電路的加速計骰子手工電子DIY教程

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欄位顯示屏元件。然後使用幾團環氧樹脂,就可以將電子裝置牢固地貼上到相應位置了。

  • 文章版權屬於文章作者所有,轉載請註明 https://zhizuowo.com/shenghuo/dianzidiy/gj0g7.html