做一個電競懸浮時鐘
準備材料:
3D列印材料1份
arduino nano 1個
28BYJ-48步進電機、驅動板1組
RGB LED模組1個
8mm x 3mm 圓形釹磁鐵3個
M2 x 5L螺絲7根、M2 x 10L 螺絲1根
第一步:列印零件
https://www.instructables.com/Hollow-Clock-4/
下載3D列印檔案
case-rear-hole.stl不需要列印,除非使用的不是arduino nano,而是其他開發板。
washer1.stl和washer2.stl是用來調整齒輪間隙用的(非必要)
第二步:連接電路
如上圖,用杜邦線將arduino nano 連接到步進電機的驅動板及RGB LED模組。
第三步:組裝驅動盒
首先裝上min-drive-gear,並插入轉軸(min-drive-gear-axis)
把arduino nano 和驅動板放入盒子內。
放入worm-gear_fixed和步進電機,注意電線不要被步進電機壓到了。
LED 模組放在最頂端。
注意事項:
清理零件上的毛刺和粉塵。
組裝前確認所有軸轉動順暢。
如果錐齒輪的嚙合太鬆,請使用「washer1.stl」和「washer2.stl」來調整間隙。
第四步:組裝時鐘指針
清理零件的毛邊
將零件組合起來
固定時針需要使用長螺絲
放入磁鐵確認時針能靠磁力對齊
組裝前確認所有軸轉動順暢
第五步:完成
將時鐘表盤插入底部驅動盒,並檢查是否運轉順暢
把時鐘代碼刷入arduino
const int Red = 9;
const int Green = 10;
const int Blue = 11;
// Please tune the following value if the clock gains or loses.
// Theoretically, standard of this value is 60000.
#define MILLIS_PER_MIN 59950 // milliseconds per a minute
// Motor and clock parameters
// 2048 * 90 / 12 = 15360
#define STEPS_PER_ROTATION 15360 // steps for a full turn of minute rotor
// wait for a single step of stepper
int delaytime = 4;
// ports used to control the stepper motor
// if your motor rotate to the opposite direction,
// change the order as {2, 3, 4, 5};
int port[4] = {2, 3, 4, 5};
// sequence of stepper motor control
int seq[4][4] = {
{ LOW, LOW, HIGH, LOW},
{ LOW, LOW, LOW, HIGH},
{ HIGH, LOW, LOW, LOW},
{ LOW, HIGH, LOW, LOW}
};
#define FADESPEED 10 // 速度
void setup() {
pinMode(Red, OUTPUT);
pinMode(Green, OUTPUT);
pinMode(Blue, OUTPUT);
pinMode(port[0], OUTPUT);
pinMode(port[1], OUTPUT);
pinMode(port[2], OUTPUT);
pinMode(port[3], OUTPUT);
rotate(-10); // for approach run
rotate(10); // approach run without heavy load
rotate(STEPS_PER_ROTATION / 60);
}
void rotate(int step) {
static int phase = 0;
int i, j;
int delta = (step > 0) ? 1 : 3;
int dt = 20;
step = (step > 0) ? step : -step;
for(j = 0; j < step; j++) {
phase = (phase + delta) % 4;
for(i = 0; i < 4; i++) {
digitalWrite(port[i], seq[phase][i]);
}
delay(dt);
if(dt > delaytime) dt--;
}
// power cut
for(i = 0; i < 4; i++) {
digitalWrite(port[i], LOW);
}
}
void loop() {
int r, g, b;
// 由藍到紫
for (r = 0; r < 256; r++) {
analogWrite(Red, r);
delay(FADESPEED);
}
// 由紫到紅
for (b = 255; b > 0; b--) {
analogWrite(Blue, b);
delay(FADESPEED);
}
// 由紅到黃
for (g = 0; g < 256; g++) {
analogWrite(Green, g);
delay(FADESPEED);
}
// 由黃到綠
for (r = 255; r > 0; r--) {
analogWrite(Red, r);
delay(FADESPEED);
}
// 由綠到藍綠色
for (b = 0; b < 256; b++) {
analogWrite(Blue, b);
delay(FADESPEED);
}
// 由藍綠色到藍色
for (g = 255; g > 0; g--) {
analogWrite(Green, g);
delay(FADESPEED);
}
static long prev_min = 0, prev_pos = 0;
long min;
static long pos;
min = millis() / MILLIS_PER_MIN;
if(prev_min == min) {
return;
}
prev_min = min;
pos = (STEPS_PER_ROTATION * min) / 60;
rotate(-10); // for approach run
rotate(10); // approach run without heavy load
if(pos - prev_pos > 0) {
rotate(pos - prev_pos);
}
prev_pos = pos;
}
第六步:寫在最後
疑難雜症:
如果兩個錐齒輪的嚙合太鬆,可使用washer1.stl和 washer2.stl來調整間隙。
如果蝸輪方軸與錐齒輪方孔太鬆,請使用bevel-gear-small-hole.stl。(零間隙版本)
有些馬達運轉方向相反。如果馬達運轉方向錯誤或扭矩弱產生噪音,請將程式碼中的數字順序變更為
int port[4] = {5, 4, 3, 2};
如果時鐘忽快忽慢,請檢查電源供應器的品質。
如果時鐘運作得太快或太慢,請調整名為MILLIS_PER_MIN的值。
如果想讓RGB切換的速度加快或減慢,請調整名為FADESPEED 的值。
參考資料:
https://www.instructables.com/Hollow-Clock-4/
https://blog.jmaker.com.tw/rgb-led/