2017-06-23 1 views
0

Je travaille sur un système domotique, dont une partie comprend un Arduino Mega2560 connecté via USB à un RaspberryPi 3 Modèle B. L'Arduino reçoit deux commandes courtes et simples sur la série du Pi; la première commande définit les «régions» des lumières à DEL, et la deuxième définit les couleurs sur les régions précédemment décrites. La syntaxe est la suivante pour les deux commandes, où les éléments entre crochets sont des octets simples, len + off sont 3 octets ascii interprétés comme base-10, et r + g + b sont 2 octets ascii chacun interprété comme hex. La commande jeu de couleurs prend en charge un nombre variable de régions comme le montre:Le tableau global Arduino n'est pas modifié lors de l'accès à la publication en série?

Région Command Set

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

Couleur Set Commande

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

Chaque commande envoie des accusés de réception positifs/négatifs afin que vous penseriez que je Je serais capable de dire ce qui ne va pas, mais je reçois un comportement inattendu lorsque j'essaie de définir des couleurs claires avec la deuxième commande, bien que j'obtienne des accusés de réception comme prévu. Jusqu'à présent, la seule conclusion raisonnable que je peux tirer est que pour le tableau global les régions rejettent les modifications et restent zéro toujours. Par exemple, cet échange entraîne pas de feux allumés (les commentaires ne sont pas dans l'échange réel)

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 

est ici la source dépouillée pour l'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(); 
} 

Je vous remercie des conseils que à ce que je manque ici, et malgré tout, merci d'avoir lu jusqu'ici!

Répondre

0

Cela se produisait parce que j'ai beaucoup de déchets apparaissant sur l'interface série pour l'Arduino que je suis en train de tester. Le ralentissement de la vitesse de transmission jusqu'à 2400 bps résout le problème sur cet appareil. D'autres Arduinos dans le système font bien avec des taux de série beaucoup plus élevés - je soupçonne qu'il y a un problème matériel avec le cristal sur cet Arduino particulier si les vitesses d'horloge ne correspondent pas correctement entre les deux côtés de la connexion série.