初学者的机器人足球运动员。 MIPT比赛。 Android,Arduino和蓝牙

本文是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 + "#"; //     String angleCommand = "@" + angle + "@"; try { outputStream.write(speedCommand.getBytes()); //   outputStream.write(angleCommand.getBytes()); } catch(Exception e) { e.printStackTrace(); } } 

典型命令如下所示:#125#@ 180 @,其中125是速度,而180是角度。 当然,这可以简化,但是任务之一是保持亮度和可读性,以便以后可以轻松地对其进行解释,包括对儿童。

出现了新的sendHit()命令,当按下“ Hit”按钮时会触发该命令。 她发送单个“ /”。 由于普通蓝牙2.0+不会同时受到接收到的数据的影响,也就是说,它知道如何将它们放入队列中并且不会丢失,因此我们不需要控制它。 如果您要使用低功耗蓝牙4.0+(好吧,突然之间),已经需要手动组织队列,否则数据将丢失。

 ... bHit = findViewById(R.id.b_high_hit); //   bHit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { threadCommand.sendHit(); //     "" } }); ... private void sendHit() { try { outputStream.write("/".getBytes()); //   }catch (Exception e) { e.printStackTrace(); } } } 

Arduino的


因此,发送命令的协议已更改,接收算法也已更改。 他简化了。 一个如果跟踪踢也被添加。 这里是对草图的完整分析。

bt.read()读取一个字符。 如果为“#”,则速度符号开始。 我们阅读它们,直到出现结束字符“#”。 在这里不能使用for循环,因为速度长度是预先未知的(它可以是一位数字,两位数字或三位数字)。 结果值将写入变量。

同样的事情发生在转弯处。 读取速度和角度后,我们将所有内容传递给功能转弯(int速度,int角度)。

 void loop() { if(BTSerial.available() > 0) {//    char a = BTSerial.read(); //   if(a == '#') { //  sp=""; char b = BTSerial.read(); while( b != '#') { //   ,     sp+=b; b = BTSerial.read(); } } else if (a == '@') {//  val = ""; char b = BTSerial.read(); while(b != '@') { //    val+=b; //    b = BTSerial.read(); } turn(val.toInt(), sp.toInt()); //   ,   } else if (a == '/') { //,    Serial.println(a); servo.write(30); //  delay(150); servo.write(0); //    } lastTakeInformation = millis(); } else { if(millis() - lastTakeInformation > 150) { //     150 //  lastTakeInformation = 0; analogWrite(speedRight, 0); analogWrite(speedLeft, 0); } } delay(5); } 

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); //  } else if (angle < 31) { analogWrite(speedLeft, speed - 65); //  analogWrite(speedRight, speed); } else { analogWrite(speedLeft, speed); analogWrite(speedRight, speed); } } 

MIPT的比赛,而不是总计的比赛


带着我们的机器人,我们参加了机器人足球比赛,该比赛于2019年4月14日在多尔戈普鲁德尼的莫斯科物理技术学院举办。 我们设法进入了1 \ 4的决赛,但并没有进一步前进。



该过程本身对我们很有趣,但是在这里,我将介绍通过查看现场机器人得出的结论:

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

评论和建议将非常高兴。 在以前的文章中,评论有时比文章本身更有趣。 谢谢SashaDana所做的工作

Source: https://habr.com/ru/post/zh-CN448080/


All Articles