40-PIN 功能测试
GPIO
GPIO 简介
通用输入/输出(GPIO)是集成电路或电子电路(如 MCU/MPU)电路板上的非专用数字信号引脚,可用作输入或输出,或同时用作输入和输出,并可由软件控制。
准备
- 一块 Radxa ROCK 5T
- 一个 LED 灯
连接
如图所示,连接 Radxa ROCK 5T 的 PIN_27
测试
输入测试
将 27 接地或者接 3.3V,
radxa@rock-5t:~$ gpioget gpiochip4 22
如果接的是地,该命令输出 0,如果接的是 3.3V,该命令输出 1。
输出测试
radxa@rock-5t:~$ sudo gpioset -m signal $(sudo gpiofind PIN_27)=0 # 输出低电平, Led 灭 radxa@rock-5t:~$ sudo gpioset -m signal $(sudo gpiofind PIN_27)=1 # 输出高电平, Led 亮
提示
同一个 GPIO 不允许被两个进程同时使用,否则会提示资源占用。 因此,需要手动按下 'Ctrl + C' 终止后,才可以执行第二个命令。
I2C
I2C 简介
I2C(Inter-Integrated Circuit;发音为 "eye-squared-see "或 "eye-two-see"),又称 I2C 或 IIC,是飞利浦半导体公司于 1982 年发明的一种同步、多控制器/多目标(历史上称为主/从)、单端、串行通信总线。
准备
- 一块 Radxa ROCK 5T
- 一个 OLED
开启 Overlay
请参照设备树配置启用 I2C 相关 Overlay, eg: "Enable I2C8-M2"。
连接
按照以下方式连接 Radxa ROCK 5T 和 OLED
Radxa ROCK 5T | <--> | OLED |
---|---|---|
PIN_5 | <--> | SCL |
PIN_3 | <--> | SDA |
PIN_1 | <--> | VCC |
PIN_9 | <--> | GND |
测试
-
打开终端,在终端中输入以下命令安装 python3-periphery 的 Python 库
-
新建一个名为 Oled.py Python 文件,并将以下代码粘贴到该文件中:
Oled.py
from periphery import I2C
import time
I2C_ADDR = 0x3c
I2C_BUS = "/dev/i2c-8"
i2c = I2C(I2C_BUS)
# SSD1306 init_cmds
init_cmds = [
0xAE, # Display off
0x00, # Set lower column address
0x10, # Set higher column address
0x40, # Set display start line
0xB0, # Set page address
0x81, # Set contrast control
0xCF,
0xA1, # Set segment remap
0xA6, # Normal display
0xA8, # Set multiplex ratio
0x3F,
0xC8, # Set COM output scan direction
0xD3, # Set display offset
0x00,
0xD5, # Set display clock divide ratio/oscillator frequency
0x80,
0xD9, # Set pre-charge period
0xF1,
0xDA, # Set COM pins hardware configuration
0x12,
0xDB, # Set VCOMH deselect level
0x40,
0x8D, # Enable charge pump regulator
0x14,
0xAF # Display on
]
for cmd in init_cmds:
i2c.transfer(I2C_ADDR, [I2C.Message([0x00, cmd])])
def oled_clear():
for page in range(8):
i2c.transfer(I2C_ADDR, [I2C.Message([0x00, 0xB0 + page])])
i2c.transfer(I2C_ADDR, [I2C.Message([0x00, 0x00])])
i2c.transfer(I2C_ADDR, [I2C.Message([0x00, 0x10])])
for _ in range(128):
i2c.transfer(I2C_ADDR, [I2C.Message([0x40, 0x00])])
char_map = {
"H": [0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F,],
"R": [0x00, 0x7F, 0x09, 0x19, 0x29, 0x46],
"e": [0x00, 0x38, 0x54, 0x54, 0x54, 0x18],
"l": [0x00, 0x00, 0x41, 0x7F, 0x40, 0x00],
"o": [0x00, 0x38, 0x44, 0x44, 0x44, 0x38],
"r": [0x00, 0x7C, 0x08, 0x04, 0x04, 0x08],
"a": [0x00, 0x20, 0x54, 0x54, 0x54, 0x78],
"d": [0x00, 0x38, 0x44, 0x44, 0x48, 0x7F],
"x": [0x00, 0x44, 0x28, 0x10, 0x28, 0x44]
}
def string_to_bytes(string):
bytes_list = []
for char in string:
bytes_list.extend(char_map.get(char, [0x00] * 4))
bytes_list.append(0x00)
return bytes_list
oled_clear()
hello_world_bytes = string_to_bytes("Hello Radxa")
i2c.transfer(I2C_ADDR, [I2C.Message([0x00, 0xB0])])
i2c.transfer(I2C_ADDR, [I2C.Message([0x00, 0x00])])
i2c.transfer(I2C_ADDR, [I2C.Message([0x00, 0x10])])
for byte in hello_world_bytes:
i2c.transfer(I2C_ADDR, [I2C.Message([0x40, byte])])
i2c.close()
提示
该脚本仅为示例,需要根据实际修改变量 I2C_BUS
- 在终端中,执行以下命令进行测试
sudo python3 Oled.py
执行完以上命令后,Oled 会显示 "Hello, Radxa" 的字符
PWM
PWM 简介
脉宽调制(PWM)是一种调制技术,可产生可变宽度的脉冲来表示模拟输入信号的幅度。 对于高振幅信号,输出开关晶体管更多时间处于导通状态,而对于低振幅信号,输出开关晶体管更多时间处于关断状态。