C# 串行命令移动 Arduino 伺服 X 度
本文关键字:伺服 Arduino 移动 命令 | 更新日期: 2023-09-27 18:32:50
我有一个Arduino与伺服器连接(引脚9,5.5v和接地),它将在Arduino上进行任何测试时运行;但是,当我发送串行命令来移动它时,没有任何反应。rx灯闪烁,所以我知道Arduino正在获取信息。我认为问题出在我的字节转换中。
代码时间:
Arduino 代码:
#include <Servo.h>
Servo myservo; // create servo object to control a servo
// a maximum of eight servo objects can be created
void setup()
{
myservo.attach(9);
// attaches the servo on pin 9 to the servo object and sets the rotation to 0
myservo.write(0);
}
int pos1= 0;
int pos2= 0;
int pos3= 0;
int totalMove = 0;
void loop()
{
if (Serial.available() > 0 && totalMove > 0)
{
pos1 = Serial.read() - '0';
// pos2 = Serial.read() - '0';
// pos3 = Serial.read() - '0';
// totalMove = ((pos3) + (pos2*10) + pos1*100);
myservo.write(pos1);
}
}
您会看到其他 pos 持有者,因为即使我希望能够发送大于 9 的值,但是现在我只需要让它响应:)
C# 代码:
public void moveServo()
{
if (!serialPort1.IsOpen)
{
Console.WriteLine("Oops");
serialPort1.Open();
return;
}
serialPort1.DtrEnable = true;
serialPort1.DataReceived +=
new System.IO.Ports.SerialDataReceivedEventHandler(
serialPort1_DataReceived);
serialPort1.Write(new byte[] {57}, 0, 1);
}
有什么想法吗?
您是否确保它可以使用其他软件? 这通常是第一步,即使你必须使用超级终端。 这将解决任何电缆问题并为您提供正确的参数。
我也推荐来自SysInternals的PortMon。 它允许您在应用程序运行时监视串行端动。
确保设置了所有串行端口参数;波特率、数据位、停止位、奇偶校验、握手以及读写超时。 还可以设置用于换行符的值。
此外,您可以尝试自己读取它,而不是依赖于接收的数据事件。
您正在发送此字节
serialPort1.Write(new byte[] {57}, 0, 1);
这基本上是角色'9'
。接收方代码为
pos1 = Serial.read() - '0';
这意味着pos1
具有值9
(请注意缺少的'
)。然后,此值将直接写入Servo
实例。
myservo.write(pos1);
将所有部分相加:您可以有效地仅将值 0 到 9 发送到伺服。但参考页面告诉您,write
需要 0 到 180 的范围。仅向伺服发送 0 到 9 可能会稍微摆动一下。
也许是因为你的逻辑水平。
LPT和串行端口输出为2.5V,某些驱动程序需要5V才能设置和重置。
因此,您需要像MAX232这样的IC将逻辑电平从2.5V转换为5V。