目录
一、SU-03T语音识别模块
1.SU-03T简介
2.定制和烧录SDK
填写产品信息
定制语音SDK
编译固件
烧录固件
二、ADB简介
1.什么是ADB
2.OrangePi PC+使用adb连接手机
(1)安装adb
(2)adb连接手机
3.所需的几条adb命令
下划屏幕
上划屏幕
双击屏幕
锁定屏幕
三、整合串口代码,实现功能
SU-03T 是一款低成本、低功耗、小体积的离线语音识别模组,能快速应用于智能家居,各类智能小家电,86 盒,玩具,灯具等需要语音操控的产品。通过串口通信,可以实现SU-03T模块和开发板的交互,如:OrangePi PC+、STM32等。从而控制OrangePi PC+的外设(如果将我们的手机连接到OrangePi,也可以实现对手机的控制)
基本套餐应包括喇叭+模块主板+咪头(就是喇叭)+电源线,大概20元左右。(不需要拍300+的烧录器套餐。另外,买回来的模块并没有焊好针脚,需要自己焊接针脚。自备焊烙铁、锡丝等)
在智能公元官网,选择创建产品→纯离线方案→找到SU-03T→填写其他信息来到定制语音SDK的页面。(找到对于的产品SU-03T即可,其他信息不重要)
在Pin脚配置处,这里留有B2、B3和B6、B7两组引脚可配置作为通信串口(默认B6、B7可做烧录串口,非板子上标识的B0/RX0、B1/TX0)。选择其中一组设置为串口UART1即可。
接下来是自定义的唤醒词和命令词。唤醒词可自行添加,由于我们要使用该模块和OrangePi PC+通过串口进行通信,需要添加串口输出信息方便调试程序,所以在“离线命令词与应答语自定义”这里每条命令词的控制类型要设置为串口输出,且向串口输出内容要以十六进制填入。
完成SDK定制后,开始编译固件,这里需要时间较长。完成后会短信通知。完成后下载固件,按照淘宝卖家提供的资料操作烧录新的SDK即可。
详细教程可参考CSDN博文:SU-03离线语音模块的配置使用
注意串口烧录接线B6/RTD,B7/TXD(交叉接到TTL转USB即可,需要接上GND),点击烧录再上电。
安卓调试桥(ADB – Android Debug Brige)是一个客户端-服务器(CS)端程序。其中客户端是用来操作的电脑,服务端是 Android 设备。ADB 也是 Android SDK 中的一个工具,可以直接操作管理 Android 模拟器或者真实的 Android 设备,也就是Android程序的debug工具。
说明:①PC+刷的系统是最新的Armbian 22.04,尝试了几天,Ubuntu、Debian的系统均安装adb出现问题,猜测是/root/.android/目录下安装时没有生成允许调试的密钥,导致adb运行出问题。(在OrangePi Zero Plus2没有该问题)。在尝试百度各种解决方法并没有解决,最终更换Armbian系统解决。
②Android手机是Redmi,没有尝试过其他,但大部分Android 差别不大。
sudo apt-get install -y adb
打开手机的开发者选项(设置-我的设备-全部参数-连续点击MIUI版本进入)→打开允许调试(更多设置—开发者选项—USB调试)→数据线连接OrangePi和手机→点击手机弹出的允许调试(在Armbian没有看到权限问题导致的未认证的问题,如果有权限问题可能需要添加udev规则,详见百度)→输入adb shell命令测试能否连接入手机,如下图
(关键手机端要点击弹出的确认授权,如果没有弹出,可尝试adb kill-server结束adb服务,重新插拔手机在adb start-server开启,一般会重新弹出)
(已经连接好手机,在Linux命令行运行以下命令,有的手机需要开启手机允许修改权限和模拟点击,在开发者选项界面)
adb shell input swipe 540 1300 540 500 100
adb shell input swipe 540 500 540 1300 100
adb shell "seq 3|while read i; do input rap 350 1050 & input tap 350 1050 &sleep 0.05;done;"
adb shell input keyevent 26
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
int uartOpen (const char *device, const int baud){
struct termios options ;
speed_t myBaud ;
int status, fd ;
switch (baud){
case 9600: myBaud = B9600; break;
case 115200: myBaud = B115200; break;
default:
return -2 ;
}
fd = open(device,O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK);
if(fd == -1){
perror("open");
return -1;
}
fcntl (fd, F_SETFL, O_RDWR) ; //设置串口阻塞办法
//获取和修改当前选项
tcgetattr (fd, &options) ;
cfmakeraw (&options) ; //将终端设置为原始模式8N1无流控
cfsetispeed (&options, myBaud) ; //设置输入波特率
cfsetospeed (&options, myBaud) ; //设置输出波特率
options.c_cflag |= (CLOCAL | CREAD); //CLOCAL 忽略modem状态线,CREAD使能设备接收(某教材所述)
options.c_cflag &= ~PARENB ; //设置奇偶校验位——这里是无校验位
options.c_cflag &= ~CSTOPB; //设置1位的停止位
options.c_cflag &= ~CSIZE ; //用数据位掩码清空设置
options.c_cflag |= CS8 ; //设置8位的数据位
/* 设置输出模式*/
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
/* 设置等待时间和最小接收字符 */
options.c_cc [VMIN] = 0 ; //读取字符最少个数
options.c_cc [VTIME] = 100 ; //读取一个字符等待100分秒
tcsetattr (fd, TCSANOW, &options) ; //使上面新的设置生效
ioctl (fd, TIOCMGET, &status);
status |= TIOCM_DTR ;
status |= TIOCM_RTS ;
ioctl (fd, TIOCMSET, &status);
usleep (10000) ; //10ms
return fd ;
}
int uartfd;
/* 读取串口数据的线程 */
void *recvDatas(){
int cnt,readSize;
char *buffer = (char *)malloc(64);
while(1){
/* 判断串口是否有数据 */
if(ioctl(uartfd,FIONREAD,&cnt) == -1){
perror("ioctl");
return 0;
}else{
readSize = read(uartfd,buffer,cnt); //读取数据到buffer
}
switch(*buffer){
case 'W':
printf("xiaodu is ready\n");
break;
case 'N':
// printf("Next\n");
system("adb shell input swipe 540 1300 540 500 100");
break;
case 'L':
// printf("Last\n");
system("adb shell input swipe 540 500 540 1300 100");
break;
case 'P':
// printf("Prise\n");
system("adb shell \"seq 3 | while read i; do input rap 350 1050 & input tap 350 1050 &sleep 0.05; done;\"");
break;
case 'C':
// printf("Close\n");
system("adb shell input keyevent 26");
break;
default:
printf("Unknow comand\n");
}
memset(buffer,'\0',sizeof(buffer));
}
}
int main(int argc,char **argv){
pthread_t sendThread,recvThread;
if(argc < 2){
printf("syntax error.Usage:%s /dev/ttyS*\n",argv[0]);
return -1;
}
/* 以波特率115200打开串口,其他相关配置已在uartOpen接口中已默认 */
uartfd = uartOpen(argv[1],115200);
if(uartfd == -1){
printf("%s open error\n",argv[1]);
return -1;
}else
printf("open %s succeed.\n",argv[1]);
/* 接收数据并执行对于adb命令的线程 */
pthread_create(&recvThread,NULL,recvDatas,NULL);
while(1){
printf("Waiting now\n");
sleep(60);
}
return 0;
}
说明:由于笔者水平有限,文中难以避免有所错漏,敬请各读者斧正
版权声明:转载请附上原文出处链接及本声明。