2012-05-01 5 views
1

私はサーボ(ピン9、5.5vとグラウンド)で配線されたArduinoを持っています、それはArduino上の任意のオールのテストで実行されます。しかし、シリアルコマンドを送信して移動すると、何も起こりません。 rxのライトが点滅するので、私はArduinoが情報を得ていることを知っています。私は問題が私のバイト変換にあると思う。ArduinoサーボX度を移動するC#シリアルコマンド?

コード時間:

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); 
    } 
} 

evenutally私は9よりも大きな値を送信できるようにしたい、しかし、今の私は取得する必要があるので、あなたは他のPOS者を参照してくださいそれは、対応する:)

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); 
} 

任意のアイデア?

+2

http://arduino.cc/playground/Learning/SingleServoExample –

+0

C#コードで 'serialPort1'オブジェクトをどのようにインスタンス化して初期化しますか? –

+0

serialPort1 =新しいSystem.IO.Ports.SerialPort(コンポーネント)。 serialPort1.PortName = "COM4"; serialPort1.BaudRate = 9600; serialPort1。開いた(); このように –

答えて

1

他のソフトウェアを使用していることを確認しましたか?これは通常、ハイパーターミナルを使用する必要がある場合でも、最初のステップです。それはケーブルの問題を揺らし、あなたに正しいパラメータを与えます。

また、SysInternalsのPortMonもお勧めします。アプリケーションの実行中にシリアルポートのアクティビティを監視できます。

すべてのシリアルポートパラメータを設定していることを確認してください。ボー・レート、データ・ビット、ストップ・ビット、パリティ、ハンドシェーク、リード・ライト・タイムアウトがあります。 NewLine文字に使用する値を設定することもできます。

また、データ受信イベントに頼るのではなく、自分でそれを試してみることもできます。

+0

ありがとうございます。しかし、接続は正常に行われており、ボードはデータを受信して​​います(RXライトはC#アプリで設定された1秒間隔で点滅します)ので問題ありません。私はかなり問題がint ---> Byte ---> intからのバイト変換にあると確信しています。 –

1

あなたは基本的に文字'9'がある

serialPort1.Write(new byte[] {57}, 0, 1); 

このバイトを送っています。受信コードはpos1が(欠落'に注意)の値9を有することを意味する

pos1 = Serial.read() - '0'; 

あります。この値は、Servoインスタンスに直接書き込まれます。

myservo.write(pos1); 

すべての部分を合計する:0〜9の値のみを効果的にサーボに送信できます。しかし、reference pageは、writeには0〜180の範囲が必要であることを伝えます。サーボに0〜9を送信するだけでちょっと動揺するかもしれません。

0

多分それはあなたのロジックレベルのためです。

lptとシリアルポートの出力は2.5vで、ドライバの設定とリセットには5vが必要です。

したがって、ロジックレベルを2.5Vから5Vに変換するにはmax232のようなICが必要です。

関連する問題