RVB2601板载wifi芯片W800,可以实现wifi连网,板载的喇叭,可以进行音乐播放。
通过官方的webplayer例程,可以学习连网和音乐播放的使用。
关于Yoc的开发文档:https://yoc.docs.t-head.cn/yocbook/
W800芯片是一款安全IoT Wi-Fi/蓝牙双模 SoC 芯片。支持 2.4G IEEE802.11b/g/n Wi-Fi 通讯协议;支持 BT/BLE 双模工作模式,支持 BT/BLE4.2 协议。芯片采用平头哥玄铁804(32位)CPU内核,最高主频达到240MHz;内置TEE安全引擎,为芯片提供了高性能的核心处理能力及安全可信的执行环境。
在init.c的网络初始化中,添加自己的wifi名称和密码,注意还要修改对应的字符串长度。
static void network_init()
{
w800_wifi_param_t w800_param;
/* init wifi driver and network */
w800_param.reset_pin = PA21;
w800_param.baud = 1*1000000;
w800_param.cs_pin = PA15;
w800_param.wakeup_pin = PA25;
w800_param.int_pin = PA22;
w800_param.channel_id = 0;
w800_param.buffer_size = 4*1024;
wifi_w800_register(NULL, &w800_param);
app_netmgr_hdl = netmgr_dev_wifi_init();
if (app_netmgr_hdl) {
utask_t *task = utask_new("netmgr", 2 * 1024, QUEUE_MSG_COUNT, AOS_DEFAULT_APP_PRI);
netmgr_service_init(task);
netmgr_config_wifi(app_netmgr_hdl, "MERCURY_3394", 12, "xxxxxxxxxxx", 11);//自己的WIFI名称和密码
netmgr_start(app_netmgr_hdl);
}
}
demo例程中,音乐的播放是通过命令行交互的方式,支持本地内存形式的音乐播放和网络URL形式的音乐播放。
static void cmd_ipc_func(char *wbuf, int wbuf_len, int argc, char **argv)
{
if (argc == 3 && strcmp(argv[1], "play") == 0)
{
char url[128];
if (strcmp(argv[2], "welcom") == 0)
{
snprintf(url, sizeof(url), "mem://addr=%u&size=%u", (uint32_t)&_welcome_mp3, _welcome_mp3_len);
player_play(get_player_demo(), url, 0);
}
else
{
player_play(get_player_demo(), argv[2], 0);
}
}
else if (argc == 2 && strcmp(argv[1], "stop") == 0)
{
player_stop(get_player_demo());
}
else if (argc == 2 && strcmp(argv[1], "pause") == 0)
{
player_pause(get_player_demo());
}
else if (argc == 2 && strcmp(argv[1], "resume") == 0)
{
player_resume(get_player_demo());
}
else if (argc == 3 && strcmp(argv[1], "web") == 0)
{
g_url = strdup(argv[2]);
LOGD(TAG, "g_url = %s", g_url);
aos_task_new("web_task", _webtask, NULL, 6*1024);
}
else
{
printf("\tplayer play welcom/url[http://]\n");
printf("\tplayer pause\n");
printf("\tplayer resume\n");
printf("\tplayer stop\n");
printf("\tplayer help");
}
}
本地音乐播放,起始是将音乐存入代码中,播放音乐时从内存中读取数据。
实例程序的的欢迎音乐,就是以数组的形式保存的,在welcome_mp3.h中:
const unsigned char _welcome_mp3[] = {
0xff, 0xf3, 0x88, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x58, 0x69, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
0x5d, 0x00, 0x00, 0x59, 0x94, 0x00, 0x00, 0x03, 0x06, 0x09, 0x0d, 0x12,
0x15, 0x17, 0x19, 0x1b, 0x1d, 0x20, 0x22, 0x25, 0x25, 0x27, 0x2b, 0x2e,
0x31, 0x34, 0x36, 0x38, 0x3b, 0x3d, 0x3f, 0x42, 0x45, 0x47, 0x47, 0x49,
0x4c, 0x50, 0x55, 0x5a, 0x5d, 0x60, 0x63, 0x65, 0x68, 0x6a, 0x6c, 0x6e,
...
播放的时候调用player_play函数进行播放:
if (strcmp(argv[2], "welcom") == 0)
{
snprintf(url, sizeof(url), "mem://addr=%u&size=%u", (uint32_t)&_welcome_mp3, _welcome_mp3_len);
player_play(get_player_demo(), url, 0);
}
关于在线音乐的播放源,这篇中https://bbs.eeworld.com.cn/thread-1197096-1-1.html有一个:
player play http://96.ierge.cn/15/235/471729.mp3
这篇中https://bbs.eeworld.com.cn/thread-1199186-1-1.html,介绍了如何生成任意音乐的播放源,不过实测生成的播放源过一段时间会失效,临时测试还是很不错的。
按键IO口初始化:
static csi_gpio_pin_t key1;
static csi_gpio_pin_t key2;
volatile uint8_t g_key1;
volatile uint8_t g_key2;
void key_pinmux_init(void)
{
csi_pin_set_mux(PA11, PIN_FUNC_GPIO);
csi_pin_set_mux(PA12, PIN_FUNC_GPIO);
csi_gpio_pin_init(&key1, PA11);
csi_gpio_pin_dir(&key1, GPIO_DIRECTION_INPUT);
csi_gpio_pin_init(&key2, PA12);
csi_gpio_pin_dir(&key2, GPIO_DIRECTION_INPUT);
g_key1 = 0;
g_key2 = 0;
}
使用按键,可以控制音乐的播放,暂停和继续:
#define URL_GUYONGZHE "http://m801.music.126.net/20220411005827/8b3af711ffd5c3f2ac24ae19fcd027a5/jdymusic/obj/wo3DlMOGwrbDjj7DisKw/11983356173/ed2f/6024/be41/2dc456563c5f9c9535b75ecb066c0325.mp3"
void key_loop(void)
{
static bool isPause = false;
if(GPIO_PIN_LOW == csi_gpio_pin_read(&key1))
{
//持续按键置标志
if(g_key1)
{
g_key1 |= 0x40;
}
else
{
g_key1 = 1;
}
}
//持续按键后释放
else if(g_key1 & 0x40)
{
LOGD(TAG, "\n===key1=%d, %s, %d\n", g_key2, __FUNCTION__, __LINE__);
g_key1=0x80;
if (!isPause)
{
player_pause(get_player_demo());
isPause = true;
}
else
{
player_resume(get_player_demo());
isPause = false;
}
}
else
{
g_key1 = 0;
}
if(GPIO_PIN_LOW == csi_gpio_pin_read(&key2))
{
if(g_key2)
{
g_key2 |= 0x40;
}
else
{
g_key2 = 1;
}
}
else if(g_key2 & 0x40)
{
LOGD(TAG, "\n===key2=%d, %s, %d\n", g_key2, __FUNCTION__, __LINE__);
g_key2=0x80;
//player_play(get_player_demo(), "http://96.ierge.cn/15/235/471729.mp3", 0);
player_play(get_player_demo(), URL_GUYONGZHE, 0);
}
else
{
g_key2 = 0;
}
}
在主函数中,需要新建一个按键任务,来进行按键的检测:
static void key_task(void *arg)
{
key_pinmux_init();
while (1)
{
aos_msleep(5);
key_loop();
}
}
int main(void)
{
board_yoc_init();
player_init();
cli_reg_cmd_player();
/* Subscribe */
event_subscribe(EVENT_NETMGR_GOT_IP, network_event, NULL);
event_subscribe(EVENT_NETMGR_NET_DISCON, network_event, NULL);
//按键检测任务
aos_task_new("key", key_task, NULL, 10*1024);
return 0;
}
通过板子上按键控制音乐播放、暂停、继续的测试效果如下:
本篇介绍了如何使用RVB2601自带的W800进行连网以及使用按键控制音乐播放、暂停与继续
6666,如果加上OLED,显示状态,那不是完㺯了!
本帖最后由 lugl4313820 于 2022-4-16 17:38 编辑这个不错,在线音乐播放器!本地的估计不好弄,内存太小,要是能插SD卡就好了!