1.引脚定义:
GND接地,VCC供电,X1、X2、X3各自对应一对红外探头

2.实验原理:
红外传感器巡线的基本原理是利用物体的反射性质,当红外线发射到黑色上时会被黑线吸收掉,当红外线发射到不同的颜色的材料上会有不同反射到红外的接手管上,已产生不同大小的光电流,从而影响三路引脚输入电平高低。

3.注意:

  1. 红外探头发出的红外光是人眼无法看到的。
  2. 为了避免太阳光对红外传感器产生影响,所以我们需要在室内使用该模块。
  3. 工作电压: 3.3v~5v


    remote.h
#ifndef __REMOTE_H
#define __REMOTE_H               #define left GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3)
#define mid GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2)
#define right GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)void remote_init(void);void run_left(void);
void run_right(void);
void run_forth(void);
void run_back(void);
void run_stop(void);#endif

remote.c

#include "remote.h"
#include "sys.h"void remote_init()
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //开启IO口对应的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3;            //PA2 PA3GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;                      //PB0GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOB,&GPIO_InitStructure);
}void run_forth()
{TIM_SetCompare1(TIM4,780);TIM_SetCompare2(TIM4,899);TIM_SetCompare3(TIM4,782);TIM_SetCompare4(TIM4,899);
}void run_left()
{TIM_SetCompare1(TIM4,860);TIM_SetCompare2(TIM4,899);TIM_SetCompare3(TIM4,760);TIM_SetCompare4(TIM4,899);
}void run_right()
{TIM_SetCompare1(TIM4,760);TIM_SetCompare2(TIM4,899);TIM_SetCompare3(TIM4,860);TIM_SetCompare4(TIM4,899);
}void run_back()
{TIM_SetCompare1(TIM4,899);TIM_SetCompare2(TIM4,800);TIM_SetCompare3(TIM4,899);TIM_SetCompare4(TIM4,800);
}void run_stop()
{TIM_SetCompare1(TIM4,899);TIM_SetCompare2(TIM4,899);TIM_SetCompare3(TIM4,899);TIM_SetCompare4(TIM4,899);   }

main.c

#include "sys.h"
#include "delay.h"
//#include "usart.h"
#include "led.h"
#include "oled.h"
#include "motor.h"
#include "timer.h"
#include "remote.h"
//#include "tick_ulsonic.h"
//#include "ultrasonic.h" /***********************************************************************************************
本来是一个三路巡线模块,但因为模块质量问题,中间识别能力较差,故只使用左右两路,逻辑上也可以实现。
****************************************************************************************************************/void pointleft(void); //OLED方向指示
void pointright(void);
void pointforth(void);
void pointback(void);int main(void){    u8 i=0;u8 val1;u8 val2;SystemInit();delay_init();      //延时函数初始化     nms<=1864  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);// 或使用JTAG_Set(0X01); GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);LED_Init();
//  uart_init(115200);LED_Init();           //初始化与LED连接的硬件接口OLED_Init();pwm_init(899,0);
//  Tim3_Config();
//  ulsonic0_config();      //  ECHO PA2        TRIG PA3
//  ulsonic1_config();      //  ECHO PA13        TRIG PA14remote_init();delay_ms(1800);  delay_ms(1800);     delay_ms(1800);run_forth();while(1)                                                //基于实际操作环境,在纸张内返回引脚口读取0,纸张外读取1。{val1=left;val2=right;switch(val1+val2){case 2 :    run_back();pointback(); //两边跑离纸面    break;              case 1 :    if(val1==1)            //一边跑离纸面{run_right();pointright();}                else{run_left();pointleft();}break;case 0 :     run_forth();pointforth();       //在纸面内break;            default: break;}        OLED_ShowNumber(20,20,val1,1,14);OLED_ShowNumber(60,20,val2,1,14);                  OLED_Refresh_Gram();i++;if(i==10){LED=!LED;i=0;}delay_ms(50);}}void pointright(){OLED_Clear();OLED_ShowString(40,10,"O");OLED_ShowString(60,20,"O");OLED_ShowString(80,30,"O");OLED_ShowString(60,40,"O");OLED_ShowString(40,50,"O");OLED_Refresh_Gram();}void pointleft(){OLED_Clear();OLED_ShowString(80,10,"O");OLED_ShowString(60,20,"O");OLED_ShowString(40,30,"O");OLED_ShowString(60,40,"O");OLED_ShowString(80,50,"O");OLED_Refresh_Gram();}void pointforth(){OLED_Clear();OLED_ShowString(60,10,"OO");OLED_ShowString(50,20,"O  O");OLED_ShowString(40,30,"O    O");OLED_Refresh_Gram();}void pointback(){OLED_Clear();OLED_ShowString(60,50,"OO");OLED_ShowString(50,40,"O  O");OLED_ShowString(40,30,"O    O");OLED_Refresh_Gram();}

我用屎黄色的草稿纸铺的“跑道"

该次功能实现中,三路引脚都能正常运行,但逻辑判断中只用到了左右两路,因为个人试验没有高精度要求,小车在该环境下已经能非常流畅准确的判断、运行。若使用三路引脚判断,可以实现急转弯等更高级的功能,这里不详细说明。

注:在调试中一直遇到读IO口Byte是,1和0显示不准确和不灵敏等问题,在经历了很长一段时间的不断尝试和思考后,最后从最简单的IO配置开始修改,把下拉输入改成了浮空输入模式,整个问题迎刃而解。

【单片机项目】制作一辆基于STM32的智能小车——三路循迹模块相关推荐

  1. 【单片机项目】制作一辆基于STM32的智能小车——概述

    去年九月买了一块STM32F429的开发板,直到今年三月份因为疫情不能返校宅在家里才算把教学视频都看完了,中途因为课程停了一段时间,就很长一段时间没有继续学习,所以这个速度算是极慢极慢的了. 我走进这 ...

  2. 【单片机项目】制作一辆基于STM32的智能小车——A4950电机驱动

    A4950电机驱动模块特性 2路电机驱动输出,单板典型最大电流2A 驱动板工作电压范围:7.6V~30V 驱动频率:500Hz~300KHZ 模块接口说明 VM:驱动模块的电源 VCC:接5V输入,不 ...

  3. 基于STM32的智能小车(一)

    ## 基于STM32的智能小车 在假期自学了STM32,一直想做一个智能小车,刚好这次有时间就在家自己制作了这个基于STM32的智能小车,小车基本功能包括循迹.壁障及手机蓝牙控制,本人是第一次制作小车 ...

  4. 基于STM32的智能小车方案设计

    基于STM32的智能小车设计 前言 一.什么是STM32智能小车? 二.模块汇总 1.主控板(STM32F103ZE) 2.底板 3.电机 4.避障模块(超声波传感器,红外传感器) 5.寻迹模块(3路 ...

  5. 基于STM32的智能小车--电机驱动设计

    基于STM32的智能小车 第一章 基于STM32的智能小车方案设计 基于STM32的智能小车--电机驱动设计 基于STM32的智能小车 前言 一.电机是什么? 二.常见电机分类 1.有刷电机 2.无刷 ...

  6. 基于STM32的智能小车--舵机云台设计

    基于STM32的智能小车 第一章 基于STM32的智能小车方案设计 第二章 基于STM32的智能小车–电机驱动设计 第三章 基于STM32的智能小车–循迹设计 第四章 基于STM32的智能小车–避障设 ...

  7. stm32项目_stm32f103c8t6项目_循迹避障小车完整制作过程_智能小车设计_STM32智能小车教程-循迹-避障-蓝牙遥控-跟随

    [硬件] 元件选型 照片上传出问题了,改天补上,着急的可以看视频 视频链接在这里 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sKjJGMXv-16463139639 ...

  8. 基于stm32的智能小车(远程控制、避障、循迹)

    学完stm32,总是想做点东西"大显身手"一下,智能小车就成了首选项目,其核心只是就是PWM输出,I/O口引脚电平判断. 制作智能小车的硬件名单: 制作智能小车的硬件列表:(1) ...

  9. 基于stm32的智能小车

    目录 一.功能实现 二.硬件清单 三.代码实现 1.先让小车动起来 2.串口控制小车行动 3.点动控制小车 4.硬件pwm调速 5. 左右轮各自调速 6. 循迹小车 7. 解决转弯平滑问题 8. 跟随 ...

最新文章

  1. 【libevent】libevent库学习总结(二)——编程步骤
  2. 网页图表Highcharts实践教程之认识Highcharts
  3. Scala(三):类
  4. pku 1185 炮兵阵地
  5. java简单通讯录的实现02person类_Java自定义类加载器实现不同版本的类加载
  6. java servlet拾遗(1)-Servlet总揽
  7. python学习感悟第3节
  8. SQL数据库挂起 SQL数据库附加报错 SQL数据库824错误修复
  9. python全栈学习总结三:函数学习
  10. Eclipse 通过 JDBC 连接 SQL Server
  11. 入局视频会议市场 揭秘“腾讯会议”背后的创新黑科技
  12. Linux基础:linux网络接口
  13. java多线程实例_要把Java吃透您得先吃透这些基本概念
  14. 阿里实人认证android,Android客户端接入
  15. 各种应用程序错误,xx内存地址不能read等报错可能的原因与解决方案
  16. .net web 应用程序C#
  17. 计算机工作组如何添加打印机,局域网添加打印机,详细教您局域网打印机怎么添加...
  18. 一个三本学生的面试之旅
  19. 知道maven地址,如何在maven官网下载jar包
  20. mipi传输距离3米_蓝牙网关有效传输距离是多少?

热门文章

  1. KMSpico软件下载:激活Windows系统和Office工具
  2. 【秒杀下单再思考 】
  3. 无糖饮料时代,冰峰拿什么留住消费者?
  4. WiFi基本知识【转】
  5. java计算机毕业设计企业进销管理系统的设计与实现源代码+数据库+系统+lw文档
  6. Python遍历子目录,利用python-pptx删除ppt文件最后一页
  7. mysql查询成绩并排名_Mysql 查询实现成绩排名
  8. 创业团队成员的挑战与成长(转)
  9. 云贝连锁独立版V2.2.2版本程序源码 支持各大平台小程序
  10. 抠图软件哪种好用?试试这几种简单实用的抠图工具