本帖最后由 wing 于 2016-9-24 18:15 编辑
占位备说明1
原型的修复已经基本完成了,然而存在的问题也不少。
供电方式很奇葩,9v镍氢充电池+一个7.4v锂电,
锂电是给主控的UNO的,而9v是供电机的,可怜的250mAh要抗起两个电机的负担,就看它什么时候被玩坏了。
车架方面选用了万用洞洞板,体积虚肥,而且结构强度较差,考虑下一版本用6061为底盘材料。
另外由于原本的轮子比现在的履带尺寸稍小,造成传感器有盲点,小角度靠近桌面边沿可能不被感知。
另外传感器选择了150~800量程的,这是一个错误。基于传感器的问题其实有很多,之后考虑单独发帖讨论这一问题。
OC的电机板占用了D3针脚,导致无法使用中断方式获取旋转编码器的数据,当然原来的电机是没有编码器的,所以当时也没考虑这点。
作为设计的原型暂时不考虑加入编码器的功能了,希望gama电机板不占这个端口吧,另外一个好消息是101的全部数字针脚都可以用中断。
下面附上代码,其实我写了很多版本的代码,这个版本算是比较稳定的,然而也牺牲了运动的流畅性。
- const byte p1_a=145; //A机直行动力
- const byte p1_b=191; //B机直行动力
- const byte p2_a=128; //A机转向动力
- const byte p2_b=128; //B机转向动力
- int d1; //1传感基础值
- int d2; //2传感基础值
- int d3; //3传感基础值
- int d4; //4传感基础值
- const int l1=50; //1传感临界差值
- const int l2=50; //2传感临界差值
- const int l3=50; //3传感临界差值
- const int l4=50; //4传感临界差值
- const uint8_t s_1=5; //前向传感器针脚号
- const uint8_t s_2=4; //右向传感器针脚号
- const uint8_t s_3=3; //后向传感器针脚号
- const uint8_t s_4=2; //左向传感器针脚号
- //boolean a1; //1姿态可用 前行
- //boolean a2; //2姿态可用 右转
- //boolean a3; //3姿态可用 后退
- //boolean a4; //4姿态可用 左转
- boolean first_flg; //首次分析标记
- void setup()
- {
- //启用电机A的三个管脚,全部设置为输出状态
- pinMode(12,OUTPUT);
- pinMode(3,OUTPUT);
- pinMode(9,OUTPUT);
- //启用电机B的三个管脚,全部设置为输出状态
- pinMode(13,OUTPUT);
- pinMode(11,OUTPUT);
- pinMode(8,OUTPUT);
- //RGB LED的三个管脚,全部设置为输出状态
- pinMode(2,OUTPUT); //G绿 运转
- pinMode(4,OUTPUT); //B蓝 分析
- pinMode(7,OUTPUT); //R红 停
- //初始化传感数据
- d1=0; //1传感基础值 A5
- d2=0; //2传感基础值 A4
- d3=0; //3传感基础值 A3
- d4=0; //4传感基础值 A2
- //a1=false; //1姿态可用 前行
- //a2=false; //2姿态可用 右转
- //a3=false; //3姿态可用 后退
- //a4=false; //4姿态可用 左转
- first_flg=true; //首次分析标记
- //Serial.begin(9600); // setup serial
- }
- void p_stop(unsigned long t)
- {
- //停车
- digitalWrite(9, HIGH); //刹车电机A的制动
- digitalWrite(8, HIGH); //刹车电机B的制动
- analogWrite(3,0); //A0功率输出
- analogWrite(11,0); //B0功率输出
- //红灯
- digitalWrite(2, LOW);
- digitalWrite(4, LOW);
- digitalWrite(7, HIGH);
- //延时
- delay(t);
- }
- void p_run(unsigned long t,byte m)
- {
- //运行
- if (m==1) //前行
- {
- //A机状态
- digitalWrite(9, LOW); //松开电机A的制动
- digitalWrite(12, HIGH); //设置方向为正向
- //B机状态
- digitalWrite(8, LOW); //松开电机B的制动
- digitalWrite(13, LOW); //设置方向为反向
- //A机动力
- analogWrite(3,p1_a);
- //B机动力
- analogWrite(11,p1_b);
- }
- if (m==2) //右转
- {
- //A机状态
- digitalWrite(9, LOW); //松开电机A的制动
- digitalWrite(12, LOW); //设置方向为正向
- //B机状态
- digitalWrite(8, LOW); //松开电机B的制动
- digitalWrite(13, LOW); //设置方向为正向
- //A机动力
- analogWrite(3,p2_a);
- //B机动力
- analogWrite(11,p2_b);
- }
- if (m==3) //后退
- {
- //A机状态
- digitalWrite(9, LOW); //松开电机A的制动
- digitalWrite(12,LOW); //设置方向为反向
- //B机状态
- digitalWrite(8, LOW); //松开电机B的制动
- digitalWrite(13,HIGH); //设置方向为正向
- //A机动力
- analogWrite(3,p1_a);
- //B机动力
- analogWrite(11,p1_b);
- }
- if (m==4) //左转
- {
- //A机状态
- digitalWrite(9, LOW); //松开电机A的制动
- digitalWrite(12, HIGH); //设置方向为反向
- //B机状态
- digitalWrite(8, LOW); //松开电机B的制动
- digitalWrite(13, HIGH); //设置方向为反向
- //A机动力
- analogWrite(3,p2_a);
- //B机动力
- analogWrite(11,p2_b);
- }
- //绿灯
- digitalWrite(2, HIGH);
- digitalWrite(4, LOW);
- digitalWrite(7, LOW);
- //延时
- delay(t);
- }
- int p_scan(uint8_t p)
- {
- int distance[8];
- int v;
- int m;
- int n;
- int val;
- v=0;
- for (n=0; n <= 7; n++){
- delay(100);
- val = analogRead(p); //p号传感器数值
- distance[n]=val;
- }
- for (m=0;m<=6;m++){
- for (n=m+1;n<=7;n++){
- if (distance[m]>distance[n])
- {
- val=distance[m];
- distance[m]=distance[n];
- distance[n]=val;
- }
- }
- }
- val=0;
- for (n=2; n <= 5; n++){
- val=val+distance[n];
- }
- v=val/4;
- return(v);
- }
- void p_init()
- {
- int i;
- int val;
- int v;
- if (first_flg)
- {
- //三色灯
- digitalWrite(2, HIGH);
- digitalWrite(4, HIGH);
- digitalWrite(7, HIGH);
-
- //初始分析
- //1前方距离
- val=0;
- for (i=0; i <= 3; i++){
- val=val+p_scan(s_1);
- }
- d1=val/4; //1传感基础值
- //2右方距离
- val=0;
- for (i=0; i <= 3; i++){
- val=val+p_scan(s_2);
- }
- d2=val/4; //2传感基础值
- // Serial.println(d2); // debug value
- //3后方距离
- val=0;
- for (i=0; i <= 3; i++){
- val=val+p_scan(s_3);
- }
- d3=val/4; //3传感基础值
- //4左方距离
- val=0;
- for (i=0; i <= 3; i++){
- val=val+p_scan(s_4);
- }
- d4=val/4; //4传感基础值
- first_flg=false;
- delay(2000);
- }
- }
- boolean p_analyze(uint8_t a)
- {
- p_init();
-
- //蓝灯
- digitalWrite(2, LOW);
- digitalWrite(4, HIGH);
- digitalWrite(7, LOW);
- int i;
- int val;
- int v;
- boolean action_flg;
- action_flg=false;
- //常态分析
- val=p_scan(a);
- if (a==s_1) //前行动作
- {
- v=val-d1;
- if ((v<l1)&&(v>l1*-1))
- {
- action_flg=true; //1姿态可用 前行
- }
- }
- if (a==s_2) //右转动作
- {
- v=val-d2;
- if ((v<l2)&&(v>l2*-1))
- {
- action_flg=true; //2姿态可用 右转
- }
- }
- if (a==s_4) //左转动作
- {
- v=val-d4;
- if ((v<l4)&&(v>l4*-1))
- {
- action_flg=true; //4姿态可用 左转
- }
- }
- if (a==s_3) //后退动作
- {
- v=val-d3;
- if ((v<l3)&&(v>l3*-1))
- {
- action_flg=true; //3姿态可用 后退
- }
- }
- return(action_flg);
- }
-
- void loop()
- {
- int r;
- boolean go_flg;
-
- //停车
- p_stop(1000);
- //观察下周围的情况
- if (p_analyze(s_1)){
- //直走 1.5s
- p_run(1500,1);
- }
- else{
- go_flg=false;
- while (!go_flg)
- {
- r=random(2,4);
- //右转***********************
- if (r==2){
- if (p_analyze(s_2)){
- go_flg=true;
- p_run(3000,r);
- }
- }
- //后退***********************
- if (r==3){
- if (p_analyze(s_3)){
- go_flg=true;
- p_run(3000,r);
- }
- }
- //左转***********************
- if (r==4){
- if (p_analyze(s_4)){
- go_flg=true;
- p_run(3000,r);
- }
- }
- }
- }
- }
复制代码
|