40pin IO开发
实验01——GPIO 输出(LED灯闪烁)
硬件连接
将LED灯泡,分别与RDK-X5主板的VCC、GND、IO37连接
软件运行
进入用户主目录,运行
cd usersudo python3 ./LED_out.py
终端如图所示:

此时可以发现LED灯泡以一秒的间隔开始闪烁。
#!/usr/bin/env python3
import sys
import signal
import Hobot.GPIO as GPIO
import time
def signal_handler(signal, frame):
sys.exit(0)
# 定义使用的GPIO通道为37
output_pin = 37 # BOARD 编码 37
def main():
# 设置管脚编码模式为硬件编号 BOARD
GPIO.setmode(GPIO.BOARD)
# 设置为输出模式,并且初始化为高电平
GPIO.setup(output_pin, GPIO.OUT, initial=GPIO.HIGH)
# 记录当前管脚状态
curr_value = GPIO.HIGH
print("Starting demo now! Press CTRL+C to exit")
try:
# 间隔1秒时间,循环控制LED灯亮灭
while True:
time.sleep(1)
GPIO.output(output_pin, curr_value)
curr_value ^= GPIO.HIGH
finally:
GPIO.cleanup()
if __name__=='__main__':
signal.signal(signal.SIGINT, signal_handler)
main()实验02——GPIO 输入
硬件连接
将按键电路与IO37连接(可使用杜邦线代替按键)
软件运行
进入用户主目录,运行
cd usersudo python3 ./GPIO_input.py
终端如图所示:

此时可以发现按下按键时终端输出低电平,松开按键后终端输出高电平。
#!/usr/bin/env python3
import sys
import signal
import Hobot.GPIO as GPIO
import time
def signal_handler(signal, frame):
sys.exit(0)
# 定义使用的GPIO通道为37
input_pin = 37 # BOARD 编码 37
GPIO.setwarnings(False)
def main():
prev_value = None
# 设置管脚编码模式为硬件编号 BOARD
GPIO.setmode(GPIO.BOARD)
# 设置为输入模式
GPIO.setup(input_pin, GPIO.IN)
print("Starting demo now! Press CTRL+C to exit")
try:
while True:
# 读取管脚电平
value = GPIO.input(input_pin)
if value != prev_value:
if value == GPIO.HIGH:
value_str = "HIGH"
else:
value_str = "LOW"
print("Value read from pin {} : {}".format(input_pin, value_str))
prev_value = value
time.sleep(1)
finally:
GPIO.cleanup()
if __name__=='__main__':
signal.signal(signal.SIGINT, signal_handler)
main()实验03——按键控制 LED 亮灭
硬件连接
将按键电路与IO37连接(可使用杜邦线代替按键),LED灯泡与IO31连接
软件运行
进入用户主目录,运行
cd usersudo python3 ./button_led.py
终端如图所示:

此时可以发现按下按键时IO31输出低电平,松开按键后IO31输出高电平。(LED亮灭)
#!/usr/bin/env python3
import sys
import signal
import Hobot.GPIO as GPIO
import time
def signal_handler(signal, frame):
sys.exit(0)
# 定义使用的GPIO通道:
# led_pin作为输出,可以点亮一个LED
# but_pin作为输入,可以接一个按钮
led_pin = 31 # BOARD 编码 31
but_pin = 37 # BOARD 编码 37
# 禁用警告信息
GPIO.setwarnings(False)
def main():
prev_value = None
# Pin Setup:
GPIO.setmode(GPIO.BOARD) # BOARD pin-numbering scheme
GPIO.setup(led_pin, GPIO.OUT) # LED pin set as output
GPIO.setup(but_pin, GPIO.IN) # Button pin set as input
# Initial state for LEDs:
GPIO.output(led_pin, GPIO.LOW)
print("Starting demo now! Press CTRL+C to exit")
try:
while True:
curr_value = GPIO.input(but_pin)
if curr_value != prev_value:
GPIO.output(led_pin, curr_value)
prev_value = curr_value
print("Outputting {} to Pin {}".format(curr_value, led_pin))
time.sleep(1)
finally:
GPIO.cleanup() # cleanup all GPIO
if __name__ == '__main__':
signal.signal(signal.SIGINT, signal_handler)
main()实验04——PWM 输出
硬件连接
将舵机/电机/示波器与IO33连接(X5主板支持IO32、IO33两路PWM输出)
软件运行
进入用户主目录,运行
cd usersudo python3 ./PWM_out.py
终端如图所示:
可以看出:初始占空比 25%, 先每 0.25 秒增加 5%占空比,达到 100%之后再每 0.25 秒减少 5%占空比
#!/usr/bin/env python3
import sys
import signal
import Hobot.GPIO as GPIO
import time
def signal_handler(signal, frame):
sys.exit(0)
# 支持PWM的管脚: 32 and 33, 在使用PWM时,必须确保该管脚没有被其他功能占用
output_pin = 33
GPIO.setwarnings(False)
def main():
# Pin Setup:
# Board pin-numbering scheme
GPIO.setmode(GPIO.BOARD)
# 支持的频率范围: X3: 48KHz ~ 192MHz X5: 0.05HZ ~ 100MHZ
p = GPIO.PWM(output_pin, 48000)
# 初始占空比 25%, 先每0.25秒增加5%占空比,达到100%之后再每0.25秒减少5%占空比
val = 25
incr = 5
p.ChangeDutyCycle(val)
p.start(val)
print("PWM running. Press CTRL+C to exit.")
try:
while True:
time.sleep(0.25)
if val >= 100:
incr = -incr
if val <= 0:
incr = -incr
val += incr
p.ChangeDutyCycle(val)
finally:
p.stop()
GPIO.cleanup()
if __name__ == '__main__':
signal.signal(signal.SIGINT, signal_handler)
main()实验05——串口输出
硬件连接
回环测试: 把 TXD 和 RXD 在硬件上进行连接,然后运行测试程序,进行写和读操作,预期结果是读出的数据要完全等于写入的数据
硬件连接: 把 TXD 和 RXD 通过跳线帽直接硬件上连接在一起:

软件运行
(1)从打印的串口设备(其中 /dev/ttyS0 是系统调试口,不建议对它进行测试,除非你完全明白它的作用)中选择总线号和片选号作为输入选项,RDK X5 选择测试 /dev/ttyS1,并输入波特率参数:
(2)进入用户主目录,运行
cd usersudo python3 ./test_serial.py

#!/usr/bin/env python3
import sys
import signal
import os
import time
# 导入python串口库
import serial
import serial.tools.list_ports
def signal_handler(signal, frame):
sys.exit(0)
def serialTest():
print("List of enabled UART:")
os.system('ls /dev/tty[a-zA-Z]*')
uart_dev= input("请输出需要测试的串口设备名:")
baudrate = input("请输入波特率(9600,19200,38400,57600,115200,921600):")
try:
ser = serial.Serial(uart_dev, int(baudrate), timeout=1) # 1s timeout
except Exception as e:
print("open serial failed!\n")
print(ser)
print("Starting demo now! Press CTRL+C to exit")
while True:
test_data = "AA55"
write_num = ser.write(test_data.encode('UTF-8'))
print("Send: ", test_data)
received_data = ser.read(write_num).decode('UTF-8')
print("Recv: ", received_data)
time.sleep(1)
ser.close()
return 0
if __name__ == '__main__':
signal.signal(signal.SIGINT, signal_handler)
if serialTest() != 0:
print("Serial test failed!")
else:
print("Serial test success!")实验06——IIC 实验
软件运行:(RDK X5 在 40PIN 上默认使能 I2C5(物理管脚号 3 和 5)和 I2C0(物理管脚号 27 和 28),IO电压3.3V。)
进入用户主目录,运行
cd usersudo python3 ./test_i2c.py
终端打印信息如下:

#!/usr/bin/env python3
import sys
import signal
import os
import time
# 导入i2cdev
from i2cdev import I2C
def signal_handler(signal, frame):
sys.exit(0)
def i2cdevTest():
# device, bus = 0x51, 0
bus = input("Please input I2C BUS num:")
os.system('i2cdetect -y -r ' + bus)
device = input("Please input I2C device num(Hex):")
print("Read data from device %s on I2C bus %s" % (device, bus))
i2c = I2C(eval("0x" + device), int(bus))
value = i2c.read(1)
i2c.write(value)
print("read value=", value)
i2c.close()
if __name__ == '__main__':
signal.signal(signal.SIGINT, signal_handler)
print("Starting demo now! Press CTRL+C to exit")
print("List of enabled I2C controllers:")
os.system('ls /dev/i2c*')
while True:
i2cdevTest()实验07——SPI 实验
RDK X5 在 40PIN 上物理管脚 19, 21, 23, 24, 26引出了芯片的 SPI1 总线,支持两个片选,IO电压3.3V。
回环测试: 把 MISO 和 MOSI 在硬件上进行连接,然后运行 SPI 测试程序,进行写和读操作,预期结果是读出的数据要完全等于写入的数据
硬件连接
把 MISO (IO19)和 MOSI(IO21) 通过跳线帽直接硬件上连接在一起:

软件运行
进入用户主目录,运行
cd usersudo python3 ./test_spi.py
从打印的spi控制器中选择总线号和片选号作为输入选项,例如选择测试 spidev0.0,则bus num 和 cs num都是0,按回车键确认:
终端如图所示:

程序正确运行起来后会持续打印 0x55 0xAA,如果打印的是 0x00 0x00,那么就说明spi的回环测试失败。
终端如图所示:
#!/usr/bin/env python3
import sys
import signal
import os
import time
# 导入spidev模块
import spidev
def signal_handler(signal, frame):
sys.exit(0)
def BytesToHex(Bytes):
return ''.join(["0x%02X " % x for x in Bytes]).strip()
def spidevTest():
# 设置spi的bus号(0, 1, 2)和片选(0, 1)
spi_bus = input("Please input SPI bus num:")
spi_device = input("Please input SPI cs num:")
# 创建spidev类的对象以访问基于spidev的Python函数。
spi=spidev.SpiDev()
# 打开spi总线句柄
spi.open(int(spi_bus), int(spi_device))
# 设置 spi 频率为 12MHz
spi.max_speed_hz = 12000000
print("Starting demo now! Press CTRL+C to exit")
# 发送 [0x55, 0xAA], 接收的数据应该也是 [0x55, 0xAA]
try:
while True:
resp = spi.xfer2([0x55, 0xAA])
print(BytesToHex(resp))
time.sleep(1)
except KeyboardInterrupt:
spi.close()
if __name__ == '__main__':
signal.signal(signal.SIGINT, signal_handler)
print("List of enabled spi controllers:")
os.system('ls /dev/spidev*')
spidevTest()