大家好,今天给大分享一个OrangePi AIpro(20T)采用昇腾作为主控芯片的开发板,开箱以及对应功能的详细实现。
第一:板子基本介绍
接通电源给对应的开发板上电,观察其中的现象,如下:
注意事项:开发板上有电源对应的Type-C接口,不要接错了。
1:控制启动设备3个拨码开关
开发板的linux系统下支持从TF卡、EMMC和SSD启动,具体从哪个设备启动是通过3个拨码开关进行选择的,启动之前要检查一下。
从图上可以清晰的看出来对应系统的启动方式。
注意事项:切换拨码开关后必须重新拔插电源上电才能启动设备选择生效。通过开发板复位按键来复位系统是不会让拨码开关设置配置生效的。
2:开发利用调试串口的方法
开发板默认使用uart0做为调试串口。需要注意的是,uart0的tx和rx引脚同时接到了两个地方,所以有两种使用调试串口的方法:
第一种方法:
uart0 的 tx 和 rx 引脚接到了 40 pin 扩展接口中的 8 号和 10 号引脚,此种方式需要准备一个 3.3v 的 USB 转 TTL 模块和相应的杜邦线,然后才能正常使用开发板的调试串口功能。
第二种方法:
uart0 的 tx 和 rx 引脚还接到了开发板的 CH343P 芯片上,再通过 CH343P 芯片引出到 Type-C USB 接口上。此种方式只需要一根 Type-C USB 接口的数据线将开发板连接到电脑的 USB 接口就可以开始使用开发板的调试串口功能了,无需购买 USB 转 TTL 模块。这种方法是推荐的方法。
注意事项:上面的两种方式只能二选一,请不要同时使用。
第二:环境搭建与测试
1:Windows平台使用调试串口方法
1、直接安装对应的超级终端软件。
2、选择串口波特率为115200.
3、点击“OK”按钮后会进入下面的界面,此时启动开发板就能看到串口的输出信息了。
2:利用Windows PC将linux镜像烧写到TF卡的方法
1、要有一张大容量的TF卡,TF 卡的传输速度必须为 class10 级或 class10 级以上,建议使用闪迪等品牌的 TF 卡。
2、然后把 TF 卡插入读卡器,再把读卡器插入电脑。
3、下载想要烧录的 Linux 镜像压缩包。
4、下载用于烧录 Linux 镜像的软件——balenaEtcher,下载地址为:
https://www.balena.io/etcher/
5、进入 balenaEtcher 下载页面后,点击绿色的下载按钮会跳到软件下载的地方。
6、选择下载 Portable 版本的 balenaEtcher,Portable 版本无需安装,双击打
并进行双击打开。
7、使用 balenaEtcher 烧录 Linux 镜像的具体步骤如下所示:
8、成功烧录完成后 balenaEtcher 的显示界面如下图所示,如果显示绿色的指示图
注意事项:启动系统前请确保拨码开发拨到了TF卡启动的位置了。拨码开关的使用请参考说明。
3:Ubuntu Xfce桌面系统使用
进入 Ubuntu 镜像的下载链接后可以看到下图所示的两个 ubuntu 镜像,他们的
Linux系统功能适配情况:
4:利用开发板无线连接
1、使用 nmcli dev wifi 命令扫描周围的 WIFI 热点。
命令:nmcli dev wifi
2、然后使用 nmcli 命令连接扫描到的 WIFI 热点,其中:
a. wifi_name 需要换成想连接的 WIFI 热点的名字。
b. wifi_passwd 需要换成想连接的 WIFI 热点的密码。
命令:sudo nmcli dev wifi connect wifi_name passwordwifi_passwd
开发板中使用的交叉编译工具链如下:
第三:香橙派开发板AI实现
1、人工智能目标检测
SSD(Single Shot MultiBox Detector)是一种流行且高效的单阶段目标检测算法,它在处理速度和检测精度之间取得了良好的平衡。与传统的两阶段方法(如 R-CNN 系列)不同,SSD 在单个网络前向传递中直接预测目标的边界框和类别,无需先生成候选区域。这种方法不仅加快了目标检测速度,而且简化了检测流程。
将SSD人工智能算法(算法代码详见sample文件夹),放入欧拉实验平台,点击运行。
实现现象如下:
2、人工智能实现文字识别
该人文字识别主要是将图像中的文字区域转化为字符信息,能够提取丰富的信息特征,采用ResNet算法模型,提取网络信息,其中包含转换后的om模型和测试图片,详细实现如下:
找到源码,存放在欧拉平台,双击点开。
打开图片文字转化代码,利用CNN网络提取丰富的特征信息,进行识别。
提示编译成功的效果,注意观察启动的现象。
最终成功输出的结果如下:
3、人工智能远程聊天实现
利用人工智能开发板作为服务器,收集远程客户端发送过来的信息,处理完毕之后也可以将对应的信息发送给客户端,实现远距离自由聊天功能。
详细代码如下(欢迎评论区交流学习)
服务器代码实现:
//服务器代码的具体实现
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <pthread.h>
#include <stdlib.h>//1声明对应线程的个数
pthread_t pthread_max[5] = {0};void *broadcast_clt(void *arg)
{int i;long a = (long )arg;char buf[100] = {0};printf("a = %ld\r\n",a);//获取客户端的clifdint clifd = pthread_max[a];printf("clifd = %d\r\n",clifd);//获取对应客户端发过来的信息while(1){//获取内容recvrecv(clifd,buf,100,0);printf("clifd = %d\r\n",clifd);//将获取到的内容转发给其他的客户端for(i = 0; i < 5; i++){if((pthread_max[i] !=0) && (pthread_max[i] !=clifd)){//传输对应buf的内容send(pthread_max[i],buf, 100, 0);}}usleep(500); }}int main(int argc , char *argv[])
{//定义变量int clifd;socklen_t addrlen=sizeof(struct sockaddr);long i;pthread_t tid[10];//2 定义实现socket函数int serfd = -1;int new_sfd = -1;serfd = socket(AF_INET, SOCK_STREAM, 0);//3 定义实现bind函数#define SERVER_IP "192.168.1.111"#define PORT_NUM 1111typedef struct sockaddr SA;typedef struct sockaddr_in SIN; SIN seraddr;SIN cliaddr;bzero(&seraddr,sizeof(SIN)); //功能类似memset()seraddr.sin_family=AF_INET;seraddr.sin_port=htons(PORT_NUM);seraddr.sin_addr.s_addr=inet_addr(SERVER_IP); //对IP地址进行转化//将服务器地址信息与套接字进行绑定//实现本机地址重复使用int ret;int reuse = 1;ret = setsockopt(serfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse));ret = bind(serfd,(SA*)&seraddr,sizeof(SA));if(ret == -1){perror("connect failed\r\n");exit(0);}//利用listen函数监听ret = listen(serfd,10);if(ret == -1){perror("listen failed\r\n");exit(0);}while(1){//进入到循环函数里面完成通信clifd = accept(serfd,(SA*)&cliaddr,&addrlen);if(clifd == -1){perror("accept failed\r\n");exit(0);}printf("accept success\r\n");printf("clifd = %d\r\n",clifd);//保存一下对应的值for(i = 0; i < 5; i++){if(pthread_max[i] == 0){pthread_max[i] = clifd;pthread_create(&tid[i], NULL, broadcast_clt, (void *)i);break;}}}//收回对应的文件描述符close(serfd);for(i = 0; i < 5; i++){if(pthread_max[i] > 0){close(pthread_max[i]);}}exit(0);}
客户端代码具体实现:
//客户端代码实现
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <string.h>
#include <semaphore.h>
#include <stdlib.h>char send_buf[100] = {0};
char recv_buf[100] = {0};void * send_srv(void *arg)
{long a = (long)arg; //文件描述符int b = (int)a;int send_len;//发生数据while(1){scanf("%s",send_buf);//发送对应的字符串send_len = send(b,send_buf,sizeof(send_buf),0);if(send_len == -1){perror("failed\r\n");exit(0);}printf("send success\r\n");}pthread_exit(NULL);
}void *recv_srv(void *arg)
{long a = (long)arg; //文件描述符int b = (int)a;//接受数据while(1){recv(b,recv_buf,100,0);printf("recv_buf : %s\r\n",recv_buf);}pthread_exit(NULL);
}int main(int argc , char *argv[])
{//定义变量pthread_t tid1,tid2;//建立通信端口socketint serfd;serfd = socket(AF_INET,SOCK_STREAM,0);if(serfd == -1){perror("socket failed\r\n");exit(0);}//绑定对应的地址信息connect#define SERVER_IP "192.168.1.111"#define PORT_NUM 1111typedef struct sockaddr SA;typedef struct sockaddr_in SIN; SIN seraddr;bzero(&seraddr,sizeof(SIN)); //功能类似memset()seraddr.sin_family=AF_INET;seraddr.sin_port=htons(PORT_NUM);seraddr.sin_addr.s_addr=inet_addr(SERVER_IP); //对IP地址进行转化//将服务器地址信息与套接字进行绑定int ret;ret = connect(serfd,(SA*)&seraddr,sizeof(SA));if(ret == -1){perror("connect failed\r\n");exit(0);}//提示一下客户端创建成功printf("connect success\r\n");long send_cfd = (long )serfd;pthread_create(&tid1, NULL, send_srv, (void *)send_cfd);pthread_create(&tid2, NULL, recv_srv, (void *)send_cfd);//等待对应的线程运行结束pthread_join(tid1,NULL);pthread_join(tid2,NULL);exit(0);}
第一步:利用ubuntu中的sftp通信传输AI开发板
第二步:在AI开发板上编译服务器代码
开发板上的编译命令:
aarch64-linux-gnu-gcc -pthread service.c -o ser
第三步:在个人电脑上实现客户端代码编译
第四:任意聊天具体实验现象
第四:产品评价
经过这两天操作香橙派开发板,感触颇深,硬件和系统的稳定性还是非常好的,基本上这块板子的所有外设和人工智能的实例都操作完了,还是非常容易上手的。
可以使用的操作系统也非常丰富,香橙派AiPro支持Ubuntu、openEuler等操作系统,这为用户提供了更多的选择空间,同时也方便了用户根据自己的需求进行开发和部署。
总体感受:香橙派开发板性能优越,易于上手,各种开发工具包齐全,非常适合新手,后期将继续分享优秀的人工智能项目,欢迎大家评论和相互交流学习。