极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 26479|回复: 12

[新问题]智能小车测速模块

[复制链接]
发表于 2015-3-9 16:56:03 | 显示全部楼层 |阅读模式
利用L298N电机驱动模块、智能车测速模块、Arduino UNO R3控制、7.4V锂电池供电(一节3.7V,共两节)以及两个直流减速电机(香蕉电机),输入代码后,仅有电机转动,请求各路解答……

  1. #include <MsTimer2.h>
  2. #define  Value 1.02101761  //计算周长的常量

  3. //volatile int state = HIGH;

  4. int u_left = 2;//定义U型测速端口
  5. int u_right = 3;

  6. int IN1=4;
  7. int IN2=5;
  8. int ENA=10;  
  9. int IN3=6;
  10. int IN4=7;   
  11. int ENB=11;  

  12. int r_wheel = 0; //记录U型测速模块的次数
  13. int l_wheel = 0;
  14. float r_velocity=0;//速度;
  15. float l_velocity=0;

  16. float velocity(int n)
  17. {
  18.   //(n/20)轮子装的圈数,轮子直径是65mm
  19.   //速度的计算公式应该为  (n/20)×(65×π)  即n*1.02101761
  20.   //后面的计算得常数
  21.   float vel =Value*(n/20)*(65*3.14159);
  22.   return vel;
  23. }
  24. void flash()
  25. {//noInterrupts();
  26.   //String s1="";
  27. // String s2="";
  28.   int r,l;
  29.   r=r_wheel;l=l_wheel;
  30.   //noInterrupts();
  31.   r_velocity=velocity(r);
  32.   l_velocity=velocity(l);
  33.   //Serial.print(r_velocity);
  34. // Serial.print("\0");
  35. // itoa (r_wheel,buffer1,10);
  36.   //itoa (l_wheel,buffer2,10);
  37.   //s1+=r;
  38.   //s2+=l;

  39.   Serial.print(l_velocity);
  40.    Serial.print("mm/s(L)");
  41.   Serial.print(" ");
  42.   // Serial.print(l_velocity);
  43.   // Serial.print("\0");
  44.   Serial.print(r_velocity);
  45.    Serial.println("mm/s(R)");
  46.   r_wheel = 0;
  47.   l_wheel = 0;
  48. //  interrupts();
  49. }


  50. void setup ()
  51. {
  52.   Serial.begin(9600);

  53.   attachInterrupt(1,RCount, FALLING);
  54.   attachInterrupt(0,LCount, FALLING);

  55.   pinMode(IN1,OUTPUT);
  56.   pinMode(IN2,OUTPUT);
  57.   pinMode(IN3,OUTPUT);
  58.   pinMode(IN4,OUTPUT);
  59.   pinMode(ENA,OUTPUT);
  60.   pinMode(ENB,OUTPUT);

  61.   MsTimer2::set(1000, flash);        // 中断设置函数,每 1s 进入一次中断
  62.   MsTimer2::start();

  63. }

  64. void loop()
  65. {
  66.   analogWrite(ENA,84);//电机1全速前进
  67.   analogWrite(ENB,79);//电机2全速前进
  68.   digitalWrite(IN1,LOW);
  69.   digitalWrite(IN2,HIGH);//电机1正转
  70.   digitalWrite(IN3,LOW);
  71.   digitalWrite(IN4,HIGH);//电机2正转

  72.   while (1)
  73.   {
  74. //   digitalWrite(13, state);
  75.   }

  76. }
  77. void LCount()
  78. {
  79.   l_wheel++;
  80. // state=!state;

  81. }
  82. void RCount()
  83. {
  84.   r_wheel++;
  85. }
复制代码

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2015-3-10 14:39:53 | 显示全部楼层
定时器中断没有输出?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-10 15:38:45 | 显示全部楼层
ofourme 发表于 2015-3-10 14:39
定时器中断没有输出?

你是说pinMode(2,INPUT);pinMode(3,INPUT);加了也没什么作用……不知道是不是计时器冲突
回复 支持 反对

使用道具 举报

发表于 2015-3-10 18:35:35 | 显示全部楼层
是日本sharpGP2D12吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-11 10:58:08 | 显示全部楼层
suoma 发表于 2015-3-10 18:35
是日本sharpGP2D12吗?

不是……我用的是超声波测距,你那个是红外
回复 支持 反对

使用道具 举报

发表于 2015-3-13 08:08:28 | 显示全部楼层
你的这个问题也是困扰我的,现在单个测速模块能实现,连个测速模块就不能实现,我不知道这是为什么,我用的程序和你的一样,如果你会了的话,第一时间通知我。
回复 支持 反对

使用道具 举报

发表于 2015-3-13 08:20:35 | 显示全部楼层
我觉得这个人说的在理,咱们在好好研究吧。
如果左右同時 觸發, 有可能當中一個會被 ignore.  而且, LCount 及 RCount 也算是 short 了, 但 flash 實在有點長.  我不太肯定 MsTimer2 是否也是經 interrupt 觸發, 如果是的話, 因為執行 flash 而導致 lcount/rcount 失效的機會更大.

如果是 flash 引致就好辦了, 只要把 flash 改成不再由 interrupt 觸發就可以了, 例如放在 loop() 內, 再自行計算兩次讀取計數值的時間差去推算速度.  雖然多了一點計算, 但相信不會是問題.

但如果是因為左右同時觸發, 至導致當中一個失效, 就比較難解決了.

如果有個計數器的模塊自動計數, 無需靠 interrupt 計數, 在 Arduino 中向它發出要求, 回傳及重設數值會比較安全.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-13 08:56:48 | 显示全部楼层
那与那鹰那人 发表于 2015-3-13 08:20
我觉得这个人说的在理,咱们在好好研究吧。
如果左右同時 觸發, 有可能當中一個會被 ignore.  而且, LCoun ...

当把pwm调速语句“analogWrite()”改为“digitaWrite()”则电机都保持同一转速(无论如何调整pwm的转速值),串口监视器也能显示速度值,所以我个人认为应该与flash()无关……(小白一枚,见谅,勿喷)
回复 支持 反对

使用道具 举报

发表于 2015-3-13 10:22:47 | 显示全部楼层
我没用外部中断,我用的是定时器中断,为什么我读出来的数都是0.00.
  1. /*************************************
  2.   http://cfunworld.taobao.com/ //创趣天地旗舰店
  3.   http://www.cfunworld.com/ //创趣天地官方论坛
  4.   对遮挡进行计数,并通过串口输出总次数
  5. *************************************/
  6. #include <FlexiTimer2.h>
  7. int speedPin =20;//定义数字4接口
  8. int cntValue = 0;
  9. #define  Value 1.02101761  //计算周长的常量
  10. float r_velocity=0;//速度;

  11. float velocity(int n)
  12. {
  13.   //(n/20)轮子装的圈数,轮子直径是65mm
  14.   //速度的计算公式应该为  (n/20)×(65×π)  即n*1.02101761
  15.   //后面的计算得常数
  16.   float vel =Value*(n/20)*(65*3.14159);
  17.   return vel;
  18. }
  19. void flash()
  20. {

  21.   int r;
  22.   r=cntValue;
  23.   r_velocity=velocity(r);
  24.   Serial.println(r_velocity);
  25.   cntValue = 0;
  26. }

  27. void setup ()
  28. {            
  29.   
  30.   pinMode(speedPin,INPUT);  //4号数字口设置为输入状态
  31.   Serial.begin(9600);
  32. // Serial.println("Speed Count\n");
  33.      FlexiTimer2::set(500, flash);        // 中断设置函数,每 1s 进入一次中断
  34.   FlexiTimer2::start();
  35. }
  36. void loop()
  37. {
  38.      //判断是否被遮挡
  39.   if(digitalRead(speedPin) == 0)
  40.   {
  41.     cntValue ++;//计数增加
  42.    // Serial.println(cntValue);//串口输出计数值
  43.     while(digitalRead(speedPin) == 0);//等待遮挡结束
  44.   }  
  45. }
复制代码
部中断,我yog

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-13 19:11:25 | 显示全部楼层
那与那鹰那人 发表于 2015-3-13 10:22
我没用外部中断,我用的是定时器中断,为什么我读出来的数都是0.00.部中断,我yog

怎么你声明变量“int speedPin =20;//定义数字4接口”?不应该是“int speedPin =4;//定义数字4接口”?
回复 支持 反对

使用道具 举报

发表于 2015-3-14 15:21:22 | 显示全部楼层
那个注释的地方我忘了改了,我用的是meag2560板子。以程序为主。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-14 16:55:34 | 显示全部楼层
那与那鹰那人 发表于 2015-3-14 15:21
那个注释的地方我忘了改了,我用的是meag2560板子。以程序为主。

我用的是UNO R3板,所大同小异……(我本身是小白一枚)所以,见谅
回复 支持 反对

使用道具 举报

发表于 2015-4-17 12:59:39 | 显示全部楼层
大大你好~~刚看到您的测速程序,跟我遇到的问题一样。我也用ARDUINO UNO的板子。请问您问题解决了吗? 如果解决了,希望您能帮忙告诉我一下解决办法。多谢啊
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-29 03:28 , Processed in 0.044988 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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