Arduino控制的蓝牙控制的Android设备-全周期(第1部分)

引言


由三个引擎组装由Android设备通过蓝牙控制的Arduino汽车的详细历史记录。 在几十个段落中,我将尝试逐步解释每条电线的连接位置,如何编写专有应用程序以及我不得不跳过一周多的儿童耙子。

有关级别,作者和警告的一些信息


我是一位作家,是一个16岁至17岁的孩子,来自莫斯科附近的一个村庄,他专门编写Android应用程序(而且很难烧掉某些东西),因此我承担起解决问题的最佳方法的责任。

实际上,以下所述的每个步骤花了我更多的时间。 可能因为这个原因,我想分享自己的经验。 同时,如果您责骂自己的错误并告诉我进行优化,我将非常高兴。

挑战赛


最简单的任务是制作Arduino控制的汽车驱动器,并将遥控器替换为android。 但是在大多数情况下,我不得不重新发明轮子,因为在Internet上找不到合适的解决方案。

将需要


  1. Arduino的
  2. 电机罩(在我的情况下为两个)
  3. 蓝牙功能
  4. 安卓系统
  5. 常规电线

设计依据


乐高户外挑战者被作为基础(实际上,它看起来不太可悲)。 她剩下的一切:机壳(所有装饰元素均被移除)和三个引擎。
图片
机器有自己的主板,但是其中一项任务隐含着普遍性:我做到了,其他人可以重复。 他动脑筋,放了Arduino Uno。

Arduino安装


由于某些原因,创建者没有为Arduino提供空间,因此他们通过钻孔塑料将其固定在螺钉上。 他将胶合板放在木板下,以免短路。 最好在螺丝(一瓶)下面滑一些塑料,因为板子没有铁螺栓保护。



我立即在板子顶部放了两个马达,这样就可以了。 要控制第二根线,您必须将一根线从任何数字端口连接到H1(方向),将第二根线从带有垫片支撑(标有“〜”,通常为10、11)的引脚上连接到E1(速度)。



确定旋转角度


出人意料的是,响应于机器旋转的不是伺服驱动器,而是普通的发动机。 有一个问题:最好不要燃烧它,因为旋转角度是有限的,并且发动机可以随心所欲旋转。

拨动方法的选项消失了,因为在不同的电池电量下,提供给电动机的电流量将发生变化,这将导致角度不断变化。 转动到停止位置也是不可能的,迟早的齿轮会崩溃。

解决方案:通过电路跟踪角度。 照片显示了一个小东西,它安装在旋转机构附近。 在发动机随车轮向左/向右旋转的部分上,装有带铁触点的扇贝。





工作原理:将一根导线焊接到每条线上(总共四根),底部连接到正极(始终用梳子夹紧,见图),其余导线变为负极。 当扇贝齿落在最下面一行时,例如第三行,发生短路,电流流过,这是Arduino注意到的。



由于三个波段的各种组合,最多可以定义七个角度。 例如,当所有线路上都有电流时,将车轮转到最右位置,而仅在顶部上有电流时,则将车轮尽可能向左转动。 该表提供了所有选项。



连接角度和代号


每种颜色都有其自己的颜色:底部是绿色,下面的第一个是红色,第二个是黑色,第三个是白色。 在初始阶段,使用面包板和LED进行视觉调试。



连接图如图所示。 再加上我们拉到绿色,其他的我们拉到负。 通过安装的电阻来消除干扰和避免短路,将导线连接到输出A0-A2。 仅从保存其他端口中选择它们。



该代码带有注释。 我们连接引脚并通过digitarRead()询问它们。 如果有电压,将返回true。 接下来,我们查看结果是否意味着车轮处于极限位置,我们禁止沿该方向再转弯。

一个小技巧:由于将来将需要5V和3.3V的输出,因此您可以在一个数字引脚上加一个加号。 每次检查角度之前,请先通过digitalWrite(whitePin)提供电流,然后检查角度并除去电流。

int speedTurn = 180; // ,  0  255 //    int pinRed = A0; int pinWhite = A1; int pinBlack = A2; int pinAngleStop = 12; //   ,    ,  //   void setup() { //    pinMode(pinRed, INPUT); pinMode(pinBlack, INPUT); pinMode(pinWhite, INPUT); // pinMode(pinAngleStop, OUTPUT); //  ,    pinMode(angleDirection, OUTPUT); pinMode(angleSpeed, OUTPUT); Serial.begin(9600); } //   loop(),      void turn(int angle) { digitalWrite(pinAngleStop, HIGH); //   ,    delay(5); // ,   ""  if(angle > 149) { if( digitalRead(pinWhite) == HIGH && digitalRead(pinBlack) == LOW && digitalRead(pinBlack) == LOW) { //    ,      ,   //  return; } //   ,  digitalWrite(angleDirection, HIGH); analogWrite(angleSpeed, speedTurn); } else if (angle < 31) { if(digitalRead(pinRed) == HIGH && digitalRead(pinBlack) == HIGH && digitalRead(pinWhite) == HIGH) { //    ,      ,   //  return; } //   ,  digitalWrite(angleDirection, LOW); analogWrite(angleSpeed, speedTurn); } digitalWrite(pinAngleStop, LOW); //     delay(5); } 

行走轮平行化


最初,两个推进引擎连接在一起。 之所以断开它们,有两个原因:如果车轮朝不同的方向旋转,转弯会更有效;两个强大的引擎不会拉一个板。

问题:电动机屏蔽罩有两个输出,每个输出产生2安培的电流。 每个引擎吃0.7A。 似乎更少,但不是在最大负载下。 假设机器卡在沙子中或被搁置,电流上升到安培以上。 不是很关键,但是有潜在危险。

但是事实证明,电路板加热至关重要。 比赛开始半分钟后,电动机护罩正在预热,并且开始工作异常:电流供应不正确,车轮没有旋转,依此类推。

解决这两个问题的方法:一台发动机连接到一个电动机护罩,第二台发动机连接到另一个。 奇怪的是,它有所帮助。 温度下降,没有过热。 您可以放一个散热器,但是很难安装。



蓝牙连接


我使用了HC-05模型,该模型起到了致命的笑话作用。 所有蓝牙都以相同的方式连接:一根线的电压为3.3V(有时只能从5V开始工作),第二根线的电压为负,另外两根线的端口为0和1(分别为读取和发送)。 蓝牙上由RXD签名的导线被卡在TXD arduino中,而TXD则被卡在RXD中(如果混合使用,将看不到数据)。

有一个警告:串行端口默认使用端口0和1,通过该端口可以填充草图。 也就是说,当蓝牙卡住时,草图不会被淹没。 有两种解决方法:在填充时取出蓝牙或重新分配蓝牙的输入和输出。 第二种选择分两行执行。

 #include <SoftwareSerial.h> \\  SoftwareSerial BTSerial(8, 9); \\ 8  9   0  1 

连续三天的工作使我吃饱的陷阱是沟通的速度。 出于习惯,我安装了9600并尝试。 要么没有数据,要么字符混乱。 最后答案是HC-05在38400上进行通讯! 请密切注意以下事实:尽管使用Serial.begin(9600),在Setup()中我将执行BTSerial.begin(39400)。

指令发送系统


这篇文章太长了,因此我将在第二部分中单独考虑Arduino和Android代码,现在我将描述原理。

android设备上有一个操纵杆(一个圆圈,其实现也位于第二部分)。 Android会从中读取读数并将其转换为适合arduino的数字:像素的速度会变成-255到255(负-反向)之间的值,并确定角度。 我故意将此任务交给了电话,因为它功能强大得多,并且能够从容应对每秒数百个值的计算。



安装插座后,将以以下格式发送数据:@ speed#* angle#。 @-表示以下数字包含速度,#-表示速度值的结尾,*-角度值的开始,#-完成角度记录。 周期是无限的,命令每100毫秒发送一次(选择了最佳数量)。 如果在android上没有执行任何操作,则不会发送任何内容。

在草图代码中详细描述了数据接收算法。 他不止一次地通讯,对我而言,他的工作非常完美。

第一部分结论


在本文中,我试图公开与机器物理部分有关的所有内容。 很可能我错过了一些事情,所以一定要问。

但是,对我而言,最有趣的是第二位-Arduino程序和Android应用程序,真正的魔力正在发生,至少对于年轻的我而言。

如果您找不到某个部分的答案,并且想亲自给我一个缺点,请等待-dendolg1@mail.ru,。

UPD:第二部分已经发布-habr.com/post/424813

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


All Articles