转自:http://blog.csdn.net/xiaoqiaoaidianzi/article/details/9170937
好了,正式开始回忆了,去年夏天做完数模后,就开始了Rosmin的设计制作之旅,WTFROBOT中,我负责硬件及相关软件部分的任务,Rosmin中做的主要是arduino端的工作。
开始的日子很幸福,过着没有bug的日子,我们预先购买的Romeo(一款arduino小板)也很给面子完成了前期的大部分基本测试,可是随着功能的增多,Romeo终于hold不住了, bug频频,每天都是调不完的bug,具体的问题就是我们让Romeo通过USB Host Shield与android手机通信下完成驱动小车运动,控制2自由度云台和超声波模块,在实际测试中发现启用USB Host 模式后,超声波模块不可用,并且卡死进程,想了很多天后了,克服了乱花国家钱的心理障碍,花了MZD若干张,一切豁然开朗.....
其实问题很明显,小板资源不够用了......
在寻求解决方案的过程中,最开始想到了复用定时器的方案,进一步想到的是在Romeo运行一个类实时系统RTOS的方法,但是经过一番了解后发现,arduino上运行RTOS,学习使用那啥实时系统和具体代码修改时间过长,对项目的完成进度不利,舍弃!
人生就是折腾,不折腾非人生也!手头上正好有一块TI 的launchpad,在energia(一个类似arduino 的IDE)下完成了由430控制超声波模块采集数据并传回给Romeo的任务,其中Romeo已经用完了所有定时器,无法利用串口或模拟串口通信,只好用采样电平的方法通信,此时,电平转换是一个喜闻乐见的问题,经过调换电阻后可以完成基本通信,在整体测试中,通信的稳定性与利用电平高低机制通信的方法带来的局限性让测试效果让人难以接受,这样launchpad+Romeo进行Rosmin硬件层控制的方案,只好舍弃!
最后的出路,大出血(当然也不是我们的钱)买回了adk,引脚多了,再也不会担心引脚不够用的问题了,想想USB Host Shield会占用5个数字IO口,可怜的Rome一共才13个数字IO口,还好时间还够,进度还算赶上来了,最终完成了Rosmin的预期设计功能.
下面是一些资料:
https://github.com/PeterVranken/RTuinOS
http://www.circuitsathome.com/mcu/usb-host-shield-library-version-2-0-released
下面是源代码:
- #include <Max3421e.h>
- #include <Usb.h>
- #include <AndroidAccessory.h>
- #include <Servo.h> //舵机控制库
- #include <MotorCar.h> //电机控制库
- #include <NewPing.h> //ping
- #define X 9 ///Servo
- #define Y 10
- #define InitX 77
- #define InitY 7//145
- #define initX 157
- #define initY 150
- #define S 250 //motor大速度
- #define SS 200 //motor速度
- #define SSS 80 //motor小速度
- #define tt 150 //150ms
- #define TrigPin 24 // Arduino pin tied to trigger pin on the ultrasonic sensor.
- #define EchoPin 25 // Arduino pin tied to echo pin on the ultrasonic sensor.
- #define MAX_DISTANCE 100 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.
- #define MAX_Dis 90
- //long lastDistance = 0;
- AndroidAccessory acc("F120.",
- "Server",
- "F120 Arduino Board",
- "1.0",
- "http://www.imobilebbs.com",
- "0000000012345678");
- //2路舵机
- Servo servoX; //云台X轴舵机 左右
- Servo servoY; //云台Y轴舵机 上下
- MotorCar Motor(5,4,6,8);
- NewPing sonar(TrigPin, EchoPin, MAX_DISTANCE); // NewPing setup of pins and maximum distance.
- byte msg[4]={ 0x00 };//全局变量
- int ijk = 0;
- unsigned long cm=1,CM=1;
- int flag0=0;
- int flag=0;
- int flag1=0;
- //舵机左右转
- void servo_X(uint8_t servotemp)
- {
- if(servotemp<180&&servotemp>0) //定义的舵机旋转角度为10度到170度
- servoX.write(servotemp);
- else if (servotemp<=0) servoX.write(0);
- else servoX.write(180);
- }
- //舵机上下转
- void servo_Y(uint8_t servotemp1)
- {
- if(servotemp1<180&&servotemp1>0)//定义的舵机旋转角度为10度到170度
- servoY.write(servotemp1);
- else if (servotemp1<=0) servoY.write(0);
- else servoY.write(180);
- }
- //舵机追踪
- void servo_zz1(uint8_t val1)
- {
- int servotemp1=servoX.read();//获取舵机目前的角度
- servotemp1+=(val1-90);//舵机运动val1度
- if(servotemp1<180&&servotemp1>0) //定义的舵机旋转角度为10度到170度
- servoX.write(servotemp1);
- else if (servotemp1<=0) servoX.write(0);
- else servoX.write(180);
- }
- void servo_zz2(uint8_t val2)
- {
- int servotemp2=servoY.read();//获取舵机目前的角度值
- servotemp2+=(val2-90);//舵机运动val2度
- if(servotemp2<180&&servotemp2>0) //定义的舵机旋转角度为10度到170度
- servoY.write(servotemp2);
- else if (servotemp2<=0) servoY.write(0);
- else servoY.write(180);
- }
- void init_servos0(void)
- {
- servoX.attach(X);//水平舵机接9脚
- servoY.attach(Y);//上下舵机接10脚
- servoX.write(InitX);//输出舵机初始位置为77度
- servoY.write(InitY);//输出舵机初始位置为145度
- }
- void init_servos1(void)
- {
- servoX.write(initX);//输出舵机初始位置为157度
- servoY.write(initY);//输出舵机初始位置为150度
- }
- void setup()
- {
- init_servos0();
- Serial.begin(115200);//设置波特率为115200bps
- acc.powerOn();
- }
- void loop()
- {
- if( acc.isConnected() )
- {
- int len = acc.read(msg, sizeof(msg), 1);
- if(len >=1)
- {
- do_task();
- }
- }
- //sendMessage(2);//垃圾数据
- msg[0] = 0x01; //清除缓存
- // delay( 100 );
- }
- void do_task(void)
- {
- if (msg[0] == 0x02)
- {
- switch( msg[1] )
- {
- case 0://reset
- Motor.stop();
- break;
- case 1:
- if(msg[2]>128){
- Motor.forward(S);
- }
- break;
- case 2:
- if(msg[2]>128){
- Motor.back(S);
- }
- break;
- case 3:
- if(msg[2]>128){
- Motor.turnLeft(SSS);
- }
- break;
- case 4:
- if(msg[2]>128){
- Motor.turnRight(SSS);
- }
- break;
- case 5:
- if(msg[2]>128){
- Motor.turnLeft2(SSS);
- }
- break;
- case 6:
- if(msg[2]>128){
- Motor.turnRight2(SSS);
- }
- break;
- case 7:
- if(msg[2]>128){
- Motor.turnLeftOrigin(SSS);
- }
- break;
- case 8:
- if(msg[2]>128){
- Motor.turnRightOrigin(SSS);
- }
- break;
- case 9:
- servo_X(msg[2]);
- break;
- case 10:
- servo_X(msg[2]);
- break;
- case 11:
- servo_Y(msg[2]);
- break;
- case 12:
- servo_Y(msg[2]);
- break;
- case 13: //reset
- init_servos0();
- break;
- }
- }
- else if( msg[0] == 0x3)
- {
- switch( msg[1] )
- {
- case 10:
- Motor.stop();
- servo_zz1(msg[2]);
- servo_zz2(msg[3]);
- break;
- case 11:
- init_servos1();
- // ssessage(2);
- break;
- case 12:
- while(cm<MAX_Dis&&cm>0||flag==0)
- {
- // if(ijk<3){
- yanqiang();
- // }
- int len = acc.read(msg, sizeof(msg), 1);
- if(len >=1)
- {
- flag=1;//QR码识别标志位
- if(msg[1]==1)
- {
- flag0=0;//初始化yanqiang
- flag1=1;//左右转标志位
- Motor.stop();
- int jj;
- for(jj=0;jj<174;jj++)
- {
- servo_zz1(89);
- delay(20);
- }
- }
- //delay(tt);
- }
- }
- break;
- case 13:
- Motor.forward(SS);
- delay(msg[2]*1000);
- Motor.stop();
- break;
- }
- }
- else{
- Motor.stop();
- }
- }
- void sendMessage( int value0,int value1,int value2,int value3)
- {
- if (acc.isConnected())
- {
- byte msgS[4]={0x00};
- msgS[0] = value0 & 0xff;
- msgS[1] = value1 & 0xff;
- msgS[2] = value2 & 0xff;
- msgS[3] = value3 & 0xff;
- acc.write(msgS, 4);
- }
- }
- void yanqiang(void)
- {
- cm=sonar.ping() / US_ROUNDTRIP_CM;
- // sendMessage(cm);
- if(cm<MAX_Dis && cm >0)
- {
- if(flag0==0)
- {
- Motor.forward(SSS);
- delay(tt);
- CM=sonar.ping() / US_ROUNDTRIP_CM;
- flag0=1;
- }
- else
- {
- int yy;
- yy=cm;
- cm=CM;
- CM=yy;
- }
- // int Speed=map(abs(cm-CM),0,5,200,250);
- if(flag1)
- {
- if(cm>CM)
- {
- Motor.turnRight(S);
- }
- else if (cm<CM)
- {
- Motor.turnLeft(S); //小速度
- }
- else {
- Motor.forward(SSS);
- }
- }
- else
- {
- if(cm<CM)
- {
- Motor.turnRight(S);
- }
- else if (cm>CM)
- {
- Motor.turnLeft(S); //小速度
- }
- else {
- Motor.forward(SSS);
- }
- }
- if(flag)
- sendMessage(3,3,3,cm);
- // ijk=0;
- delay(tt);
- Motor.stop();
- }
- else
- {
- if(flag==1)
- Motor.stop();
- else
- {
- Motor.forward(SSS);
- flag0=0;
- }
- if(flag)
- sendMessage(3,3,3,100);
- // ijk++;
- // delay(tt);
- }
- }
我们深刻体会到买东西一定要买贵的!包括舵机和Arduino板等等。。。