分类目录试试传感器

OLED显示屏驱动显示实验

    前面文章曾经做过LCD液晶显示屏的实验,文章地址:
(https://www.shumeijiang.com/2020/04/18/lcd液晶显示屏滚动播放实验/),实验使用的是LCD1602液晶显示屏;本篇文章使用的是12832OLED显示屏,驱动显示样例数据以及自定义文字数据。
#接线示例
接线示例
   显示屏使用的I2C协议通信,由于树莓派默认是关闭的因此需要打开,相关的设置可以参考以前的文章;
1、https://www.shumeijiang.com/2019/12/08/基于命令行打开i2c协议支持/;
2、https://www.shumeijiang.com/2020/04/14/命令行下i2c读写操作/
杜邦线接好后,执行命令:

i2cdetect  -y 1
命令执行后,当出现地址0x3c表示连接成功,并读取到模块地址;
    连接成功后,我们将实验驱动显示文字或者图形图像效果;由于Python已经有了很多成熟的驱动库,因此我们将采用已有的库实验驱动;代码仓库地址:https://github.com/adafruit/Adafruit_Python_SSD1306.git。
代码下载可以通过下面的命令:

git clone https://github.com/adafruit/Adafruit_Python_SSD1306.git
其中git是代码仓库管理工具,如果执行命令没有git,则需要执行安装命令:

apt-get install git
代码下载后,可以得到如下目录结构:
目录结构
然后进入目录,执行安装程序:

sudo python  setup.py install
其中examples目录里面是几个例子,可以直接执行就可以看到效果,如下图:

python shapes.py
其中文字显示部分我们可以参考上面的例子的部分:

# Write two lines of text.
draw.text((x, top),    'Hello',  font=font, fill=255)
draw.text((x, top+20), 'World!', font=font, fill=255)
通过修改上面两行代码,我们可以自定义显示内容,如下效果:

陀螺仪模块实验-准备

    MPU6050是一款陀螺仪,它集成了3轴角速度计、3轴加速度计以及温度测量等功能;具体介绍可以网上搜索,本篇文章将介绍它如何接线以及如何通过树莓派读取数据。
    其中陀螺仪的原理是,一个旋转物体的旋转轴所指向的方向在不受外力影响时,是不会改变的;人们利用这个原理,用它来保持方向。通过I2C通信,读取轴指向的方向,将信号传送给树莓派处理。这个跟骑自行有相似之处,骑车骑的越快,车子越会沿着前进方向而不容易倾倒,因为车子有一种保持水平的力量。
    加速度是当物体在加速过程中作用在物体上的力,比如当汽车加速前进时,就有一种加速度的力,可以理解为正值;当汽车刹车时,就有一种相反方向的加速度,可以理解为负值;加速度传感器就是测量加速度的电子设备,多数加速度传感器是根据压电效应的原理在工作。
接线示例
    其中I2C协议默认是关闭的,需要手工打开,可参考文章:https://www.shumeijiang.com/2019/12/08/基于命令行打开i2c协议支持/。
    还有 I2C操作可参考文章:https://www.shumeijiang.com/2020/04/14/命令行下i2c读写操作/
    接线接好后,执行命令,可见陀螺仪模块地址:
地址为0x68
   下篇文章将介绍如何获取数据。

振动马达电机模块实验

    振动马达电机模块,可以实现手机或者游戏手柄的振动手感效果;它是在主板上增加了一个直流有刷电机,电机上内置一个偏心轮,当马达高速转动时由于圆心点不在中心的原因,所以出现振动效果。
接线示例:
接线示例
#触发原理:高电平触发振动,低电平停止振动。
#模块参数:
1、工作电压:+3.3V/+5v
2、尺寸大小:30mm x 25mm
3、振动马达:直径10mm, 高2.7mm
4、重量大小:3g
5、信号类型:数字信号
6、额定转速:最小9000转每分
7、额定电流:最大60毫安
8、起动电流:最大90毫安
#实验代码:

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

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

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

#信号引脚
detectPin = 17

GPIO.setmode(GPIO.BCM)   ##此处采用的BCM编码
GPIO.setup(detectPin, GPIO.OUT) ##设置为输出模式

#先停止后振动
GPIO.output(detectPin, GPIO.LOW)
time.sleep(0.5)
GPIO.output(detectPin, GPIO.HIGH)
time.sleep(0.5)
GPIO.output(detectPin, GPIO.LOW)
time.sleep(0.5)
#再振动
GPIO.output(detectPin, GPIO.HIGH)
time.sleep(0.5)
GPIO.output(detectPin, GPIO.LOW)

GPIO.cleanup()
#实验效果:
1、代码保存到jiujiang.py文件;
2、执行代码 python jiujiang.py;
3、可见马达先振动0.5秒后停止,然后再次振动0.5秒,然后结束。

KY-032避障红外传感器实验

    最近入手了几个ky-032避障红外传感器,这个传感器不同于以前红外避障传感器,它包含了灵敏度和检测范围的调节以及EN引脚;其中EN引脚要启用需要先拿掉跳线帽。
#接线示例:
接线示例
#其中EN引脚,实验中处于启用状态;移除跳线帽后,NE555芯片定时器的引脚 4 由 22K 下拉电阻 R3 保持低电平(复位)。当高电平条件应用于 EN 引脚时,复位条件解除,555 定时器将开始振荡。由于 IR 接收器中的 AGC 很快饱和,因此 EN 引脚一次不应保持高电平(启用)超过 2 毫秒。EN 必须在短时间内变为低电平,然后再次变为高电平。由此定期关闭38kHz信号并让AGC电路放松,可使设备达到最大灵敏度。
#实验代码:

继续前进
#!/usr/bin/env python
#coding:utf-8

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

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

sensePin = 22 #检测引脚
enablePin = 23 #en引脚

GPIO.setmode(GPIO.BCM)   ##此处采用的BCM编码
GPIO.setup(sensePin, GPIO.IN) ##设置为接收模式
GPIO.setup(enablePin, GPIO.OUT) ##设置en为输出模式

try:
    while True:
        #复位条件解除 传感器开始工作
        GPIO.output(enablePin, GPIO.HIGH)
        status = GPIO.input(sensePin) ##检测传感器状态
        if status == GPIO.LOW:  ##低电平触发
            print '有障碍物!!'
        else:
            print '继续前进'

        #复位EN引脚
        GPIO.output(enablePin, GPIO.LOW)
        time.sleep(0.05)  ##检测频率

except KeyboardInterrupt:
    pass

GPIO.cleanup()
#不启用EN引脚常规检测代码:

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

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

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

sensePin = 22

GPIO.setmode(GPIO.BCM)   ##此处采用的BCM编码
GPIO.setup(sensePin, GPIO.IN, pull_up_down=GPIO.PUD_UP) ##设置为接收模式

#添加事件检测
GPIO.add_event_detect(sensePin, GPIO.FALLING, bouncetime=500)

try:
    while True:
        status = GPIO.event_detected(sensePin)
        if status == GPIO.HIGH:
            print '发现障碍物!!'
        else:
            print '继续前进'

        time.sleep(0.05)  ##检测频率

except KeyboardInterrupt:
    pass

GPIO.cleanup()
#参考文章:http://irsensor.wizecode.com/

四路红外避障传感器实验

    最近入手了一个一拖四的红外避障传感器,想用于小车的障碍物检测;以前曾写过单个的红外避障传感器的使用实验,今天来测试一下四路红外避障传感器如何使用。同时这篇文章还会使用边沿检测方法,检测传感器的状态改变事件。
#接线示例
#边沿检测部分可以参考:边沿检测函数

#实验代码:


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

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

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

pinOne = 22
pinTwo = 23
pinThree = 24
pinFour = 25

GPIO.setmode(GPIO.BCM)   ##此处采用的BCM编码 因为T型扩展板也是BCM编码 方便统一
GPIO.setup(pinOne, GPIO.IN, pull_up_down=GPIO.PUD_UP) ##设置检测引脚我输入状态 并初始化为高电平
GPIO.setup(pinTwo, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(pinThree, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(pinFour, GPIO.IN, pull_up_down=GPIO.PUD_UP)

#注册一个检测电压下降事件 检测间隔时间600毫秒(防抖时间)
GPIO.add_event_detect(pinOne, GPIO.FALLING, bouncetime=600)
GPIO.add_event_detect(pinTwo, GPIO.FALLING, bouncetime=600)
GPIO.add_event_detect(pinThree, GPIO.FALLING, bouncetime=600)
GPIO.add_event_detect(pinFour, GPIO.FALLING, bouncetime=600)

try:
    while True:
        #事件检测
        if (GPIO.event_detected(pinOne)):
            print("右边发现有人!")

        if (GPIO.event_detected(pinTwo)):
            print("上边发现有人!")

        if (GPIO.event_detected(pinThree)):
            print("左边发现有人!")

        if (GPIO.event_detected(pinFour)):
            print("下边发现有人!")

except KeyboardInterrupt:
        pass

GPIO.cleanup()
#试验效果:
1、保存代码为jiujiang.py;
2、执行代码,如果没有触发事件则屏幕无信息打印;
3、当物体或者用手遮挡任一方向的传感器;
4、可见屏幕打印出这个方向的信息,如果发现打印多次,则是因为停留时间大于间隔检测时间,可以按需调试间隔时间;
实验效果

多个PCA9685舵机驱动板一起执行实验(含地址修改)

    以前的实验我们实验过了单个pca9685驱动板,同时驱动多个舵机的实验;但是有些情况下,可能一个板子无法满足我们的驱动需求;我们知道一个板子最大可驱动16个舵机,但是如果我们想同时驱动 17个舵机,这个时候就遇到问题;本篇文章就实验一下如何解决这个问题。
    为了解决这个问题,先得解决地址冲突问题;因为板子默认地址都是0x40,那么我们无法辨别哪个是哪个板子,这个时候就需要修改板子的地址;如下图:
地址修改
 地址修改后,连接树莓派,执行如下命令:

i2cdetect -y 1
    可见下图,由于树莓派连接了两个pca9685驱动板,所以可见两个地址,分别为0x40和修改地址后的0x41;
地址修改后效果
#解决地址冲突后,接下来看一下树莓派如何同时接多块板子,见下图:
接线效果
    由上图可见,由于板子默认没有焊接尾部扩展针脚,因此需要我们先焊接针脚;然后用杜邦线连接第二个板子;电源部分两者共用即可。
 #实验代码:

#coding:utf-8

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

import time
from board import SCL, SDA
import busio

from adafruit_pca9685 import PCA9685
from adafruit_motor import servo

#引入i2c
i2c = busio.I2C(SCL, SDA)

#控制第一块板子
pca = PCA9685(i2c, address=0x40)  #地址可以修改  默认0x40
pca.frequency = 50

print("执行第一块板子")

for i in [0]:

    servo_o = servo.Servo(pca.channels[i]) #i是舵机在pca9685上的编号

    #设置脉冲宽度 500到2500是正常的 这个可以自己调整 不设置默认只到135度
    servo_o.set_pulse_width_range(min_pulse=500, max_pulse=2500)

    #先0度
    servo_o.angle = 0
    time.sleep(1)

    #再执行90度
    servo_o.angle = 90
    time.sleep(1)

    #再执行180度
    servo_o.angle = 180
    time.sleep(1)

    #再恢复90度
    servo_o.angle = 90
    time.sleep(1)

pca.deinit()

#控制第二块板子
pca = PCA9685(i2c, address=0x41)
pca.frequency = 50

print("执行第二块板子")

for i in [0, 1]:
    servo_o = servo.Servo(pca.channels[i]) #i是舵机在pca9685上的编号

    #设置脉冲宽度 500到2500是正常的 这个可以自己调整 不设置默认只到135度
    servo_o.set_pulse_width_range(min_pulse=500, max_pulse=2500)

    #先0度
    servo_o.angle = 0
    time.sleep(1)

    #再执行90度
    servo_o.angle = 90
    time.sleep(1)

    #再执行180度
    servo_o.angle = 180
    time.sleep(1)

    #再恢复90度
    servo_o.angle = 90
    time.sleep(1)

pca.deinit()
#实验效果,可见三个舵机依次转动,如下图:

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

#实验目的:实验采用树莓派+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、具体转动规则可自定义。
#视频效果如下: