1. 功能描述
蓮花燈是一款基于蓮花形象設(shè)計(jì)的機(jī)器人,本文示例將用兩種模式來(lái)實(shí)現(xiàn)蓮花燈的亮滅功能。
自主模式:用 光強(qiáng)傳感器 控制蓮花燈的燈葉開(kāi)合。暗光情況下燈葉打開(kāi),燈亮;強(qiáng)光情況下燈葉閉合,燈滅。
遙控模式:采用 藍(lán)牙串口模塊 控制燈葉開(kāi)合。燈葉打開(kāi),燈亮;燈葉閉合,燈滅。
2. 結(jié)構(gòu)說(shuō)明
蓮花燈采用“探索者”結(jié)構(gòu)件搭建、輔以外觀設(shè)計(jì)而成,由曲柄搖桿機(jī)構(gòu)和平行四連桿機(jī)構(gòu)構(gòu)成一個(gè)二級(jí)升降機(jī)構(gòu),通過(guò)杠桿來(lái)控制蓮花燈的開(kāi)合。
? ? ?蓮花燈的燈葉開(kāi)合主要是由膨脹機(jī)構(gòu)來(lái)控制的,膨脹輪是整個(gè)結(jié)構(gòu)的核心部分,這種結(jié)構(gòu)的優(yōu)點(diǎn)是可實(shí)現(xiàn)收縮和膨脹,從而來(lái)控制燈葉的開(kāi)合。
3. 電子硬件
在這個(gè)示例中,我們采用了以下硬件,請(qǐng)大家參考:
主控板 | Basra主控板(兼容Arduino Uno)? |
擴(kuò)展板 | Bigfish2.1擴(kuò)展板? |
傳感器 | 光強(qiáng)傳感器 |
通信 | 藍(lán)牙串口模塊 |
電池 | 7.4V鋰電池 |
電路連接:
① 燈帶:連在Bigfish擴(kuò)展板的D9、D10接口上
② 舵機(jī):連在Bigfish擴(kuò)展板的D4端口上
③ 藍(lán)牙串口模塊:安裝在Bigfish擴(kuò)展塢上
④ 光強(qiáng)傳感器:連在Bigfish擴(kuò)展板的A0端口上
4. 功能實(shí)現(xiàn)
4.1自主模式
編程環(huán)境:Arduino 1.8.19
下面提供一個(gè)實(shí)現(xiàn)暗光情況下燈葉打開(kāi),燈亮;強(qiáng)光情況下燈葉閉合,燈滅的參考程序(light.ino):
/*------------------------------------------------------------------------------------
版權(quán)說(shuō)明: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 機(jī)器譜 2023-10-25 https://www.robotway.com/ ------------------------------*/ /* * Light測(cè)試?yán)?/p> * 2018/04/17 * ———————————— * 接線(xiàn): *? ? 燈帶:9、10 *? ? 舵機(jī):4 *? ? 藍(lán)牙:Bigfish擴(kuò)展塢 *? ? 光強(qiáng):A0 * ———————————— * 功能: *? ? 控制模式:藍(lán)牙控制燈葉開(kāi)合 *? ? 自主模式:光強(qiáng)傳感器控制燈葉開(kāi)合 * *? ? 燈葉打開(kāi),燈亮;燈葉閉合,燈滅 */ #include <ServoTimer2.h> #include "light.h" ServoTimer2 myServo; int servo_port = 4;? ? ? ?//定義舵機(jī)引腳 int sensor_port = A0;? ? ?//定義光強(qiáng)傳感器引腳 int servo_value = 1550;? ?//定義舵機(jī)初始值 PWM /* int open_angle = 1150;? ? //燈葉打開(kāi)時(shí)舵機(jī)的值 int close_angle = 1550;? ?//燈葉閉合時(shí)舵機(jī)的值 */ 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)){? ?//亮光下,光強(qiáng)返回值1,燈葉閉合,燈光關(guān)閉 ServoGo(1550); } if(!digitalRead(sensor_port)){ ? //黑暗中,光強(qiáng)返回0,燈葉打開(kāi),燈光開(kāi)啟 ServoGo(1150); } } /*舵機(jī)控制*/ void ServoGo(int where){? ?//舵機(jī)控制函數(shù),參數(shù):目標(biāo)角度 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設(shè)置:將文末資料中的“BLE_SPP_PRO.apk”安裝到手機(jī)中。
① 搜索藍(lán)牙
② 連接藍(lán)牙
③ 模式選擇
④ 按鍵設(shè)置
⑤ 各按鍵發(fā)送值