Robofun 機器人論壇

標題: 請問有起動2顆COLORPAL的方法嗎? [打印本頁]

作者: a9460620    時間: 2015-10-18 16:59
標題: 請問有起動2顆COLORPAL的方法嗎?
單獨一顆可以用
#include <SoftwareSerial.h>

const int sio =2;           // ColorPAL connected to pin 2
const int unused = 255;         // Non-existant pin # for SoftwareSerial
const int sioBaud = 4800;
const int waitDelay =200;


const int sio2 = 3;            // ColorPAL connected to pin 2
const int unused2 = 255;         // Non-existant pin # for SoftwareSerial
const int sioBaud2 = 7200;
const int waitDelay2 =200;

// Received RGB values from ColorPAL
int red;
int grn;
int blu;


int red2;
int grn2;
int blu2;

// Set up two software serials on the same pin.
SoftwareSerial serin(sio, unused);
SoftwareSerial serout(unused, sio);

SoftwareSerial serin2(sio2, unused2);
SoftwareSerial serout2(unused2, sio2);

void setup() {
  Serial.begin(9600);
  reset();               
  serout.begin(sioBaud);
  pinMode(sio, OUTPUT);
  serout.print("= (00 $ m) !");
  serout.end();              
  serin.begin(sioBaud);            
  pinMode(sio, INPUT);

  reset2();               
  serout2.begin(sioBaud2);
  pinMode(sio2, OUTPUT);
  serout2.print("= (00 $ m) !");
  serout2.end();              
  serin2.begin(sioBaud2);            
  pinMode(sio2, INPUT);


}

void loop() {
  serin2.begin(sioBaud2);   
  serin.begin(sioBaud);   
   readData();
}  

// Reset ColorPAL; see ColorPAL documentation for sequence
void reset() {
  delay(200);
  pinMode(sio, OUTPUT);
  digitalWrite(sio, LOW);
  pinMode(sio, INPUT);
  while (digitalRead(sio) != HIGH);
  pinMode(sio, OUTPUT);
  digitalWrite(sio, LOW);
  delay(80);
  pinMode(sio, INPUT);
  delay(waitDelay);
}
void reset2() {
  delay(200);
  pinMode(sio2, OUTPUT);
  digitalWrite(sio2, LOW);
  pinMode(sio2, INPUT);
  while (digitalRead(sio2) != HIGH);
  pinMode(sio2, OUTPUT);
  digitalWrite(sio2, LOW);
  delay(80);
  pinMode(sio2, INPUT);
  delay(waitDelay2);
}

void readData() {
  char buffer[32];

  if (serin.available() > 0) {
    // Wait for a $ character, then read three 3 digit hex numbers
    buffer[0] = serin.read();
    if (buffer[0] == '$') {
      for(int i = 0; i < 9; i++) {
        while (serin.available() == 0);     // Wait for next input character
        buffer[i] = serin.read();
        if (buffer[i] == '$')               // Return early if $ character encountered
          return;
      }
      parseAndPrint(buffer);
      delay(10);
    }
  }
}

// Parse the hex data into integers
void parseAndPrint(char * data) {
  sscanf (data, "%3x%3x%3x", &red, &grn, &blu);
  sscanf (data, "%3x%3x%3x", &red2, &grn2, &blu2);
  char buffer[32];
  sprintf(buffer, "R%4.4d G%4.4d B%4.4d", red, grn, blu);
  sprintf(buffer, "2R%4.4d 2G%4.4d 2B%4.4d", red2, grn2, blu2);
  Serial.println(buffer);
  serin.end();
   serin2.end();
}

這樣跑起來很慢,求前輩解釋!
作者: 超新手    時間: 2015-10-19 11:04
應該不用一直 BEGIN 吧? 拿掉 serin2.begin(sioBaud2);    和  serin.begin(sioBaud);    試看看
void loop() {
   readData();
}
作者: a9460620    時間: 2015-10-19 15:51
上面的前輩可能沒用過COLORPAL吧?
serin.end();<==因為有用這個(每筆資料傳輸完後關閉)
因為兩個同時後會沒有回傳任何資料
所亦必須一開一關的方式來控制兩顆
但是會很慢,前來詢問有使用過的前輩們
作者: 超新手    時間: 2015-10-19 18:00
本帖最後由 超新手 於 2015-10-19 18:06 編輯

原來那邊有serin.end();
因為原版沒有, 就沒看到
所以那邊也要一起拿掉
我"猜"做法應該是....
因為是 SoftwareSerial 一次只能收一個埠
所以要切換, 但不要用 begin end 切換
而是用 listen, 而且也不應該在 loop 中切換而且在一組收到完整資料後再切(parseAndPrint )
而且 readdata/parseAndPrint 要寫兩組, 一個給 SERIN, 一個給 SERIN2
當一組收完時. 就使用 listen , 切至另一組
unsigned char Toggle;
void setup(void)
{
..........
serin2.stopListening();
serin.listen();
Toggle = 0;
}
void loop()
{
  if(Toggle == 0) {
     readData();
  }
  else {
     readData2();
  }
}

void parseAndPrint(char * data) {
  ....................
  serin.stopListening();
  serin2.listen();
  Toggle = 1;
}
void parseAndPrint2(char * data) {
  ....................
  serin2.stopListening();
  serin.listen();
  Toggle = 0;
}

我亂猜的....
作者: a9460620    時間: 2015-10-20 17:01
感謝前輩的幫助
這樣他們也只讀同一顆......
而且只讀一次......
感覺方向有對,努力中.....
作者: 超新手    時間: 2015-10-20 18:16
讀同一顆?沒有吧? 兩顆都有讀到啊!
會切來切去, 讀無限次吧?
void loop()
{
  if(Toggle == 0) {
     readData();
  }
  else {
     readData2();
  }
}
readData(); 使用serin讀其中一顆, 讀完切到 serin2
readData2();使用serin2讀另外一顆, 讀完切到 serin
readData2 寫法就只是複製readData. 把其中的 serin 改成 serin2 而已




歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/) Powered by Discuz! X3.2