【1.关于SG90舵机】
SG90舵机是Arduino中常用的一种舵机。这是一种模拟舵机,和数字舵机不同,模拟舵机需要持续发送控制脉冲,才能使舵机旋转到某个角度并保持。
Arduino中使用SG90舵机,常用方法是使用servo库。但是servo库使用了timer1定时器,和arduino产生pwm信号也使用了timer1定时器,因此使用servo库和使用pwm产生冲突。其中一个解决方法是把舵机的控制口接到一个非PWM口(如2号口),利用软件从2号口输出控制舵机的波形。
要控制SG90u舵机,需要持续不断给SG90发送周期为20ms的脉冲,单个脉冲周期中高电平的持续时间t决定了舵机的旋转角度。其中t为500微秒到2500微秒,对应着舵机旋转角度0到180度。并且高电平持续时间t和舵机旋转角度保持着线性对应关系。如2号口产生了高电平保持500微秒的脉冲,SG90舵机角度为0度,2号口产生了高电平保持2500微秒的脉冲,SG90舵机角度为180度,
【2.使用mblock产生舵机控制脉冲】
使用mblock自带的标准模块,产生控制SG90舵机的脉冲信号,如图1所示
图1
根据图1,产生了80个周期为20ms的脉冲,脉冲高电平的持续时间由angle决定。该模块产生的控制舵机旋转角度的精度不够。经过分析发现,这里使用的延时模块(等待x秒)由millis()函数产生,而millis函数的精度为ms级,因此不能产生精度为微秒级的延迟。所以导致产生的脉冲高电平持续时间不精确,进而造成控制舵机旋转角度不精确。
【3.自定义mblock模块,控制SG90舵机】
Arduino中有delayMicroseconds()函数,可以产生微秒级的延迟,但是mblock中并没有提供该函数相应的模块。决定自定义mblock扩展模块,使用delayMicroseconds()函数,产生精度为微秒级的舵机控制脉冲。
自定义的舵机控制模块一共使用了5个文件:Ext_yoyoba.s2e,demo.cpp,demo.h,myservo.c,myservo.h,内容分别如下:
ext_yoyoba.s2e文件内容:- {
- "extensionName": "Ext_yoyoba",
- "description": "Extention by YOYOBA",
- "version": "1.1",
- "author": "yoyoba(stuyou@126.com)",
- "homepage": "youhaidong.cn",
- "sort":0,
- "javascriptURL":"",
- "firmware":"1.0",
- "extensionPort":0,
- "tags" : "makeblock",
- "blockSpecs": [
- [
- "w",
- "servo_init( %n )"