存档5月 2020

四驱小车驱动实验(二)

#实验目的:在实验(一)的基础上继续探索新的动作;此次实验主要展示左转和右转以及和直行和后退的组合动作。
#接线图以及直行和后退参考文章:http://www.shumeijiang.com/2020/05/24/四驱小车驱动实验(一)/
#左转代码:原理是左前和左后电机后退,右前和右后电机前进。
左转代码示例
#右转代码:原理是左前和左后电机前进,右前和右后电机后退。
右转代码示例
#方法封装:
封装方法
#组合动作调用:
执行代码
#实验效果:
1、执行代码 Python jiujiang.py;
2、可见四个电机直行前进1秒,然后停顿0.5秒(自定义停顿);
3、然后可见左转执行0.2秒,并停顿0.5秒;
4、然后继续直行1秒,停顿0.5秒;
5、紧接着执行右转0.2秒,停顿0.5秒;
6、最后四个电机执行后退1秒;
7、其中方法第一个参数为执行秒数,第二个参数为占空比,第三个为频率。
#视频效果如下:

四驱小车驱动实验(一)

#实验目的:通过组合四个直流电机和两个电机驱动板以及编写控制代码,实现不同的直流电机集体协作,从而实现预期动作的效果;本篇文章主要实现四个电机的协同前进和后退动作。
#接线效果如图:
接线效果
#注解:实验通过一个可显示电压的降压模块,以及两个直流电机驱动板,驱动四个直流电机进行动作的执行。
其中驱动原理可参考文章:http://www.shumeijiang.com/2020/05/04/直流电机驱动变速实验/
#关键代码:
电机初始化
#如上图代码可见:
1、每个电机都需要单独实例化PWM,使用PWM的原因是我们希望通过改变占空比从而实现调节电机的转速效果。
2、其中每个电机的高低电平设置引脚都为可变变量,我们只需要通过不同的赋值,即可实现电机的前转和后转效果。
3、前进和后退赋值见下图;
赋值示例
#执行时间设置和动作停止:
动作停止以及缓冲
#如上图可见:
1、用户可指定前进或后退的执行时间,见代码time.sleep(duration)
2、其中执行时间内,可执行缓冲时间,即在执行时间的最后一段时间,降低占空比,从而实现缓慢停止的效果;当然也可以不加,执行也没有问题。
#封装前进和后退动作以及调用示例:
类前进和后退方法
#驱动类可发送邮件至lee.chuke@foxmai.com获取;
#视频效果如下:

多个舵机组合驱动实验

#实验目的:测试PCA9685驱动板同时驱动多个不同类型舵机,实现组合动作或者其他自定义动作的效果。
#接线效果如图:
接线示例
#注:S90舵机褐色接GND,红色接VCC,黄色接PWM;MG995舵机黑色接GND。
#关键代码
代码示例

#!/usr/bin/env python
#coding:utf-8

'''
from JiuJiang
树莓酱的操作实例
https:://www.shumeijiang.com
'''

from PCA9685 import PCA9685 ##引入驱动类
import time   ##引入time库

pwm = PCA9685()  ##实例化
pwm.setsq(50)    ##设置输出频率50HZ
pwm.init()       ##初始化
pwm.setallangle(0)   ##驱动所有舵机归0

#执行动作
serv = [0, 1, 2, 4 ,5]  #已连接的舵机
for i in serv:
    pwm.setangle(i, 90) #首先到90度
    time.sleep(0.4)     #停顿
    pwm.setangle(i, 0)  #执行到0度
    time.sleep(0.4)

#执行第二套动作
for i in serv:
    pwm.setangle(i, 45) #逐一到45度
    time.sleep(0.4)

for i in serv:
    pwm.setangle(i, 0)  #逐一归0
    time.sleep(0.4)

#最后动作
pwm.setallangle(90)  #所有舵机执行到90度
time.sleep(0.4)
pwm.setallangle(0)   #所有舵机归0
time.sleep(0.4)
#实验效果:
1、执行代码 Python jiujiang.py;
2、可见舵机由左向右,依次完成从0度到90度再到0度的动作;
3、完成动作2后,可见舵机依次先从0度执行到45度;当最后一个舵机执行完成后,从左边向右再依次从45度执行到0度;
4、完成动作3后,所有舵机一起从0度执行到90度,然后再一起执行到0度。
#视频效果如下:

舵机(伺服电机)驱动实验

#实验目的:实验采用树莓派+PCA9685驱动板+MG995舵机组合而成;同时封装一个驱动类,通过命令行接收输入的度数从而让舵机转到到指定位置。
#接线效果如图:
接线示例
#其中驱动板接线示例:
PCA9685
#注:舵机型号不限,只要可外接PCA9685驱动板即可。
#实验代码:
代码示例

#!/usr/bin/env python
#coding:utf-8

'''
from JiuJiang
树莓酱的操作实例
http:://www.shumeijiang.com
'''

from PCA9685 import PCA9685 ##引入驱动类
import time   ##引入time库

pwm = PCA9685()  ##实例化
pwm.setsq(50)    ##设置输出频率50HZ
pwm.init()       ##初始化
pwm.setpwm(0, 0, 4000)

angle = input("angle is:")  ##接收用户指令
pwm.setangle(4, angle)   ##驱动第四个口的舵机执行命令
#pwm.setallangle(50)     ##驱动所有舵机执行命令
#实验效果:
1、执行代码 Python jiujiang.py;
2、可见屏幕输入需要指定度数,输入指定的度数然后回车执行;
3、可见舵机快速转动到指定的位置。
#视频效果如下:

步进电机驱动实验

#实验目的:通过树莓派、ULN2003驱动板以及步进电机,实现转动指定步数,以及反向转动等效果。
#接线效果如图:
接线示例
#关键代码:
代码示例

#!/usr/bin/env python
#coding:utf-8

'''
from JiuJiang
树莓酱的操作实例
http:://www.shumeijiang.com
'''

import RPi.GPIO as GPIO ##引入GPIO模块
import time    ##引入time库

#定义四个引脚
IN1Pin = 18
IN2Pin = 19
IN3Pin = 20
IN4Pin = 21

#设置为BCM编码 同时四个引脚为输出模式
GPIO.setmode(GPIO.BCM)
GPIO.setup(IN1Pin, GPIO.OUT)
GPIO.setup(IN2Pin, GPIO.OUT)
GPIO.setup(IN3Pin, GPIO.OUT)
GPIO.setup(IN4Pin, GPIO.OUT)

#定义初始化
def setVal(val1, val2, val3, val4):
    GPIO.output(IN1Pin, val1)
    GPIO.output(IN2Pin, val2)
    GPIO.output(IN3Pin, val3)
    GPIO.output(IN4Pin, val4)

#初始化四个引脚
setVal(GPIO.LOW, GPIO.LOW, GPIO.LOW, GPIO.LOW)

#定义一步需要的操作
def oneStep(dely):
    if not dely:
        dely = 0.005
    setVal(GPIO.HIGH, GPIO.LOW, GPIO.LOW, GPIO.LOW)
    time.sleep(dely)
    setVal(GPIO.LOW, GPIO.HIGH, GPIO.LOW, GPIO.LOW)
    time.sleep(dely)
    setVal(GPIO.LOW, GPIO.LOW, GPIO.HIGH, GPIO.LOW)
    time.sleep(dely)
    setVal(GPIO.LOW, GPIO.LOW, GPIO.LOW, GPIO.HIGH)
    time.sleep(dely)

#定义一步(反向)需要的操作
def oneStepBack(dely):
    if not dely:
        dely = 0.005
    setVal(GPIO.LOW, GPIO.LOW, GPIO.LOW, GPIO.HIGH)
    time.sleep(dely)
    setVal(GPIO.LOW, GPIO.LOW, GPIO.HIGH, GPIO.LOW)
    time.sleep(dely)
    setVal(GPIO.LOW, GPIO.HIGH, GPIO.LOW, GPIO.LOW)
    time.sleep(dely)
    setVal(GPIO.HIGH, GPIO.LOW, GPIO.LOW, GPIO.LOW)
    time.sleep(dely)

#定义多步操作
def walk(steps, direction):
    if not steps:
        return ;
    if not direction:
        direction = 'forward'

    for i in range(0, steps):
        if direction == 'backward':
            oneStepBack(0.005)
        else:
            oneStep(0.005)

        time.sleep(0.01)  ##每步间的间隔

#执行步进
try:
    steps = input('前进多少步?')
    walk(steps, 'forward')  ##正向走对应步数
    walk(steps, 'backward') ##反向走对应的步数

except KeyboardInterrupt:
    pass

GPIO.cleanup()
#实验效果:
1、执行代码 Python jiujiang.py;
2、可见提示需要输入要走的步数;
3、输入100步后,可见步进电机持续转动;
4、正向转动结束后,会立即反向再转动100步,到达期初的位置;
5、具体转动规则可自定义。
#视频效果如下:

直流电机驱动变速实验

#实验目的:通过测试外接可变压电源以及直流电机驱动板(L298N)这个组合,驱动自制的风扇,在pwm的调节下,展现转动速度连续发生变化的现象。
#接线效果如图:
接线示例
#注:其中风扇造型可采用其他形式代替,只要可体现转动速度即可。
#驱动板:采用的是L298N的改进型,某宝有卖;他跟传统L298N驱动板控制pwm不同在于,它直接在对应电机的高电平引脚输出即可;单个板可同时驱动两个电机。具体接线效果如下:
#控制原理如下: 
直流电机转动形式IN1IN2IN3IN4
MOTOR-A正向(调速)高电平/PWM低电平
反向(调速)低电平高电平/PWM
停止低电平低电平
刹车高电平高电平
MOTOR-B正向(调速)高电平/PWM低电平
反向(调速)低电平高电平/PWM
停止低电平低电平
刹车高电平高电平
#实验代码:
代码示例

#!/usr/bin/env python
#coding:utf-8

'''
from JiuJiang
树莓酱的操作实例
http:://www.shumeijiang.com
'''

import RPi.GPIO as GPIO ##引入GPIO模块
import time    ##引入time库

motorA1 = 18   ##定义电机A的IN1引脚
motorA2 = 19   ##定义电机A的IN2引脚

GPIO.setmode(GPIO.BCM)  ##此处采用BCM编码
GPIO.setup(motorA1, GPIO.OUT)  ##设置引脚为输出模式
GPIO.setup(motorA2, GPIO.OUT)

pwm = GPIO.PWM(motorA1, 80)    ##引脚A1高电平为正转,所以创建一个正转pwm实例并设置频率
pwm.start(70)  ##初始化占空比 即单位时间高电平的时间占比

GPIO.output(motorA1, GPIO.HIGH) ##设置A1 引脚为高电平
GPIO.output(motorA2, GPIO.LOW)  ##设置A2 引脚为低电平 如此可控制电机A正转,反之电机A反转

##通过一定时间间隔设置占空比,可见电机间隔一定时间后会发生速度变化 其中0则电机停止转动
try:
    while True:
        pwm.ChangeDutyCycle(30)
        time.sleep(2)
        pwm.ChangeDutyCycle(70)
        time.sleep(2)
        pwm.ChangeDutyCycle(0)  ##电机停止转动
        time.sleep(2)  ##持续时间

except KeyboardInterrupt:
    pass

pwm.stop()
GPIO.cleanup()
#实验效果:
1、执行代码 Python jiujiang.py;
2、可见小风扇快速转动,然后持续2秒钟;速度增强到原来两倍;
3、速度增强转动2秒钟后,风扇停止转动;
4、停转2秒后,风扇继续往复前面一个动作。
#视频效果如下:

直流可变降压稳压模块实验

#实验目的:通过旋转降压按钮,可见自带或外接电压显示表显示电压数值变化。
#接线示例1
示例1
#接线示例2
示例2
#实验效果:
1、示例1为自带电压显示模块,示例2为不带电压显示模块;
2、示例2后添加单独电压显示表,为示例2降压模块提供电压显示;
3、通过旋转示例1或示例2的降压变压旋转钮,可见电压表电压值在变化;如果无变化,需要多旋转几圈,直到数值变化;
4、示例1的降压模块还自带一个可显示输入电压按钮,通过按压按钮可见输入电压为12V;
5、变压后电压不会高于输入电压,同时最低电压也不会为0;
#视频效果地址: