使用合宙air101系统板DIY一个小船
这个故事还得从在校园湖边散步说起……水面上遥控船吸引了我……
视频演示:【划水的瓶子-哔哩哔哩】
材料清单:
合宙air101小板:9.9元
航模有刷电机:5元左右
L298N电机驱动板:6元左右
蓝牙模块:jdy33,7元左右
航模3s电池或者5-12V充电宝
工具:
热熔胶枪,烙铁,焊锡,杜邦线,剪刀……
功能:
能实现手机控制小船前进后退及行驶速度;超过信号距离,蓝牙断开后,小船停止运动。
硬件连接
原理:
代码:原理看注释
--定义限幅函数
function LimitThrust(T)if T>100 thenT=100elseif T<0 thenT=0endreturn T
endfunction shache()--刹车--刹车
--控制电机L转动方向,逆时针
gpio.set(19,0)--PB3-->IN2
gpio.set(21,0)--pB5-->IN1
--上电后,先关闭PWM,
-- pwm.close(1)--关闭PWM0
--控制电机R转动方向,顺时针
gpio.set(1,0)--PA1-->IN3
gpio.set(4,0)--pA4-->IN4
--上电后,先关闭PWM,
-- pwm.close(0)--关闭PWM0
print("刹车,关闭PWM")
endfunction qianjin(X,Y)--前进local T_start=40 --启动油门,慢慢调,T_startlocal TL=T_start-(50-X)+(Y-50)--左边电机,TL不超过100,得限幅local TR=T_start+(50-X)+(Y-50)--右边电机,TR不超过100,得限幅--控制电机L转动方向,逆时针,产生拉力gpio.set(19,1)--PB3-->IN2gpio.set(21,0)--pB5-->IN1--控制电机R转动方向,顺时针,产生拉力gpio.set(1,0)--PA1-->IN3gpio.set(4,1)--pA4-->IN4--限制在0-100内local speed_L=LimitThrust(TL)-- (0~100)local speed_R=LimitThrust(TR)-- (0~100)print("speed_L",speed_L)print("speed_R",speed_R)if speed_L==0 or speed_R==0 thenpwm.close(0)--关闭PWM0pwm.close(1)--关闭PWM1print("PWM Close")else--Suart.write(id,"PWM open "..tostring(speed_x))--此函数只能发送字符串,不能发送数字,发送给手机pwm.open(1,50,speed_L,0,100)--占空比为0时,会出问题,所以用if else区分开,左边电机接PWM1pwm.open(0,50,speed_R,0,100)--占空比为0时,会出问题,所以用if else区分开,左边电机接PWM0end
endfunction houtui(X,Y)--后退local T_start=40 --启动油门,慢慢调,T_startlocal TL=T_start-(50-X)+(50-Y)--左边电机,TL不超过100,得限幅local TR=T_start+(50-X)+(50-Y)--右边电机,TR不超过100,得限幅--控制电机L转动方向,顺时针,产生推力gpio.set(19,0)--PB3-->IN2gpio.set(21,1)--pB5-->IN1--控制电机R转动方向,顺时针,产生推力gpio.set(1,1)--PA1-->IN3gpio.set(4,0)--pA4-->IN4--限制在0-100内local speed_L=LimitThrust(TL)-- (0~100)local speed_R=LimitThrust(TR)-- (0~100)print("speed_L",speed_L)print("speed_R",speed_R)if speed_L==0 or speed_R==0 thenpwm.close(0)--关闭PWM0pwm.close(1)--关闭PWM1print("PWM Close")else--Suart.write(id,"PWM open "..tostring(speed_x))--此函数只能发送字符串,不能发送数字,发送给手机pwm.open(1,50,speed_L,0,100)--占空比为0时,会出问题,所以用if else区分开,左边电机接PWM1pwm.open(0,50,speed_R,0,100)--占空比为0时,会出问题,所以用if else区分开,右边电机接PWM0end
endRxData={[1]=0,[2]=0,[3]=0,[4]=0,[5]=0,}function jiexi(rec_data)--解析数据帧--由于蓝牙端口或者连接会自动发送数据给串口,这种简单的通信方式会造成错误命令,但也可以利用这个做个保护机制--连接成功自动给串口发送:+CONNECTED 对应的RxData[1]=C ,ASSIC码为67。RxData[2]=O , ASSIC码为79。--蓝牙断开自动给串口发送:+DISCONNECT 对应的RxData[1]=D ,ASSIC码为68。RxData[2]=I ,ASSIC码为73。--解析手机发来的命令RxData[1]=string.byte(rec_data,1,1)--帧头OXA5,ASSIC码为165RxData[2]=string.byte(rec_data,2,2)--接收数据帧的第二个字符,x轴数据,0~100RxData[3]=string.byte(rec_data,3,3)--接收数据帧的第三个字符,y轴数据,0~100RxData[4]=string.byte(rec_data,4,4)--校验和,由手机app算好,发送过来RxData[5]=string.byte(rec_data,5,5)--帧尾OX5A,ASSIC码为90
end--根据L298N使用说明,需设置引脚电平控制电机转向,选择
--控制电机L转动方向
--GPIO19-->PB3-->IN2
--GPIO21-->pB5-->IN1
gpio.setup(19, 0)
gpio.setup(21, 0)
--控制电机R转动方向
--GPIO1-->PA1-->IN3
--GPIO4-->pA4-->IN4
--先将引脚设置为输出模式,后续更改输出电平控制转向
gpio.setup(1, 0)
gpio.setup(4, 0)--设置串口
uart.setup(1,9600)--设置串口1的波特率为9600
--打开串口1的回调函数,当串口1收到数据会自动调function函数
uart.on(1,"receive",function(id,len)Rec_data=uart.read(id,len)--将串口收到的数据读出jiexi(Rec_data)--解析数据帧if (RxData[1]==165)and(RxData[5]==90)and(RxData[4]==RxData[2]+RxData[3]) then--判断是否为有效数据帧--print("x=",RxData[1],"y=",RxData[2])local x=RxData[2]local y=RxData[3]if (x>=0 and x<=100)and(y>=0 and y<=100)then--有效坐标数据if y>50 then--摇杆中位以上qianjin(x,y)--前进elseif (x==50 and y==50) then--摇杆中位shache();--刹车elseif y<50 thenhoutui(x,y)--后退endendelseif (RxData[2]==67 and RxData[3]==79)or(RxData[2]==68 and RxData[3]==73) then--如果是蓝牙断开或者连接产生的提示字符串shache();--刹车endend)
注意:
1,
--由于蓝牙端口或者连接会自动发送数据给串口,这种简单的通信方式会造成错误命令,但也可以利用这个做个保护机制--连接成功自动给串口发送:+CONNECTED 对应的RxData[1]=C ,ASSIC码为67。RxData[2]=O , ASSIC码为79。--蓝牙断开自动给串口发送:+DISCONNECT 对应的RxData[1]=D ,ASSIC码为68。RxData[2]=I ,ASSIC码为73。
2,调试时,不要上桨叶
3,电机会发烫,全靠热熔胶是不行的
感觉:真不错,100行代码不到搞定
视频:
手机端:
安装app:蓝牙调试器
配置步骤:
1,刷新蓝牙,连接蓝牙
2,进入专业调试,点击中间弹出,添加工程,进入通信设置,再编辑控件
通信设置:添加两个字符型变量,命名为 x,y,
再编辑控件:
添加组件,链接变量,调整组件大小
弄好返回,自动弹出设置x\y范围,设置为0-100,打开这个开关,摇杆会自动归中
点击运行:
可以愉快的玩耍了。
补充:
这个是协议
设置通信模式:仅操作控件时发生。拒绝无效通信
有改成其他单片机的需求,联系主页邮箱
使用合宙air101系统板DIY一个小船相关推荐
- AIR32F103(一) 合宙AIR32F103CBT6开发板上手报告
目录 AIR32F103(一) 合宙AIR32F103CBT6开发板上手报告 AIR32F103(二) Linux环境和LibOpenCM3项目模板 AIR32F103(三) Linux环境基于标准外 ...
- 0.1.3 合宙CORE-ESP32-C3开发板用arduino点亮ST7735 1.8寸TFT屏【已更新失效链接2022.07.10】
9.9的ESP32开发板想用arduino开发,无奈都是用luatos玩,于是折腾了下 目的 用arduino驱动合宙ESP32-C3开发板点亮S7735TFT屏 材料 CORE-ESP32-C3开发 ...
- 含税9.9元包邮——合宙ESP32-C3核心板来了
当ESP32遇上LuatOS,会产生怎样奇妙的火花?--工程师朋友们呼声极高的CORE ESP32-C3核心板来了. 工程师需要,合宙造!适配越来越多的CPU支持LuatOS,敬请期待! 合宙ESP3 ...
- 合宙Air101的软硬件开发
上半年利用业余时间使用国产芯片-合宙Air101 做了个小玩具,有点小成果,奈何现在忙带娃,基本没有时间继续了,已经吃灰了一段时间,做个总结,送有缘人. XT-E804是阿里平头哥的MCU,属于CSK ...
- 合宙-icool 开发板使用手册
概述:iCool(idea cool)手机是基于合宙Air722UG模块,移植LittleVGL,用lua脚本语言开发的一款5寸触摸屏手机产品. 目录 1.总体介绍 2.准备工作 3.功能介绍 3.1 ...
- 实测:合宙ESP32C3开发板可以直接用Arduino开发
合宙推出了一款ESP32C3开发板,制作精良,而且9.9包邮,可谓是相当吸引人了. 但当看某宝评论的时候,会发现很多人要么说这款开发板不能用Arduino开发,要么说不适合小白使用,又有说需要用电烙铁 ...
- 合宙Air101 的LCD怎么用Arudino IDE驱动
屏幕怎么驱动 有个官方的资料,可以了解到是ST7735,屏幕的分辨率 https://doc.openluat.com/wiki/21?wiki_page_id=2672 有个库但是这个库是LuatO ...
- 新品上市 | 合宙工业级4G全网通DTU全新来袭,DTU-S401核心板超值团购开启
搭载LuatOS-iRTU软件解决方案的DTU,不仅仅是一种传统DTU,更是一种"硬件成本大幅降低.业务功能扩充方便.脚本源码免费开放"的系统级主控DTU. 合宙DTU-S401核 ...
- 实惠的Arduino开发板——合宙ESP32C3
目录 1.0 ESP32C3单片机 2.0 使用方法: 3.0 其他注意事项: 4. 小结 esp32长期以来都是最具性价比的开发板,特别在当今的缺芯潮下,很多MCU价格已经上天,但esp32系列仍然 ...
最新文章
- 移动端AR的适用分析(二)
- 文字输入限制_输入框设计,设计样式及设计要点
- Adaboost算法原理以及matlab代码实现(超详细)
- 中国工商银行的 Service Mesh 探索与实践
- [20151112]ORA-01450?3215?.txt
- 超图Cesium鼠标事件处理
- 洛谷P1879 [USACO06NOV]玉米田Corn Fields
- 赛锐信息:SAP 程序优化
- SENT协议学习总结
- oracle存储过程实例带参数,oracle简单存储过程(带参数)
- 在ENVI5.3 下基于GLT/IGM文件的几何校正具体过程
- 制作u盘启动盘对u盘有什么影响
- 影响不良贷款拨备覆盖率的因素分析
- 【开发环境】(基于Hexo)个人博客主题(Hexo Fluid)更换
- 《The One!团队》第一次作业:团队亮相
- Verilog 6位数码管LG3661BH 的动态显示
- Polo360网站页面制作练习
- 生物信息学 | 富集分析
- 根据年月以及月中周次,获取该周开始,结束日期
- 3D打印机Marlin固件双Z轴设置
热门文章
- 树莓派3使用红外遥控器模拟鼠标和键盘
- ubuntu 查询程序崩溃日志_ubuntu查看系统日志及相关文件介绍
- 对比腾讯、163、商务密邮、360加密邮,发加密邮件用哪个更好
- Kafka系列 - 10 Kafka副本|分区副本分配|手动调整分区副本|Leader Partition 负载平衡|增加副本因子
- ftp工具上传,三大ftp上传工具(推荐)
- 计算机打开bios按键,电脑按热键,进入不了,BIOS怎么处理
- Netkiller FreeBSD 手札之前言
- 最新产品 L1频段卫星导航射频前端低噪声放大器芯片AT2659
- 强化学习经典算法笔记(十九):无监督策略学习算法Diversity Is All You Need
- ionic和avos相结合