Arduino Nanoで作るUSB給電LEDファンクロック:回路図・コード・時刻設定機能付き
USB LEDライトファンアナログ時計(Arduino NANO使用)─ プロジェクトコード・回路図・時刻設定機能付き
ミニUSB LEDライトファン時計の動画を見たことがあるなら、今回はArduino NANO、ホールセンサ、抵抗、電池、DCモータ、LEDを使って、同じLEDライトアナログ時計を自作してみましょう。
LEDが円運動し、プロペラ表示で時・分・秒の3針と、一般的な腕時計や壁掛け時計のような円形の文字盤を表示します。
このプロジェクトの最大の特徴は、Arduino NANOにUSBケーブルでソースコードを書き込むだけで、分と秒の時刻設定を変更できることです。早速作り方を見ていきましょう。
LEDライトファン時計のガジェット動画をチェック
必要な部品:
- Arduino NANO
- ホールセンサ W130
- R1〜R16 = 330Ω
- R17 = 2.2kΩ
- R18 = 10kΩ
- LED 1〜11 = 赤色
- LED 12〜16 = 緑色
- LED 17 = 青色
- 電池 = 3.7V, 240mAh(高速モータ使用時は9V〜12V)
- スイッチ = 単極スライドトグル(ON/OFF)
- その他:PCB基板、おもちゃ用DCモータ、配線、はんだごて等
配線・回路図
以下はUSBプロペラLEDファンアナログ時計の回路図です。時刻設定機能付きバージョンの回路図は記事下部にあります。

組み立て手順:
- 回路に合わせて小さなPCB基板をカットする。
- 緑色LED(LED12〜LED16)を長い脚が左側になるよう挿入し、銅箔側で脚を一方に曲げる(R12〜R16、A5〜A1に接続)。
- 同様に赤色LED(LED1〜LED11)を挿入(R1〜R11、D2〜D12に接続)。
- 青色LED(LED17)を緑色LEDの上に配置し挿入(R17=2.2kΩ、A7)。このLEDのカソードを他のLEDのカソードと共通接続し、アノードをR17経由でArduino +5Vピンに接続。
- 全LEDのカソードを共通接続し、余分なリードをカット。
- 抵抗も同様に挿入・曲げ・カット。
- 回路図通りにはんだ付け。
- Arduino NANO用のコネクタをはんだ付け。
- LED共通カソードからArduino GNDピンへ配線。
抵抗からArduinoのデジタルピン「D」とアナログピン「A」へ以下の通り配線:
- R1 → D2、R2 → D3、R3 → D4、R4 → D5、R5 → D6、R6 → D7、R7 → D8、R8 → D9、R9 → D10、R10 → D11、R11 → D12
- R12 → A1、R13 → A2、R14 → A3、R15 → A4、R16 → A5
ホールセンサ接続:
- 出力ピン → Arduino A0ピン
- VCCピン → Arduino +5Vピン
- GNDピン → Arduino GNDピン
仕上げ:
- 3.7V 240mAh電池を回路図通り接続し、プラス側にスライドトグルスイッチを入れてON/OFF制御。
- おもちゃ用DCモータを使ってチップボードに全体を固定。高速モータ使用時は9V〜12V電池を使用。
- プロジェクトコード(後述)をUSBケーブルで書き込み、スイッチON。ファン回転中にLEDが時計表示を行います。
プロジェクトコード
以下のソースコードを必要に応じて修正し、USBケーブルでArduino NANOに書き込んでください。
Code via: hobbyprojects
int LED1 = 2; int LED2 = 3; int LED3 = 4; int LED4 = 5; int LED5 = 6; int LED6 = 7; int LED7 = 8; int LED8 = 9; int LED9 = 10; int LED10 = 11; int LED11 = 12; int LED12 = A1; int LED13 = A2; int LED14 = A3; int LED15 = A4; int LED16 = A5; int sensorPin = A0; int minuteSensor = A7; int hourSensor = A6; unsigned int n,ADCvalue,propeller_posn; unsigned long previousTime = 0; byte hours = 12; // set hours byte minutes = 15; // set minutes byte seconds = 00; // set seconds int val; void setup() { pinMode(LED1,OUTPUT); pinMode(LED2,OUTPUT); pinMode(LED3,OUTPUT); pinMode(LED4,OUTPUT); pinMode(LED5,OUTPUT); pinMode(LED6,OUTPUT); pinMode(LED7,OUTPUT); pinMode(LED8,OUTPUT); pinMode(LED9,OUTPUT); pinMode(LED10,OUTPUT); pinMode(LED11,OUTPUT); pinMode(LED12,OUTPUT); pinMode(LED13,OUTPUT); pinMode(LED14,OUTPUT); pinMode(LED15,OUTPUT); pinMode(LED16,OUTPUT); pinMode(sensorPin,INPUT_PULLUP); if(hours == 12) hours = 0; //**************************************** // Uncomment these lines for IR sensor testing /* Serial.begin(9600); while(1) { ADCvalue = analogRead(minuteSensor); Serial.print("minuteSensor "); Serial.println(ADCvalue); ADCvalue = analogRead(hourSensor); Serial.print("hourSensor "); Serial.println(ADCvalue); Serial.println(); delay(1000); } */ //**************************************** } void loop() { val = digitalRead(sensorPin); while (val == LOW) { val = digitalRead(sensorPin); } if (millis() >= (previousTime)) { previousTime = previousTime + 1000; seconds = seconds+1; if (seconds == 60) { seconds = 0; minutes = minutes+1; } if (minutes == 60) { minutes = 0; hours = hours+1; } if (hours == 12) { hours = 0; } } propeller_posn=30; n=0; while(n < 60) { ADCvalue = analogRead(minuteSensor); if(ADCvalue < 500) { minutes = propeller_posn; seconds = 0; } ADCvalue = analogRead(hourSensor); if(ADCvalue < 500) { hours = propeller_posn/5; seconds = 0; } drawMinuteMarker(); if ((propeller_posn==0) || (propeller_posn==5) || (propeller_posn==10) || (propeller_posn==15) || (propeller_posn==20) || (propeller_posn==25) || (propeller_posn==30) || (propeller_posn==35) || (propeller_posn==40) || (propeller_posn==45) || (propeller_posn==50) || (propeller_posn==55)) drawHourMarker(); if ((propeller_posn==0) || (propeller_posn==15) || (propeller_posn==30) || (propeller_posn==45)) drawQuarterMarker(); if((propeller_posn == hours*5) || (( propeller_posn == 0 ) && (hours == 0))) drawHoursHand(); if(propeller_posn == minutes) drawMinutesHand(); if(propeller_posn == seconds) drawSecondsHand(); delayMicroseconds(100); // LEDピクセル幅(モータ速度に合わせて調整。低速なら増やす、高速なら減らす) displayClear(); drawInner_Circle(); delayMicroseconds(450); // LEDピクセル/分目盛り間のギャップ(モータ速度に合わせて調整) n++; propeller_posn++; if(propeller_posn == 60) propeller_posn=0; } val = digitalRead(sensorPin); while (val == HIGH) { val = digitalRead(sensorPin); } } //========================= void displayClear() { digitalWrite(LED1,LOW); digitalWrite(LED2,LOW); digitalWrite(LED3,LOW); digitalWrite(LED4,LOW); digitalWrite(LED5,LOW); digitalWrite(LED6,LOW); digitalWrite(LED7,LOW); digitalWrite(LED8,LOW); digitalWrite(LED9,LOW); digitalWrite(LED10,LOW); digitalWrite(LED11,LOW); digitalWrite(LED12,LOW); digitalWrite(LED13,LOW); digitalWrite(LED14,LOW); digitalWrite(LED15,LOW); digitalWrite(LED16,LOW); } void drawMinuteMarker() { digitalWrite(LED16,HIGH); } void drawHourMarker() { digitalWrite(LED15,HIGH); digitalWrite(LED14,HIGH); } void drawQuarterMarker() { digitalWrite(LED13,HIGH); digitalWrite(LED12,HIGH); } void drawHoursHand() { digitalWrite(LED1,HIGH); digitalWrite(LED2,HIGH); digitalWrite(LED3,HIGH); digitalWrite(LED4,HIGH); digitalWrite(LED5,HIGH); digitalWrite(LED6,HIGH); digitalWrite(LED7,HIGH); } void drawMinutesHand() { digitalWrite(LED1,HIGH); digitalWrite(LED2,HIGH); digitalWrite(LED3,HIGH); digitalWrite(LED4,HIGH); digitalWrite(LED5,HIGH); digitalWrite(LED6,HIGH); digitalWrite(LED7,HIGH); digitalWrite(LED8,HIGH); digitalWrite(LED9,HIGH); } void drawSecondsHand() { digitalWrite(LED1,HIGH); digitalWrite(LED2,HIGH); digitalWrite(LED3,HIGH); digitalWrite(LED4,HIGH); digitalWrite(LED5,HIGH); digitalWrite(LED6,HIGH); digitalWrite(LED7,HIGH); digitalWrite(LED8,HIGH); digitalWrite(LED9,HIGH); digitalWrite(LED10,HIGH); digitalWrite(LED11,HIGH); } void drawInner_Circle() { digitalWrite(LED1,HIGH); delayMicroseconds(30); digitalWrite(LED1,LOW); }
LEDファンクロックの時刻設定方法
基本IR受信機をメイン回路に追加する場合
追加部品:
- R19, R20 = 10kΩ
- IRフォトトランジスタLED(LED#13付近:分設定用)
- IRフォトトランジスタLED(LED#16付近:時設定用)
R19を第1IR LED(LED#13付近・分設定)と、R20を第2IR LED(LED#16付近・時設定)に接続。両IR LEDの共通端子と抵抗をそれぞれArduino NANOのGNDと5Vに接続。A7ピンからR19と第2IRの間へ、A6ピンからR20と第1IRの間へジャンパー線を接続。

基本IRリモコン送信機の作成
部品:
- 9V電池
- 電池スナップコネクタ
- IR LED(赤外線LED)
- 1kΩ抵抗
- タクトスイッチ
- PCB基板
9V電池、IR LED、1kΩ抵抗、タクトスイッチをプラス側で直列接続するだけで、シンプルなIRリモコン送信機が完成します。これをLED#13とLED#16に向けてボタンを押すことで時刻設定を行います。
以下のコードでアナログUSB LEDファン時計の時針・分針(普通の壁掛け時計やアナログ腕時計の針に相当)を調整・設定します。
ArduinoシリアルモニタでIR検出回路の出力を確認。例えば通常室内光で500以上、IR光で500未満など、使用センサに合わせてコードや閾値を調整してください。
propeller_posn=30; n=0; while(n < 60) { ADCvalue = analogRead(minuteSensor); if(ADCvalue < 500) { minutes = propeller_posn; seconds = 0; } ADCvalue = analogRead(hourSensor); if(ADCvalue < 500) { hours = propeller_posn/5; seconds = 0; }
分針設定:IRリモコンを分目盛り(LED#13付近)に向けてボタン押下。
時針設定:IRリモコンを時目盛り(LED#16付近)に向けてボタン押下。
動画をチェック:
リソース:
LEDライトファン時計のガジェット
このプロジェクト用キット・部品
このプロジェクト用Arduino NANO
産業技術
- Arduino POVクロック:残像効果で浮かび上がるLED時計を自作する
- 12メートル先から見える大型LEDマスタークロック(アラーム機能付き)を自作しよう
- Arduino三目並べ:MAX7219 LEDマトリクスと段ボールケースで自作
- スマートArduino四足歩行ロボットの製作:ステップバイステップガイド
- SparkFun 7セグメントディスプレイで作る信頼性の高いArduinoカウントダウンタイマー
- Arduino Nanoで作る8×8 LEDマトリックスのフリップクロック - 自作リアルタイムクロック
- Arduinoで自作RCポルシェカー:ステップバイステップガイド
- DIY Arduino USBトラックパッド – 古いノートPCのタッチパッドを現代的なUSB入力デバイスに変換
- Arduino NanoとTCS3200センサーによる物体の色検出
- 555タイマーと4017カウンタによるLEDシーケンサ構築:周波数分周とデバウンス
- プロ仕様LEDナイトランプ回路図:230V/50Hz・110V/60Hz主電源直結設計