0

私は、シリアル ポート経由で RF 送信機に番号を送信するプロジェクトに取り組んでいます。反対側では、受信機が Arduino に取り付けられています。Visual Basic プログラムは数値を送信し、Arduino プログラムはこれらの数値を受信して​​モーターを制御するために使用します。(モーター用の PWM 信号が必要です) しかし、何らかの理由で、Arduino プログラムが正しい番号を受信して​​いないため、モーターが必要に応じて機能していません。Arduino から PC に番号を送信しようとしましたが、ゴミしか受信しません。これらは、私が使用している送信機と受信機です。

http://www.alldatasheet.com/datasheet-pdf/pdf/344352/KYL/KYL-210.html

送信機と受信機が送信する値のタイプに問題がありますか? それともArduinoプログラムの問題でしょうか?

プログラムは次のとおりです。

int i = 0;

int MLmosfet1_4 = 10;
int MLmosfet2_3 = 12;

int MRmosfet1_4 = 2;
int MRmosfet2_3 = 5;

void setup()
{
  pinMode(MLmosfet1_4, OUTPUT);
  pinMode(MLmosfet2_3, OUTPUT);

  pinMode(MRmosfet1_4, OUTPUT);
  pinMode(MRmosfet2_3, OUTPUT);

  Serial.begin(9600); // This opens serial port 
                      // and sets data rate at 9600 bps
}

void loop()
{
  byte record[2] = {0};
  byte state = 0;
  byte currentState = 0;

  if (Serial.available()) // check if data has been sent from the computer
  {
    state = Serial.read(); // reads the most recent byte (from 0 - 255)

if(i % 2 == 0) // THIS PART CHECKS WERE TO FILL IN ARRAY SO AS TO HAVE MEMORY EFFECT
{
  record[0] = state;
}

else
{
  record[1] = state;
}

if (state>=0 && state <=63) //forward
{
  currentState = state * 4; //0 - 252

  analogWrite(MLmosfet1_4, currentState); //steady 5V 
  analogWrite(MLmosfet2_3, 0); // 0V

  analogWrite(MRmosfet1_4, currentState); //steady 5V 
  analogWrite(MRmosfet2_3, 0); // 0V
}

else if (state>=64 && state<=127) //reverse
{
  currentState = (state-64)*4; //0 - 252

  analogWrite(MLmosfet1_4, 0); // 0V
  analogWrite(MLmosfet2_3, currentState); // steady 5V

  analogWrite(MRmosfet1_4, 0); // 0V
  analogWrite(MRmosfet2_3, currentState); // steady 5V

}

else if(state>=128 && state <=191) //left
{
  currentState = (state - 118); //input will be 10 - 73

  if(i % 2 == 0)
  {
    if (record[1] >=0 && record[1] <=63) //previous action was move forward
    {
      analogWrite(MLmosfet1_4, currentState); //approx 25% duty cycle 
      analogWrite(MLmosfet2_3, 0); // 0V

      analogWrite(MRmosfet1_4, record[1]); //keeps previous forward speed 
      analogWrite(MRmosfet2_3, 0); // 0V
    }

    else //means that previous action was reverse
    {
      analogWrite(MLmosfet1_4, 0); // 0V
      analogWrite(MLmosfet2_3, currentState); // approx 25% duty cycle

      analogWrite(MRmosfet1_4, 0); // 0V
      analogWrite(MRmosfet2_3, record[1]); // keeps previous reverse speed
     }
  }

   else // i  is odd, therefore we have to read from reord[0]

   {
    if (record[0] >=0 && record[0] <=63) //previous action was move forward
    {
      analogWrite(MLmosfet1_4, currentState); //approx 25% duty cycle 
      analogWrite(MLmosfet2_3, 0); // 0V

      analogWrite(MRmosfet1_4, record[0]); //keeps previous forward speed 
      analogWrite(MRmosfet2_3, 0); // 0V
    }

    else //means that previous action was reverse
    {
      analogWrite(MLmosfet1_4, 0); // 0V
      analogWrite(MLmosfet2_3, currentState); // approx 25% duty cycle

      analogWrite(MRmosfet1_4, 0); // 0V
      analogWrite(MRmosfet2_3, record[0]); // keeps previous reverse speed
     }
   }
}

else if(state>=192 && state <=255) //right
{

  currentState = (state - 118); //input will be 10 - 73

  if(i % 2 == 0)
  {
    if (record[1] >=0 && record[1] <=63) //previous action was move forward
    {
      analogWrite(MLmosfet1_4, record[1]); //keeps previous forward speed
      analogWrite(MLmosfet2_3, 0); // 0V

      analogWrite(MRmosfet1_4, currentState); //approx 25% duty cycle   
      analogWrite(MRmosfet2_3, 0); // 0V
    }

    else //means that previous action was reverse
    {
      analogWrite(MLmosfet1_4, 0); // 0V
      analogWrite(MLmosfet2_3, record[1]); // keeps previous reverse speed

      analogWrite(MRmosfet1_4, 0); // 0V
      analogWrite(MRmosfet2_3, currentState); // approx 25% duty cycle 
     }
  }

   else // i  is odd, therefore we have to read from reord[0]
   {
    if (record[0] >=0 && record[0] <=63) //previous action was move forward
    {
      analogWrite(MLmosfet1_4, record[0]); //keeps previous forward speed  
      analogWrite(MLmosfet2_3, 0); // 0V

      analogWrite(MRmosfet1_4, currentState); //approx 25% duty cycle  
      analogWrite(MRmosfet2_3, 0); // 0V
    }

    else //means that previous action was reverse
    {
      analogWrite(MLmosfet1_4, 0); // 0V
      analogWrite(MLmosfet2_3, record[0]); // keeps previous reverse speed

      analogWrite(MRmosfet1_4, 0); // 0V
      analogWrite(MRmosfet2_3, currentState); // approx 25% duty cycle 
    }
   }
}

i++;
  }
}
4

3 に答える 3

0

簡単なプログラムを使用してLEDを点灯させ、モーターコードに問題がないかどうかを確認します。また、あなたはチェックするべきではありませんif (Serial.available() > 0)

于 2012-04-06T07:40:38.217 に答える
0

送信機と受信機をテストするには、一方をPCに接続し(RS232インターフェイスを使用)、もう一方をarduinoピン0 RxおよびTxに接続します(TTLインターフェイスを使用)。接続したら、arduinoを電源に接続し、arduino IDEを開いて、arduinoがCOMポート1(マザーボードのシリアルインターフェイス)に接続するように設定します。例の1つを実行して、それが機能するかどうかを確認してください。

インターフェース方法は非常に無力であり、TTLを使用するarduinoとPCはRS232で動作することに注意してください。データシートによると、ある種のジャンパーで設定する必要があります。

于 2012-04-04T19:42:48.810 に答える
0

最初にコードなしで接続をデバッグします

RF RX と RX の両方を PC に接続し、パテまたはその他の端末を使用して両方のポートに接続し、TX 端末にテキストを入力して、RX 端末に出力される内容を確認します。

これが機能する場合は、RX を arduino に接続し、端末を使用してデータを送信します。arduino が動作している場合は VB にエラーがあり、動作していない場合は arduino コードに問題があります。

ほとんどの場合、これらの RS232 の問題は、ソフトウェアの COM ポートのボー レート設定に関係しています。両側が同じボーレートに設定されていることを確認してください。VB コードを確認して、arduino と同じようにデータレートが 9600 に設定されていることを確認してください。

于 2012-04-05T06:51:43.137 に答える