智能小车舵机控制

智能小车舵机控制
智能小车舵机控制

// 只利用一个定时器T0 ,定时时间为,定义一个角度标识,数值为1 、2、3、4、5,// 实现、1ms、、2ms、高电平的输出,再定义一个变量,数值最大为40 ,实现周期为// 每次进入定时中断,判断此时的角度标识,进行

// 相应的操作。比如此时为5 ,则进入的前5 次中断期间,信号输出为高电平,即为

// 高电平。剩下的35 次中断期间,信号输出为低电平,即为的低电平。这样总的时间// 是

20ms,为一个周期。

// 用51 板上s1 和s2 按键

// 用P1^7 输出PWM信号控制舵机

#include ""

sbit dula=P2^6;

sbit wela=P2^7;

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e

void delay(unsigned char i)// {

unsigned char j,k;

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

for(k=125;k>0;k--);

}

void Time0_Init() //

{

TMOD = 0x01; //

IE= 0x82;

TH0= 0xfe;

TL0= 0x33; //

TR0=1; //

}

void Time0_Int() interrupt 1 //

{

TH0 = 0xfe; //

TL0 = 0x33;

if(count

pwm=1; //

else

pwm=0; //

count=(count+1); //

count=count%40; //

延时

定时器初始化

定时器0 工作在方式1

晶振,定时器开始

中断程序

重新赋值

判断次数是否小于角度标识

确实小于,PWM输出高电平大于则

输出低电平

次数加1

次数始终保持为40 即保持周期为20ms

20ms。

unsigned char count; // sbit pwm =P1^7 ; //PWM sbit jia =P3^0; //

sbit jan =P3^1; //

sbit jianwei=P3^4; // unsigned char jd; //

次数标识

信号输出角度增加按键检测IO 口角度减少按键检测IO 口按键位

角度标识

按键扫描

角度增加按键是否按下 按下延时,消抖 确实按下 角度标识加 1 按键按下 则 20ms 周期从新开始 已经是 180 度,则保持 等待按键放开 角度减小按键是否按下 , 角度标识减 1 已经是 0 度,则保持 数码管显示函数 根据角度标识显示相应的数值 为 1 ,角度为 0,前 3 个数码管显示

ge=0;

break;

case 2:

bai=0;

shi=4;

ge=5;

break;

case 3:

bai=0;

shi=9;

ge=0; } void keyscan() //

{

if(jia==0) //

{

delay(10); // if(jia==0) //

{

jd++; //

count=0; // if(jd==6)

jd=5; // while(jia==0);

//

}

}

if(jan==0) //

{

delay(10);

if(jan==0)

{

jd--; //

count=0;

if(jd==0)

jd=1; //

while(jan==0);

}

}

}

void display() //

{

unsigned char bai,shi,ge;

switch(jd) //

{

case 1: //

bai=0;

shi=0;

000

break;

case 4: bai=1; shi=3;

ge=5; break;

case 5: // bai=1;

shi=8; ge=0; break;

}

dula=0;

为5,角度为180 ,前 3 个数码管显示

180 P0=table[bai];

dula=1;

dula=0;

wela=0;

P0=0xfe;

wela=1;

wela=0;

delay(5);

P0=table[shi];

dula=1;

dula=0;

P0=0xfd;

wela=1;

wela=0;

delay(5);

P0=table[ge];

dula=1;

dula=0;

P0=0xfb;

wela=1;

wela=0;

delay(5);

}

void main()

{

jd=1;

jianwei=0;

count=0;

Time0_Init();

while(1)

{

keyscan(); //

display();

}

按键扫描

}

2 #include<> #define uint unsigned int #define uchar unsigned char uint count;

uchar jd;

sbit le1=P1^0; //* 光电传感器*// sbit PWM=P3^5; // 舵机pwm// init()

{

TMOD=0x01;// 设定定时器

TH0 = 0xFE;

TL0 = 0x0c;// 设定定时初始值

EA=1;

ET0=1;

TR0=1; } void delay(uint z) // 延时

{ uint x,y;

for(x=z;x>0;x--) for(y=125;y>0;y--);

}

void timer0() interrupt 1 // 产生pwm信号控制舵机,周期

20ms

{

TH0 = 0xFE;

TL0 = 0x0c; // 设定定时初始值if(count

PWM=1; // 确定小于,pwm输出高电平

// delay(180); // 延时一会,可以减慢舵机转速}

else

PWM=0; // 大于则输出低电平count=count+1; // 次数加1 count=count%40; // 次数始终保持为40 即保持周期为20ms }

void xunji() // 循迹函数,读取光电管状态{

if(le1!=0)

{ delay(10); if(le1==0)

{ jd++;

count=0;

while(le1==0);

}

} // 分析光电管状态,看你的电路检测到黑线输出1 或者是0 else

{

count=0;

jd=3; // 舵机归中

}

}

void main()

{

jd=3; // 角度初始化90°:1= 舵机为0° 2=1ms 舵机为45°3、4、5、同上count=0; // 初始化赋值零

init(); // 定时器初始化

while(1)

{

xunji(); // 舵机检测

}

}

51单片机程序:按键控制舵机角度

#include "reg52.h" unsigned char count; //0.5ms次数标识 sbit pwm =P2^7 ; //PWM信号输出 sbit jia =P2^4; //角度增加按键检测IO口 sbit jan =P2^5; //角度减少按键检测IO口 unsigned char jd=5; //角度标识 void delay(unsigned char i)//延时 { unsigned char j,k; for(j=i;j>0;j--) for(k=125;k>0;k--); } void Time0_Init() //定时器初始化 { TMOD = 0x01; //定时器0工作在方式1 IE = 0x82; TH0 = 0xfe; TL0 = 0x33; //11.0592MZ晶振,0.5ms TR0=1; //定时器开始 } void Time0_Int() interrupt 1 //中断程序 { TH0 = 0xfe; //重新赋值 TL0 = 0x33; if(count< jd) //判断0.5ms次数是否小于角度标识 pwm=1; //确实小于,PWM输出高电平 else pwm=0; //大于则输出低电平 count=(count+1); //0.5ms次数加1 count=count%40; //次数始终保持为40 即保持周期为20ms } void keyscan() //按键扫描 { if(jia==0) //角度增加按键是否按下 { delay(10); //按下延时,消抖 if(jia==0) //确实按下 { jd++; //角度标识加1 count=0; //按键按下则20ms周期从新开始 if(jd==6) jd=5; //已经是180度,则保持 while(jia==0); //等待按键放开

智能小车舵机控制精编版

智能小车舵机控制精编 版 MQS system office room 【MQS16H-TTMS2A-MQSS8Q8-MQSH16898】

1 //只利用一个定时器 T0,定时时间为,定义一个角度标识,数值为 1、2、3、4、5, //实现、1ms、、2ms、高电平的输出,再定义一个变量,数值最大为 40,实现周期为 20ms。 //每次进入定时中断,判断此时的角度标识,进行 //相应的操作。比如此时为 5,则进入的前 5 次中断期间,信号输出为高电平,即为的 //高电平。剩下的 35 次中断期间,信号输出为低电平,即为的低电平。这样总的时间 //是 20ms,为一个周期。 //用51板上s1和s2按键 //用P1^7输出 PWM信号控制舵机 #include "" unsigned char count; //次数标识 sbit pwm =P1^7 ; //PWM信号输出 sbit jia =P3^0; //角度增加按键检测IO口 sbit jan =P3^1; //角度减少按键检测IO口 sbit jianwei=P3^4; //按键位 unsigned char jd; //角度标识 sbit dula=P2^6; sbit wela=P2^7; unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e void delay(unsigned char i)//延时 { unsigned char j,k; for(j=i;j>0;j--) for(k=125;k>0;k--); } void Time0_Init() //定时器初始化 { TMOD = 0x01; //定时器0工作在方式1 IE= 0x82; TH0= 0xfe; TL0= 0x33; //晶振, TR0=1; //定时器开始 } void Time0_Int() interrupt 1 //中断程序 { TH0 = 0xfe; //重新赋值 TL0 = 0x33; if(count

智能车舵机PD运算

/**********************舵机增量式PID算法*********************** double ref = 0;//设置参数设定值 double feb = 0;//采样反馈过程值 int pwm_var = 0; //PID调整量 int PWM_out = 0; //PWM输出量 double Uo = 0; double Ek = 0; double Ei = 0; double Ed = 0; #define Kp 8 //PID调节的比例常数 #define Ti 0.05 //PID调节的积分常数 #define Td 0.02 //PID调节的微分时间常数 #define T 0.02 //采样周期 #define Kpp Kp * ( 1 + (T / Ti) + (Td / T) ) #define Ki (-Kp) * ( 1 + (2 * Td / T ) ) #define Kd Kp * Td / T //#define Kpp 4 //#define Ki 0.8 //#define Kd 20 //误差的阀值,小于这个数值的时候,不做PID调整,避免误差较小时频繁调节引起震荡 #define Emin 3 //调整值限幅,防止积分饱和 #define Umax 100 #define Umin -100 //输出值限幅 #define Pmax 15500 #define Pmin 200 /////////////////////////////////////////////////////////////////// ////// PID运算 ///////

单片机程序按键控制舵机角度

#i n c l u d e"r e g52.h" unsigned char count; //0.5ms次数标识 sbit pwm =P2^7 ; //PWM信号输出 sbit jia =P2^4; //角度增加按键检测IO口 sbit jan =P2^5; //角度减少按键检测IO口 unsigned char jd=5; //角度标识 void delay(unsigned char i)//延时 { unsigned char j,k; for(j=i;j>0;j--) for(k=125;k>0;k--); } void Time0_Init() //定时器初始化 { TMOD = 0x01; //定时器0工作在方式1 IE = 0x82; TH0 = 0xfe; TL0 = 0x33; //11.0592MZ晶振,0.5ms TR0=1; //定时器开始 } void Time0_Int() interrupt 1 //中断程序 {

TH0 = 0xfe; //重新赋值 TL0 = 0x33; if(count< jd) //判断0.5ms次数是否小于角度标识 pwm=1; //确实小于,PWM输出高电平 else pwm=0; //大于则输出低电平 count=(count+1); //0.5ms次数加1 count=count%40; //次数始终保持为40 即保持周期为20ms } void keyscan() //按键扫描 { if(jia==0) //角度增加按键是否按下 { delay(10); //按下延时,消抖 if(jia==0) //确实按下 { jd++; //角度标识加1 count=0; //按键按下则20ms周期从新开始 if(jd==6) jd=5; //已经是180度,则保持 while(jia==0); //等待按键放开 }

5.智能小车-按键控制小车的启动

实验五:树莓派平台-------按键控制小车启动实验 1、实验前准备 图1-1 树莓派主控板 图1-2 按键开关 2、实验目的 ssh服务登录树莓派系统之后,编译运行按键控制小车启动实验后,按下KEY 启动小车,小车会自动先前进1s,后退1s,左转2s,右转2s,原地左转3s,原地右转3s,接着停止0.5s。 3、实验原理

按键消抖:通常我们的按键开关一般都是机械弹性开关,当机械触点断开,闭合时,由于机械触点的弹性作用,一个按键开关子在闭合时不会马上就能稳定的接通,在断开时也不会一下子彻底断开,而是在闭合和断开时会伴随着一连串的抖动。 图3-1 按键抖动状态图 抖动时间一般都是由按键的机械特性决定的,一般都会在10ms以内,为了确保程序对按键的一次闭合后一次断开只响应一次,必须进行按键的消抖处理,有硬件消抖和软件消抖。 其中,软件消抖指的是检测出键闭合后执行一个延时程序,产生5ms~10ms 的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序。 硬件消抖是在开关两段接一个0.1uf的电容。本次实验我们采取的是软件延时去抖。 4、实验步骤 4-1.看懂原理图

图4-1 树莓派主控板电路图 图4-2 按键

图4-3 树莓派40pin引脚对照表 4-2 由电路原理图可知按键是直接连接到主控板上的wiringPi编码的10口。我们设置10口为输入模式,并当按下按键时通过检测该引脚的电平状态,来判断按键是否被按下。 4-3 程序代码如下:

智能小车控制程序1

/*实现前进与后退功能*/ /*控制智能车向前行驶10秒,然后停3秒,再向后行驶6秒,停止*/ /********************************************************/ #include #define uint unsigned int /*进行端口声明时,应与具体硬件连接相对应,如不相互对应,将影响程序功能的正常实现*/ sbit S1=P1^3; //对电机端口声明 sbit S2=P1^4; sbit S3=P1^5; sbit S4=P1^6; /*功能函数定义*/ void delay(uint del) //延时函数,延时del毫秒 { uint i,j; for(i=0; i

{ go(); //前进 delay(10000); //前进10秒 stop(); //停止 delay(3000); //停3秒 back(); //后退 delay(6000); //后退6秒 stop(); //停止 }

智能车中的舵机入门

单片机控制舵机 修改浏览权限 | 删除.什么是舵机: 舵机如下所示: 有三根线,一般依次是地,电源(5V左右),信号(信号的幅值>=3.3V),不清楚各个脚打开舵机一测量就知道了。 2.其工作原理是: 控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏 置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。当然我们可以不用去了解它的具体工作原理,知道它的控制原理就够了。就象我们使用晶体管一样,知道可以拿它来做开关管或放大管就行了,至于管内的电子具体怎么流动是可以完全不用去考虑的。 3.舵机的控制: 舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为 0.5ms~2.5ms范围内的角度控制脉冲部分。以180度角度伺服为例,那么对应的控制关 系是这样的: 0.5ms--------------0度;

1.0ms------------45度; 1.5ms------------90度; 2.0ms-----------135度; 2.5ms-----------180度; 重要说明: 1:上面部分还是成线形关系的,Y=90X-45(X单位是ms,Y单位是度数:) 2:上面所说的0度45度等是指度45度位置(什么意思呢:我说明一下就知道了,就拿45度位置来说,若舵机停在0度位置,下载45度位置程序后则舵机停在45度,即顺时针走了45度,若当时舵机在135度位置,则反转90度到45度位置。所以舵机不存在正转反转问题。这点非常重要。 3:若想转动到45度位置,要一直产生1.0ms的高电平(即PA0=1; Delay(1ms);PA0=0;Delay(20ms);要不停的产生这个高低电平,产生PWM脉冲 请看下形象描述吧: 下面是我在ATMEGA32上的测试程序,开发软件:ICC AVR #include typedef struct BYTE_BIT { unsigned BIT0:1; unsigned BIT1:1; unsigned BIT2:1;

舵机控制程序

在机器人机电控制系统中,舵机控制效果是性能的重要影响因素。舵机可以在微机电系统和航模中作为基本的输出执行机构,其简单的控制和输出使得单片机系统非常容易与之接口。 舵机是一种位置伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。其工作原理是:控制信号由接收机的通道进入信号调制芯片,

获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。舵机的控制信号是PWM信号,利用占

空比的变化改变舵机的位置。一般舵机的控制要求如图1所示。 图1 舵机的控制要求 单片机实现舵机转角控制可以使用FPGA、模拟电路、单片机来产生舵机的控制信号,但FPGA成本高且电路复杂。对于脉宽调制信号的脉宽变换,常用的一种方法是采用调制信号获取有源滤波后的直流电压,但是需要50Hz(周期是20ms)的信号,这对运放 器件的选择有较高要求,从电路体积和功耗考虑也不易采用。5mV 以上的控制电压的变化就会引起舵机的抖动,对于机载的测控系统而言,电源和其他器件的信号噪声都远大于5mV,所以滤波

电路的精度难以达到舵机的控制精度要求。 也可以用单片机作为舵机的控制单元,使PWM信号的脉冲宽度实现微秒级的变化,从而提高舵机的转角精度。单片机完成控制算法,再将计算结果转化为PWM信号输出到舵机,由于单片机系统是一个数字系统,其控制信号的变化完全依靠硬件计数,所以受外界干扰较小,整个系统工作可靠。 单片机系统实现对舵机输出转角的控制,必须首先完成两个任务:首先是产生基本的PWM周期信号,本设计是产生20ms的周期信号;其次是脉宽的调整,即单片机模拟PWM信号的输出,并且调整占空比。当系统中只需要实现一个舵机的控制,采用的控制方式是改变单片机的一个定时器中断的初值,将20ms分为两次中断执行,一次短定时中断和一次长定时中断。这样既节省了硬件电路,也减少了软件开销,控制系统工作效率和控制精度都很高。 具体的设计过程: 例如想让舵机转向左极限的角度,它的正脉冲为2ms,则负脉冲为 20ms-2ms=18ms,所以开始时在控制口发送高电平,然后设置定时器在

智能小车原理

一、前言 设计背景: 在科学探索和紧急抢险中经常会遇到对与一些危险或人类不能直接到达的地域的探测,这些就需要用机器人来完成。而在机器人在复杂地形中行进时自动避障是一项必不可少也是最基本的功能。因此,自动避障系统的研发就应运而生。我们的自动避障小车就是基于这一系统开发而成的。意义随着科技的发展,对于未知空间和人类所不能直接到达的地域的探索逐步成为热门,这就使机器人的自动避障有了重大的意义。我们的自动避障小车就是自动避障机器人中的一类。自动避障小车可以作为地域探索机器人和紧急抢险机器人的运动系统,让机器人在行进中自动避过障碍物。成员情况本组三位成员均为2005级基地班学生,都选修过数字电路课程。二、总体方案设计 1、设计要求 小车从无障碍地区启动前进,感应前进路线上的障碍物后,根据障碍物的位置选择下一步行进方向。并可通过两个独立按键对小车进行控速。 2、小车自动避障的原理 小车车头处装有三个光电开关,中间一个光电开关对向正前方,两侧的光电开关向两边各分开30度,(如右图所示)。小车在行进过程中由光电开关向前方发射出红外线,当红外线遇到障碍物时发生漫反射,反射光被光电开关接收。小车根据三个光电开关接受信号的情况来判断前方障碍物的分布并做出相应的动作。光电开关的平均探测距离为30cm。 3、模块方案比较及论证 根据设计要求,我们的自动避障小车主要由六个模块构成:车体框架、电源

及稳压模块、主控模块、逻辑模块、探测模块、电机驱动模块组成。各模块分述如下: 3.1车体框架 在设计车体框架时,我们有两套起始方案,自己制作和直接购买玩具电动车。方案一:自己设计制作车架自己制作小车底盘,用两个直流减速电机作为主动轮,利用两电机的转速差完成直行、左转、右转、左后转、右后转、倒车等动作。减速电机扭矩大,转速较慢,易于控制和调速,符合避障小车的要求。而且自己制作小车框架,可以根据电路板及传感器安装需求设计空间,使得车体美观紧凑。但自己制作小车设计制作周期较长,且费用较高,因而我们放弃这一方案。方案二:购买玩具电动车 玩具电动车价格低廉,有完整的驱动、传动和控制单元,其中传动装置是我们所需的,缩短了开发周期。但玩具电动车采用普通直流电机驱动,带负载能力差,调速方面对程序要求较高。同时,玩具电动车转向 依靠前轮电机带动前轮转向完成,精度低。 考虑到利用玩具电动小车做车架开发周期短,可留够充分的时间用于系统调试,且硬件上的不足我们有信心用优良的算法来弥补,故我们选择方案二。

智能小车控制系统设计

智能小车控制系统设计 ——ARM控制模块设计 EasyARM615是一款基于32位ARM处理器,集学习和研发于一体的入门级开发套件,该套件采用Luminary Micro(流明诺瑞)公司生产的Stellaris系列微控制器LM3S615。本系统设计是以EasyARM615开发板为核心,通过灰度传感器检测路面上的黑线,运用PWM直流电机调速技术,完成对小车运动轨迹等一系列的控制。同时利用外扩的液晶显示器显示出各个参数。以达到一个简易的智能小车。 本文叙述了系统的设计原理及方法,讨论了ISR集成开发环境的使用,系统调试过程中出现的问题及解决方法。 据观察,普通的玩具小车一般需要在外加条件下才能按照自己的的设想轨迹去行驶,而目前可借助嵌入式技术让小车无需外加条件便可完成智能化。在小车行驶之前所需作的准备工作是在地面上布好黑线轨迹,设计好的小车便可按此黑线行驶,即为智能小车。其设计流程如下: 1、电机模块 采用由达林顿管组成的H型PWM电路。PWM电路由四个大功率晶体管组成,H桥电路构成,四个晶体管分为两组,交替导通和截止,用单片机控制达林顿管使之工作在开关状态,根据调整输入控制脉冲的占空比,精确调整电机转速。这种电路由于管子工作只在饱和和截止状态下,效率非常没。H型电路使实现转速和方向的控制简单化,且电子开关的速度很快,稳定性也极强,是一种广泛采用的PWM调整技术。 具体电路如下图所示。本电路采用的是基于PWM原理的H型驱动电路。该电路采用TIP132大功率达林顿管,以保证电动机启动瞬间的8安培电流要求。

2、传感器模块 灰度测量模块,是一种能够区分出不同颜色的的电子部件。灰度测量模块是专为机器人设计的灰度传感器。例如:沿着黑色轨迹线行走,不偏离黑色轨迹线;沿着桌面边沿行走,不掉到地上,等等。足球比赛时,识别场地中灰度不同的地面,以便于进行定位。不同的物体对红外线的反射率不同,黑色最低,白色最高;它通过发射红外线并测量红外线被反射的强度来输出反映物体颜色的电压信号,有效距离3-30毫米。 其技术规格如下: 已知灰度传感器的输出电压为0-3.3V,所以可通过ARM615开发板上的ADC 模块转换成数字信号,最后通过不断测试得出黑线与白线的大概参数值,完成对小车传感器部分的设计。 在本次设计中选择二个灰度传感器,其实现效果与布局如下所示。

智能车控制算法

智能车转角与速度控制算法 1.检测黑线中点Center:设黑、白点两个计数数组black、white,从第一个白点开始,检测到一个白点,白点计数器就加1,检测到第一个黑点,黑点计数器就加1,并且白点计数器停止,以此类推扫描每一行;黑线中点=白点个数+(黑点的个数/2) 2.判断弯直道: 找出黑线的平均位置avg (以每10行或者20…作为参照,行数待定) 算出相对位移之和(每一行黑线中点与黑线平均位置距离的绝对值之和) 然后用Curve的大小来确定是否弯直道(Curve的阀值待定)。 3.控制速度: 根据弯度的大小控制速度大小。 //*****************************弯度检测函数*******************************// Curvecontrol () { int black[N]; //黑点计数器 int white[N]; //白点计数器 int center[N]; //黑线中点位置 int avg; //黑线中点平均位置 int curve;//N行的相对位移之和 if(白点) ++white[N]; //判断黑白点的个数 else ++black[N]; center[N]=white[N]+black[N]/2; //每一行的黑线中点avg=(center[1]+center[2]+...+center[N])/N; //求出黑线中点的平均位置 curve=(|avg-center[1]|+|avg-center[2]|+...+|avg-center[N]|)/N //求出N行的相对位移之和 return curve; //返回弯度大小

51红外循迹小车报告(舵机版)最终版

简易教程

前言 往届全国大学生电子设计竞赛曾多次出现了集光、机、电于一体的简易智能小车题目,此次,笔者在通过多次论证、比较与实验之后,制作出了简易小车的寻迹电路系统。 整个系统基于普通玩具小车的机械结构,利用小车的底盘、前后轮电机及其自动复原装置,能够平稳跟踪路面黑色轨迹运行。系统分为检测、控制、驱动三个模块。首先利用光电对接收管和路面信号进行检测,然后经过比较器处理,对软件控制模块进行实时控制,输出相应的信号给驱动芯片驱动电机转动,从而控制整个小车的运动。 智能小车能在画有黑线的白纸“路面”上行驶,这是由于黑线和白纸对光线的反射系数不同,小车可根据接收到的反射光的强弱来判断“道路”---黑线,最终实现简单的循迹运动。 个人水平有限,有错误不足之处,还望各位前辈同学多多包含,指出修正,完善。谢谢! 李学云王维 2016年7月27号

目录 前言 (1) 第一部分硬件设计 (1) 1.1 车模选择 (1) 1.2传感器选择 (1) 1.3 控制模块选择 (2) 第二部分软件设计及调试 (3) 2.1 开发环境 (3) 2.2总体框架 (3) 2.3 舵机程序设计与调试 (3) 2.3.1 程序设计 (3) 2.3.2 调试 (3) 2.3.3 程序代码 (4) 2.4 传感器调试 (5) 2.4.1 传感器好坏的检测 (5) 2.4.2 单片机能否识别信号并输出信号 (5) 2.5 综合调试 (7) 附录1 (9) 第一篇舵机(舵机及转向控制原理) (9) 1.1概述 (9) 1.2舵机的组成 (10) 1.3舵机工作原理 (11) 1.4舵机使用中应注意的事项 (12) 1.5如何利用程序实现转向 (12) 1.6舵机测试程序 (13) 附录2 (14) 第二篇光电红外传感器 (14) 2.1传感器的原理 (14) 2.2红外光电传感器ST188 结构图 (15) 2.3传感器的选择 (15) 2.4传感器的安装 (16) 2.5使用方法 (16) 2.7红外传感器输入输出调试程序 (17)

51控制舵机程序大全

#include void InitTimer0(void) { TMOD = 0x01; TH0 = 0x0B1; TL0 = 0x0E0; EA = 1; ET0 = 1; TR0 = 1; }void delay(1)(void) { unsigned char a,b,c; for(c=1;c>0;c--) for(b=142;b>0;b--) for(a=2;a>0;a--); } void main(void) { InitTimer0(); P1_2=0; while(1); } void Timer0Interrupt(void) interrupt 1 { //20ms中断 TH0 = 0x0B1; TL0 = 0x0E0; P1_2=1; delay(1); P1_2=0; }

#include #include #include #define uchar unsigned char #define uint unsigned int sbit IN1=P0^0; sbit IN2=P0^1; sbit EA1=P0^5; sbitdj=P0^7; //舵机口 uint t=0;//中断次数 ucharzk;//高电平中断次数uchar p=0;//定义pwm占空比void delay(uint z) { uinti,j; for(i=0;i>8;//100us一次中断TL0=-100%256; if(t==0)zk=p; if(t=zk) dj=0; t++; if(t>=200) t=0;//20mspwm周期 } void turn_left() { IN1=1;IN2=0;EA1=1;//电机工作p=5;//0.5ms delay(600); } void turn_right() { IN1=1;IN2=0;EA1=1;//电机工作p=25;//2.5ms delay(600);

智能小车控制基本原理

【机器人创意工作室教程一】WIFI智能小车机器人基本原理 [复制链接] liuv ikin g 管 理 员 做 中 国 人 自 己 的 W I F I 机 器 人 ! 贡献 2 4 9 电梯直达 楼主 发表于 2012-5-13 11:58:55 |只看该作者|倒序浏览 分享到:11 WIFI智能小车机器人是很多人童年时的梦想,就好比当年看着《小鬼当家》里面的那个视频遥控车一样,看着就激动! 然而对于大部分初学者而言,本身并非电子专业,也不是计算机专业,可是却对WIFI/蓝牙控制的智 能小车机器人情有独钟,怎么办呢?对于一个专业不对的人来说,确实是隔行如隔山,但是没有关系,从今天起,WIFI机器人网·机器人创意工作室不间断地推出一系列教程,手把手教你如何DIY一个属 于自己的智能小车机器人。 鉴于蓝牙智能车和WIFI智能车其实很类似的,只是把WIFI模块换成了蓝牙模块,所以蓝牙车就不再 详细阐述了,弄明白了WIFI车,蓝牙车也一样的。 OK,进入正题,机器人创意工作室教程第一讲《WIFI智能小车机器人基本原理》 我们的这款WIFI智能小车机器人采用的路由器+PC或者手机、网页控制方式。其基本原理分为4大块: 1、把普通的无线路由器通过刷入开源的Openwrt系统,使之成为一个运行了Linux系统的小电脑,何 为Openwrt? 请看: 什么是OpenWRT? 1. 关于 OpenWrt 当Linksys 释放 WRT54G/GS 的源码后,网上出现了很多 不同版本的 Firmware 去增强原有的功能。大多数的 Firmware 都是99%使用 Linksys的源码,只有 1%是加上去的,每一种 Firmware 都是针对特定的市场而设计,这样做有2个缺点,第一个是难以集 合各版本Firmware的长处,第二个是这版本距离 Linux 正式发行版越来越远。OpenWrt 选择了另一 条路,它从零开始,一点一点的把各软件加入去,使其接近 Linksys 版 Firmware的功能,而OpenWrt 的成功之处是它的文件系统是可写的,开发者无需在每一次修改后重新编译,令它更像一个小型的 Linux 电脑系统,也加快了开发速度。 以上解释摘自百度百科。简而言之,就是从思科的路由源码改造过来的,一个适用于某些特定芯片的 路由器的小型Linux系统,有了这个系统,我们的路由就不再是上网那么简单了,我们可以在上面安 装各种程序、驱动,以路由为平台,用户可以自由地加载USB摄像头、网卡、声卡、等等设备。 我们的WIFI板上运行着一款程序,叫做mjpg-streamer,这个程序可以把USB摄像头的视频进行编码,然后通过WIFI返回给上位机,这样,我们就可以看到来自机器人的视频了。 同时路由一般都预留有TTL串口,TTL串口是用来调试或者刷机用的,我们把这个TTL串口引出来, 然后通过安装在路由里面的Ser2net软件,就能把来自WIFI信道的指令转到串口输出,而串口在这里 的作用就是与单片机芯片MCU通信,让单片机知道用户要让他做什么动作。关于TTL的介绍,请看后 文。 WIFI(路由)模块:

飞思卡尔--智能车舵机讲解

飞思卡尔--智能车舵机讲解

2.2 舵机的安装 完成了玩具车的拆卸之后要做的第二步就是安装舵机,现在市场上卖的玩具车虽然也具有转向 功能,但是前轮的转向多是依靠直流电机来驱动,无论向哪个方向转都是一下打到底,无法控制转 过固定的角度,因此根据我们的设计需求,需要将原有的转向部分替换成现有的舵机,以实现固定 转角的转向。舵机的实物图如图 2.1所示。 需要说明的是由于小车系玩具车改装,在安装舵机是需要合理的利用小车的结构,将舵机安装 牢固,同时还需注意合理利用购买舵机是附赠的齿轮,从而将舵机固定在合适的位置。舵机的安装 方式有俯式、卧式多种,不同的安装方法力臂长短、响应速度都有所不同,这一点请自己根据实际 情况合理选择,图 2.2 为舵机的安装图。 5

图 2.1 舵机实物图图 2.2 舵机安装图 舵机安装过程中有一点需要尤其注意,由于舵机不是360°可转的,因此必须保证车轮左右转 的极限在舵机的转角范围之内。 舵机安装完毕之后就可以对小车的转角进行控制了,但是由于玩具车的车体设计往往限制了小 车的转角,因此可以对小车进行局部的“破坏”来增大前轮的转角,要知道在比赛中追求速度的同 时一个大的转角对小车的可控性会有一个很大的提升,如图2.3 所示,就是对增加小车转角的一个 改造,这是我在去年小车比赛中的用法。将阻碍前轮转角的一部分用烙铁直接烫掉。 但是这种做法也有风险,由于你的改造会破坏小车的整体 7

结构,有可能会对小车的硬件结构造 成破坏,因此如果你的小车在改造之后显得过于脆弱的话那你就要对你的小车采取些加固措施了。 3.4 舵机转向模块设计 舵机是小车转向的控制机构,具有体积小、力矩大、外部机械设计简单、稳定性高等特 点,无论是在硬件还是软件舵机设计是小车控制部分的重要组成部分,舵机的主要工作流程 为:控制信号→控制电路板→电机转动→齿轮组减速→舵盘转动→位置反馈电位计→控制电路板反馈。图 3.11 为舵机的实物图。 7

单片机按键控制舵机转动

忆飞工作室 https://www.360docs.net/doc/8818601933.html, 忆飞电子淘宝店欢迎进入 设计者:曾传辉 时间2012年8月13号 手机:134******** QQ:36439133 旺旺:epiapl_cn 程序名称:按键控制舵机控制 程序效果:单片机两个按键控制左右转,转角90度单片 #include #define Sevro_moto_pwm P1_0 //接舵机信号端输入PWM信号调节速度 #define k1 P2_5 //按键控制舵机左转 #define k2 P2_6 //按键控制舵机右转 unsigned char pwm_val_left = 0;//变量定义 unsigned char push_val_left;// =14;//舵机归中,产生约,1.5MS 信号 unsigned int timer=0; //延时基准变量 unsigned char timer1=0; //扫描时间变量 void pwm_Servomoto(void); //函数申明 unsigned int val,val2,fl1,fl2; //变量申明 /************************************************************************/ void delay(unsigned int k) //延时函数 { unsigned int x,y; for(x=0;x

飞思卡尔 智能车舵机控制

智能车的制作中,看经验来说,舵机的控制是个关键.相比驱动电机的调速,舵机的控制对于智能车的整体速度来说要重要的多. PID算法是个经典的算法,一定要将舵机的PID调好,这样来说即使不进行驱动电机的调速(匀速),也能跑出一个很好的成绩. 机械方面: 从我们的测试上来看,舵机的力矩比较大,完全足以驱动前轮的转向.因此舵机的相应速度就成了关键.怎么增加舵机的响应速度呢?更改舵机的电路?不行,组委会不允许.一个非常有效的办法是更改舵机连接件的长度.我们来看看示意图: 从上图我们能看到,当舵机转动时,左右轮子就发生偏转.很明显,连接件长度增加,就会使舵机转动更小的转角而达到同样的效果.舵机的特点是转动一定的角度需要一定的时间.不如说(只是比喻,没有数据),舵机转动10度需要2ms,那么要使轮子转动同样的角度,增长连接件后就只需要转动5度,那么时间是1ms,就能反应更快了.据经验,这个舵机的连接件还有必要修改.大约增长0.5倍~2倍. 在今年中,有人使用了两个舵机分别控制两个轮子.想法很好.但今年不允许使用了.

接下来就是软件上面的问题了. 这里的软件问题不单单是软件上的问题,因为我们要牵涉到传感器的布局问题.其实,没有人说自己的传感器布局是最好的,但是肯定有最适合你的算法的.比如说,常规的传感器布局是如下图: 这里好像说到了传感器,我们只是略微的一提.上图只是个示意图,意思就是在中心的地方传感器比较的密集,在两边的地方传感器比较的稀疏.这样做是有好处的,大家看车辆在行驶到转弯处的情况: 相信看到这里,大家应该是一目了然了,在转弯的时候,车是偏离跑道的,所以两边比较稀疏还是比较科学的,关于这个,我们将在传感器中在仔细讨论。 在说到接下来的舵机的控制问题,方法比较的多,有人是根据传感器的状态,运用查表法差出舵机应该的转角,这个做法简单,而且具有较好的滤波"效果",能够将错误的传感器状态滤掉;还有人根据计算出来的传感器的中心点(比

舵机控制C程序

舵机控制C程序 #include #defineucharunsignedchar #defineuintunsignedint /* 变量定义 */ ucharkey_stime_counter,hight_votage=15,timeT_counter; bitkey_stime_ok; /* 引脚定义 */ sbitcontrol_signal=P0^0; sbitturn_left=P3^4; sbitturn_right=P3^5; /***************************************************************** 名称:定时器0初始化 功能:20ms定时,11.0592M晶振 初值20ms 初值0.1ms *****************************************************************/ voidTimerInit() { control_signal=0; TMOD=0x01;//设置定时器0为工作方式1 EA=1;//开总中断 ET0=1;//定时器0中断允许 TH0=0xFF;//定时器装初值 TL0=0xA3; TR0=1;//启动定时器0 } /********************************************** 定时器0中断服务函数 ***********************************************/ voidtimer0(void)interrupt1using0 { TH0=0xFF; TL0=0xA3;//定时器0重新装入数值

智能小车蓝牙控制技术设计方案

智能小车蓝牙控制技术设计方案 手机遥控智能小车设计技术设计方案

文档修订记录

一、项目名称 《基于32F407的手机遥控智能小车的设计》 二、设计要求及性能指标 设计一个基于32F407的手机遥控智能小车,选用32F407作为主控芯片进行设计和实现。具体任务包括项目的可行性分析,硬件电路的设计,系统软件设计,仿真调试,实际测试等。 具体要求如下: (1)根据提供的原理图和相关资料,了解、掌握小车运行的工作原理,熟悉所用到的硬件模块工作原理 (2)学习掌握32F407库函数编程环境,掌握相关的库函数 (3)编写32F407程序,应用电机驱动模块、蓝牙模块和语音模块,实现小车根据接收到的指令(手机发出)完成相应的动作,并通过语音模块告知指令内容 三、项目总体方案设计 1、系统总体方案 根据课程设计的要求,系统设计方案如下:以32F407作为微控制器,以电机驱动电路和两个直流减速电机构成电机驱动模块;语音模块作为语音控制电路、以在特定的操作下产生相应的语音;以蓝牙模块和手机蓝牙相连接,以接收手机相应的指令;以7805稳压管构成电源电路。手机遥控智能小车系统结构框图如图1所示。

图1 手机遥控智能小车系统结构框图 手机遥控小车就是通过手机蓝牙和智能小车无线连接,通过蓝牙发送指令,小车接送到指令后,就会按照预先设定的程序,执行相应的操作,并由语音模块发出一系列相应的语音。为了实现这一目的,就需要有信息处理功能的微处理器来接收手机蓝牙发送的相应指令,然后将处理的指令发送到执行机构来执行,这就需要电机驱动模块,来实现小车的行走功能,而一个完整的系统,还需要有电源模块来提供能量。 系统的基本原理:预先在单片机内编程,使得相应的指令对应控制小车相应的轮子。然后手机通过蓝牙将相应的指令发送到单片机,以控制小车的运行。 2、关键技术、设计难点及其解决方案 关键技术: 1、能做到小车和手机无线连接,控制方便。 2、需要一个中央大脑,既能接收到手机的指令,又能奖指令传送给小车。 3、小车的接收到相应的指令后,可以做出相应的运用或者操作。 难点: 1、如何选择相应的中央大脑,选好之后怎么设置指令能做到简单和准确。 2、如何选择相应的驱动电路。如何操作。 解决方案 1、选择单片机芯片作为中央控制大脑,

机器人智能小车电机选择直流电机 步进电机 舵机

常用于机器人的电机有直流电机,步进电机,伺服电机。 直流电机:用于驱动机器人的移动,加上电源后,电机将一直转动,颠倒电机的电源和地线就会改变电机的转动方向。价格便宜,适用于大多数机器人应用。 点击参见:直流电机的H桥驱动原理和驱动电路选择 步进电机:也是直流电机的一种,步进电机内部有多个线圈,同时给一个或两个线圈加电,电机将转过一定的角度,要想电机连续转动,就要依次给给个线圈加电,加电的过程就是给电机施加 脉冲电流的过程。改变脉冲的频率就改变了电机的转速,改变施加脉冲的顺序就改变了电 机的转动方向。用于机器人需要位置控制的场合,如机械臂。 点击参见:步进电机的驱动原理和驱动电路 步进电机分类和选择 伺服电机:一个连续转动的直流电机,加一个闭环反馈控制的回路,以实现精确的位置控制。舵机即是伺服电机的一种,常用于飞机模型中用于转向控制。可用于驱动机器人的腿,手臂,头部和 其他肢体。 点击参见:数码舵机的原理与故障分析 点击参见:舵机的原理与单片机的控制

电机的技术参数 1、电机的电压 电压是选择直流电机的一个重要参数,小型的趣味机器人用的直流电机一般为1.5v-6v, 在这个电压范围内电机都可以工作,电压越高,转速越高。也有采用固定电压的高质量的电 机,如12V,24V直流电机。一般情况下电机都可以在高于或低于其工作电压的情况下 运行,如12V电机,可以在8v下工作,但转速降低,输出转矩变小,电机无力。如果长 时间在高于其工作电压30%-40%的电压下工作,电机线圈会发热,可能使电机永久 损坏。 2、电机的电流 空载电流:指电机不加轮胎及其他任何负载的情况下的电流。 负载电流:指加上轮胎,和其他重物下电机工作的电流。 通常空载的电流很小,负载电流是其实际工作的电流,是选择驱动电路的依据。当电机的负 载超过了电机所能承受的最大值时,电机将停止转动,电流不再增加,这就是堵转。 3、电机的转速 指的是电机的主轴每分钟转过的转数。单位为转数/分钟(r/min),机器人需要的电机转速 一般在100-200转每分钟,甚至更低的转数,而一般的直流电机的转速在4000~7000转每 分钟,无法直接在机器人上使用,必须经过降速。可以自己设计齿轮比来降速,也可以采用 现成的减速齿轮箱。 4、转矩 就是电机能够带动多大的负载,转矩越大电机越有劲。额定转矩:电机在正常工作下能够驱动负载的大小。测量方法是在电机轴上固定一个杠杆,杠杆上挂上重物,让电机带动重物旋转。 单位为g/cm,单位厘米所能带动的重物克数越大,转矩也就越大。 文章网址: https://www.360docs.net/doc/8818601933.html,/wqb_lmkj/blog/item/41249a100292d2195aaf5394.html?timeStamp=1316176239437

智能小车速度控制程序

************************************************************************ 简单寻迹程序:接法 EN1 EN2 PWM 输入端,本程序不输入PWM ,直接使插上跳线帽,使能输出,这样 就能全速运行 接上测速模块 测速模块电源+5V GND 取自于单片机板靠近液晶调节对比度的电源输出接口把测速模块输出OUT1 OUT2 接入单片机P3。 2 P3。3 时左上电机正转左上电机接P1_0 P1_1 接IN1 IN2 当P1_0=1,P1_1=0; 驱动板子输出端(蓝色端 OUT1 OUT2 ) 子 P1_0 P1_1 接IN1 IN2 当P1_0=0,P1_1=1; 时左上电机反转 P1_0 P1_1 接IN1 IN2 当P1_0=0,P1_1=0; 时左上电机停转 时左下电机正转左下电机接P1_2 P1_3 接IN3 IN4 当P1_2=1,P1_3=0; 驱动板子输出端(蓝色端 OUT3 OUT4 ) 子 P1_2 P1_3 接IN3 IN4 当P1_2=0,P1_3=1; 时左下电机反转 P1_2 P1_3 接IN3 IN4 当P1_2=0,P1_3=0; 时左下电机停转 时右上电机正转右上电机接P1_4 P1_5 接IN5 IN6 当P1_4=1,P1_5=0; 驱动板子输出端(蓝色端 子OUT5 OUT6 )

P1_4 P1_5 接IN5 IN6 当P1_4=0,P1_5=0; 时右上电机停转 时右下电机正转右下电机接P1_6 P1_7 接IN7 IN8 当P1_6=1,P1_7=0; 驱动板子输出端(蓝色端 OUT7 OUT8 ) 子 P1_6 P1_7 接IN7 IN8 当P1_6=0,P1_7=1; 时右下电机反转 P1_6 P1_7 接IN7 IN8 当P1_6=0,P1_7=0; 时右下电机停转 P3_2 接四路寻迹模块接口第一路输出信号即中控板上面标记为OUT1 P3_3 接四路寻迹模块接口第二路输出信号即中控板上面标记为OUT2 P3_4 接四路寻迹模块接口第三路输出信号即中控板上面标记为OUT3 P3_5 接四路寻迹模块接口第四路输出信号即中控板上面标记为OUT4 四路寻迹传感器有信号(白线)为0 没有信号(黑线)为 1 四路寻迹传感器电源+5V GND 取自于单片机板靠近液晶调节对比度的电源输出接口 关于单片机电源:本店驱动模块内带LDO 稳压芯片,当电池输入6V 时时候可以输出稳定的5V 分别在针脚标+5 与GND 。这个输出电源可以作为单片机系统的供电电源。 ****************************************************************************/ #include

相关文档
最新文档