直流电机驱动变速实验

#实验目的:通过测试外接可变压电源以及直流电机驱动板(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;
#视频效果地址:

LCD液晶显示屏滚动播放实验

#实验目的:通过代码控制实现LCD液晶显示屏内容滚动播放效果。
#接线效果如图:
接线示例
#实验代码:

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

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

import time
from LCD1602 import LCD1602  ##引入LCD1602驱动类
lcd = LCD1602(0x27)      ##实例化 0x27为液晶显示器地址

##要输出的内容
listData = ["aaaaaa","bbbbbb", "ccccc", "dddddd", "eeeeee", "ffffff", "ggggggggg"]

allCount = len(listData)   ##计算数量
for i in range(0, allCount):
    line1 = listData[i]    ##第一行
    line2 = '' if i+1 > allCount-1 else listData[i+1]  ##判断第二行是否有值

    lcd.print_lcd(0, 0, line1)  ##第一行输出
    time.sleep(1)   ##第二行延迟 可去掉 然后两行同时显示
    lcd.print_lcd(0, 1, line2)  ##第二行输出
    time.sleep(1)   ##延迟1秒
    lcd.clear_lcd() ##清空屏幕
#实验效果:
1、执行代码 Python jiujiang.py;
2、可见第一行首先出现内容,然后隔一秒第二行出现内容;
3、一秒后,屏幕清空,然后第一行重复上次的第二行内容,以此类推,直到内容显示完成。
4、也可以去掉第一行和第二行之间的时间间隔,将出现同页面同时刷新的效果。

LCD液晶显示屏显示实验

#实验目的:通过实验展示LCD1602液晶显示屏+PCF8574T转接板如何通过I2C协议展示想要的文案。
#接线效果如图:
接线示例
#注:LCD1602液晶显示屏外接PCF8574T转接板来驱动,可以节省树莓派很多宝贵的IO口。
#实验代码:
执行代码
#驱动类可发送邮件至lee.chuke@foxmail.com获取

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

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

import time
from LCD1602 import LCD1602  ##引入LCD1602驱动类
lcd = LCD1602(0x27)      ##实例化 0x27为液晶显示器地址

##内容输出
lcd.print_lcd(0, 0, "Shumeijiang.com") #前两个参数分别是x轴和y轴 即0坐标点开始 第一行第一列开始
lcd.print_lcd(0, 1, "test pi!")  ##第二行第一列开始
time.sleep(2)   ##延迟2秒
lcd.print_lcd(0, 1, "by Jiujiang")  ##第二行内容切换
time.sleep(2)   ##延迟2秒
lcd.clear_lcd() ##清空屏幕
#实验效果:
1、执行代码 Python jiujiang.py;
2、可见屏幕第一行显示“Shumeijiang.com”,同时第二行显示“test pi!”;
3、持续两秒钟后,第二行切换显示“by Jiujiang”,第一行内容不变;
4、持续两秒钟后,屏幕清空。
#视频效果如下:

命令行下I2C读写操作

#实验目的:了解命令行下I2C的操作方法。
1、查看已挂在设备:

i2cdetect -y 1
(其中-y表示命令行执行 1表示/dev/i2c-1)
可见0x27地址已挂载设备
2、打印出指定设备的所有数据

i2cdump -y 1  0x27
0x00到0xff的所有值
3、读取指定设备指定寄存器地址数据

i2cget -y 1  0x27  0x10
(0x27设备地址 0x10寄存器地址)
执行效果
4、设置指定设备指定寄存器地址

i2cset -y 1  0x27  0x10 0x11
(0x27设备地址 0x10寄存器地址 0x11要设置的值)
#其他
1、安装I2C可执行命令

apt-get install i2c-tools
2、打开I2C可参考文章:http://www.shumeijiang.com/2019/12/08/基于命令行打开i2c协议支持

烟雾探测传感器实验

#实验目的:实验通过烟雾探测传感器+数模转换模块,通过检测空气情况,然后输出烟雾探测值。
#接线效果如图
接线示例
#实验代码
代码示例

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

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

import time              ##引入time库
import smbus             ##引入控制总线

address = 0x48   ##传感器地址
A0 = 0x40        ##使用的端口地址
bus = smbus.SMBus(1)   ##开启总线

try:
    while True:
        bus.write_byte(address, A0)    ##设置获取传感器哪个端口数据
        value = bus.read_byte(address)   ##读取指定端口的数据
        print ("检测值:%1.3f " %(value)) ##范围为0~255
        ##print ("检测值:%1.3f " %(value*3.3/255))  ##转换为电压输出 如果是5V需要将3.3替换为5
        time.sleep(1)    ##探测频率

except KeyboardInterrupt:
    pass
#实验效果:
1、执行程序 Python jiujiang.py;
2、可见屏幕依次打印出数值,并相对稳定输出(数字越大 烟雾越大);
3、当用酒精(安全起见)靠近传感器时,可见数值逐渐增大;
4、当将酒精移开后,数值逐渐降低;
5、由于实验温度,实验规模受限因此无法实际模拟真实烟雾场景,仅做参考;
6、由于获取的是模拟信号,因此需要自己设定一个报警值,作为触发预警的阈值。
#视频效果如下:

人体红外传感器检测触发七彩LED灯闪烁实验

#实验目的:通过人体红外传感器检测是否有人经过,从而触发继电器通电,然后触发七彩LED灯(或其他预警)闪烁预警。
#接线效果如图:
接线示例
1、继电器接线具体可参考:http://www.shumeijiang.com/2019/11/23/继电器实验/
2、人体红外传感器接线具体可参考:http://www.shumeijiang.com/2019/12/28/人体红外传感器探测实验/
#实验关键代码:
代码示例

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

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

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

ledPin = 20  ##继电器控制
detectPin = 23  ##人体红外传感器检测

GPIO.setmode(GPIO.BCM)  ##此处采用的BCM编码 因为T型扩展板也是BCM编码 方便统一
GPIO.setup(ledPin, GPIO.OUT)  ##设置继电器为输出模式
GPIO.setup(detectPin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) ##设置人体红外传感器为输入模式 并初始化拉低电平

GPIO.output(ledPin, GPIO.LOW)  ##初始化继电器为低电平

##定义七彩LED灯预警闪烁方法
def startWarning():
    GPIO.output(ledPin, GPIO.HIGH)  ##高电平闪烁
    time.sleep(8)  ##闪烁8秒
    GPIO.output(ledPin, GPIO.LOW)  ##低电平熄灭


GPIO.add_event_detect(detectPin, GPIO.RISING)   ##添加一个边沿检测事件 检测电压升高
GPIO.add_event_callback(detectPin, startWarning)  ##同时添加一个回调动作

try:
    while True:
        if GPIO.event_detected(detectPin):  ##检测是否触发事件 电压升高触发
            print "触发预警"
        else:
            pass

        time.sleep(1)  ##检测频率为1秒/次  可自定义
except KeyboardInterrupt:
    pass

GPIO.cleanup()
#实验效果:
1、执行代码 Python jiujiang.py;
2、由于初始化为低电压,所以当人体红外传感器没有检测到人体时,不会触发预警;
3、当将手触放在人体红外传感器前,传感器会触发高电平,进而触发边沿事件,再而触发回调方法,触发LED闪烁。
4、由于回调方法有几秒延迟,因此可见LED等持续闪烁,直到时间到达,程序设置为低电平,LED灯熄灭;然后进入下一个检测周期。
#视频效果如下:

GPIO之初始化高电平或低电平

#实验背景:当我们做传感器实验时,经常会有个疑虑,当传感器被触发或者被获取之前,那么程序的电压状态是高电平还是低电平呢;这块其实程序处于一个float状态,也就是悬浮可变状态,它会很容易受到其他因素的干扰,从而导致出现获取到意外的数值。因此就需要在程序开始之时,初始化对应的针脚的电压状态。

【GPIO.IN】


设置示例
可见通过:
1、GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_UP) #拉高电压
2、GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)#拉低电压

        执行代码可见,当pull_up_down=GPIO.PUD_UP时,输出高电平1;当GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)时,输出低电平0。


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

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

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

detectPin = 18

GPIO.setmode(GPIO.BCM)   ##此处采用的BCM编码 因为T型扩展板也是BCM编码 方便统一

#GPIO.setup(detectPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)  ##拉高电压
GPIO.setup(detectPin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) ##拉点电压

print GPIO.input(detectPin)

GPIO.cleanup()

【GPIO.OUT】


设置示例
可见通过:
1、GPIO.output(detectPin, GPIO.LOW) ##初始化低电平
2、GPIO.output(detectPin, GPIO.HIGH) ##初始化高电平

        执行代码可见,当GPIO.LOW时输出低电平0;当GPIO.HIGH时输出高电平1;


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

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

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

detectPin = 18

GPIO.setmode(GPIO.BCM)   ##此处采用的BCM编码 因为T型扩展板也是BCM编码 方便统一
GPIO.setup(detectPin, GPIO.OUT) ##设置为输出模式

GPIO.output(detectPin, GPIO.LOW)  ##设置默认输出低电平
#GPIO.output(detectPin, GPIO.HIGH)  ##设置默认输出高电平

print GPIO.input(detectPin)

GPIO.cleanup()