分类目录试试传感器

ps2摇杆控制可视化小车(一)

前段时间实验了ps2摇杆控制多舵机实验;今天尝试将ps2摇杆数据转换为四驱小车的方向控制。实验将分两部分,第一部分将叙述整个流程的概要;第二部分将具体去实现。

其中用到的知识点:
1、四驱小车驱动封装参考:https://www.shumeijiang.com/2021/09/23/四驱小车循迹实验-直流电机驱动封装;
2、PCF8591数模转换参考:https://www.shumeijiang.com/2022/10/30/pcf8591-da数模转换实验.html;
3、树莓派间socket通信参考:https://www.shumeijiang.com/2021/10/18/树莓派间通信-socket通信.html;
4、ps2摇杆数据获取参考:https://www.shumeijiang.com/2022/12/07/ps2摇杆传感器实验.html;
5、摄像头数据流参考:https://www.shumeijiang.com/2021/11/14/树莓派摄像头实验(一).html。
实验思路:
1、用到两个树莓派,一个树莓派负责获取摇杆数据;另一个树莓派负责接收指令然后驱动小车行驶;
2、第一个树莓派获取到摇杆数据后,将数据发送给PCF8591数模转换板,转换为数字信号;3、第一个树莓派然将数字信号转换为对应的方向控制,然后通过socket通信将命令发给第二个树莓派;
4、负责执行的树莓派,接收到通信数据后,驱动小车执行对应的命令。
组装示例:
第二篇文章将具体实现如何控制小车行驶起来。

ps2摇杆传感器实验

实验目的:通过实验获取摇杆传感器对应的方向以及数值。从而为摇杆应用提供支持。
传感器示例
    因为摇杆获取的是模拟信号,我们需要将模拟信号转换为数字信号;因此传感器需要配合PCF8591数模转换模块使用。
接线示例:
引脚连接引脚
摇杆GND树莓派GND
摇杆+5V树莓派5V
摇杆VRXPCF8591的AIN0
摇杆VRYPCF8591的AIN1
摇杆SWPCF8591的AIN2

代码示例:


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

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

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

address = 0x48    ##传感器地址
xAddress = 0x40   ##x轴使用的地址 对应的AIN0
yAddress = 0x41   ##y轴使用的地址 对应的AIN1
zAddress = 0x42   ##z轴使用的地址 对应的AIN2

bus = smbus.SMBus(1)   ##开启总线

##定义监测方法
def getStatus(n):
    if not n: return
    global address

    map = {'x':xAddress, 'y':yAddress, 'z':zAddress}
    if n not in map.keys():
        return False

    #发送一个控制字节到设备 表示要读取n通道的数据
    bus.write_byte(address, map[n])

    #空读一次 消费掉无效数据(重要)
    bus.read_byte(address)

    #返回某通道输入的模拟值A/D转换后的数字值
    return bus.read_byte(address)

##获取方位信息
def getDirection(n):
    if not n: return
    num = getStatus(n)
    num = int(num)

    mess = ''
    if n == 'x':
        if num > 150: mess = 'backward'
        if num < 125: mess = 'forward'

    if n == 'y':
        if num > 150: mess = 'left'
        if num < 125: mess = 'right'

    if n == 'z':
        if num == 0: mess = 'pressed'

    return mess
其中PCF8591数模转换模块参考:https://www.shumeijiang.com/2022/10/30/pcf8591-da数模转换实验.html

PCF8591 DA数模转换实验

实验目的:实验采用PCF8591数模转换板,实现数字信号(Digital signal)到模拟信号(Analog signal)以及模拟信号到数字信号之间的转换。其中数字信号可以理解为”有无“(高电平或低电平),模拟信号则可以理解为”多少“(可以显示信号量多少)。
#传感器如图:
各引脚说明:
引脚含义接线
SDAI2C通信接口接树莓派SDA
SCLI2C通信接口接树莓派SCL
GND接地接口接树莓派GND
VCC电源接口(3.3V~5V)接树莓派5V(重要)
AOUTDA(数模)输出接口,输出模拟信号
AIN0模拟输入接口0
AIN1模拟输入接口1
AIN2模拟输入接口2
AIN3模拟输入接口3
此处用ps2摇杆传感器测试:
1、GND接树莓派GND;
2、+5V接树莓派5V;
3、VRX接PCF8591的AIN0;
4、VRY接PCF8591的AIN1;
5、SW接PCF8591的AIN3。
实验代码:

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

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

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

address = 0x48    ##传感器地址
xAddress = 0x40   ##x轴使用的地址 对应的AIN0
yAddress = 0x41   ##y轴使用的地址 对应的AIN1
zAddress = 0x42   ##z轴使用的地址 对应的AIN2

bus = smbus.SMBus(1)   ##开启总线

##定义监测方法
def getStatus(n):
    if not n: return
    global address

    map = {'x':xAddress, 'y':yAddress, 'z':zAddress}
    if n not in map.keys():
        return False

    #发送一个控制字节到设备 表示要读取n通道的数据
    bus.write_byte(address, map[n])

    #空读一次 消费掉无效数据(重要)
    bus.read_byte(address)

    #返回某通道输入的模拟值A/D转换后的数字值
    return bus.read_byte(address)

#获取数值
try:
    while True:
        xN = getStatus('x') #获取x轴
        yN = getStatus('y') #获取y轴
        zN = getStatus('z') #获取z轴

        print('x num is', xN)
        print('y num is', yN)
        print('z num is', zN)
        print("\n")

        time.sleep(0.3)

except KeyboardInterrupt:
    print('stop')
执行Python3 jiujiang.py
执行效果:
注意:其中PCF8591模块是8位的数模转换芯片,所以其输出的数字量是2的8次方也就是256种;也就是0到255区间范围。然后这个区间将5V电压平均分为255份。
实验前,需要先打开树莓派I2c协议支持。

L298N驱动板驱动实验

    以前曾用L298N改进板驱动直流电机,文章链接:https://www.shumeijiang.com/2020/05/04/直流电机驱动变速实验.html;现在尝试L298N驱动板如何接线以及如何使用。
驱动板注解
    其中改进型和这个板子的明显区别在于,改进型将调速直接作用于高电平引脚输出即可;这个板子,在ENA和ENB上面作用;如果安装跳帽则表示固定速度,如果连接树莓派引脚,则可以通过PWM调速。
#接线示例
#代码示例

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

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

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

motorA1 = 17   ##定义电机A的IN1引脚
motorA2 = 18   ##定义电机A的IN2引脚
enA = 21 #引脚21接ENA,调速电机A

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

#enA决定速度
pwm = GPIO.PWM(enA, 80)
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()
#视频效果:

旋转编码传感器实验

    旋转编码传感器是一种速度位移检测传感器;用来检测位置的变化以及位置的偏移变化量;它可以向左转动也可以向右转动,同时还可以按压进行复位这个三个动作方向。
其中传感器有五个引脚,功能分别如下:
引脚功能
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。

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

    在三维空间中,我们定义分别在三个方向存在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