第一课:什么是树莓派
第二课:树莓派能做什么
第三课:购买您的第一个树莓派
第四课:如何安装树莓派系统
第五课:树莓派Python编程手册
第六课:树莓派Python Led实验
第七课:树莓派Python 按键实验
第八课:树莓派Python开发 PWM实验
第九课:树莓派Python开发 电机实验
视频链接
在学一个知识点的时候,特别是硬件相关的,选一个好的实验方式,是很不错的做法,如果一开始就要去控制一个大的设备(比如云台),机械手臂,智能小车,你可能早早被问题击垮了兴趣。
下面就是我们在学电机的时候,最开始应该做的实验,有两个,一个是驱动一个小风扇,另一个是驱动一个轮子。我建议都做,因为很便宜,每一个实验只需要十几块钱。两个都很好玩。
这个小标题,我都在犹豫要不要写,因为在淘宝里面一搜小风扇电机就可以了,但是我还是觉得给一个截图吧,隔行如隔山,也许有些人就是不知如何动手,但是又极其感兴趣呢?
这里说的不用程序让电机转起来,是什么意思呢?
电机其实是不分正负的,只要给它电压(电压里面的电流要足够大),就可以让它转起来,然后电压反接,就是反转。这样的话,我们一开始并不需要写程序,直接用杜邦线把树莓派的电源和地与电机的正负极接起来就可以让小风扇转起来了。
我们最终是要用程序控制的,但是当我们用上面的方法,让小风扇转起来的时候,其实我们心情是激动的。
可能,甚至在想:我也可以做一个小风扇去卖,像这样:
所以,我们有点迫不及待了,想着看能否写程序自由控制。
我们的计划是这样的:
我们不用反转(如果是做鼓风机,就要反转), 电风扇是向外吹的,鼓风机是向里吹的,哈哈哈,鼓风机也可以设计了
,没想到,连我写这篇博客都激动起来,不想睡觉,忘记了窗外,全神贯注了…
于是,我们一根线接地,另一根线用IO口控制,如果这个IO口打高电平就转动,打低电平就不转,说明我们就可以用程序控制了。(如果要加速再研究我讲PWM那篇博客,电机越来越快,就类似呼吸灯越来越亮。)
https://blog.csdn.net/qq_27320195/article/details/109026574
代码就像这样:
pi@xiajiashan:~/pi-python-blog$ cat fan1pin.py
#coding:utf-8
import RPi.GPIO as gpio
import time #导入时间模块用于延时
PIN_R = 18 #使用BCM第18脚控制正极(红线),负极(黑线)接地
gpio.setwarnings(False) #去掉警告
gpio.setmode(gpio.BCM) #设置BCM编码模式
gpio.setup(PIN_R,gpio.OUT) #设置引脚PIN_R为输出
gpio.output(PIN_R,gpio.LOW) #红线输出低
try:
while 1:
cmd = raw_input('启动电机输入s,停止请输入p,退出输入q:')
if cmd == 's':#启动
gpio.output(PIN_R,gpio.HIGH) #红线输出高
elif cmd == 'p':
gpio.output(PIN_R,gpio.LOW) #红线输出低
gpio.setup(PIN_R,gpio.IN) #设置引脚PIN_R为输入
elif cmd == 'q':
break
else:
print('请输入正确的命令....')
#捕获ctrl_c,并停止电机转动
except KeyboardInterrupt:
gpio.output(PIN_R,gpio.LOW) #红线输出低
gpio.setup(PIN_R,gpio.IN) #设置引脚PIN_R为输入
pi@xiajiashan:~/pi-python-blog$
但是,我们发现,不转(有些引脚电流比较大,也许会带动,祝你好运),听到嗡嗡响——嗡嗡响一般是因为电流不够,转不起来
为什么呢?
电机不转的原因是:树莓派的IO口输出电流太小,带不动电机。
怎么办呢,为什么我们用3.3v或者5V电源可以,用程序IO口就不行呢?
因为,我们最开始做实验直接用的是电源,电源的英文单词是什么power啊,就是强大的意思啊,同样是3.3V,电源出来的3.3v,里面的电流就很强了,但是我们IO口出来的3.3v(树莓派的IO口不能出来5V),电流就很虚弱,这个怎么理解呢?
就相当于,同样大小的两根水管,一根里面的水流很急,另一根里面的水流很缓慢。
要解决这个问题,我们需要添加一个L298N的驱动板
这个驱动板的作用就是——四两拨千斤,我们只需要给IO口一个小的电流,通过L298N就可以产生很大的电流,电流大就会带来很大的热量,芯片容易发烫,所以,我们看到板子上有一个很大的散热片,这个小版主的面积比手掌小些。
L298N的接线很好懂,首先它可以带两个电机,那么我们这里就用一个,比如你用右边这个(只用一个,左边不接),然后找一个9V或者12V的电源,你可以用一组电池拼接起来,也可以用一个可充电电池组
现象就是,当我们在键盘输入s的时候,启动小风扇,输入p的时候停止转动,速度很快,很给力,运行结果如下:
但是,我们不能实现反转(也就是不能做鼓风机),因为我们把其中一个脚接到了地,这样这个脚上的电平就一直是低,然后另一个脚给高电平就转,低电平就停,无法实现反转,怎么办呢?
要解决上面的问题,我们需要引入两个IO口来控制引脚,也就是把刚才接到地的引脚,我们用另一个IO口来控制,比如我们这样连线:
正转:
电机红色(正极)-------20 pin(BCM编码)---------高
电机黑色(负极)-------21 pin(BCM编码)---------低
反转:
电机红色(正极)-------20 pin(BCM编码)---------低
电机黑色(负极)-------21 pin(BCM编码)---------高
代码如下:
pi@xiajiashan:~/pi-python-blog$ cat fan2pin.py
#coding:utf-8
import RPi.GPIO as gpio
import time #导入时间模块用于延时
PIN_R = 20 #使用BCM第20脚控制正极(红线)
PIN_B = 21 #使用BCM第21脚控制正极(黑线)
gpio.setwarnings(False) #去掉警告
gpio.setmode(gpio.BCM) #设置BCM编码模式
gpio.setup(PIN_R,gpio.OUT) #设置引脚PIN_R为输出
gpio.setup(PIN_B,gpio.OUT) #设置引脚PIN_B为输出
try:
while 1:
cmd = raw_input('正转请输入g,反转请输入b,停止请输入p,退出输入q:')
if cmd == 'g':#正转
gpio.output(PIN_R,gpio.HIGH) #红线输出高
gpio.output(PIN_B,gpio.LOW) #黑线输出高
elif cmd == 'b': #反转
gpio.output(PIN_R,gpio.LOW) #红线输出低
gpio.output(PIN_B,gpio.HIGH) #黑线输出高
elif cmd == 'p':
gpio.output(PIN_R,gpio.HIGH) #红线输出高
gpio.output(PIN_B,gpio.HIGH) #黑线输出高
gpio.setup(PIN_R,gpio.IN) #设置引脚PIN_R为输入
gpio.setup(PIN_B,gpio.IN) #设置引脚PIN_B为输入
elif cmd == 'q':
break
else:
print('请输入正确的命令....')
#捕获ctrl_c,并停止电机转动
except KeyboardInterrupt:
gpio.output(PIN_R,gpio.HIGH) #红线输出高
gpio.output(PIN_B,gpio.HIGH) #黑线输出高
gpio.setup(PIN_R,gpio.IN) #设置引脚PIN_R为输入
gpio.setup(PIN_B,gpio.IN) #设置引脚PIN_B为输入
pi@xiajiashan:~/pi-python-blog$
小风扇的加减速是通过pwm来实现的,而在Python控制语言中,我们只能用软件pwm,C控制可以用一个引脚做硬件pwm。关于软件PWM和硬件PWM请参考C部分专栏:
https://blog.csdn.net/qq_27320195/article/details/107535749
完整代码:
pi@xiajiashan:~/pi-python-blog$ cat fan_pwm.py
#!/usr/bin/python
#coding:utf-8
import RPi.GPIO as gpio
import time
PIN_R = 4 #红线
PIN_B = 17 #黑线
gpio.setwarnings(False)#屏蔽警告
gpio.setmode(gpio.BCM)#设置引脚模式
gpio.setup(PIN_R,gpio.OUT)#设置引脚PIN_R方向输出
gpio.setup(PIN_B,gpio.OUT)#设置引脚PIN_B方向输出
PWM_R = gpio.PWM(PIN_R,500) #PIN_R设置为PWM控制
PWM_B = gpio.PWM(PIN_B,500) #PIN_B设置为PWM控制
PWM_R.start(0)
PWM_B.start(0)
try:
while 1:
cmd = raw_input('请输入ac加速/dc减速:')
if cmd == 'ac':
#加速
gpio.output(PIN_R,gpio.LOW)#
PWM_B.ChangeDutyCycle(0)#
for dc in range(0,100,5):
PWM_B.ChangeDutyCycle(dc)#
time.sleep(1)
elif cmd == 'dc':
#减速
gpio.output(PIN_R,gpio.LOW)#
PWM_B.ChangeDutyCycle(100)#
for dc in range(100,0,-5):
PWM_B.ChangeDutyCycle(dc)#
time.sleep(1)
elif cmd =='p':
gpio.output(PIN_B,gpio.HIGH)#
gpio.output(PIN_R,gpio.HIGH)#
gpio.setup(PIN_B,gpio.IN)#设置引脚PIN_R方向输入
gpio.setup(PIN_R,gpio.IN)#设置引脚PIN_B方向输入
break
#捕获ctrl+c,并停止电机转动
except KeyboardInterrupt:
gpio.output(PIN_R,gpio.HIGH)#
gpio.output(PIN_B,gpio.HIGH)#
gpio.setup(PIN_R,gpio.IN)#设置引脚PIN_R方向输入
gpio.setup(PIN_B,gpio.IN)#设置引脚PIN_B方向输入
pi@xiajiashan:~/pi-python-blog$
初学者在学习电机的时候,会被五花八门的名字搞混淆,我们接下来进行一下梳理,仅作概念上的区别。
树莓派装上了电机,就相当于人有了两条腿(一般都是跑的),那装上什么就像两只手呢?
——机械手臂
那装上什么就有了翅膀呢?
——螺旋桨
(突然想到人的手,到底是手还是翅膀,或者说是翅膀退化成手,还是手进化成翅膀?总觉得人是鸟变的,我就是一个这样思想容易走神的人…)
电机——就是用电(流)让轴转起来的一种设备
(我竟然很长时间,才让轴这个字,在我脑海里面固定一个场景出来,我觉得这个跟我小时候的生活有关,我们那里很少有板车,所以对"车轱辘"这个词也没有意境,脑神经需要我主动激发它去找看过的一些北方电影和电视剧场景,而不能变成一种潜意识的东西,脑神经不需要激发,好像就存在头皮层,眼睛看到这个词,或者耳朵听到这个词就想到什么)
总体来说:
马达是电(动)机和发动机的统称,不是很精确的说法。
所以,在我们编程领域,电机跟马达是等同的,下面是在淘宝中搜马达的结果
所以说,电机,马达就是这样的东西:
直流电机是依靠直流工作电压运行的电机,广泛应用于收录机、录像机、影碟机、电动剃须刀、电吹风、电子表、玩具等。
功耗低,省电
噪音小
速度低,力矩小
我们上面做的小风扇就是直流电机的经典应用了
交流电机的定义:
交流电机的样子和价格:
淘宝搜索舵机显示商品如下:在价格上交流电机比直流电机要贵
交流电机的工作原理:
交流电机和直流电机的原理相似,只不过是220V的交流电压,功率大,危险。
直流电机的应用行业:
船舶,飞机,工业,大型设备,加工业
步进电机的定义:
步进电机的样子和价格:
淘宝搜索步进电机显示商品如下:
步进电机工作原理:
参考博客:https://www.moons.com.cn/article/cn-techschool-stepmotor-00006-step-motor-basics
简单的脉冲信号控制
步进电机经典应用:
扫描仪(包括现在商务打印机里面的扫描仪)经常有一个动作,就是在真正扫描之前,扫描器要从滑轨一头先快速运动到另一头。其实那是系统在找位置零点。那里面用的是一个步进电机,它驱动扫描器运动。但是开始执行扫描任务时,系统并不知道那个扫描器的确切位置(因为没有反馈装置),所以它只能先驱动扫描器向滑轨另一边走。在滑轨的那个尽头,有一个触碰开关,一旦扫描器碰到它,就会产生电信号。这样系统就知道扫描器走到了尽头,这时候就确定了扫描器的位置,这样就可以开始扫描了。这个步进电机在执行完任务后会关闭(因为功耗不低),因此一旦有震动什么的,扫描器很容易移位。所以下一次步进电机上电以后,要重新执行一遍前面说的那个动作去确定扫描器的位置。
伺服电机的定义:
伺服电机的样子和价格:
淘宝搜索舵机显示商品如下:(很显然伺服电机要贵些,因为精度高)
伺服电机工作原理:
伺服系统(servomechanism)是使物体的位置、方位、状态等输出被控量能够跟随输入目标(或给定值)的任意变化的自动控制系统。伺服主要靠脉冲来定位,基本上可以这样理解,伺服电机接收到1个脉冲,就会旋转1个脉冲对应的角度,从而实现位移。
因为,伺服电机本身具备发出脉冲的功能,所以伺服电机每旋转一个角度,都会发出对应数量的脉冲,这样,和伺服电机接受的脉冲形成了呼应,或者叫闭环,如此一来,系统就会知道发了多少脉冲给伺服电机,同时又收了多少脉冲回来,这样,就能够很精确的控制电机的转动,从而实现精确的定位,可以达到0.001mm。
伺服电机典型应用:
https://www.ymgk.com/article/24539.html
这是一个数控机床的,机械臂,控制进度能够达到0.001mm。
越精密,越快的电机越复杂,我们这里只是给大家在概念上做一个归纳比较,希望对大家有帮助
有帮助就收藏吧!
现在的智能输入法带来最大的问题就是错别字,各位看到麻烦给我留言,我好即时改过来,谢谢了。
第一课:什么是树莓派
第二课:树莓派能做什么
第三课:购买您的第一个树莓派
第四课:如何安装树莓派系统
第五课:树莓派Python编程手册
第六课:树莓派Python Led实验
第七课:树莓派Python 按键实验
第八课:树莓派Python开发 PWM实验
第九课:树莓派Python开发 电机实验
视频链接