|
本帖最后由 highplay86 于 2012-11-27 20:27 编辑
最近在搞一个有十多个控制通道的履带车...最开始写了几个通道,代码不多,履带车正常执行...可是到后面随着通道越写越多...发现程序下载进Arduino板子后会出现许多程序紊乱执行的问题...经过不断地烧写实验,觉得是因为履带车接收端的串口接收代码出了问题...
手柄程序应该没问题...应该是是履带车Loop里前几行的串口接收函数出了问题,
现在这套程序执行的效果是:履带车前后左右的运动控制需要摇杆1 和摇杆2 一起拨动,履带车才会运动(而原意是只通过摇杆1 控制履带车的运动...),,而且若希望舵机和步进电机运动,竟然需要摇杆1 和摇杆2 都不是处于中位,再按动对应的按键,舵机和步进电机才能正常的执行运动指令(原意也是仅仅通过按键就可以单独控制舵机和步进电机)...
我对串口接收部分的代码段小幅修改了好多次...(比如说加一句while(!Serial.available()); 或者减一句while(!Serial.available()); 或者把 while(!Serial.available());
command_temp02=Serial.read();这两句移到
“
if('B'==Serial.read())
{
while(!Serial.available());
command_temp01=Serial.read();
while(!Serial.available());
command_temp02=Serial.read();
}
”这段的花括号外面,各种执行的效果都不一样,不同的紊乱效果...
Arduino的串口Serial函数原型看了几次,也看不出什么缘由...
高手求解啊>>>>>>>>>>>感激不尽...
具体代码如下:
- /*******************************************************************
- 履带车控制程序
- *******************************************************************/
- #include <Movecar.h>
- #include <Motorarm.h>
- #include <Stepper.h>
- #include <Servo.h>
- #define STEPS 100 // 这里设置步进电机旋转一圈是多少步
- Movecar Movecar(20,21);
- Motorarm Arm(2,15,16,3,17,18);
- Stepper stepper1(STEPS,29,30,31,32);
- Servo servo1,servo2,servo3;
- int speedtemp01;
- int speedtemp02;
- int comtemp01,comtemp02;
- byte command_temp01,command_temp02;
- byte button_up,button_left,button_down,button_right;
- byte button_Y,button_X,button_A,button_B;
- byte button_black,button_white,button_back,button_start;
- int ax,bx,cx;
- int Fire01,Fire02;
- /******************************************************************
- 初始化:setup函数
- ******************************************************************/
- void setup()
- {
- Serial.begin(9600);
-
- pinMode(13,OUTPUT);
- servo1.attach(24);servo2.attach(25);servo3.attach(26);
- ax=0;bx=0;cx=0;
- servo1.write(ax);servo2.write(bx);servo3.write(cx);
- }
- /****************************************************************************************
- 执行部分:loop函数
- ****************************************************************************************/
- void loop()
- {
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- /*****************************************************************************命令接收及处理程序段*********************************************************************************************/
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- command_temp01=0x80;command_temp02=0x80;
-
- if(Serial.available())
- {
- if('C'==Serial.read())
- {
- while(!Serial.available());
- comtemp01=Serial.read();
- while(!Serial.available());
- speedtemp01=Serial.read();
- }
- while(!Serial.available());
- if('D'==Serial.read())
- {
- while(!Serial.available());
- comtemp02=Serial.read();
- while(!Serial.available());
- speedtemp02=Serial.read();
- }
- while(!Serial.available());
- if('B'==Serial.read())
- {
- while(!Serial.available());
- command_temp01=Serial.read();
- while(!Serial.available());
- command_temp02=Serial.read();
- }
- }
- /*********************************************************************************************************************************************************************************************/
- /************************************************************************************履带车端各种执行器程序段*********************************************************************************/
- /*********************************************************************************************************************************************************************************************/
- switch(comtemp01)
- {
- case 'w': Movecar.forward(speedtemp01);break;
- case 's': Movecar.back(speedtemp01);break;
- case 'a': Movecar.turnleftorgin(speedtemp01);break;
- case 'd': Movecar.turnrightorgin(speedtemp01);break;
- case 'q': Movecar.turnleft(speedtemp01);break;
- case 'e': Movecar.turnright(speedtemp01);break;
- case 't': Movecar.stop();break;
- case 'z': Movecar.backturnleft(speedtemp01);break;
- case 'c': Movecar.backturnright(speedtemp01);break;
- default:
- Movecar.stop();
- break;
- }
- /**************************************************************************************/
- /**************************************************************************************/
- stepper1.setSpeed(100);
- switch(comtemp02)
- {
- case 'w':{break;}
-
- case 'a':{stepper1.step(20);break;}
-
- case 's':{break;}
-
- case 'd':{stepper1.step(-20);break;}
-
- case 'q':{break;}
-
- case 'e':{break;}
- case 'z':{break;}
-
- case 'c':{break;}
-
- case 't':{stepper1.setSpeed(0);break;}
- }
- /**************************************************************************************/
- /**************************************************************************************/
- button_left=command_temp01&0x02;
- if(button_left==0x02)
- {
- if(ax<180)
- {
- ax+=5;
- servo1.write(ax);//设置舵机旋转的角度
- }
- }
- button_right=command_temp01&0x08;
- if(button_right==0x08)
- {
- if(ax>0)
- {
- ax-=5;
- servo1.write(ax);//设置舵机旋转的角度
- }
- }
- button_up=command_temp01&0x01;
- button_down=command_temp01&0x04;
- button_Y=command_temp01&0x10;
- button_X=command_temp01&0x20;
- if(button_up==0x0&&button_down==0x0&&button_Y==0x0&&button_X==0x0){Arm.stop();digitalWrite(13,LOW);}
- if(button_up==0x01){Arm.moveAz(250);digitalWrite(13,HIGH);delay(200);}
- if(button_down==0x04){Arm.moveAf(250);digitalWrite(13,HIGH);delay(200);}
- if(button_Y==0x10){Arm.moveBz(250);digitalWrite(13,HIGH);delay(200);}
- if(button_X==0x20){Arm.moveBf(250);digitalWrite(13,HIGH);delay(200);}
- button_A=command_temp01&0x40;
- button_B=command_temp02&0x01;
- button_black=command_temp02&0x02;
- button_white=command_temp02&0x04;
- if(button_A==0x40)
- {
- if(ax>0)
- {
- ax-=5;
- servo1.write(ax);//设置舵机旋转的角度
- }
- }
- if(button_B==0x01)
- {
- if(bx<180)
- {
- bx+=5;
- servo2.write(bx);//设置舵机旋转的角度
- }
- }
- if(button_black==0x02)
- {
- if(bx<180)
- {
- bx+=5;
- servo2.write(bx);//设置舵机旋转的角度
- }
- }
- if(button_white==0x04)
- {
- if(bx>0)
- {
- bx-=5;
- servo2.write(bx);//设置舵机旋转的角度
- }
- }
- command_temp01=0x800;command_temp02=0x80;
- /**************************************************************************************************************************************************************************************************************************/
- /**************************************************************************************************************************************************************************************************************************/
- }
复制代码
- /*****************************************************
- 项目:手柄程序
- 作者: ..Nin..
- *****************************************************/
- /**************************************************************************************** 分割线 *************************************************************************************************************/
- //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- /**************************************************************************************************************/
- ///////////////////宏定义////////////////////
- /**************************************************************************************************************/
- //////////////摇杆1/////////////////
- #define joystick1_up_down 0
- #define joystick1_left_right 1
- #define joystick1_key 6
- #define wheel_left 4
- //////////////摇杆2/////////////////
- #define joystick2_up_down 2
- #define joystick2_left_right 3
- #define joystick2_key 7
- #define wheel_right 5
- ///////////标准四向键盘/////////////
- #define KEY_UP 8
- #define KEY_LEFT 9
- #define KEY_DOWN 10
- #define KEY_RIGHT 11
- ///////////YXAB四向键盘/////////////
- #define KEY_Y 2
- #define KEY_X 3
- #define KEY_A 5
- #define KEY_B 4
- ///////////BLACK,WHITE,BACK,START键盘/////////////
- #define BUTTON_BLACK 7
- #define BUTTON_WHITE 6
- #define BUTTON_BACK 12
- #define BUTTON_START 13
- /**************************************************************************************************************/
- //////////////////摇杆及键盘数据变量//////////////////
- /**************************************************************************************************************/
- int value_up_down_01;
- int value_left_right_01;
- int value_up_down_02;
- int value_left_right_02;
- int val01,val02,val03,val04;
- int val05,val06,val07,val08;
- int val09,val10,val11,val12;
- int val13,val14;
- int value_wheel_left;
- int value_wheel_right;
- /////////////////////指令数据变量//////////////////
- int comtemp01,oldcomtemp01;
- int comtemp02,oldcomtemp02;
- byte command_bin_01=0x80;
- byte command_bin_02=0x80;
- /*****************************************************************************************************************************************************************************************************************/
- /////////////////////////////////////////////////////////////////////////////////////////////////////分割线////////////////////////////////////////////////////////////////////////////////////////////////////////
- /*****************************************************************************************************************************************************************************************************************/
- /////////////////////////////////////////////////////////////////////////////////////////////////////分割线////////////////////////////////////////////////////////////////////////////////////////////////////////
- /*****************************************************************************************************************************************************************************************************************/
- /////////////////////////////////////////////////////////////////////////////////////////////////////分割线////////////////////////////////////////////////////////////////////////////////////////////////////////
- void setup()
- {
- Serial.begin(9600);
- pinMode(KEY_UP,INPUT);//定义按键接口为输入接口
- pinMode(KEY_LEFT,INPUT);//定义按键接口为输入接口
- pinMode(KEY_DOWN,INPUT);//定义按键接口为输入接口
- pinMode(KEY_RIGHT,INPUT);//定义按键接口为输入接口
- pinMode(KEY_Y,INPUT);//定义按键接口为输入接口
- pinMode(KEY_X,INPUT);//定义按键接口为输入接口
- pinMode(KEY_A,INPUT);//定义按键接口为输入接口
- pinMode(KEY_B,INPUT);//定义按键接口为输入接口
- pinMode(BUTTON_BLACK,INPUT);//定义按键接口为输入接口
- pinMode(BUTTON_WHITE,INPUT);//定义按键接口为输入接口
- pinMode(BUTTON_BACK,INPUT);//定义按键接口为输入接口
- pinMode(BUTTON_START,INPUT);//定义按键接口为输入接口
- }
- /*****************************************************************************************************************************************************************************************************************/
- //////////////////////////////////////////////////////////////////////////////////////////////////////主程序///////////////////////////////////////////////////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- /*****************************************************************************************************************************************************************************************************************/
- void loop()
- {
-
- /*********************************************************************************************************************************************************
- 摇杆1
- *********************************************************************************************************************************************************/
- ////////////////////读取摇杆1的模拟值/////////////////////////////////////
- value_up_down_01=analogRead(joystick1_up_down);
- value_left_right_01=analogRead(joystick1_left_right);
- //////////////////////////////////////////////////////////////////////////
- if(value_up_down_01>560)//摇杆1向上
- {
- if(value_left_right_01<460)//摇杆1向右
- {
- comtemp01='e';//右转
- }
- else if(value_left_right_01>560)//摇杆1向左
- {
- comtemp01='q';//左转
- }
- else
- {
- comtemp01='w';//向前
- }
- }
- else if(value_up_down_01<460)//摇杆1向下
- {
- if(value_left_right_01<460)//摇杆1向右
- {
- comtemp01='c';//右退
- }
- else if(value_left_right_01>560)//摇杆1向左
- {
- comtemp01='z';//左退
- }
- else
- {
- comtemp01='s';//后退
- }
- }
- else
- {
- if(value_left_right_01<460)//摇杆1向右
- {
- comtemp01='d';//原地右转
- }
- else if(value_left_right_01>560)//摇杆1向左
- {
- comtemp01='a';//原地左转
- }
- else
- {
- comtemp01='t';//停止子函数
- }
- }
- //当comtemp和oldcomtemp的值都为t时不发送指令
-
- ////////////////////////////////////////////////////////////命令数值计算///////////////////////////////////////////////////////
-
- if(!((comtemp01=='t')&&(oldcomtemp01=='t')))
- {
- Serial.print('C');
- Serial.write(comtemp01);
- if(comtemp01=='w')
- {
- Serial.write((value_up_down_01-512)/2);
- //通过公式变换为速度值
- }
- else if(comtemp01=='s')
- {
- Serial.write(255-(value_up_down_01/2));
- //通过公式变换为速度值
- }
- else if((comtemp01=='q')||(comtemp01=='a')||(comtemp01=='z'))
- {
- Serial.write((value_left_right_01-512)/2);
- //通过公式变换为速度值
- }
- else if((comtemp01=='e')||(comtemp01=='d')||(comtemp01=='c'))
- {
- Serial.write(255-(value_left_right_01/2));
- //通过公式变换为速度值
- }
- else
- {
- Serial.write((byte)0);
- }
- oldcomtemp01=comtemp01;
- }
-
-
- /**************************************************************************************************************************************************************
- 摇杆2
- **************************************************************************************************************************************************************/
- ////////////////////读取摇杆2的模拟值/////////////////////////////////////
- value_up_down_02=analogRead(joystick2_up_down);
- value_left_right_02=analogRead(joystick2_left_right);
- //////////////////////////////////////////////////////////////////////////
- if(value_up_down_02<460)//摇杆2向上
- {
- if(value_left_right_02>560)//摇杆2向右
- {
- comtemp02='e';//右上
- }
- else if(value_left_right_02<460)//摇杆2向左
- {
- comtemp02='q';//左上
- }
- else
- {
- comtemp02='w';//向上
- }
- }
- else if(value_up_down_02>560)//摇杆2向下
- {
- if(value_left_right_02>560)//摇杆2向右
- {
- comtemp02='c';//右下
- }
- else if(value_left_right_02<460)//摇杆2向左
- {
- comtemp02='z';//左下
- }
- else
- {
- comtemp02='s';//向下
- }
- }
- else
- {
- if(value_left_right_02>560)//摇杆2向右
- {
- if(value_up_down_02>560)//摇杆2向下
- {
- comtemp02='c';//右下
- }
- else if(value_up_down_02<460)//摇杆2向上
- {
- comtemp02='e';//右上
- }
- else
- {
- comtemp02='d';//右旋
- }
- }
- else if(value_left_right_02<460)//摇杆2向左
- {
- if(value_up_down_02>560)//摇杆2向下
- {
- comtemp02='z';//左下
- }
- else if(value_up_down_02<460)//摇杆2向上
- {
- comtemp02='q';//左上
- }
- else
- {
- comtemp02='a';//左旋
- }
- }
- else
- {
- comtemp02='t';//停止子函数
- }
- }
- //当comtemp和oldcomtemp的值都为t时不发送指令
- ////////////////////////////////////////////////////////////命令数值计算///////////////////////////////////////////////////////
-
- if(!((comtemp02=='t')&&(oldcomtemp02=='t')))
- {
- Serial.print('D');
- Serial.write(comtemp02);
- if(comtemp02=='w')
- {
- Serial.write(255-(value_up_down_02/2));
- //通过公式变换为速度值
- }
- else if(comtemp02=='s')
- {
- Serial.write((value_up_down_02-512)/2);
- //通过公式变换为速度值
- }
- else if((comtemp02=='q')||(comtemp02=='a')||(comtemp02=='z'))
- {
- Serial.write(255-(value_left_right_02/2));
- //通过公式变换为速度值
- }
- else if((comtemp02=='e')||(comtemp02=='d')||(comtemp02=='c'))
- {
- Serial.write((value_left_right_02-512)/2);
- //通过公式变换为速度值
- }
- else
- {
- Serial.write((byte)0);
- }
- oldcomtemp02=comtemp02;
- }
- /******************************************************************************************************************************************************************
- 标准四向键盘
- *******************************************************************************************************************************************************************/
-
- command_bin_01=0x80;
-
- val01=digitalRead(KEY_UP);//读取数字KEY_UP 口电平值赋给val01
- if(val01==LOW)//检测按键是否按下
- command_bin_01|=0x01;
-
- val02=digitalRead(KEY_LEFT);//读取数字KEY_LEFT 口电平值赋给val02
- if(val02==LOW)//检测按键是否按下
- command_bin_01|=0x02;
-
- val03=digitalRead(KEY_DOWN);//读取数字KEY_DOWN 口电平值赋给val03
- if(val03==LOW)//检测按键是否按下
- command_bin_01|=0x04;
-
- val04=digitalRead(KEY_RIGHT);//读取数字KEY_RIGHT 口电平值赋给val04
- if(val04==LOW)//检测按键是否按下
- command_bin_01|=0x08;
- /******************************************************************************************************************************************************************
- YXAB四向键盘
- *******************************************************************************************************************************************************************/
-
- val05=digitalRead(KEY_Y);//读取数字KEY_Y 口电平值赋给val05
- if(val05==LOW)//检测按键是否按下
- command_bin_01|=0x10;
-
- val06=digitalRead(KEY_X);//读取数字KEY_X 口电平值赋给val06
- if(val06==LOW)//检测按键是否按下
- command_bin_01|=0x20;
-
- val07=digitalRead(KEY_A);//读取数字KEY_A 口电平值赋给val07
- if(val07==LOW)//检测按键是否按下
- command_bin_01|=0x40;
-
- Serial.print('B');
- Serial.write(command_bin_01);
-
- /******************************************************************************************************************************************************************
- BLACK,WHITE,BACK,START键盘
- *******************************************************************************************************************************************************************/
- command_bin_02=0x80;
-
- val08=digitalRead(KEY_B);//读取数字KEY_B 口电平值赋给val08
- if(val08==LOW)//检测按键是否按下
- command_bin_02|=0x01;
-
- val09=digitalRead(BUTTON_BLACK);//读取数字BUTTON_BLACK 口电平值赋给val09
- if(val09==LOW)//检测按键是否按下
- command_bin_02|=0x02;
-
- val10=digitalRead(BUTTON_WHITE);//读取数字BUTTON_WHITE 口电平值赋给val10
- if(val10==LOW)//检测按键是否按下
- command_bin_02|=0x04;
-
- val11=digitalRead(BUTTON_BACK);//读取数字BUTTON_BACK 口电平值赋给val11
- if(val11==LOW)//检测按键是否按下
- command_bin_02|=0x08;
-
- val12=digitalRead(BUTTON_START);//读取数字BUTTON_START 口电平值赋给val12
- if(val12==LOW)//检测按键是否按下
- command_bin_02|=0x10;
-
-
- /******************************************************************************************************************************************************************
- 摇杆按键1、2及手柄上方两个模拟按键左、右
- *******************************************************************************************************************************************************************/
-
-
- val13=analogRead(joystick1_key);//读取数字joystick1_key 口电平值赋给val13
- if(val13>=512)//检测按键是否按下
- command_bin_02|=0x20;
-
- val14=analogRead(joystick2_key);//读取数字joystick2_key 口电平值赋给val14
- if(val14>=512)//检测按键是否按下
- command_bin_02|=0x40;
-
- value_wheel_left=analogRead(wheel_left);
- value_wheel_right=analogRead(wheel_right);
-
- value_wheel_left=value_wheel_left/2;
- //通过公式变换为速度值
- value_wheel_right=value_wheel_right/2;
- //通过公式变换为速度值
-
- Serial.write(command_bin_02);
-
- delay(200);
- /************************************************************************************************************************************************************************************************/
- /************************************************************************************************************************************************************************************************/
-
-
- /************************************************************************************************************************************************************************************************/
- }
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|