22、树莓派数字输入与传感器使用指南

树莓派数字输入与传感器使用指南

1. GPS数据处理

在树莓派上处理GPS数据时,程序会创建一个会话,然后建立一个待读取的数据流。GPS会不断输出不同格式的消息,使用 if 命令可以筛选出包含位置信息的消息。这些消息的各个部分会存储在一个字典中,方便访问和显示这些字段。

除了使用Python处理GPS数据,还可以使用 xgps 工具来显示GPS数据。操作步骤如下:
1. 打开终端。
2. 输入命令: $ xgps

需要注意的是,这个工具需要有显示设备,因此可以直接在树莓派上运行,或者通过VNC或RDP远程运行。

2. 拦截按键输入

如果想拦截USB键盘或数字小键盘上的单个按键输入,有两种方法可以实现。

2.1 使用 sys.stdin.read 函数

这是最直接的方法,其优点是不需要运行图形用户界面,因此可以通过SSH会话运行使用该方法的程序。以下是示例代码:

import sys, tty, termios

def read_ch():
    fd = sys.stdin.fileno()
    old_settings = termios.tcgetattr(fd)
    try:
        tty.setraw(sys.stdin.fileno())
        ch = sys.stdin.read(1)
    finally:
        termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
    return ch

while True:
    ch = read_ch()
    if ch == 'x':
        break
    print("key is: " + ch)

操作步骤:
1. 打开编辑器(如 nano IDLE )。
2. 粘贴上述代码。
3. 保存为 keys_sys.py
4. 在终端运行: $ python keys_sys.py

2.2 使用Pygame库

Pygame是一个用于编写游戏的Python库,也可以用于检测按键输入。不过,这个方法必须使用Python 2,因为Python 3中不包含Pygame。示例代码如下:

import pygame
import sys
from pygame.locals import *

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.mouse.set_visible(0)

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            sys.exit()
        if event.type == KEYDOWN:
            print("Code: " + str(event.key) + " Char: " + chr(event.key))

操作步骤:
1. 打开编辑器(如 nano IDLE )。
2. 粘贴上述代码。
3. 保存为 keys_pygame.py
4. 在终端运行: $ python keys_pygame.py

需要注意的是,使用 sys.stdin.read 方法时,如果按下箭头键或Shift键,程序会抛出错误,因为这些键没有ASCII值。而使用Pygame方法时,其他键有常量值定义,可以使用光标和其他非ASCII键。

3. 拦截鼠标移动

要在Python中检测鼠标移动,可以使用与使用Pygame拦截键盘事件类似的方法。示例代码如下:

import pygame
import sys
from pygame.locals import *

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.mouse.set_visible(0)

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            sys.exit()
        if event.type == MOUSEMOTION:
            print("Mouse: (%d, %d)" % event.pos)

操作步骤:
1. 打开编辑器(如 nano IDLE )。
2. 粘贴上述代码。
3. 保存为 mouse_pygame.py
4. 在终端运行: $ python mouse_pygame.py

当鼠标在Pygame窗口内移动时, MOUSEMOTION 事件会被触发,可以从事件的 pos 值中获取鼠标的坐标。此外,还可以拦截 MOUSEBUTTONDOWN MOUSEBUTTONUP 事件,用于检测鼠标左键的按下和释放。

4. 使用实时时钟模块

如果希望树莓派即使在没有网络连接的情况下也能记住时间,可以使用实时时钟(RTC)模块,常见的RTC芯片是DS1307。

4.1 所需材料
  • 一个DS1307或兼容的RTC模块
  • 母对母跳线
4.2 操作步骤
  1. 确保RTC模块是3.3V兼容的,如果是Adafruit型号,焊接时不要包含两个上拉电阻;如果是现成的模块,小心移除任何上拉电阻。
  2. 组装RTC模块(如果是套件形式),并将其连接到树莓派。
  3. 确保树莓派已设置为使用I2C接口。
  4. 使用I2C工具检查设备是否可见: $ sudo i2cdetect -y 1
    如果使用的是原始的树莓派Model B修订版1的主板,将 1 改为 0 。如果输出结果中显示 68 ,则表示RTC模块已连接到I2C总线的十六进制地址 68
  5. 运行以下命令,使RTC可以与 hwclock 程序一起使用:
$ sudo modprobe rtc-ds1307
$ sudo bash
$ echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device

同样,如果使用的是修订版1的主板,将 i2c-1 改为 i2c-0
6. 访问RTC时间: $ sudo hwclock -r
7. 设置RTC时间:
- 首先确保树莓派的时间正确,可以使用 date 命令检查。
- 如果时间错误,可以手动设置 date
- 将树莓派的系统时间传输到RTC模块: $ sudo hwclock -w
8. 配置系统在启动时从RTC设置系统时间:
- 编辑 /etc/modules 文件,添加 rtc-ds1307 到模块列表的末尾。
- 编辑 /etc/rc.local 文件,在 exit 0 行之前插入以下两行:

$ echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
$ sudo hwclock -s

同样,如果使用的是修订版1的主板,将 i2c-1 改为 i2c-0

虽然连接到互联网的树莓派会自动连接到网络时间服务器并设置自己的时钟,但在没有网络连接的情况下,硬件RTC是一个不错的选择。

5. 使用电阻式传感器

如果想将可变电阻连接到树莓派并测量其电阻,以便在Python程序中使用可变电阻旋钮的位置,可以使用以下方法。

5.1 所需材料
  • 面包板和跳线
  • 10kΩ微调电位器
  • 两个1kΩ电阻
  • 330 nF电容
5.2 操作步骤
  1. 按照电路图连接组件。
  2. 打开编辑器(如 nano IDLE ),粘贴以下代码:
import RPi.GPIO as GPIO
import time, math

C = 0.36 # uF
R1 = 1000 # Ohms
GPIO.setmode(GPIO.BCM)

# Pin a charges the capacitor through a fixed 1k resistor 
# and the pot in series
# Pin b discharges the capacitor through a fixed 1k resistor 
a_pin = 18
b_pin = 23

# Discharge the capacitor, leaving it ready to start filling up
def discharge():
    GPIO.setup(a_pin, GPIO.IN)
    GPIO.setup(b_pin, GPIO.OUT)
    GPIO.output(b_pin, False)
    time.sleep(0.1)

# Return the time taken (uS) for the voltage on the capacitor 
# to count as a digital input HIGH
# which is 1.65V or higher
def charge_time():
    GPIO.setup(b_pin, GPIO.IN)
    GPIO.setup(a_pin, GPIO.OUT)
    GPIO.output(a_pin, True)
    t1 = time.time()
    while not GPIO.input(b_pin):
        pass
    t2 = time.time()
    return (t2 - t1) * 1000000

# Take an analog reading as the time taken to charge after 
# first discharging the capacitor
def analog_read():
    discharge()
    t = charge_time()
    discharge()
    return t

# Convert the time taken to charge the cpacitor into a value of resistance
# To reduce errors, do it 100 times and take the average
def read_resistance():
    n = 10
    total = 0;
    for i in range(1, n):
        total = total + analog_read()
    t = total / float(n)
    T = t * 0.632 * 3.3
    r = (T / C) - R1
    return r

try:
    while True:
        print(read_resistance())
        time.sleep(0.5)
finally:
    GPIO.cleanup()
  1. 保存为 pot_step.py
  2. 在终端运行: $ sudo python pot_step.py

运行程序后,旋转微调电位器的旋钮,输出的电阻值会发生变化。这种方法基于阶跃响应技术,通过测量电容充电到高电平所需的时间来估算可变电阻的阻值。虽然这种方法不是非常准确,但成本低且易于使用。

6. 测量光照强度

如果想使用树莓派和光敏电阻测量光照强度,可以使用与使用电阻式传感器相同的基本方法,但将微调电位器替换为光敏电阻。

6.1 所需材料
  • 面包板和跳线
  • 光敏电阻
  • 两个1kΩ电阻
  • 330 nF电容
6.2 操作步骤
  1. 按照电路图连接组件。
  2. 使用与测量电阻相同的程序 pot_step.py ,当用手遮挡光敏电阻时,输出会发生变化。
  3. 由于光敏电阻的阻值不会降至零,可以简化电路,去掉两个1kΩ电阻和一个GPIO引脚。以下是简化后的代码:
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
pin = 18

def discharge():
    GPIO.setup(pin, GPIO.OUT)
    GPIO.output(pin, False)
    time.sleep(0.1)

# Return the time taken for the capacitor to go HIGH
# which is 1.65V or higher
def charge_time():
    t1 = time.time()
    GPIO.setup(pin, GPIO.IN)
    while not GPIO.input(pin):
        # charge for 1ms
        GPIO.setup(pin, GPIO.OUT)
  1. 保存为 photoresistor_step.py ,并在终端运行。

这种方法可以提供相对可靠的光照强度读数,并且可以避免损坏树莓派的GPIO引脚。

树莓派数字输入与传感器使用指南

7. 传感器测量原理分析
7.1 电阻式传感器测量原理

电阻式传感器测量电阻的原理基于阶跃响应技术。下面通过一个流程图来详细说明其测量过程:

graph TD
    A[开始] --> B[放电]
    B --> C[充电计时]
    C --> D[再次放电]
    D --> E[多次测量取平均]
    E --> F[计算电阻值]
    F --> G[输出结果]
    G --> H{是否继续}
    H -- 是 --> B
    H -- 否 --> I[结束]

具体来说,电容就像一个“电坦克”,当它充电时,两端电压会升高。由于树莓派没有模拟到数字转换器(ADC),无法直接测量电压,但可以通过计时电容充电到高电平(约1.65V)所需的时间来间接测量。充电速度取决于可变电阻(Rt)的值,电阻越低,电容充电越快,电压上升也越快。

为了获得准确的读数,每次测量前都要先将电容放电。在电路图中,连接A用于通过Rc和Rt对电容充电,连接B用于通过Rd对电容放电。Rc和Rd的作用是防止在电容充放电过程中,过大的电流损坏树莓派相对脆弱的GPIO引脚。

7.2 光照强度测量原理

光照强度测量是电阻式传感器测量的一种应用。光敏电阻的阻值会随着光照强度的变化而变化,光照越强,阻值越低。当使用与电阻式传感器相同的测量方法时,通过测量电容充电时间的变化,就可以反映出光照强度的变化。简化后的光照传感器电路,使用同一个GPIO引脚来完成电容的充放电和检测是否达到高电平阈值,这种方式更加简洁,同时也能满足测量需求。

8. 不同方法的优缺点对比
功能 方法 优点 缺点
拦截按键输入 sys.stdin.read 函数 不需要图形用户界面,可通过SSH会话运行 按下箭头键或Shift键会抛出错误,无法处理非ASCII键
拦截按键输入 Pygame库 可以使用光标和其他非ASCII键 必须使用Python 2,需要访问窗口系统
测量电阻 阶跃响应技术 成本低,易于使用 测量精度不高,电容精度影响结果
测量光照强度 电阻式传感器方法 相对可靠,可避免损坏GPIO引脚 测量精度受电容和电阻影响
9. 实际应用场景
9.1 智能家居控制

在智能家居系统中,可以使用拦截按键输入的方法来实现对设备的控制。例如,通过USB键盘或数字小键盘的按键来控制灯光的开关、调节窗帘的开合等。使用Pygame库可以更方便地处理非ASCII键,如方向键,实现更丰富的控制功能。

同时,光照强度传感器可以用于自动调节室内灯光亮度。当环境光照强度较低时,自动打开灯光并调节到合适的亮度;当光照强度较高时,自动关闭灯光,实现节能的目的。

9.2 数据记录与监测

实时时钟模块可以确保树莓派在没有网络连接的情况下也能准确记录时间。在一些数据记录和监测系统中,如气象站、环境监测站等,需要准确记录数据采集的时间。使用RTC模块可以保证即使在网络中断的情况下,数据的时间戳仍然准确无误。

电阻式传感器可以用于监测一些物理量的变化,如温度、湿度等。通过将可变电阻替换为相应的传感器,可以实现对这些物理量的测量和记录。

10. 总结与建议

通过以上介绍,我们了解了树莓派在处理GPS数据、拦截按键和鼠标输入、使用实时时钟模块以及连接电阻式传感器和测量光照强度等方面的方法和技术。在实际应用中,需要根据具体需求选择合适的方法。

如果对测量精度要求不高,且追求低成本和简单实现,可以选择阶跃响应技术来测量电阻和光照强度;如果需要处理非ASCII键,建议使用Pygame库来拦截按键输入。同时,在使用RTC模块时,要注意硬件的兼容性和配置的正确性,以确保树莓派在各种情况下都能准确记录时间。

在未来的开发中,可以进一步探索这些技术的应用,结合更多的传感器和设备,实现更复杂的功能,如自动化控制、数据分析等。希望本文能为你在树莓派的开发和应用中提供一些帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值