Arduino 向日葵:制作电子向日葵追踪阳光
零部件与材料
- Arduino UNO × 1
- RobotGeek 光敏传感器 × 1
- 旋转电位器 × 1
- Seeed Base Shield V2 × 1
软件平台
- Arduino IDE
项目缘起
Maker 总对新奇事物敏感。一日刷到向日葵随太阳转动的视频,顿生灵感:为何不自制电子装置模仿这一生物机制?
随后几天着手制作太阳追踪器。选用 Crowtail 系列模块(兼容 Arduino),从仓库拣选元件组装。用手机手电筒测试,完美跟随光源移动。
发视频到社交媒体后获大量点赞转发,不少人索要教程。遂重制项目并编写详细教程分享。
步骤 1:准备材料

- 硬纸板 × 2
- KT 板(泡沫芯板) × 1
- 木棒 × 1
- 3Pin Crowtail 连接线 × 6
- Crowtail 线性电位器 × 2
- Crowtail 光敏传感器 × 4
- Crowtail 云台(双舵机) × 1
- Crowduino (ATMega328 V1.1) × 1
- Crowtail Base Shield for Arduino × 1
步骤 2:制作花头

将两块硬纸板剪成图示形状,拼成十字架。木棒粘在十字中心,作为“花头”指向光源,兼具美观与稳定。
步骤 3:安装 4 个光敏传感器

在 KT 板上戳 4 个孔装传感器,中间挖一孔穿木棒。给传感器编号 1-4 以区分位置。
步骤 4:连接传感器线缆

热熔胶固定木棒于 KT 板,插上传感器连接线。
步骤 5:将木棒固定到云台

传感器座朝向保持与图一致:传感器 1、2 在下方。云台内置 9G 舵机,水平/垂直各 180° 旋转。最后将装饰用太阳能板粘在 KT 板上(仅装饰,不供电)。
步骤 6:上传代码

取出 Crowduino 和 Base Shield 叠装。连接线缆前先上传代码:Micro USB 连接电脑,打开 Arduino IDE。
步骤 7:连接 4 个传感器到扩展板

按编号一一对应:
- 线缆 1 → A0
- 线缆 2 → A1
- 线缆 4 → A2
- 线缆 3 → A3
步骤 8:连接电位器到扩展板

两个电位器分别接 A4、A5。两者无区别,但 A4 控制反应延时,A5 控制舵机转动速度。
步骤 9:连接云台到扩展板

下舵机(水平)接 D9,上舵机(垂直)接 D10。
步骤 10:供电方式

Crowduino 为主控,可用 USB 移动电源或 DC 适配器供电,决定是否便携。
步骤 11:实测演示

合上盒子,它迫不及待想追光。别急,先在暗室用手机手电筒测试——看这可爱的家伙!
看似复杂实则简单,快动手做吧!还能继续优化让它更酷炫!
代码
#include <Servo.h>
Servo horizontal; int servoh = 90;
Servo vertical; int servov = 90;
// LDR 引脚定义
int ldrrd = 0; // 右下
int ldrld = 1; // 左下
int ldrlt = 2; // 左上
int ldrrt = 3; // 右上
void setup() {
Serial.begin(9600);
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; // A4 电位器:反应延时
int tol = analogRead(5) / 4; // A5 电位器:容差/灵敏度
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;
}
horizontal.write(servoh);
}
delay(dtime);
}
3D 打印/外壳文件
项目附件含外壳参考图片。
原理图
原理图见项目附件。
制造工艺
- 用 Arduino 打造绚丽显示器 Ambilight 系统
- 用 Arduino UNO 和 OLED 显示屏制作经典 Pong 游戏:分步教程
- Arduino 音频频率检测:基于 FFT 测量最响亮声音峰值
- 自制 Arduino 电子宠物「Tamaguino」:复刻经典 Tamagotchi 全攻略
- 电子变色龙:Arduino Nano RGB LED 与颜色传感器项目
- 智能无线开关控制器:Arduino + 433MHz 远程操控墙壁开关
- Arduino 井字棋游戏:MAX7219 点阵屏 + 纸板外壳 DIY
- 基于 Arduino Nano 的智能运动感应水枪
- 使用 SparkFun 7 段数码管构建可靠的 Arduino 倒计时器
- 智能黑客空间电子签到系统 - Arduino Mega 与 RFID 实现
- 自制 Arduino 遥控保时捷赛车:从改装底盘到手机 App 控制全攻略
- Arduino 合成乐音:从零实现 88 键钢琴全音域