极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2100|回复: 0

机器人制作开源方案 | 行星探测车概述

[复制链接]
发表于 2023-10-17 18:50:07 | 显示全部楼层 |阅读模式
本帖最后由 机器谱 于 2023-10-17 19:01 编辑

1. 功能描述
       行星探测车(Planetary Rover)是一种用于进行科学探索和勘测任务的无人车辆,它们被设计成能够适应各种复杂的地形条件和极端环境,以便收集数据、拍摄照片、采集样本等。行星探测车通常包含以下主要组件和功能:
       ① 底盘和轮子系统:底盘提供了行星探测车的支撑结构,轮子系统使其能够移动。轮子通常采用特殊设计,以适应不同地质条件和障碍物,并提供良好的牵引力和稳定性。
       ② 动力系统:行星探测车通常由电池或太阳能电池板供电,这些能源会驱动电动机,使车辆能够移动和执行其它任务。
       ③ 导航与控制系统:导航和控制系统帮助行星探测车感知周围的环境并自主导航,它们通常包括惯性测量单元(IMU)、陀螺仪、加速度、摄像头、激光雷达、GPS等传感器。
       ④ 通信系统:行星探测车需要进行通信以接收指令和发送数据,通常会使用无线电通信设备实现远距离通信。
本文示例将实现R261样机行星探测车在行进过程中避障,并且当光强传感器触发时实现太阳翼展开的功能。

2. 电子硬件
在这个示例中,我们采用了以下硬件,请大家参考:

主控板
Basra主控板(兼容Arduino Uno)
扩展板
Bigfish2.1扩展板
传感器
光强传感器
近红外传感器
电池7.4V锂电池

电路连接图如下所示:

3. 功能实现
编程环境:Arduino 1.8.19
下面提供一个实现行星探测车在行进过程中避障,并且当光强传感器触发时实现太阳翼展开功能的参考程序(sketch_sep12a.ino):
  1. /*------------------------------------------------------------------------------------

  2.   版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.

  3.            Distributed under MIT license.See file LICENSE for detail or copy at

  4.            https://opensource.org/licenses/MIT

  5.            by 机器谱 2023-09-21 https://www.robotway.com/

  6.   ------------------------------*/

  7. #include <Servo.h>

  8. Servo leftSolarPanel;   // 左太阳翼舵机

  9. Servo rightSolarPanel; // 右太阳翼舵机

  10. Servo mast;           // 桅杆舵机

  11. int irSensorPin = A0;     // 红外传感器的引脚(根据实际连接修改)

  12. int lightSensorPin =A5;   // 光强传感器的引脚(根据实际连接修改)

  13. bool irSensorTriggered = false; // 用于跟踪红外传感器触发状态

  14. void setup() {

  15.   pinMode(irSensorPin, INPUT);

  16.   pinMode(lightSensorPin, INPUT);



  17.   leftSolarPanel.attach(4);   // 左太阳翼舵机连接到数字引脚 4

  18.   rightSolarPanel.attach(3); // 右太阳翼舵机连接到数字引脚 3

  19.   mast.attach(7);            // 桅杆舵机连接到数字引脚 7

  20. }

  21. void loop() {

  22.   // 读取红外传感器状态

  23.   int irSensorValue = digitalRead(irSensorPin);

  24.   // 如果红外传感器触发,小车后退并左转

  25.   if (irSensorValue == HIGH && !irSensorTriggered) {

  26.     irSensorTriggered = true;

  27.     moveBackward();

  28.     leftTurn();

  29.   } else if (irSensorValue == HIGH && irSensorTriggered) {

  30.     irSensorTriggered = false;

  31.     moveForward();

  32.     rightTurn();

  33.   } else {

  34.     // 如果未触发红外传感器,停止小车运动

  35.     stopCar();

  36.   }

  37.   // 读取光强传感器状态

  38.   int lightSensorValue = analogRead(lightSensorPin);

  39.   // 如果光强传感器触发,执行太阳翼和桅杆展开和闭合操作

  40.   if (lightSensorValue > 500) {

  41.     expandSolarPanelsAndMast();

  42.   } else {

  43.     stopSolarPanelsAndMast();

  44.   }

  45. }

  46. // 后退

  47. void moveBackward() {

  48.    digitalWrite( 5 , HIGH );   //右轮后退

  49.   digitalWrite( 6 , LOW );



  50.   digitalWrite( 9 , HIGH );   //左轮后退

  51.   digitalWrite( 10 , LOW);

  52. }

  53. // 左转

  54. void leftTurn() {

  55.   digitalWrite( 5 , HIGH );

  56.   digitalWrite( 6 , LOW );

  57.   digitalWrite( 9 , LOW );

  58.   digitalWrite( 10 , LOW );

  59. }

  60. // 前进

  61. void moveForward() {

  62.   digitalWrite( 5 , LOW );   //右轮前进

  63.   digitalWrite( 6 , HIGH );



  64.   digitalWrite( 9 , LOW );   //左轮前进

  65.   digitalWrite( 10 , HIGH );

  66. }

  67. // 右转

  68. void rightTurn() {

  69.   digitalWrite( 5 , LOW );

  70.   digitalWrite( 6 , LOW );

  71.   digitalWrite( 9 , HIGH );

  72.   digitalWrite( 10 , LOW );

  73. }

  74. // 停止

  75. void stopCar() {

  76.   analogWrite(5 , 0);

  77.   analogWrite(6 , 0);

  78.   analogWrite(9 , 0);

  79.   analogWrite(10 , 0);

  80. }

  81. // 太阳翼和桅杆展开操作

  82. void expandSolarPanelsAndMast() {

  83.   // 左太阳翼展开至180°

  84.   setServoAngle(leftSolarPanel, 180);

  85.   delay(500);   // 暂停0.5秒

  86.   // 右太阳翼展开至180°

  87.   setServoAngle(rightSolarPanel, 180);

  88.   delay(500);   // 暂停0.5秒

  89.   // 桅杆展开至90°

  90.   setServoAngle(mast, 90);

  91.   delay(500);   // 暂停0.5秒

  92. }

  93. // 太阳翼和桅杆关闭操作

  94. void stopSolarPanelsAndMast() {

  95.   // 桅杆闭合至0°

  96.   setServoAngle(mast, 0);

  97.   // 左太阳翼闭合至0°

  98.   setServoAngle(leftSolarPanel, 0);

  99.   // 右太阳翼闭合至0°

  100.   setServoAngle(rightSolarPanel, 0);

  101. }

  102. // 函数用于设置舵机角度,并控制舵机旋转速度

  103. void setServoAngle(Servo servo, int targetAngle) {

  104.   int currentAngle = servo.read();

  105.   int step = 1; // 步进值,可根据需要调整

  106.   int delayTime = 20; // 延迟时间,可根据需要调整

  107.   if (targetAngle > currentAngle) {

  108.     for (int angle = currentAngle; angle <= targetAngle; angle += step) {

  109.       servo.write(angle);

  110.       delay(delayTime);

  111.     }

  112.   } else if (targetAngle < currentAngle) {

  113.     for (int angle = currentAngle; angle >= targetAngle; angle -= step) {

  114.       servo.write(angle);

  115.       delay(delayTime);

  116.     }

  117.   }

  118. }


复制代码

4. 扩展样机
本样机的底盘方案是【R255】号机构,如下图所示:

关于行星探测车的更多扩展案例可参考【R255】月球车底盘【https://www.robotway.com/h-col-120.html】

5. 资料清单
资料内容:
①程序源代码
②样机3D文件
资料下载地址:行星探测车-概述 https://www.robotway.com/h-col-275.html
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-30 23:47 , Processed in 0.045911 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表