| 主控板 |
Basra主控板(兼容Arduino Uno)?
|
| 擴展板 |
Bigfish2.1擴展板?
|
|
傳感器 |
光強傳感器? |
| 近紅外傳感器 | |
| 電池 | 7.4V鋰電池 |
下面提供一個實現行星探測車在行進過程中避障,并且當光強傳感器觸發時實現太陽翼展開功能的參考程序(sketch_sep12a.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-09-21 https://www.robotway.com/
------------------------------*/
#include <Servo.h>
Servo leftSolarPanel; // 左太陽翼舵機
Servo rightSolarPanel; // 右太陽翼舵機
Servo mast; // 桅桿舵機
int irSensorPin = A0; // 紅外傳感器的引腳(根據實際連接修改)
int lightSensorPin =A5; // 光強傳感器的引腳(根據實際連接修改)
bool irSensorTriggered = false; // 用于跟蹤紅外傳感器觸發狀態
void setup() {
pinMode(irSensorPin, INPUT);
pinMode(lightSensorPin, INPUT);
leftSolarPanel.attach(4); // 左太陽翼舵機連接到數字引腳 4
rightSolarPanel.attach(3); // 右太陽翼舵機連接到數字引腳 3
mast.attach(7); // 桅桿舵機連接到數字引腳 7
}
void loop() {
// 讀取紅外傳感器狀態
int irSensorValue = digitalRead(irSensorPin);
// 如果紅外傳感器觸發,小車后退并左轉
if (irSensorValue == HIGH && !irSensorTriggered) {
irSensorTriggered = true;
moveBackward();
leftTurn();
} else if (irSensorValue == HIGH && irSensorTriggered) {
irSensorTriggered = false;
moveForward();
rightTurn();
} else {
// 如果未觸發紅外傳感器,停止小車運動
stopCar();
}
// 讀取光強傳感器狀態
int lightSensorValue = analogRead(lightSensorPin);
// 如果光強傳感器觸發,執行太陽翼和桅桿展開和閉合操作
if (lightSensorValue > 500) {
expandSolarPanelsAndMast();
} else {
stopSolarPanelsAndMast();
}
}
// 后退
void moveBackward() {
digitalWrite( 5 , HIGH ); //右輪后退
digitalWrite( 6 , LOW );
digitalWrite( 9 , HIGH ); //左輪后退
digitalWrite( 10 , LOW);
}
// 左轉
void leftTurn() {
digitalWrite( 5 , HIGH );
digitalWrite( 6 , LOW );
digitalWrite( 9 , LOW );
digitalWrite( 10 , LOW );
}
// 前進
void moveForward() {
digitalWrite( 5 , LOW ); //右輪前進
digitalWrite( 6 , HIGH );
digitalWrite( 9 , LOW ); //左輪前進
digitalWrite( 10 , HIGH );
}
// 右轉
void rightTurn() {
digitalWrite( 5 , LOW );
digitalWrite( 6 , LOW );
digitalWrite( 9 , HIGH );
digitalWrite( 10 , LOW );
}
// 停止
void stopCar() {
analogWrite(5 , 0);
analogWrite(6 , 0);
analogWrite(9 , 0);
analogWrite(10 , 0);
}
// 太陽翼和桅桿展開操作
void expandSolarPanelsAndMast() {
// 左太陽翼展開至180°
setServoAngle(leftSolarPanel, 180);
delay(500); // 暫停0.5秒
// 右太陽翼展開至180°
setServoAngle(rightSolarPanel, 180);
delay(500); // 暫停0.5秒
// 桅桿展開至90°
setServoAngle(mast, 90);
delay(500); // 暫停0.5秒
}
// 太陽翼和桅桿關閉操作
void stopSolarPanelsAndMast() {
// 桅桿閉合至0°
setServoAngle(mast, 0);
// 左太陽翼閉合至0°
setServoAngle(leftSolarPanel, 0);
// 右太陽翼閉合至0°
setServoAngle(rightSolarPanel, 0);
}
// 函數用于設置舵機角度,并控制舵機旋轉速度
void setServoAngle(Servo servo, int targetAngle) {
int currentAngle = servo.read();
int step = 1; // 步進值,可根據需要調整
int delayTime = 20; // 延遲時間,可根據需要調整
if (targetAngle > currentAngle) {
for (int angle = currentAngle; angle <= targetAngle; angle += step) {
servo.write(angle);
delay(delayTime);
}
} else if (targetAngle < currentAngle) {
for (int angle = currentAngle; angle >= targetAngle; angle -= step) {
servo.write(angle);
delay(delayTime);
}
}
}