1

我有一个 Arduino 与伺服(引脚 9、5.5v 和接地)连接,它将在 Arduino 上运行任何 ol' 测试;但是,当我发送串行命令来移动它时,什么也没有发生。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);
}

有任何想法吗?

4

3 回答 3

1

你确定它可以使用其他软件吗?这通常是第一步,即使您必须使用超级终端。这将摆脱任何电缆问题并为您提供正确的参数。

我还推荐来自SysInternals的 PortMon 。它允许您在应用程序运行时监控串行端口活动。

确保你设置了所有的串口参数;波特率、数据位、停止位、奇偶校验、握手和读写超时。您还可以设置用于换行符的值。

此外,您可以尝试自己阅读,而不是依赖数据接收事件。

于 2012-05-01T12:21:58.677 回答
1

你正在发送这个字节

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 发送到伺服器可能只会稍微摆动它。

于 2012-05-01T20:48:15.880 回答
0

也许是因为你的逻辑水平。

lpt和串口输出为2.5v,有些驱动需要5v来设置和复位。

所以你需要一个像 max232 这样的 ic 将逻辑电平从 2.5v 转换为 5v。

于 2012-07-07T16:55:13.300 回答