You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

麦克纳姆轮小车360°右旋方向异常问题求助

麦克纳姆轮小车右旋360°反向旋转的问题排查与修复

问题描述

操控搭载4台电机与L298N驱动板的麦克纳姆轮小车时,除右旋360°操作会导致小车反向旋转外,其余方向(如前进)运行均正常。尝试通过子程序实现右旋功能失败,移至主程序调试仍未解决,且单侧车轮反向转动时控制逻辑存在偏差。

相关代码

with MicroBit.IOs;
with MicroBit;
with movement;
procedure Main is
   Speed : constant MicroBit.IOs.Analog_Value := 1023; --between 0 and 1023
   Forward : constant Boolean := True; -- forward is true, backward is false
begin
   --  We set the frequency by setting the period (remember f=1/t).
      MicroBit.IOs.Set_Analog_Period_Us(20000); -- 50 Hz = 1/50 = 0.02s = 20 ms = 20000us 
   --LEFT
   --front   
   MicroBit.IOs.Set(6, Forward); --IN1
   MicroBit.IOs.Set(7, not Forward); --IN2
   
   --back
   MicroBit.IOs.Set(2, Forward); --IN3
   MicroBit.IOs.Set(3, not Forward); --IN4
   
   --RIGHT
   --front
   MicroBit.IOs.Set(12, not Forward); --IN1
   MicroBit.IOs.Set(13, Forward); --IN2

   --back
   MicroBit.IOs.Set(14, not Forward); --IN3
   MicroBit.IOs.Set(15, Forward); --IN4
   
   MicroBit.IOs.Write (0, Speed); --left speed control ENA ENB
   MicroBit.IOs.Write (1, Speed); --right speed control ENA ENB
   loop
      null;
   end loop;    
 
end Main;

问题分析

从前进功能正常的逻辑可以推断:右侧车轮的物理安装方向与左侧相反——右侧电机通过IN1=not Forward, IN2=Forward实现前进(即电机反转对应前进)。而原地右旋(顺时针旋转)的核心逻辑是左侧车轮保持前进方向,右侧车轮切换为后退方向,但当前代码中右侧车轮的引脚状态与前进时完全一致,导致右侧仍保持前进,最终小车反向旋转(左旋)。

修复方案

调整右侧车轮的控制引脚状态,使其切换为后退方向(与左侧车轮引脚状态一致):

procedure Main is
   Speed : constant MicroBit.IOs.Analog_Value := 1023;
   Forward : constant Boolean := True;
begin
   MicroBit.IOs.Set_Analog_Period_Us(20000);
   
   --LEFT 保持前进方向
   MicroBit.IOs.Set(6, Forward);
   MicroBit.IOs.Set(7, not Forward);
   MicroBit.IOs.Set(2, Forward);
   MicroBit.IOs.Set(3, not Forward);
   
   --RIGHT 切换为后退方向(修正右旋逻辑)
   MicroBit.IOs.Set(12, Forward);    -- IN1 改为 Forward
   MicroBit.IOs.Set(13, not Forward);-- IN2 改为 not Forward
   MicroBit.IOs.Set(14, Forward);    -- IN3 改为 Forward
   MicroBit.IOs.Set(15, not Forward);-- IN4 改为 not Forward
   
   MicroBit.IOs.Write(0, Speed);
   MicroBit.IOs.Write(1, Speed);
   loop
      null;
   end loop;    
end Main;

优化建议

将不同运动模式封装为独立子程序,便于维护和调试:

with MicroBit.IOs;
with MicroBit;
package Movement is
   procedure Move_Forward(Speed : MicroBit.IOs.Analog_Value);
   procedure Rotate_Right(Speed : MicroBit.IOs.Analog_Value);
end Movement;

package body Movement is
   Forward : constant Boolean := True;
   
   procedure Move_Forward(Speed : MicroBit.IOs.Analog_Value) is
   begin
      -- LEFT 前进
      MicroBit.IOs.Set(6, Forward);
      MicroBit.IOs.Set(7, not Forward);
      MicroBit.IOs.Set(2, Forward);
      MicroBit.IOs.Set(3, not Forward);
      
      -- RIGHT 前进(与物理安装匹配的反向)
      MicroBit.IOs.Set(12, not Forward);
      MicroBit.IOs.Set(13, Forward);
      MicroBit.IOs.Set(14, not Forward);
      MicroBit.IOs.Set(15, Forward);
      
      MicroBit.IOs.Write(0, Speed);
      MicroBit.IOs.Write(1, Speed);
   end Move_Forward;
   
   procedure Rotate_Right(Speed : MicroBit.IOs.Analog_Value) is
   begin
      -- LEFT 保持前进
      MicroBit.IOs.Set(6, Forward);
      MicroBit.IOs.Set(7, not Forward);
      MicroBit.IOs.Set(2, Forward);
      MicroBit.IOs.Set(3, not Forward);
      
      -- RIGHT 切换为后退
      MicroBit.IOs.Set(12, Forward);
      MicroBit.IOs.Set(13, not Forward);
      MicroBit.IOs.Set(14, Forward);
      MicroBit.IOs.Set(15, not Forward);
      
      MicroBit.IOs.Write(0, Speed);
      MicroBit.IOs.Write(1, Speed);
   end Rotate_Right;
end Movement;

内容的提问来源于stack exchange,提问作者Samuel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 17:20:31