做一個電競懸浮時鐘

蝦仁豬心
·
·
IPFS
·
使用 Arduino 的 3D 列印懸浮時鐘

準備材料:

  1. 3D列印材料1份

  2. arduino nano 1個

  3. 28BYJ-48步進電機、驅動板1組

  4. RGB LED模組1個

  5. 8mm x 3mm 圓形釹磁鐵3個

  6. 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模組,右下:步進電機驅動板

如上圖,用杜邦線將arduino nano 連接到步進電機的驅動板及RGB LED模組。

第三步:組裝驅動盒

  1. 首先裝上min-drive-gear,並插入轉軸(min-drive-gear-axis)

  2. 把arduino nano 和驅動板放入盒子內。

  3. 放入worm-gear_fixed和步進電機,注意電線不要被步進電機壓到了。

  4. LED 模組放在最頂端。

注意事項:

  • 清理零件上的毛刺和粉塵。

  • 組裝前確認所有軸轉動順暢。

  • 如果錐齒輪的嚙合太鬆,請使用「washer1.stl」和「washer2.stl」來調整間隙。

第四步:組裝時鐘指針

凹槽用來放入磁鐵,磁鐵的N, S極如圖所示
  1. 清理零件的毛邊

  2. 將零件組合起來

  3. 固定時針需要使用長螺絲

  4. 放入磁鐵確認時針能靠磁力對齊

  5. 組裝前確認所有軸轉動順暢

第五步:完成

  1. 將時鐘表盤插入底部驅動盒,並檢查是否運轉順暢

  2. 把時鐘代碼刷入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/

CC BY-NC-ND 4.0 授权

喜欢我的作品吗?别忘了给予支持与赞赏,让我知道在创作的路上有你陪伴,一起延续这份热忱!

蝦仁豬心很高興認識你