极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 43808|回复: 10

小车测速码盘读数请教(主要是想让小车走直线)?

[复制链接]
发表于 2012-9-12 17:35:13 | 显示全部楼层 |阅读模式
本帖最后由 wzc0066 于 2012-9-12 19:58 编辑

购买的小车底盘是 路虎5履带底盘(2WD),并带有两个测速模块,支持Arduino读数。
小车底盘及测速模块见附件;

商家告诉我每转一圈,码盘状态会跳变8次(码盘包括4个黑色块和4个白色块,接入一数字口,分别对应0和1的输出),但我这边读出来竟然达到160多次;

测试代码:
  1. int pin = 4; //连接到pin 4
  2. int i;
  3. int j;
  4. int n = 0; //码盘读数(即状态跳变次数)
  5. int flag = 0; //因为初始读数可能为0或1,该标志是用来读取初始状态的

  6. void setup() {
  7.   Serial.begin(9600);
  8.   pinMode(pin, INPUT);
  9. }

  10. void loop() {
  11.   i = digitalRead(pin); //读取码盘状态(0或1)
  12.   if(!flag){ //获取初始状态读数
  13.       j = i;
  14.       flag = 1;
  15.   }
  16.   
  17.   if(i != j){ //每次状态发生跳变的时候,读数增加1
  18.     n += 1;
  19.     j = i;
  20.   }  
  21.   Serial.println(n);  
  22. }
复制代码


代码很简单,请大家帮忙看一下,有什么错误吗?

厂家没提供测试代码,说本论坛里面有,但没搜索到,有使用过这款底盘的朋友现身探讨一下吧。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2012-9-12 19:27:31 | 显示全部楼层
也许是由于干扰导致的

可以搞个斯密特触发器试试
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-9-12 19:57:38 | 显示全部楼层
本帖最后由 wzc0066 于 2012-9-12 20:01 编辑

通过附件图片,编码器(那个黑白相间的东东)好像是通过减速齿轮带动的,会不会是这个原因呢(外轮转一圈,里面的转了很多圈) ?

还有一个问题:假设当前的读数是正确的,后面的调试让小车走直线:不断读取两边的读数,如果哪一边读数较大,则将该侧马达降为半速(另一边读数较小的为满速),运行持续50ms(delay(50));

调速后两边的读数基本接近了(大约相差2或3,每圈的读数约为160多,所以差异的比率蛮小的),但小车运行的更不直了(准确的说抖动比较厉害)

做过直线行驶的朋友麻烦指点一下。
回复 支持 反对

使用道具 举报

发表于 2012-9-14 21:54:13 | 显示全部楼层
这边读出来竟然达到160多次 --- 怎么判断出来的?,你的一圈可能内部已是十多圈了
可简化为下列句子

int pin = 4; //连接到pin 4
int i;
int j;
int n = 0; //码盘读数(即状态跳变次数)

void setup() {
  Serial.begin(9600);
  pinMode(pin, INPUT);
  j= digitalRead(pin); //读取码盘状态(0或1)
}

void loop() {
  i = digitalRead(pin); //读取码盘状态(0或1)
  if(i != j){ //每次状态发生跳变的时候,读数增加1
    n += 1;
    j = i;
   Serial.println(n);
  }  
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-9-17 12:18:46 | 显示全部楼层
本帖最后由 wzc0066 于 2012-9-17 12:23 编辑
yyy_zc 发表于 2012-9-14 21:54
这边读出来竟然达到160多次 --- 怎么判断出来的?,你的一圈可能内部已是十多圈了
可简化为下列句子


非常感谢,确实简化了不少!

现在假如读数已经正确获得了,然后就是要矫正行驶中产生的偏差了:

想法是(以“前进”为例,pwm速度值是通过2.4G遥控器给的):
  * 如果左轮读数大,则左轮pwm降为一半,右轮保持原速度值;
  * 如果右轮读数大,同样处理
  * 读数相等,则等度行驶

这样调节后,从串口的输出来看两边的读数已经很接近了(差额 0~3 这样吧,一圈的读数大约是164,所以从比例来看两边轮子已经非常接近了),但小车的真实运行情况却大不如自然状况下(就是非调控状态下前进,小车会越走越弯),感觉左边快一阵,然后右边快一阵,轨迹很凌乱!

请做过闭环控制的朋友提宝贵意见。。。
回复 支持 反对

使用道具 举报

发表于 2013-6-21 20:14:09 | 显示全部楼层
如果光电编码器的精度高,这样计数准确吧,可不可以用中断计数,新人不懂
回复 支持 反对

使用道具 举报

发表于 2013-8-18 20:20:06 | 显示全部楼层
朋友 你的这个实验后来成功了吗?我最近也在做一个和你这个类似的东西,有的问题想请教你.你的i,j分别代表两边的轮子吗?我发现你的编程相对别的比较简单,我看很多都用到PID编程,你这个好像没用到PID?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-27 13:01:56 | 显示全部楼层
这个编码器太烂了,没实验成功呢。。。
回复 支持 反对

使用道具 举报

发表于 2014-3-1 09:50:13 | 显示全部楼层
代码有点冗余。其实这种反射式的编码盘确实不好用,对射式的效果会更好。给你个网址,我买的这种测速模块:http://item.taobao.com/item.htm?spm=a1z10.3.w4002-305338327.42.A1RHdA&id=12757713315
申明:我不是打广告的!!
回复 支持 反对

使用道具 举报

发表于 2014-8-6 16:42:33 | 显示全部楼层
要用pid吧,靠这个走直线不靠谱吧
回复 支持 反对

使用道具 举报

发表于 2015-1-15 15:54:44 | 显示全部楼层
楼主,你这个测速的时间上是怎么控制的啊?用了中断了吗?中断我还不会,我用了一个光电槽的来测速,但是我不知道怎么去设置单位时间,怎么让它显示每秒钟的变化次数?
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-17 11:00 , Processed in 0.070576 second(s), 25 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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