2

私はセンサーリーダー/ギア付きRCカーロボットに取り組んできましたが、何かに行き詰まっています. void loop() と void serialEvent() スコープを導入しました。serialEvent は、値を取得して累積し、turnRight()、turnLeft()、reverseGear() などの他の関数を呼び出します。でも今日は車の速度表示を作ってみました。しかし、シリアル イベントが連続的な表示アニメーションを中断することを発見しました。つまり、serialEvent で連続してデータを受信したいと同時に、void ループで他の連続イベントを成功させたいということです。問題と思われるコード部分を添付します。私はArduino Mega 1280を使用しています。どんな回答でも大歓迎です。ありがとう。

注: serialEvent は、感度調整されたモーターのデータを継続的に (1 秒の遅延で) 受信する必要があることに注意してください。

シリアルイベントのような..

void serialEvent(){
  if ( Serial.available() > 0 ){ 
      int val = Serial.read() - '0'; 
      if(val == 0){ .......................

ループスコープは..

void loop() 
{ 
  displayModule.setDisplayToDecNumber(15, 0, false);
  for(int k =0; k<=7; k++){
    displayModule.setLED(TM1638_COLOR_GREEN, k);
    delay(100);
    ............................
4

3 に答える 3

3

Arduino フォーラムのモットーは常に適用されます。問題があると思われる断片だけでなく、スケッチ全体を投稿すると、支援が容易になります。

とはいえ、ここには深刻な問題があると思います。

for(int k =0; k<=7; k++){
    displayModule.setLED(TM1638_COLOR_GREEN, k);
    delay(100);

サイクルの場合、基本的にスケッチを少なくとも 800 ミリ秒一時停止します。

「マルチタスク」にスケッチしたい場合は、delay() の使用をやめ、考え方をシーケンシャル プログラミングから状態 (またはイベント) ベースのプログラミングに切り替える必要があります。通常のアドバイスは、「Blink without delay」の例を研究することです。

2つ目の注意として、私はあなたが何を意味するのか理解できません

void loop() を導入しました

ループ関数を書かないと、そもそもスケッチはコンパイルされません。

于 2013-03-19T13:05:40.623 に答える
1

これが役立つかどうかはわかりません。これは、受信したシリアル データに基づいて 2 つのバーを描画する、私が作成したシリアル コードの例です。これは処理ファイルですが、Arduino スケッチと同様に機能するはずです。少なくともserialEventという意味では。以前に処理を行ったことがない場合、描画メソッドはループ メソッドに似ています。おそらく、このコードの中にあなたを助ける何かがあるでしょう。

import processing.serial.*;

Serial myPort;
float[] floatArray;
float f1; float f2;

void setup() {
  size(400, 400);
  // Prints lists of serial ports
  println(Serial.list());
  // Usually arduino is port [0], but if not then change it here
  myPort = new Serial(this, Serial.list()[0], 9600);
  // Don't call serialEvent until new line character received
  myPort.bufferUntil('\n');
  // Creates and array of floating decimal numbers and initializes its length to 2
  floatArray = new float[2];
}

void draw() {
  // Draws 2 bars to represent incoming data in patriotic fashion
  background(0, 0, 255);
  fill(255, 0, 0);
  rect(0, f1, 100, height);
  fill(255);
  rect(100, f2, 100, height); 
}

void serialEvent(Serial myPort) {
  // Reads input until it receives a new line character
  String inString = myPort.readStringUntil('\n');
  if (inString != null) {
    // Removes whitespace before and after string
    inString = trim(inString);
    // Parses the data on spaces, converts to floats, and puts each number into the array
    floatArray = float(split(inString, " "));
    // Make sure the array is at least 2 strings long.   
    if (floatArray.length >= 2) {
      // Assign the two numbers to variables so they can be drawn
      f1 = floatArray[0];
      f2 = floatArray[1];
      println(f2);
      // You could do the drawing down here in the serialEvent, but it would be choppy
    }
  } 
}
于 2013-02-21T21:18:18.253 に答える
0

目標を達成するには、シリアル受信割り込みを設定する必要があると思います。

PeterFlueryのAVRシリアルライブラリを次の場所で使用します。

http://homepage.hispeed.ch/peterfleury/avr-software.html

循環リングバッファを使用してシリアル割り込みを実装します。

于 2013-03-06T16:18:57.813 に答える