mBlock & Arduino(16)控制步进电机

mBlock & Arduino(16)控制步进电机,第1张

小小云提示:教程作者 caterpillar是来自台湾的programmer(kinda),所以在一些专有名词的使用上会和我们这边使用的不太一样啦,不过作者也有标注出英文名称,大家自行转换哟(⁎⁍̴̛ᴗ⁍̴̛⁎)

步进电机这东西的学问真不少,就结论而言,控制步进电机最好的方式,就是找到与手边步进电机可以配合的程式库来使用。Arduino IDE 不是有 Stepper 程式库可以使用吗?嗯!它是可以用一些步进电机上,不过,不见得能完全发挥步进电机应有的控制能力,控制某些电机则会有些问题,正巧,我手上这颗 28BYJ-48 5V DC 就是!… XD

在 Arduino 官方网站的 Arduino – Stepper 文件中,谈到了步进电机的两个基本分类:单极步进电机(Unipolar Stepper)与双极步进电机(Bipolar Stepper)。那么就从这两个分类开始认识!

单极步进电机是提供单一方向的电流来驱动电机,例如:

在上图中,可以看到线圈各有一个共同接点,通常接电源,只要改变其他接点的电压讯号,就可以产生电流,而电流都是固定的方向,而由于有四个线圈,这样的电机被称为四相(Phase)电机。

双极步进电机的电流则是双向的,例如:

这类电机在驱动时,需要改变电流的方向来达到不同激磁的效果,而由于有两个线圈,这样的电机被称为二相电机。

电机的相数除了二向、四相之外,还有单相、三相、五相等,这是为了达到不同程度的控制,电机的控制是运用电流通过线圈会产生磁场,并与另一永久磁铁产生作用,来达到转动的效果,以四相步进电机为例:

如果做为定子的线圈激磁后,面对转子一面是 S 极,就会吸引转子的 N 极,只要依顺序对各相线圈激磁,就会产生转动效果,像上面这种一次激磁一个线圈的方式,称为一相激磁,因为每次只激磁一个线圈,电力消耗小,不过缺点是振动大、转距小。

常见的激磁方式是二相激磁,顾名思义,一次激磁两相,由于有两相用以吸引住转子,因此振动小、转距大:

也有一相、二相轮流激磁,称为一/二相激磁,顺序其实就是上面两张图的结合:

可以看出这种激磁方式,每次转动的角度为一相或二相激磁的一半,可以得到更精确的控制。

步进电机需要比较高的电压或电流驱动,在 Arduino 官方网站的 Arduino – Stepper 文件中,有 Unipolar Steppers 及 Bipolar Steppers 两个页面,介绍了如何连接出能驱动步进电机的电路,分别有可以接成两个控制脚位与四个控制脚位的方式。

其中会用到的 IC 是达灵顿阵列(Darlington Array),如先前〈mBlock & Arduino(15)认识晶体管与继电器〉谈到的,若想运用晶体管提供更大的电流来驱动电机,可以使用两个或多个晶体管的组合,达灵顿阵列中有多组达灵顿电路,以 ULN2003APG 来说,里头有七组达灵顿电路。

如果不想那么麻烦地自己接电路,那么可以依使用的步进电机来搭配现成的步进电机驱动模组:

这个步进电机驱动模组,左上四个脚位可以接到 Arduino 的数位输出脚位,下方有 +、- 两个脚位,分别接 Vcc 与 GND,右上白色插槽用来连接我手边这颗五线四相的 28BYJ-48 5V DC,上图步进电机驱动模组中的 ULN2003APG,可搭配 28BYJ-48 5V DC 这个步进电机:

28BYJ-48 5V DC 这个步进电机,其中红线是接 5V 电源,各线的连接是:

如果搭配 ULN2003,要对 28BYJ-48 5V DC 步进电机做激磁,那么 ULN2003 的输入脚位 4、3、2、1,提供电位以进行激磁的顺序为 …

一相激磁:1000-0100-0010-0001

二相激磁:1100-0110-0011-1001

一/二相激磁:1000-1100-0100-0110-0010-0011-0001-1001

如果想要体验一下步进电机转动,那么可以简单地如下实作,脚位 D8 到 D11 分别对应至澄、黄、粉、蓝,例如一相激磁:

执行程式之后,你可以见到步进电机缓慢的转动,将顺序改为 S4 到 S1,就会看到电机缓慢的逆转,这边没有设任何的工作时间延迟,这是因为 mBlock 执行速度的关系,直接使用 Arduino 积木方块,只能是这个速度了。

类似地,以下是二相激磁:

以下是一/二相激磁:

如果想更进一步试试步进电机控制,可以使用 Arduino IDE 中的 Stepper 范例,它们使用到 Arduino 的 Stepper 程式库,不过,如果你手边是 28BYJ-48 5V DC 步进电机,就要注意一下了,以 stepper_oneRevolution 范例为例:

直接执行的话,你的电机只会有一个方向的转动,无法逆转,这是因为 28BYJ-48 5V DC 的接线顺序,与 Stepper 程式库预期的不同,如果你的 28BYJ-48 5V DC 的接线顺序由澄、黄、粉、蓝分别是接至 D8 到 D11,那么有两个方式可以解决,一个方式是在 Arduino 上将 D9 与 D10 接线对调,另一个方式是在建立Stepper时,9与10对调:

再来是stepsPerRevolution必须设定为你的电机实际上一圈会有多少步,如果是 28BYJ-48 5V DC 的话,查询到的规格上写着,步进角为5625 / 64,因此这电机转一圈需要的步数是360 / (5625 / 64),也就是4096步,不过,这是一/二相激磁才会有的步数,如果你查看 Stepper 程式库原始码,会发现,它是采二相激磁的实作方式,因此,使用这个 Stepper 程式库,你实际上要设的stepsPerRevolution必须是2048步。

不过,如果你改了脚位也将stepsPerRevolution设为2048,步进电机还是不会动,这是因为 Stepper 程式库中setSpeed函式的关系:

这是以毫秒为单位来设置step_delay,如果你设为2048步,那number_of_steps就是2048,那么step_delay就会是29296875 / whatSpeed,如果whatSpeed设为60,那结果就会是048828125,然而step_delay是unsigned long,也就是实际上结果只会储存0,那么step函式中millis() - this->last_step_time >= this->step_delay该行,就会一直是成立的,也就是完全没给工作时间,这么一来电机就不会动了。

因此,如果你直接使用 Stepper 程式库,设为 2048 步之后,那么速度就不能设太高,例如以下就可以正常正反转了:

如果你会使用 Arduino 官方语言的话,改写 Stepper 应该不是难事,可以试着实作一/二相激磁,并令其能支援 28BYJ-48 5V DC 的4096步与高转速,懒的话,网路上是也有人已经实作或改写好的版本,不过,想要精确控制的话,重点还是在于,认识你的步进电机与程式库!

感谢CodeData用户: caterpillar 的贡献 著作权归作者所有

整理:宁波家电物联网云平台,中科极动云

有,引擎受损。

根据地形车的组成结构,左右转速arduino不一致将损坏地形车的引擎设备,高档低转速对传动系统的影响更大,过高的档位不能产生足够的扭矩驱动车轮转动,引擎摩擦严重。

全地形车的英文是AllTerrainVehicle(适合所有地形的交通工具),缩写是ATV,是指可以在任何地形上行驶的车辆,在普通车辆难以机动的地形上行走自如,在中国俗称沙滩车,又称“全地形四轮越野机车”。

Arduino小车不需要输入代码就能转动,首先你可以使用有线控制小车,可以选择一把遥控器,这样你只需要把遥控器与电路板相连,即可轻松 *** 控小车的转向。另外,你也可以选择使用Wi-Fi、蓝牙、或者其他移动通信控制方式,可以使用手机、电脑或者遥控器等来控制小车的行走方向。只要你懂得一点程序控制,那么你就可以轻松实现控制小车转向的功能。

CPU风扇调速分为电压调速和脉冲调速(PWM调速),电压调速原理非常简单就是靠改变供电电压来改变转速,供电电压降低到风扇的IC无法工作时,风扇就要停转。PWM控制原理相对复杂是将PWM信号送到风扇的IC,由IC去控制转速,并不是直接将12VPWM信

通常,电调是接在接收机油门输出通道的,接收机将遥控器所有手柄 *** 作的信号分门别类地整理解调出来,平常所说的多少通道就是说有多少路信号的输出,而油门输出通道就是对应于控制电机转速的输出通道。这一通道所输出的信号是一串脉冲信号,当脉冲信号送至电调后,由电调电路根据脉冲宽度解调出可控制电机转速的PWM信号,亦即占空比可调的信号。因此,接收机控制电机转速的步骤如下:

//任务:通过按钮控制电机启停和正反转,通过电位计调节电机转速。

int K1=5; //把K1(正转)按钮连在数字端口5

int K2=6; //把K2(反转)按钮连在数字端口6

int K3=7; //把K3(停止)按钮连在数字端口7

int potpin = 3; // 把电位计连在模拟端口3

int A=2; //数字端口2、3控制电机启停和转向

int B=3;

int PWMpin = 9; // 数字端口9输出PWM信号,控制电机转速

//初始化

void setup()

{

pinMode(K1,INPUT);//把数字端口5、6、7设置输入模式

pinMode(K2,INPUT);

pinMode(K2,INPUT);

pinMode(A,OUTPUT);//把数字端口2、3设置输入模式

pinMode(B,OUTPUT);

}

//主程序

void loop()

{

//如果按下K1(正转)按钮

if(digitalRead(K1)==LOW)

{

//电机正转

digitalWrite(A,HIGH);

digitalWrite(B,LOW);

}

//如果按下K2(反转)按钮

if(digitalRead(K2)==LOW)

{

//电机反转

digitalWrite(A,LOW);

digitalWrite(B,HIGH);

}

//如果按下K3(停止)按钮

if(digitalRead(K3)==LOW)

{

//电机停止

digitalWrite(A,LOW);

digitalWrite(B,LOW);

}

int sensorValue = analogRead(potpin); //读取电位计采样值

sensorValue = sensorValue/4; // 采样值 0-1024 转换为 0-255

analogWrite(PWMpin, sensorValue);//把处理后的转换值以PWM信号形式输出

delay(20);//延时

举一个例子吧,你想知道室内温度。最简单的方法是看一下墙上的温度计。这是人类早期的创造,简单有效。

但是这里有让人不满的地方,它是为视力健全的人设计的。那么如果想使用听力呢?抱歉它不能满足你的需求。这样我们就不满了,我们虽然不会愤怒,但是我们要去创新了。

接下来,你的设计思路出来了,要一个能感知温度的单元,好的,我们有吗?当然有,太多了,如下所示。

在这里我们不讲热敏电阻是什么,请自己进行知识补充。你就想它是你的感觉器官,类似皮肤,能区别冷热。

好的,我们接下来需要一个认知判断单元。它具有标准,知道温度的数值是怎么来的。也许你见过下面这种单元,可以识别和显示温度,在某些地方也有自己不错的应用,在这里它不是我选择讲述的工具,就一带而过了,我向它的创造者表达我的敬意。

我们回到arduino,它象所有这个级别的工具一样,都具有接收感知单元输出的能力。上一篇我们提到的UNO,有六个接口。我不禁产生了联想,难道人类的认知都是相通的吗?六个可以感知的接口,类似什么?“眼、耳、鼻、舌、身、意”,bingo,完美。

我们接下来做什么呢?接入!把感知单元的输出作为输入交个判断单元。

到这里我们讲完了数据的采集,这不是纯技术文章。我面对的是具有好奇心的你,当你面对这么一个题目,还点进来,并且还看到这里,完全能说明你有很强的探索精神。

我们过往的学习经验是在年少时被区分为文科生或理科生,还有艺术生和体育生。其实在经过了长久地探索后,你会发现局限我们自己的往往是我们自己。转型并不在于你在某个行业深不深,而是你想不想了解其他的行业。

以上就是关于mBlock & Arduino(16)控制步进电机全部的内容,包括:mBlock & Arduino(16)控制步进电机、地形车左右转速arduino不一样有影响不、arduino小车没有输代码就能转等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9331479.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存