Mecanum汽车,配有4台发动机



我正试图将一辆mecanum汽车向右旋转360度。该车使用4台电机和L298N驱动器。每隔一个方向都能很好地工作,只有当我试着把车旋转360度时,它才会反向旋转。LEFT是左侧车轮;RIGHT是右侧车轮。这是代码:

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;

起初我试着用程序来做,但没有成功。我试着大体上做了一下,发现这个问题不起作用。奇怪的是,当我让车向前行驶时,它运行得很好;当我出于某种奇怪的原因试图让汽车的一侧朝相反的方向行驶时,控制突然发生在相反的方向。

如果没有实际的硬件进行测试,很难提供帮助,但在谷歌上搜索L298N的数据表和教程表明,速度的最大值可能是255,而不是1023。这可能与你的问题有关吗?

无论如何,我会声明一些类型和辅助程序,并将幻数移出控制逻辑。类似于以下内容:(免责声明:它还没有编译或测试任何这些…(

type Wheel_Pins is
record
Pin1 : Microbit.IOs.Pin_ID; -- IN1 / IN3
Pin2 : Microbit.IOs.Pin_ID; -- IN2 / IN4
end record;


type Sides is (Left, Right);
type Ends is (Front, Back);


type Spin_Direction is (Off, Backward, Forward);

subtype Wheel_Speed is MicroBit.IOs.Analog_Value range 0..255; 

procedure Spin_Wheel( Wheel : Wheel_Pins; Direction : Spin_Direction) is
function Low return Boolean renames False;
function High return Boolean renames True;
begin
case Direction is
when Off =>
Microbit.IOs.Set(Wheel.Pin1, Low);
Microbit.IOs.Set(Wheel.Pin2, Low);
when Backward =>
Microbit.IOs.Set(Wheel.Pin1, Low);
Microbit.IOs.Set(Wheel.Pin2, High);
when Forward =>
Microbit.IOs.Set(Wheel.Pin1, High);
Microbit.IOs.Set(Wheel.Pin2, Low);
end case;
end Spin_Wheel;


procedure Set_Speed(Speed : Wheel_Speed; Vehicle_Side : Sides) is
To_Analog_Value : constant array(Sides'Range)  --'
of Microbit.IOs.Pin_ID := (Left => 0, Right => 1);
begin
MicroBit.IOs.Write (To_Analog_Value(Vehicle_Side), Speed);
end Set_Speed;

procedure Stop_All_Wheels is
begin
for Wheel of Wheels'Range loop
Spin_Wheel(Wheel, Off);
end loop;
end Stop_All_Wheels;

然后引脚号可以是"0";隐藏的";像这样:

Wheels : constant array(Ends, Sides) of Wheel_Pins := 
(Front => (Left => Wheel_Pins'                                   --'
(Pin1 => 6, 
Pin2 => 7), 
Right => Wheel_Pins'                                  --'
(Pin1 => 12, 
Pin2 => 13)), 
Back => (Left => Wheel_Pins'                                    --'
(Pin1 => 2, 
Pin2 => 3), 
Right => Wheel_Pins'                                   --'
(Pin1 => 14, 
Pin2 => 15)));

然后,在组合车轮之前,我会单独测试每个车轮,以确保代码按预期工作:

Stop_All_Wheels;

Set_Speed(Left, 60);
Set_Speed(Right, 60);
-- test all wheels, both forward, backward and off,
-- in the following order: front-left, front-right, rear-left, rear-right
for Vehicle_Side in Wheel'Range(2) loop
for Vehicle_End in Wheels'Range(1) loop
for Direction in reverse Spin_Direction'Range loop
Spin_Wheel(Wheels(Vehicle_End, Vehicle_Side), Direction);
delay 2.0;
end loop;
end loop;
end loop;

-- test two wheels at a time:
for Direction in reverse Spin_Direction'Range loop
for Vehicle_End in Wheels'Range loop
Spin_Wheel(Wheels(Vehicle_End, Left), Direction);
end loop;
delay 2.0;
end loop;

-- test rotation clockwise
Spin_Wheel(Wheels(Front, Left), Forward);
Spin_Wheel(Wheels(Back, Left), Forward);
Spin_Wheel(Wheels(Front, Right), Backward);
Spin_Wheel(Wheels(Back, Right), Backward);
delay 2.0;
Stop_All_Wheels; 

-- test rotation counter-clockwise
Spin_Wheel(Wheels(Front, Left), Backward);
Spin_Wheel(Wheels(Back, Left), Backward);
Spin_Wheel(Wheels(Front, Right), Forward);
Spin_Wheel(Wheels(Back, Right), Forward);
delay 2.0;
Stop_All_Wheels; 

-- test speed settings   
for Wheel of Wheels'Range loop
Spin_Wheel(Wheel, Forward);
end loop;
Speed_Up: for Speed in Wheel_Speed'Range loop
Set_Speed(Left, Speed);
Set_Speed(Right, Speed);
delay 0.01;
end loop Speed_Up;

delay 1.0;

Speed_Down: for Speed in reverse Wheel_Speed'Range loop
Set_Speed(Left, Speed);
Set_Speed(Right, Speed);
end loop Speed_Down;

相关内容

最新更新