树莓派4B学习一
1 目的
通过golang操作外设硬件,以达到学习golang操作硬件的相关知识。
2 硬件
- 树莓派4(Raspberry Pi 4 Model B Rev 1.2)
- Pioneer600(微雪扩展版,http://www.waveshare.net/wiki/Pioneer600)
2.1 树莓派4扩展口引脚定义
- 通用的GPIO
- 电源和接地
- 复用功能,GPIO引脚兼作I2C SPI UART接口
- I2C总线,SDA数据引脚,SCL时钟引脚
- SPI总线, SCLK时钟引脚,MOSI主机输出从机输入,MISO主机输入从机输出。SCLK调整数据通讯速度,MOSI用于从树莓派向附加设备发送命令,MISO则相反
- UART 串口
- PWM,所有引脚都能够进行软件PWM,而GPIO12、GPIO13、GPIO18、GPIO19则能够进行硬件脉冲宽度调制
2.2 Pioneer600 定义
- LED1 GPIO,对应37脚
- LED2 对应扩展版PCF8574,对应第扩展版的9脚
- LED PWR(D3),上电常亮
- PCF8574 GPIO扩展板(按键、蜂鸣器),I2C 地址:0x20 , SDA(第3脚) SCL(第5脚)
- PCF8591 8位精度AD/DA ,I2C 地址:0x48 , SDA(第3脚) SCL(第5脚)
- DS3231 RTC,I2C 地址:0x68 , SDA(第3脚) SCL(第5脚)
- BMP280 压力传感器, I2C 地址:0x76, SDA(第3脚) SCL(第5脚)
- DS18B20 温度传感器,1-wire, DQ(第7脚)
- OLED 显示(128x64), SSD1306,SPI 0号接口
另外还有键盘、红外、UART等其他外设,不一一研究,大同小异。
我们重点研究LED1,DS3231,DS18B20,OLED等5个外设,包括GPIO,I2C,SPI,1-wire等
更详细请查看相关原理图
3 操作系统
有带桌面的,有不带的,我们选择不带的桌面的 Raspberry Pi OS (32-bit) Lite
烧写啥的见烧写系统
sudo apt-get update
sudo apt-get upgrade
sudo apt install -y vim curl wget git build-essential
4 打开I2C/SPI/1-wire等外设
4.1、配置
sudo raspi-config
进行相关配置即可,重启后确认相关驱动和设备是否正常加入
4.2、检查驱动和设备
//检查单总线驱动和设备
pi@gpio:~/pi/DS18B20/fs $ lsmod | grep w1
w1_therm 16384 0
w1_gpio 16384 0
wire 45056 2 w1_gpio,w1_therm
pi@gpio:~/pi/DS18B20/fs $ ls /sys/bus/w1/devices/
28-0000090dfaad w1_bus_master1
//检查I2C驱动和设备
pi@gpio:~/pi/DS18B20/fs $ lsmod | grep i2c
i2c_bcm2835 16384 0
i2c_dev 20480 0
pi@gpio:~/pi/DS18B20/fs $ ls /dev/ | grep i2c
i2c-1
//检查SPI驱动和设备
pi@gpio:~/pi/DS18B20/fs $ lsmod | grep spi
spidev 20480 0
spi_bcm2835 20480 0
pi@gpio:~/pi/DS18B20/fs $ ls /dev/ | grep spi
spidev0.0
spidev0.1
5 I2C外设扫描工具
5.1、安装 i2c-tools
wget https://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/i2c-tools-4.1.tar.gz
tar zxvf i2c-tools-4.1.tar.gz
cd i2c-tools-4.1
修改Makefile中 USE_STATIC_LIB ?= 1 为 1,采用静态编译,避免安装后so找不到的错误
make && make install
5.2、检查I2C
5.2.1 查看I2C设备
pi@gpio:~/pi/OLED/wiringPi $ i2cdetect -l
i2c-1 i2c bcm2835 I2C adapter I2C adapter
5.2.2 扫描总线并返回总线挂载设备情况
pi@gpio:~/pi/OLED/wiringPi $ i2cdetect -r -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: 20 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- 77
0x20是PCF8974 IO扩展芯片的地址,
0x48是PCF8591 AD/DA转换芯片的地址
0x68是DS3231 RTC时钟芯片的地址
0x77是BMP180压强传感器的地址
5.2.3 i2c tool 控制LED2
Pioneer 600扩展板,LED2接到PCF8574的p4管脚。低电平点亮LED
//读取寄存器
pi@gpio:~/pi/OLED/wiringPi $ i2cget -y 1 0x20
0xff
//P4设置为低电平,点亮LED2
i2cset –y 1 0x20 0xEF
//P7设置为低电平,让蜂鸣器响起了
i2cset -y 1 0x20 0x7f
详细见 Pioneer doc