存档11月 2021

红外感应灯实验

    家里曾经买过一种灯,放在门口门厅的位置;尤其是晚上当感应到人的时候会自动亮灯,从而方便找到物品或者电灯开关的位置;好像也叫红外感应灯;由于手里有继电器,红外感应传感器以及七彩LED灯(此处用于替代灯泡的作用),所以尝试模仿制作一个红外感应灯。
感应灯
先看自己的效果:
    从上面的动图可以看到,当手放在红外传感器的前面就会自动触发七彩LED灯点亮;此处可以理解为将灯泡点亮。
具体接线可以参考文章:
继电器部分:https://www.shumeijiang.com/2019/11/23/继电器实验;
红外传感器部分:https://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 = 18  ##继电器控制
detectPin = 17  ##人体红外传感器检测

GPIO.setmode(GPIO.BCM)  ##此处采用的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:
    print('预警结束')

GPIO.cleanup()
由上面代码可看到:
1、定义LED灯为输出模式;
2、定义人体红外传感器为输入模式,并初试化拉低电压;
3、添加边沿加测事件,由于人体红外传感器高电平触发,因此定义一个电压升高事件,RISING事件;
4、添加一个回调函数,函数定义七彩LED亮灯动作;
5、遍历检测人体红外是否触发电压升高事件,如果触发则回调七彩LED亮灯函数;
6、定义检测频率,每秒检测一次,这个可自定义。

声控亮灯实验

    生活中经常能看到声控灯,只要有声音,灯变会亮起来;然后没有声音灯又会灭掉;这篇实验将通过一个声音探测传感器加上一个双色LED灯,来尝试模拟声控灯效果;感觉还是蛮好玩;对了,实验用的树莓派zero,可以更好的封装起来。
先看效果:
从上动图可见,当手指弹出声音时,LED灯亮起,然后等待0.5s后熄灭;具体接线图下图:
接线示例
其中声音探测传感器使用可参考文章:https://www.shumeijiang.com/2019/12/28/声音探测传感器实验;
双色LED灯使用可参考文章:https://www.shumeijiang.com/2019/10/27/双色led变化实验
具体实现代码如下:

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

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

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

#声音探测
detectPin = 27

GPIO.setmode(GPIO.BCM)   ##此处采用的BCM编码
GPIO.setup(detectPin, GPIO.IN, pull_up_down=GPIO.PUD_UP) ##初始化高电平

#注册声音探测事件
GPIO.add_event_detect(detectPin, GPIO.FALLING, bouncetime=600)

ledOne = 17
ledTwo = 18
GPIO.setup(ledOne, GPIO.OUT)
GPIO.setup(ledTwo, GPIO.OUT)

try:
    while True:
        #检测是否发现声音
        status = GPIO.event_detected(detectPin)

        if status:
            print('亮灯')
            GPIO.output(ledOne, True)
            time.sleep(0.5) #亮灯持续时间
            GPIO.output(ledOne, False)
        else:
            pass

        time.sleep(0.5) #检测间隔

except KeyboardInterrupt:
    print('停止检测')

GPIO.cleanup()
保存代码为jiujiang.py,然后执行python jiujiang.py,如果发现探测不灵或者过度灵敏,可以旋转声音探测传感器灵敏度调节按钮。

旋转编码传感器实验

    旋转编码传感器是一种速度位移检测传感器;用来检测位置的变化以及位置的偏移变化量;它可以向左转动也可以向右转动,同时还可以按压进行复位这个三个动作方向。
其中传感器有五个引脚,功能分别如下:
引脚功能
CLK判断是否旋转 0是 1否
DT判断旋转方向,1变0顺时针,0变1逆时针
SW复位
+VCC,接5V
GND接GND
接线示例:
接线示例
检测原理:
(1)CLK口注册一个边缘检测事件,检测FALLING事件;
(2)当CLK事件命中时,表示旋转事件发生,这个时间检测旋转方向;
(3)检测DT引脚状态,当状态由1变0时为顺时针旋转,0变1时为逆时针旋转;
(4)检测SW引脚状态,默认为高电平,当为低电平时表示按钮按下,表示计数复位;
代码示例

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

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

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

clkPin = 17
dtPin = 18
swPin = 27

GPIO.setmode(GPIO.BCM)   ##此处采用的BCM编码
GPIO.setup(clkPin, GPIO.IN) ##设置为输入模式
GPIO.setup(dtPin, GPIO.IN)
GPIO.setup(swPin, GPIO.IN)

##定义变量初始值
start = False
reset = False
counter = 0

#检测旋转事件 电压下降为触发条件
GPIO.add_event_detect(clkPin, GPIO.FALLING, bouncetime=600)

try:
    while True:
        ##检测是否触发旋转动作
        clkStatus = GPIO.event_detected(clkPin)
        dtOldStatus = GPIO.input(dtPin)
        swStatus = GPIO.input(swPin)

        #开始旋转
        if clkStatus:
            print('start')
            dtNewStatus = GPIO.input(dtPin)
            start = True

        ##动作开始
        if start:
            ##1变0 顺时针旋转
            if dtOldStatus == 1 and dtNewStatus == 0:
                counter += 1
                print('顺时针旋转')

            ##0变1 逆时针旋转
            if dtOldStatus == 0 and dtNewStatus == 1:
                counter -= 1
                print('逆时针旋转')

        ##检测是否按下 重置数值
        if swStatus == 0:
            reset = True

        #重置
        if reset:
            counter = 0

        #步进数量
        print('步数:%d'%counter)
        time.sleep(0.2)
except KeyboardInterrupt:
    print('停止检测');

GPIO.cleanup()
实验效果:

DHT11 温度湿度传感器实验

    DHT11是一款含有已校准数字信号输出的温湿度复合传感器,它可以输出当前测定的环境温度和湿度;其中温度测量范围是0~50度,湿度是20-90%RH;测量精度是温度+-2度,湿度是+-5%;接下来我们将尝试如何将这两部分信息打印出来。
接线示例:
接线示例
其中:
(1)-接GND;
(2)+接VCC,范围是3.3v~5v,此处接3.3v;
(3)out为信号线,接自定义Pin脚,此处接Pin18;
采集程序部分,采用的是github已有的程序,测试精确度还是不错;程序获取地址:

sudo git clone https://github.com/szazo/DHT11_Python.git
如果地址不可访问,文章最后有可用下载包。
代码下载后,可见example.py,文件,此处我们复制一下文件然后进行简单修改;

cp example.py jiujiang.py
修改jiujiang.py文件如下:

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

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

import RPi.GPIO as GPIO
import dht11
import time
import datetime

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)

# 设置使用的 pin 18引脚
instance = dht11.DHT11(pin=18)

try:
    while True:
        result = instance.read()
        if result.is_valid():
            print("\n");
            print("最后采集时间: " + str(datetime.datetime.now()))

            print("当前温度: %-3.1f C" % result.temperature)
            print("当前湿度: %-3.1f %%" % result.humidity)

        time.sleep(2) #测量频率 2秒/次

except KeyboardInterrupt:
    print("停止采集")
    GPIO.cleanup()
执行代码,效果如下图,测量结果如果一开始不准确,可以等待一下数据刷新的结果;
实验结果
从上图可见,测量结果温度还是很准确的,湿度有差异,但是也在合理误差范围。

树莓派摄像头实验(一)

    很久前曾入手一个红外夜视摄像头,最近倒腾出来准备试一下;尝试如何拍照然后手机查看,还有实时摄像然后手机浏览。
首先连接摄像头,推荐关机连接,防止损坏摄像头;连接效果如下:
连接效果
然后打开树莓派Camera设置,执行以下命令:(当然也可以页面设置)

sudo raspi-config
命令执行后,选择5 Interfacing Options,然后Enter键选择;
列表项
然后选择第一个Camera选项,按Enter键选择,然后选择"是",重启系统完成。
选择Camera
(一)拍照,执行如下命令

raspistill -o show.jpg -rot 0 -w 1024 -h 768 -t 5000   -v
其中raspistill是摄像头拍照命令,具体参数如下:
参数含义
-o图像输出地址,如果为”-“,将输出标准输出设备
-rot图像旋转角度,支持0、90、180、270
-w图像宽度width
-h图像高度height
-t图像拍摄延迟时间,单位毫秒
-v输出拍照详细信息
-tl间隔拍照,每多少毫秒拍摄一张
-q设置图片品质,范围0-100
命令执行后,可见当前目录产生一个show.jpg图片,为了查看图片内容,我们可以参考上次文章,https://www.shumeijiang.com/2021/10/30/手机连接树莓派实验/;
(1)手机ssh登录树莓派;
(2)进入相片所在目录;
(3)点击图片下载,然后在下载目录点击图片查看;
(4)效果如下图;
手机查看效果
(二)实时摄像,执行raspivid命令,此命令是树莓派摄像命令;

raspivid -o - -t 0 -w 640 -h 360 -fps 25|cvlc -vvv stream:///dev/stdin --sout '#standard{access=http,mux=ts,dst=:8989}' :demux=h264
注意:如果执行上面命令报错cvlc命令没有找到,则需要执行sudo apt install vlc安装即可。
其中dst是输出端口,具体的参数含义可以网上查询;执行后,数据流产生了,但是我们没有存储,这个时候就需要一个能实时查看图像流的软件,可以用VLC、KMPlayer;此处我们用KMPlayer,效果如下图;(App Store下载)
浏览效果
    输入树莓派的静态IP加上命令启动时的端口号,然后点击打开,可以看到摄像头的实时视频,不过测试时发现有些延迟严重,下篇文章就实验PiCamera。

树莓派尝试web.py

    web.py是Python的web框架,它简单而且功能强大。它安装后启动服务,然后通过url和端口访问服务内容;下面将简单尝试一下,更多的内容可以参考官网内容:https://webpy.org/docs/0.3/
首先安装服务,可以采用pip安装,这边用的是Python3版本;

pip3 install web.py
模块安装后,启动服务,首先新建jiujiang.py,然后录入如下代码;

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

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

#模块引入
import web

#路由规则定义
urls = (
    '/index/(.*)', 'index',
    '/jiujiang/(.*)', 'jiujiang'
)
app = web.application(urls, globals())

class index:
    def GET(self, name):
        if not name:
            name = 'World'
        return 'Hello, ' + name + '!'
#定义处理类
class jiujiang:
    def GET(self, data):
        return 'jiujiang test '+ data

#服务启动
if __name__ == "__main__":
    app.run()
文件保存后,执行命令,启动服务;其中2323是自定义端口,不写默认为8080;

python3 jiujiang.py  2323
服务启动后,我们可以用同局域网的电脑和手机访问;http://192.168.0.118:2323/jiujiang/webpy
浏览器访问效果
手机访问效果
接口访问后,可以看到服务端访问日志如下图:
访问日志
 其他操作或者效果可以参考网上其他讲解。

陀螺仪模块实验-获取欧拉角

    在三维空间中,我们定义分别在三个方向存在X轴,Y轴以及X轴,当物体转动时,欧拉角用来表示围绕三个轴转动的三个角度;可以用矩阵来表示;这篇文章将实验mpu6050陀螺仪如何获取欧拉角。
    其中围绕X轴旋转定义为Pitch(俯仰角);围绕Y轴旋转定义为Yaw(偏航角);围绕Z轴旋转定义为Roll(翻滚角)。
    首先建立空间坐标系,根据右手坐标系法则,右手手心面向我们,然后食指向上,中指指向我们,这时候,大拇指指向为X轴,食指指向Y轴,中指指向Z轴;如下图:
图来自网络
借用网络图片可看到三个角度运动方向:
自制一个飞机小模型,分别展示三个动作如下:
俯仰
翻滚
偏航
下面将实验mpu6050陀螺仪传感器,分别执行俯仰,翻滚,偏航动作,然后获取对应的角度。
获取陀螺仪数据,我们使用现成的模块,安装需要执行以下命令:

pip install mpu6050-raspberrypi
其他安装可参考文章:https://www.shumeijiang.com/2021/10/23/陀螺仪模块实验-准备/
实验过程:
    上面动图可见,先执行左右翻滚,可见roll数值在变化;执行前后俯仰时,pitch数值在变化;执行左右偏航时,yaw数值变化。
程序部分可参考文章: https://blog.csdn.net/weixin_38956024/article/details/94898531
算法部分参考:https://blog.csdn.net/weixin_38956024/article/details/94757023