极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 16057|回复: 7

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

[复制链接]
发表于 2014-4-16 16:09:43 | 显示全部楼层 |阅读模式
#define uchar unsigned char
#define uint unsigned int
#define R_L1 27
byte StartStr=0x91;
byte ReadStr[9];
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[i]=Serial3.read();
    delay(10);
    i++;
      }
    a=(ReadStr[2])-48;
    b=int(ReadStr[3])-48;
    c=int(ReadStr[4])-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是用来记路口的),忘大神们指点一下小弟
回复

使用道具 举报

发表于 2014-4-16 19:10:55 | 显示全部楼层
我以前也曾试过利用罗盘控制小车转一个角度,但是失败了。外界对罗盘的干扰是一个问题,而且罗盘使用前还要进行校正。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-17 15:27:19 | 显示全部楼层
你能帮我写一个用i2c通信的代码吗?
回复 支持 反对

使用道具 举报

发表于 2014-4-19 13:22:41 | 显示全部楼层
我也没写过I2C通信的代码,不过你可以参考这篇文章:
http://www.eefocus.com/zhang700309/blog/12-01/236815_59f78.html
回复 支持 反对

使用道具 举报

发表于 2014-4-19 13:44:02 | 显示全部楼层
// num值会一下子蹦到一万多 // 的問題,應是以下這段引起的 38,39 引腳開關同時為1期間的num不斷加數所引起的
      {
       while(digitalRead(38)||digitalRead(39));
         num++;
         //Serial.print(num,DEC);
         //Serial.print("\n");
        }

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


回复 支持 反对

使用道具 举报

发表于 2014-4-19 14:32:35 | 显示全部楼层
gly1215216357 发表于 2014-4-17 15:27
你能帮我写一个用i2c通信的代码吗?

你寫 I2C 時遇到了甚麼的問題?代碼的要求是甚麼?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-20 16:06:03 | 显示全部楼层
eddiewwm 发表于 2014-4-19 13:44
// num值会一下子蹦到一万多 // 的問題,應是以下這段引起的 38,39 引腳開關同時為1期間的num不斷加數所引起 ...

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

使用道具 举报

发表于 2014-4-20 18:58:55 | 显示全部楼层
gly1215216357 发表于 2014-4-20 16:06
谢了,大哥,不是那里的问题,是罗盘里面有个地方少了个延时,现在的新问题是,你用手去让灰度检测到第二 ...

相信這是同一個事情的兩個面,面對這類的問題,一般來說加延時來確保不會有「重觸發」是必須的,其原理就如按鍵的去抖延時一樣。唯一要進一步思考的,單在「罗盘里面有加了个延时」,問題就就完全解決了嗎?還是要在這段代碼中加比較好,又或是在兩處也加更好呢?而最佳延時又是多少?這都是要仔細調整的,努力吧,祝你早日成功解決問題。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-6 00:21 , Processed in 0.036719 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表