[经验分享] 【玄铁杯第三届RISC-V应用创新大赛】LicheePi 4A+002系统软件准备

sipower   2023-10-8 23:38 楼主

 

本篇介绍基础软件准备工作。主要从以下几个方面描述。系统镜像烧录,SSH登陆,VNC远程桌面配置,OpenCV安装,USB串口使用。

1、系统镜像烧录

由于LicheePi 4A开发板是内测版,出场自带的系统不是最新的,为了更好地体验开发板,需要重新烧录最新的系统,下面介绍如何给板子重新烧录系统。

1.1、下载镜像

官方提供了百度网盘的下载链接:

https://pan.baidu.com/e/1xH56ZlewB6UOMlke5BrKWQ

1.2、存储目录

下载并解压好后,需要修改burn_lpi4a.bat的内容来适配自己的文件目录。我存储的目录和修改的文件见下图。

233725v35nnnoaym55fe3a.png

1.3、烧录过程

具体烧录镜像过程官方文档介绍的非常详细,照着做就行。参见如下链接:

https://wiki.sipeed.com/hardware/zh/lichee/th1520/lpi4a/4_burn_image.html

我开启了debug串口监视,可以和CMD烧录窗口对比观察进度,刚开始是这样的。

233725b0xsf0jjgj0y1wff.png

烧录完成是这样的:

233725xwefc6k11r4b1oos.png

完成后手动重启,就可以直接进入新版系统,而且是自动登录sipeed账号,比默认版本好用。

2、SSH登陆

新版系统默认开启SSH登陆,基本上不用设置,此处我推荐一款终端工具软件。MobaXterm 是用于远程计算的工具箱,作为一个 Windows 应用程序,它为程序员、网站管理员、IT管理员和几乎所有需要以更简单的方式处理远程工作的用户量身定制了大量功能。MobaXterm 提供了所有重要的远程网络工具(SSH, X11, RDP, VNC, FTP, MOSH,…)和 Unix 命令(bash, ls, cat, sed, grep, awk, rsync,…)。MobaXterm 还有很强的扩展能力,可以集成插件来运行 Gcc, Perl、Curl、Tcl / Tk / Expect 等程序。

具体下载链接如下,下载便携版就很好用。

网址:

https://mobaxterm.mobatek.net/download-home-edition.html

文件链接:

https://download.mobatek.net/2332023092000531/MobaXterm_Portable_v23.3.zip

233725a2fva821228li6iv.png

使用SSH登陆,用户名sipeed,密码licheepi,登录界面如下。

233725ne7qq9ymkozyod8g.png

3、VNC远程桌面配置

3.1、安装依赖

安装需要的软件包,远程桌面使用轻量化的 Xfce 桌面环境。

 sudo apt install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utils

233725sw11s0ocbo0440zj.png

 sudo apt install tigervnc-standalone-server tigervnc-common

233725k1m81ghiae77ae1h.png

安装好之后,输入 vncserver 命令,配置相关密码,系统会提示配置密码,根据自身需要设置,第二个密码用于仅供查看的用户登录:

233725knlonnsru9zlkuob.png

3.2、配置xstartup文件

kill 掉刚刚创建的 VNC 实例,先进行一些配置。xstartup 文件是 TigerVNC 服务器启动时运行的脚本,创建并编辑文件 ~/.vnc/xstartup:

  1. vi ~/.vnc/xstartup

写入下面的内容:

  1. #!/bin/sh
  2. unset SESSION_MANAGER
  3. unset DBUS_SESSION_BUS_ADDRESS
  4. exec startxfce4

并赋予权限

  1. chmod +x ~/.vnc/xstartup

3.3、配置config文件

增加 VNC 服务器的启动参数,创建并编辑“~/.vnc/config”文件,加入需要的启动参数,比如想要设置启动时的分辨率和 dpi,可以写入下面的内容:

  1. geometry=1280x720
  2. dpi=96

以上两个文件搞好后,可以在SSH登陆后,mobaxterm如下界面看到。

233725py3py46de5yp4pde.png

若因为防火墙连接不上 VNC,可以使用 ufw 来添加允许的端口,比如使用 VNC服务器的显示端口5901

  1. sudo apt-get install ufw #第一次需要先安装ufw
  2. sudo ufw allow 5901

233725luzuwg668u41u1a3.png

虽然有报错,但是好像不影响VNC登录。

233725lr2lfqex682i4cbe.jpg

3.4、配置VNC开机自启动

通过Applications->Setting内的Session and Startup菜单打开启动设置:

233725mcieccwvdew4uvgg.png

点击对话框底部的”Add“按钮,添加自启动程序即可。其中, Command栏填写正确最关键。

233725jnbc9wz988zlwn5r.png

如此操作后,由于系统是开机自动登录sipeed账户桌面,就能实现VNC开机自启动了。

4、OpenCV安装

由于我的设计预计会用到OpenCV,就按照官方指导文件安装并测试。

首先安装依赖,以及python3环境

  1. sudo apt install python3 python3-pip
  2. sudo apt install python3-opencv
  3. sudo apt install libqt5gui5-gles

然后使用以下程序读取摄像头并显示出来。

代码1、camtest.py

import cv2

# 打开摄像头
cap = cv2.VideoCapture(0)

# 检查是否成功打开摄像头
if not cap.isOpened():
    print("无法打开摄像头")
    exit()

cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)

# 循环读取摄像头的每一帧图像
while True:
    # 从摄像头中获取一帧图像
    ret, frame = cap.read()

    # 检查是否读取成功
    if not ret:
        print("无法获取图像")
        break

    # 显示图像
    cv2.imshow("USB Camera", frame)

    # 等待按下 ESC 键退出
    if cv2.waitKey(1) == 27:
        break

# 释放摄像头并关闭所有窗口
cap.release()
cv2.destroyAllWindows()

安装成功,运行效果如下图。

233725rxapvoicccico0ii.jpg

5、USB转串口使用

我的设计预计会用到USB转串口,手头小板是CP2102芯片的。把转接线插入LicheePi 4A开发板后,可以从调试串口看到如下信息。

233725fj25t4gcccd2cgte.png

由此可见,开发板此版操作系统是内置CP210X驱动的,而且在设备接入后,自动加载到/dev/ttyUSB0。

计划在Python程序中使用串口连接Arduino外设,所以安装Python串口库。

  1. apt install python3-serial

编写测试代码,进行简单收发,代码如下。

代码2、test_com.py

# 导入模块
import threading
import time
import serial
import serial.tools.list_ports

# 自定义变量
port = "/dev/ttyUSB0"  # 端口号,根据自己实际情况输入,可以在设备管理器查看
bps = 115200     # 串口波特率,根据自己实际情况输入
timeout = 5       # 超时时间,None:永远等待操作,0为立即返回请求结果,其他值为等待超时时间(单位为秒)
rxdata = ''    # 接收的数据

# 扫描端口
def check_uart_port():
    port_list = list(serial.tools.list_ports.comports())
    # print(port_list)
    if len(port_list) == 0:
        print('can not fine uart port')
        return False
    else:
        for i in range(0,len(port_list)):
            print(port_list[i])
    return True

# 打开串口
def open_uart(port, bps, timeout):
    try:
        # 打开串口,并返回串口对象
        uart = serial.Serial(port, bps, timeout=timeout)
        return uart
    except Exception as result:
        print("can not open uart")
        print(result)
        return False

# 发送数据
def uart_send_data(uart, txbuf):
    len = uart.write(txbuf.encode('utf-8'))  # 写数据
    return len

# 接收数据
def uart_receive_data(uart):
    if uart.in_waiting:
        rxdata = uart.read(uart.in_waiting).decode("utf-8")   # 以字符串接收
        # rxdata = uart.read().hex()  # 以16进制(hex)接收
        print(rxdata)  # 打印数据

# 关闭串口
def close_uart(uart):
    uart.close()

# 创建一个线程用来等待串口接收数据
class myThread (threading.Thread):   # 继承父类threading.Thread
    def __init__(self, uart):
        threading.Thread.__init__(self)
        self.uart = uart
    def run(self):                   # 把要执行的代码写到run函数里面 线程在创建后会直接运行run函数
        while True:
            # print("thread_uart_receive")
            uart_receive_data(self.uart)  # 接收数据
            time.sleep(0.01)

# 主函数
def main():
    # 扫描端口
    result = check_uart_port()
    if(result == False):
        return

    # 打开串口
    result = open_uart(port, bps, timeout)
    if (result == False):
        return
    else:
        uart1 = result

    # 创建一个线程用来接收串口数据
    thread_uart = myThread(uart1)
    thread_uart.start()

    while True:
        # 定时发送数据
        txbuf = "hello world\r\n"
        len = uart_send_data(uart1, txbuf)
        print("send len: ", len)
        time.sleep(3)

# 启动主函数
main()

我这测试用了两个CP2102小板,一个接开发板,一个接PC机,串口交叉相连。运行测试程序。

  1. sudo python3 test_com.py

测试效果如下图,开发板每隔3秒发送一次"hello world",在PC机上可以收到,PC机随便发一些字符,开发板也能收到,串口测试通过。

233725n2kq1ekiozkz7j44.png

6、总结

通过以上操作,基本把系统常用工具和硬件外设准备完成,经过简单测试都能正常工作,为下一步任务打好基础。

本帖最后由 sipower 于 2023-10-8 23:40 编辑

回复评论 (1)

用VNC还是挺方便的,我回去也学习一下先。

点赞  2023-10-9 10:39
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复