树莓派串口(UART)编程Python示例

20170123103950947-0

前言

本文将详细介绍树莓派的串口(UART)配置和使用,并结合一个modbus RTU从机的例子说明树莓派串口的应用。
在开始前说明以下几点
1.树莓派UART端口的位置
TXD位于HEAD-8
RXD位于HEAD-10
GND位于HEAD-6(可选其他GND)
2.树莓派的TXD应接USB转串口设备的RXD,当然如果测试失败请交换RXD和TXD的顺序
3.经过很多次的测试(N>25),当波特率为115200时打开树莓派的UART时,树莓派会莫名其妙的发送一字节0xF8,该问题始终无法解决。不过波特率为9600时并没有此问题,猜测是树莓派硬件或内核驱动问题。
4.树莓派的串口默认为SSH调试使用,若要使用串口需要修改两处文件。
5.2016.11起新系统需要通过这个方法开启SSH服务
阅读全文

瑞士军刀扩展板的跑马灯实现(C++版)

树莓派上通过C和Python来控制GPIO已经成为了很流行的方式,本文介绍如何使用C++/Boost/OOP和用户空间驱动树莓派瑞士军刀扩展板的LED,实现跑马灯效果。相关原理和方法通用,当然也可以用于瑞士军刀扩展板之外的情况。

1、运行环境
系统信息:Linux raspberrypi 4.4.21-v7 #1 SMP Sat Sep 24 20:40:17 CST 2016 armv7l GNU/Linux
硬件搭配:Raspberry Pi 3B + 瑞士军刀扩展板,如图所示。
20161220201908269-0

阅读全文

RPi.GPIO 模块使用基础

RPi.GPIO 模块程序包提供了一个在 Raspberry Pi 中控制 GPIO 的类。

注意,该模块不适合应用到追求实时性或计数周期的应用中。这是由于您无法预测 Ptyhon 何时繁忙,以及资源回收的时间。而且它是运行在基于 Linux 核心的系统中,也不合适用于实时应用 – 原因在于其它进程可能获得更高的 CPU 优先级。如果您一定要追求实时操作的性能,可以考虑购买一块 Arduino 主板http://www.arduino.cc!

还需要注意一点,目前的版本还不支持 Raspberry Pi 的 SPI、I2C、1-wire、串口等功能。计划在不久的将来会实现的!

本文是 RPi.GPIO 模块文档系列文章的第一篇,除本文外还包括以下几篇:

使用 RPi.GPIO 模块的输入(Input)功能
使用 RPi.GPIO 模块的输出(Output)功能
使用 RPi.GPIO 模块的脉宽调制(PWM)功能

导入模块

导入 RPi.GPIO 模块:

import RPi.GPIO as GPIO

通过该操作,您可以将模块名称映射为 GPIO,以便接下来您其它脚本进行使用。

阅读全文

使用 RPi.GPIO 模块的输入(Input)功能

这篇日志的内容应该算是《RPi.GPIO 模块使用基础》Input 部分的扩展讲解,详细讲解了 Input 部分的一些高级应用技巧。
目前有几种途径可以在您的程序中获得 GPIO 的输入信息。第一种也是最简易的一种为在某个时间点检查输入值。这即是所谓的“轮询(polling)”,而且如果您的程序在错误的时间里进行了读取,可能会错过某个输入值。在循环中运用轮询,有可能使处理器资源紧张。另一种对 GPIO 输入进行响应的方式可以使用“中断(interruots)”(边缘检测(edge detection))。边缘可以是从 HIGH 到 LOW 的过度(下降临界值(falling edge))或从 LOW 到 HIGH 的过度(上升临界值(rising edge))。

上拉/下拉电阻

如果您在输入针脚上没有连接任何元件,那么它将是“浮动(float)”的。换句话说,因为您没有连接任何元件,在按下按钮或开关之前,读取的值是没有意义的。由于电源的波动,获取到的值可能会有很大的变化。

阅读全文

使用 RPi.GPIO 模块的输出(Output)功能

1、首先对 RPi.GPIO 进行设置(根据这里的描述)

import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(12, GPIO.OUT)

2、设置某个输出针脚状态为高电平:

GPIO.output(12, GPIO.HIGH)
 # 或者
GPIO.output(12, 1)
 # 或者
GPIO.output(12, True)

3、设置某个输出针脚状态为低电平:

GPIO.output(12, GPIO.LOW)
 # 或者
GPIO.output(12, 0)
 # 或者
GPIO.output(12, False)

4、程序结束后进行清理

GPIO.cleanup()

注意,您可以读取使用 input() 函数设置的输出通道的当前状态。例如对输出进行切换:

GPIO.output(12, not GPIO.input(12))

阅读全文

树莓派瑞士军刀扩展板 SAKS SDK 升级

过去的一周我们发布了瑞士军刀扩展板硬件的升级版本,现在我们完成了瑞士军刀扩展板 SAKS SDK 的适应性升级,并提交到 Github 上,通过以下命令获取。

git clone https://github.com/spoonysonny/SAKS-SDK.git

本次 SDK 的升级作了如下改动:

  • 加入了两种IC的支持——IC_74HC595类和IC_TM1637类,以及依赖这两个IC的LED排灯(Led74HC595类)和数码管(DigitalDisplayTM1637类)。
  • 重新定义了适用于瑞士军刀V2.0的模板——SAKSPins、SAKSHAT。
  • 适用于瑞士军刀V1.X的模板被移动到了 v1.x 目录下,如果您在使用旧版本的 SAKS,请注意使用该目录下的源文件覆盖根目录相应的文件。
  • 原有的蜂鸣器、开关按键、温度传感器通过修改GPIO映射的配置已经被无缝移植过来,使用方法同之前的SDK教程所述。

下面结合示例先简要地说明下新特性的用法,该部分示例亦可在 examples 目录下的 main.py 文件找到。

#批量设置LED排灯的状态,从左到右依次为:亮,灭,亮,灭,亮,灭,亮,灭
SAKS.ledrow.set_row([True, False, True, False, True, False, True, False])
#批量设置LED排灯的状态,从左到右依次为:不变,亮,灭,不变,不变,不变,不变,亮
SAKS.ledrow.set_row([None, True, False, None, None, None, None, True])
#点亮LED排灯的第8个灯,0代表第1个灯,依次类推
SAKS.ledrow.on_for_index(7)
#灭掉LED排灯的第1个灯
SAKS.ledrow.off_for_index(0)
#LED排灯全亮
SAKS.ledrow.on()
#LED排灯全灭
SAKS.ledrow.off()
#注意,新的SDK不再支持 SAKS.ledrow.items[3].on() 这种用法了。
#数码管的用法完全兼容之前的 SDK,由于硬件层使用了专用芯片,数码管的显示不再闪烁,效果更稳定了!
# 将显示“1234”4位数字,并且每一位右下角的小点点亮
SAKS.digital_display.show("1.2.3.4.")
# 将显示“1234”4位数字,并且数字2后面的小点点亮
SAKS.digital_display.show("12.34")
# 在第4位数码管显示“1”,其他3位数码管不显示
SAKS.digital_display.show("###1")

其他元件,如开关按键、蜂鸣器、温度传感器用法未做变更,请参考之前的相关例程
http://shumeipai.nxez.com/swiss-army-knife-shield-for-raspberry-pi-diy-tutorials-v1

阅读全文