GaryChan 发表于 2015-2-13 12:15:21

Arduino智能小车+L298N+测速模块+5110液晶屏,车速显示功能实现过程遇到的小问题

Arduino智能小车+L298N+测速模块+5110液晶屏,车速显示功能实现过程遇到的小问题(液晶屏一直保持000cm/s的状态,但修改中断时间为5000ms时会出现速度值,但也只持续5000ms,之后一直保持000cm/s,求各路前辈指教,新手一枚)
以下为烧录的代码
#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 leftPWM=10;
int IN3=6;
int IN4=7;   
int rightPWM=11;

int lcd_ce=2;
int lcd_rst=3;
int sclk=4;
int sdin=5;
int lcd_dc=6;//5110

//****************************定义ascii字符**********************//

/**********************************
6 x 8 font
1 pixel space at left and bottom
index = ascii - 32
***********************************/
const unsigned char font6x8[] =
{
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },   // sp
    { 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00 },   // !
    { 0x00, 0x00, 0x07, 0x00, 0x07, 0x00 },   // "
    { 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14 },   // #
    { 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12 },   // $
    { 0x00, 0x62, 0x64, 0x08, 0x13, 0x23 },   // %
    { 0x00, 0x36, 0x49, 0x55, 0x22, 0x50 },   // &
    { 0x00, 0x00, 0x05, 0x03, 0x00, 0x00 },   // '
    { 0x00, 0x00, 0x1c, 0x22, 0x41, 0x00 },   // (
    { 0x00, 0x00, 0x41, 0x22, 0x1c, 0x00 },   // )
    { 0x00, 0x14, 0x08, 0x3e, 0x08, 0x14 },   // *
    { 0x00, 0x08, 0x08, 0x3e, 0x08, 0x08 },   // +
    { 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00 },   // ,
    { 0x00, 0x08, 0x08, 0x08, 0x08, 0x08 },   // -
    { 0x00, 0x00, 0x60, 0x60, 0x00, 0x00 },   // .
    { 0x00, 0x20, 0x10, 0x08, 0x04, 0x02 },   // /
    { 0x00, 0x3e, 0x51, 0x49, 0x45, 0x3e },   // 0
    { 0x00, 0x00, 0x42, 0x7f, 0x40, 0x00 },   // 1
    { 0x00, 0x42, 0x61, 0x51, 0x49, 0x46 },   // 2
    { 0x00, 0x21, 0x41, 0x45, 0x4b, 0x31 },   // 3
    { 0x00, 0x18, 0x14, 0x12, 0x7f, 0x10 },   // 4
    { 0x00, 0x27, 0x45, 0x45, 0x45, 0x39 },   // 5
    { 0x00, 0x3c, 0x4a, 0x49, 0x49, 0x30 },   // 6
    { 0x00, 0x01, 0x71, 0x09, 0x05, 0x03 },   // 7
    { 0x00, 0x36, 0x49, 0x49, 0x49, 0x36 },   // 8
    { 0x00, 0x06, 0x49, 0x49, 0x29, 0x1e },   // 9
    { 0x00, 0x00, 0x36, 0x36, 0x00, 0x00 },   // :
    { 0x00, 0x00, 0x56, 0x36, 0x00, 0x00 },   // ;
    { 0x00, 0x08, 0x14, 0x22, 0x41, 0x00 },   // <
    { 0x00, 0x14, 0x14, 0x14, 0x14, 0x14 },   // =
    { 0x00, 0x00, 0x41, 0x22, 0x14, 0x08 },   // >
    { 0x00, 0x02, 0x01, 0x51, 0x09, 0x06 },   // ?
    { 0x00, 0x32, 0x49, 0x59, 0x51, 0x3e },   // @
    { 0x00, 0x7c, 0x12, 0x11, 0x12, 0x7c },   // a
    { 0x00, 0x7f, 0x49, 0x49, 0x49, 0x36 },   // b
    { 0x00, 0x3e, 0x41, 0x41, 0x41, 0x22 },   // c
    { 0x00, 0x7f, 0x41, 0x41, 0x22, 0x1c },   // d
    { 0x00, 0x7f, 0x49, 0x49, 0x49, 0x41 },   // e
    { 0x00, 0x7f, 0x09, 0x09, 0x09, 0x01 },   // f
    { 0x00, 0x3e, 0x41, 0x49, 0x49, 0x7a },   // g
    { 0x00, 0x7f, 0x08, 0x08, 0x08, 0x7f },   // h
    { 0x00, 0x00, 0x41, 0x7f, 0x41, 0x00 },   // i
    { 0x00, 0x20, 0x40, 0x41, 0x3f, 0x01 },   // j
    { 0x00, 0x7f, 0x08, 0x14, 0x22, 0x41 },   // k
    { 0x00, 0x7f, 0x40, 0x40, 0x40, 0x40 },   // l
    { 0x00, 0x7f, 0x02, 0x0c, 0x02, 0x7f },   // m
    { 0x00, 0x7f, 0x04, 0x08, 0x10, 0x7f },   // n
    { 0x00, 0x3e, 0x41, 0x41, 0x41, 0x3e },   // o
    { 0x00, 0x7f, 0x09, 0x09, 0x09, 0x06 },   // p
    { 0x00, 0x3e, 0x41, 0x51, 0x21, 0x5e },   // q
    { 0x00, 0x7f, 0x09, 0x19, 0x29, 0x46 },   // r
    { 0x00, 0x46, 0x49, 0x49, 0x49, 0x31 },   // s
    { 0x00, 0x01, 0x01, 0x7f, 0x01, 0x01 },   // t
    { 0x00, 0x3f, 0x40, 0x40, 0x40, 0x3f },   // u
    { 0x00, 0x1f, 0x20, 0x40, 0x20, 0x1f },   // v
    { 0x00, 0x3f, 0x40, 0x38, 0x40, 0x3f },   // w
    { 0x00, 0x63, 0x14, 0x08, 0x14, 0x63 },   // x
    { 0x00, 0x07, 0x08, 0x70, 0x08, 0x07 },   // y
    { 0x00, 0x61, 0x51, 0x49, 0x45, 0x43 },   // z
    { 0x00, 0x00, 0x7f, 0x41, 0x41, 0x00 },   // [
    { 0x00, 0x55, 0x2a, 0x55, 0x2a, 0x55 },   // 55
    { 0x00, 0x00, 0x41, 0x41, 0x7f, 0x00 },   // ]
    { 0x00, 0x04, 0x02, 0x01, 0x02, 0x04 },   // ^
    { 0x00, 0x40, 0x40, 0x40, 0x40, 0x40 },   // _
    { 0x00, 0x00, 0x01, 0x02, 0x04, 0x00 },   // '
    { 0x00, 0x20, 0x54, 0x54, 0x54, 0x78 },   // a
    { 0x00, 0x7f, 0x48, 0x44, 0x44, 0x38 },   // b
    { 0x00, 0x38, 0x44, 0x44, 0x44, 0x20 },   // c
    { 0x00, 0x38, 0x44, 0x44, 0x48, 0x7f },   // d
    { 0x00, 0x38, 0x54, 0x54, 0x54, 0x18 },   // e
    { 0x00, 0x08, 0x7e, 0x09, 0x01, 0x02 },   // f
    { 0x00, 0x18, 0xa4, 0xa4, 0xa4, 0x7c },   // g
    { 0x00, 0x7f, 0x08, 0x04, 0x04, 0x78 },   // h
    { 0x00, 0x00, 0x44, 0x7d, 0x40, 0x00 },   // i
    { 0x00, 0x40, 0x80, 0x84, 0x7d, 0x00 },   // j
    { 0x00, 0x7f, 0x10, 0x28, 0x44, 0x00 },   // k
    { 0x00, 0x00, 0x41, 0x7f, 0x40, 0x00 },   // l
    { 0x00, 0x7c, 0x04, 0x18, 0x04, 0x78 },   // m
    { 0x00, 0x7c, 0x08, 0x04, 0x04, 0x78 },   // n
    { 0x00, 0x38, 0x44, 0x44, 0x44, 0x38 },   // o
    { 0x00, 0xfc, 0x24, 0x24, 0x24, 0x18 },   // p
    { 0x00, 0x18, 0x24, 0x24, 0x18, 0xfc },   // q
    { 0x00, 0x7c, 0x08, 0x04, 0x04, 0x08 },   // r
    { 0x00, 0x48, 0x54, 0x54, 0x54, 0x20 },   // s
    { 0x00, 0x04, 0x3f, 0x44, 0x40, 0x20 },   // t
    { 0x00, 0x3c, 0x40, 0x40, 0x20, 0x7c },   // u
    { 0x00, 0x1c, 0x20, 0x40, 0x20, 0x1c },   // v
    { 0x00, 0x3c, 0x40, 0x30, 0x40, 0x3c },   // w
    { 0x00, 0x44, 0x28, 0x10, 0x28, 0x44 },   // x
    { 0x00, 0x1c, 0xa0, 0xa0, 0xa0, 0x7c },   // y
    { 0x00, 0x44, 0x64, 0x54, 0x4c, 0x44 },   // z
    { 0x14, 0x14, 0x14, 0x14, 0x14, 0x14 }    // horiz lines
};
/************************lcd初始化函数********************************/
void lcd_init(void)
{
    //先设置为输出
   pinMode(sclk,OUTPUT);
   pinMode(sdin,OUTPUT);
   pinMode(lcd_dc,OUTPUT);
   pinMode(lcd_ce,OUTPUT);
   pinMode(lcd_rst,OUTPUT);
   
    // 产生一个让lcd复位的低电平脉冲
   digitalWrite( lcd_rst, LOW);
   
   delayMicroseconds(1);
   digitalWrite( lcd_rst, HIGH);
   
    // 关闭lcd
   digitalWrite( lcd_ce, LOW);
   delayMicroseconds(1);

    // 使能lcd
   digitalWrite( lcd_ce, HIGH); //lcd_ce = 1;
   delayMicroseconds(1);
    lcd_write_byte(0x21, 0); // 使用扩展命令设置lcd模式
    lcd_write_byte(0xc8, 0); // 设置偏置电压
    lcd_write_byte(0x06, 0); // 温度校正
    lcd_write_byte(0x13, 0); // 1:48
    lcd_write_byte(0x20, 0); // 使用基本命令
    lcd_clear();             // 清屏
    lcd_write_byte(0x0c, 0); // 设定显示模式,正常显示
         
    // 关闭lcd
   digitalWrite( lcd_ce, LOW);//lcd_ce = 0;
}
/************************lcd清屏函数*******************************/
void lcd_clear(void)
{
    unsigned int i;
    lcd_write_byte(0x0c, 0);
    lcd_write_byte(0x80, 0);
    for (i=0; i<504; i++)
      {
      lcd_write_byte(0, 1);
      }   
}
/*************************设置字符位置函数**************************/
void lcd_set_xy(unsigned char x, unsigned char y)
{
    lcd_write_byte(0x40 | y, 0);// column
    lcd_write_byte(0x80 | x, 0);// row
}
/*************************ascii字符显示函数*************************/
void lcd_write_char(unsigned char c)
{
    unsigned char line;
    c -= 32;
    for (line=0; line<6; line++)
    {
      lcd_write_byte(font6x8, 1);
    }
}
/*******************************************************************/
/*-------------------------------------------------
lcd_write_english_string: 英文字符串显示函数
输入参数:*s      :英文字符串指针;
          x、y    : 显示字符串的位置,x 0-83 ,y 0-5
--------------------------------------------------*/
void lcd_write_english_string(unsigned char x,unsigned char y,char *s)
{
    lcd_set_xy(x,y);
    while (*s)
    {
   lcd_write_char(*s);
   s++;
    }
}
/******************************************************************/
/*---------------------------------------------
lcd_write_byte    : 写数据到lcd
输入参数:data    :写入的数据;
          command :写数据/命令选择;
---------------------------------------------*/
void lcd_write_byte(unsigned char dat, unsigned char command)
{
    unsigned char i;
   digitalWrite( lcd_ce, LOW); // 使能lcd_ce = 0
    if (command == 0)
    {
   digitalWrite( lcd_dc, LOW);// 传送命令 lcd_dc = 0;
    }
    else
    {
      digitalWrite( lcd_dc, HIGH);// 传送数据lcd_dc = 1;
    }

for(i=0;i<8;i++)
{
   if(dat&0x80)
   {
      digitalWrite( sdin, HIGH);//sdin = 1;
   }
    else
    {
   digitalWrite( sdin, LOW);//sdin = 0;
   }
   digitalWrite( sclk, LOW);//sclk = 0;
   dat = dat << 1;
   digitalWrite( sclk, HIGH);//sclk = 1;
}
    digitalWrite( lcd_ce, HIGH);//lcd_ce = 1;
      
}
/******************************************************************/

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()
{
lcd_init();//初始化液晶   
lcd_clear();

    lcd_write_english_string(0,0,"L:");
    lcd_write_english_string(0,1,"R:");

int r,l;
r=r_wheel;l=l_wheel;
int rv,lv;
rv=velocity(r);
lv=velocity(l);
//Serial.print(r_velocity);
// Serial.print("\0");
// itoa (r_wheel,buffer1,10);
//itoa (l_wheel,buffer2,10);
//s1+=r;
//s2+=l;


lcd_write_english_string(60,0,"cm/s");
lcd_set_xy(10, 0);
          lcd_write_char( 0x30+lv%1000/100);
          lcd_write_char( 0x30+lv%100/10);
          lcd_write_char( 0x30+lv%10);//显示位数

lcd_write_english_string(60,1,"cm/s");
          lcd_set_xy(10, 1);
          lcd_write_char( 0x30+rv%1000/100);
          lcd_write_char( 0x30+rv%100/10);
          lcd_write_char( 0x30+rv%10); //显示位数

r_wheel = 0;
l_wheel = 0;
//interrupts();
}


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

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

pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
pinMode(IN3,OUTPUT);
pinMode(IN4,OUTPUT);
pinMode(leftPWM,OUTPUT);
pinMode(rightPWM,OUTPUT);

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

}

void loop()
{
digitalWrite( leftPWM,50);//电机1全速前进
digitalWrite(rightPWM,50);//电机2全速前进
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);//电机1正转
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);//电机2正转

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

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

}
void RCount()
{
r_wheel++;
}

pumpitup 发表于 2015-2-15 15:03:03

留爪,,,我也在做这个最近

GaryChan 发表于 2015-2-15 16:48:43

pumpitup 发表于 2015-2-15 15:03 static/image/common/back.gif
留爪,,,我也在做这个最近

也有遇到相似问题?我最近又有新问题:小车用PWM调速后依然不能走直线,后期还会出现偏摆,右轮偶尔出现停转现象,不知道是否右电机出现问题,问题多多,但感觉代码没什么问题……int pwm1 = 10;   
int IN1 = 4;
int IN2 = 5;
int pwm2 = 11;                        
int IN3 = 6;
int IN4 = 7;
void setup()
{
Serial.begin(9600);
pinMode(pwm1,OUTPUT);
pinMode(pwm2,OUTPUT);
int i;
for (i=4;i<=7;i++)
pinMode(i,OUTPUT); //设置数字端口4,5,6,7为输出模式
}
void loop()
{
   int value;
   for(value = 0 ; value <= 255; value+=1)
   {   
   digitalWrite(IN2,HIGH);
   digitalWrite(IN1,LOW);
   digitalWrite(IN4, HIGH);
   digitalWrite(IN3,LOW);
   analogWrite(pwm1, 78);   //PWM调速
   analogWrite(pwm2, 85);   //PWM调速
   }
}

pumpitup 发表于 2015-2-17 13:31:05

GaryChan 发表于 2015-2-15 16:48 static/image/common/back.gif
也有遇到相似问题?我最近又有新问题:小车用PWM调速后依然不能走直线,后期还会出现偏摆,右轮偶尔出现停 ...

我是不知道应该如何实时测速,感觉应该是测试最近1秒(还是别的时间段)里转过的圈数?
还是做一个数组,记录最近10个10秒的圈数?

GaryChan 发表于 2015-2-18 09:17:09

pumpitup 发表于 2015-2-17 13:31 static/image/common/back.gif
我是不知道应该如何实时测速,感觉应该是测试最近1秒(还是别的时间段)里转过的圈数?
还是做一个数组, ...

我是测试一秒钟里转过的周长数

pumpitup 发表于 2015-2-26 10:32:48

delta t 是不是长了一点了?
页: [1]
查看完整版本: Arduino智能小车+L298N+测速模块+5110液晶屏,车速显示功能实现过程遇到的小问题