2017-06-23 36 views
0

我正在家庭自動化系統上,包括阿爾杜伊諾Mega2560通過USB連接到一個樹莓派3模型B。 Arduino通過Pi的串行接收兩個簡短的命令;第一個命令設置led燈的「區域」,第二個命令設置前面所述區域的顏色。兩個命令的語法如下,其中括號內的項目是單個字節,len + off是3個ascii字節解釋爲base-10,r + g + b是2個ascii字節,每個解釋爲十六進制。顏色設置命令支持如圖所示的區域的可變數目:通過串行訪問時,Arduino全局數組未被修改?一個其中一部分

地區設置命令

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

顏色設置命令

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

每一個指令發送正/負確認,所以你會覺得我能夠告訴發生了什麼問題,但是當我嘗試使用第二個命令設置淺色時,我會發現意外的行爲,但是,儘管得到了預期的確認。 到目前爲止,我可以得出的唯一合理結論是,對於全球陣列區域丟棄更改並始終保持爲零。例如,在沒有燈光這種交換的結果亮起(註釋都沒有在實際的交換)

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的剝離下來來源:

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

我會很感激任何意見,到我在這裏想念的東西,無論如何,感謝您閱讀這些!

回答

0

這是因爲我在測試的Arduino的串行接口上​​出現大量垃圾。將波特率降低至2400bps可解決此設備上的問題。系統中的其他Arduinos可以提供更高的串行速率 - 我懷疑這個特定的Arduino上的晶振存在硬件問題,所以時鐘速度在串行連接的兩端之間無法正確匹配。

相關問題