目录

  • 一、硬件部分
    • 1、模块选择
      • (1)电源
      • (2)车模
      • (3)电机
      • (4)巡迹及避障
      • (5)其它
    • 2、硬件连接
      • (1)电源
      • (3)电机
      • (4)红外
      • (4)超声波
  • 二、软件部分
    • 1、电机
    • 2、红外
    • 3、超声波
    • 4、控制
    • 5、主函数
  • 三、总结

一、硬件部分

1、模块选择

(1)电源

电源模块选用的是18650锂电池(充电器及电池底座)、3.3v稳压模块。

(2)车模

淘宝最常见的智能车底。

(3)电机

买的智能车带有四个电机,选用L298N电机驱动板对电机进行驱动。

(4)巡迹及避障

巡迹选用四路红外模块实现,避障选用超声波模块HC-SR04实现。


(5)其它

热熔胶枪,焊笔,杜邦线,主控制器STM32f103c8t6核心板,烧录工具(usb转ttl模块、ST-Link或J-Link)等。

2、硬件连接

(1)电源

将电池组引出线的正极接L298N模块的+12V(Vcc)端,负极接L298N模块的GND端,再将L298N的+5V端和GND端与3.3V稳压模块的5V与GND分别相连。最后把稳压模块的3.3V和GND与STM32核心板上的3.3V与GND相连。

(3)电机

将一侧电机的两极分别与L298N模块的Out1和Out2相连,另一侧的电机与Out3和Out4相连(写程序时测试正转与反转如何控制)。将L298N上的IN1,IN2,IN3,IN4分别与STM32核心板上的四个不同的IO口连接(本人连接的是PA7,PA6,PB1,PB0)。

(4)红外

四个红外模块与主控板上对应的端口相连即可。主控板上的3.3V与GND与STM32核心板上的3.3V和GND相连,IN1,IN2,IN3,IN4分别与STM32核心板上的四个不同的IO口连接(本人连接的是PB4,PB5,PB6,PB7)。

(4)超声波

HC-SR04上的5V与GND与STM32核心板上的5V和GND相连,TRIG与ECHO与STM32核心板上的两个不同的IO口连接(本人连接的是PB11,PB10)。

二、软件部分

1、电机

编程思路:控制核心板IO口的电平(即电机驱动模块的IN1,IN2,IN3,IN4)从而控制Out1、Out2、Out3、Out4的电平高低,进而控制电机使其正转、反转、不转。由于单纯地拉高拉低电平只能让电机在转与不转的状态切换,故决定利用TIM3的四个通道分别产生四路PWM信号来控制电机速度。

/*Head File*/
#ifndef _PWM_H
#define _PWM_H
#include <stm32f10x.h>
#include <sys.h>#define PWMA1   TIM3->CCR1
#define PWMA2   TIM3->CCR2
#define PWMB1   TIM3->CCR3
#define PWMB2   TIM3->CCR4void PWM_Init(uint16_t Arr,uint16_t Psc);
void Set_LeftMotor(int speed);
void Set_RightMotor(int speed);#endif
#include <PWM.h>void PWM_Init(uint16_t Arr,uint16_t Psc){GPIO_InitTypeDef GPIO_InitStruct;         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_OCInitTypeDef TIM_OCInitStruct;   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;      GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStruct);GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;      GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);TIM_TimeBaseStructInit(&TIM_TimeBaseInitStruct);     TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;       TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;     TIM_TimeBaseInitStruct.TIM_Period=Arr;         TIM_TimeBaseInitStruct.TIM_Prescaler=Psc;         TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;          TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;TIM_OCInitStruct.TIM_Pulse=0;TIM_OC1Init(TIM3,&TIM_OCInitStruct );          TIM_OC2Init(TIM3,&TIM_OCInitStruct );TIM_OC3Init(TIM3,&TIM_OCInitStruct );          TIM_OC4Init(TIM3,&TIM_OCInitStruct);TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);      TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable);     TIM_ARRPreloadConfig(TIM3,ENABLE);      TIM_Cmd(TIM3,ENABLE);
}void Set_RightMotor(int speed){if(speed<0)          PWMA1=2000,PWMA2=2000+speed;else               PWMA2=2000,PWMA1=2000-speed;
}void Set_LeftMotor(int speed){if(speed<0)           PWMB1=2000,PWMB2=2000+speed;else               PWMB2=2000,PWMB1=2000-speed;
}

2、红外

编程思路:检测到黑线时红外模块将会把返回高电平,否则返回低电平。
故只需要读取对应的IO端口电平用以控制小车转向从而实现巡线。(由于在自己铺的简易赛道上四路红外巡线效果和两路巡线效果差不多,所以只用了中间两个红外模块进行巡线,外侧两个用来辅助超声波模块实现避障)

#ifndef _SENSOR_H
#define _SENSOR_H
#include <stm32f10x.h>void Sensor_Init(void);
unsigned char Sensor_Detect(void);#endif
#include <sensor.h>
#include <delay.h>#define STRAIGHT 0
#define LEFTS 1
#define LEFTL 2
#define RIGHTS 3
#define RIGHTL 4
#define STOP 5
#define BACK 6uint8_t left1;
uint8_t left0;
uint8_t right1;
uint8_t right0;
uint8_t counter=0;
float length;void Sensor_Init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;GPIO_Init(GPIOB,&GPIO_InitStruct);
}unsigned char Sensor_Detect(void){left1=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9);left0=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8);right0=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7);right1=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6);if(left0==1&&right0==0)return LEFTS;else if(left1==0&&right1==1)return LEFTL;else if(left0==0&&right0==1)return RIGHTS;else if(left1==1&&right1==0)return RIGHTL;else if(left1==1&&left0==1&&right0==1&&right1==1)return STOP;else if(left1==0&&right1==0)return BACK;else return STRAIGHT;
}

3、超声波

/*Head File*/
#ifndef __HC_H
#define __HC_H
#include "sys.h"void hcsr04_NVIC(void);void Hcsr04Init(void);static void OpenTimerForHc(void);static void CloseTimerForHc(void);void TIM4_IRQHandler(void);u32 GetEchoTimer(void);float Hcsr04GetLength(void);#endif
#include "hc.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "led.h"
#define TRIG_Send  PBout(11)
#define ECHO_Reci  PBin(10)#define HCSR04_PORT     GPIOB
#define HCSR04_CLK      RCC_APB2Periph_GPIOB
#define HCSR04_TRIG     GPIO_Pin_11
#define HCSR04_ECHO     GPIO_Pin_10u16 msHcCount = 0;void hcsr04_NVIC()
{NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;             NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;       NVIC_Init(&NVIC_InitStructure);
}void Hcsr04Init()
{  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;   GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(HCSR04_CLK, ENABLE);GPIO_InitStructure.GPIO_Pin =HCSR04_TRIG;      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);GPIO_InitStructure.GPIO_Pin =   HCSR04_ECHO;     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);  GPIO_ResetBits(HCSR04_PORT,HCSR04_ECHO);    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);   TIM_DeInit(TIM2);TIM_TimeBaseStructure.TIM_Period = (1000-1); TIM_TimeBaseStructure.TIM_Prescaler =(72-1); TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);          TIM_ClearFlag(TIM4, TIM_FLAG_Update);  TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);    hcsr04_NVIC();TIM_Cmd(TIM4,DISABLE);
}static void OpenTimerForHc()
{TIM_SetCounter(TIM4,0);msHcCount = 0;TIM_Cmd(TIM4, ENABLE);
}static void CloseTimerForHc()
{TIM_Cmd(TIM4, DISABLE);
}void TIM4_IRQHandler(void)
{if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)  {TIM_ClearITPendingBit(TIM4, TIM_IT_Update  ); msHcCount++;}
}u32 GetEchoTimer(void)
{u32 t = 0;t = msHcCount*1000;t += TIM_GetCounter(TIM4);TIM4->CNT = 0;  Delay_ms(50);return t;
}float Hcsr04GetLength(void )
{u32 t = 0;int i = 0;float lengthTemp = 0;float sum = 0;while(i!=5){TRIG_Send = 1;      Delay_us(20);TRIG_Send = 0;while(ECHO_Reci == 0);      OpenTimerForHc();        i = i + 1;while(ECHO_Reci == 1);CloseTimerForHc();        t = GetEchoTimer();        lengthTemp = ((float)t/58.0);//cmsum = lengthTemp + sum ;}lengthTemp = sum/5.0;return lengthTemp;
}

4、控制

控制小车的代码主要在Speed_Control()函数中编写。如果不使用超声波模块的话,也可以在定时器1的中断服务函数中编写。

/*Head File*/
#ifndef _CONTROL_H
#define _CONTROL_Hvoid TIM1_UP_IRQHandler(void);
void Speed_Control(unsigned char Flag,float length);
#endif
#include <control.h>
#include <Sensor.h>
#include <PWM.h>
#include <delay.h>
#include <usart.h>
#include <stdio.h>
#define STRAIGHT 0
#define LEFTS 1
#define LEFTL 2
#define RIGHTS 3
#define RIGHTL 4
#define STOP 5
#define BACK 6extern uint8_t left0;
extern uint8_t left1;
extern uint8_t right0;
extern uint8_t right1;
extern float length;void TIM1_UP_IRQHandler(void){if(TIM_GetITStatus(TIM1,TIM_IT_Update)==SET){}TIM_ClearITPendingBit(TIM1,TIM_IT_Update);
}void Speed_Control(unsigned char Flag,float length){if(Flag==STOP){Set_LeftMotor(0);Set_RightMotor(0);}  if(length<18.0){if(Flag==RIGHTL){Set_LeftMotor(-2000);Set_RightMotor(2000);}   else if(Flag==LEFTL){Set_LeftMotor(2000);Set_RightMotor(-2000);}else{Set_LeftMotor(-2000);Set_RightMotor(2000);}}
}

5、主函数

#include <stm32f10x.h>
#include <timer.h>
#include <usart.h>
#include <PWM.h>
#include <sensor.h>
#include <led.h>
#include <delay.h>
#include <stdio.h>
#include <hc.h>
#include <control.h>
#include <OLED.h>
#define STRAIGHT 0
#define LEFTS 1
#define LEFTL 2
#define RIGHTS 3
#define RIGHTL 4
#define STOP 5
#define BACK 6
extern float length;int main(){Led_Init();  Delay_Init();Sensor_Init();Hcsr04Init();PWM_Init(1999,71);TIM1_Init(1999,71);TIM2_Init(1999,71);uart_init(115200);OLED_Init();while(1){int flag=Sensor_Detect();Speed_Control(flag,Hcsr04GetLength());}
}

三、总结

整个工程参考了许多不同的代码(简称究极缝合怪),故代码风格不统一。由于调试过程中把红外模块撞坏了,所以控制代码没有写得很完善,但是各个模块工作正常。在加入超声波模块之前,对巡迹功能进行了测试,虽然速度比较慢,但还是能完成巡迹工作。加入超声波模块后,也能实现较高精度的障碍检测(可以多用几个超声波模块,这样避障功能更完善)。
工程链接:https://pan.baidu.com/s/1CslspOudO7mCGkAVzEmbaQ?pwd=14j9
提取码:14j9
视频演示:循迹功能展示

基于STM32f103c8t6的简单红外巡迹避障小车制作相关推荐

  1. 基于STM32F103的红外循迹避障小车设计(含Proteus仿真)

    基于STM32F103的红外循迹避障小车设计 红外循迹及红外避障实现较简单,无论是51单片机还是STM32单片机,其例程随处可见.但是完全可以运行的Proteus仿真,开源的并不多,更不要说基于STM ...

  2. STM32循迹避障小车制作代码详解(简单实现版)

    感谢几年来大家的支持,看到大家对工程的呼声很高,所以来把工程上传了,大家自行下载即可哈,谢谢大家支持 这个代码是进阶版的,就是可以跑的很快的,和上面博客的主要区别就是这个代码的避障机制并不是做在主ma ...

  3. 【IoT】红外循迹避障小车

    说明 随着生产自动化的发展需要,机器人已经越来越广泛地应用到生产自动化上,随着科学技术的发展,机器人的传感器种类也越来越多,其中红外传感器已经成为自动行走和驾驶的重要部件. 红外的典型应用领域为自主式 ...

  4. 基于STM32F103C8T6的循迹避障小车完整制作过程(详细)----上篇(第123点)

    基于STM32F103C8T6的循迹避障小车完整制作过程 本文适合小白观看 由于本人的一个小项目,要做一个基于STM32的循迹避障小车,前后花了约1周的时间,这个过程中也参考了很多大神分享的资料,学到 ...

  5. 基于NI myRIO的小车红外循迹避障

    一.实验设备与软件 1.实验硬件设备:计算机一台,实验平台NI myRIO一块,小车一台,自备iPad或手机. 2.软件系统:Win7系统,Labview2015开发软件,NI myRIO2015驱动 ...

  6. 基于STM32的智能循迹避障小车实验(小车运动部分)

    写在前面 这个实验是关于智能小车的实验,现在的想法就是先做出一个循迹和避障功能,后续可能会再添加一些其他的模块. 我在做这个实验之前基本了解了F1系列开发板的大部分模块,如果没有学习之前的模块,建议先 ...

  7. c语言智能车跑道检测程序,基于单片机的智能循迹避障小车(附电路原理图,程序清单)...

    基于单片机的智能循迹避障小车(附电路原理图,程序清单)(论文10000字) 摘要:目前,移动机器人的开发和研究越来越令人瞩目,而智能循迹壁障小车作为移动机器人的一个重要分支,非常值得我们探索和讨论.智 ...

  8. 基于STC12C5616AD芯片智能循迹避障小车完整制作过程(详细教程)

    前言:本篇文章适合小白阅读,其中有很基础的Keil 5的使用教程等.大多网友知道如何使用,因此大家可以看目录,对于自己而言比较基础的可以不用阅读,重点关注一些迷茫的部分. 智能循迹避障小车教程目录 智 ...

  9. 智能循迹避障小车的红外模块

    智能循迹避障小车的红外模块 - 智能循迹避障小车的红外模块用于3个功能-----------循迹,避障,测速. 红外循迹与红外避障 红外循迹TCRT5000L 红外避障 .观察原理图我们可以发现,它们 ...

最新文章

  1. android系统的测试方法,运行测试  |  Android 开源项目  |  Android Open Source Project...
  2. js下拉 selenium_selenium 难定位元素,时间插件,下拉框定位,string
  3. CVE-2016-0143 漏洞分析(2016.4)
  4. UML--行为图(状态图、活动图)
  5. 手机芯片进入7纳米时代!高通确认年内发布,搭载5G,更强AI
  6. JBoss 目录结构解释
  7. MySQL游标循环取出空值的BUG
  8. Eclipse·Maven·构建SpringMVC简单工程-2
  9. github python100天_GitHub - CherryXuan/Python-100-Days: Python - 100天从新手到大师
  10. SQL ——窗口函数简介
  11. 哒螨灵使用注意事项_哒螨灵的基础知识
  12. 从MIXMAX概率模型理解Bayesian建模方法
  13. 今天是2019年最后一天,全球金融危机,离我们已经过去十年了
  14. Python聚类分析
  15. [NLP] 文本分类之TextCNN模型原理和实现(超详细)
  16. 数据分析师必须掌握的常见数据分析方法
  17. Oracle分析函数大全
  18. 「镁客早报」美国初创公司Rocket Lab完成发射一箭六星商业任务;工信部表示:6G概念研究将于今年启动...
  19. 语音合成系统WORLD-原理和简单使用
  20. 在微信小程序里面如何内嵌H5页面(web-view)

热门文章

  1. jQuery循环中获取指定下标的操作
  2. 湿热灭菌的原理和基本概念全掌握
  3. postgresql锁的冲突检测 死锁检测
  4. 用Numpy和Pandas分析二维数据笔记
  5. 吉林大学本科毕业论文答辩和论文选题PPT模板
  6. 如何设计单点登录代理SSOP?
  7. Chrome浏览器设置允许网站如金山文档剪贴方法测试ok
  8. RHCE7 认证之学习笔记
  9. 图组:奥运火炬样式揭晓 灵感来自“祥云”
  10. 手机APP远程温湿度监控系统(连上公网、阿里云)