2019-05-09 23:31:22 weixin_44212493 阅读数 342
  • 如何玩转JetBot自动驾驶小车

    本次课程将以 Jetson NANO 为主要计算平台,实现智能小车的完整功能。本次公开课主要讲述五大功能算法:目标检测、避障、目标跟踪、图像分割以及路径检测。

    406 人正在学习 去看看 CSDN讲师

这几天有时间做了一个手机控制的蓝牙遥控小车车,终于今天实现了,把过程和心得跟大家分享一下。
废话不多说,先上实物图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
一、项目元件清单
1、某宝购买一个智能小车底盘(本人车是四驱的,因此有四个电机,两块亚克力板和一些配件螺丝)
2、L298n模块 两个(一个298控制两个电机)
3、HC-06蓝牙模块
4、电池盒跟18650电池3个
5、单片机最小系统
6、杜邦线至少12根,当然越多越好
7、若干根导线(连接电机用的,以及电池盒连到L298N跟单片机)

二、制作过程
首先,先去了解一下L298N的接线,我当时也是懵逼了好久,反正摸索着也会了,一般店家都有资料。然后是蓝牙模块的使用,拿到蓝牙模块后,有开发板的话(没有就用单片机的烧录器),先按照TXD接TXD,RXD接RXD,打开电脑的串口助手与蓝牙构建通信,打开AT,发送AT指令集,比如设设波特率,改个名字,改个配对的密码。但通过蓝牙与单片机连接通信的时候,就是TXD接RXD了。最后一个就是,本人在接线的时候经常碰壁。比如,你以为接好的线他其实没接好,根本没通,还是拿万用表B了才知道。
因为本人忘了买电池盒,所以我是用12V的直流电接着的,导致遥控车拖着跟电线。
三、实物图
(拖着跟电线以及充电宝供电的车 不过我没通电)

资料内包括L298N的部分资料,以及蓝牙的说明书(看AT指令集就好)和源程序。

/手机蓝牙遥控小车 APP可以在应用市场搜 蓝牙串口助手
左转右转大概是90度 我的是四驱的,如果是只有一个l298N的话就把带2的删了
pwm有十级变速
/

#include <reg52.h>

#define Left_moto2_pwm P0_4 //接驱动模块ENA 使能端,输入PWM信号调节速度 左后轮
#define Right_moto2_pwm P0_5 //接驱动模块ENB 右后轮
#define Left_moto_pwm P1_4 //接驱动模块ENA 使能端,输入PWM信号调节速度 左前轮
#define Right_moto_pwm P1_5 //接驱动模块ENB 右前轮
#define uchar unsigned char
#define uint unsigned int

sbit P0_4=P0^4; //定义P0_4
sbit P0_5=P0^5; //定义P0_5
sbit P1_4=P1^4; //定义P1_4
sbit P1_5=P1^5; //定义P1_5

/电机驱动IO定义/
sbit IN1 = P1^2; //为1 左电机反转 前轮
sbit IN2 = P1^3; //为1 左电机正转 前轮
sbit IN3 = P1^6; //为1 右电机正转 前轮
sbit IN4 = P1^7; //为1 右电机反转 前轮
/*sbit EN1 = P1^4; //为1 左电机使能
sbit EN2 = P1^5; //为1 右电机使能 */

sbit IN5 = P0^2; //为1 左电机反转 后轮
sbit IN6 = P0^3; //为1 左电机正转 后轮
sbit IN7 = P0^6; //为1 右电机正转 后轮
sbit IN8 = P0^7; //为1 右电机反转 后轮
/*sbit EN3 = P0^4; //为1 左电机使能 后轮
sbit EN4 = P0^5; //为1 右电机使能 后轮 */

bit Right_moto_stop=1;
bit Left_moto_stop =1;
unsigned int time=0;
int pwm=1;

#define left_motor_en EN1 = 1 //左电机使能
#define left_motor_stops EN1 = 0 //左电机停止
#define right_motor_en EN2 = 1 //右电机使能
#define right_motor_stops EN2 = 0 //右电机停止

#define left_motor2_en EN3 = 1 //左电机使能 后
#define left_motor2_stops EN3 = 0 //左电机停止 后
#define right_motor2_en EN4 = 1 //右电机使能 后
#define right_motor2_stops EN4 = 0 //右电机停止 后

#define left_motor_go IN1 = 0, IN2 = 1//左电机正传
#define left_motor_back IN1 = 1, IN2 = 0//左电机反转
#define right_motor_go IN3 = 1, IN4 = 0//右电机正传
#define right_motor_back IN3 = 0, IN4 = 1//右电机反转

#define left_motor2_go IN5 = 0, IN6 = 1//左电机正传
#define left_motor2_back IN5 = 1, IN6 = 0//左电机反转
#define right_motor2_go IN7 = 1, IN8 = 0//右电机正传
#define right_motor2_back IN7 = 0, IN8 = 1//右电机反转

unsigned char pwm_val_left =0;//变量定义
unsigned char push_val_left =0;// 左电机占空比N/10
unsigned char pwm_val_right =0;
unsigned char push_val_right=0;// 右电机占空比N/10

void delay(uint z)
{
uint x,y;
for(x = z; x > 0; x–)
for(y = 114; y > 0 ; y–);
}

//蓝牙初始化
void UART_INIT()
{
SM0 = 0;
SM1 = 1;//串口工作方式1
REN = 1;//允许串口接收
EA = 1;//开总中断
ES = 1;//开串口中断
TMOD = 0x20;//8位自动重装模式
TH1 = 0xfd;
TL1 = 0xfd;//9600波特率
TR1 = 1;//启动定时器1
}

/************************************************************************/
void run(void) //pwm调速函数
{
push_val_left =pwm; //PWM 调节参数1-10 1为最慢,10是最快 改这个值可以改变其速度
push_val_right =pwm; //PWM 调节参数1-10 1为最慢,10是最快 改这个值可以改变其速度
if(pwm10) pwm=0;
if(pwm
0&&pwm<0) pwm=0;

}

/***********************************************************************/
/
PWM调制电机转速 /
/
***********************************************************************/

/* 左侧电机调速 */
/*调节push_val_left的值改变电机转速,占空比 */
void pwm_out_left_moto(void)
{
if(Left_moto_stop)
{
if(pwm_val_left<=push_val_left)
{ Left_moto_pwm=1;
Left_moto2_pwm=1; }
else
{ Left_moto_pwm=0;Left_moto2_pwm=0; }

if(pwm_val_left>=10)
pwm_val_left=0;
}
else { Left_moto_pwm=0;Left_moto2_pwm=0; }
}
/*****************************************************************/
/
右侧电机调速 /
void pwm_out_right_moto(void)
{
if(Right_moto_stop)
{
if(pwm_val_right<=push_val_right)
{ Right_moto_pwm=1;
Right_moto2_pwm=1; }
else
{Right_moto_pwm=0;
Right_moto2_pwm=0;}
if(pwm_val_right>=10)
pwm_val_right=0;
}
else {Right_moto_pwm=0;Right_moto2_pwm=0; }
}
/
**************************************************/
///TIMER0中断服务子函数产生PWM信号/
void timer0()interrupt 1 using 2
{
TH0=0XF8; //1Ms定时
TL0=0X30;
time++;
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
}

//小车前进
void forward()
{
ET0 = 1;
run(); //pwm 程序
left_motor_go; //左电机前进
right_motor_go; //右电机前进
left_motor2_go; //左电机前进 后轮
right_motor2_go; //右电机前进 后轮
}

void left_go() //左转
{
ET0 = 1;
run();
left_motor_back;
right_motor_go;
left_motor2_back;
right_motor2_go;
delay(700);
forward();
}
//右转
void right_go()
{
ET0 = 1;
run();
delay(50);
right_motor_back;
left_motor_go;
right_motor2_back;
left_motor2_go;
delay(700);
forward();
}
//小车左转圈
void left()
{
ET0 = 1;
run();
delay(50);
right_motor_go; // 右电机前进
left_motor_back; // 左电机后退
right_motor2_go; // 右电机前进
left_motor2_back; // 左电机后退
}

//小车右转圈
void right()
{
ET0 = 1;
run();
left_motor_go;
right_motor_back;
left_motor2_go;
right_motor2_back;
}

//小车后退
void back()
{
ET0 = 1;
run();
left_motor_back;
right_motor_back;
left_motor2_back;
right_motor2_back;
}

//小车停止
void stop()
{
ET0 = 0;
P1=0;
P0=0;
}

//串口中断
void UART_SER() interrupt 4
{
if(RI)
{
RI = 0;//清除接收标志
switch(SBUF)
{
case ‘g’: forward(); break;//前进
case ‘b’: back(); break;//后退
case ‘l’: left(); break;//左转圈
case ‘r’: right(); break;//右转圈
case ‘s’: stop(); break;//停止
case ‘z’: left_go(); break;//左转行驶
case ‘y’: right_go(); break;//右转行驶
case ‘p’: pwm++;break; //加速
case ‘c’: pwm–;break; //减速
}

    }

}

void main()
{
TMOD=0X01;
TH0= 0XF8; //1ms定时
TL0= 0X30;
TR0= 1;
ET0= 1;
EA = 1;
UART_INIT();//串口初始化
while(1);
}

附上 程序源代码和 所有技术文件,蓝牙说明书 需要请自行下载,下载地址
链接:https://pan.baidu.com/s/1C3n3qPu2gff6Z1tk2LyJbg 密码:6bah
谢谢!

2018-05-07 16:58:30 qq_40977332 阅读数 2797
  • 如何玩转JetBot自动驾驶小车

    本次课程将以 Jetson NANO 为主要计算平台,实现智能小车的完整功能。本次公开课主要讲述五大功能算法:目标检测、避障、目标跟踪、图像分割以及路径检测。

    406 人正在学习 去看看 CSDN讲师

前段时间,学完51单片机,出于兴趣,做了一个蓝牙遥控小车,能实现现小车的前进、停止、后退、左转、右转、变速等基本控制。

​ 小车主要由STC12C5620AD为主要控制模块,蓝牙模块使用的是hc-05,使用一个L298N驱动两个电机,通过电机之间的交叉连线,使同一方向的电机实现同方向转动,利用PWM的原理控制电机,程序如下:

硬件链接:

左电机控制端口:P0.0、P0.1
右电机控制端口:P0.2、P0.3         

***************************/

include

define uchar unsigned char//宏定义

define uint unsigned int//宏定义

define aa 50//左轮速度调节值

define bb 50//右轮速度调节值

define PWM1 7//小车前进速度,1-9可调(若转弯容易冲出,调慢即可)

define PWM2 8//小车转向速度,1-9可调

sbit zb=P1^2;//左边 光电管的信号端
sbit qb=P1^1;//前边 光电管的信号端
sbit yb=P1^0;//右边 光电管的信号端
sbit you1=P0^1;//右轮正转信号端
sbit you2=P0^0;//右轮倒转信号端
sbit zuo1=P0^3;//左轮正转信号端
sbit zuo2=P0^2;//左轮倒转信号端

uchar a=0;//定义一个变量a,用来读取串口的数据
uchar flag = 0;
void delayms(uint z)//一个带参数的延时程序
{

int i,j;//定义两个变量
for(i=z;i>0;i--)
for(j=110;j>0;j--);//将参数z赋值给j

}
void qian()//前进
{

you1=0;
you2=1;
zuo1=0;
zuo2=1;
delayms(PWM1);//pwm调速,若PWM1=7表示速度为全速的35%
you1=0;
you2=0;
zuo1=0;
zuo2=0;
delayms(20-PWM1);   

}
void you()//右转
{

you1=1;
you2=1;
zuo1=0;
zuo2=1;
delayms(PWM2);//pwm调速,若PWM1=9表示速度为全速的90%
you1=0;
you2=0;
zuo1=0;
zuo2=0;
delayms(20-PWM2);

}
void zuo()//左转
{

you1=0;
you2=1;
zuo1=1;
zuo2=1;
delayms(PWM2);//pwm调速,若PWM1=9表示速度为全速的90%
you1=0;
you2=0;
zuo1=0;
zuo2=0;
delayms(20-PWM2);

}
void init()//初始化子程序
{

TMOD=0x20;//设置定时器T1为工作方式2
TH1=0xfd;
TL1=0xfd;//T1定时器装初值
TR1=1;//启动定时器T1
REN=1;//允许串口接收
SM0=0;
SM1=1;//设置串口工作方式1
EA=1;//开总中断
ES=1;//开串口中断

}
void go1()//前进子程序
{

zuo1=1;
zuo2=0;//左边轮子正转
delayms(aa);//pwm有用值,越大左边方向的轮子越快
zuo2=1;//关闭左边轮子

you1=1;
you2=0; //右边轮子正转
delayms(bb);//pwm有用值,越大右边的轮子越快
you2=1;//关闭右边轮子

delayms(100);//pwm无用值,越大,小车跑的越慢

}

void go2()//前进子程序
{

zuo1=1;
zuo2=0;//左边轮子正转
delayms(aa);//pwm有用值,越大左边方向的轮子越快
zuo2=1;//关闭左边轮子

you1=1;
you2=0; //右边轮子正转
delayms(bb);//pwm有用值,越大右边的轮子越快
you2=1;//关闭右边轮子

delayms(80);//pwm无用值,越大,小车跑的越慢

}

void go3()//前进子程序
{

zuo1=1;
zuo2=0;//左边轮子正转
delayms(aa);//pwm有用值,越大左边方向的轮子越快
zuo2=1;//关闭左边轮子

you1=1;
you2=0; //右边轮子正转
delayms(bb);//pwm有用值,越大右边的轮子越快
you2=1;//关闭右边轮子

delayms(60);//pwm无用值,越大,小车跑的越慢

}

void go4()//前进子程序
{

zuo1=1;
zuo2=0;//左边轮子正转
delayms(aa);//pwm有用值,越大左边方向的轮子越快
zuo2=1;//关闭左边轮子

you1=1;
you2=0; //右边轮子正转
delayms(bb);//pwm有用值,越大右边的轮子越快
you2=1;//关闭右边轮子

delayms(40);//pwm无用值,越大,小车跑的越慢

}

void go5()//前进子程序
{

zuo1=1;
zuo2=0;//左边轮子正转
delayms(aa);//pwm有用值,越大左边方向的轮子越快
zuo2=1;//关闭左边轮子

you1=1;
you2=0; //右边轮子正转
delayms(bb);//pwm有用值,越大右边的轮子越快
you2=1;//关闭右边轮子

delayms(20);//pwm无用值,越大,小车跑的越慢

}

void go6()//前进子程序
{

zuo1=1;
zuo2=0;//左边轮子正转
delayms(aa);//pwm有用值,越大左边方向的轮子越快
zuo2=1;//关闭左边轮子

you1=1;
you2=0; //右边轮子正转
delayms(bb);//pwm有用值,越大右边的轮子越快
you2=1;//关闭右边轮子

}

void hui1()//小车后退的子程序
{

zuo1=0;
zuo2=1;//左边轮子倒转
delayms(aa);//pwm有用值,越大左边方向的轮子越快
zuo1=1;//关闭左边轮子

you1=0;
you2=1; //右边轮子倒转
delayms(bb);//pwm有用值,越大右边的轮子越快
you1=1;//关闭右边轮子

delayms(100);//pwm无用值,越大,小车跑的越慢

}

void hui2()//小车后退的子程序
{

zuo1=0;
zuo2=1;//左边轮子倒转
delayms(aa);//pwm有用值,越大左边方向的轮子越快
zuo1=1;//关闭左边轮子

you1=0;
you2=1; //右边轮子倒转
delayms(bb);//pwm有用值,越大右边的轮子越快
you1=1;//关闭右边轮子

delayms(80);//pwm无用值,越大,小车跑的越慢

}

void hui3()//小车后退的子程序
{

zuo1=0;
zuo2=1;//左边轮子倒转
delayms(aa);//pwm有用值,越大左边方向的轮子越快
zuo1=1;//关闭左边轮子

you1=0;
you2=1; //右边轮子倒转
delayms(bb);//pwm有用值,越大右边的轮子越快
you1=1;//关闭右边轮子

delayms(60);//pwm无用值,越大,小车跑的越慢

}

void hui4()//小车后退的子程序
{

zuo1=0;
zuo2=1;//左边轮子倒转
delayms(aa);//pwm有用值,越大左边方向的轮子越快
zuo1=1;//关闭左边轮子

you1=0;
you2=1; //右边轮子倒转
delayms(bb);//pwm有用值,越大右边的轮子越快
you1=1;//关闭右边轮子

delayms(40);//pwm无用值,越大,小车跑的越慢

}
void hui5()//小车后退的子程序
{

zuo1=0;
zuo2=1;//左边轮子倒转
delayms(aa);//pwm有用值,越大左边方向的轮子越快
zuo1=1;//关闭左边轮子

you1=0;
you2=1; //右边轮子倒转
delayms(bb);//pwm有用值,越大右边的轮子越快
you1=1;//关闭右边轮子

delayms(20);//pwm无用值,越大,小车跑的越慢

}
void hui6()//小车后退的子程序
{

zuo1=0;
zuo2=1;//左边轮子倒转
delayms(aa);//pwm有用值,越大左边方向的轮子越快
zuo1=1;//关闭左边轮子

you1=0;
you2=1; //右边轮子倒转
delayms(bb);//pwm有用值,越大右边的轮子越快
you1=1;//关闭右边轮子

}

void turnleft()//小车左转弯子程序
{

zuo1=0;
zuo2=1;//左边轮子停止转动
you1=1;
you2=0; //右边轮子正转
delayms(1);//pwm有用值,越大右边的轮子越快
you2=1;//右边轮子停止
zuo1=1;

}

void turnright()//小车右转弯子程序
{

zuo1=1;
zuo2=0;//左边轮子正转
you1=0;
you2=1; //右边轮子停止
delayms(1);//pwm有用值,越大左边方向的轮子越快
zuo2=1;//左边轮子停止
you1=1; 

}
void down()//停止子程序
{

zuo1=1;
zuo2=1;
you1=1;
you2=1; //左右轮全部停止

}
void APP()
{

if(a==0x14||a==0x15||a==0x54||a==0x55||a==0x64||a==0x65)//如果是就前进
        go1();
        if(a==0x16||a==0x17||a==0x56||a==0x57||a==0x66||a==0x67)//如果是就前进
        go2();
        if(a==0x18||a==0x19||a==0x58||a==0x59||a==0x68||a==0x69)//如果是就前进
        go3();
        if(a==0x1a||a==0x1b||a==0x5a||a==0x5b||a==0x6a||a==0x6b)//如果是就前进
        go4();
        if(a==0x1c||a==0x1d||a==0x5c||a==0x5d||a==0x6c||a==0x6d)//如果是就前进
        go5();
        if(a==0x1e||a==0x1f||a==0x5e||a==0x5f||a==0x6e||a==0x6f)//如果是就前进
        go6();

        if(a==0x24||a==0x25||a==0x74||a==0x75||a==0x84||a==0x85)//如果是就后退
        hui1();
        if(a==0x26||a==0x27||a==0x76||a==0x77||a==0x86||a==0x87)//如果是就后退
        hui2();
        if(a==0x28||a==0x29||a==0x78||a==0x79||a==0x88||a==0x89)//如果是就后退
        hui3();
        if(a==0x2a||a==0x2b||a==0x7a||a==0x7b||a==0x8a||a==0x8b)//如果是就后退
        hui4();
        if(a==0x2c||a==0x2d||a==0x7c||a==0x7d||a==0x8c||a==0x8d)//如果是就后退
        hui5();
        if(a==0x2e||a==0x2f||a==0x7e||a==0x7d||a==0x8e||a==0x8f)//如果是就后退
        hui6();

        if(a==0x3f)//如果是0x3f就左转
        turnleft();
        if(a==0x4f)//如果是0x4f就右转
        turnright();
        if(a==0x00)//如果是0x00就停止
        down();
        else
        down();

}

void main()//主程序
{

init();//调用初始化子程序
while(1)//死循环
{
       if(flag == 1)
       {
         APP();
        flag = 0;
       }

}   

}

void chuan() interrupt 4//串口中断服务程序
{

RI=0;//软件清除串口响应
a=SBUF;//读取单片机串口接受的蓝牙模块发送的数据
flag = 1;

}

2017-06-09 14:43:27 seven94959 阅读数 14737
  • 如何玩转JetBot自动驾驶小车

    本次课程将以 Jetson NANO 为主要计算平台,实现智能小车的完整功能。本次公开课主要讲述五大功能算法:目标检测、避障、目标跟踪、图像分割以及路径检测。

    406 人正在学习 去看看 CSDN讲师
/*********************************************************
    文件名:car.c
    文件说明:小车的蓝牙,避障,自动寻迹C程序
    编写人员:Seven
    编写日期:2017年6月9日
    程序说明:MCU采用AT89C52,外接11.0592MHz晶振、3个光电
              开关、5个红外对管、HC06蓝牙模块、L298N电机驱
              动模块,12V电源供电,L7805稳压输出5V。
    版权标注:河南工程学院 电气信息工程系C303创新实验室
    交流QQ:949597273
*********************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int
#define MAIN_Fosc  11059200

uint i;
uchar tmp;
sbit IN1=P0^0;      //控制左前后轮正转 1正转 0停止
sbit IN2=P0^1;      //控制左前后轮倒转 1倒转 0停止
sbit IN3=P0^2;      //控制右前后轮正转 1正转 0停止
sbit IN4=P0^3;      //控制右前后轮倒转 1倒转 0停止
sbit ENA=P0^4;      //左轮使能端
sbit ENB=P0^5;      //右轮使能端
sbit red1=P1^0;      //red是红外对管,从左到右分别是1~~5
sbit red2=P1^1;      //红外对管以第三个为准,寻迹时返回为高电平
sbit red3=P1^2;      //为1时为高电平,无信号返回
sbit red4=P1^3;
sbit red5=P1^4;
sbit eye1=P2^5;       //eye为红外光电开关
sbit eye2=P2^6;
sbit eye3=P2^7;
sbit Beep=P0^7;

/********串*口*初*始*化*函*数*******/
void init()        
 {
                       TMOD = 0x20;        //工作模式2,8位自动重装
                    TH1 = 0xfd;
                    TL1 = 0xfd;            //波特率9600bps
                    SM0 = 1;
                    SM1 = 1;            //串口工作方式1     10位异步收发器
                    TR1 = 1;            //T1定时器启动
                    REN = 1;            //允许串口通讯
                    EA  = 1;            //开总中断
                    ES  = 1;            //串口中断打开

 }

 /********* ms*级*延*时*函*数*********/

void Delay_Ms(uint ms)
{
     uint i;
       do{
          i = MAIN_Fosc / 96000;
         while(--i);  
      }while(--ms);
}

/*****运*动*状*态*控*制*函*数*****/
void turnleft()
{
    for(i=0;i<7;i++)
    {
    IN1=0;
    IN2=1;
    IN3=1;
    IN4=0;
    ENA=ENB=1;     //设置占空比,控制小车速度,下同
      Delay_Ms(3);    
      ENA=ENB=0;
     Delay_Ms(8);
    }
}
void turnright()
{
    for(i=0;i<7;i++)
    {
    IN1=1;
    IN2=0;
    IN3=0;
    IN4=1;
    ENA=ENB=1;               
      Delay_Ms(3);    
      ENA=ENB=0;
     Delay_Ms(8);
    }
}
void anticlockwise()
{
    for(i=0;i<13;i++)
    {
    IN1=0;
    IN2=1;
    IN3=1;
    IN4=0;
    ENA=ENB=1;              
      Delay_Ms(3);    
      ENA=ENB=0;
     Delay_Ms(7);
    }
    
}
void clockwise()
{
    for(i=0;i<13;i++)
    {
    IN1=1;
    IN2=0;
    IN3=0;
    IN4=1;
    ENA=ENB=1;               
      Delay_Ms(3);    
      ENA=ENB=0;
     Delay_Ms(7);
    }
}
/*******go*函*数*用*于*寻*迹*******/
void go(void)
{
    for(i=0;i<10;i++)
    {
    IN1=1;
    IN2=0;
    IN3=1;
    IN4=0;
    ENA=ENB=1;               
      Delay_Ms(2);    
      ENA=ENB=0;
     Delay_Ms(14);
    }
}

/*********用*于*180度*转*身*避*障*********/
void turn_round(void)
{
    for(i=0;i<58;i++)
    {
    IN1=0;
    IN2=1;
    IN3=1;
    IN4=0;
    ENA=ENB=1;               
      Delay_Ms(4);    
      ENA=ENB=0;
     Delay_Ms(8);
    }
    
}
/*******run*函*数*用*于*蓝*牙*遥*控*******/
void run(void)
{
    for(i=0;i<13;i++)
    {
    IN1=1;
    IN2=0;
    IN3=1;
    IN4=0;
    ENA=ENB=1;               
      Delay_Ms(2);    
      ENA=ENB=0;
     Delay_Ms(8);
    }
}
void upleft(void)
{
    for(i=0;i<13;i++)
    {
    IN1=1;
    IN2=0;
    IN3=1;
    IN4=0;
    ENB=1;
    Delay_Ms(13);
    ENA=1;            
      Delay_Ms(5);
      ENA=ENB=0;
     Delay_Ms(12);
    }
}
void upright(void)
{
    for(i=0;i<13;i++)
    {
    IN1=1;
    IN2=0;
    IN3=1;
    IN4=0;
    ENA=1;               
      Delay_Ms(13);
    ENB=1;
      Delay_Ms(5);
      ENA=ENB=0;
     Delay_Ms(12);
    }
}
void back(void)
{
    for(i=0;i<15;i++)
    {
    IN1=0;
    IN2=1;
    IN3=0;
    IN4=1;
    ENA=ENB=1;               
      Delay_Ms(3);    
      ENA=ENB=0;
     Delay_Ms(7);
    }
}
void stop()
{
    IN1=0;
    IN2=0;
    IN3=0;
    IN4=0;
}
void bottom_left()
{
    for(i=0;i<15;i++)
    {
    IN1=0;
    IN2=1;
    IN3=0;
    IN4=1;
    ENB=1;
     Delay_Ms(13);
    ENA=1;              
      Delay_Ms(5);    
      ENA=ENB=0;
     Delay_Ms(12);
    }
    
}
void bottom_right()
{
    for(i=0;i<10;i++)
    {
    IN1=0;
    IN2=1;
    IN3=0;
    IN4=1;
    ENA=1;              
      Delay_Ms(13);
    ENB=1;
     Delay_Ms(5);
      ENA=ENB=0;
     Delay_Ms(12);
    }

}
/*************蓝*牙*遥*控*函*数*********************/
void ctrl()                      //接收处理函数
{
                           switch(tmp)
                            {
                                 case '1': //led1 = 0;
                                    upleft();
                                    break;   
                                case '2':
                                    run();
                                    break;
                                case '3':                         
                                     upright();
                                     break;
                                case '4':                                            
                                    anticlockwise();
                                    break;
                                case '5':
                                    stop();    
                                    break;
                                case '6':
                                    clockwise();
                                    break;
                                case '7':
                                    bottom_left();
                                    break;
                                case '8':
                                    back();
                                    break;
                                case '9':
                                    bottom_right();
                                    break;
                                 default:
                                    stop();          
                              }

}

/*******寻*迹*函*数*******/
void Tracing(void)
{  
    if((red1==0)&&(red3==1)&&(red5==0))
       go();
    if(((red4==1)||(red5==1))&&(red3==0))
       turnleft();
    if(((red1==1)||(red2==1))&&(red4==0))
       turnright();
    if((red1==0)&&(red2==0)&&(red3==0)&&(red4==0)&&(red5==0))
      stop();   
}

/*************避*障*函*数************/
void Avoid(void)
{

  P2=0xe0;
  while(((eye1==0)&&(eye2==0))||(eye1==0))
       {  
          Beep=0;
          turnleft();                                          
          Beep=1;
       }
  while(((eye2==0)&&(eye3==0))||(eye3==0))
       {
          Beep=0;
          turnright();
          Beep=1;
       }
  while(((eye1==0)&&(eye2==0)&&(eye3==0))||(eye2==0)||((eye1==0)&&(eye2==1)&&(eye3==0)))
       {
          Beep=0;
          turn_round();
          Beep=1;
       }      
}


void main()
{          
              init();
//            tmp = SBUF;        /*未能如愿,遗憾*/           
//            if(tmp == '2')
//            {
//             while(1)                        
//            go();
//               }
//
//            if(tmp == '8')
//            {
//             while(1)                        
//            back();
//            }
            while(1)
            {
            Tracing();
            Avoid();
            }
 }

/*******串*口*中*断*服*务*程*序*******/
void UART() interrupt 4
{
          if(RI==1)                    //是否有数据到来 1为是 0为否
          {
          tmp = SBUF;                   //暂存接收到的数据
          RI = 0;
          }
          ctrl();
}          


2018-08-23 12:26:41 padingdun 阅读数 8980
  • 如何玩转JetBot自动驾驶小车

    本次课程将以 Jetson NANO 为主要计算平台,实现智能小车的完整功能。本次公开课主要讲述五大功能算法:目标检测、避障、目标跟踪、图像分割以及路径检测。

    406 人正在学习 去看看 CSDN讲师
              ****这是我写的第一篇博客,如果有问题欢迎指正。*****    
之前早就做好了,但一直没有时间发表,现在就把我做的过程和思路分享给大家。

【硬件部分】

小车模型一个(直流电机一对)
这里写图片描述

电池18650一对
这里写图片描述

HC-08蓝牙模块
这里写图片描述

蓝牙模块主要要掌握其基本参数以及工作原理即可,附下图。
这里写图片描述

这里写图片描述

L298模块
这里写图片描述

l298内部包含4通道逻辑驱动电路,是二相和四相电机的专用驱动器,即内含两个H桥的高电压大电流全桥式驱动器,接收标准TTL逻辑电平,可驱动46V,2A以下的电机。

这里写图片描述

内部逻辑图如下

这里写图片描述

L7805芯片

L7805CV是输出电压为4.75-5.25V,静态电流为4.2-8mA的正电压稳压器。其输出电流可达1.5A,不需外接补偿元件,内含限流保护电流,防止负载短路烧毁元件。
这里写图片描述

51单片机

芯片采用STC12C5A60S2.
这里写图片描述

【软件部分】
部分代码如下

PWM输出程序

这里写图片描述

控制PWM程序

这里写图片描述

串口中断程序

这里写图片描述

主程序

这里写图片描述

2019-04-22 15:07:20 qq_35105528 阅读数 522
  • 如何玩转JetBot自动驾驶小车

    本次课程将以 Jetson NANO 为主要计算平台,实现智能小车的完整功能。本次公开课主要讲述五大功能算法:目标检测、避障、目标跟踪、图像分割以及路径检测。

    406 人正在学习 去看看 CSDN讲师

       上次给大家讲解了蓝牙小车的硬件部分,这次给大家讲解蓝牙小车的程序部分。这里说的程序部分指的是单片机的程序,关于安卓app的编写下次继续教大家。
       总的来说,我们常用的蓝牙模块,如hc05采用的是串口通讯协议。串口通讯是初学者面对的比较重要的知识点 ,也是单片机比较基础的通讯协议,所以建议大家好好理解一下。蓝牙小车的程序其实就是51单片机串口接收数据的程序,它的工作原理是安卓手机和蓝牙模块配对连接后,安卓手机采用串口发送制定的字符,单片机按照串口通讯协议接收该字符后,判断接收的字符是否是小车行动指令,来控制驱动信号线高低电平,进而控制小车的前进与转弯。
       下面就是51单片机串口接收数据的程序,希望可以给大家带来思路

#include<reg52.h>//声明头文件

#define uchar unsigned char//宏定义

#define uint unsigned int//宏定义

uchar a=0;//定义一个变量a,用来读取串口的数据

void delay(uint z)//一个带参数的延时程序

{

int i,j;//定义两个变量

for(i=10;i>0;i--)

for(j=z;j>0;j--);//将参数z赋值给j

}

void init()//初始化子程序

{

TMOD=0x20; //设置定时器T1为工作方式2

TH1=0xfd;

TL1=0xfd; //T1定时器装初值

TR1=1; //启动定时器T1

REN=1; //允许串口接收

SM0=0;

SM1=1; //设置串口工作方式1

EA=1; //开总中断

ES=1; //开串口中断

}

void main()//主程序

{

init();//调用初始化子程序

while(1)//死循环

{

switch(a)//判断a从串口读取到的数据

{

case 0001://如果是0x1f就前进

P2=0x01;

break;

case 0002://如果是0x2f就后退

P2=0x02;

break;

case 0003://如果是0x3f就左转

P2=0x04;

break;

case 0004://如果是0x4f就右转

P2=0x0f;

break;

case 0x05://如果是0x00就停止

P2=0xf0;

break;

}

}

}

void chuan() interrupt 4//串口中断服务程序

{

RI=0;//软件清除串口响应

a=SBUF;//读取单片机串口接受的蓝牙模块发送的数据

}
没有更多推荐了,返回首页