OrangePi AIpro

简介

img

OrangePi AIpro(8T)采用昇腾AI技术路线,具体为4核64位处理器+AI处理器,集成图形处理器,支持8TOPS AI算力,拥有8GB/16GB LPDDR4X,可以外接32GB/64GB/128GB/256GB eMMC模块,支持双4K高清输出。 Orange Pi AIpro引用了相当丰富的接口,包括两个HDMI输出、GPIO接口、Type-C电源接口、支持SATA/NVMe SSD 2280的M.2插槽、TF插槽、千兆网口、两个USB3.0、一个USB Type-C 3.0、一个Micro USB(串口打印调试功能)、两个MIPI摄像头、一个MIPI屏等,预留电池接口,可广泛适用于AI边缘计算、深度视觉学习及视频流AI分析、视频图像分析、自然语言处理、智能小车、机械臂、人工智能、无人机、云计算、AR/VR、智能安防、智能家居等领域,覆盖 AIoT各个行业。 Orange Pi AIpro支持Ubuntu、openEuler操作系统,满足大多数AI算法原型验证、推理应用开发的需求。

开发板的硬件规格

img

开发板的顶层视图和底层视图

顶层视图

img

底层视图

img

开发板的接口详情图

img


img


img

开发板40 pin UART 测试

开发板 40 pin 接口引脚的功能如下表所示, 其中标红部分的引脚具有 uart 功能,并且 Linux 系统默认配置为了 uart 功能, 可以直接使用。 另外请注意 uart0 默认设置为调试串口功能, 请不要将其当成普通串口使用。

img


启动 Linux 系统后, 先确认下/dev 下存在 uart 的设备节点。

(base) root@orangepiaipro:~#  ls /dev/ttyAMA*
/dev/ttyAMA0  /dev/ttyAMA1  /dev/ttyAMA2
(base) root@orangepiaipro:~# 

uart 设备节点和 uart 对应关系如下所示:

img


然后开始测试 uart 接口, 先使用杜邦线短接要测试的 uart 接口的 rx 和 tx 引脚。不同的 uart 的 rx 和 tx 引脚对应的 40 pin 接口中的引脚如下所示:

img


img


img


绿色线短接的uart2、蓝色线短接的是uart7
然后进入串口测试程序的路径。

(base) root@orangepiaipro:/opt/opi_test# cd /
(base) root@orangepiaipro:/# cd /opt/opi_test/uart/
(base) root@orangepiaipro:/opt/opi_test/uart# ls
serial  serial.c

串口测试程序 serial 的使用方法如下所示:

(base) root@orangepiaipro:/opt/opi_test/uart# ./serial 
Usage: ./serial <serialport>

使用 serial 测试程序可以测试下串口的自收自发。 serial 程序会打开对应的串口发送一个字符串——Hello, Serial Port!, 然后打印接收到的字符串。 如果自发自收的字符串相同, 说明测试成功。

  1. uart2 测试命令如下所示:
    (base) root@orangepiaipro:/opt/opi_test/uart# ./serial /dev/ttyAMA1
    W: Hello, Serial Port!
    R: Hello, Serial Port!
    
  2. uart7 测试命令如下所示:
    (base) root@orangepiaipro:/opt/opi_test/uart# ./serial /dev/ttyAMA2
    W: Hello, Serial Port!
    R: Hello, Serial Port!
    

    开发板40 pin GPIO 测试

    开发板 40 pin 接口引脚的功能如下表所示, 其中标红部分的引脚默认配置为GPIO 功能, 可以直接使用, 其他具有 GPIO 复用功能的引脚需要修改 DTS 配置才能正常使用 GPIO 的功能。

    img


    img


    Linux 镜像中预装了 gpio_operate 工具用于设置 GPIO 管脚的输入与输出方向,也可将每个 GPIO 管脚独立的设为 0 或 1。 gpio_operate 工具的详细使用方法如下所示:
  3. gpio_operate 工具必须使用 root 帐号执行。
  4. gpio_operate -h 命令可以获取 gpio_operate 工具的帮助信息:
(base) root@orangepiaipro:/# gpio_operate -h
Usage: gpio_operate <Command|-h> [Options...]
gpio_operate Command:
        -h                              : This command's help information.
        set_value                       : Set gpio pin value.
        get_value                       : Get gpio pin value.
        set_direction                   : Set gpio pin direction value.
        get_direction                   : Get gpio pin direction value.
(base) root@orangepiaipro:/#
  1. gpio_operate get_direction gpio_group gpio_pin 用于查询 GPIO 管脚方向。
  1. gpio_group 和 gpio_pin 参数说明如下所示:

    img

  2. 比如 40 pin 中的第 31 号引脚对应的 GPIO 为 GPIO2_20, 那么其 GPIO组号为 2, GPIO 管脚号为 20, 获取其方向的命令为:
    (base) root@orangepiaipro:~# gpio_operate get_direction 2 20
    Get gpio pin direction value successed, value is 0.
    (base) root@orangepiaipro:~# 
    
  3. 输出的打印信息说明

    img

  1. gpio_operate set_direction gpio_group gpio_pin direction 用于设置 GPIO 管脚方向。
  1. gpio_group、 gpio_pin 和 direction 参数说明如下所示 :

    img

  2. 比如 40 pin 中的第 31 号引脚对应的 GPIO 为 GPIO2_20, 那么其 GPIO组号为 2, GPIO 管脚号为 20, 设置其方向为输出的命令为:
    (base) root@orangepiaipro:~#  gpio_operate set_direction 2 20 1
    Set gpio pin direction value successed.
    (base) root@orangepiaipro:~# 
    
  1. gpio_operate get_value gpio_group gpio_pin 命令用于查询 GPIO 管脚值
  1. gpio_group 和 gpio_pin 参数说明如下所示:

    img

  2. 比如 40 pin 中的第 31 号引脚对应的 GPIO 为 GPIO2_20, 那么其 GPIO组号为 2, GPIO 管脚号为 20, 查询其管脚值的命令如下所示:
(base) root@orangepiaipro:~#  gpio_operate get_value 2 20
Get gpio pin value successed, value is 0. #这里查询到的值为 0, 也就是低电平
(base) root@orangepiaipro:~# 
  1. gpio_operate set_value gpio_group gpio_pin value 命令用于设置 GPIO 管脚值为高电平或者低电平, 注意设置管脚值前, 请确保已将 GPIO 管脚的方向设置为输出了。
  1. gpio_group、 gpio_pin 和 value 参数说明如下所示:

    img

  2. 比如 40 pin 中的第 31 号引脚对应的 GPIO 为 GPIO2_20, 那么其 GPIO组号为 2, GPIO 管脚号为 20, 设置其输出为高电平的命令为:
(base) root@orangepiaipro:~# gpio_operate set_value 2 20 1
Set gpio pin value successed.
(base) root@orangepiaipro:~# 

img

关机和重启开发板的方法

  1. 在 Linux 系统运行的过程中, 如果直接拔掉电源断电, 可能会导致文件系统丢失某些数据, 建议断电前先使用 poweroff 命令关闭开发板的 Linux 系统, 然后再拔掉电源。
    (base) root@orangepiaipro:~# poweroff
    
  2. 除了 poweroff 命令可以关闭 Linux 系统外, 还可以使用开发板上的关机按键来关闭开发板的 Linux 系统, 然后再拔掉电源。 请注意, 关机按键是没有开机功能的。

    img

  3. 使用 reboot 命令即可重启开发板中的 Linux 系统。
    (base) root@orangepiaipro:~# reboot
    

测评实验内容

这里基于OrangePi AIpro + 4.3寸电子纸屏 + ESP8266开发款电子纸屏时钟,成品图如下:

开机动画

img

运行时钟

img

显示 OrangePi AIpro CPU 实时温度

img


这里为了美观,减少一堆的接线, OrangePi AIpro与电子墨水屏之间的通信采用的是无线串口通信的方式,485温湿度传感器与OrangePi AIpro也是采用无线通信的方式。编程语言基于Erlang,开发框架基于emqx,这里基于emqx搭建MQTT服务器,简单期间同时对emqx进行二次开发,集成驱动电子纸墨水屏时钟运转的驱动程序。这里涉及到所有软件程序都在OrangePi AIpro部署运行。下面将对开发搭建过程中涉及到的所有内容进行详细介绍。

img

所用的硬件

● OrangePi AIpro
● 4.3寸串口电子墨水屏
● ESP8266 WIFI模块
● RS485温湿度传感器
● RS485转WIFI串口服务器模块
● 竹木抽纸盒

硬件连接

4.3寸串口电子墨水屏ESP8266 WIFI模块
DINTX(D4)
DOUTWAKE(D8)
GNDG
VCCVV

img

实物接线图↑
RS485温湿度传感器RS485转WIFI串口服务器模块
AA
BB
VCCC
GNDD

img


实物接线图↑

所用的软件

● JDK > 1.8
● Erlang 26.2.3
● Emqx > v5.6.0
● Arduino IDE
● 串口调试助手

登录香橙派

第一次使用在不知道IP的情况下可以通过串口登录

  1. 首先需要准备一根 Micro USB 接口的数据线

    img

  2. 然后将 Micro USB 接口一端插入开发板的 Micro USB 接口中。

    img

  3. 再将数据线的另一端插入电脑的 USB 接口中即可。

  4. 打开电脑上的设备管理器查看一下端口号。

    img

  5. 打开电脑上的串口调试助手。
    ● 端口选择:COM3
    ● 波特率选择:115200

    img


    看到登录界面时, 就可以使用下面的账号和密码来登录 Linux 系统了

    img

  6. 用串口调试助手不是很方便,这里我们输入:ifconfig 指令查询一下系统的IP地址,然后改为使用SSH工具连接,这里使用FinalShell。

img

  1. 这里改为以SSH远程登录系统

img

安装JDK 1.8

源码安装Erlang 需要依赖Java所以这里我们需要安装一下JDK。

1. 下载JDK

下载地址:Java Archive Downloads - Java SE 8u211 and later

img

2. 下载完成后上传至香橙派

img

3. 安装
  • 解压
tar -zxvf jdk-8u401-linux-aarch64.tar.gz
  • 安装
mv jdk1.8.0_401 /usr/local/jdk1.8/
  • 配置环境变量
vim /etc/profile
  • 在打开的文件末尾添加
export JAVA_HOME=/usr/local/jdk1.8
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

img

  • 刷新环境变量
source /etc/profile
  • 查看JDK版本
java -version

img


至此JDK 1.8 已安装完成。

安装Erlang 26.2.5

Emqx是基于erlang进行开发的。
这里使用 Kerl 安装及管理 Erlang。https://github.com/kerl/kerl

1. 安装依赖
sudo apt-get update
sudo apt-get install make 
sudo apt-get install build-essential
sudo apt-get install m4 
sudo apt-get install rsync 
sudo apt-get install lrzsz 
sudo apt-get install bc 
sudo apt-get install sysstat 
sudo apt-get install lsof 
sudo apt-get install wget 
sudo apt-get install automake 
sudo apt-get install autoconf
sudo apt-get install libssl-dev
sudo apt-get install libreadline-dev
sudo apt-get install libncurses5-dev
sudo apt-get install xsltproc
sudo apt-get  install libxml2-utils
sudo apt-get install unixodbc unixodbc-dev
sudo apt-get install libtool
sudo apt-get install libxml2-utils  xsltproc fop
sudo apt install libwxbase3.0-dev
sudo apt-get install mesa*
sudo apt-get install tk
2. 安装 kerl
  • 安装位置
mkdir /home/SummerGao/kerl && cd /home/SummerGao/kerl
  • 下载kerl
curl -O https://raw.githubusercontent.com/kerl/kerl/master/kerl
  • 修改执行权限
    chmod a+x kerl
    
  • 配种环境变量
vim /etc/profile
  • 在打开的文件末尾添加
export KERL_HOME=/home/SummerGao/kerl
export PATH=${KERL_HOME}/:$PATH

img

  • 刷新环境变量
source /etc/profile
  • 查看kerl版本
kerl version

img


至此kerl已安装完成。

3. 安装Erlang

  • 更新可用的已发布版本
kerl update releases

img

  • 构建 26.2.5
kerl build 26.2.5 26.2.5

img


构建需要一段时间请耐心等待

  • 查询已构建版本
kerl list builds

img

  • 状态查看
kerl status

img

  • 安装 26.2.5
kerl install 26.2.5 ~/kerl/26.2.5

img

  • 显示已安装版本
kerl list installations

img

  • 激活26.2.5
. /root/kerl/26.2.5/activate

激活将备份您的 $ PATH,并将其添加到安装的 bin / 目录中。因此,它仅对当前 shell 会话有效,直到您激活另一个安装或调用 kerl_deactivate。

  • 查看已激活的 Erlang 版本
    kerl active
    

    img

  • 运行 erl
erl

img


至此Erlang已安装完成。

4. 安装Erlang 串口驱动

如果想直接通过香橙派AIPro的串口驱动电子纸屏,需要为Erlang安装一下串口驱动,如果使用ESP8266模块借助MQTT通信实现无线连接香橙派AIPro下面的步骤可跳过。

  • 下载驱动
git clone https://github.com/tonyg/erlang-serial.git

这是一个带有 erlang 驱动程序的用于串行通信的端口程序,最初由 Johan Bevemyr 于 1996 年编写,从 2007 年起由 Tony Garnock-Jones 偶尔维护。

  • 修改Makefile
. /root/kerl/26.2.5/activate

cd erlang-serial/

FULL_INSTALL_DIR=$(DESTDIR)/erlang/lib/$(INSTALL_DIR)__ 调整为:

FULL_INSTALL_DIR=$(DESTDIR)/$(INSTALL_DIR)

这样可以完全按照我们自己指定的路径位置安装

img

  • 安装
make

DESTDIR=/root/kerl/26.2.5/lib make install

img

  • 测试

img


看到已经成功安装到了erlang 的lib 包下,然后运行一下看一下

Erlang/OTP 26 [erts-14.2.5] [source] [64-bit] [smp:4:3] [ds:4:3:10] [async-threads:1] [jit]

Eshell V14.2.5 (press Ctrl+G to abort, type help(). for help)
1> serial:start().
<0.92.0>
2>

至此erlang串口驱动已安装成功。

安装Arduino IDE、下载MQTT转串口驱动程序至ESP8266 WIFI模块

编译ESP8266 WIFI模块驱动程序使用。

1. 下载 ArduinoIDE
git clone git@github.com:technologiescollege/ArduinoTechnoEduc.git
2. 配置 ArduinoIDE

● 安装ESP8266开发包 ESP8266 Arduino Core’s documentation!
● 安装 PubSubClient MQTT集成包

img

  • 选择开发板类型

img

3. 编译及下载程序至ESP8266WIFI模块

在IDE中打开 mqtt_to_serial_wifi_multi.ino 编译,然后选择端口号,下载至WIFI模块。

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <ESP8266WiFiMulti.h>

//WiFi相关配置,候选Wifi
const char* ssid_1 = "SummerGao1"; //WiFi名称
const char* password_1 = "123456";//WiFi密码
const char* ssid_2 = "SummerGao2"; //WiFi名称
const char* password_2 = "123456";//WiFi密码
const char* ssid_3 = "SummerGao3"; //WiFi名称
const char* password_3 = "123456";//WiFi密码
//MQTT Client相关配置
const char* mqtt_server = "localhost"; //MQTT服务器地址
const char* mqtt_username = "SummerGao"; //MQTT用户名
const char* mqtt_password = "123456"; //MQTT密码
const char* TOPIC = "home/devices/onoff/"; // 订阅消息主题
const char* TOPIC_WAKEUP = "home/devices/wake_up/"; // 订阅消息主题
const char* client_id = "clientId-ApjJZcy2024Dh";  // 标识当前设备的客户端编号

// WiFi connect timeout per AP. Increase when connecting takes longer.
const uint32_t connectTimeoutMs = 5000;
ESP8266WiFiMulti wifiMulti;

WiFiClient espClient;                             // 定义wifiClient实例
PubSubClient client(espClient);                   // 定义PubSubClient的实例
long lastMsg = 0;                                 // 记录上一次发送信息的时长

void setup() {
  pinMode(BUILTIN_LED, OUTPUT);                   // 定义板载LED灯为输出方式
  pinMode(D8, OUTPUT);                            //D8引脚连接串口墨水屏WAKE引脚
  Serial.begin(115200);
  //D4->TX引脚
  Serial1.begin(115200);
  // 板子通电后要启动,稍微等待一下让板子点亮
  delay(10);
  setup_wifi();                                    //执行Wifi初始化,下文有具体描述
  client.setServer(mqtt_server, 1883);             //设定MQTT服务器与使用的端口,1883是默认的MQTT端口
  client.setCallback(callback);                    //设定回调方式,当ESP8266收到订阅消息时会调用此方法
}

void setup_wifi() {
  // Don't save WiFi configuration in flash - optional
  WiFi.persistent(false);
  // Register multi WiFi networks
  wifiMulti.addAP(ssid_1, password_1);
  wifiMulti.addAP(ssid_2, password_2);
  wifiMulti.addAP(ssid_3, password_3);
  // More is possible

  // Maintain WiFi connection
  if (wifiMulti.run(connectTimeoutMs) == WL_CONNECTED) {
    Serial.print("WiFi connected: ");
    Serial.println(WiFi.SSID());
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());
  } else {
    Serial.println("WiFi not connected!");
  }

}

//\xA5\x00\x09\x0A\xCC\x33\xC3\x3C\xA6
//A500090ACC33C33CA6
void callback(char* topic, byte* payload, unsigned int length) {
  //Serial.println(topic);
  if (strcmp(topic, TOPIC_WAKEUP) == 0) {
    String message = "";
    for (int i = 0; i < length; i++)
    {
      message += (char)payload[i];
    }

    if (message == "WAKE_UP_0") {
      digitalWrite(D8, LOW);
      Serial.println(message);
    } else if (message == "WAKE_UP_1") {
      digitalWrite(D8, HIGH);
      Serial.println(message);
    }
  } else if (strcmp(topic, TOPIC) == 0) {
    char x;
    for (int i = 0; i < length; i++)
    {
      x = (char)payload[i];
      //串口0:打印指令消息
      Serial.write(x);
      //串口1:转发指令消息
      Serial1.write(x);
    }
  } else {

  }

  if ((char)payload[0] == '1') {
    digitalWrite(BUILTIN_LED, HIGH);   // 亮灯
  } else {
    digitalWrite(BUILTIN_LED, LOW);   // 熄灯
  }
}

void reconnect() {
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect(client_id, mqtt_username, mqtt_password)) {
      Serial.println("connected");
      // 连接成功时订阅主题
      client.subscribe(TOPIC);
      client.subscribe(TOPIC_WAKEUP);
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      //重置wifi连接
      setup_wifi();
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void loop() {

  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  long now = millis();
  if (now - lastMsg > 2000) {
    lastMsg = now;
    client.publish("home/status/", "{device:client_id,'status':'on'}");
  }
}

代码中需要调整的部分:

//WiFi相关配置,候选Wifi
const char* ssid_1 = "SummerGao1"; //WiFi名称
const char* password_1 = "123456";//WiFi密码
const char* ssid_2 = "SummerGao2"; //WiFi名称
const char* password_2 = "123456";//WiFi密码
const char* ssid_3 = "SummerGao3"; //WiFi名称
const char* password_3 = "123456";//WiFi密码
//MQTT Client相关配置
const char* mqtt_server = "localhost"; //MQTT服务器地址
const char* mqtt_username = "SummerGao"; //MQTT用户名
const char* mqtt_password = "123456"; //MQTT密码
const char* TOPIC = "home/devices/onoff/"; // 订阅消息主题
const char* TOPIC_WAKEUP = "home/devices/wake_up/"; // 订阅消息主题
const char* client_id = "clientId-ApjJZcy2024Dh";  // 标识当前设备的客户端编号

至此ESP8266WIFI 模块已配置完成。

Emqx v5.6.0搭建MQTT服务器及二次开发

基于Emqx搭建MQTT服务器,基于Emqx进行二次开发集成电子纸屏驱动程序。这里已集成完成,可以直接下载develop分支源码编译运行。

1. 下载源码
git clone -b develop git@github.com:SummerGaoPlus/emqx_epaper_clock.git
2. 参数配置
  • 重点部分

img

  • 开启uart2串口

    img

    3. 源码构建
cd emqx_epaper_clock

make
4. 运行
cd emqx_epaper_clock

_build/emqx/rel/emqx/bin/emqx console

img

img


所有服务运行后监控系统内存使用情况和CPU温度信息

img

总结

这是对香橙派AIPro的开发板的初次尝试,之前一直在用树莓派4B进行开发。经过使用对比发现香橙派更加的强大,Linux 镜像中预装了很多实用的工具, 接口比树莓派要多,更易使用,生态比想象的要完善,官方给出的文档非常的全面,而且是国产中文的,值得拥有,值得去探索。刚到手还在探索中,后期会输出更多有关香橙派AIPro的使用教程及技术博文,分享更多有趣的内容。

Logo

昇腾万里,让智能无所不及

更多推荐