矽递科技(Seeed Studio)的 Grove 系列是一个拥有数百款模块的庞大家族。借助树莓派 Grove Base Hat 扩展板,可以让用户得以方便地使用 Grove 的生态系统。
Grove 生态系统
矽递科技(英文 Seeed Studio)从 2010 年开始研发了 Grove 系统并开始不断迭代更新和扩充 ,它采取积木式的方式来组装电子元件。与基于跳线或焊接的系统相比,连接、测试和构建都变得更容易。与借助传统的面包板和各种电子元件组装项目的方法相比,Grove 大大简化了学习过程和提高了易用性。
Grove 系统由基本处理单元(类似 Arduino UNO 板就具备处理单元)和各种带有标准化连接器的模块(Grove,树枝)组成,Grove 扩展板可以轻松通过标准的 Grove 模块接口和 Grove 连接线(如下图所示)连接多个 Grove 模块。
Grove LED灯模块,上面有一个四针的 Grove 接口
Grove 连接线
Grove 的扩展板
每个 Grove 模块通常只提供1个功能,比如一个简单的按钮或某个复杂的传感器。至今 Grove 家族已扩展到 300多个模块,几乎涵盖了常用开源硬件的方方面面。
以网友的安全门禁项目为例,使用了多个 Grove 模块,通过 Seeeduino lotus (整合了 Arduino 兼容主控和 Grove 扩展板的 Arduino 兼容板)使用 Grove 线进行简单连接,然后编程即可使用。
项目细节见:Security Access Using Seeeduino Lotus(用 Seeeduino Lotus 做的安全门禁)
[
](https://www.hackster.io/limanchen/security-access-using-seeeduino-lotus-7eb90f)
Grove Base Hat 介绍
专用于树莓派的Grove Base Hat (以下简称 Hat )降低了在树莓派上使用 Grove 传感器的门槛。
规格
工作电压 | 3.3V |
---|---|
单片机 | STM32/MM32 |
ADC | 12位8通道 |
Grove 端口 | 6×数字 4×模拟 3×I2C 1×PWM 1×UART |
树莓派通信总线 | I2C |
I2C 地址 | 0x04/0x08 |
端口介绍
如下图,Hat 上配备了数字、模拟、I2C、PWM、UART 端口来满足你的需求。甚至,在内置 MCU 的帮助下树莓派还可以使用 12 位 8 通道 ADC(Analog-to-Digital Converter,指将模拟信号转化为数字信号的转换器)。
目前,已有60多个 Grove 模块支持用于 Hat,且还在持续增加中。
- GPIO(通用输入/输出接口)端口
GPIO 在《第六章 用 Scratch 和 Python 进行物理计算》已经有介绍。Hat 上的 GPIO 与树莓派上的相同,这意味着即使你将 Hat 安装在树莓派上,也可以继续使用树莓派的 GPIO,没有任何差别。不过,要注意如果 Hat 上连接了Grove 模块,那对应的 GPIO 引脚就不能重复使用了。
- I2C 端口
这个板子上有三个 I2C 端口,它们都直接连接到树莓的 I2C 引脚上。你可以把这个部件看作是一个 I2C 集线器。Seeed Studio 的新模块大多数都有 I2C 接口,你会发现这三个端口非常有用。
- 数字端口
Hat 上有6个数字 Grove 接口,通常 Grove 线的黄线是信号线,所以我们以黄线对应的引脚数字命名 Grove 端口:D5/D16/D18/D22/D24/D26。
- 模拟端口
树莓派中没有 ADC 接口,所以它不能直接使用模拟传感器。在 Hat 内置 MCU STM32 的帮助下,Grove 接口可以作为一个外部的12位 ADC 工作,这意味着你可以在树莓派上使用模拟传感器。一共有4个模拟 Grove 接口可用。
模拟传感器将模拟电压输入12位 ADC。在 ADC 将模拟数据转换成数字数据后,它通过 I2C 接口将数字数据输入到树莓派。
- PWM(脉冲宽度调制)端口
PWM 是指用 MCU 的数字输出来对模拟电路进行控制,是一种将模拟信号电平进行数字编码的方法。 端口连 Grove PWM 接到 GPIO12 引脚(PWM 0)和 GPIO 13引脚(PWM 1),这是树莓派的硬件 PWM 引脚,此外,你可以使用所有 GPIO 针脚作为软 PWM 引脚。
提示
- 与硬件 PWM 相比,软件 PWM 并不那么精确,在高频率下会有问题。
- GPIO 18引脚也被标记为 PWM0,实际 GPIO12引脚和 GPIO 18引脚共享同一个 PWM 通道,所以它们不能设置为不同的速率。
- 音频插座的输出也使用 PWM 0 和 PWM 1,所以你不能在该插座上有音频输出的同时使用 PWM。
- UART(通用异步收发传输器)端口
Grove UART 端口连接到 GPIO14 (UART0 TX) 和 GPIO 15 (UART0 RX)。UART 通常用于树莓派上,作为通过 GPIO 控制树莓派的一种方便形式,或者从串行控制台(默认启用)访问内核启动信息。
- SWD 端口
我们使用 SWD 端口将固件刻录到 Hat 上。此外,你可以在这部分看到3个 GPIO 引脚,即 9/10/11号 引脚。这三个针脚没有被任何 Grove 接口使用,你可以自由地使用它们而不用担心引脚冲突。
安装 Grove Base Hat
在你开始之前,你还需要将 Grove Base Hat 连接到你的树莓派上。
警告!
只有在树莓派关闭并断开电源的情况下,才可以将从树莓派上插入或拔出硬件。在安装时,一定要注意保持 HAT的平坦,并在按下它之前仔细检查它是否与 GPIO 头的针脚对齐。
将 Hat 扩展版连接到你的树莓派上。扩展版上的插座可以正好套在树莓派上的所有 GPIO 引脚上,沿着引脚方向按下即可牢牢地插在树莓派上。完成后扩展版就盖在了树莓派之上。
Grove.py 库
想要在树莓派上使用 Grove 传感器,我们要先安装 Seeed grove.py库。Grove.py 依赖于树莓派系统内的多种硬件接口库。 下图便于你理解在树莓派上使用 Grove 模块时,软硬件关系:
安装旧版树莓派系统
因为环境依赖关系,目前仅支持在旧版树莓派系统上使用 grove.py 库。
点击下载 旧版树莓派系统 10(Buster) 2020-08-20 ,并解压得到如下文件:
使用树莓派镜像烧录器,将下载的系统烧录到 microSD卡上。
提示
树莓派镜像烧录器详见《附录A 将操作系统安装到 microSD 卡上》
安装Grove.py
来自命令行界面的问候
在安装grove.py
库之后,可以在命令行界面中使用一些前缀带grove_
的命令,例如grove_led
、grove_button
、grove_ultrasonic_ranger
等。
对于使用数字输入/输出的 Grove 模块,需要在命令后面输入对应的 Grove 端口号(如 D5,则输入 5);
对于使用模拟输入/输出的 Grove 模块,需要在命令后面输入对应的 Grove 端口号(如 A0,则输入 0);
对于使用 I2C 的 Grove 模块,使用树莓派板子上的 I2C 1(为默认总线),无需在命令后面添加引脚号;
对于使用 PWM 的 Grove 模块,使用树莓派上的 GPIO 12 引脚 ,无需在命令后面添加引脚号;
- 接前序步骤,在命令行中输出
cd grove
,表示进入名为 grove 的文件夹。如果报错,可以尝试输入完整的路径cd ~/grove.py/grove
,再按下回车键。界面最后一行显示如下:
在命令行界面中,使用用 Grove 模块都要在cd ~/grove.py/grove
路径下进行。
提示
命令行界面的基础操作说明详见《附录C 命令行界面》。
- 在命令行中继续输入
pythone3 传感器文件.py 端口编号 #I2C、PWM 模块可不输入端口编号
,即可使得模块工作。
可用的 Grove 模块及连接可查看《附录 I Grove base hat 兼容模块》
来自图形界面的问候
- 分别连接 Grove LED 和 Grove Botton 至 Hat 的 D5 和 D22 端口。
- 点击 树莓派图标-编程-Thonny Python IDE,继续点击新建一个文件,然后保存命名为“GPIO 演示”。然后输入以下内容: ```python import time from grove.gpio import GPIO
led = GPIO(5, GPIO.OUT) button = GPIO(22, GPIO.IN)
while True: if button.read(): led.write(1) else: led.write(0) time.sleep(0.1)
3. 点击![image.png](https://cdn.nlark.com/yuque/0/2022/png/2611466/1647311821957-cc991ee9-276e-4957-9d8d-0ff8c0df819d.png#clientId=ub9de45a1-d467-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=25&id=Np9tW&name=image.png&originHeight=39&originWidth=43&originalType=binary&ratio=1&rotation=0&showTitle=false&size=1296&status=done&style=none&taskId=u2f80e4aa-d56e-4f88-aa04-2fabb484111&title=&width=27.22222137451172)运行按钮, 程序开始运行:按下 button 模块,LED 灯亮;松开 button 模块,LED 灯灭。
![image.png](https://cdn.nlark.com/yuque/0/2022/png/2611466/1647416473881-77d57c3b-1cb9-4b74-bdba-f547206b8666.png#clientId=u709efbd1-17b1-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=473&id=u8b1dbf84&margin=%5Bobject%20Object%5D&name=image.png&originHeight=568&originWidth=759&originalType=binary&ratio=1&rotation=0&showTitle=false&size=101490&status=done&style=none&taskId=ua20a29d7-39b0-4c28-bc73-537c22700c6&title=&width=632.4999748667091)
<a name="W7cDx"></a>
## Grove 的 Hello World —— I2C端口示例
请按下图所示,连接 Grove base hat 和 Grove OLED display 0.96" 。<br />![](https://cdn.nlark.com/yuque/0/2022/jpeg/2611466/1647253250772-d28c92e2-9548-4d02-a68b-e7c1e17fcbf7.jpeg#clientId=u76653af7-cadd-4&crop=0&crop=0.1984&crop=1&crop=0.8088&from=paste&height=768&id=u59d807b4&margin=%5Bobject%20Object%5D&originHeight=768&originWidth=1024&originalType=url&ratio=1&rotation=0&showTitle=false&status=done&style=none&taskId=uad754a07-7a3d-440f-9454-012104fff76&title=&width=1024)
<a name="hMo2M"></a>
#### 用命令行界面中控制 OLED 屏
1. 在命令行中输出 `cd grove`,表示进入名为 grove 的文件夹。如果报错,可以尝试输入完整的路径
`cd ~/grove.py/grove`,在按下回车键。界面最后一行显示如下:
```shell
pi@raspberrypi:~/grove.py/grove $
- 继续输入
python3 grove_oled_display_128x64.py
,然后敲击回车键。输入正确,界面最后两行显示如下:
看起来似乎什么都没有发生, 但是如果你检查你的 OLED 屏,你可以找到网络世界中最有名的一句话!😄pi@raspberrypi:~/grove.py/grove $ python3 grove_oled_display_128x64.py
pi@raspberrypi:~/grove.py/grove $
在图形界面中控制 OLED 屏
- 点击树莓派图标-编程-Thonny Python IDE,继续点击新建一个文件,然后保存命名为“Hello world”。然后输入以下内容: ```plsql import time from grove.gpio import GPIO
buzzer = GPIO(12, GPIO.OUT)
buzzer.write(1) time.sleep(1) buzzer.write(0)
2. 点击![image.png](https://cdn.nlark.com/yuque/0/2022/png/2611466/1647311821957-cc991ee9-276e-4957-9d8d-0ff8c0df819d.png#clientId=ub9de45a1-d467-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=25&id=hbG8s&name=image.png&originHeight=39&originWidth=43&originalType=binary&ratio=1&rotation=0&showTitle=false&size=1296&status=done&style=none&taskId=u2f80e4aa-d56e-4f88-aa04-2fabb484111&title=&width=27.22222137451172)运行按钮,如果输入正确,你会在 OLED 显示屏上看到 “Hello world!”
<a name="nzLLR"></a>
## 超声波传感器感应距离——数字端口示例
请按下图所示,将超声波传感器( Ultrasonic sensor)连接到 Grove base hat 的 D5端口。<br />![](https://cdn.nlark.com/yuque/0/2022/jpeg/2611466/1647304131558-e4463770-f07d-427d-9aa1-8ec9591928c5.jpeg#clientId=u3390a2ee-fe2b-4&crop=0&crop=0.0929&crop=1&crop=0.807&from=paste&height=768&id=MxHfA&margin=%5Bobject%20Object%5D&originHeight=768&originWidth=1024&originalType=url&ratio=1&rotation=0&showTitle=false&status=done&style=none&taskId=udf2d303c-bd8d-4607-88dc-15536e8b736&title=&width=1024)
<a name="zRQ74"></a>
#### 在命令行界面中控制超声波传感器
1. 确认当前文件路径为 `~/grove.py/grove`,如果不在该路径中请输入:`cd ~/grove.py/grove`,然后按一下回车键,输入正确,界面最后两行显示如下:
```shell
pi@raspberrypi:~/grove.py/grove $
继续输入
python3 grove_ultrasonic_ranger.py 5 6
,然后敲击回车键。输入正确,你会看到与下图类似的内容:命令行界面中不断地在更新一些距离数据。这些数据其实是超声波传感器不断地在侦测与其前方物体的距离,尝试用手靠近、远离传感器,你会观察到数据的变化。按下 **Ctrl+C**,将停止检测。<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/2611466/1647305044290-d0589db8-0e27-4713-918e-9cba3eedc9df.png#clientId=u3390a2ee-fe2b-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=492&id=yir4S&margin=%5Bobject%20Object%5D&name=image.png&originHeight=554&originWidth=763&originalType=binary&ratio=1&rotation=0&showTitle=false&size=158255&status=done&style=none&taskId=ubab1f76d-5d99-4f84-80e7-103b0d0e803&title=&width=678.2222222222222)<br />超声波传感器检测的数据持续显示在命令行界面中。<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/2611466/1647305379412-d493dcb3-9d48-45c1-9b74-c749e3b3e84b.png#clientId=u3390a2ee-fe2b-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=476&id=u3ae23ddb&margin=%5Bobject%20Object%5D&name=image.png&originHeight=535&originWidth=767&originalType=binary&ratio=1&rotation=0&showTitle=false&size=158867&status=done&style=none&taskId=uf0cd3c32-b3b7-4ce4-b3a9-1c755cc82c2&title=&width=681.7777777777778)<br />按下 Ctrl+C 后,超声波传感器停止检测。
注意
在使用大多数 Grove 模块时,你需要添加引脚编号参数,比如
grove_ultrasonic_ranger 5 6
,5和6是GPIO/BCM引脚。你可以在 Hat 上任一数字端口旁边找到对应的数字丝印。 小任务: 尝试将超声波连接到 D16引脚,并在命令行中输入grove_ultrasonic_ranger 16 17
,然后按下回车键。
在图形界面中控制超声波传感器
- 点击 树莓派图标-编程-Thonny Python IDE,继续点击新建一个文件,然后保存命名为“距离检测”。然后输入以下内容: ```shell from grove.grove_ultrasonic_ranger import GroveUltrasonicRanger import time
sonar = GroveUltrasonicRanger(5) # pin5, slot D5
print(‘Detecting distance…’) while True: print(‘{} cm’.format(sonar.get_distance())) time.sleep(1)
2. 点击![image.png](https://cdn.nlark.com/yuque/0/2022/png/2611466/1647311821957-cc991ee9-276e-4957-9d8d-0ff8c0df819d.png#clientId=ub9de45a1-d467-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=25&id=u8363de11&name=image.png&originHeight=39&originWidth=43&originalType=binary&ratio=1&rotation=0&showTitle=false&size=1296&status=done&style=none&taskId=u2f80e4aa-d56e-4f88-aa04-2fabb484111&title=&width=27.22222137451172)运行按钮,你会看到在 shell 区域,距离检测数据每1秒更新一次。
![image.png](https://cdn.nlark.com/yuque/0/2022/png/2611466/1647312320824-465468e1-c4e9-4256-8ad2-199c67d14823.png#clientId=ub9de45a1-d467-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=692&id=uff3083df&margin=%5Bobject%20Object%5D&name=image.png&originHeight=779&originWidth=989&originalType=binary&ratio=1&rotation=0&showTitle=false&size=257475&status=done&style=none&taskId=u55d441ec-da65-45d6-be0a-00ed0797e5c&title=&width=879.1111111111111)<br />超声波传感器检测的数据持续显示在命令行界面中。点击![image.png](https://cdn.nlark.com/yuque/0/2022/png/2611466/1647312608356-d693ca7c-a282-4381-8c5e-96a825778315.png#clientId=ub9de45a1-d467-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=21&id=uf1b52c38&name=image.png&originHeight=40&originWidth=40&originalType=binary&ratio=1&rotation=0&showTitle=false&size=1086&status=done&style=none&taskId=ub9d21e25-0744-4ef6-a288-25583d18c0a&title=&width=20.555557250976562)停止按钮可以停止检测。<br />恭喜!你完成了在图形界面中控制超声波的任务!
<a name="ZCukT"></a>
## 噪音监测——模拟端口示例
请按下图所示,将声音传感器传感器( Sound sensor)连接到 Grove base hat 的 A0端口。<br />![](https://cdn.nlark.com/yuque/0/2022/jpeg/2611466/1647318114307-f3f0121f-b857-4e2e-8f02-bb5517b3f6ac.jpeg#clientId=ue0d0a646-6d56-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=uabb1cb5e&margin=%5Bobject%20Object%5D&originHeight=768&originWidth=1024&originalType=url&ratio=1&rotation=0&showTitle=false&status=done&style=none&taskId=udb9dbff7-4e33-4f93-9ba4-f8652d07051&title=)
<a name="kZNAv"></a>
### 在命令行界面中检测音量大小
1. 确认当前文件路径为 `~/grove.py/grove`,如果不在该路径中请输入:`cd ~/grove.py/grove`,然后按一下回车键,输入正确,界面最后两行显示如下:
```shell
pi@raspberrypi:~/grove.py/grove $
继续输入
python3 grove_sound_sensor.py 0
,然后敲击回车键。输入正确,你会看到与下图类似的内容:命令行界面中不断地在更新一些声音数据。这些数据其实是超声波传感器不断地在侦测周围环境的声音大小,数值范围为0-1000,尝试用手敲击桌面,或者假装咳嗽,你会观察到数据的变化。按下 **Ctrl+C**,将停止检测。<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/2611466/1647318288444-f8f4e168-e71c-4880-9c84-665daf02811b.png#clientId=ue0d0a646-6d56-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=464&id=u904ea261&margin=%5Bobject%20Object%5D&name=image.png&originHeight=522&originWidth=762&originalType=binary&ratio=1&rotation=0&showTitle=false&size=103401&status=done&style=none&taskId=u40032d98-1986-4a46-a99c-663a4b0feb4&title=&width=677.3333333333334)<br />声音传感器检测的数据持续显示在命令行界面中。<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/2611466/1647318312684-b15f0994-8a0d-4de1-abea-493302077cca.png#clientId=ue0d0a646-6d56-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=460&id=u066f5dd9&margin=%5Bobject%20Object%5D&name=image.png&originHeight=518&originWidth=761&originalType=binary&ratio=1&rotation=0&showTitle=false&size=131019&status=done&style=none&taskId=u48afcf12-1ef7-446a-b603-c73d51230a2&title=&width=676.4444444444445)<br />按下 Ctrl+C 后,声音传感器停止检测。
在图形界面中检测音量大小
点击 树莓派图标-编程-Thonny Python IDE,继续点击新建一个文件,然后保存命名为“音量检测”。然后输入以下内容: ```python from grove.grove_sound_sensor import GroveSoundSensor import time
value = GroveSoundSensor(0) # pin0, slot A0
print(‘Detecting sound value…’) while True: print(‘{} cm’.format(value.sound)) time.sleep(1)
2. 点击![image.png](https://cdn.nlark.com/yuque/0/2022/png/2611466/1647311821957-cc991ee9-276e-4957-9d8d-0ff8c0df819d.png#clientId=ub9de45a1-d467-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=25&id=nndT4&name=image.png&originHeight=39&originWidth=43&originalType=binary&ratio=1&rotation=0&showTitle=false&size=1296&status=done&style=none&taskId=u2f80e4aa-d56e-4f88-aa04-2fabb484111&title=&width=27.22222137451172)运行按钮,你会看到在 shell 区域,距离检测数据每1秒更新一次。
![image.png](https://cdn.nlark.com/yuque/0/2022/png/2611466/1647738424937-fb61fe4a-1209-4d55-b777-2f75c9ae5daf.png#clientId=uf381bbf5-4352-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=505&id=u69ceb3c8&margin=%5Bobject%20Object%5D&name=image.png&originHeight=606&originWidth=854&originalType=binary&ratio=1&rotation=0&showTitle=false&size=124519&status=done&style=none&taskId=u08381e5e-a57d-418c-9149-c025061f6d3&title=&width=711.6666383875752)<br />超声波传感器检测的数据持续显示在命令行界面中。点击![image.png](https://cdn.nlark.com/yuque/0/2022/png/2611466/1647312608356-d693ca7c-a282-4381-8c5e-96a825778315.png#clientId=ub9de45a1-d467-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=21&id=kozNm&name=image.png&originHeight=40&originWidth=40&originalType=binary&ratio=1&rotation=0&showTitle=false&size=1086&status=done&style=none&taskId=ub9d21e25-0744-4ef6-a288-25583d18c0a&title=&width=20.555557250976562)停止按钮可以停止检测。<br />恭喜!你完成了在图形界面中控制超声波的任务!
<a name="fEv8f"></a>
## 奏响 Grove 蜂鸣器—— PWM端口示例
<a name="iVsnT"></a>
### 在命令行界面中奏响蜂鸣器
1. 确认当前文件路径为 `~/grove.py/grove`,如果不在该路径中请输入:`cd ~/grove.py/grove`,然后按一下回车键,输入正确,界面最后两行显示如下:
```shell
pi@raspberrypi:~/grove.py/grove $
- 继续输入
python3 passive_buzzer.py
,然后敲击回车键。输入正确,你会看到蜂鸣器响起一秒后停止播放。
在图形界面中奏响蜂鸣器
- 点击 树莓派图标-编程-Thonny Python IDE,继续点击新建一个文件,然后保存命名为“奏响蜂鸣器”。然后输入以下内容: ```shell import time from grove.gpio import GPIO
buzzer = GPIO(12,GPIO.OUT) while True: buzzer.write(1) time.sleep(1) buzzer.write(0) time.sleep(3) ```
- 点击运行按钮,你会听到蜂鸣器每隔3秒,响1秒。