本帖最后由 SweetSmile 于 2024-10-16 23:40 编辑
本帖最后由 SweetSmile 于 2024-10-16 23:39 编辑
本帖最后由 SweetSmile 于 2024-10-16 23:06 编辑
本帖最后由 SweetSmile 于 2024-9-24 23:13 编辑
本帖最后由 SweetSmile 于 2024-9-24 22:54 编辑
一、小安派开箱
很幸运能被安信可选中体验小安派R2,这块板子搭载了BL618,是一颗拥有WiFi与BLE的高性能芯片,板子外设和功能就不再过多的赘述了,下面贴上两份官方的规格书和参考文档链接,有兴趣的话可以翻阅一下,写的还是比较清晰的。
1、AI-M61-32S-kit——规格书
https://docs.ai-thinker.com/_media/ai-m61-32s-kit_v1.1.2_product_specification_cn.pdf
2、BL616/BL618参考手册
https://docs.ai-thinker.com/_media/bl616_bl618_rm_zh_cn_0.96_open_.pdf
当园长通知我被选中很是期待它的到来,经过几天的漂流,我也是成功把小安派接回了家。
1、全家福
<h3 align = "center">图1</h3>
<h3 align = "center">图2</h3>
可以看到,园长这次活动真的很大方啊,再次感谢,这块四寸的86屏真的很漂亮的说,板子是单声道但还是配了两个扬声器,大气哦,而且还有这颗130万像素点的usb摄像头,可以说,配置豪华得远远超出了我的期待。(原以为就一块主板和86屏)
2、小安派R2主板
<h3 align = "center">图3</h3>
<h3 align = "center">图4</h3>
这就是主控板的全身照了,可以看得出来,板子做工很好,沉金板来的,预留的接口很丰富。背面还预留了tf卡座和各个测试点,这是我非常喜欢的一点,作为一块学习板来说,这些测试点非常方便软件调试和问题分析,虽说不大用得到(小声)。嘿嘿,可以看到园长安派打包的时候很贴心的哦,用了一块泡棉保护排针,点赞一手👍。
3、上电
<h3 align = "center">图4</h1>
欸嘿,看都看到这里了,这不得来波点灯,直接怼上屏幕,插入Type-C。芜湖,也是成功点灯。板子出场默认烧录了一个固件,用GUI-Guider做的一个界面,还是比较漂亮的,两个switch也做了交互,就是字体选小了点,有点糊,不然就更好看了。
简简单单的开箱就到这里了,后续就进入环境搭建了,不懂多久才能写完哦,当了个打工人,只能下班抽点时间摸摸。
二、环境搭建
相较于最初,社区内环境搭建的教程和帖子已经数不胜数了,简直可以挑花眼去,这边直接贴出几个高质量的教程贴。
1、Arduino环境搭建
用Arduino真的是很巴适,开发简单易上手,众多的库可以调用,环境搭建也十分的方便,就是可能需要科学工具。具体安装方式可以参考下面的帖子。
Arduino参考
环境搭建好,那肯定少不了祖传的点灯环节,简单的使用Arduino库的串口来点一下灯。
/*led灯珠引脚配置*/
#define RED 12
#define GREEN 14
#define BULE 15
/*串口接收缓存*/
char revdata[20];
char revlen = 0;
/*led控制函数*/
void led_turn(char c, int pin) {
if (revdata[1] == 'N')
digitalWrite(pin, HIGH);
if (revdata[1] == 'F')
digitalWrite(pin, LOW);
}
void setup() {
/*串口初始化*/
Serial.begin(2000000);
Serial.println("Hello");
/*初始化led引脚作为输出模式*/
pinMode(RED, OUTPUT);
pinMode(GREEN, OUTPUT);
pinMode(BULE, OUTPUT);
/*led默认关闭*/
digitalWrite(RED, LOW);
digitalWrite(GREEN, LOW);
digitalWrite(BULE, LOW);
}
void loop() {
/*串口接收*/
while (Serial.available() > 0) {
revdata[revlen++] = char(Serial.read());
delay(2);
}
if (strlen(revdata) > 0) {
/*打印串口接收到的数据*/
Serial.println(revdata);
/*
串口指令判断
RN:开启红灯
RF:关闭红灯
蓝绿同理
*/
switch (revdata[0]) {
case 'R':
led_turn(revdata[1], RED);
break;
case 'G':
led_turn(revdata[1], GREEN);
break;
case 'B':
led_turn(revdata[1], BULE);
break;
default:
break;
}
/*串口接收缓存*/
memset(revdata, 0, strlen(revdata));
revlen = 0;
}
}
Arduino库API函数推荐参阅以下几个链接:
DFROBOT
太极创客
2、官方SDk环境搭建
官方环境搭建也很简单,其实主要就是获取SDK包,在环境变量中添加好编译工具,但这个包存放在git上,所以需要安装git工具方便拉取,编辑器的话推荐使用vscode,个人觉得很好用,主要是界面主题很好看哈哈,下面就是社区内详细具体的搭建过程帖子了。
想自己拉取SDK的话可以参照这个帖子,这帖子里有编译工具路径添加说明:Windows环境搭建
想偷懒的话官方网站也有一键脚本:一键脚本
不过我更推荐下载离线包,保存起来,错误修改了SDK还可以掏出来重新解压一个就好了:离线包
根据上面这几个帖子搭好环境环境后就可以愉快的点灯了,照例使用串口点灯,在例程gpio_input_output工程下进行修改。
#include "bflb_gpio.h"
#include "board.h"
#include "bflb_core.h"
#include "bflb_uart.h"
/*led灯珠引脚配置*/
#define RED 12
#define GREEN 14
#define BLUE 15
/*串口接收缓存*/
char revdata[20];
char revlen = 0;
//设备句柄
struct bflb_device_s *gpio;
struct bflb_device_s *uart0;
/*led控制函数*/
void led_turn(char c, int pin)
{
if (revdata[1] == 'N')
bflb_gpio_set(gpio, pin);
if (revdata[1] == 'F')
bflb_gpio_reset(gpio, pin);
}
int main(void)
{
board_init();
gpio = bflb_device_get_by_name("gpio");
uart0 = bflb_device_get_by_name("uart0");
bflb_gpio_init(gpio, RED, GPIO_OUTPUT | GPIO_SMT_EN);
bflb_gpio_init(gpio, GREEN, GPIO_OUTPUT | GPIO_SMT_EN);
bflb_gpio_init(gpio, BLUE, GPIO_OUTPUT | GPIO_SMT_EN);
while (1) {
while (bflb_uart_rxavailable(uart0)) {
revdata[revlen++] = bflb_uart_getchar(uart0);
bflb_mtimer_delay_ms(2);
}
if (revlen != 0) {
revdata[strlen(revdata)] = '\0';
/*打印串口接收到的数据*/
printf("%s\n", revdata);
/*
串口指令判断
RN:开启红灯
RF:关闭红灯
蓝绿同理
*/
switch (revdata[0]) {
case 'R':
led_turn(revdata[1], RED);
break;
case 'G':
led_turn(revdata[1], GREEN);
break;
case 'B':
led_turn(revdata[1], BLUE);
break;
default:
break;
}
/*串口接收缓存*/
memset(revdata, 0, strlen(revdata));
revlen = 0;
}
}
}
值得一提的是,通过翻看board_init()函数,会发现,串口0已经被初始化并绑定了控制台用于输出调试信息,所以我们并不需要再次初始化它,实现串口接收处理即可,为了方便我使用了串口轮询接收,其实最好改成dma中断接收,这样可以减少cpu运算。
自定义工程路径
或许有这么一个需求,需要在自定义路径下存放一个干净简洁的工程目录。毕竟在 VScode 打开 AiPi-Open-Kits
文件夹会发现打开了一堆密密麻麻的的文件,并且点击一个头文件进行查看就会发现,都不懂跳转到了哪里,属实有点混乱哈哈。
1、复制需要的工程模板到指定路径
我就拿经典的helloworld演示一下,复制结束后使用vscode打开咯
2、在Makefile文件中指定SDK路径
这时候新建一个终端,make一下就编译可以了
3、添加includePath
这时候打开mian.c就会发现头文件报红,其实是vscode没找到头文件导致的,打开c_cpp_properties.json将头文件路径添加一下就好了
这样子就得到一个干净舒服的工程了。注意:**需要编译过一次才能这样添加,不然的话没有.vscode文件夹,那就要通过C/C++配置进行添加**。
三、小安派R2工程编译
小安派r2和ai-m61-32s-kit一样是使用BL618模组,它两的环境搭建都是一样的。不过r2出厂时进行了加密处理所以在运行的时候,需要指定特定的 boot2及验证固件。否则程序可能无法正常运行。这个描述在**AiPi-Eyes-R2_V1.0中可以看到。**
这部分其实知道就好,不用操心,因为R2出厂时固件源码就是AiPi-Open-Kits下的AiPi-Eyes-Rx工程
使用vscode打开这个工程后,查看整个工程目录架构,可以看到已经配置好了lvgl、freeRTOS等组件,lvgl默认运行的是NXP的guiguider工具绘制的界面。
接着把mian中的其他任务通通注释掉,来跑一下lvgl的压力测试demos
make一下会出现一个报错,其实是lvgl的压力测试演示的宏没开导致的
来到mian文件的头文件这,打开#include "demos/lv_demos.h",接着再找到**if LV_USE_DEMO_STRESS的定义,跳转进去将配置打开**
再make一下就可以看到编译通过了,使用make flash COMX=COM8(8为自己的端口号)烧录进板子,复位一下。R2的性能还是很强劲的,压力测试下,平均帧率可以到30帧以上。
<h2>四、DIY小玩意
一开始拿到这板子屏幕最直接的想法就是做智能家居、思路:其他单片机设备连接传感器采集数据后通过ble传输到小安派R2、然后小安派R2一边通过屏幕显示数据、一边连接wifi将数据上传到mqtt服务器,实现手机app实时查看和控制家庭设备。也确实是这么做的,mqtt服务器也已经搭好了,使用emqx在自己的电脑上部署服务器,只要设备与电脑在同一个局域网内即可进行通信。但现在腰斩了,属实是抱歉,生活中一些事情导致没有太多时间把玩这块板子。现在只好先将一个简陋的串口调试器发出来,智能家居这块等抽出时间来在接着继续了。
<h3 >1、使用Gui guider编辑生成简单的UI界面
<h3 >2、在事件回调中实现串口收发
代码实现起来很简单,我就不发出来招笑了。
<h3 >3、效果展示
https://www.bilibili.com/video/BV1U9seewEuF/
<h2 >五、不足与建议
- 这块板子在我看来不足的点是很少的,大屏幕和兼具ble与WiFi注定了很高的可玩性。
唯一一点不足就是屏幕与板子的连接了,不固定一下用起来真的是心惊肉跳的,生怕断了。
建议的话,建议以后把type-c与屏幕排线FPC座子分开,没有固定架子的话,插线时好怕的。