8浏览
查看: 8|回复: 3

[项目] 【花雕】6.5 寸轮毂电机自动跟随底盘・超声波最简方案

[复制链接]
【花雕】6.5 寸轮毂电机自动跟随底盘・超声波最简方案图2
【花雕】6.5 寸轮毂电机自动跟随底盘・超声波最简方案图3

【花雕】6.5 寸轮毂电机自动跟随底盘・超声波最简方案图1

驴友花雕  高级技神
 楼主|

发表于 1 小时前

【花雕】6.5 寸轮毂电机自动跟随底盘・超声波最简方案

1、超声波跟随基础方案(单超声波)

  1. #include <SimpleFOC.h>
  2. // 6.5寸轮毂电机(约165mm直径)
  3. BLDCMotor motorL = BLDCMotor(7); // 左轮毂电机
  4. BLDCMotor motorR = BLDCMotor(7); // 右轮毂电机
  5. BLDCDriver3PWM driverL = BLDCDriver3PWM(9, 10, 11, 8);
  6. BLDCDriver3PWM driverR = BLDCDriver3PWM(5, 6, 7, 4);
  7. // 超声波传感器
  8. #define TRIG_PIN 2
  9. #define ECHO_PIN 3
  10. // 跟随参数
  11. const float TARGET_DISTANCE = 50.0; // 目标跟随距离 50cm
  12. const float MAX_DISTANCE = 200.0;   // 最大检测距离
  13. const float WHEEL_DIAMETER = 0.165; // 6.5寸 = 16.5cm直径
  14. const float WHEEL_BASE = 0.30;      // 轮距30cm
  15. float readUltrasonic() {
  16.   digitalWrite(TRIG_PIN, LOW);
  17.   delayMicroseconds(2);
  18.   digitalWrite(TRIG_PIN, HIGH);
  19.   delayMicroseconds(10);
  20.   digitalWrite(TRIG_PIN, LOW);
  21.   
  22.   long duration = pulseIn(ECHO_PIN, HIGH, 30000); // 30ms超时
  23.   float distance = duration * 0.034 / 2; // 声速340m/s
  24.   
  25.   if (distance > MAX_DISTANCE || distance < 2) {
  26.     return -1; // 无效读数
  27.   }
  28.   return distance;
  29. }
  30. void followControl() {
  31.   float distance = readUltrasonic();
  32.   
  33.   if (distance < 0) {
  34.     // 传感器无效,停止
  35.     motorL.move(0);
  36.     motorR.move(0);
  37.     return;
  38.   }
  39.   
  40.   // 简单PID跟随控制
  41.   float error = distance - TARGET_DISTANCE;
  42.   
  43.   // 基础控制策略
  44.   float baseSpeed = 80; // 基础速度
  45.   float speedAdjust = error * 1.0; // 比例控制
  46.   
  47.   if (error > 20) {
  48.     // 距离过远,加速前进
  49.     motorL.move(baseSpeed + speedAdjust);
  50.     motorR.move(baseSpeed + speedAdjust);
  51.   } else if (error < -10) {
  52.     // 距离过近,减速或后退
  53.     motorL.move(baseSpeed + speedAdjust);
  54.     motorR.move(baseSpeed + speedAdjust);
  55.   } else {
  56.     // 保持距离,原地停止或低速维持
  57.     motorL.move(10);
  58.     motorR.move(10);
  59.   }
  60. }
  61. void setup() {
  62.   Serial.begin(115200);
  63.   
  64.   // 初始化超声波引脚
  65.   pinMode(TRIG_PIN, OUTPUT);
  66.   pinMode(ECHO_PIN, INPUT);
  67.   
  68.   // 初始化左电机
  69.   driverL.voltage_power_supply = 12;
  70.   driverL.init();
  71.   motorL.linkDriver(&driverL);
  72.   motorL.init();
  73.   motorL.initFOC();
  74.   
  75.   // 初始化右电机
  76.   driverR.voltage_power_supply = 12;
  77.   driverR.init();
  78.   motorR.linkDriver(&driverR);
  79.   motorR.init();
  80.   motorR.initFOC();
  81.   
  82.   Serial.println("6.5寸轮毂电机跟随底盘就绪");
  83. }
  84. void loop() {
  85.   // 电机FOC控制
  86.   motorL.loopFOC();
  87.   motorR.loopFOC();
  88.   
  89.   // 跟随控制(10Hz控制频率)
  90.   static unsigned long lastControl = 0;
  91.   if (millis() - lastControl > 100) {
  92.     followControl();
  93.     lastControl = millis();
  94.    
  95.     // 调试输出
  96.     Serial.print("距离:");
  97.     Serial.print(readUltrasonic());
  98.     Serial.print("cm 左速:");
  99.     Serial.print(motorL.shaft_velocity);
  100.     Serial.print(" 右速:");
  101.     Serial.println(motorR.shaft_velocity);
  102.   }
  103. }
复制代码


2、双超声波角度跟随方案

  1. #include <SimpleFOC.h>
  2. // 6.5寸轮毂电机
  3. BLDCMotor motorL = BLDCMotor(7);
  4. BLDCMotor motorR = BLDCMotor(7);
  5. BLDCDriver3PWM driverL = BLDCDriver3PWM(2,3,4,5);
  6. BLDCDriver3PWM driverR = BLDCDriver3PWM(6,7,8,9);
  7. // 双超声波传感器
  8. #define US_LEFT_TRIG 10
  9. #define US_LEFT_ECHO 11
  10. #define US_RIGHT_TRIG 12
  11. #define US_RIGHT_ECHO 13
  12. // 移动平均滤波器
  13. class MovingAverageFilter {
  14. private:
  15.   float buffer[5];
  16.   int index = 0;
  17.   
  18. public:
  19.   MovingAverageFilter() {
  20.     for(int i=0; i<5; i++) buffer[i] = 0;
  21.   }
  22.   
  23.   float filter(float value) {
  24.     buffer[index] = value;
  25.     index = (index + 1) % 5;
  26.    
  27.     float sum = 0;
  28.     for(int i=0; i<5; i++) sum += buffer[i];
  29.     return sum / 5;
  30.   }
  31. };
  32. MovingAverageFilter leftFilter, rightFilter;
  33. float readUltrasonic(int trigPin, int echoPin) {
  34.   digitalWrite(trigPin, LOW);
  35.   delayMicroseconds(2);
  36.   digitalWrite(trigPin, HIGH);
  37.   delayMicroseconds(10);
  38.   digitalWrite(trigPin, LOW);
  39.   
  40.   long duration = pulseIn(echoPin, HIGH, 25000); // 25ms超时
  41.   return duration * 0.034 / 2;
  42. }
  43. void angleFollowing() {
  44.   // 读取左右距离
  45.   float leftDist = readUltrasonic(US_LEFT_TRIG, US_LEFT_ECHO);
  46.   float rightDist = readUltrasonic(US_RIGHT_TRIG, US_RIGHT_ECHO);
  47.   
  48.   // 滤波处理
  49.   leftDist = leftFilter.filter(leftDist);
  50.   rightDist = rightFilter.filter(rightDist);
  51.   
  52.   // 有效性检查
  53.   if (leftDist > 200 || leftDist < 5) leftDist = 0;
  54.   if (rightDist > 200 || rightDist < 5) rightDist = 0;
  55.   
  56.   // 计算角度偏差
  57.   float angleError = 0;
  58.   if (leftDist > 0 && rightDist > 0) {
  59.     // 左右都有有效读数,计算角度偏差
  60.     angleError = (leftDist - rightDist) * 0.5; // 转换为角度修正
  61.   } else if (leftDist > 0) {
  62.     // 只有左侧有读数,右转
  63.     angleError = -30;
  64.   } else if (rightDist > 0) {
  65.     // 只有右侧有读数,左转
  66.     angleError = 30;
  67.   } else {
  68.     // 没有有效读数,停止
  69.     motorL.move(0);
  70.     motorR.move(0);
  71.     return;
  72.   }
  73.   
  74.   // 距离控制
  75.   float avgDist = (leftDist + rightDist) / 2;
  76.   float distanceError = avgDist - 60; // 目标距离60cm
  77.   
  78.   // 速度控制
  79.   float baseSpeed = constrain(100 - distanceError * 0.5, 30, 150);
  80.   
  81.   // 转向控制
  82.   float turnAdjust = constrain(angleError * 0.8, -50, 50);
  83.   
  84.   // 差速控制
  85.   motorL.move(baseSpeed + turnAdjust);
  86.   motorR.move(baseSpeed - turnAdjust);
  87.   
  88.   // 调试输出
  89.   Serial.print("左:");
  90.   Serial.print(leftDist);
  91.   Serial.print("cm 右:");
  92.   Serial.print(rightDist);
  93.   Serial.print("cm 角度修正:");
  94.   Serial.println(turnAdjust);
  95. }
  96. void setup() {
  97.   Serial.begin(115200);
  98.   
  99.   // 初始化超声波引脚
  100.   pinMode(US_LEFT_TRIG, OUTPUT);
  101.   pinMode(US_LEFT_ECHO, INPUT);
  102.   pinMode(US_RIGHT_TRIG, OUTPUT);
  103.   pinMode(US_RIGHT_ECHO, INPUT);
  104.   
  105.   // 初始化电机
  106.   driverL.voltage_power_supply = 12;
  107.   driverL.init();
  108.   motorL.linkDriver(&driverL);
  109.   motorL.init();
  110.   motorL.initFOC();
  111.   
  112.   driverR.voltage_power_supply = 12;
  113.   driverR.init();
  114.   motorR.linkDriver(&driverR);
  115.   motorR.init();
  116.   motorR.initFOC();
  117.   
  118.   Serial.println("双超声波角度跟随就绪");
  119. }
  120. void loop() {
  121.   // 必须的FOC循环
  122.   motorL.loopFOC();
  123.   motorR.loopFOC();
  124.   
  125.   // 8Hz控制频率(125ms)
  126.   static unsigned long lastControl = 0;
  127.   if (millis() - lastControl > 125) {
  128.     angleFollowing();
  129.     lastControl = millis();
  130.   }
  131. }
复制代码


3、超声波+IMU融合跟随方案

  1. #include <SimpleFOC.h>
  2. #include <MPU6050.h>
  3. #include <Wire.h>
  4. // 6.5寸轮毂电机底盘
  5. BLDCMotor motorL = BLDCMotor(7);
  6. BLDCMotor motorR = BLDCMotor(7);
  7. BLDCDriver3PWM driverL = BLDCDriver3PWM(2,3,4,5);
  8. BLDCDriver3PWM driverR = BLDCDriver3PWM(6,7,8,9);
  9. // 超声波(前向)
  10. #define US_FRONT_TRIG A0
  11. #define US_FRONT_ECHO A1
  12. // 超声波(侧向,检测目标方位)
  13. #define US_SIDE_TRIG A2
  14. #define US_SIDE_ECHO A3
  15. // MPU6050 IMU
  16. MPU6050 mpu;
  17. // 状态变量
  18. float targetDistance = 80.0; // 80cm跟随距离
  19. float currentYaw = 0;
  20. float targetYaw = 0;
  21. void setupIMU() {
  22.   Wire.begin();
  23.   mpu.initialize();
  24.   
  25.   if (!mpu.testConnection()) {
  26.     Serial.println("MPU6050连接失败");
  27.   }
  28.   
  29.   // 校准(简化)
  30.   mpu.setXGyroOffset(0);
  31.   mpu.setYGyroOffset(0);
  32.   mpu.setZGyroOffset(0);
  33. }
  34. float readIMUYaw() {
  35.   // 读取陀螺仪Z轴,积分得到偏航角
  36.   static float yaw = 0;
  37.   static unsigned long lastTime = 0;
  38.   
  39.   unsigned long currentTime = micros();
  40.   float dt = (currentTime - lastTime) / 1e6;
  41.   lastTime = currentTime;
  42.   
  43.   int16_t gz = mpu.getRotationZ();
  44.   float gyroZ = gz / 131.0 * PI/180.0; // 转换为rad/s
  45.   
  46.   yaw += gyroZ * dt;
  47.   
  48.   // 角度归一化
  49.   if (yaw > PI) yaw -= 2*PI;
  50.   if (yaw < -PI) yaw += 2*PI;
  51.   
  52.   return yaw;
  53. }
  54. void fusionFollowing() {
  55.   // 前向距离测量
  56.   float frontDist = readUltrasonic(US_FRONT_TRIG, US_FRONT_ECHO);
  57.   float sideDist = readUltrasonic(US_SIDE_TRIG, US_SIDE_ECHO);
  58.   
  59.   // IMU数据
  60.   currentYaw = readIMUYaw();
  61.   
  62.   // 状态决策
  63.   if (frontDist < 30) {
  64.     // 距离太近,后退
  65.     motorL.move(-80);
  66.     motorR.move(-80);
  67.    
  68.     // 同时尝试转向
  69.     if (sideDist > 0 && sideDist < 100) {
  70.       float sideError = sideDist - 40; // 期望侧向40cm
  71.       motorL.move(-80 + sideError);
  72.       motorR.move(-80 - sideError);
  73.     }
  74.   }
  75.   else if (frontDist > 30 && frontDist < 150) {
  76.     // 正常跟随模式
  77.    
  78.     // 距离控制
  79.     float distanceError = frontDist - targetDistance;
  80.     float speedBase = constrain(100 - distanceError * 1.0, 40, 150);
  81.    
  82.     // 方向控制(使用侧向超声波)
  83.     float directionError = 0;
  84.     if (sideDist > 10 && sideDist < 200) {
  85.       directionError = (sideDist - 50) * 0.5; // 期望50cm侧距
  86.     }
  87.    
  88.     // IMU辅助稳定
  89.     float yawStabilization = (targetYaw - currentYaw) * 10.0;
  90.    
  91.     // 综合控制
  92.     float leftSpeed = speedBase + directionError - yawStabilization;
  93.     float rightSpeed = speedBase - directionError + yawStabilization;
  94.    
  95.     // 限幅
  96.     leftSpeed = constrain(leftSpeed, 0, 200);
  97.     rightSpeed = constrain(rightSpeed, 0, 200);
  98.    
  99.     motorL.move(leftSpeed);
  100.     motorR.move(rightSpeed);
  101.   }
  102.   else {
  103.     // 距离过远或无读数,停止
  104.     motorL.move(20);
  105.     motorR.move(20);
  106.   }
  107.   
  108.   // 调试信息
  109.   Serial.print("前:");
  110.   Serial.print(frontDist);
  111.   Serial.print("cm 侧:");
  112.   Serial.print(sideDist);
  113.   Serial.print("cm 偏航:");
  114.   Serial.print(currentYaw * 180/PI);
  115.   Serial.println("度");
  116. }
  117. void setup() {
  118.   Serial.begin(115200);
  119.   
  120.   // 初始化超声波
  121.   pinMode(US_FRONT_TRIG, OUTPUT);
  122.   pinMode(US_FRONT_ECHO, INPUT);
  123.   pinMode(US_SIDE_TRIG, OUTPUT);
  124.   pinMode(US_SIDE_ECHO, INPUT);
  125.   
  126.   // 初始化IMU
  127.   setupIMU();
  128.   
  129.   // 初始化电机
  130.   driverL.voltage_power_supply = 12;
  131.   driverL.init();
  132.   motorL.linkDriver(&driverL);
  133.   motorL.init();
  134.   motorL.initFOC();
  135.   
  136.   driverR.voltage_power_supply = 12;
  137.   driverR.init();
  138.   motorR.linkDriver(&driverR);
  139.   motorR.init();
  140.   motorR.initFOC();
  141.   
  142.   Serial.println("超声波+IMU融合跟随就绪");
  143. }
  144. void loop() {
  145.   // FOC控制循环
  146.   motorL.loopFOC();
  147.   motorR.loopFOC();
  148.   
  149.   // 10Hz控制频率
  150.   static unsigned long lastControl = 0;
  151.   if (millis() - lastControl > 100) {
  152.     fusionFollowing();
  153.     lastControl = millis();
  154.   }
  155. }
复制代码


要点解读:
(1)6.5寸轮毂电机特性与配置:
物理参数:直径约16.5cm,周长约51.8cm,适合中小型机器人
功率匹配:12V供电,每轮约50-100W功率,提供足够扭矩
控制需求:需要FOC控制实现平稳启停和低速控制
安装优势:轮毂电机结构紧凑,集成度高
(2)超声波传感器最小可行配置:
单传感器方案:最简单,只能检测距离,无法判断角度
双传感器方案:可检测角度偏差,实现更好的跟随效果
传感器布局:前方+侧向布局可同时检测距离和方位
滤波处理:移动平均滤波消除超声波的随机误差
(3)跟随控制算法核心:
距离控制环:PID或比例控制维持目标距离
角度控制环:差速转向保持正确方位
状态机设计:根据不同距离范围采取不同策略
防撞保护:近距离时自动后退或停止
(4)性能优化关键点:
控制频率:8-10Hz足够,过高会增加计算负担
响应速度:6.5寸轮毂响应快,需防止过冲
滤波参数:平衡响应速度和稳定性
死区设置:避免在目标距离附近振荡
(5)可靠性增强措施:
超时处理:超声波读数超时返回无效值
范围限制:只处理有效范围内的读数(2-200cm)
错误恢复:传感器失效时安全停止
调试输出:串口监控实时状态,便于调试
这个最简方案使用最少的硬件(1-2个超声波+2个轮毂电机)实现了基本的自动跟随功能,适合快速原型开发和入门级应用。后续可根据需求增加更多传感器或优化算法。


【花雕】6.5 寸轮毂电机自动跟随底盘・超声波最简方案图1
回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 1 小时前

【花雕】6.5 寸轮毂电机自动跟随底盘・超声波最简方案

4、基础避障与定向跟随

  1. #include <SimpleFOC.h>
  2. #include <NewPing.h>
  3. // 6.5寸轮毂电机配置(假设电机极对数7,额定电压12V)
  4. BLDCMotor motorLeft(7, 1000);  // 左轮电机(引脚7,PWM频率1000Hz)
  5. BLDCMotor motorRight(8, 1000); // 右轮电机
  6. NewPing sonarFront(12, 13, 200); // 超声波传感器(触发12,回波13,量程200cm)
  7. void setup() {
  8.   Serial.begin(115200);
  9.   motorLeft.linkDriver(new BLDCDriver3PWM(3,5,6,11)); // 3PWM驱动(3,5,6引脚,使能11)
  10.   motorRight.linkDriver(new BLDCDriver3PWM(9,10,12,13));
  11.   motorLeft.init(); motorRight.init();
  12. }
  13. void loop() {
  14.   // 超声波测距(抗干扰:连续测量3次取中值)
  15.   int dist = sonarFront.ping_cm();
  16.   delay(30); // 抑制电磁干扰
  17.   
  18.   // 避障逻辑:前方<30cm时后退+转向
  19.   if(dist > 0 && dist < 30) {
  20.     motorLeft.move(-200);  // 后退
  21.     motorRight.move(-200);
  22.     delay(500);
  23.     motorLeft.move(150);   // 左转
  24.     motorRight.move(-150);
  25.     delay(300);
  26.   }
  27.   // 正常前进
  28.   else {
  29.     motorLeft.move(300);
  30.     motorRight.move(300);
  31.   }
  32. }
复制代码


要点:
硬件抗干扰:3PWM驱动模式减少电源噪声,超声波测量间隔30ms抑制电磁干扰。
运动解耦:后退与转向动作分离,避免电机指令冲突。
阈值动态校准:30cm阈值需根据实际环境调整,适应不同地面材质。
电机保护:PWM限幅(-200~300)防止电机过流,延长BLDC寿命。
模块化设计:驱动层与控制逻辑分离,便于功能扩展(如添加IMU)。

5、双超声波环向避障


  1. #include <SimpleFOC.h>
  2. #include <NewPing.h>
  3. BLDCMotor motorLeft(7, 1000);
  4. BLDCMotor motorRight(8, 1000);
  5. NewPing sonarFront(12,13,200);
  6. NewPing sonarRear(14,15,200); // 后向超声波
  7. void setup() {
  8.   motorLeft.linkDriver(new BLDCDriver3PWM(3,5,6,11));
  9.   motorRight.linkDriver(new BLDCDriver3PWM(9,10,12,13));
  10.   motorLeft.init(); motorRight.init();
  11. }
  12. void loop() {
  13.   int frontDist = sonarFront.ping_cm();
  14.   int rearDist = sonarRear.ping_cm();
  15.   delay(25); // 25ms控制周期
  16.   
  17.   // 前后障碍物检测逻辑
  18.   if(frontDist < 30 && rearDist < 30) {
  19.     motorLeft.move(0); motorRight.move(0); // 急停
  20.   }
  21.   else if(frontDist < 30) {
  22.     motorLeft.move(-250); motorRight.move(250); // 原地转向避障
  23.   }
  24.   else if(rearDist < 30) {
  25.     motorLeft.move(200); motorRight.move(200); // 后退
  26.   }
  27.   else {
  28.     motorLeft.move(350); motorRight.move(350); // 前进
  29.   }
  30. }
复制代码


要点:
多向感知:前后双超声波实现360°避障,避免单传感器盲区。
运动模式切换:急停/转向/后退多模式协同,提升复杂环境适应性。
控制频率优化:25ms周期匹配BLDC响应特性,避免控制滞后。
电源管理:双超声波分时工作降低功耗,延长续航时间。
故障安全:前后同时检测到障碍物时急停,防止碰撞损坏。

6、PID姿态稳定与路径跟随


  1. #include <SimpleFOC.h>
  2. #include <MPU6050.h>
  3. #include <Kalman.h>
  4. BLDCMotor motorLeft(7, 1000);
  5. BLDCMotor motorRight(8, 1000);
  6. MPU6050 mpu;
  7. Kalman kalman;
  8. // PID参数(需实测整定)
  9. float Kp = 1.2, Ki = 0.05, Kd = 0.1;
  10. float targetAngle = 0; // 保持水平姿态
  11. void setup() {
  12.   motorLeft.linkDriver(new BLDCDriver3PWM(3,5,6,11));
  13.   motorRight.linkDriver(new BLDCDriver3PWM(9,10,12,13));
  14.   motorLeft.init(); motorRight.init();
  15.   mpu.initialize();
  16.   kalman.setAngle(0);
  17. }
  18. void loop() {
  19.   // MPU6050数据读取与卡尔曼滤波
  20.   int16_t ax, ay, az, gx, gy, gz;
  21.   mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
  22.   float angle = kalman.getAngle(atan2(-ay, az)*180/PI, gx/131.0);
  23.   
  24.   // PID控制计算
  25.   float error = targetAngle - angle;
  26.   static float integral = 0, lastError = 0;
  27.   integral = constrain(integral + error*0.02, -100, 100);
  28.   float derivative = (error - lastError)/0.02;
  29.   float output = Kp*error + Ki*integral + Kd*derivative;
  30.   lastError = error;
  31.   
  32.   // 电机差速控制(姿态补偿)
  33.   motorLeft.move(300 + output);
  34.   motorRight.move(300 - output);
  35.   delay(20); // 50Hz控制频率
  36. }
复制代码


要点:
姿态稳定:卡尔曼滤波融合加速度计与陀螺仪数据,抑制振动噪声。
PID参数整定:需通过实验调整Kp/Ki/Kd,避免振荡或响应迟缓。
差速控制:通过左右电机转速差实现姿态补偿,保持底盘稳定。
高频控制:20ms周期匹配IMU数据更新率,实现平滑控制。
电源隔离:IMU供电加π型滤波器,减少电机噪声干扰。



回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 1 小时前

【花雕】6.5 寸轮毂电机自动跟随底盘・超声波最简方案

要点解读总结
(1)传感器融合与抗干扰:
超声波测距需分时触发,避免相互干扰;MPU6050需刚性固定并校准零偏。
电源分区设计(驱动/传感器/控制)减少电机噪声对敏感电路的影响。
(2)运动控制解耦:
避障、转向、前进等动作需明确分离,避免电机指令冲突。
差速控制实现精确转向,减少机械应力,延长轮毂电机寿命。
(3)PID参数整定:
需通过“Ziegler-Nichols法”或实验调整参数,适应不同底盘质量分布。
积分项需限幅防止风扰等持续误差导致电机饱和。
(4)硬件选型与配置:
6.5寸轮毂电机需匹配BLDC驱动器(如VESC),支持闭环控制。
Arduino需外接稳压模块,避免电机启动电流导致电压跌落重启。
(5)安全冗余机制:
急停逻辑需优先于所有运动指令,防止碰撞损坏。
电机PWM限幅与失控保护(如通信丢失时自动停机)提升系统可靠性。

注意,以上案例只是为了拓展思路,仅供参考。它们可能有错误、不适用或者无法编译。您的硬件平台、使用场景和Arduino版本可能影响使用方法的选择。实际编程时,您要根据自己的硬件配置、使用场景和具体需求进行调整,并多次实际测试。您还要正确连接硬件,了解所用传感器和设备的规范和特性。涉及硬件操作的代码,您要在使用前确认引脚和电平等参数的正确性和安全性。

【花雕】6.5 寸轮毂电机自动跟随底盘・超声波最简方案图1

回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2026 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail