【香橙派系列教程】(四)基于ARM-Linux架构的语音控制刷抖音项目

news2024/9/21 5:48:30

【四】基于ARM-Linux架构的语音控制刷抖音项目

文章目录

  • 【四】基于ARM-Linux架构的语音控制刷抖音项目
    • 1.语音模块配置
      • 1.创建产品
      • 2.引脚配置
      • 3.词条定义
      • 4.添加控制
      • 5.发布版本
      • 6.烧录固件
    • 2.编程实现语音和开发板通信
    • 3.手机接入Linux热拔插
      • 1.dmesg命令
      • 2.adb调试
        • 踩坑问题
      • 3.总结
    • 4. 用shell指令来操作手机屏幕,模拟手动滑屏幕
    • 5.整合
      • 接线图
      • 代码

1.语音模块配置

整体逻辑是:

  1. 语音模块负责接收用户说话的信息,通过串口发送给H616
  2. H616写好业务逻辑的处理,当接收不同信号时来处理不同的业务
  3. 通过USB接口连接手机,利用adb指令来控制安卓手机

安卓的底层是Linux,所以也可以接收一些Linux指令

智能公元:智能公元/AI产品零代码平台 (smartpi.cn)

进入官方平台,配置词条和识别后的串口输出指令。

1.创建产品

这里用到的语音模块型号为SU-03T

2.引脚配置

3.词条定义

4.添加控制

5.发布版本

其他的选项可以自行探索

6.烧录固件

首先连接好串口(记得交叉接线),插到电脑上面下载固件

下载需要冷启动:先把模块断电,然后点下载,下载进度变黄,之后再给模块上电

TXGPIO_B7
RXGPIO_B6

1.下载SDK固件包(里面自带烧录工具)

2.找到烧录工具

烧录器

固件位置与烧录器一个位置

开始烧录

烧录完固件之后,可以插到电脑上面配合串口助手看一下发送的信息

2.编程实现语音和开发板通信

首先将语音与开发板通过串口进行连接。

编译我们上一篇写的串口代码:

多文件编译方法: “ * ”为通配符,统一编译所有以uartT开头的文件

运行:

因为输出是乱码,所以需要我们修改一下发送的函数。

uartTool.c

//加入这段话
char myserialGetchar (const int fd)
{
  char x ;

  if (read (fd, &x, 1) != 1)
    return -1 ;

  return x ;
}

uartTool.h

char myserialGetchar (const int fd);

uartTest.c

添加串口读取一个字符的接口

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>
#include <stdio.h>
#include "uartTool.h"
int fd;
void* readSerial()
{
    char cmd;
    while(1){
        cmd = myserialGetchar(fd);
        switch(cmd){
            case 'N':
                printf("next\n");
                break;
            case 'P':
                printf("pre\n");
                break;
            case 'Z':
                printf("zan\n");
                break;
            case 'Q':
                printf("qu\n");
                break;
        }
    }
}
int main(int argc, char **argv)
{
    char deviceName[32] = {'\0'};
    pthread_t readt;
    if(argc < 2){
        printf("uage:%s /dev/ttyS?\n",argv[0]);
        return -1;
    }
    strcpy(deviceName, argv[1]);
    if( (fd = myserialOpen(deviceName, 115200)) == -1){
        printf("open %s error\n",deviceName);
        return -1;
    }
    pthread_create(&readt, NULL, readSerial,NULL);
    while(1){sleep(10);}
}

3.手机接入Linux热拔插

1.dmesg命令

Linux dmesg(英文全称:display message):命令用于显示开机信息。

用法:dmesg

说明:查看所有开机日志信息

  • kernel 会将开机信息存储在 ring buffer 中。您若是开机时来不及查看信息,可利用 dmesg 来查看。
  • 开机信息亦保存在 /var/log 目录中,名称为 dmesg 的文件里。

1、查看命令版本

(base) [root@s186 ~]# dmesg -V
dmesg,来自 util-linux 2.23.2

2.过滤想查看信息

建议使用-i参数过滤时忽略大小写
(base) [root@s186 ~]# dmesg |grep -i cpu

2.adb调试

第一步:连接

用Type-c连接手机和orangepi zero2

输入指令查看usb设备:dmesg

此时能看到usb设备号和名称,这时只是单纯的识别了这个usb设备,但没有什么办法调试这个手机。

第二步:调试

如何调试?使用adb指令

//查看adb是否安装
adb version
//默认是没有安装adb的,安装指令:
sudo apt-get -y install adb

//调试
adb devices
//进入shell指令
adb shell

踩坑问题

**第一个坑:**OK了,还有一个点我们需要注意的是要打开手机的开发者选项 -> USB调试功能,不然就会出现以下情况

即使我们已经连接成功了,dmesg也能监测到,但是还是看不到任何信息。

我们打开手机USB调试功能之后,再次运行:

手机会弹出来usb调试确认界面,需要手动点击确认(有时候弹不出来,拔插多试试)

到此adb 和Android连接成功,此时adb可以调试Android,通过shell指令控制手机。

**第二个坑:**当我输入adb shell时,也会报错

这是我出现的一种情况1:

手机:选择USB用于传输文件,可以进入adb调试,但是到达shell指令这块会出问题

这个的解决办法在第三个坑介绍

还有另外一种情况2:

手机:选择USB用于仅充电,直接卡在访问设备这里,进入不了adb调试

没有访问权限,也就是没有生成文件柄,应用层无法操作接入的硬件设备:

此时,需要配置文件,以支持USB设备的热拔插,支持UDEV的机制

linux下一切皆文件:
udev机制:说白了就是为插入或者拔掉的设备,添加文件柄删除文件柄。

  1. 在/etc/udev/rules.d文件夹下创建规则文件
cd /etc/udev/rules.d/
sudo vim oppo-android.rules
  1. 在文件中添加内容
//1.USB子系统       2.环境变量:USB设备                  3.权限
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", MODE="0666"

**第三个坑:**当我使用adb指令的时候,始终报错这个

这是因为adb工具是安装在orangepi上面的,进入手机的shell指令肯定是找不到的,我们需要退回orangepi的命令行,就可以正常使用adb shell指令了。


3.总结

a. 把手机接入开发板
b. 安装adb工具,在终端输入adb安装指令: sudo apt-get install adb
c. dmeg能查看到手机接入的信息,但是输入adb devices会出现提醒
    dinsufficient permissions for device: user in plugdev group; are your udev
    rules wrong?
d. 配置文件,以支持USB设备的热拔插,支持UDEV的机制
    在/etc/udev/rules.d 文件夹下创建规则文件
    cd /etc/udev/rules.d/
    sudo vim 51-android.rules
    在文件中添加内容 SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", MODE="0666"
e. 在手机开发者选项中,打开USB调试,重新拔插手机
f. 手机弹出调试提醒,点确认手机调试模式

4. 用shell指令来操作手机屏幕,模拟手动滑屏幕

目前我们语音控制刷抖音,只需要这四个指令即可。

adb shell input swipe 540 1300 540 500 100 //向下滑动 540是水平的,1300是竖直方向,下是500,100是100毫秒内完成
adb shell input swipe 540 500 540 1300 100 //向上滑动
adb shell "seq 2 | while read i;do input tap 350 1050 & input tap 350 1050 & sleep 0.2;done;" //点赞
adb shell input keyevent 26 //锁屏

这里多介绍一些常用的shell指令(吃不饱的同学可以加餐哈!哈哈哈哈)

1.adb相关命令

  1. 关闭adb服务:adb kill-server

  2. 开启adb服务:adb start-server

  3. 查看当前连接的手机设备:adb devices

  4. 多设设备操作,< -s 虚拟设备名称 >

  5. 重启设备:adb reboot 指定虚拟设备: adb -s 设备名称 reboot

  6. 查看日志: adb logcat 清除日志: adb logcat -c

  7. 进入linux shell下 adb shell 其中常用的linux命令 cd cat 等等 输入su可以获取超级管理员名称了 要确定是否有哪些命令 进入 system/bin目录 就知道了

  8. 代理链接:adb connect [ip:post]

  9. 获取MAC地址:adb shell cat /sys/class/net/wlan0/address

  10. 安装应用:adb install <name.apk>

  11. 卸载安装包:adb uninstall <name.apk>

  12. 保存缓存文件重新安装:adb install -r <name.apk>

  13. 断开连接:adb disconnect <设备名>

  14. 文件复制到移动设备 ,后面跟设备目录:adb push filename /sdcard/

  15. 模拟位置点击(x,y):adb shell input tap

  16. 模拟滑动( x,yx1,y1 ),还可传入滑动缓冲:adb shell input swipe

  17. 获取当前页面的UI层 次,保存为xml文件:uiautomator dump dump: creates an XML dump of current UI hierarchy

18.模式实现输入:adb shell input text <输入任意内容>

2.adb模拟按键对照表

keycode含义
3HOME 键
4返回键
5打开拨号应用
6挂断电话
24增加音量
25降低音量
26电源键
27拍照(需要在相机应用里)
64打开浏览器
82菜单键
85播放/暂停
86停止播放
87播放下一首
88播放上一首
122移动光标到行首或列表顶部
123移动光标到行末或列表底部
126恢复播放
127暂停播放
164静音
176打开系统设置
187切换应用
207打开联系人
208打开日历
209打开音乐
210打开计算器
220降低屏幕亮度
221提高屏幕亮度
223系统休眠
224点亮屏幕
231打开语音助手
276如果没有 wakelock 则让系统休眠

调用实例说明:

命令: adb shell input keyevent <keycode>
  1. 示例,点击电源键:adb shell input keyevent 26  #执行效果相当于按电源键。
  2. 示例,输入"你好啊中国":adb shell input text "你好啊中国"  #执行效果相当于用户输入"你好啊中国"。
  3. 示例,模拟点击任何位置:adb shell input tap x y (x和y表示点击的坐标)

5.整合

接线图

语音模块

TXGPIO_B7
RXGPIO_B6

B6->8 B7->10

手机USB接口插到开发板上面。

代码

对于代码中system函数的使用,在进程一篇中有过讲解:进程

uartTest.c

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdarg.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <pthread.h>
#include "uartTool.h"
int fd;
void* readSerial()
{
    char cmd;
    while(1){
        cmd = myserialGetchar(fd);
        switch(cmd){
            case 'N':
                printf("next\n");
                system("adb shell input swipe 540 1300 540 500 100");
                break;
            case 'P':
                printf("pre\n");
                system("adb shell input swipe 540 500 540 1300 100");
                break;
            case 'Z':
                printf("zan\n");
                system("adb shell \"seq 2 | while read i;do input tap 350 1050 &input tap 350 1050 & sleep 0.2;done;\"");
                break;
            case 'Q':
                printf("qu\n");
                system("adb shell input keyevent 26");
                break;
        }
    }
}
int main(int argc, char **argv)
{
    char deviceName[32] = {'\0'};
    pthread_t readt;
    if(argc < 2){
        printf("uage:%s /dev/ttyS?\n",argv[0]);
        return -1;
    }
    strcpy(deviceName, argv[1]);
    if( (fd = myserialOpen(deviceName, 115200)) == -1){
        printf("open %s error\n",deviceName);
        return -1;
    }
    pthread_create(&readt, NULL, readSerial,NULL);
    while(1){sleep(10);}
}

uartTool.c

//uartTool.c
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdarg.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "wiringSerial.h"
int myserialOpen (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 ;
    }
    if ((fd = open (device, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK)) == -1)
        return -1 ;
    fcntl (fd, F_SETFL, O_RDWR) ;
    // Get and modify current options:
    tcgetattr (fd, &options) ;
    cfmakeraw (&options) ;
    cfsetispeed (&options, myBaud) ;
    cfsetospeed (&options, myBaud) ;
    options.c_cflag |= (CLOCAL | CREAD) ;
    options.c_cflag &= ~PARENB ;
    options.c_cflag &= ~CSTOPB ;
    options.c_cflag &= ~CSIZE ;
    options.c_cflag |= CS8 ;
    options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG) ;
    options.c_oflag &= ~OPOST ;
    options.c_cc [VMIN] = 0 ;
    options.c_cc [VTIME] = 100 ; // Ten seconds (100 deciseconds)
    tcsetattr (fd, TCSANOW, &options) ;
    ioctl (fd, TIOCMGET, &status);
    status |= TIOCM_DTR ;
    status |= TIOCM_RTS ;
    ioctl (fd, TIOCMSET, &status);
    usleep (10000) ; // 10mS
    return fd ;
}
void serialSendstring (const int fd, const char *s)
{
    int ret;
    ret = write (fd, s, strlen (s));
    if (ret < 0)
        printf("Serial Puts Error\n");
}
int serialGetstring (const int fd, char *buffer)
{
    int n_read;
    n_read = read(fd, buffer,32);
    return n_read;
}
//加入这段话
char myserialGetchar (const int fd)
{
  char x ;

  if (read (fd, &x, 1) != 1)
    return -1 ;

  return x ;
}

uartTool.h

//**uartTool.h**
int myserialOpen (const char *device, const int baud);
void serialSendstring (const int fd, const char *s);
int serialGetstring (const int fd, char *buffer);
char myserialGetchar (const int fd);

编译gcc uartTest.c uartTool.c -pthread

运行./a.out /dev/ttyS5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1965131.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Day14-Servlet后端验证码的实现

图片验证码的生成采用的是Kaptcha&#xff1b; Kaptcha是一个高度可配置的验证码生成工具&#xff0c;由Google开源。它通过一系列配置文件和插件&#xff0c;实现了将验证码字符串自动转换成图片流&#xff0c;并可以与session进行关联&#xff0c;从而在验证过程中使用&#…

如何快速进行视频截屏?5个软件帮助你快速截屏

如何快速进行视频截屏&#xff1f;5个软件帮助你快速截屏 截取视频屏幕是一项常见的任务&#xff0c;无论是为了制作教学视频、分享有趣的片段&#xff0c;还是保存重要的画面。以下是五款好用的软件&#xff0c;能够帮助你快速进行视频截屏。 迅捷视频转换器 这款软件不单…

EF8 code first 模式下去除自动生成表加s(复数形式)全网第一帖

前言: 今天下午一直在纠结这个问题&#xff0c;EF如果采用code first模式&#xff0c;进行迁移&#xff0c;他会表名自动给你加上s形成复数形式&#xff0c;搜了很久找到的觉方案有两种&#xff0c;其中实体类指定表名的方法是可行的&#xff0c;另外一种都是说 modelBuilder.…

昇思25天学习打卡营第XX天|LSTM+CRF序列标注

条件随机场&#xff08;CRF&#xff09;是一种用于序列预测的概率图模型&#xff0c;它考虑了序列中元素之间的相互依赖关系。与简单的多分类问题不同&#xff0c;CRF能够捕捉序列中标签的连贯性&#xff0c;如在命名实体识别中&#xff0c;一个词的标签往往依赖于它前面词的标…

【JDK11和JDK8并行与切换】

一、JDK11安装 1、下载jdk11&#xff0c;点击.exe安装在&#xff1a;C:\Program Files\Java\jdk-11\ 2、配置JAVA_HOME 变量名为JAVA_HOME 变量值为jdk安装路径 3、配置PATH 找到系统变量里的PATH 双击或者单击后点击编辑 点击右上角的新建 新建两条 %JAVA_HOME%\bin …

详细介绍Linux iftop 的结果如何查看

目录 1. 安装 iftop 2. 运行 iftop 3. iftop 界面详解 3.1 标题栏 3.2 流量显示区域 3.3 汇总信息 3.4 底部栏 4. 常用选项和快捷键 4.1 常用选项 4.2 常用快捷键 5. 实际案例 6. 真实排查网络【下行带宽过高】问题案例 6.1 【定义出口ip和端口】iftop -P 在流出服…

漏洞打靶AI-web1.0

下载安装靶机后要进行靶机ip的确定&#xff0c;具体步骤可以查看我的上一篇博客&#xff0c;这里就不细说了。 在物理机访问靶机IP地址进入这样一个页面&#xff0c;我们发现这里没有输入框也没有点击按钮&#xff0c;导致我们无处下手&#xff0c;不过我们还可以用工具去扫描…

无人机之社区管理篇

在社区管理中&#xff0c;无人机的应用更是为传统的管理方式带来了革新与便利。 一、安全监控与巡逻 无人机可以配备高清摄像头和红外传感器&#xff0c;进行24小时不间断的监控和巡逻。在社区中&#xff0c;无人机可以用于检测公共区域的安全状况&#xff0c;及时发现异常情况…

【C语言】处理文件错误:详解 strerror, perror, 和 fopen

&#x1f984;个人主页:小米里的大麦-CSDN博客 &#x1f38f;所属专栏:https://blog.csdn.net/huangcancan666/category_12718530.html ⚙️操作环境:Visual Studio 2022 目录 一、引言 二、fopen 函数 解释&#xff1a; 1. 函数原型 2. 参数 3. 代码示例 三、strerror …

形象设计大赛活动方案策划

一、活动流程 1、个人创意服装展示&#xff08;30分&#xff09;&#xff1a;选手自备服装&#xff0c;要能展示现代大学生青春、时尚&#xff0c;富有内涵的高雅气质和礼仪风范&#xff08;如:校园装、运动装、休闲装和职业装&#xff09;。 由评委评判出对选手的第一印象分。…

代码随想录二刷(哈希表)

代码随想录二刷(哈希表) 三数之和思路反正对于我来说是真的难想出来。 若这道题还是采用哈希表的思路去做&#xff0c;非常麻烦&#xff0c;并且还要考虑去重的操作。所以这道题其实用双指针&#xff0c;是更方便的。 具体程序如下&#xff1a; class Solution:def threeSu…

SPON IP网络对讲广播系统的命令执行漏洞复现实验

第一步&#xff1a;使用fofa搜索语句搜索 fofa地址&#xff1a;网络空间测绘&#xff0c;网络空间安全搜索引擎&#xff0c;网络空间搜索引擎&#xff0c;安全态势感知 - FOFA网络空间测绘系统 查询漏洞的语句icon_hash"-1830859634" 第二步&#xff1a;访问网址&…

LangChain大模型应用开发指南-传统编程范式思维的应用

LangChain大模型应用开发指南-传统编程范式思维的应用 上节课&#xff0c;我带领小伙伴们完成了baichuan2量化模型的OpenAI标准接口封装&#xff0c;并完成LangChain对大模型的调用与测试。 今天我们将正式开始LangChain大模型应用开发课程。 组件总览 上图为LangChain的组件与…

软件工程之应用数学

软件工程之应用数学 第 20 章&#xff1a;应用数学20.1 运筹方法20.1.1 网络计划技术20.1.2 线性规划20.1.3 决策论20.1.4 对策论 20.2 数学建模 第 20 章&#xff1a;应用数学 数学是一种严谨、缜密的科学&#xff0c;学习应用数学知识&#xff0c;可以培养系统架构设计师的抽…

机器学习三步走:手写BP神经网络(入门) --> 基于TensorFlow框架开发(开发) --> 基于预训练模型快速构建应用(应用)

目录 前言第一步&#xff1a;手写BP神经网络1 概念简介1.1 神经网络内的概念1.2 神经网络外的概念 2 类BPNetwork2.1 初始化2.2 激活函数2.2.1 Sigmod2.2.2 Linear2.2.3 Sigmod_derivative 2.3 损失函数2.4 前向传播2.5 后向传播2.6 训练模型2.7 预测2.8 绘制损失值变化曲线 **…

实验 19. 用户进程

已完成实验 已完成实验链接 简介 实验 19. 用户进程 总结 main函数创造了1个主线程&#xff0c;两个内核线程&#xff0c;两个用户进程。共5个PCB&#xff0c;进程PCB->pgdir为进程自己的页表首虚拟地址&#xff0c;线程为null。因此本次实验是五个进/线程在来回切换。他…

抖音素材网站有哪些?这几个高质量的抖音无水印素材网站分享

在抖音这个视觉与创意并重的平台上&#xff0c;选择合适的无水印视频素材是提升内容质量的关键。如果你正在寻找既能使你的视频内容更具吸引力&#xff0c;又能避免版权问题的优质素材&#xff0c;那么本文将为你详细介绍几个高质量的抖音无水印素材网站。从国内的蛙学网到国际…

双指针算法大总结!!看完这篇再也没有难的双指针题!!例题C++解法!

题源acwing、力扣 讲解双指针题目一&#xff1a;盛最多水的容器思路AC代码 题目二&#xff1a;查找总价格为目标值的两个商品思路AC代码 题目三&#xff1a;链表的中间节点思路AC代码 题目四&#xff1a;环形链表思路AC代码 题目五&#xff1a;反转字符串中的元音字符思路AC代码…

【Vulnhub靶场AI-WEB-1.0打靶教程】

第一步&#xff1a;查看虚拟机的ip 第二步&#xff1a;扫描ip下开放的80端口 第三步&#xff1a;扫描查到的ip地址下的目录 第四步&#xff1a;访问查到的目录 访问robot.txt 第五步:访问robot.txt显示出的目录 第六步&#xff1a;打开kali终端&#xff0c;使用sqlmap功能 sq…

【Vue3】标签的 ref 属性

【Vue3】标签的 ref 属性 背景简介开发环境开发步骤及源码 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日子。…