无论开发人员是专业人士还是业余爱好者,Raspberry Pi 开发板在整个开发周期都对非常有用。尽管 Raspberry Pi Zero 得到了人们的极大关注,但一直是很难获得的稀缺品。幸运的是,设计人员可以使用 Pi 家族中的其它板子,这些板子同样功能出色,能满足各种应用要求。
Raspberry Pi 3 使用其四核处理器,并可提供比单核 Pi Zero 多一倍的内存。对于需要较小设计封装,但又对 Pi Zero 的性能感到失望的开发人员,Raspberry Pi 计算模块 3 (CM3) 就是不错的选择。该模块既具有 Pi 3 的高性能,又如 Pi Zero 一般只有信用卡大小。通过利用大量扩展硬件板和现有软件,开发人员可以使用 Pi 3 和 CM3 满足各种应用要求。
启动 Raspberry Pi 入门并运行
Raspberry Pi 系统提供了强大的开源基础,使供应商、第三方开发人员和用户自己能够利用越来越丰富的软件和硬件生态系统并做出贡献。Pi 硬件最初是由 Raspberry Pi Foundation 开发用于计算机教学的低成本平台,现在已经演变成一个适合快速原型开发、功能强大且成本较低的平台,而且越来越多地作为可嵌入的计算平台。
Pi 软件可提供类似水平的性能,而且容易获取。Pi 开发板运行 Raspbian,这是针对 Raspberry Pi 开发板优化的 GNU/Linux 操作系统 (OS) 版本。开发人员可以将含有 Raspbian 安装程序 NOOBS 的 SD 卡插入 Pi 开发板的 SD 接口,几秒钟后便会出现熟悉的 Linux 环境并可开始运行。
由于 Raspberry Pi 社区非常活跃,有特定要求的开发人员可以从其他操作系统中选择,包括桌面 Ubuntu、Ubuntu Core、Windows 10 IoT Core、基于 Linux 的 Open Source Media Center (OSMC) 和 RISC OS 等。对于这些发行版本,开发人员只需要使用存储在 SD 卡上的下载图片来加载系统即可。最后,软件工程师可以利用丰富的可用软件库来支持以各种编程语言进行开发。
Pi 片
在硬件层面,Pi 硬件已演变成三大分支,这些分支在性能、大小和功能方面存在一些显著差异(表 1)。最近推出的 Pi Zero 以其小尺寸引人瞩目,可作为入门级开发板使用,并且为降低成本以及缩小封装尺寸,牺牲了一些功能元素。相比之下,Pi 3 及其嵌入式变体 CM3 具有高性能四核处理器和大内存,可以为嵌入式应用提供强大的硬件平台。此外,CM3 封装与 Pi Zero 几乎相同,且不会牺牲性能或功能。
Pi 3
BCM2837(1.2 GHz 64 位四核 ARM Cortex-A53,带双核 VideoCore IV GPU)
1GB RAM
NVM: Micro SD 卡插槽
85 mm x 56 mm
Pi 40 引脚针座
40 个 GPIO
802.11n Wi-Fi
蓝牙 4.1
以太网
USB
HDMI
AV 端口
相机接口 (CSI)
显示器接口 (DSI)
Pi CM3
同 Pi 3
1GB RAM
NVM: 4 GB eMMC 板载闪存
67.6 mm x 31 mm
200 引脚 SODIMM
48 个 GPIO
2 个 I2C
2 个 SPI
2 个 UART
2 个 SD/SDIO
HDMI
USB
DPI、SMI、CSI、DSI
Pi Zero
BCM2835(1 GHz 单核 ARM1176)
512 MB RAM
NVM: Micro SD 卡插槽
65 mm x 30 mm
Pi 40 引脚通孔
HDMI
USB
HAT 兼容针座
复合视频和复位针座
CSI 相机连接器
表 1: Raspberry Pi 3、计算模块 3 (CM3) 和 Pi Zero 的比较(来源: Digi-Key Electronics,根据 Raspberry Pi Foundation 数据编制)
标准硬件接口是 Raspberry Pi 等平台成功的关键因素。最近推出的 Pi 开发板,包括 Pi 3 和 Pi Zero,可提供同样的 40 引脚接口,引出了 28 个 GPIO 引脚,其中一些引脚是 I2C、SPI 和 UART 连接的两倍(图 1)。除了 GPIO 引脚,该 Pi 标准接口还提供了 3.3 V、5 V、接地和其他线路,如 EEPROM ID。多亏有这种通用引脚布局,Pi 用户可以从第三方供应商处找到多种扩展板,并将其全都构建在这个标准接口上。
图 1: Pi 开发板(包括 Pi 3 和 Pi Zero)具有通用的 40 引脚接口,此接口会从主机板处理器和相关元器件中引出 GPIO 和其他线路。(图片来源: Raspberry Pi Foundation)
然而,对于 Pi Zero 用户,该 40 引脚接口以 PCB 上的电镀通孔形式提供,需要用户压接或焊接到通孔连接器针座上。对于 Pi 3,连接器针座本身是标准的(图 2),同时还针对 Wi-Fi 和以太网等 Pi Zero 不可用的功能来配备连接器,如表中所示。
图 2: 在提供 Pi 标准 40 引脚接口的情况下,Pi Zero (a) 仅提供通孔连接,而 Pi 3 (b) 包括 40 引脚连接器,可以接受称为 HAT(顶部安装硬件)的扩展板。(图片来源: Raspberry Pi Foundation)
扩展硬件
由于 Pi 接口提供电源、接地和 GPIO,开发人员可以将其分立电路直接连接到 Pi 3 GPIO 接口引脚。然而,Pi 平台不是从零开始布线电路,而是提供更有效的扩展 Pi 3 系统功能的方法。在这里,Pi 3 上的 40 引脚针座的可用性为配置为 HAT(顶部安装硬件)的扩展板提供了标准接口。借由这种简单的电气和机械接口,开发人员可以使用应用程序特定的功能快速增强基础 Pi 3 开发板。开发人员只需将 Pi 兼容的扩展 HAT 压入 40 引脚连接器上,即可创建扩展板堆栈,所有这些都可以共享此单一接口。
开发人员可以利用大量扩展板。例如,Pi Sense HAT 包括定向或环境感测应用所需的全套传感器。此外,还提供了一个 LED 点阵和五按钮操纵杆,可供用户进行反馈和交互(图 3)。
图 3: 开发人员只需插入 HAT 即可为 Pi 开发板添加功能,例如这个 Pi Sense HAT,可提供多个传感器以及 LED 点阵和五按钮操纵杆,方便用户交互。(图片来源: Raspberry Pi Foundation)
Sense HAT 本身就是一个复杂的子系统: 除了自有的 Microchip Technology 8 位 ATtiny MCU (ATTINY88) 外,该扩展板还包括 STMicroelectronics LSM9DS1 惯性测量装置 (IMU)、STMicroelectronics 的 HTS221 湿度/温度传感器和 STMicroelectronics LPS25HBTR 压力传感器。
部署简单
与其他 Pi 兼容的扩展板一样,开发人员只要将 HAT 板向下压入 Pi 3 的 40 引脚针座上,就能将此 Sense HAT 连接到 Pi 3 系统。软件界面也很简单: 获得官方支持的 Python sense-hat 库将低级硬件交互隐藏在简单直观的调用中(列表 1)。
from sense_hat import SenseHat
sense = SenseHat()
temp = sense.get_temperature()
print("Temperature: %s C" % temp)
humidity = sense.get_humidity()
print("Humidity: %s %%rH" % humidity)
# get_orientation_degrees returns a Python dictionary
# with keys pitch, roll, and yaw
orientation = sense.get_orientation_degrees()
print("p: {pitch}, r: {roll}, y: {yaw}".format(**orientation))
列表 1: Raspberry Pi Sense HAT 库使软件开发人员能够使用一些直观的调用从 Sense HAT 硬件获取数据。(代码来源: Raspberry Pi Foundation)
除了 Pi Sense HAT 之外,开发人员还可找到解决最典型的应用需求的第三方 HAT。例如,Seeed Technology 114990831 提供了 2 通道 16 位数模转换器 (DAC) 和 24 位模数转换器 (ADC),具有 8 个单端或 4 个差分输入通道。开发人员可以从 Seeed GPS、DFRobot 超声波查找传感器和 Adafruit 步进电机等其他许多器件中找到扩展。
若现有扩展板无法满足开发人员的要求,Seeed Technology 还提供了一个分线板 HAT,其中包括一些内置元器件,包括 P-MOS、N-MOS、NPN 和 PNP 晶体管。
在使用 HAT 时,开发人员可以利用 Raspberry Pi Foundation、供应商和其他 Pi 社区成员提供的诸多软件工具。例如,Raspberry Pi raspi-gpio 工具使开发人员可以查看 GPIO 的状态并修改其行为。程序员还可以使用该工具的开源 C 代码作为构建自己的 GPIO 控制软件例程的模型。
开发人员还可以找到用于更高级语言(如 Python)的 GPIO 库。利用 RPi.GPIO Python 模块,开发人员可以使用调用功能,于引脚层面控制 GPIO 函数的各个方面,例如使用 GPIO.input(channel)
读取 GPIO 引脚的值,以及使用 GPIO.output(channel, state)
将指定的 GPIO 引脚设置为指定状态。
gpiozero Python 库通过 MotionSensor、LightSensor、LED、Motor 等更高级的抽象来提升 GPIO 编程。使用这种方法,程序员可使用更直观的命令来读取基础硬件的状态或设定所需的状态,例如可打开 LED 的 led.on()
命令,从而处理底层硬件,依靠库来管理基础的 GPIO 事务。
利用 Grove
Pi HAT 接口标准为第三方开发人员提供了有吸引力的基础,但仍然局限于 Pi 平台。相比之下,Grove 接口提供了跨硬件平台的单一标准基础,吸引了更多的扩展板开发人员。Seeed Technology Grove 入门套件提供了一个带有多个 Grove 兼容连接器的 Pi 兼容 HAT 板。与其他 HAT 一样,Grove HAT 安装在 Pi 3 40 引脚连接器上(图 4)。
图 4: Seeed Technology Grove 入门套件连接到 Pi 标准的 40 引脚连接器,使开发人员能够使用各种 Grove 兼容的外设来增强其 Pi 系统。(图片来源: Seeed Technology)
使用 Grove HAT,开发人员可保留 Pi 3 的简单性和性能,同时还可访问各种 Grove 兼容扩展,包括致动器、气体传感器、电机控制设备、扬声器、无线收发器等等。开发人员不是将扩展功能直接插入到 Pi 3 40 引脚连接器中,而是将这些产品随附的 Grove 连接器插进安装在 Grove HAT 顶部的其中一个 Grove 插槽上(图 4)。
开发人员可以找到 C、Java、Node.js、Python 以及其他类似的 Grove 软件库,将 Grove 功能插入其应用程序。此时,利用较高级别的例程,开发人员可以考虑收集模拟数据(列表 2),依靠库中的低级例程来执行相应位级的事务(列表 3)。
# Tweet the temperature, light, and sound levels with our Raspberry Pi
# http://www.dexterindustries.com/GrovePi/projects-for-the-raspberry-pi/raspberry-pi-twitter-sensor-feed/
import twitter
import time
import grovepi
import math
# Connections
sound_sensor = 0 # port A0
light_sensor = 1 # port A1
temperature_sensor = 2 # port D2
led = 3 # port D3
intro_str = "DI Lab's"
# Connect to Twitter
api = twitter.Api(
consumer_key='YourKey',
consumer_secret='YourKey',
access_token_key='YourKey',
access_token_secret='YourKey'
)
grovepi.pinMode(led,"OUTPUT")
grovepi.analogWrite(led,255) #turn led to max to show readiness
while True:
# Error handling in case of problems communicating with the GrovePi
try:
# Get value from temperature sensor
[t,h] = grovepi.dht(temperature_sensor,0)
# Get value from light sensor
light_intensity = grovepi.analogRead(light_sensor)
# Give PWM output to LED
grovepi.analogWrite(led,light_intensity/4)
# Get sound level
sound_level = grovepi.analogRead(sound_sensor)
# Post a tweet
out_str ="%s Temp: %d C, Humidity: %d, Light: %d, Sound: %d" %(intro_str,t,h,light_intensity/10,sound_level)
print (out_str)
api.PostUpdate(out_str)
time.sleep(60)
except IOError:
print("Error")
except KeyboardInterrupt:
exit()
except:
print("Duplicate Tweet or Twitter Refusal")
列表 2: 开发人员可以使用 Pi 开发板、Grove 扩展和 Grove 软件库来快速实现复杂的应用程序,例如此示例,其模拟了将环境数据传输到主机服务(本例为 Twitter)的物联网型过程。(代码来源: Dexter Industries)
# Read analog value from Pin
def analogRead(pin):
write_i2c_block(address, aRead_cmd + [pin, unused, unused])
read_i2c_byte(address)
number = read_i2c_block(address)
return number[1] * 256 + number[2]
列表 3: Grove 软件库处理访问硬件外设所需的位级操作,使开发人员可以使用更直观的调用(如 analogRead(pin)
)进行工作。(代码来源: Dexter Industries)
简化配置
过去,向系统添加新硬件在许多层面上都面临挑战。硬件工程师需要设计合适的机械和电气接口。应用程序开发人员需要找到能够提供所需抽象类型的合适软件库,以便最大限度地提高生产力。不过,借由 Pi 标准 40 引脚连接器和上述现有软件库,Pi 3 及其生态系统则可消除这些挑战。更进一步而言,针对查找和加载硬件特定的板支持包 (BSP),Pi 架构能省去开发人员近 ¾
的额外工作。BSP 通常会提供完成 OS 和扩展硬件之间接口所需的低级代码。
Pi 架构大大消除了 Pi 用户安装和配置 BSP 的不同硬件设备需求。相反,Pi 系统使用设备树,可以提供加载模块和管理资源分配的机制,从而避免多个软件模块之间竞争相同资源的冲突。如果硬件设备需要专门的软件,则 Pi 用户只需要设置一些配置项。OS 内核会自动查找并加载与相应硬件设备相关的模块。例如,Pi 系统中的 I2C 功能默认为禁用。开发人员只需编辑配置文件 config.txt,将一行文字取消注释:
#dtparam=i2c_arm=on
Pi 平台甚至简化了这一步。当 Raspbian 首次启动时,会运行一个配置工具,向用户显示配置项目的菜单,包括启用各种接口的功能。
对于依赖于基于 I2C 硬件的应用,较高级别的库(如前面提到的那些)可消除开发人员在 I2C 事务级别编码的需要。当开发人员确实需要开发用于专门的 I2C 操作的代码时,他们可以找到用于 Linux 的 I2C 工具等可以直接使用或者用作创建自定义 I2C 软件示例的软件。
嵌入式 Pi
对于想要将 Pi 系统嵌入到产品中的设计人员,最近推出的 CM3 提供了一个紧凑的直接替换型 Pi 解决方案(图 5)。基于与 Pi 3 相同的四核处理器,CM3 还提供与 Pi 3 相同的功能和功能。此外,CM3 在电路板上采用 4 GB eMMC 闪存:而其他 Pi 开发板则提供了一个可用于添加外部闪存卡的 micro SD 插槽。(Raspberry Pi 还提供 CM3L – CM3 的“Lite”版本,其中包括该产品上除板载闪存之外的所有内容。)
图 5: Raspberry Pi 计算模块 3(CM3)兼具 Pi Zero 的小尺寸和 Pi 3 的性能,同时可引出比这两种产品更多的引脚。它还包括一个 4 GB 闪存模块(在板的反面)。(图片来源: Raspberry Pi Foundation)
CM3 摒弃了 Pi 3 和 Pi Zero 中使用的 40 引脚 IO 接口。相反,CM3 在板边缘提供了 200 引脚 SODIMM(小型双列直插式存储器模块)连接器的扩展接口(图 6)。事实上,整个 CM3 板可与 DDR2 SODIMM 外形尺寸兼容,因此开发人员可以通过标准的 DDR2 SODIMM 连接器将 CM3 连接到目标系统。
图 6: Raspberry Pi CM3 并未采用其他 Pi 开发板上的 40 引脚接口,而是提供 200 引脚分线处理器和其他电路板元器件。(图片来源: Raspberry Pi Foundation)
为简化开发,工程师可以利用 Raspberry Pi CM3 开发套件将 CM3 模块与 Raspberry Pi 计算模块 IO 板组合在一起。IO 板是一个简单的开源电路板,带有用于 CM3 的 DDR2 SODIMM 连接器以及断开 200 引脚 CM3 接口的针座(图 7)。另外,IO 板还提供了 Pi 3 开发板上提供的 HDMI、USB、相机和显示器端口的连接器。
图 7: CM3 开发套件中采用的 Raspberry Pi 计算模块 IO 板提供了适用于 CM3 的 DR2 SODIMM 连接器,和适用于 200 引脚 CM3 接口的针座,并为 HDMI、USB、相机和显示器端口提供了连接器。(图片来源: Raspberry Pi Foundation)
实时应用
CM3 兼具高性能和小尺寸等特点,非常适合用作电子产品(如电视机、音频设备和类似消费产品)中的嵌入式系统。然而,对于实时应用,开发人员需要考虑默认 Pi 平台的一些限制。
最值得注意的是,Pi 系统并不采用实时时钟 (RTC)。此外,Pi 3 和 CM3 中使用的 Cortex-A53(或 Pi Zero 中使用的 ARM1176)之类的内核,并不包括定时传感器读取等实时事件所需的功能,例如 SysTick 系统定时器。SysTick 定时器是 ARM Cortex-M 系列等内核的重要功能,专为确定性实时应用而设计。
工程师可以使用 Maxim Integrated DS3231 等精密 RTC IC 轻松弥补这一不足。DS3231 RTC IC 在消费温度范围内具有 ±2ppm 的精度,可产生用于驱动软件系统定时器的方波输出。此外,它提供了一个简单的 I2C 接口,可用于读取实时时钟计数。开发人员可以使用基于之前提到的 I2C 工具包的 C 例程将 RTC 数据集成到其实时应用程序中。
使用标准 Pi 系统进行实时应用的另一个局限在于操作系统本身。针对通用应用,典型的 Linux 发行版缺少可靠地监视和控制实时流程所需的确定性响应。事实上,在 Linux 的默认操作模式中,即使是非常高优先级的线程也可能无法抢占内核。因此,如果高优先级例程尝试读取传感器、控制电机等,则“实时”例程可能需要等待不确定的时长。
幸运的是,Linux 内核包括一个配置选项,名为 CONFIG_PREEMPT,就可以解决这个限制。此选项允许高优先级例程抢占内核,除内核正在执行螺旋锁中的内核线程等特殊情况外(受阻以等待资源)。在实践中,确保可以抢占内核,包括修改此配置项以外的其他步骤。开放源代码社区已经使用发布的 CONFIG_PREEMPT_RT 补丁集将 Linux 转换为完全可预占的内核。由于 Raspberry Pi Foundation 和 Pi 社区成员提供的资料齐全的程序,因此,这个补丁程序就会比较简单又不直接,并且相对常规。
总结
尽管最近对已经证明很难掌握的 Raspberry Pi Zero 开发板的关注很高,但是 Raspberry Pi 3 和 CM3 为工程师提供了一个更有吸引力的创建高性能系统的平台。Pi 3 和 CM3 每个都具有四核处理器和两倍于单核 Pi Zero 的可用板载 RAM。
就其本身而言,Pi 3 提供了一个更为强大的计算基础,可以利用大量符合 Pi 标准 40 引脚 GPIO 接口的可用扩展板。使用 CM3,开发人员即可获得兼具 Pi Zero 的小尺寸以及 Pi 3 的性能优势的计算基础。使用这些最新的 Pi 开发板、硬件扩展和现有的软件库,开发人员可以快速实施定制系统,从而满足不同的应用需求。