Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: HMC6352 PID mbed
Revision 0:e9b97faa3e37, committed 2013-06-17
- Comitter:
- akudohune
- Date:
- Mon Jun 17 00:12:40 2013 +0000
- Commit message:
- zaaa
Changed in this revision
diff -r 000000000000 -r e9b97faa3e37 HMC6352.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/HMC6352.lib Mon Jun 17 00:12:40 2013 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/aberk/code/HMC6352/#83c0cb554099
diff -r 000000000000 -r e9b97faa3e37 PID.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PID.lib Mon Jun 17 00:12:40 2013 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/aberk/code/PID/#6e12a3e5af19
diff -r 000000000000 -r e9b97faa3e37 main.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Mon Jun 17 00:12:40 2013 +0000
@@ -0,0 +1,565 @@
+#include <math.h>
+#include <sstream>
+#include "mbed.h"
+#include "HMC6352.h"
+#include "PID.h"
+#include "main.h"
+
+
+
+void PidUpdate()
+{
+ static uint8_t Fflag = 0;
+
+ pid.setSetPoint(((int)((REFERENCE + standTu) + 360) % 360) / 1.0);
+ inputPID = (((int)(compass.sample() - (standard * 10.0) + 5400.0) % 3600) / 10.0);
+
+ //pc.printf("%f\n",timer1.read());
+ pid.setProcessValue(inputPID);
+ //timer1.reset();
+
+ compassPID = -(pid.compute());
+
+ if(!Fflag){
+ Fflag = 1;
+ compassPID = 0;
+ }
+ //pc.printf("%d\t%d\t%d\n",speed[0],speed[1],speed[2]);
+ //pc.printf("standard = \t\t%f\n",standard);
+ //pc.printf("%d\n",diff);
+ //pc.printf("compass.sample = \t%f\n",compass.sample() / 1.0);
+ //pc.printf("compassPID = \t\t%d\n",(int)compassPID);
+ //pc.printf("inputPID = \t\t%f\n\n",inputPID);
+
+ //pc.printf("%d\t%d\n",Distance,direction);
+ //pc.printf("%d\t%d\t%d\t%d\n",ultrasonicVal[0],ultrasonicVal[1],ultrasonicVal[2],ultrasonicVal[3]);
+}
+
+void IrDistanceUpdate()
+{
+ for(uint8_t i = 0;i < 6;i++)
+ {
+ AnalogIn adcIn(adc_num[i]); /* 今回更新する赤外線の個体を呼び出す */
+ irDistance[i] = adcIn.read_u16() >> 4;
+ //pc.printf("%d\n",irDistance[0]);
+ }
+}
+
+
+void move(int vxx, int vyy, int vss)
+{
+ double motVal[MOT_NUM] = {0};
+
+ motVal[0] = (double)(((-0.5 * vxx) - ((sqrt(3.0) / 2.0) * vyy) + (Long * vss)) * MOT1);
+ motVal[1] = (double)(((-0.5 * vxx) + ((sqrt(3.0) / 2.0) * vyy) + (Long * vss)) * MOT2);
+ motVal[2] = (double)(((1.0 * vxx) + (0.0 * vyy) + (Long * vss)) * MOT3);
+
+ for(uint8_t i = 0 ; i < MOT_NUM ; i++){
+ if(motVal[i] > MAX_POW)motVal[i] = MAX_POW;
+ else if(motVal[i] < MIN_POW)motVal[i] = MIN_POW;
+ speed[i] = (int)motVal[i];
+ }
+}
+
+int vector(double Amp,double degree,int xy)
+{
+ double result;
+
+ if(xy == X){
+ result = Amp * cos(degree * PI / 180.0);
+ }else if(xy == Y){
+ result = Amp * sin(degree * PI / 180.0) * (2.0 / sqrt(3.0));
+ }
+
+ return (int)result;
+}
+
+/*********** Serial interrupt ***********/
+
+void Tx_interrupt()
+{
+ array(speed[0],speed[1],speed[2],speed[3]);
+ driver.printf("%s",StringFIN.c_str());
+ //pc.printf("%s",StringFIN.c_str());
+}
+/*
+void Rx_interrupt()
+{
+ if(driver.readable()){
+ //pc.printf("%d\n",driver.getc());
+ }
+}*/
+
+
+/*********** Serial interrupt **********/
+
+
+void init()
+{
+ int scanfSuccess;
+ int printfSuccess;
+ int closeSuccess;
+ int close2Success;
+ uint8_t MissFlag = 0;
+ FILE *fp;
+
+ compass.setOpMode(HMC6352_CONTINUOUS, 1, 20);
+
+ StartButton.mode(PullUp);
+ CalibEnterButton.mode(PullUp);
+ CalibExitButton.mode(PullUp);
+ EEPROMButton.mode(PullUp);
+
+ driver.baud(BAUD_RATE);
+ device2.baud(BAUD_RATE2);
+ wait_ms(MOTDRIVER_WAIT);
+ driver.printf("1F0002F0003F0004F000\r\n");
+ device2.printf("START");
+
+ driver.attach(&Tx_interrupt, Serial::TxIrq);
+ //driver.attach(&Rx_interrupt, Serial::RxIrq);
+ device2.attach(&dev_rx,Serial::RxIrq);
+ device2.attach(&dev_tx,Serial::TxIrq);
+
+ pid.setInputLimits(MINIMUM,MAXIMUM);
+ pid.setOutputLimits(-OUT_LIMIT, OUT_LIMIT);
+ pid.setBias(PID_BIAS);
+ pid.setMode(AUTO_MODE);
+ pid.setSetPoint(REFERENCE);
+
+ irDistanceUpdata.attach(&IrDistanceUpdate, 0.1);
+
+ Survtimer.start();
+
+ mbedleds = 1;
+
+ while(StartButton){
+ MissFlag = 0;
+ if(!CalibEnterButton){
+ mbedleds = 2;
+ compass.setCalibrationMode(ENTER);
+ while(CalibExitButton);
+ compass.setCalibrationMode(EXIT);
+ wait(BUT_WAIT);
+ mbedleds = 4;
+ }
+
+ if(!EEPROMButton){
+ Survtimer.reset();
+ fp = fopen("/local/out.txt", "r");
+ if(fp == NULL){
+ wait(BUT_WAIT);
+ MissFlag = 1;
+ }else{
+ scanfSuccess = fscanf(fp, "%lf",&standard);
+ if(scanfSuccess == EOF){
+ wait(BUT_WAIT);
+ MissFlag = 1;
+ }else{
+ closeSuccess = fclose(fp);
+ if(closeSuccess == EOF){
+ wait(BUT_WAIT);
+ MissFlag = 1;
+ }else{
+ wait(BUT_WAIT);
+ }
+ }
+ }
+ if((Survtimer.read() > (BUT_WAIT + 0.1)) || (MissFlag)){
+ for(uint8_t i = 0;i < 2;i++){
+ mbedleds = 15;
+ wait(0.1);
+ mbedleds = 0;
+ wait(0.1);
+ }
+ mbedleds = 15;
+ }else{
+ mbedleds = 8;
+ }
+ }
+
+ if(!CalibExitButton){
+ Survtimer.reset();
+
+ standard = compass.sample() / 10.0;
+
+ fp = fopen("/local/out.txt", "w");
+ if(fp == NULL){
+ wait(BUT_WAIT);
+ MissFlag = 1;
+ }else{
+ printfSuccess = fprintf(fp, "%f",standard);
+ if(printfSuccess == EOF){
+ wait(BUT_WAIT);
+ MissFlag = 1;
+ }else{
+ close2Success = fclose(fp);
+ if(close2Success == EOF){
+ wait(BUT_WAIT);
+ MissFlag = 1;
+ }else{
+ wait(BUT_WAIT);
+ }
+ }
+ }
+ if((Survtimer.read() > (BUT_WAIT + 0.2)) || (MissFlag)){
+ for(uint8_t i = 0;i < 4;i++){
+ mbedleds = 15;
+ wait(0.1);
+ mbedleds = 0;
+ wait(0.1);
+ }
+ mbedleds = 15;
+ }else{
+ mbedleds = 10;
+ }
+ }
+ }
+
+ mbedleds = 0;
+
+ Survtimer.stop();
+
+ for(uint8_t i = 0;i < 6;i++)
+ {
+ stand[i] = irDistance[i];
+ }
+ irDistanceUpdata.detach();
+
+ pidUpdata.attach(&PidUpdate, PID_CYCLE);
+ //irDistanceUpdata.attach(&IrDistanceUpdate, 0.1);
+ //timer1.start();
+}
+
+int main()
+{
+ int vx=0,vy=0,vs=0;
+ uint8_t whiteFlag = 0;
+
+ init();
+
+ while(1){
+ whiteFlag = 0;
+ hold_flag = 0;
+ vx = 0;
+ vy = 0;
+ vs = (int)compassPID;
+ //vs = 0;
+
+ //move(vx,vy,vs);
+
+ /*********************************************************************************************************
+ **********************************************************************************************************
+ ********************Change state *************************************************************************
+ **********************************************************************************************************
+ *********************************************************************************************************/
+ for(uint8_t i = 0;i < 6;i++)
+ {
+ AnalogIn adcIn(adc_num[i]); /* 今回更新する赤外線の個体を呼び出す */
+ irDistance[i] = ((adcIn.read_u16() >> 4) - stand[i]);
+ if(irDistance[i] >= 100)
+ {
+ whiteFlag = 1;
+ }
+ //pc.printf("%d\n",irDistance[0]);
+ }
+
+ if(lineState == NORMAL){
+ if((LEFT_SONIC < 350) && (whiteFlag)){
+ lineState = LEFT_OUT;
+ }else if((RIGHT_SONIC < 350) && (whiteFlag)){
+ lineState = RIGHT_OUT;
+ }else if((FRONT_SONIC < 400) && (whiteFlag)){
+ lineState = FRONT_OUT;
+ }else if((BACK_SONIC < 400) && (whiteFlag)){
+ lineState = BACK_OUT;
+ }
+ }else if(lineState == LEFT_OUT){
+ if((LEFT_SONIC > 450) && (!whiteFlag)){
+ lineState = NORMAL;
+ }
+ }else if(lineState == RIGHT_OUT){
+ if((RIGHT_SONIC > 450) && (!whiteFlag)){
+ lineState = NORMAL;
+ }
+ }else if(lineState == FRONT_OUT){
+ if((FRONT_SONIC > 500) && (!whiteFlag)){
+ lineState = NORMAL;
+ }
+ }else if(lineState == BACK_OUT){
+ if((BACK_SONIC > 500) && (!whiteFlag)){
+ lineState = NORMAL;
+ }
+ }
+
+
+ if(state == HOLD){
+ if(FRONT_SONIC < 100)hold_flag = 1;
+
+ if(Distance > 140){ //審判のボール持ち上げ判定
+ state = HOME_WAIT;
+ }else if(!((direction == 0) || (direction == 15) || (direction == 1) || (direction == 14) || (direction == 2))){//ボールを見失った
+ state = DIFFENCE;
+ }else if(!(Distance <= 40)){//ボールを見失った
+ state = DIFFENCE;
+ }
+ }else{
+ standTu = 0;
+ if(state == DIFFENCE){
+ if((direction == 0) && (Distance <= 30) && (IR_found) && (!xbee)){
+ state = HOLD;
+ }else if((Distance < 180) && (IR_found) && (!xbee)){
+ state = DIFFENCE;
+ }else{
+ if((direction == 4) || (direction == 6) || (direction == 8) || (direction == 10)|| (direction == 12)){
+ if((IR_found) && (!xbee)){
+ state = DIFFENCE;
+ }
+ }else if((diff > 15) && (!xbee) && (IR_found)){
+ state = DIFFENCE;
+ }else{
+ state = HOME_WAIT;
+ }
+ }
+
+ }else{
+ if((direction == 0) && (Distance <= 30) && (IR_found) && (!xbee)){
+ state = HOLD;
+ }else if((Distance <= 150) && (IR_found) && (!xbee)){
+ state = DIFFENCE;
+ }else{
+ if((direction == 4) || (direction == 6) || (direction == 8) || (direction == 10)|| (direction == 12)){
+ if((IR_found) && (!xbee)){
+ state = DIFFENCE;
+ }
+ }else if((diff > 15) && (!xbee) && (IR_found)){
+ state = DIFFENCE;
+ }else{
+ state = HOME_WAIT;
+ }
+ }
+ }
+ }
+ /**/
+ /*********************************************************************************************************
+ **********************************************************************************************************
+ ********************Change state *************************************************************************
+ **********************************************************************************************************
+ *********************************************************************************************************/
+
+ //state = HOME_WAIT;
+ if(state == HOME_WAIT){
+ mbedleds = 0;
+ /*
+ if(((RIGHT_SONIC + LEFT_SONIC) < 1650.0) && ((RIGHT_SONIC + LEFT_SONIC) > 1200.0)){
+ if((LEFT_SONIC > 600.0) && (RIGHT_SONIC > 600.0)){
+ vx = 0;
+ }else if(RIGHT_SONIC < 600.0){
+ vx = (int)((RIGHT_SONIC - 600.0) * 0.05 - 5.0);
+ if(vx < -30)vx = -30;
+ }else if(LEFT_SONIC < 600.0){
+ vx = (int)((600.0 - LEFT_SONIC ) * 0.05 + 5.0);
+ if(vx > 30)vx = 30;
+ }
+ if((BACK_SONIC > 95.0) && (BACK_SONIC < 125.0)){
+ vy = 0;
+ }else if((BACK_SONIC <= 95.0) || (BACK_SONIC == PING_ERROR)){
+ vy = 5;
+ }else{
+ vy = (int)(0.04 * (110.0 - BACK_SONIC) - 5.0);
+ if(vy < -40)vy = -40;
+ }
+ }else if((RIGHT_SONIC + LEFT_SONIC) <= 1200.0){
+ if(BACK_SONIC < 200.0){
+ if(RIGHT_SONIC > LEFT_SONIC){
+ vx = 15;
+ vy = 15;
+ }else{
+ vx = -15;
+ vy = 15;
+ }
+ }else{
+ vx = 0;
+ vy = -30;
+ }
+ }else{
+ if(BACK_SONIC > 500.0){
+ if(RIGHT_SONIC > LEFT_SONIC){
+ vx = 10;
+ vy = -20;
+ }else{
+ vx = -10;
+ vy = -20;
+ }
+ }
+ }
+ */
+ }else if(state == DIFFENCE){
+ mbedleds = 1;
+ if((direction == 6) || (direction == 4)){
+ vx = 10;
+ vy = -30;
+ /*
+ if(LEFT_SONIC < 330.0){
+ if((BACK_SONIC > 15.0) && (BACK_SONIC < 45.0)){
+ vy = 0;
+ }else if((BACK_SONIC <= 15.0) || (BACK_SONIC == PING_ERROR)){
+ vy = 5;
+ }else{
+ vy = (int)(0.015 * (30.0 - BACK_SONIC) - 4);
+ if(vy < -10)vy = -10;
+ }
+ }else if(RIGHT_SONIC < 330.0){
+ vx = 10;
+ vy = -10;
+ }else{
+ if((BACK_SONIC > 95.0) && (BACK_SONIC < 125.0)){
+ vy = 0;
+ }else if((BACK_SONIC <= 95.0) || (BACK_SONIC == PING_ERROR)){
+ vy = 5;
+ }else{
+ vy = (int)(0.015 * (110.0 - BACK_SONIC) - 4);
+ if(vy < -10)vy = -10;
+ }
+ }
+ */
+ }else if((direction == 10) || (direction == 12)){
+ vx = -10;
+ vy = -30;
+ /*
+ if(RIGHT_SONIC < 330.0){
+ if((BACK_SONIC > 15.0) && (BACK_SONIC < 45.0)){
+ vy = 0;
+ }else if((BACK_SONIC <= 15.0) || (BACK_SONIC == PING_ERROR)){
+ vy = 5;
+ }else{
+ vy = (int)(0.015 * (30.0 - BACK_SONIC) - 4);
+ if(vy < -10)vy = -10;
+ }
+ }else if(LEFT_SONIC < 330.0){
+ vx = -10;
+ vy = -10;
+ }else{
+ if((BACK_SONIC > 95.0) && (BACK_SONIC < 125.0)){
+ vy = 0;
+ }else if((BACK_SONIC <= 95.0) || (BACK_SONIC == PING_ERROR)){
+ vy = 5;
+ }else{
+ vy = (int)(0.015 * (110.0 - BACK_SONIC) - 4);
+ if(vy < -10)vy = -10;
+ }
+ }
+ */
+ }else if(direction == 8){
+
+ if(LEFT_SONIC > RIGHT_SONIC){
+ vx = -10;
+ }else{
+ vx = 10;
+ }
+ vy = -40;
+ /*
+ if((RIGHT_SONIC < 330.0) || (LEFT_SONIC < 330.0)){
+ if(BACK_SONIC < 45.0){
+ vy = -5;
+ }else{
+ vy = (int)(0.015 * (30.0 - BACK_SONIC) - 4);
+ if(vy < -10)vy = -10;
+ }
+ }else{
+ if(BACK_SONIC < 125.0){
+ vy = -5;
+ }else{
+ vy = (int)(0.015 * (110.0 - BACK_SONIC) - 4);
+ if(vy < -10)vy = -10;
+ }
+ }
+ */
+ }else if(direction == 2){
+
+ vx = 10;
+ vy = 5; //0
+
+ }else if(direction == 14){
+
+ vx = -10;
+ vy = 5; //-4
+
+ }else if(direction == 1){
+
+
+ vx = 5;
+ vy = 5; //0
+
+
+ }else if(direction == 15){
+
+ vx = -5;
+ vy = 5; //-3
+
+ }else if(direction == 0){
+
+ vx = 0;
+ vy = 30;
+
+ }else{//error
+
+ vx = 0;
+ vy = 0;
+
+ }
+ }else if(state == HOLD){
+ mbedleds = 15;
+ vx = 0;
+ vy = 40;
+ /*
+ if((FRONT_SONIC < 100) && (BACK_SONIC > 1300)){
+ if(RIGHT_SONIC < LEFT_SONIC){
+ vy = 0;
+ vx = 0;
+ vs = 3;
+ }else{
+ vy = 0;
+ vx = 0;
+ vs = -3;
+ }
+ }else{
+ if(((RIGHT_SONIC + LEFT_SONIC) < 1100.0) && ((RIGHT_SONIC + LEFT_SONIC) > 800.0)){
+ standTu = (RIGHT_SONIC - LEFT_SONIC) / 25.0;
+ }
+ }
+ */
+ }
+
+ if(lineState == NORMAL){
+ //mbedleds = 1;
+
+ }else if(lineState == LEFT_OUT){
+ //mbedleds = 2;
+
+ vx = 40;
+ }else if(lineState == RIGHT_OUT){
+ //mbedleds = 4;
+
+ vx = -40;
+ }else if(lineState == FRONT_OUT){
+ //mbedleds = 8;
+
+ vy = -40;
+ }else if(lineState == BACK_OUT){
+ //mbedleds = 12;
+
+ vy = 40;
+ }
+ //vx = vector(10,45,X);
+ //vy = vector(10,45,Y);
+ //vx = 40;
+ //vy = 0;
+ //pc.printf("%d\t%d\n",vx,vy);
+
+ //vy = -50;
+ //vx = 10;
+
+ move(vx,vy,vs);
+ }
+}
\ No newline at end of file
diff -r 000000000000 -r e9b97faa3e37 main.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.h Mon Jun 17 00:12:40 2013 +0000
@@ -0,0 +1,118 @@
+
+
+#define RATE 0.052
+#define Long 1.0
+#define ENTER 0
+#define EXIT 1
+#define X 0
+#define Y 1
+#define MOT_NUM 4
+#define MOTDRIVER_WAIT 300 //ms
+#define BAUD_RATE 115200
+#define BAUD_RATE2 19200
+#define BUT_WAIT 0.3 //s
+#define ON 1
+#define OFF 0
+
+#define PING_ERROR 0xFFFF
+#define PI 3.14159265
+
+#define MOT1 1.0
+#define MOT2 1.0
+#define MOT3 1.0
+#define MOT4 1.0
+
+#define PID_BIAS 0.0
+#define REFERENCE 180.0
+#define MINIMUM 0.0
+#define MAXIMUM 360.0
+
+#define PID_CYCLE 0.06 //s
+
+#define P_GAIN 0.80 //0.78
+#define I_GAIN 0.0 //0.0
+#define D_GAIN 0.0095 //0.009
+
+#define OUT_LIMIT 40.0
+#define MAX_POW 100
+#define MIN_POW -100
+
+DigitalOut led1(LED1);
+DigitalOut led2(LED2);
+DigitalOut led3(LED3);
+DigitalOut led4(LED4);
+BusOut mbedleds(LED4,LED3,LED2,LED1);
+HMC6352 compass(p9, p10);
+Serial driver(p28, p27); // tx, rx
+Serial device2(p13, p14); // tx, rx
+Serial pc(USBTX, USBRX); // tx, rx
+DigitalIn StartButton(p21);
+DigitalIn CalibEnterButton(p22);
+DigitalIn CalibExitButton(p23);
+DigitalIn EEPROMButton(p24);
+PID pid(P_GAIN,I_GAIN,D_GAIN, RATE); //battery is low power version 30.0 0.58 1.0 0.015 battery is high power version 30.0 0.42, 1.0, 0.013 power is low but perfect 20.0 0.45, 0.0, 0.010
+Ticker pidUpdata;
+Ticker irDistanceUpdata;
+Timer timer1;
+Timer Survtimer;
+LocalFileSystem local("local"); // マウントポイントを定義(ディレクトリパスになる)
+
+enum{
+ NORMAL,
+ LEFT_OUT,
+ RIGHT_OUT,
+ FRONT_OUT,
+ BACK_OUT,
+};
+
+enum{
+ HOME_WAIT,
+ DIFFENCE,
+ WARNING,
+ HOLD,
+};
+
+PinName adc_num[6] = {
+ p15,
+ p16,
+ p17,
+ p18,
+ p19,
+ p20,
+};
+double standTu = 0;
+int speed[MOT_NUM] = {0};
+uint8_t hold_flag = 0;
+uint8_t state = HOME_WAIT;
+uint8_t lineState = NORMAL;
+
+double inputPID = 180.0;
+static double standard;
+double compassPID = 0.0;
+
+extern int diff;
+
+extern string StringFIN;
+
+extern uint8_t direction;
+extern uint8_t Distance;
+extern uint8_t IR_found;
+extern uint8_t xbee;
+extern int irDistance[6];
+
+extern void array(int,int,int,int);
+
+extern void dev_rx(void);
+extern void dev_tx(void);
+
+extern uint16_t ultrasonicVal[4];
+
+int stand[6];
+uint8_t compFlag = 0;
+
+#define FRONT_SONIC ultrasonicVal[0]
+#define BACK_SONIC ultrasonicVal[2]
+#define RIGHT_SONIC ultrasonicVal[1]
+#define LEFT_SONIC ultrasonicVal[3]
+
+
diff -r 000000000000 -r e9b97faa3e37 mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Mon Jun 17 00:12:40 2013 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/b3110cd2dd17 \ No newline at end of file
diff -r 000000000000 -r e9b97faa3e37 uart1.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uart1.cpp Mon Jun 17 00:12:40 2013 +0000
@@ -0,0 +1,108 @@
+
+#include "mbed.h"
+#include "uart1.h"
+#include "HMC6352.h"
+
+//extern Serial pc;
+extern Serial device2;
+extern HMC6352 compass;
+extern BusOut mbedleds;
+extern DigitalOut led1;
+extern DigitalOut led2;
+extern DigitalOut led3;
+extern DigitalOut led4;
+
+extern uint8_t state;
+extern uint8_t hold_flag;
+
+int diff;
+uint16_t ultrasonicVal[4];
+uint8_t direction;
+uint8_t Distance;
+uint8_t IR_found;
+uint8_t xbee;
+int irDistance[6] = {0,3,5,99,33,11};
+
+void dev_rx()
+{
+ static uint8_t count = 0;
+ static uint8_t RecData[RECEIVE_DATA_NUM];
+ static uint8_t last_data;
+
+ RecData[count] = device2.getc();
+
+ if(RecData[KEY] == KEYCODE){
+ count++;
+ }else{
+ count = 0;
+ }
+ if(count >= RECEIVE_DATA_NUM){
+ if(RecData[CHECK] == CHECKCODE){
+ //mbedleds = 15;
+
+ if((RecData[DIRECTION] <= 15) || (RecData[DIRECTION] == 200)){
+ direction = RecData[DIRECTION];
+ }
+ if(RecData[DISTANCE] <= 180){
+ Distance = RecData[DISTANCE];
+ }
+
+ ultrasonicVal[0] = (int)((RecData[SONIC1_1] + (RecData[SONIC1_2] << 8)) / 10.0);
+ if(ultrasonicVal[0] == 6553)ultrasonicVal[0] = 0xFFFF;
+ ultrasonicVal[1] = (int)((RecData[SONIC2_1] + (RecData[SONIC2_2] << 8)) / 10.0);
+ if(ultrasonicVal[1] == 6553)ultrasonicVal[1] = 0xFFFF;
+ ultrasonicVal[2] = (int)((RecData[SONIC3_1] + (RecData[SONIC3_2] << 8)) / 10.0);
+ if(ultrasonicVal[2] == 6553)ultrasonicVal[2] = 0xFFFF;
+ ultrasonicVal[3] = (int)((RecData[SONIC4_1] + (RecData[SONIC4_2] << 8)) / 10.0);
+ if(ultrasonicVal[3] == 6553)ultrasonicVal[3] = 0xFFFF;
+
+ if((RecData[IR_FOUND] == 0) || (RecData[IR_FOUND] == 1)){
+ IR_found = RecData[IR_FOUND];
+ }
+ xbee = RecData[XBEE];
+ xbee = 0;
+
+
+ //pc.printf("%f\t%f\t%f\t%f\n",ultrasonicVal[0],ultrasonicVal[1],ultrasonicVal[2],ultrasonicVal[3]);
+ //pc.printf("%d\n",xbee);
+ //pc.printf("%d\n",IR_found);
+
+ diff = last_data - Distance;
+ last_data = Distance;
+ }
+ count = 0;
+ }
+}
+
+void dev_tx()
+{
+ static uint8_t count2 = 0;
+ static uint8_t SendData[SEND_DATA_NUM];
+
+ if(count2 >= SEND_DATA_NUM){
+ SendData[KEY2] = KEYCODE2;
+ SendData[DATA1] = ((int)(compass.sample())) >> 8 ;
+ SendData[DATA2] = (int)(compass.sample());
+ SendData[DATA3] = state;
+ SendData[DATA4] = 1;
+ SendData[DISTANCE1] = irDistance[0] >> 8;
+ SendData[DISTANCE1_2] = irDistance[0];
+ SendData[DISTANCE2] = irDistance[1] >> 8;
+ SendData[DISTANCE2_2] = irDistance[1];
+ SendData[DISTANCE3] = irDistance[2] >> 8;
+ SendData[DISTANCE3_2] = irDistance[2];
+ SendData[DISTANCE4] = irDistance[3] >> 8;
+ SendData[DISTANCE4_2] = irDistance[3];
+ SendData[DISTANCE5] = irDistance[4] >> 8;
+ SendData[DISTANCE5_2] = irDistance[4];
+ SendData[DISTANCE6] = irDistance[5] >> 8;
+ SendData[DISTANCE6_2] = irDistance[5];
+ SendData[CHECK2] = CHECKCODE2;
+
+ count2 = 0;
+
+ }
+ device2.putc(SendData[count2]);
+
+ count2++;
+}
\ No newline at end of file
diff -r 000000000000 -r e9b97faa3e37 uart1.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uart1.h Mon Jun 17 00:12:40 2013 +0000
@@ -0,0 +1,48 @@
+
+
+
+#define RECEIVE_DATA_NUM 14
+#define SEND_DATA_NUM 18
+
+#define KEYCODE 120
+#define CHECKCODE (RecData[DIRECTION] ^ RecData[DISTANCE] ^ RecData[SONIC1_1] ^ RecData[SONIC1_2] ^ RecData[SONIC2_1] ^ RecData[SONIC2_2] ^ RecData[SONIC3_1] ^ RecData[SONIC3_2] ^ RecData[SONIC4_1] ^ RecData[SONIC4_2] ^ RecData[IR_FOUND] ^ RecData[XBEE])
+#define KEYCODE2 35
+#define CHECKCODE2 (SendData[DATA1] ^ SendData[DATA2] ^ SendData[DATA3] ^ SendData[DATA4] ^ SendData[DISTANCE1] ^ SendData[DISTANCE1_2] ^ SendData[DISTANCE2] ^ SendData[DISTANCE2_2] ^ SendData[DISTANCE3] ^ SendData[DISTANCE3_2] ^ SendData[DISTANCE4] ^ SendData[DISTANCE4_2] ^ SendData[DISTANCE5] ^ SendData[DISTANCE5_2] ^ SendData[DISTANCE6] ^ SendData[DISTANCE6_2])
+
+
+enum{
+ KEY = 0,
+ DIRECTION,
+ DISTANCE,
+ SONIC1_1,
+ SONIC1_2,
+ SONIC2_1,
+ SONIC2_2,
+ SONIC3_1,
+ SONIC3_2,
+ SONIC4_1,
+ SONIC4_2,
+ IR_FOUND,
+ XBEE,
+ CHECK,
+};
+enum{
+ KEY2 = 0,
+ DATA1,
+ DATA2,
+ DATA3,
+ DATA4,
+ DISTANCE1,
+ DISTANCE1_2,
+ DISTANCE2,
+ DISTANCE2_2,
+ DISTANCE3,
+ DISTANCE3_2,
+ DISTANCE4,
+ DISTANCE4_2,
+ DISTANCE5,
+ DISTANCE5_2,
+ DISTANCE6,
+ DISTANCE6_2,
+ CHECK2,
+};
diff -r 000000000000 -r e9b97faa3e37 wordString.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/wordString.cpp Mon Jun 17 00:12:40 2013 +0000
@@ -0,0 +1,71 @@
+
+#include <sstream>
+#include "mbed.h"
+
+string StringFIN;
+
+using namespace std;
+
+
+//extern Serial pc; // tx, rx
+
+string IntToString(int number)
+{
+ stringstream ss;
+ ss << number;
+ return ss.str();
+}
+
+void array(int power1,int power2,int power3,int power4)
+{
+ int input[4] = {power1,power2,power3,power4};
+ int value = 0;
+ string StringA[4] = {"0","0","0","0"};
+
+
+ string StringX = "0";
+ string StringY = "0";
+ string StringZ = "0";
+ string String0 = "0";
+
+ StringFIN = "0";
+
+ for(uint8_t i = 0 ; i < 4; i++){
+
+ value = input[i];
+
+ StringX = IntToString(i+1);
+
+ if( (value < 0) && (value >= -100) ){
+ StringY = "R";
+ value = abs(value);
+ StringZ = IntToString(value);
+ }else if( (value >= 0) && (value <= 100) ){
+ StringY = "F";
+ StringZ = IntToString(value);
+ }else{
+ value = abs(value);
+ StringY = "F";
+ StringZ = "000";
+ }
+
+ if(value < 10){
+ String0 = "00";
+ StringZ = String0 + StringZ;
+ }else if(value < 100)
+ {
+ String0 = "0";
+ StringZ = String0 + StringZ;
+ }else{
+
+ }
+
+ StringA[i] = (StringX + StringY + StringZ);
+
+ if(i == 0)StringFIN = StringA[i];
+ else StringFIN += StringA[i];
+
+ }
+
+ StringFIN += "\r\n";
+}
\ No newline at end of file