Arduino向日葵:太陽を追尾する電子ヒマワリの製作
必要な部品と材料
- Arduino UNO × 1
- RobotGeek 光センサー × 1
- ロータリーポテンショメータ (汎用) × 1
- Seeed Base Shield V2 × 1
アプリとオンラインサービス
- Arduino IDE
プロジェクト概要
メイカーは常に新しく面白いものに敏感です。ある日、ヒマワリが太陽とともに動く動画を見ました。その瞬間、ひらめきました。「この生物学的メカニズムを模倣する電子デバイスを作れないだろうか?」
その後数日間、ソーラートラッカープロジェクトを実行しました。マイコンボードとしてCrowtailを選び、倉庫から部品とアクセサリをピックアップ。それらを組み立て、最後にスマホのLEDライトでテストしました。ご存知の通り、完璧に動作しました。
私は興奮してデモ動画をSNSに投稿しました。多くの人がいいね・シェアしてくれ、中には「自分も作りたい」とメッセージをくれた人もいました。
そこでプロジェクトを再構築し、より多くの人が作れるよう具体的なチュートリアルを作成しました。それでは始めましょう。
ステップ1: 準備

必要な材料は以下の通りです。
- 厚紙 (ダンボール) × 2
- 発泡スチロールボード × 1
- 棒 (スティック) × 1
- 3ピンCrowtailケーブル × 6
- Crowtail リニアポテンショメータ × 2
- Crowtail 光センサー × 4
- Crowtail パン・チルト × 1
- Crowduino (ATMega 328 V1.1) × 1
- Crowtail Base Shield for Arduino × 1
ステップ2: デバイスの「頭部」製作




まず、写真のように厚紙を2枚、半分に切ったような形にカットします。これらを十字形に組み立てます。最後に棒を十字に貼り付けます。これが「頭部」となり、常に太陽を向きます。同時に、デバイスを美しく安定させる役割も果たします。
ステップ3: 4つの光センサー取り付け



発泡スチロールに4つの適切な穴を開けてセンサーを取り付け、中央に棒を通す穴を開けます。センサーに番号を振って位置を区別できるようにしました。
ステップ4: センサーとケーブルの接続




ホットボンドで棒を発泡スチロールに固定し、ケーブルをセンサーに差し込みます。
ステップ5: 棒をパン・チルトに固定





棒をパン・チルトに固定します。センサーの座りは写真と一致させてください。センサー「1」と「2」は下側に位置します。
パン・チルトは9gサーボを組み込んだ完成品で、垂直・水平それぞれ180度の回転制御が可能です。
最後にソーラーパネルを発泡スチロールに固定します(注:2枚のソーラーパネルは装飾用で、発電機能はありません)。
ステップ6: コードのアップロード



CrowduinoとCrowtail Base Shieldを取り出し、スタックします。ベースボードにケーブルを接続する前に、プログラムコードをCrowduinoにアップロードする必要があります。マイクロUSBケーブルが必要です。CrowduinoをPCに接続し、Arduino IDEを開きます。
ステップ7: 4つのセンサーをシールドに接続


センサーのケーブルをシールドに接続します。番号が上記写真と一対一対応するようにしてください。
- ケーブル「1」→ A0
- ケーブル「2」→ A1
- ケーブル「4」→ A2
- ケーブル「3」→ A3
ステップ8: ポテンショメータをシールドに接続



2つのポテンショメータをシールドのA4とA5ソケットに接続します。
2つのポテンショメータに違いはありませんが、A4ポートに接続した方が「反応遅延時間」の制御役割を、A5に接続した方が「サーボ回転速度」の制御役割を担います。
ステップ9: パン・チルトをシールドに接続

下側のサーボ(水平移動)をD9に、上側のサーボ(垂直移動)をD10に接続します。
ステップ10: 電源供給方法


Crowduinoがこのプロジェクトのメインコントローラーボードです。USBモバイルバッテリーまたはDCアダプターで給電できます。モバイルデバイスにするか固定設置にするかはあなた次第です。
ステップ11: 動作テスト!

箱を閉じます。今にも日光を追いかけて動き出したそうな見た目です。さあ、テストしましょう。
暗い部屋に持ち込み、スマホのライトを点けると……わあ! この愛いやつめ!
難しそうに見えますが、実はかなりシンプルです。ぜひ作ってみてください! もっとカッコよく、パワフルに見せる工夫もできますよ!
コード
- CODE FOR ARDUINO SUNFLOWER
CODE FOR ARDUINO SUNFLOWER (Arduino)
#include <Servo.h> // サーボライブラリ読み込み
Servo horizontal; // 水平サーボ
int servoh = 90; // 水平サーボ初期位置
Servo vertical; // 垂直サーボ
int servov = 90; // 垂直サーボ初期位置
// LDRピン接続
// name = analogpin;
int ldrrd = 0;
int ldrld = 1;
int ldrlt = 2;
int ldrrt = 3;
void setup() {
Serial.begin(9600);
// サーボ接続
// name.attacht(pin);
horizontal.attach(9);
vertical.attach(10);
}
void loop() {
int lt = analogRead(ldrlt); // 左上
int rt = analogRead(ldrrt); // 右上
int ld = analogRead(ldrld); // 左下
int rd = analogRead(ldrrd); // 右下
int dtime = analogRead(4) / 20; // ポテンショメータ読み取り (遅延時間)
int tol = analogRead(5) / 4; // ポテンショメータ読み取り (許容範囲)
int avt = (lt + rt) / 2; // 上側平均値
int avd = (ld + rd) / 2; // 下側平均値
int avl = (lt + ld) / 2; // 左側平均値
int avr = (rt + rd) / 2; // 右側平均値
int dvert = avt - avd; // 上下差分
int dhoriz = avl - avr; // 左右差分
if (-1 * tol > dvert || dvert > tol) { // 差分が許容範囲外なら垂直角度変更
if (avt > avd) {
servov = ++servov;
if (servov > 180) servov = 180;
} else if (avt < avd) {
servov = --servov;
if (servov < 0) servov = 0;
}
vertical.write(servov);
}
if (-1 * tol > dhoriz || dhoriz > tol) { // 差分が許容範囲外なら水平角度変更
if (avl > avr) {
servoh = --servoh;
if (servoh < 0) servoh = 0;
} else if (avl < avr) {
servoh = ++servoh;
if (servoh > 180) servoh = 180;
} else if (avl == avr) {
// 何もしない
}
horizontal.write(servoh);
}
delay(dtime);
}
カスタムパーツとケース

回路図

製造プロセス
- Arduinoで作るモニター用Ambilightシステム:没入感アップの自作ガイド
- Arduino UNOとOLEDディスプレイでクラシックPongゲームを自作:ステップバイステップチュートリアル
- Arduinoオーディオ周波数検出器 – 高感度サウンドモジュールで最大音量ピークの周波数を測定
- Arduinoで作る自作デジタルペット「Tamaguino」─ 3Dプリンター製ケース付き完全ガイド
- 電子カメレオン:Arduino Nano、RGB LED、カラーセンサーを使ったプロジェクト
- スマートワイヤレス照明スイッチコントローラー:Arduinoで物理スイッチを遠隔操作
- Arduino三目並べ:MAX7219 LEDマトリクスと段ボールケースで自作
- Arduino Nanoで作るスマートな動体検知水鉄砲
- SparkFun 7セグメントディスプレイで作る信頼性の高いArduinoカウントダウンタイマー
- ハックスペース向けスマート電子チェックインシステム
- Arduinoで自作RCポルシェカー:ステップバイステップガイド