gly1215216357 发表于 2014-4-16 16:09:43

电子罗盘配合小车转特定角度期间出现的问题

#define uchar unsigned char
#define uint unsigned int
#define R_L1 27
byte StartStr=0x91;
byte ReadStr;
int outstr,angle0=0;
int sum,i,l,n,mask;
int num;
void setup()
{
Serial.begin(9600);
Serial3.begin(9600);//这里就定义了与罗盘通信的串口
for(i=R_L1,l=i+8;i<l;i++)
{
    pinMode(i,INPUT);
}
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(36,INPUT);
pinMode(37,INPUT);
//attachInterrupt(0,bumper,RISING);
}
void loop()
{
   lukou();
   delay(10);
   //luopan();
}
void lukou()
{
   if(digitalRead(38)||digitalRead(39))
   {
       delay(1);
      if(digitalRead(38)||digitalRead(39))
      {
       while(digitalRead(38)||digitalRead(39));
         num++;
         //Serial.print(num,DEC);
         //Serial.print("\n");
      }
   }   
   switch(num)
   {
       case 2: angle(90);break;
       case 4: angle(60);break;
   }
}
void angle(int aa)
{
switch(aa)
{
   case 90:
   while(outstr<170)
   {luopan();motor(2,3,6,5,150,150);}break;      
   case 60:
   while(outstr<270)
   { luopan();motor(3,2,5,6,150,150);}break;
}
}   
void luopan()
{
   int i,a,b,c;
Serial3.print(StartStr);
if(Serial3.available())
{
    delay(20);
while(Serial3.available())
   {
    ReadStr=Serial3.read();
    delay(10);
    i++;
      }
    a=(ReadStr)-48;
    b=int(ReadStr)-48;
    c=int(ReadStr)-48;
    outstr=a*100+b*10+c*1;
   Serial.print(outstr,DEC);
   Serial.print("\n");
}
}
void motor(uchar IN1,uchar IN2,uchar IN3,uchar IN4,uchar a,uchar b)
{
    analogWrite(IN1,a);
    analogWrite(IN2,0);
    analogWrite(IN3,b);
    analogWrite(IN4,0);
}
这个是我们写的程序,38,39引脚接的是两个开关量的灰度传感器,程序是让灰度第二次检测到后调用罗盘程序,当小车转到特定角度范围后,跳出语句,第四个路口也是这样,现在问题是,灰度第二次检测到后,转到特定角度后,罗盘不工作,跳出语句,此时在让灰度检测到一次,返回的num值会一下子蹦到一万多(num是用来记路口的),忘大神们指点一下小弟

mxhhaixin 发表于 2014-4-16 19:10:55

我以前也曾试过利用罗盘控制小车转一个角度,但是失败了。外界对罗盘的干扰是一个问题,而且罗盘使用前还要进行校正。

gly1215216357 发表于 2014-4-17 15:27:19

你能帮我写一个用i2c通信的代码吗?

mxhhaixin 发表于 2014-4-19 13:22:41

我也没写过I2C通信的代码,不过你可以参考这篇文章:
http://www.eefocus.com/zhang700309/blog/12-01/236815_59f78.html

eddiewwm 发表于 2014-4-19 13:44:02

// num值会一下子蹦到一万多 // 的問題,應是以下這段引起的 38,39 引腳開關同時為1期間的num不斷加數所引起的
      {
       while(digitalRead(38)||digitalRead(39));
         num++;
         //Serial.print(num,DEC);
         //Serial.print("\n");
      }

另外的 // 罗盘不工作//,應檢查羅盤的通訊接口和是否有訊號輸出。


eddiewwm 发表于 2014-4-19 14:32:35

gly1215216357 发表于 2014-4-17 15:27 static/image/common/back.gif
你能帮我写一个用i2c通信的代码吗?

你寫 I2C 時遇到了甚麼的問題?代碼的要求是甚麼?

gly1215216357 发表于 2014-4-20 16:06:03

eddiewwm 发表于 2014-4-19 13:44 static/image/common/back.gif
// num值会一下子蹦到一万多 // 的問題,應是以下這段引起的 38,39 引腳開關同時為1期間的num不斷加數所引起 ...

谢了,大哥,不是那里的问题,是罗盘里面有个地方少了个延时,现在的新问题是,你用手去让灰度检测到第二次的时候,让其转90度,然后,旋转小车,它会在给定的范围跳出那个程序,不过跑起来的时候,它会转个180度,好郁闷

eddiewwm 发表于 2014-4-20 18:58:55

gly1215216357 发表于 2014-4-20 16:06 static/image/common/back.gif
谢了,大哥,不是那里的问题,是罗盘里面有个地方少了个延时,现在的新问题是,你用手去让灰度检测到第二 ...

相信這是同一個事情的兩個面,面對這類的問題,一般來說加延時來確保不會有「重觸發」是必須的,其原理就如按鍵的去抖延時一樣。唯一要進一步思考的,單在「罗盘里面有加了个延时」,問題就就完全解決了嗎?還是要在這段代碼中加比較好,又或是在兩處也加更好呢?而最佳延時又是多少?這都是要仔細調整的,努力吧,祝你早日成功解決問題。
页: [1]
查看完整版本: 电子罗盘配合小车转特定角度期间出现的问题