用树莓派测噪声,需要准备的东西:
- 树莓派,我是树莓派 zero w;
- 噪声模块,普遍比较贵,我淘的是这款 串口/TTL/0-3V 输出的,5V供电。
接线方式:
需要用到4个GPIO,除了 5V 和 接地,还要用到 GPIO14 TxD 和 GPIO15 RxD,如下图所示。
实物接线图如下所示。
树莓派串口设置:
此节转载自“学习笔记-Raspberry Pi Zero W-4:串口(UART)的配置和使用”
(1)修改cmdline.txt文件
编辑cmdline.txt文件
$ sudo nano /boot/cmdline.txt
原来cmdline.txt文件的内容如下:
console=serial0,115200 console=tty1 root=PARTUUID=a05c3c8f-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles
将有关console的内容全部删掉,修改后的cmdline.txt文件内容如下:
root=PARTUUID=a05c3c8f-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles
(2)关闭板载蓝牙
禁用蓝牙功能
$ sudo systemctl disable hciuart
编辑config.txt文件
$ sudo nano /boot/config.txt
增加如下一行:
dtoverlay=pi3-disable-bt
重启树莓派
(3)禁用串口的控制台功能
编辑config.txt文件,增加如下一行:
enable_uart=1
C串口通讯程序:
代码中波特率设置要与模块相同,modbus数据地址根据模块的说明书。
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <wiringSerial.h>
int main(int argc, char *argv[])
{
int fd;
if ((fd = serialOpen("/dev/ttyAMA0", 9600)) < 0)
{
fprintf(stderr, "Unable to open serial device: %s\n", strerror(errno));
return 1 ;
}
const char sendbuf[8] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x01, 0x84, 0x0A};
const char recvbuf[8];
while(1)
{
size_t count = write (fd, sendbuf, 8);
count = read(fd, recvbuf, 8);
if(count > 6){
int result = (recvbuf[3]<<8) + recvbuf[4];
printf("NOISE:%f\n", result/10.0);
}
delay(50);
}
}
Python版:
import time
import serial
import sys
import RPi.GPIO as GPIO
port="/dev/ttyAMA0"
usart=serial.Serial(port,9600,timeout=None)
usart.flushInput()
sendbuf = bytearray.fromhex("01 03 00 00 00 01 84 0A")
while True:
usart.write(sendbuf)
recvbuf = bytearray(usart.read(7))
b1 = int(recvbuf[3])
b0 = int(recvbuf[4])
result = (b1<<8) | b0
print(result/10.0)
time.sleep(.05)
GPIO.cleanup()
运行结果:
家里的环境噪声在50左右,我吹了哨子后达到90左右。