大一新生の作品:简单的寻迹小车

这篇具有很好参考价值的文章主要介绍了大一新生の作品:简单的寻迹小车。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

(纯萌新,学习单片机半年了,这是寒假回家的作品,师从江科大,写博客纪录我实现后的经验)(比较粗略)

前言

学习寻迹小车,最最重要的莫过于通过反射式红外传感器读取小车的状态并让小车做出相应的反应以达到快速调整姿态。我的循迹小车用的是三个红外传感器,并不是很智能,但是在速度和过不同种类的弯道都可圈可点。

我大致将学习寻迹小车的思路分为3方面:1.小车本身能不能动 2.如何检测小车此时的状态 3.什么状态给小车的轮子什么速度。

本文默认小车可以动了,所以下文主要针对什么赛道赋什么速度。

赛道如图

大一新生の作品:简单的寻迹小车,稀烂胶带鼠鼠的大一生活,单片机,嵌入式硬件,Powered by 金山文档

赛道部分

赛道一般分为:

直接连接:直线赛道,145度左右直赛道,120度左右赛直道,直角直赛道,锐角直赛道。

圆滑连接:半径大的半圆弧、1/4圆弧赛道,半径小的半圆弧、1/4圆弧赛道,和椭圆弧赛道。

难度:

直接连接中能够攻克120度左右,圆滑连接能够将半径大的圆弧赛道和椭圆赛道攻克便是初级目标。

攻克直角直赛道和半径小的圆弧赛道是附加目标。

锐角直赛道我用我的三个红外反射模块暂时没有思路,无法实现。(四个可以实现,但是本文主要针对3个)

解决思路:

3个红外模块主要可以分为7种情况。(我的三个模块挨得很近,且中间的模块比两边要突出一些(方便过直角弯))

为了方便我将3个红外模块命名为L(左),I(中),R(右)

从最简单的三种说起:只有L,I,R其中一个检测到赛道。

只有L,则全力左转,只有I,则全力直行,只有R,则全力右转。

其次是两种微调:L和I,I和R中一对检测到赛道。

该情况与上面相差不大,只是转弯力度减小即可。

最后是两种特殊情况:全检测到或全没检测到。

这两种情况大多为硬件太弱的问题,所以当出现这两种情况时,建议让其继续执行之前的命令,比如左转,但是转的时候有段时间三个都没检测到,那么继续执行之前的命令,继续左转直到检测到赛道。用该方式可以很好的过部分急转弯。

特殊问题:直角直赛道

直角直赛道时如果三个模块平行,那么会同时检测不到,转弯力度不够,所以我将中间模块稍微突出,在直角赛道最后会有一小段时间只有左右两个模块能够检测到赛道,此时全力转弯即可过弯。

代码部分

代码没什么可以说的,简单的if语句。思路有了,其实代码也不是很重要。

main函数:

#include "stm32f10x.h"
#include "Delay.h"
#include "Motor.h"
#include "XunJi.h"


int main(void)                //电机范围(速度)-100~100        
{
    int State;
    Motor_Init();
    XunJi_Init();
    
    while(1)
    {
        State=Get_XunJi();
        if(State==1)        //左轮后转,右轮前转,即原地左转
        {
            Motor_L_SetSpeed(-50);
            Motor_R_SetSpeed(50);
        }
        if(State==2)        //微调
        {
            Motor_L_SetSpeed(25);
            Motor_R_SetSpeed(50);
        }
        if(State==3)
        {
            Motor_L_SetSpeed(50);        //速度可以自行调整
            Motor_R_SetSpeed(50);
        }
        if(State==4)
        {
            Motor_L_SetSpeed(50);
            Motor_R_SetSpeed(25);
        }
        if(State==5)
        {
            Motor_L_SetSpeed(50);
            Motor_R_SetSpeed(-50);
        }
    }    
}

寻迹函数:

#include "stm32f10x.h"                  // Device header

void XunJi_Init(void)        //从A7到B1分别为右,中,左
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;            //结构体
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);        //GPIOB的初始配置
    
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);        //GPIOA的初始配置
}

uint16_t Get_XunJi(void)
{
    static int A;            //A是状态
    if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0)==1)    //中间检测到了
    {
        if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)==1&&GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_7)==1)//全检测到了,保持状态
        {
            return(A);
        }
        else if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)==1)    //左边检测到了
        {
            A=2;
            return(2);
        }
        else if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_7)==1)    //右边检测到了
        {
            A=4;
            return(4);
        }
        else        //只有中间
        {
            A=3;
            return(3);
        }
    }
    else if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)==1)    //只有左边检测到了
    {
        A=1;
        return(1);
    }
    else if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_7)==1)    //只有右边检测到了
    {
        A=5;
        return(5);
    }
    else         //全没检测到,继续之前的状态
    {
        return(A);
    }
}

电机函数:

#include "stm32f10x.h"                  // Device header
#include "PWM.h"

void Motor_Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;                    //方向GPIO口初始化
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_8;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    PWM_Init();        //初始化PWM
    
}

void Motor_TwoSetSpeed(int8_t Speed)
{
    if(Speed>=0)
    {
        PWM_SetCompare1(Speed);    
        PWM_SetCompare2(Speed);
    }
    if(Speed<=0)
    {
        PWM_SetCompare1(-Speed);
        PWM_SetCompare2(-Speed);
    }
}
void Motor_L_SetSpeed(int8_t Speed)        //左轮控制
{
    if(Speed>=0)
    {    
        GPIO_SetBits(GPIOA,GPIO_Pin_4);
        GPIO_ResetBits(GPIOA,GPIO_Pin_6);
        PWM_SetCompare1(Speed);
    }
    if(Speed<=0)
    {
        GPIO_SetBits(GPIOA,GPIO_Pin_6);
        GPIO_ResetBits(GPIOA,GPIO_Pin_4);
        PWM_SetCompare1(-Speed);
    }
}
void Motor_R_SetSpeed(int8_t Speed)        //右轮控制
{
    if(Speed>=0)
    {    
        GPIO_SetBits(GPIOA,GPIO_Pin_5);
        GPIO_ResetBits(GPIOA,GPIO_Pin_8);
        PWM_SetCompare2(Speed);
    }
    if(Speed<=0)
    {
        GPIO_SetBits(GPIOA,GPIO_Pin_8);
        GPIO_ResetBits(GPIOA,GPIO_Pin_5);
        PWM_SetCompare2(-Speed);
    }
}
void Motor_Stop(void)
{
    PWM_SetCompare1(0);
    PWM_SetCompare2(0);
}
void Motor_Retreat()
{
    GPIO_SetBits(GPIOA,GPIO_Pin_8);
    GPIO_SetBits(GPIOA,GPIO_Pin_6);
    GPIO_ResetBits(GPIOA,GPIO_Pin_5);
    GPIO_ResetBits(GPIOA,GPIO_Pin_4);
}
void Motor_Go()
{
    GPIO_SetBits(GPIOA,GPIO_Pin_4);
    GPIO_SetBits(GPIOA,GPIO_Pin_5);
    GPIO_ResetBits(GPIOA,GPIO_Pin_6);
    GPIO_ResetBits(GPIOA,GPIO_Pin_8);
}

总结:

多调试,多实验,多总结。文章来源地址https://www.toymoban.com/news/detail-599187.html

到了这里,关于大一新生の作品:简单的寻迹小车的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 曲师大2023大一新生排位赛-B.Sort题解

    题目描述 插入排序是一种非常常见且简单的排序算法。王同学是一名大一的新生,今天许师哥刚刚在上课的时候讲了插入排序算法。 假设比较两个元素的时间为 ,则插入排序可以以  的时间复杂度完成长度为 n� 的数组的排序。不妨假设这 n 个数字分别存储在​ 之中,

    2024年02月16日
    浏览(48)
  • ROS仿真gazebo小车寻迹PID【第一期】

    本篇内容为笔者在2022.5.11完成的,与某个比赛相关,所以当时没有发布。 而现在是2023.2.21,当时的一番雄心壮志现在已经熄了大半,此外随着时间推移,笔者需要花更多的时间在准备考研上,因此这可能是一期 没有后续 的文章 即便如此,这一篇也实现了一个挺有趣的功能啦

    2024年02月05日
    浏览(69)
  • STM32基于hal库的智能小车—红外寻迹

    材料: (1)stm32f407zgt6最小系统开发板 (2)l298n电机驱动模块1个 (3)四个电机 (4)循迹红外模块3个 一、组装 (1)L298N电机驱动模块与stm32开发板接线如下图: 说明:PWM接线把跳线帽扒开接外面引脚 CH1接ENA,CH2接ENB。 (2)寻迹红外接线: 二、主要程序 1、STM32CUBEMX配置如下:

    2024年02月01日
    浏览(47)
  • 基于蓝牙技术使用stm32制造一个智能小车 (寻迹,避障,遥控)

    目录 1.制作智能小车的硬件名单: 3.引脚图 2.先让小车动起来  1.小车运动 2.代码 3.寻迹  1.工作原理 2.代码 4.超声波避障  1.工作原理 2.代码 5.蓝牙遥控  1.蓝牙工作原理 2.代码 6.oled屏幕 1.工作内容 7.led灯 8.蜂鸣器 9.蓝牙使用代码main  STM32C6T6核心板 1块 L298N电机驱动  1块 五

    2024年02月15日
    浏览(41)
  • STC89C52 小车-舵机转向/蓝牙控制/寻迹,有PCB有讲解,更新

    推荐单片机:STC89C52或51(尽量52 还有提供 可用于测试直接烧录的89单片机文件(hex),不需要重新编译 。 还是老话: 源代码可以直接编译通过。 本人是自学,原创内容--转载请务必说明!! 所有下载在文章结尾(包全代码,附件) 代码:为个人gitHub库,无法或不会下载的可以评论

    2024年02月02日
    浏览(41)
  • 网页设计前端作品(大一)HTML+CSS

    🌩️ 精彩专栏推荐👇🏻👇🏻👇🏻 💂 作者主页: 【进入主页—🚀获取更多源码】 🎓 web前端期末大作业: 【📚HTML5网页期末作业 (1000套) 】 🧡 程序员有趣的告白方式:【💌HTML七夕情人节表白网页制作 (110套) 】 📔网站布局方面 :计划采用目前主流的、能兼容各大主

    2024年02月09日
    浏览(50)
  • AT89S52单片机智能寻迹小车自动红外避障趋光检测发声发光设计

    wx供重浩:创享日记 对话框发送:寻迹 获取完整说明报告+源程序+数据 小车具有以下几个功能:自动避障功能;寻迹功能(按路面的黑色轨道行驶);趋光功能(寻找前方的点光源并行驶到位);检测路面所放置的铁片的个数的功能;计算并显示所走的路程和行走的时间,并

    2024年02月19日
    浏览(54)
  • stm32f103 简易4路红外寻迹小车(2)----2023西南交大电赛校赛(pcb原理图,代码及分析)

    目录 一。材料准备。 二。PCB原理图  三。逻辑状态图 四。代码部分 五。文件下载: 接上:stm32f103 简易4路红外寻迹小车(1)----2023西南交大电赛校赛(含stm32中文资料) 小车测试视频: stm32小车寻迹小车 材料资料图片见上:stm32f103 简易4路红外寻迹小车(1)----2023西南交大

    2024年02月16日
    浏览(54)
  • 基于Java(SpringBoot框架)毕业设计作品成品(37)高校校园新生报到系统设计与实现

    博主介绍: 《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程,免费 项目配有对应开发文档、开题报告、任务书、PPT、论文模版

    2024年02月07日
    浏览(60)
  • 【毕业设计】39-基于单片机的智能小车寻迹系统的设计与实现(原理图工程+仿真工程+源代码+答辩论文+答辩PPT)

    附件包含:均为毕业设计全配套资料 原理图工程文件 原理图截图 仿真工程文件 源代码 仿真截图 实物图 答辩论文低重复率 答辩PPT 主要内容: 理解并掌握单片机的基本知识;设计一款能够让小车的寻迹功能,使小车智能化实现自动寻迹。 基本要求: 1、掌握单片机的发展情

    2024年01月20日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包