GaryChan 发表于 2015-3-9 16:56:03

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

利用L298N电机驱动模块、智能车测速模块、Arduino UNO R3控制、7.4V锂电池供电(一节3.7V,共两节)以及两个直流减速电机(香蕉电机),输入代码后,仅有电机转动,请求各路解答……

#include <MsTimer2.h>
#defineValue 1.02101761//计算周长的常量

//volatile int state = HIGH;

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

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

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

float velocity(int n)
{
//(n/20)轮子装的圈数,轮子直径是65mm
//速度的计算公式应该为(n/20)×(65×π)即n*1.02101761
//后面的计算得常数
float vel =Value*(n/20)*(65*3.14159);
return vel;
}
void flash()
{//noInterrupts();
//String s1="";
// String s2="";
int r,l;
r=r_wheel;l=l_wheel;
//noInterrupts();
r_velocity=velocity(r);
l_velocity=velocity(l);
//Serial.print(r_velocity);
// Serial.print("\0");
// itoa (r_wheel,buffer1,10);
//itoa (l_wheel,buffer2,10);
//s1+=r;
//s2+=l;

Serial.print(l_velocity);
   Serial.print("mm/s(L)");
Serial.print(" ");
// Serial.print(l_velocity);
// Serial.print("\0");
Serial.print(r_velocity);
   Serial.println("mm/s(R)");
r_wheel = 0;
l_wheel = 0;
//interrupts();
}


void setup ()
{
Serial.begin(9600);

attachInterrupt(1,RCount, FALLING);
attachInterrupt(0,LCount, FALLING);

pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
pinMode(IN3,OUTPUT);
pinMode(IN4,OUTPUT);
pinMode(ENA,OUTPUT);
pinMode(ENB,OUTPUT);

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

}

void loop()
{
analogWrite(ENA,84);//电机1全速前进
analogWrite(ENB,79);//电机2全速前进
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);//电机1正转
digitalWrite(IN3,LOW);
digitalWrite(IN4,HIGH);//电机2正转

while (1)
{
//   digitalWrite(13, state);
}

}
void LCount()
{
l_wheel++;
// state=!state;

}
void RCount()
{
r_wheel++;
}

ofourme 发表于 2015-3-10 14:39:53

定时器中断没有输出?

GaryChan 发表于 2015-3-10 15:38:45

ofourme 发表于 2015-3-10 14:39 static/image/common/back.gif
定时器中断没有输出?

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

suoma 发表于 2015-3-10 18:35:35

是日本sharpGP2D12吗?

GaryChan 发表于 2015-3-11 10:58:08

suoma 发表于 2015-3-10 18:35 static/image/common/back.gif
是日本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 中向它發出要求, 回傳及重設數值會比較安全.

GaryChan 发表于 2015-3-13 08:56:48

那与那鹰那人 发表于 2015-3-13 08:20 static/image/common/back.gif
我觉得这个人说的在理,咱们在好好研究吧。
如果左右同時 觸發, 有可能當中一個會被 ignore.而且, LCoun ...

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

那与那鹰那人 发表于 2015-3-13 10:22:47

我没用外部中断,我用的是定时器中断,为什么我读出来的数都是0.00./*************************************
http://cfunworld.taobao.com/ //创趣天地旗舰店
http://www.cfunworld.com/ //创趣天地官方论坛
对遮挡进行计数,并通过串口输出总次数
*************************************/
#include <FlexiTimer2.h>
int speedPin =20;//定义数字4接口
int cntValue = 0;
#defineValue 1.02101761//计算周长的常量
float r_velocity=0;//速度;

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

int r;
r=cntValue;
r_velocity=velocity(r);
Serial.println(r_velocity);
cntValue = 0;
}

void setup ()
{            

pinMode(speedPin,INPUT);//4号数字口设置为输入状态
Serial.begin(9600);
// Serial.println("Speed Count\n");
   FlexiTimer2::set(500, flash);      // 中断设置函数,每 1s 进入一次中断
FlexiTimer2::start();
}
void loop()
{
   //判断是否被遮挡
if(digitalRead(speedPin) == 0)
{
    cntValue ++;//计数增加
   // Serial.println(cntValue);//串口输出计数值
    while(digitalRead(speedPin) == 0);//等待遮挡结束
}
}
部中断,我yog

GaryChan 发表于 2015-3-13 19:11:25

那与那鹰那人 发表于 2015-3-13 10:22 static/image/common/back.gif
我没用外部中断,我用的是定时器中断,为什么我读出来的数都是0.00.部中断,我yog

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

那与那鹰那人 发表于 2015-3-14 15:21:22

那个注释的地方我忘了改了,我用的是meag2560板子。以程序为主。

GaryChan 发表于 2015-3-14 16:55:34

那与那鹰那人 发表于 2015-3-14 15:21 static/image/common/back.gif
那个注释的地方我忘了改了,我用的是meag2560板子。以程序为主。

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

妖七七丶 发表于 2015-4-17 12:59:39

:) 大大你好~~刚看到您的测速程序,跟我遇到的问题一样。我也用ARDUINO UNO的板子。请问您问题解决了吗? 如果解决了,希望您能帮忙告诉我一下解决办法。多谢啊:handshake
页: [1]
查看完整版本: [新问题]智能小车测速模块