Arduino+XBeeでボートをつくる その1

DCモーターのスピード(int speed)と、サーボの角度(int angle)を送りたい。
送るデータの形式は、(a speed : angle e)の繰り返しで、(スタートバイト スピード 区切り文字 サーボ角度 ストップワード) という意味。

送信側

//transmitter program
//produced by shohei aoki

int input0;
int input1;
int speed;
int angle;

void setup(){
  //start serial communication
  Serial.begin(9600);
}

void loop(){
  input0 = analogRead(0);
  input1 = analogRead(1);
  speed = input0;
  angle = map(input1,0, 1023, 0, 179);
  Serial.write("a");
  Serial.write(speed);
  Serial.write(":");
  Serial.write(angle);
  Serial.print("e"); //stop word
  //Serial.println(""); // carriage return
  delay(10);      //wait for 10ms
}

受信側

//receiver program
//produced by shohei aoki

#include <Servo.h>
#include <string.h>

Servo myservo;
char* speed_string;
char* angle_string;
int speed;
int angle;

void setup(){
  //start serial communication
  Serial.begin(9600);
  //D1 is a digital output
  pinMode(1,OUTPUT);
  //D2 is a servo signal pin
  myservo.attach(2);
}

void loop(){
  //array for the data(number and character)
  char str[20];
  recvStr(str);
  speed_string = strtok(str,":");
  angle_string = strtok(NULL,"e");
  speed = atoi(speed_string);
  angle = atoi(angle_string);
  analogWrite(1,speed);//PWM output
  myservo.write(angle); //set the servo angle
  
}

void recvStr(char *buf)
{
  int i = 0;
  char first_c;
  char c;
  while (1) {
    if (Serial.available()) {
      first_c = Serial.read();
      if(first_c == 'a') { //'a' as a start signal      
        c = Serial.read();
        buf[i] = c;
        if (c == 'e') break; // e is a stop word
        i++;
        }
     }  
  }
  buf[i] = 'e';
}