OpenHarmony项目实战:基于全志XR806实现的OpenHarmony棋子分拣工业样例
技术原理
关于技术实现,用到的材料主要有XR806开发板、两个9g的舵机,以及一个红外光传感器。
工作机制非常简单,如图所示:
上电后舵机复位到初始状态,任何开始工作,由一号舵机把待分类的棋子推移到检测区域,由红外传感器判断棋子的颜色,白色返回值为1,黑色则为0。
硬件模型制作
这一部分看似工作量大,但其实是参考了网上一些开源的例程,只不过加以了尺寸改动。
实现方法可以用3d打印或者激光切割亚克力,我选择了后者因为时间相对简短。使用的建模软件为Solidworks2019,亚克力板厚度后3mm,画好零件后,搭建好装配体确认尺寸无误后转为dxf格式即可用CNC机床切割。(我是用了学校的CNC,网上切也很便宜哈)
电路部分
使用的开发板为XR806,一款iot产品开发板,他最大的特点就是适配的轻鸿蒙,使用起来能有不错的体验。
需要驱动的设备就是两个舵机及一个红外传感器。
舵机就是一种位置伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。其工作原理是:控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。
以180度角度伺服为例,那么对应的控制关系是这样的:
0.5ms--------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;
拆开看看:
因为片子上的字眼实在太小,令人“望眼欲穿”,本来还想查查有没有技术文档研究一下,只能放弃先了。刚好鸿蒙也适配了pwm的接口驱动xr806,所以我们只要修改freq频率和duty占空比两个选项如下即可。
IoTPwmStart(PWM_OUTPUT_CH0,8,50);
关于其他基础操作姿势可以参考我之前的一篇呼吸灯的demo帖子。还有一点值得一提的是关于这种舵机的输入信号口我是用806上的接口直接驱动的,并没有再拉高,内部是否需要或者有没有额外的驱动由于没有舵机内部电路的原理图也暂时无从得知,但总感觉在调节duty占空这一参数时舵机时而会不听使唤(占空比调制不准确),希望有大佬指点。
红外传感器原理则相对简单,一个红外发射管和一个红外接收管。模块通电后红外发射管向前方不断发射一定频率的红外线,
比较输出和输入的信号做出相应反馈,体现到我手里这块小板子上就是接收到红外信号为1,没有接收到(遇到黑色物体)则为0。所以读取判断值的代码相对简单:
IoTGpioGetInputVal(13,&mode);
整体代码部分
openHarmony用的是gn和ninja编译,由很多种上手学习方式,如果说gn对标的是gcc脚本构建生成器,ninja就对应的是makefile构建系统文档了。
#Create by Randolph. import("//device/xradio/xr806/liteos_m/config.gni") static_library("app_GO") { configs = [] sources = ["main.c",] cflags = board_cflags include_dirs = board_include_dirs include_dirs += [ "//kernel/liteos_m/kernel/arch/include", "//base/iot_hardware/peripheral/interfaces/kits", "//device/xradio/xr806/xr_skylark/src/rom/rom_bin/src/driver", ] }
main.c
//Create by Randolph #include "kernel/os/os.h" #include "ohos_init.h" #include "iot_pwm.h" #include "driver/chip/hal_pwm.h" #define PWM_OUTPUT_CH0 PWM_GROUP0_CH0 //front #define PWM_OUTPUT_CH1 PWM_GROUP0_CH1 //back static OS_Thread_t g_main_thread; unsigned char mode; static void Servo_init(void) { IoTPwmInit(GPIO_PORT_A); IoTGpioInit(13); } static void Servo_reset(void) { printf("0/n"); IoTPwmStart(PWM_OUTPUT_CH0,8,50); OS_MSleep(500); printf("1/n"); IoTPwmStart(PWM_OUTPUT_CH1,8,50); OS_MSleep(500); } static void Servo_start(void) { printf("2/n"); IoTPwmStart(PWM_OUTPUT_CH1,5,50); OS_MSleep(500); IoTGpioGetInputVal(13,&mode); printf("3/n"); IoTPwmStart(PWM_OUTPUT_CH1,8,50); OS_MSleep(500); if(mode == 1) { printf("4/n"); IoTPwmStart(PWM_OUTPUT_CH0,10,50); OS_MSleep(500); } else { printf("4/n"); IoTPwmStart(PWM_OUTPUT_CH0,6,50); OS_MSleep(500); } printf("5/n"); IoTPwmStart(PWM_OUTPUT_CH0,8,50); OS_MSleep(500); } static void MainThread(void *arg) { Servo_init(); Servo_reset(); while (1) { Servo_start(); } } void PWM_TestMain(void) { printf("Test Start\n"); if (OS_ThreadCreate(&g_main_thread,"MainThread",MainThread, NULL, OS_THREAD_PRIO_APP, 4096) != OS_OK) { printf("[ERR] Create PWMLED_Task Failed\n"); } } SYS_RUN(PWM_TestMain);
最后在编译选项中加上即可
"GO_sorting:app_GO"
总结
到此基本功能是实现了,但有很多缺陷如我没有直观地体现出来分类后各种棋子的数量,也并没有给他加上控制开始和停止的操作。(没有一个对是否仍有棋子未被分类的判断机制)这些后续可以通过增加显示屏、替换红外传感器为压感贴片或者使用摄像头去学习判等等···最遗憾的是这个小demo暂时还没有发挥出XR806及鸿蒙的一些特征,如联网、连蓝牙。仅仅是个突发奇想的点子,希望能起到抛砖引玉的作用。后面我也会继续尝试给他加上其他功能。
再贴上一些前置学习内容:
官方文档:https://xr806.docs.aw-ol.com/
XR806开发板引脚功能表:https://bbs.aw-ol.com/topic/496/资料释放-xr806鸿蒙开发板引脚功能表
SDK获取到编译烧录:https://bbs.aw-ol.com/topic/499/xr806鸿蒙开发实战1-实操下载xr806鸿蒙代码并编译烧写
鸿蒙的外设接口:文件接口的头文件在:
base\iot_hardware\peripheral\interfaces\kits
源码在:
device\xradio\xr806\adapter\hals\iot_hardware\wifiiot_lite
带有iot字样的接口就是鸿蒙的接口。
端口复用:
Harmony\device\xradio\xr806\xr_skylark\project\common\board\xr806_OHOS\board_config.c
可以看到关于pwm的相关端口配置
__xip_rodata static const GPIO_PinMuxParam g_pinmux_pwm[] = { { GPIO_PORT_A, GPIO_PIN_19, { GPIOA_P19_F4_PWM0_ECT0, GPIO_DRIVING_LEVEL_1, GPIO_PULL_NONE } }, { GPIO_PORT_A, GPIO_PIN_20, { GPIOA_P20_F4_PWM1_ECT1, GPIO_DRIVING_LEVEL_1, GPIO_PULL_NONE } }, { GPIO_PORT_A, GPIO_PIN_22, { GPIOA_P22_F4_PWM3_ECT3, GPIO_DRIVING_LEVEL_1, GPIO_PULL_NONE } }, { GPIO_PORT_A, GPIO_PIN_12, { GPIOA_P12_F3_PWM4_ECT4, GPIO_DRIVING_LEVEL_1, GPIO_PULL_NONE } }, { GPIO_PORT_A, GPIO_PIN_13, { GPIOA_P13_F3_PWM5_ECT5, GPIO_DRIVING_LEVEL_1, GPIO_PULL_NONE } }, { GPIO_PORT_B, GPIO_PIN_3, { GPIOB_P3_F4_PWM7_ECT7, GPIO_DRIVING_LEVEL_1, GPIO_PULL_NONE } }, };
项目中所用到的引脚:
一号舵机信号线---------PA20
二号舵机信号线---------PA19
红外传感信号线---------PA13
用面包板引出开发板上的电源跟地供外设共用。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
碉堡!“万物皆可分”标记模型上线「GitHub 热点速览」
这周有个让人眼前一亮的图像识别模型 segment-anything,它能精细地框出所有可见物体,它标记出的物体边界线清晰可见。如此出色的模型,自然获得了不少人的赞赏,开源没几天,就拿下了 18k+ 的 star,而上周开源不到 48 小时获得 35k+ star 的推特推荐算法,本周也成功突破 50k+ 关卡。 依旧是 AI 热度不减的一周,本周的 AI 专场收录了一个离线生图工具,以及一个自托管 AI 编程助手。此外,还有 Meta 开源出来的重构版构建系统 buck2 也是大受欢迎,还有随着各类 AI 工具火起来的向量数据库,weaviate 也小小地展露了下头角。 还有比较少见的工具类应用,一款极简的输入法 rime-ice 也值得一看。 以下内容摘录自微博@HelloGitHub 的 GitHub Trending 及 Hacker News 热帖(简称 HN 热帖),选项标准:新发布 | 实用 | 有趣,根据项目 release 时间分类,发布时间不超过 14 day 的项目会标注 New,无该标志则说明项目 release 超过半月。由于本文篇幅有限,还有部分项目未能在本...
- 下一篇
透过Gartner最新报告,认识“超级边缘”
当下,酝酿能量的超级边缘。 最近,我们在谈视频化狂飙、谈AIGC颠覆、谈算力动能不足,很少谈及边缘。但“边缘”恰恰与这一切相关,且越发密不可分,它是未来技术发展的极大影响因子。 “到2025年,超过70%的组织将为其⾄少⼀个边缘计算系统,部署超⼤规模云边缘解决⽅案,并会结合其云部署。这比例远⾼于2022年的不到15%。” 这是Gartner在最近发布的 Competitive Landscape : Hyperscale Edge Solution Providers 报告中,给出的大胆又直接的判断。 Gartner视角中的“边缘”价值 “边缘是物和⼈与⽹络数字世界连接的物理位置,它是数字化转型,以及⼈、物和企业之间新交互的关键推动因素。”Gartner的描述,极度契合当下的边缘之力。 由边缘发展而来的边缘计算,正在呈现快速发展之势,它满⾜了对靠近边缘处理数据的⽇益增⻓的需求。它还通过解决延迟、带宽、⾃主性和隐私要求,来补充数字业务⽤例的云计算,这就顺势揭开了“边缘”的意义和能力。 提到云计算,固有印象一定是中心云。而边缘计算和中心云计算是相辅相成的,非相互竞争或排斥。下图显示,两种计...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Red5直播服务器,属于Java语言的直播服务器
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS关闭SELinux安全模块
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Linux系统CentOS6、CentOS7手动修改IP地址