1. 功能描述
莲花灯是一款基于莲花形象设计的机器人,本文示例将用两种模式来实现莲花灯的亮灭功能。
自主模式:用 光强传感器 控制莲花灯的灯叶开合。暗光情况下灯叶打开,灯亮;强光情况下灯叶闭合,灯灭。
遥控模式:采用 蓝牙串口模块控制灯叶开合。灯叶打开,灯亮;灯叶闭合,灯灭。
2. 结构说明
莲花灯采用“探索者”结构件搭建、辅以外观设计而成,由曲柄摇杆机构和平行四连杆机构构成一个二级升降机构,通过杠杆来控制莲花灯的开合。
莲花灯的灯叶开合主要是由膨胀机构来控制的,膨胀轮是整个结构的核心部分,这种结构的优点是可实现收缩和膨胀,从而来控制灯叶的开合。
3. 电子硬件
在这个示例中,我们采用了以下硬件,请大家参考:
电路连接:
① 灯带:连在Bigfish扩展板的D9、D10接口上
② 舵机:连在Bigfish扩展板的D4端口上
③ 蓝牙串口模块:安装在Bigfish扩展坞上
④ 光强传感器:连在Bigfish扩展板的A0端口上
4. 功能实现
4.1自主模式
编程环境:Arduino 1.8.19
下面提供一个实现暗光情况下灯叶打开,灯亮;强光情况下灯叶闭合,灯灭的参考程序(light.ino):
/*------------------------------------------------------------------------------------
版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.
Distributed under MIT license.See file LICENSE for detail or copy at
https://opensource.org/licenses/MIT
by 机器谱 2023-10-25 https://www.robotway.com/
------------------------------*/
/*
* Light测试例程
* 2018/04/17
* ————————————
* 接线:
* 灯带:9、10
* 舵机:4
* 蓝牙:Bigfish扩展坞
* 光强:A0
* ————————————
* 功能:
* 控制模式:蓝牙控制灯叶开合
* 自主模式:光强传感器控制灯叶开合
*
* 灯叶打开,灯亮;灯叶闭合,灯灭
*/
#include <ServoTimer2.h>
#include "light.h"
ServoTimer2 myServo;
int servo_port = 4; //定义舵机引脚
int sensor_port = A0; //定义光强传感器引脚
int servo_value = 1550; //定义舵机初始值 PWM
/*
int open_angle = 1150; //灯叶打开时舵机的值
int close_angle = 1550; //灯叶闭合时舵机的值
*/
void setup() {
Serial.begin(9600);
PortInit();
myServo.write(servo_value);
delay(1000);
}
void loop() {
/*Bluetooth Mode*/
if(SerialRead() == '1'){
Serial.println("Bluetooth Mode");
while(true){
switch(SerialRead()){
case '2':
Serial.println("OPEN");
ServoGo(1150); //OPEN
break;
case '3':
Serial.println("CLOSE");
ServoGo(1550); //CLOSE
break;
default:break;
}
if(SerialRead() == '4') {
Serial.println("Auto Mode");
break;
}
}
}
/* Auto Mode*/
AutoMode();
}
/*端口初始化*/
void PortInit(){
pinMode(sensor_port, INPUT);
pinMode(servo_port, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
myServo.attach(servo_port);
}
/*串口控制*/
char SerialRead(){
char c;
while(Serial.available()) {
c = Serial.read();
}
return c;
}
/*自主模式*/
void AutoMode(){
if(digitalRead(sensor_port)){ //亮光下,光强返回值1,灯叶闭合,灯光关闭
ServoGo(1550);
}
if(!digitalRead(sensor_port)){ //黑暗中,光强返回0,灯叶打开,灯光开启
ServoGo(1150);
}
}
/*舵机控制*/
void ServoGo(int where){ //舵机控制函数,参数:目标角度
int delta = where - servo_value; //delta < 0: OPEN ; delta > 0: CLOSE
if(delta == 0) return;
float light_value = delta < 0 ? 0 : 255;
int diff = delta < 0 ? -1 : 1;
for(int i=0;i<abs(delta);i++){
servo_value += diff;
if(delta < 0){
light_value += 0.65; //0.65 (255 / delta);
if(light_value > 255) light_value = 255;
}else if(delta > 0){
light_value -= 0.65;
if(light_value < 0) light_value = 0;
}
LightState(&light_value);
myServo.write(servo_value);
delay(10);
}
}
/*灯光控制*/
void LightState(float * value){
analogWrite(9, *value);
analogWrite(10, 0);
}
4.2遥控模式
APP设置:将文末资料中的“BLE_SPP_PRO.apk”安装到手机中。
① 搜索蓝牙
② 连接蓝牙
③ 模式选择
④ 按键设置
⑤ 各按键发送值
5. 资料清单
①程序源代码
②样机3D文件
资料下载链接:莲花灯-概述