极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 17545|回复: 5

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

[复制链接]
发表于 2015-2-13 12:15:21 | 显示全部楼层 |阅读模式
Arduino智能小车+L298N+测速模块+5110液晶屏,车速显示功能实现过程遇到的小问题(液晶屏一直保持000cm/s的状态,但修改中断时间为5000ms时会出现速度值,但也只持续5000ms,之后一直保持000cm/s,求各路前辈指教,新手一枚)
以下为烧录的代码
  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 leftPWM=10;  
  9. int IN3=6;
  10. int IN4=7;   
  11. int rightPWM=11;  

  12. int lcd_ce=2;
  13. int lcd_rst=3;
  14. int sclk=4;
  15. int sdin=5;
  16. int lcd_dc=6;//5110

  17. //****************************定义ascii字符**********************//

  18. /**********************************
  19. 6 x 8 font
  20. 1 pixel space at left and bottom
  21. index = ascii - 32
  22. ***********************************/
  23. const unsigned char font6x8[][6] =
  24. {
  25.     { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },   // sp
  26.     { 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00 },   // !
  27.     { 0x00, 0x00, 0x07, 0x00, 0x07, 0x00 },   // "
  28.     { 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14 },   // #
  29.     { 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12 },   // $
  30.     { 0x00, 0x62, 0x64, 0x08, 0x13, 0x23 },   // %
  31.     { 0x00, 0x36, 0x49, 0x55, 0x22, 0x50 },   // &
  32.     { 0x00, 0x00, 0x05, 0x03, 0x00, 0x00 },   // '
  33.     { 0x00, 0x00, 0x1c, 0x22, 0x41, 0x00 },   // (
  34.     { 0x00, 0x00, 0x41, 0x22, 0x1c, 0x00 },   // )
  35.     { 0x00, 0x14, 0x08, 0x3e, 0x08, 0x14 },   // *
  36.     { 0x00, 0x08, 0x08, 0x3e, 0x08, 0x08 },   // +
  37.     { 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00 },   // ,
  38.     { 0x00, 0x08, 0x08, 0x08, 0x08, 0x08 },   // -
  39.     { 0x00, 0x00, 0x60, 0x60, 0x00, 0x00 },   // .
  40.     { 0x00, 0x20, 0x10, 0x08, 0x04, 0x02 },   // /
  41.     { 0x00, 0x3e, 0x51, 0x49, 0x45, 0x3e },   // 0
  42.     { 0x00, 0x00, 0x42, 0x7f, 0x40, 0x00 },   // 1
  43.     { 0x00, 0x42, 0x61, 0x51, 0x49, 0x46 },   // 2
  44.     { 0x00, 0x21, 0x41, 0x45, 0x4b, 0x31 },   // 3
  45.     { 0x00, 0x18, 0x14, 0x12, 0x7f, 0x10 },   // 4
  46.     { 0x00, 0x27, 0x45, 0x45, 0x45, 0x39 },   // 5
  47.     { 0x00, 0x3c, 0x4a, 0x49, 0x49, 0x30 },   // 6
  48.     { 0x00, 0x01, 0x71, 0x09, 0x05, 0x03 },   // 7
  49.     { 0x00, 0x36, 0x49, 0x49, 0x49, 0x36 },   // 8
  50.     { 0x00, 0x06, 0x49, 0x49, 0x29, 0x1e },   // 9
  51.     { 0x00, 0x00, 0x36, 0x36, 0x00, 0x00 },   // :
  52.     { 0x00, 0x00, 0x56, 0x36, 0x00, 0x00 },   // ;
  53.     { 0x00, 0x08, 0x14, 0x22, 0x41, 0x00 },   // <
  54.     { 0x00, 0x14, 0x14, 0x14, 0x14, 0x14 },   // =
  55.     { 0x00, 0x00, 0x41, 0x22, 0x14, 0x08 },   // >
  56.     { 0x00, 0x02, 0x01, 0x51, 0x09, 0x06 },   // ?
  57.     { 0x00, 0x32, 0x49, 0x59, 0x51, 0x3e },   // @
  58.     { 0x00, 0x7c, 0x12, 0x11, 0x12, 0x7c },   // a
  59.     { 0x00, 0x7f, 0x49, 0x49, 0x49, 0x36 },   // b
  60.     { 0x00, 0x3e, 0x41, 0x41, 0x41, 0x22 },   // c
  61.     { 0x00, 0x7f, 0x41, 0x41, 0x22, 0x1c },   // d
  62.     { 0x00, 0x7f, 0x49, 0x49, 0x49, 0x41 },   // e
  63.     { 0x00, 0x7f, 0x09, 0x09, 0x09, 0x01 },   // f
  64.     { 0x00, 0x3e, 0x41, 0x49, 0x49, 0x7a },   // g
  65.     { 0x00, 0x7f, 0x08, 0x08, 0x08, 0x7f },   // h
  66.     { 0x00, 0x00, 0x41, 0x7f, 0x41, 0x00 },   // i
  67.     { 0x00, 0x20, 0x40, 0x41, 0x3f, 0x01 },   // j
  68.     { 0x00, 0x7f, 0x08, 0x14, 0x22, 0x41 },   // k
  69.     { 0x00, 0x7f, 0x40, 0x40, 0x40, 0x40 },   // l
  70.     { 0x00, 0x7f, 0x02, 0x0c, 0x02, 0x7f },   // m
  71.     { 0x00, 0x7f, 0x04, 0x08, 0x10, 0x7f },   // n
  72.     { 0x00, 0x3e, 0x41, 0x41, 0x41, 0x3e },   // o
  73.     { 0x00, 0x7f, 0x09, 0x09, 0x09, 0x06 },   // p
  74.     { 0x00, 0x3e, 0x41, 0x51, 0x21, 0x5e },   // q
  75.     { 0x00, 0x7f, 0x09, 0x19, 0x29, 0x46 },   // r
  76.     { 0x00, 0x46, 0x49, 0x49, 0x49, 0x31 },   // s
  77.     { 0x00, 0x01, 0x01, 0x7f, 0x01, 0x01 },   // t
  78.     { 0x00, 0x3f, 0x40, 0x40, 0x40, 0x3f },   // u
  79.     { 0x00, 0x1f, 0x20, 0x40, 0x20, 0x1f },   // v
  80.     { 0x00, 0x3f, 0x40, 0x38, 0x40, 0x3f },   // w
  81.     { 0x00, 0x63, 0x14, 0x08, 0x14, 0x63 },   // x
  82.     { 0x00, 0x07, 0x08, 0x70, 0x08, 0x07 },   // y
  83.     { 0x00, 0x61, 0x51, 0x49, 0x45, 0x43 },   // z
  84.     { 0x00, 0x00, 0x7f, 0x41, 0x41, 0x00 },   // [
  85.     { 0x00, 0x55, 0x2a, 0x55, 0x2a, 0x55 },   // 55
  86.     { 0x00, 0x00, 0x41, 0x41, 0x7f, 0x00 },   // ]
  87.     { 0x00, 0x04, 0x02, 0x01, 0x02, 0x04 },   // ^
  88.     { 0x00, 0x40, 0x40, 0x40, 0x40, 0x40 },   // _
  89.     { 0x00, 0x00, 0x01, 0x02, 0x04, 0x00 },   // '
  90.     { 0x00, 0x20, 0x54, 0x54, 0x54, 0x78 },   // a
  91.     { 0x00, 0x7f, 0x48, 0x44, 0x44, 0x38 },   // b
  92.     { 0x00, 0x38, 0x44, 0x44, 0x44, 0x20 },   // c
  93.     { 0x00, 0x38, 0x44, 0x44, 0x48, 0x7f },   // d
  94.     { 0x00, 0x38, 0x54, 0x54, 0x54, 0x18 },   // e
  95.     { 0x00, 0x08, 0x7e, 0x09, 0x01, 0x02 },   // f
  96.     { 0x00, 0x18, 0xa4, 0xa4, 0xa4, 0x7c },   // g
  97.     { 0x00, 0x7f, 0x08, 0x04, 0x04, 0x78 },   // h
  98.     { 0x00, 0x00, 0x44, 0x7d, 0x40, 0x00 },   // i
  99.     { 0x00, 0x40, 0x80, 0x84, 0x7d, 0x00 },   // j
  100.     { 0x00, 0x7f, 0x10, 0x28, 0x44, 0x00 },   // k
  101.     { 0x00, 0x00, 0x41, 0x7f, 0x40, 0x00 },   // l
  102.     { 0x00, 0x7c, 0x04, 0x18, 0x04, 0x78 },   // m
  103.     { 0x00, 0x7c, 0x08, 0x04, 0x04, 0x78 },   // n
  104.     { 0x00, 0x38, 0x44, 0x44, 0x44, 0x38 },   // o
  105.     { 0x00, 0xfc, 0x24, 0x24, 0x24, 0x18 },   // p
  106.     { 0x00, 0x18, 0x24, 0x24, 0x18, 0xfc },   // q
  107.     { 0x00, 0x7c, 0x08, 0x04, 0x04, 0x08 },   // r
  108.     { 0x00, 0x48, 0x54, 0x54, 0x54, 0x20 },   // s
  109.     { 0x00, 0x04, 0x3f, 0x44, 0x40, 0x20 },   // t
  110.     { 0x00, 0x3c, 0x40, 0x40, 0x20, 0x7c },   // u
  111.     { 0x00, 0x1c, 0x20, 0x40, 0x20, 0x1c },   // v
  112.     { 0x00, 0x3c, 0x40, 0x30, 0x40, 0x3c },   // w
  113.     { 0x00, 0x44, 0x28, 0x10, 0x28, 0x44 },   // x
  114.     { 0x00, 0x1c, 0xa0, 0xa0, 0xa0, 0x7c },   // y
  115.     { 0x00, 0x44, 0x64, 0x54, 0x4c, 0x44 },   // z
  116.     { 0x14, 0x14, 0x14, 0x14, 0x14, 0x14 }    // horiz lines
  117. };
  118. /************************lcd初始化函数********************************/  
  119. void lcd_init(void)
  120. {
  121.     //先设置为输出
  122.      pinMode(sclk,OUTPUT);
  123.      pinMode(sdin,OUTPUT);
  124.      pinMode(lcd_dc,OUTPUT);
  125.      pinMode(lcd_ce,OUTPUT);
  126.      pinMode(lcd_rst,OUTPUT);
  127.    
  128.     // 产生一个让lcd复位的低电平脉冲
  129.      digitalWrite( lcd_rst, LOW);
  130.    
  131.      delayMicroseconds(1);
  132.      digitalWrite( lcd_rst, HIGH);
  133.      
  134.     // 关闭lcd
  135.      digitalWrite( lcd_ce, LOW);
  136.      delayMicroseconds(1);

  137.     // 使能lcd
  138.      digitalWrite( lcd_ce, HIGH); //lcd_ce = 1;
  139.      delayMicroseconds(1);
  140.     lcd_write_byte(0x21, 0); // 使用扩展命令设置lcd模式
  141.     lcd_write_byte(0xc8, 0); // 设置偏置电压
  142.     lcd_write_byte(0x06, 0); // 温度校正
  143.     lcd_write_byte(0x13, 0); // 1:48
  144.     lcd_write_byte(0x20, 0); // 使用基本命令
  145.     lcd_clear();             // 清屏
  146.     lcd_write_byte(0x0c, 0); // 设定显示模式,正常显示
  147.          
  148.     // 关闭lcd
  149.    digitalWrite( lcd_ce, LOW);  //lcd_ce = 0;
  150. }
  151. /************************lcd清屏函数*******************************/
  152. void lcd_clear(void)
  153. {
  154.     unsigned int i;
  155.     lcd_write_byte(0x0c, 0);  
  156.     lcd_write_byte(0x80, 0);
  157.     for (i=0; i<504; i++)
  158.       {
  159.         lcd_write_byte(0, 1);
  160.       }   
  161. }
  162. /*************************设置字符位置函数**************************/
  163. void lcd_set_xy(unsigned char x, unsigned char y)
  164. {
  165.     lcd_write_byte(0x40 | y, 0);// column
  166.     lcd_write_byte(0x80 | x, 0);// row
  167. }
  168. /*************************ascii字符显示函数*************************/
  169. void lcd_write_char(unsigned char c)
  170. {
  171.     unsigned char line;
  172.     c -= 32;
  173.     for (line=0; line<6; line++)
  174.     {
  175.         lcd_write_byte(font6x8[c][line], 1);
  176.     }
  177. }
  178. /*******************************************************************/
  179. /*-------------------------------------------------
  180. lcd_write_english_string  : 英文字符串显示函数
  181. 输入参数:*s      :英文字符串指针;
  182.           x、y    : 显示字符串的位置,x 0-83 ,y 0-5
  183. --------------------------------------------------*/
  184. void lcd_write_english_string(unsigned char x,unsigned char y,char *s)
  185. {
  186.     lcd_set_xy(x,y);
  187.     while (*s)  
  188.     {
  189.      lcd_write_char(*s);
  190.      s++;
  191.     }
  192. }
  193. /******************************************************************/
  194. /*---------------------------------------------
  195. lcd_write_byte    : 写数据到lcd
  196. 输入参数:data    :写入的数据;
  197.           command :写数据/命令选择;
  198. ---------------------------------------------*/
  199. void lcd_write_byte(unsigned char dat, unsigned char command)
  200. {
  201.     unsigned char i;
  202.    digitalWrite( lcd_ce, LOW); // 使能lcd_ce = 0
  203.     if (command == 0)
  204.     {
  205.      digitalWrite( lcd_dc, LOW);// 传送命令 lcd_dc = 0;
  206.     }
  207.     else
  208.     {
  209.       digitalWrite( lcd_dc, HIGH);// 传送数据lcd_dc = 1;
  210.     }

  211.   for(i=0;i<8;i++)
  212.   {
  213.      if(dat&0x80)
  214.      {
  215.         digitalWrite( sdin, HIGH);//sdin = 1;
  216.      }
  217.     else
  218.     {
  219.      digitalWrite( sdin, LOW);//sdin = 0;
  220.      }
  221.    digitalWrite( sclk, LOW);//sclk = 0;
  222.    dat = dat << 1;
  223.    digitalWrite( sclk, HIGH);//sclk = 1;
  224.   }
  225.     digitalWrite( lcd_ce, HIGH);//lcd_ce = 1;
  226.         
  227. }
  228. /******************************************************************/

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

  233. float velocity(int n)
  234. {
  235.   //(n/20)轮子装的圈数,轮子直径是65mm
  236.   //速度的计算公式应该为  (n/20)×(65×π)  即n*1.02101761
  237.   //后面的计算得常数
  238.   float vel =Value*(n/20)*(65*3.14159);
  239.   return vel;
  240. }
  241. void flash()
  242. {
  243.   lcd_init();//初始化液晶     
  244.   lcd_clear();

  245.     lcd_write_english_string(0,0,"L:");
  246.     lcd_write_english_string(0,1,"R:");

  247.   int r,l;
  248.   r=r_wheel;l=l_wheel;
  249.   int rv,lv;
  250.   rv=velocity(r);
  251.   lv=velocity(l);
  252.   //Serial.print(r_velocity);
  253. // Serial.print("\0");
  254. // itoa (r_wheel,buffer1,10);
  255.   //itoa (l_wheel,buffer2,10);
  256.   //s1+=r;
  257.   //s2+=l;


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

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

  268.   r_wheel = 0;
  269.   l_wheel = 0;
  270. //  interrupts();
  271. }


  272. void setup ()
  273. {
  274.   Serial.begin(9600);

  275.   attachInterrupt(0,RCount, FALLING);
  276.   attachInterrupt(1,LCount, FALLING);

  277.   pinMode(IN1,OUTPUT);
  278.   pinMode(IN2,OUTPUT);
  279.   pinMode(IN3,OUTPUT);
  280.   pinMode(IN4,OUTPUT);
  281.   pinMode(leftPWM,OUTPUT);
  282.   pinMode(rightPWM,OUTPUT);

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

  285. }

  286. void loop()
  287. {
  288.   digitalWrite( leftPWM,50);//电机1全速前进
  289.   digitalWrite(rightPWM,50);//电机2全速前进
  290.   digitalWrite(IN1,HIGH);
  291.   digitalWrite(IN2,LOW);//电机1正转
  292.   digitalWrite(IN3,HIGH);
  293.   digitalWrite(IN4,LOW);//电机2正转

  294.   while (1)
  295.   {
  296. //   digitalWrite(13, state);
  297.   }

  298. }
  299. void LCount()
  300. {
  301.   l_wheel++;
  302. // state=!state;

  303. }
  304. void RCount()
  305. {
  306.   r_wheel++;
  307. }
复制代码

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2015-2-15 15:03:03 | 显示全部楼层
留爪,,,我也在做这个最近
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-15 16:48:43 | 显示全部楼层
pumpitup 发表于 2015-2-15 15:03
留爪,,,我也在做这个最近

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

使用道具 举报

发表于 2015-2-17 13:31:05 | 显示全部楼层
GaryChan 发表于 2015-2-15 16:48
也有遇到相似问题?我最近又有新问题:小车用PWM调速后依然不能走直线,后期还会出现偏摆,右轮偶尔出现停 ...

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

使用道具 举报

 楼主| 发表于 2015-2-18 09:17:09 | 显示全部楼层
pumpitup 发表于 2015-2-17 13:31
我是不知道应该如何实时测速,感觉应该是测试最近1秒(还是别的时间段)里转过的圈数?
还是做一个数组, ...

我是测试一秒钟里转过的周长数
回复 支持 反对

使用道具 举报

发表于 2015-2-26 10:32:48 | 显示全部楼层
delta t 是不是长了一点了?
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-17 22:39 , Processed in 0.071350 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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