查看: 16190|回复: 13

ASR PRO语音识别系列教程——ASRPRO和其它单片机串口通讯范例

[复制链接]

11

主题

11

帖子

161

积分

版主

Rank: 7Rank: 7Rank: 7

积分
161
发表于 2023-1-16 18:04:30 | 显示全部楼层 |阅读模式
本帖最后由 dolphin 于 2023-4-13 08:56 编辑

概述:
             1. ASRPRO有3组串口,UART0 预留为程序升级接口,方便后期升级。如需和其它 MCU 通讯建议使用 UART1 或者 UART2。
             2. ASRPRO IO口为3.3V电平,为了可靠性,建议设置TX、RX引脚内部上下电阻无效,同时设置TX为开漏模式,外接上拉电阻到5V,串联电阻,电路示意图如下所示:
图片1.png
Arduino UNO(5V单片机)
电路连接:
图片2.png
范例1:ASRPRO语音发送串口控制Arduino执行动作
ASRPRO端程序
图片3.png

Arduino端程序
  1. #include <SoftwareSerial.h>

  2. SoftwareSerial mySerial(10, 11); // RX, TX

  3. String value;

  4. #define LED_PIN   13
  5. #define RELAY_PIN 12

  6. void setup() {
  7.   // Open serial communications and wait for port to open:
  8.   Serial.begin(9600);
  9.   while (!Serial) {
  10.     ; // wait for serial port to connect. Needed for native USB port only
  11.   }

  12.   mySerial.begin(9600);
  13.   pinMode(LED_PIN, OUTPUT);
  14.   pinMode(RELAY_PIN, OUTPUT);
  15. }

  16. void loop() { // run over and over
  17.   if (mySerial.available()) {
  18.     value = (mySerial.readString());
  19.     Serial.println(value);
  20.     if (value == "LED ON")
  21.     {
  22.       digitalWrite(LED_PIN,HIGH);
  23.     }
  24.     else if (value == "LED OFF")
  25.     {
  26.       digitalWrite(LED_PIN,LOW);
  27.     }
  28.     else if (value == "RELAY ON")
  29.     {
  30.       digitalWrite(RELAY_PIN,HIGH);
  31.     }
  32.     else if (value == "RELAY OFF")
  33.     {
  34.       digitalWrite(RELAY_PIN,LOW);
  35.     }
  36.   }
  37. }
复制代码


程序效果:
            通过用“天问五幺”语音唤醒后,分别说测试语音“打开灯光”、“关闭灯光”、“打开继电器”、“关闭继电器”,Arduino端接收到串口命令后会执行对应引脚的控制和串口打印。
图片4.png

范例2: Arduino发送串口控制ASRPRO播放语音
ASRPRO端程序
图片5.png

Arduino端程序
  1. #include <SoftwareSerial.h>

  2. SoftwareSerial mySerial(10, 11); // RX, TX
  3. void setup() {
  4.   mySerial.begin(9600);
  5. }
  6. void loop() { // run over and over
  7.   mySerial.print("TempAdd");
  8.   delay(5000);
  9.   mySerial.print("TempSub");
  10.   delay(5000);
  11. }
复制代码


程序效果:
          Arduino端间隔5秒串口发送“TempAdd”、"TempSub",ASRPRO接收到串口命令后会马上唤醒自动播报语音“温度增加一度”、“温度减小一度”。

STC(5V单片机)
电路连接:
图片6.png
         本案例以P5_0为RX,P5_1为TX举例。P5_0与ASR PRO的TX连接,也就是接在PB7,P5_1与ASR PRO的RX连接,也就是接在PC0,注意STC8的电源插脚接到5V,GND引脚互相连接。

范例:ASRPRO与STC8进行串口通讯语音控制STC8板载灯
ASRPRO端程序
7CE981F5-18E0-485b-8A86-4A940CCCA5B9.png
图片9.png

STC8端程序
图片21.png

程序效果:
          通过用“天问五幺”语音唤醒后,分别说测试语音“打开板载灯”、“关闭板载灯”控制STC8板载灯亮灭。

S
TM32(3V单片机)
电路连接:
图片7.png
      ASRPRO的PB7(TX)引脚接STM32的A10(RX)引脚,PC0(RX)引脚接STM32的A9(TX)引脚。

范例1:ASRPRO语音发送串口控制STM32执行动作
ASRPRO端程序
6.png
图片9.png

STM32部分程序
main.c
  1. #include "stm32f10x.h"
  2. #include "usart.h"
  3. #include "led.h"
  4. #include "delay.h"
  5. u16 USART_RX_STA=0;                         //接收状态标记
  6. static u16 fac_ms = 0;
  7. int main(void)
  8. {   
  9.     LED_Init();
  10.     MyUSART_Init();
  11.     delay_init();
  12.     while(1)
  13.     {
  14.     }   
  15. }
复制代码

usart.c
  1. #include "usart.h"
  2. #include "led.h"

  3. //重定向C库函数printf到串口,重定向后可使用printf函数
  4. int fputc(int ch,FILE *f)
  5. {
  6.     /* 发送一个字节数据到串口 */
  7.     USART_SendData(USART1,(uint8_t) ch);
  8.     while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
  9.     return (ch);
  10. }
  11. //重定向C库函数scanf到串口,重写向后可使用scanf、getchar等函数
  12. int fgetc(FILE *f)
  13. {
  14.     /* 等待串口输入数据 */
  15.     while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
  16.     return (int)USART_ReceiveData(USART1);
  17. }
  18. void MyUSART_Init()
  19. {
  20.     /* 定义GPIO、NVIC和USART初始化的结构体 */
  21.     GPIO_InitTypeDef GPIO_InitStructure;
  22.     NVIC_InitTypeDef NVIC_InitStructure;
  23.     USART_InitTypeDef USART_InitStructure;
  24.     /* 使能GPIO和USART的时钟 */
  25.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  26.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
  27.     /* 将USART TX(A9)的GPIO设置为推挽复用模式 */
  28.     GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
  29.     GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
  30.     GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  31.     GPIO_Init(GPIOA,&GPIO_InitStructure);
  32.     /* 将USART RX(A10)的GPIO设置为浮空输入模式 */
  33.     GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
  34.     GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
  35.     GPIO_Init(GPIOA,&GPIO_InitStructure);

  36.     /* 配置串口 */
  37.     USART_InitStructure.USART_BaudRate=9600;                                        //波特率了设置为9600
  38.     USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;   //不使用硬件流控制
  39.     USART_InitStructure.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;                     //使能接收和发送
  40.     USART_InitStructure.USART_Parity=USART_Parity_No;                               //不使用奇偶校验位
  41.     USART_InitStructure.USART_StopBits=USART_StopBits_1;                            //1位停止位
  42.     USART_InitStructure.USART_WordLength=USART_WordLength_8b;                       //字长设置为8位
  43.     USART_Init(USART1, &USART_InitStructure);   

  44.     /* Usart1 NVIC配置 */
  45.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                 //设置NVIC中断分组2
  46.     NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
  47.     NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  48.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
  49.     NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
  50.     NVIC_Init(&NVIC_InitStructure);

  51.     /*初始化串口,开启串口接收中断 */
  52.     USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
  53.     /* 使能串口1 */
  54.     USART_Cmd(USART1,ENABLE);

  55. }
  56. /* USART1中断函数 */
  57. void USART1_IRQHandler(void)
  58. {
  59.     uint8_t ucTemp;                                         //接收数据
  60.     if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
  61.     {      
  62.         ucTemp = USART_ReceiveData(USART1);
  63.         USART_SendData(USART1,ucTemp);
  64.         if(ucTemp == 0x32)
  65.         {
  66.             LED_ON();
  67.         }
  68.         if(ucTemp == 0x33)
  69.         {
  70.             LED_OFF();
  71.         }
  72.     }
  73. }
  74. /* 发送一个字节 */
  75. void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)
  76. {
  77.     /* 发送一个字节数据到USART */
  78.     USART_SendData(pUSARTx,ch);

  79.     /* 等待发送数据寄存器为空 */
  80.     while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);  
  81. }
  82. /* 发送字符串 */
  83. void Usart_SendString( USART_TypeDef * pUSARTx, char *str)
  84. {
  85.     unsigned int k=0;
  86.   do
  87.   {
  88.       Usart_SendByte( pUSARTx, *(str + k) );
  89.       k++;
  90.   } while(*(str + k)!='\0');

  91.   /* 等待发送完成 */
  92.   while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET)
  93.   {}
  94. }

  95. }
复制代码

led.c
  1. #include "led.h"
  2. void LED_Init(void)
  3. {
  4.     GPIO_InitTypeDef  GPIO_InitStructure;
  5.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);    //使能B端口时钟
  6.     GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
  7.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;   
  8.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         //推挽输出
  9.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
  10.     GPIO_Init(GPIOB, &GPIO_InitStructure);    //初始化GPIOB
  11.     GPIO_SetBits(GPIOB,GPIO_Pin_10);
  12. //  GPIO_SetBits(GPIOA,GPIO_Pin_8);
  13. }
  14. void LED_OFF(void)
  15. {
  16.     GPIO_SetBits(GPIOB,GPIO_Pin_10);
  17. }
  18. void LED_ON(void)
  19. {
  20.     GPIO_ResetBits(GPIOB,GPIO_Pin_10);
  21. }
复制代码


程序效果:
         通过用“天问五幺”语音唤醒后,分别说测试语音“打开灯光”、“关闭灯光”,STM32端接收到串口命令后会执行对应引脚的控制和串口打印,“2”代表打开,“1”代表关闭。

范例2:STM32串口发送控制ASRPRO播报语音
ASRPRO端程序
图片11.png
图片12.png

STM32部分程序
main.c
  1. #include "stm32f10x.h"
  2. #include "usart.h"
  3. #include "led.h"
  4. #include "delay.h"

  5. u16 USART_RX_STA=0;                         //接收状态标记
  6. static u16 fac_ms = 0;
  7. //void delay_init(void);
  8. //void delay_ms(u16 nms);
  9. int main(void)
  10. {   
  11.     LED_Init();
  12.     MyUSART_Init();
  13.     delay_init();
  14.     while(1)
  15.     {
  16.         Usart_SendString( USART1,"LED ON");
  17.         LED_ON();
  18.         delay_ms(5000);
  19.         Usart_SendString( USART1,"LED OFF");
  20.         LED_OFF();
  21.         delay_ms(5000);
  22.     }   
  23. }
复制代码

usart.c
  1. #include "usart.h"
  2. #include "led.h"

  3. //重定向C库函数printf到串口,重定向后可使用printf函数
  4. int fputc(int ch,FILE *f)
  5. {
  6.     /* 发送一个字节数据到串口 */
  7.     USART_SendData(USART1,(uint8_t) ch);
  8.     while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
  9.     return (ch);
  10. }
  11. //重定向C库函数scanf到串口,重写向后可使用scanf、getchar等函数
  12. int fgetc(FILE *f)
  13. {
  14.     /* 等待串口输入数据 */
  15.     while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
  16.     return (int)USART_ReceiveData(USART1);
  17. }
  18. void MyUSART_Init()
  19. {
  20.     /* 定义GPIO、NVIC和USART初始化的结构体 */
  21.     GPIO_InitTypeDef GPIO_InitStructure;
  22.     NVIC_InitTypeDef NVIC_InitStructure;
  23.     USART_InitTypeDef USART_InitStructure;
  24.     /* 使能GPIO和USART的时钟 */
  25.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  26.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
  27.     /* 将USART TX(A9)的GPIO设置为推挽复用模式 */
  28.     GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
  29.     GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
  30.     GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  31.     GPIO_Init(GPIOA,&GPIO_InitStructure);
  32.     /* 将USART RX(A10)的GPIO设置为浮空输入模式 */
  33.     GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
  34.     GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
  35.     GPIO_Init(GPIOA,&GPIO_InitStructure);

  36.     /* 配置串口 */
  37.     USART_InitStructure.USART_BaudRate=9600;                                        //波特率了设置为9600
  38.     USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;   //不使用硬件流控制
  39.     USART_InitStructure.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;                     //使能接收和发送
  40.     USART_InitStructure.USART_Parity=USART_Parity_No;                               //不使用奇偶校验位
  41.     USART_InitStructure.USART_StopBits=USART_StopBits_1;                            //1位停止位
  42.     USART_InitStructure.USART_WordLength=USART_WordLength_8b;                       //字长设置为8位
  43.     USART_Init(USART1, &USART_InitStructure);   

  44.     /* Usart1 NVIC配置 */
  45.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                 //设置NVIC中断分组2
  46.     NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
  47.     NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  48.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
  49.     NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
  50.     NVIC_Init(&NVIC_InitStructure);

  51.     /*初始化串口,开启串口接收中断 */
  52.     USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
  53.     /* 使能串口1 */
  54.     USART_Cmd(USART1,ENABLE);

  55. }
  56. /* USART1中断函数 */
  57. void USART1_IRQHandler(void)
  58. {
  59.     uint8_t ucTemp;                                         //接收数据
  60.     if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
  61.     {      
  62.         ucTemp = USART_ReceiveData(USART1);
  63.         USART_SendData(USART1,ucTemp);
  64.         if(ucTemp == 0x32)
  65.         {
  66.             LED_ON();
  67.         }
  68.         if(ucTemp == 0x31)
  69.         {
  70.             LED_OFF();
  71.         }
  72.     }
  73. }

  74. /* 发送一个字节 */
  75. void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)
  76. {
  77.     /* 发送一个字节数据到USART */
  78.     USART_SendData(pUSARTx,ch);

  79.     /* 等待发送数据寄存器为空 */
  80.     while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);  
  81. }
  82. /* 发送字符串 */
  83. void Usart_SendString( USART_TypeDef * pUSARTx, char *str)
  84. {
  85.     unsigned int k=0;
  86.   do
  87.   {
  88.       Usart_SendByte( pUSARTx, *(str + k) );
  89.       k++;
  90.   } while(*(str + k)!='\0');

  91.   /* 等待发送完成 */
  92.   while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET)
  93.   {}
  94. }
复制代码

程序效果:
         STM32端间隔一段时间串口发送“LED ON”、"LED OFF",ASRPRO接收到串口命令后会马上唤醒自动播报语音“灯光已打开”、“灯光已关闭”。

ESP32(3V单片机)
电路连接:
图片13.png
         掌控板的P15引脚的TX,接ASR PRO的RX,也就是接在PB6;P16引脚接到ASR PRORX引脚(PB5),两者的3V引脚互相连接,GND引脚互相连接。

范例:ASR PRO与掌控板进行串口通讯;编写一个程序,通过ASR PRO控制掌控板的板载RGB灯显示不同的颜色。
ASR PRO端程序
Snipaste_2023-01-17_09-53-58.png
图片15.png

掌控板端程序
图片16.png

micro:bit(3V单片机)
电路连接:
图片17.png
           在进行串口通信时,两个设备进行双向通信,此时两个设备的RX和TX要交错连接。例如Micro:bit,定义P16为RX口,则要接到ASR PRO的TX上,也就是PA2。Micro:bit的P16引脚的RX,接ASR PRO的TX,也就是接在PA2;P12引脚接到ASR PRO的RX引脚(PA3),两者的3V引脚互相连接,GND引脚互相连接。

范例:ASR PRO与Micro:bit进行串口通讯
ASR PRO程序
Snipaste_2023-01-17_10-01-50.png
图片18(1).png
图片19.png

Micro:bit程序
图片20.png

程序效果:
        按下micro:bit的AB按键,通过串口可以给ASR PRO发送字符串hello和world;当ASR PRO接收到后,就会回复对应的语音;当对ASR PRO说出“打开灯光、关闭灯光”时,ASR PRO和micro:bit的串口信息会显示在micro:bit的点阵屏上。
回复

使用道具 举报

0

主题

2

帖子

12

积分

注册会员

Rank: 2

积分
12
发表于 2023-2-3 03:55:03 | 显示全部楼层
hello thank you
回复

使用道具 举报

0

主题

1

帖子

12

积分

注册会员

Rank: 2

积分
12
发表于 2023-2-27 11:38:20 | 显示全部楼层
要学习学习,
回复

使用道具 举报

1

主题

5

帖子

43

积分

注册会员

Rank: 2

积分
43
发表于 2023-3-23 01:24:35 | 显示全部楼层
解决了万能的帖主雅
回复

使用道具 举报

1

主题

5

帖子

33

积分

注册会员

Rank: 2

积分
33
发表于 2023-4-1 16:10:03 | 显示全部楼层
核心板与5V单片机串口通信必须加电阻吗
回复

使用道具 举报

0

主题

2

帖子

8

积分

注册会员

Rank: 2

积分
8
发表于 2023-4-6 15:01:50 | 显示全部楼层
唤醒词和提示词哪个更灵敏呢?
相同的一个词分别作唤醒词和命令词,哪个方式更好用啊
回复

使用道具 举报

0

主题

1

帖子

12

积分

注册会员

Rank: 2

积分
12
发表于 2023-4-12 19:28:54 | 显示全部楼层
Arduino端程序能不能用代码或图形化编程写啊
回复

使用道具 举报

42

主题

197

帖子

2607

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2607
发表于 2023-4-13 08:57:52 | 显示全部楼层
ddwy43 发表于 2023-4-12 19:28
Arduino端程序能不能用代码或图形化编程写啊

修改了
回复

使用道具 举报

0

主题

1

帖子

4

积分

注册会员

Rank: 2

积分
4
发表于 2023-4-20 15:52:08 | 显示全部楼层
ddwy43 发表于 2023-4-12 19:28
Arduino端程序能不能用代码或图形化编程写啊

arduino可以用米思琪图形化编程,也可也以用C语言,简单点
回复

使用道具 举报

0

主题

1

帖子

28

积分

注册会员

Rank: 2

积分
28
发表于 2023-10-9 11:38:51 | 显示全部楼层
PA2,PA3和单片机连接时可以直接烧录程序麻?

我的一开始可以烧 可以用
后面就坏了 可以烧但是不能用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|好好搭搭在线 ( © 好好搭搭在线 浙ICP备19030393号-1 )

GMT+8, 2024-2-26 11:58 , Processed in 0.345870 second(s), 25 queries .

Powered by Discuz!

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表