Pages: [1]   Go Down
Author Topic: Making Two Arduinos Talk  (Read 573 times)
0 Members and 1 Guest are viewing this topic.
Batangas, Philippines
Offline Offline
Newbie
*
Karma: 0
Posts: 36
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hello people! I have a problem regarding serial communication between arduinos. I want to control servo motors from the receiving end and then get data from nunchuck from the transmitting end. Prior to this, I successfully controlled LED from RX end with a pushbutton at TX end. But now, I'm sending multiple bytes of data.

here is the TX code:
Code:
void sendData()
{
  int y = 0;
  for(int x=0; x<11; x+=2)
  {
    serial_data[x] = (unsigned char)readings[y];
    Serial.write(serial_data[x]);
    serial_data[x+1] = (unsigned char)(readings[y] >> 8);
    Serial.write(serial_data[x+1]);
    y++;
  }
}

here is RX code:
Code:
void setup()
{
  Serial.begin(9600);
  servo.attach(12);
  pinMode(ledPin, OUTPUT);
  pinMode(ledPin, OUTPUT);
  for(int j=0; j<=6; j++) {
   inData[j] = 0;
   lastIn[j] = 0;
  }
  delay(1000);
}

void loop()
{
  receiveData();
  processMotors();
  delay(10);
}

void receiveData()
{
  int x = 0;
  while( x < 6 )
  {
    if(Serial.available() > 0)
    {
      inData[x] = Serial.read();
      inData[x] = (inData[x] << 8) + Serial.read();
      x++;
    }
  }
}

void processMotors()
{
  if( inData[4] != lastIn[4] )
  {
    if( inData[4] == 1 )
     digitalWrite(ledPin, HIGH);
    else
     digitalWrite(ledPin, LOW);
    
     lastIn[4] = inData[4];
  }
  
  if( inData[5] != lastIn[5] )
  {
    if( inData[5] == 1 )
     digitalWrite(ledPin0, HIGH);
    else
     digitalWrite(ledPin0, LOW);
  }
}

what I get when pressing Z button is the LED for C button blink fast
Logged

0
Online Online
Shannon Member
****
Karma: 216
Posts: 12554
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

The second read in receiveData() may fail.  You need to check that enough bytes are ready before reading I think.

Code:
if (Serial.available() >= 2)
Logged

[ I won't respond to messages, use the forum please ]

Batangas, Philippines
Offline Offline
Newbie
*
Karma: 0
Posts: 36
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
if (Serial.available() >= 2)
Nothing really improved just made the blink faster.

I made some corrections in sendData() (but it still doesn't solve the problem) here's the updated one:
Code:
void sendData()
{
  for(int y=0; y<6; y++)
  {
    serial_dataH = (unsigned char)(readings[y] >> 8);
    serial_dataL = (unsigned char)readings[y];
    Serial.write(serial_dataH);    
    Serial.write(serial_dataL);
    y++;
  }
}

I wonder what order is serial data sent and received
Logged

Batangas, Philippines
Offline Offline
Newbie
*
Karma: 0
Posts: 36
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok, I've worked it out now. Here's the updated code for those encountering the same problem:
Code:
void sendData()
{
  int x=0;
  for(int y=0; y<=7; y+=2)
  {
    serial_data[y] = (unsigned char)(readings[x] >> 8);
    serial_data[y+1] = (unsigned char)readings[x];
    x++;
  }
  serial_data[8] = readings[4];
  serial_data[9] = readings[5];
  
  for(x=0;x<=9;x++)
    Serial.write(serial_data[x]);
}

Code:
void receiveData()
{
  int x = 0;
  int y = 0;
  if( Serial.available() >= 10 )
  {
    for(x=0;x<=9;x++)
      inData[x] = Serial.read();
      
    for(x=0;x<=7;x+=2) {
      controlData[y] = (inData[x] << 8) + inData[x+1];
      y++;
    }
    controlData[4] = inData[8];
    controlData[5] = inData[9];
  }
  
  if(x != 0) processMotors();
}
Logged

Pages: [1]   Go Up
Jump to: