1 目的

通过golang操作外设硬件,以达到学习golang操作硬件的相关知识。

2 硬件

2.1 树莓派4扩展口引脚定义

引脚定义1 引脚定义2

  • 通用的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等

Pioneer600

更详细请查看相关原理图

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