当前位置:   article > 正文

STM32 学习笔记2-智能小车循迹实验_智能小车黑线循迹实验报告

智能小车黑线循迹实验报告

特斯拉镇楼

1、什么是小车循迹?

将小车放在黑色跑道上面,小车沿着黑色跑道运动 → 循迹

黑色跑道

2、小车循迹基本原理

原理:

介绍原理之前,突然记起来,在电子爱好者上  做过 一个循迹小车的项目,那个介绍的相相当详细,和这个基本原理是一样的。

光敏电阻:光照作用下, 光敏电阻器的阻值下降。光敏接触(跑道)黑色线时,电阻上升

LM393 比较两路光敏电阻 R13  R14 的大小,不平衡时,控制压线侧电机停止,第二个电机工作,从而修正方向,使黑色跑道线保持在两轮之间。

 

硬件:
小车底板及附件:支撑,骨架,带四个车辆,前两轮为驱动轮;

可调电位器:10K ,用于调节循迹传感器模块的灵敏度

传感部件:2*反射式光电管 ,用于检测跑道black/white

 四个引脚分别为:1 Anode 正极  2 cathode 负极  3 Emitter 发射极  4  collector 接收极

驱动:两个直流电机,作用为驱动车轮运动

电源:干电池

控制模块: LM393  & 单片机系统

显示模块:LED ,循迹指示灯,当循迹探头检测到黑线,指示灯亮

 背面:白色是发射端,黑色是接受端

正面 

电路图(基本原理与上面介绍的类似,只不过是把用LM393 检测的结果输出给 单片机)

3、小车循迹代码实现 和 分析

先来看主函数  main.c

  1. #include "stm32f10x.h" //系统库函数
  2. #include "delay.h" //延时函数
  3. #include "motor.h" //电机库函数
  4. #include "keysacn.h" // 按键函数
  5. #include "IRSEARCH.h" // 循迹库函数
  6. int main(void)
  7. {
  8. delay_init(); //延时初始化(在调用延时函数之前,必须先用delay_init()初始化Systick)
  9. KEY_Init(); // 初始化 调用按键函数
  10. IRSearchInit(); // 循迹初始化
  11. TIM4_PWM_Init(7199,0); //初始化 PWM 让电机转起来
  12. STM32_brake(500); //刹车0.5s
  13. keysacn();
  14. while(1)
  15. {
  16. SearchRun(); // 循迹函数
  17. }
  18. }

初始化延时, delay_init();,在之前的内容已经谈论过啦,不赘述

初始化按键,     KEY_Init(); 使用的是 GPIO 外设 ,设置和我的学习笔记0 让小灯亮起来类似

  1. //按键初始化函数
  2. //PA15 和PC5 设置为输入
  3. void KEY_Init(void)
  4. {
  5. GPIO_InitTypeDef GPIO_InitStructure;
  6. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//使能PORTA PORTC时钟
  7. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//PC2
  8. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置为上拉输入
  9. GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC2
  10. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //蜂鸣器PC3
  11. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
  12. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//IO 50MHz
  13. GPIO_Init(GPIOC, &GPIO_InitStructure); //设定参数初始化 GPIOC.3
  14. }

初始化探头,IRSearchInit();    PA7  PB0

  1. void IRSearchInit(void)
  2. {
  3. GPIO_InitTypeDef GPIO_InitStructure;
  4. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB , ENABLE);//使能时钟
  5. GPIO_InitStructure.GPIO_Pin = SEARCH_R_PIN;// PA7
  6. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//输入上拉模式
  7. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//端口速度
  8. GPIO_Init(SEARCH_R_GPIO , &GPIO_InitStructure);
  9. GPIO_InitStructure.GPIO_Pin = SEARCH_L_PIN;// PB0
  10. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//
  11. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//
  12. GPIO_Init(SEARCH_L_GPIO , &GPIO_InitStructure);
  13. }

初始化 PWM 电机  配置,见学习笔记1   TIM4_PWM_Init(7199,0);

按键读取程序, keysacn();      同时程序中加了一个蜂鸣器作为反馈声,被按下时蜂鸣器响 

  1. void keysacn()
  2. {
  3. int val;
  4. val=KEY; //读取按键
  5. while(!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2))//当按键没有被按下时,一直循环
  6. {
  7. val=KEY;//
  8. }
  9. while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2))//当按键被按下时
  10. {
  11. delay_ms(10); //延时10ms
  12. val=KEY;//读取PC2口电平值赋给Val
  13. if(val==1) //第二次判断按键是否被按下
  14. {
  15. BEEP_SET; //蜂鸣器响
  16. while(!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2)) //判断按时是否被松开
  17. BEEP_RESET; //蜂鸣器停止
  18. }
  19. else
  20. BEEP_RESET;//蜂鸣器停止
  21. }
  22. }

 蜂鸣器定义函数:怎么让蜂鸣器响起来? 蜂鸣器定义为 PC3

  1. #ifndef __KEYSACN_H_
  2. #define __KEYSACN_H_
  3. #include "stm32f10x.h"
  4. void KEY_Init(void);//按键初始化
  5. void keysacn(void);//按键扫描函数
  6. //蜂鸣器IO口定义
  7. #define BEEP_PIN GPIO_Pin_3
  8. #define BEEP_GPIO GPIOC
  9. #define BEEP_SET GPIO_SetBits(BEEP_GPIO,BEEP_PIN)
  10. #define BEEP_RESET GPIO_ResetBits(BEEP_GPIO,BEEP_PIN)
  11. //¶ÁÈ¡°´¼ü
  12. #define KEY GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2)//读取按键0
  13. #endif

下图为示意,实际为 PC.3口为高电平时,蜂鸣器发声,为低电平时,不工作


        while(1)
        {  
         SearchRun();
        }

         SearchRun();
 

  1. void SearchRun(void) //循迹控制程序
  2. {
  3. if(SEARCH_L_IO == WHITE_AREA && SEARCH_R_IO == WHITE_AREA) //前进控制逻辑
  4. ctrl_comm = COMM_UP;
  5. else if (SEARCH_L_IO == BLACK_AREA && SEARCH_R_IO == WHITE_AREA) //左转控制逻辑
  6. ctrl_comm = COMM_LEFT;
  7. else if (SEARCH_R_IO == BLACK_AREA & SEARCH_L_IO == WHITE_AREA) //右转控制逻辑
  8. ctrl_comm = COMM_RIGHT;
  9. else ctrl_comm = COMM_STOP; //停止
  10. if(ctrl_comm_last != ctrl_comm) // 检测上一次命令为COMM_STOP?
  11. {
  12. ctrl_comm_last = ctrl_comm;
  13. switch(ctrl_comm)
  14. {
  15. case COMM_UP: STM32_run(50,10);break; //控制电机
  16. case COMM_DOWN: STM32_back(50,10);break;
  17. case COMM_LEFT: STM32_Left(50,10);break;
  18. case COMM_RIGHT: STM32_Right(50,10);break;
  19. case COMM_STOP: STM32_brake(10);break;
  20. default : break;
  21. }
  22. }
  23. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/369509
推荐阅读
相关标签
  

闽ICP备14008679号