下边我们引导演员入戏。
小车甲,情节简单,我用的是STC89S52,控制小车做匀速直线运动,速度为散步的速度。Keil4 写C程序,stc_isp烧写,主要演技就是用中断产生pwm,控制电机转速。
C1是本场演出的角儿,我们得好好分析下。这个初级套件我们基本上玩耍过了,还玩儿了一些套件没有带的存货,至于红外避障,循迹之类,算法越好玩得越爽,寡人天生厌恶算法,不再演示,童鞋们有算法高手的可以尽情想了。C1携带的道具有,大按钮,舵机,超声模块,当然腿儿也就是轮子是必须的。
C1在前边跑,由于速度差,当绳子拉动了按钮,嘎嘎,按钮居然要被拉动,C1立刻停下,片刻后,回头看看主人,就是舵机后转180度,再转回头,舵机回转180度,用舵机就是好,我们的舵机是普通舵机,180度范围内精确操控,能转270度麽?不能!这基本上和狗狗的脖子差不多,不可以整圈转的,然后,继续向前跑,然后循环。。。直到按钮又被拉动。。。循环。。。
好了,下边开始拼C1的程序,基本组件我们都玩耍过了,梳理下,(小车甲向前走)C1向前走,这是电机控制部分,用相关函数控制下速度就行了,按钮接的是7口,绳子绷直拉动按钮,7号口一有电平变化即刻电机停转,2秒后,舵机转180度,2秒后,舵机原方向回转180度,2秒后,电机继续转动,C1继续向前走,(C1停下期间小车甲跟上,绳子放松)如果C1停下的时间不合适随时调整
好了,一通Aduino积木搭建。。。。
这里我们插播下啊堆诺的中断,因为我们要用,作为一款
单片机,中断是不可或缺的功能,看看啊堆诺的中断,
同样,啊堆诺的中断也是调用个函数
attachInterrupt(interrupt, func
tion, mode),参数的意义是:
interrupt:中断引脚数
function:中断发生时调用的函数,此函数必须不带参数和不返回任何值。该函数有时被称为中断服务程序。
mode:定义何时发生中断以下四个contstants预定有效值:
LOW 当引脚为低电平时,触发中断
CHANGE 当引脚电平发生改变时,触发中断
RISING 当引脚由低电平变为高电平时,触发中断
FALLING 当引脚由高电平变为低电平时,触发中断.
大多数的Arduino板有两个外部中断:0(数字引脚2)和1(数字引脚3),arduino Mega有四个外部中断:数字2(引脚21),3(20针),4(引脚19),5(引脚18)。我们的核心板子是Arduino Mega,但是只用0号中断就足够了,看看示例代码比较好理解,
//////////////////////////////////////////////////////////
///启用0号中断,数字引脚2就是D2,电平变化时触发,调用stateChange
int pbIn = 0;
volatile int state = LOW; // 定义默认输入状态
void stateChange()
{
state=!state;
//do something you want
}
void setup()
{
attachInterrupt(pbIn, stateChange, CHANGE);
}
void loop()
{
//doing something....
}
/////基本上就是这个用法,
///////////////////////////////////////////////////////
看下我们的代码,
////begin////#include
Servo servo_pin_10;
int pbIn = 0;
int flag = 0;
volatile int state = LOW; // 定义默认输入状态
void gogo()
{
analogWrite( 3 , 0 );
analogWrite(5,64);
analogWrite( 6 , 0 );
analogWrite(9,64);
delay( 2000 );
analogWrite( 3 , 0 );
analogWrite(5,149);
analogWrite( 6 , 0 );
analogWrite(9,149);
delay( 2000 );
analogWrite( 3 , 0 );
analogWrite(5,254);
analogWrite( 6 , 0 );
analogWrite(9,255);
delay( 2000 );
}
void stopstop()
{
analogWrite( 3 , 0 );
analogWrite( 5 , 0 );
analogWrite( 6 , 0 );
analogWrite( 9 , 0 );
}
void look_back()
{
servo_pin_10.write( 180 );
}
void look_ahead()
{
servo_pin_10.write( 90 );
}
void look_left()
{
servo_pin_10.write(65);
}
void look_right()
{
servo_pin_10.write(125);
}
void stateChange()
{
state=!state;
stopstop();
if(flag==0)
{
flag = 1;
}
else
{
flag=0;
}
delay(3000);
look_back();
delay(3000);
}
void setup()
{
servo_pin_10.attach(11);
attachInterrupt(pbIn, stateChange, CHANGE);
pinMode( 3 , OUTPUT );
pinMode( 5 , OUTPUT );
pinMode( 6 , OUTPUT );
pinMode( 9 , OUTPUT );
}
void loop()
{
if(flag!=1)
{
look_left();
delay(2000);
look_right();
delay(2000);
gogo();
}
}
////end////
下边主角试一下镜,成功,拉一下绳子,狗狗停下,然后回头看看,然后再走
真没有想到,试镜时,小车甲的配角居然给我耍大牌,不走直线,不但不走直线,还变速跑,还有角速度划着圈跑,眼里居然没有导演,好啊,老虎不发威当我是加菲猫啊!作为高素质的导演,我很同情演员的心理,两个电机不可能完全一样,接上电,总会有速度差,这也就是为啥需要有测速码盘这东,于是,果断咔嚓了这个演员。咱有的是资源,存货大大滴有,
搜~~噶~,欧系的斯奈,换履带轮小车乙上场,这回,小车乙,接12v
电源,履带轮的减速电机要12V,我们接上两节锂电,大约9V左右,速度会更合适些,虽然电机自带调速码盘,但是不需要用,基本上6米左右的距离内,会缓慢地走出有些许弧度的近似直线,在忍受范围内。
下边测试下这个小车乙的演员的基本素质,出问题的地方要测三遍
果然,这个小车乙素质不错,可以培养,也不用费心要51控制,基础很好,有戏。
下边正式开拍,第一场 第一幕 action,哎呀妈,出状况了,大按钮上的笔帽直接被速度差拉下来了,
道具道具,赶紧处理,于是在绳子末端,小车乙这边,加了两根橡皮筋,根据动量定理,增加力的作用时间可以减小力对物体的作用效果,加上了皮筋,力去改变了皮筋的形状,分担了按钮上的笔帽受到的拉力,不至于把笔帽从按钮上拉下来。。。
第一场 第一幕 第二次 action!OK 这次成功了。
最后来个花絮,看看这条绳子群众演员,减速电机确实厉害,绳子太长被卷进去几回,很结实的绳子谈笑间绞成数段。。。
嗯,好了,杀青了。稍微等我下,王家卫给我打电话了。。。。。童鞋们赶紧,我们不但是程序员,还是文艺青年!