|
主控板
|
Basra主控板(兼容Arduino Uno)?
|
|
擴展板
|
Bigfish2.1擴展板?
|
|
傳感器
|
光強傳感器
|
|
通信
|
藍牙串口模塊
|
|
電池
|
7.4V鋰電池
|
下面提供一個實現暗光情況下燈葉打開,燈亮;強光情況下燈葉閉合,燈滅的參考程序(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遙控模式