初始化与GPIO开发
建立连接#
将Jetson和计算机用网线连接起来。
在网络共享中心中共享当前的网络到以太网。如果不确定是哪个网口,可以先把Jetson开机,出现的未知网络就是Jetson。连接后,Jetson界面上将会出现已连接标识。
安装Anaconda、Pycharm等过程不再赘述。创建虚拟环境。PIP安装Jetson.GPIO。
配置环境#
在Pycharm里导入Anaconda环境。若提示没有解释器,先在你的终端中使用conda env list命令(无所谓是否激活环境),查看base环境的位置(一般为用户名/miniforge3)。在目录下的bin文件夹中可以找到conda可执行文件。随后选择“加载环境”即可。
测试GPIO功能#
经过测试,由于我并没有使用官方的载板,而是使用了第三方的载板。既然无法使用Jetson.GPIO库。这时候就需要必须使用其他方法。我们需要先参考载板的用户手册。比如我使用的是RTSO-9003。用户手册在官网旧版资料库中可以找到。
我的载板使用了非标准的24PIN的IO接口,和官方的40PIN不同。如果你的载板虽然为第三方定制,但使用了标准40PIN接口,那还是推荐你使用Jetson.GPIO库。如果不是,你也许可以使用我开源的XyGPIO库。(不一定写完了)
目前引出的GPIO接口为388、298、480和486。前面两个GPIO口也在官方40P配置中引出,但仍然无法载入Jetson GPIO配置。幸好,Linux原生支持GPIO接口Sysfs。(Windows从8开始也支持哦,遇到Win IoT的开发板也可以先试试用OS)
操作Sysfx需要管理员权限。我们启动终端。参考python - Linux如何进行GPIO读写操作的? - 开发者之家 - SegmentFault 思否。我们需要先使用EXPORT功能将Linux开放给操作层。注意,这个操作是临时的,每次重启系统都需要重复这个操作。
功能接口都在/sys/class/gpio。开放接口的命令为echo [映射号] > /sys/class/gpio/export。我们在文件管理器中打开功能接口路径,顺利的话可以发现GPIO[映射号]这个文件夹。
如果你在配置之前提前打开了这个文件夹,可能无法看到变化。需要重新打开。

我们打开对应的文件夹,看到以下内容。

我们主要对Direction、Value进行操作。
Direction可装入in或者out来控制IO口的输入/输出功能。你可以直接修改这个文件来达到效果,命令如下:
echo in/out > /sys/class/gpio/gpio[映射号]/direction
我们将目标引脚和示波器相连,可以看到设置的瞬间,引脚从默认3.3V电压降为0V。

注意连接时,请将杜邦线插在接口上而不是直接使用夹口夹住,测量时找到GND引脚位置。

接下来测试GPIO的基础功能。通过更改value中的内容可以实现。命令如下:
echo 1 > /sys/class/gpio/gpio[映射号]/value

可以看见示波器示数变为3.3V。
自动化#
我们可以看到,GPIO操作的本质是文件操作。这一步我们在Python中也可以实现。
注意,调用程序测试环节需要将sysfs映射口改为你的设备映射。
def writeBit(IOnum, value, DebugFlag = False):
os.system(f'echo {value} > /sys/class/gpio/gpio{IOnum}/value')
if DebugFlag:
print(f"XyGPIO:WriteBit:{value} into {IOnum}")我们调用程序writeBit(298, 0)。可见示波器示数归为0。这个函数会包含在XyGPIO库中。
不用急着将另一个端口通过命令切换为输入模式。我们可以顺便进行模式设置的自动化。
def setMode(IOnum, mode, DebugFlag = False):
os.system(f'echo {mode} > /sys/class/gpio/gpio{IOnum}/direction')
if DebugFlag:
print(f'XyGPIO SetIO:{IOnum} as {mode}')使用setMode(388, 'in')进行测试。示波器不会发生变化,我们需要使用命令看看设置是否成功。
cat /sys/class/gpio/gpio388/direction
出现如下提示,证明成功

使用命令cat /sys/class/gpio/gpio388/value查看此时的探针值。应该是1。
我们使用示波器参考口的鳄鱼夹将GND和配置的端口夹在一起,再查看探针。此时应该为0。
我们继续读取的自动化.
def readBit(IOnum, DebugFlag = False):
value = os.popen(f'cat /sys/class/gpio/gpio{IOnum}/value').read()
value = int(value)
if DebugFlag:
print(f"XyGPIO:ReadBit:{value} in {IOnum}")
return value使用测试程序readBit(388, 1),可以直接从终端得到结果XyGPIO:ReadBit:0 in 388。和命令读取内容一致。
我们一共还有两个口未进行设置。我们将EXPORT功能也进行自动化。
def exportIO(IOnum, MessageFlag = True):
os.system(f'echo {IOnum} > /sys/class/gpio/export')
if os.path.exists(f'/sys/class/gpio/gpio{IOnum}/value'):
if MessageFlag:
print(f"XyGPIO exported at {IOnum}")
else:
print("XyGPIO:Failed To Export! Are you sure port exists?")使用exportIO(480)进行测试。
然后我们可以在对应路径下找到gpio480文件夹。若出现sh: echo: I/O error错误,说明这个端口已经导出过了。
我们还可以继续进行自动化。
def initIO(IOnum, mode):
exportIO(IOnum, 0)
setMode(IOnum, mode)至此,我们的基础功能测试完毕。注意,export操作虽然有对应的逆操作unexport,但不建议使用这个功能。它会强制重启设备。我们编写测试程序,将示波器引脚鳄鱼夹和探针断开,重启设备测试整个流程。
if __name__ == "__main__":
initIO(388, 'in')
initIO(298, 'out')
time.sleep(3)
writeBit(298, 1, True)
readBit(388, True)得到如下运行结果:
