本文是
Love,Death和Robots作品的半集
, “由Android设备通过蓝牙控制的基于Arduino的机器是一个完整的周期”,包括两个部分(
一个 ,
两个 )。 在那里描述的东西经过了稍微的修改,重做,并且机器人从行进的机器本身变成了足球运动员。 通常,有关如何执行操作的材料很有趣。
之前的说明分为两部分:软件和物理。 双向变化不大,因此这次所有内容都在一个副本中。 我将简要提醒您为什么需要所述的部分,但是为了全面理解,最好回顾一下前两个部分。
身体部位
基于第一篇文章中描述的所有相同原理:
- Arduino Uno和Motor Shield的三明治。
- 两个电动机连接到电动机护罩。
以下是更改:
- 奇怪的是,冲击部分出现了,这是造成击球的原因。
- 外壳现在完全是我的了,可以在3D打印机上打印。
房屋
形式是一个圆盘,其中一个板和两个轮子都适合。 冲击力将承受的部分的延伸。

在设计时,请注意:
- 高边。 机器人在游戏中发生碰撞,侧面不仅保护您的电线,还保护您的对手免受电线的伤害。
- 重心稳定。 重心当然是木板所在的位置。 车轮位于其附近,因此它们不会打滑。 另外,电池还放在板上。
- 为防止机器人啄食它的鼻子或后背,我们将球从安培处安放到套件中(如果不在,则可以用任何其他滑动设计代替它)。
- 设计的刚性。 平台不得在电路板和电机的重量下下垂。 请勿使用硬质材料(胶合板)或用机架加固塑料结构

现在主要的废话
由于缺少“啄食”而增加的球将平台抬高,从而使车轮无法到达地板。 为了避免这种情况,我们要么使用更大直径的轮子,要么缩短支撑结构。 一般来说,我们会预先计算!
震动部分。 她没有打。 节拍,但不够酷。 在我们的第一个模型中,有一台伺服机,连接了类似于扫雪机铲斗的零件。 通过更改伺服器的位置(从0到30度),可以模拟打击。 但是事实证明,舵机很慢,因此打击变得更加困难。
有两种解决方法:加冲击力或用螺线管替换伺服器。 第一种选择是通过在冲程期间为车轮提供速度来增加动量。 在实践中,方法如下:用户按下击打按钮,机器人从现场(稍微)启动,同时进行打击。
第二种选择-螺线管推动电击部件,这里一切都取决于电击的功率(速度),而电击的功率(速度)又取决于螺线管的特性。

软件部分
按照已经是一篇文章的优良传统,我们将本节分为两部分。 首先是一个Android应用程序,然后是一个Arduino草图。
安卓系统
让我提醒您,该应用程序是我从头开始编写的。 在过去的六个月中,我对此事有了更多了解,因此我将描述
doper的想法。
首先,让我们简化一下。 现在的通信协议如下:“开始字符” +“值” +“结束字符”(要了解我如何获得这些值以及它的全部含义,请参见
此处的完整分析)。 这适用于速度和角度。 由于只有一种罢工,他不需要这种智慧,因此命令由一个“ /”字符组成(关于段落中的命中命令)。
private void sendCommand(String speed, String angle) { String speedCommand = "#" + speed + "#";
典型命令如下所示:#125#@ 180 @,其中125是速度,而180是角度。 当然,这可以简化,但是任务之一是保持亮度和可读性,以便以后可以轻松地对其进行解释,包括对儿童。
出现了新的sendHit()命令,当按下“ Hit”按钮时会触发该命令。 她发送单个“ /”。 由于普通蓝牙2.0+不会同时受到接收到的数据的影响,也就是说,它知道如何将它们放入队列中并且不会丢失,因此我们不需要控制它。 如果您要使用低功耗蓝牙4.0+(好吧,突然之间),已经需要手动组织队列,否则数据将丢失。
... bHit = findViewById(R.id.b_high_hit);
Arduino的
因此,发送命令的协议已更改,接收算法也已更改。 他简化了。 一个如果跟踪踢也被添加。
这里是对草图的完整分析。
bt.read()读取一个字符。 如果为“#”,则速度符号开始。 我们阅读它们,直到出现结束字符“#”。 在这里不能使用for循环,因为速度长度是预先未知的(它可以是一位数字,两位数字或三位数字)。 结果值将写入变量。
同样的事情发生在转弯处。 读取速度和角度后,我们将所有内容传递给功能转弯(int速度,int角度)。
void loop() { if(BTSerial.available() > 0) {
turn()函数确定要移动的方向(向前,向后)以及在何处转动(向右,向左,笔直)。 如果必须限制if(speed> 0 && speed <70),以便在丢失字节时机器人不会放慢速度。 当我提高传输速度(在团队之间延迟100-300ms播放)时遇到了这个问题-有时速度值没有达到,变为0、40(尽管实际上是发送了240)。 拐杖,但行得通。
可以将其称为“针对不可控因素的保护”。
void turn(int angle, int speed) { if(speed >= 0 && speed < 70) return; if(speed > 0) { digitalWrite(dirLeft, HIGH); digitalWrite(dirRight, HIGH); } else if (sp < 0) { digitalWrite(dirLeft, LOW); digitalWrite(dirRight, LOW); } if(angle > 149) { analogWrite(speedLeft, speed); analogWrite(speedRight, speed - 65);
MIPT的比赛,而不是总计的比赛
带着我们的机器人,我们参加了机器人足球比赛,该比赛于2019年4月14日在多尔戈普鲁德尼的莫斯科物理技术学院举办。 我们设法进入了1 \ 4的决赛,但并没有进一步前进。

该过程本身对我们很有趣,但是在这里,我将介绍通过查看现场机器人得出的结论:
- 需要更强大。 四轮或更强力的发动机和其他轮是理想的。 虽然,当然,四轮驱动的车型看起来更具优势
- 管理水平不高。 必须将机器人转移到油箱转弯处(由于车轮沿相反方向旋转,因此会在某一点转弯),否则转弯半径太大。 通常, 对于足球来说 ,带有四个箭头的选项而不是具有成比例速度的圆的选项更为可取。 所描述的选项更适合连续行驶的比赛,在这里您需要保持清晰(我绕着轴线旋转了10度,对准了球并向前按下了按钮。但是,当我已经抓住球时,我想灵活地操纵,但是这里需要按比例进行操作速度...您需要以某种方式将其组合)。
评论和建议将非常高兴。 在以前的文章中,评论有时比文章本身更有趣。 谢谢
Sasha和
Dana所做的工作 。