2017-06-23 4 views
0

私はArduino Mega2560がUSB経由でRaspberryPi 3モデルBに接続されているホームオートメーションシステムに取り組んでいます。 ArduinoはPiから連続して2つの短い、単純なコマンドを受け取ります。最初のコマンドはled lightsの 'regions'を設定し、2番目のコマンドは先に説明した領域の色を設定します。角括弧で囲まれた項目が1バイトで、len + offがベース10として解釈される3つのASCIIバイト、r + g + bがそれぞれ16進数として解釈される2つのASCIIバイトです。カラーセット示すように、コマンドは、地域の可変数をサポートしています:あなたは私だと思いたいのでシリアル経由でアクセスするとArduinoグローバルアレイは変更されませんか?

リージョン設定コマンド

!c[regionId][stripId][len2][len1][len0][off2][off1][off0]\r 

カラーセットコマンド

!b[r1][r0][g1][g0][b1][b0][numRegions][regionId0]([regionId1]...)\r 

各コマンドは、正/負の確認応答を送信します何がうまくいかないのかを知ることができるでしょうが、2番目のコマンドで明るい色を設定しようとすると予期しない動作が起こります。 これまでのところ、唯一の妥当な結論は、グローバル配列の領域は破棄され、常にゼロのままです。私はのように何かアドバイスをいただければと思います

#include "Arduino.h" 
#include "FastLED.h" 
#define WAIT while(!Serial.available()) ;; 

// Forward Declarations 
const int max_strips = 2; 
const int max_strip_length = 300; 
const int max_leds = max_strips * max_strip_length; 
CRGB leds[max_strips][max_strip_length]; 

const int max_regions = 20; 
int regions[max_regions][3]; 

const int baud_rate = 9600; 
unsigned char buffer[64]; 
unsigned char currentByte = 0; 
unsigned char incommingByte; 
unsigned char startChar = '!'; 
unsigned char endChar = '\r'; 
bool store = false; 

// Helper Functions 
void set(CRGB c) { 
    for(int i = 0; i < max_strips; i++) { 
     for(int j = 0; j < max_strip_length; j++) { 
      leds[i][j] = c; 
     } 
    } 
} 

void set(int stripId, int length, int offset, CRGB c) { 
    for(int i = offset; i < offset+length; i++) { 
     leds[stripId][i] = c; 
    } 
} 

void setup() { 
    Serial.begin(baud_rate); 
    for(int i = 0; i < max_strips; i++) { 
     switch(i) { 
      case 0: { 
       FastLED.addLeds<WS2812B, 2, GRB>(leds[0], max_strip_length); 
      } break; 
      case 1: { 
       FastLED.addLeds<WS2812B, 3, GRB>(leds[1], max_strip_length); 
      } break; 
     } 
    } 
    set(CRGB::Black); 
} 

void loop() { 
    if(Serial.available() > 0) { 
     unsigned char incomingByte = Serial.read(); 
     if(incomingByte == startChar) { 
      currentByte = 0; 
      store = true; 
     } 
     if(store) { 
      if(incomingByte == endChar) { 
       buffer[currentByte++] = incomingByte; 
       store = false; 
       switch(buffer[1]) { 
        case 'b': { 
         int red = (buffer[2] - '0')*16 + (buffer[3] - '0'); 
         int green = (buffer[4] - '0')*16 + (buffer[5] - '0'); 
         int blue = (buffer[6] - '0')*16 + (buffer[7] - '0'); 
         int numRegions = buffer[8] - '0'; 

         for(int i = 0; i < numRegions; i++) { 
          int regionId = buffer[9+i] - '0'; 

          if(regionId >= max_regions) { 
           Serial.write('S'); 
           return; 
          } 

          // Never sets anything 
          set(regions[regionId][0], regions[regionId][1], regions[regionId][2], CRGB(red, green, blue)); 
         } 

         Serial.write('O'); 
        } break; 

        case 'c': { 
         int regionId = buffer[2] - '0'; 
         int stripId = buffer[3] - '0'; 
         int length = (buffer[4] - '0')*100 + (buffer[5] - '0')*10 + (buffer[6] -'0'); 
         int offset = (buffer[7] - '0')*100 + (buffer[8] - '0')*10 + (buffer[9] -'0'); 

         if(regionId >= max_regions) { 
          Serial.write('R'); 
          return; 
         } 

         if(stripId >= max_strips) { 
          Serial.write('S'); 
          return; 
         } 

         regions[regionId][0] = stripId; // WE LOSE THESE VALUES?? 
         regions[regionId][1] = length; // ?? 
         regions[regionId][2] = offset; // ?? 

         Serial.write('O'); 

        } break; 

        default: { 
         set(CRGB::Red); 
         Serial.write('X'); 
        } break; 
       } 
       currentByte = 0; 
      }else if(currentByte > 64){ 
       store = false; 
       currentByte = 0; 
      } else { 
       buffer[currentByte++] = incomingByte; 
      } 
     } 
    } 
    FastLED.show(); 
} 

たとえば、点灯ライトなしでこの交換の結果は

Pi sends: !c00144000\r // create regionId 0 on stripId 0; length 144 offset 0 
Pi recieves: O   // positive confirmation? 
Pi sends: !b00009910\r // set regionId 0 to color 0x000099 (blue) 
Pi recieves: O   // positive confirmation, but no lights? 
Pi sends: !x\r   // invalid command; triggers default in switch 
Pi recieves: X   // as expected, all lights turn red 

はここでArduinoのためのストリップダウンソースです(コメントは、実際の交換ではありません)私がここで行方不明になっているものまで、これに関わらず、これまで読んでくれてありがとう!

答えて

0

これは、私がテストしているArduinoのシリアルインターフェイスに多くのゴミが表示されているために発生していました。ボーレートを2400bpsに下げると、このデバイスの問題が解決されます。システムの他のArduinosはずっと高いシリアルレートでうまくいく - 私はこの特定のArduinoの水晶にハードウェアの問題があると思うので、クロック速度がシリアル接続の両側の間で正しく一致しない。

関連する問題