Arduino的 项目“ RoboCar4W机器人机器”

您会理解,“编辑解释说”,它应该是娱乐性的,新鲜的,充满有趣的冒险经历的,以便读者无法脱身。
I. Ilf,E。Petrov “如何创建鲁滨逊”


像其他任何软件或硬件平台一样,Arduino入门对于某些实际项目总是更加有趣。 同时,程序员编写显示“你好,世界”的代码,建筑学家使LED闪烁。 小时候,每个人都很高兴。


我决定从一个高级项目开始,包括暗中希望从Counter-Strike(失败)中撕下年轻一代。


您可以从名称RoboCar4W猜到,第一个项目是四轮机器人汽车。 开始工作后,我已经具有编程经验,我曾经很长一段时间都知道如何焊接,但是我什至不知道Arduino的引脚排列,也根本不阅读文档。 我研究了游戏过程中的所有智慧,并得到了Google的帮助。


由于项目本身从根本上来说不是新项目,因此在网络中进行这样的描述就足够了,所有组件均已知,因此不会感到意外。 因此,这个想法是用最笼统的术语表述的,其主要目标是使用Arduino作为快速原型制作的平台,使自己沉浸在“事物世界”中。 在这个作品中,也许有人在旅途的开始就认出了自己。


所有的硬件都是在ebay上购买的,根据我自己的经验,我想说的是,立即购买入门工具包(用Arduino入门工具包的话查找它)要容易一些,而不是详细地组装它。 是的,而且全部在一起。 决定不费吹灰之力,购买普通的底盘,普通的车轮,普通的马达,以至于它“很贵”。


在eBay上成功购物的主要秘诀是从顶级卖家那里购买商品,并仔细阅读产品说明。 互联网上有很多关于此的文章。


选择哪个Arduino板?


我参加了Arduino UNO,其中有很多项目都有其描述。 但是现在我将使用Arduino Mega 2560,它具有更多的数字和模拟输出,并且与UNO的项目完全兼容。


项目概况


在软件开发领域,这也称为“系统需求”。


该项目的想法如下。 名为RoboCar4W的机器人机器的第一个版本应执行简单的操作:


  • 前进,后退,转弯
  • 测量到障碍物的距离
  • 能够自动绕过前方的障碍物。

必须通过Android手机上的蓝牙手动控制机器的第二版本。


为了使您更好地工作,请完成整个RoboCar4W项目的最终组装工作(此处没有蓝牙)。


Arduino的RoboCar4W


这是海上试验的视频。


在第一个视频中,RoboCar4W在两个不同版本的“固件”(即 因此,如果有人最热衷并注意到机器人在不同情节中的行为会略有不同,则可以进行素描。


机器人车RoboCar4W


在第二个视频中,RoboCar4W借助“驱动程序”通过蓝牙从Android下的手机通过蓝牙传输的命令移动。 手机上安装了“蓝牙遥控车”。 此外,如果前方有障碍物,则机器人会停止,即 敲打东西将不起作用(但是,有一个“秘密”按钮会禁用安全模式)。


机器人车RoboCar4W


在第三个视频中,RoboCar4W演示了一个带有转弯的预编程演示运动程序。 演示程序是通过同一Android手机上的命令激活的。 机器人只是骑了一段时间然后转弯。


机器人车RoboCar4W


运动控制算法


将我们的方法称为“避障算法”或“路径查找”是错误的。 这些是独立的数学学科,纯数学。 如果您真的非常喜欢数学,那么请用谷歌搜索这些短语,以便您阅读六个月。


同时,我们对事情变得容易得多感兴趣。 因此,我们将其简称为-四轮机器人的运动控制算法。 当然,我们所说的是无需人工干预的自动控制。


这是用文字写下的简单算法,对于更复杂的算法,有必要(无论是否需要)组成框图。


现在,同时查看草图RoboCar4W-1.ino的源代码。


  1. 我们测量到前方障碍物的距离。
  2. 如果此测得的距离小于DST_TRH_BACK值(距离阈值的缩写),则我们停下来并在转弯时反向行驶。 旋转方向的选择如下:如果您先前向左转,则向右转,反之亦然。
  3. 如果测得的距离大于DST_TRH_BACK ,但小于DST_TRH_TURN ,则只需旋转即可。 旋转方向是随机选择的。
  4. 如果您远离障碍物,那就继续前进。
  5. 我们再重复一遍。

我们有4个车轮和全轮驱动有什么好处? 我们可以执行(编程)几种类型的转弯:


  • 平稳旋转。 所有轮子都旋转,但一侧的轮子旋转得更快。
  • 急转弯。 车轮仅在一侧旋转。
  • 掉头到位。 像拖拉机一样,一侧的车轮向后旋转,另一侧向前旋转。

在该程序的第二版中,当通过Android手机进行控制时,如果两次按下该程序,则可以关闭机器人试图防止正面碰撞的安全模式
纽扣


并通过按一次将其重新打开。


重要说明 。 所有逻辑都在Arduino的控制之下。 Android在这里的行为就像游戏机(没有大脑)一样,它的任务是通过蓝牙将按键操作(即命令)愚蠢地传输到Arduino RoboCar4W。


组成部分


最初,该机器包括一个伺服驱动器,该驱动器将超声波测距仪旋转一定角度以在三个方向上进行测量。 但是在测试过程中,由于操作不当,导致伺服器烧坏,因此现在距离传感器只是牢固地固定在机壳前面。


没有一线希望,但是草图变得容易一些。


对于将来,要购买最简单,最便宜的伺服器,就不需要给定角度的特殊功率,速度和旋转精度,而且事实证明禁用伺服器非常容易。 价值2美元的SG90非常合适。


因此,RoboCar4W项目的组成部分给出了英文描述,以方便在ebay等上进行搜索:


  • Arduino UNO R3
  • 现成的底盘4轮驱动移动机器人平台智能汽车底盘Arduino兼容
  • 双向旋转的直流电动机-4个
  • 车轮-4个
  • 用于控制4个直流电机的板电机驱动罩L293D
  • 超声波测距仪HC-SR04超声波模块测距传感器
  • 镍氢1.2 V电池-8个
  • 用于电池的塑料盒支架,电池盒支架4节AA电池-2个。
  • 电池类型“ Krona” 8.4 V-1个。
  • 可选拨动开关-电源开关

套件中立即购买了底盘,直流电动机和车轮,甚至附带安装说明。


引脚排列


模拟输入可用作I / O端口的数字引脚。 与模拟输入对应的Arduino引脚编号为14到19。这仅适用于Arduino引脚,不适用于Atmega微控制器的物理引脚号。


您不必画图,只需将所有东西放在桌子上即可。 我是这样做的。


初步分类


如果使用任何直流电动机或步进电动机,则引脚D4,D7,D8,D12将处于繁忙状态。


仅当使用伺服电机时,才使用引脚D9(伺服1号控制),D10(伺服2号控制)。


Arduino引脚不占用用于控制Motor Drive Shield L293D的Arduino引脚。


3.3 V,5 V和接地的电源引脚已在电动机驱动器护板上复制了足够的数量。 因此,无需担心它们的短缺。


如果您仍然想绘制精美的图片,那么免费的Fritzing程序将为您提供帮助。


营养学


这是第二个非常重要的观点。 营养很大程度上取决于营养。 例如,当以给定角度旋转轴时,伺服电动机开始消耗大量电流。 同时,如果伺服器由5 V Arduino供电,则电压会“下降”,其余电路开始出现故障,Arduino甚至可以同时重新启动。


无论如何,如果在船上使用电动机,则需要电动机驱动器护罩(或类似电路)。


因此,我们有4个直流电动机,一个伺服驱动器,Arduino板本身和几个传感器。 电机是最繁琐的,但是传感器可以通过Arduino板本身的连接器成功供电,因此使用它们的一切都很简单。 为了方便起见,我在一张桌子上减少了整个经济。


推荐或典型电压。 消耗电流最大电压计划喂什么注意事项
Arduino UNO R3开发板7-12V,200mA(平均)6-20“克朗9V”锂电池650mAh,8.4V中心连接器
伺服马达MG-9955-6 V,0.1-0.3A(峰值)4.8-7.2电池(5)个 镍氢1.2V = 6V食物仅来自单独的来源。 如果您与Arduino一起使用,那么一切都会失败。 4pcs镍氢电池电压 * 1.2V = 4.8V是不够的。 有人认为该伺服不应在4.8伏特的情况下使用4.8伏特
直流电动机(4个)6-8V,电流从70mA到250mA3-12电池(5 + 3)个 镍氢1.2V = 9.6V您将无法使用9V电池正常启动引擎,因此,甚至不要浪费时间(和电池)!
电机驱动罩L293D不需要4.5-36不需要
蓝牙模块HC-05063.3 V,50 mA1.8—3.6带引脚3.3V Arduino板
超声波测距仪HC-SR045 V,2毫安5带引脚5V Arduino板

我没有DC / DC电压转换器。 克朗9V并不是很好的电源,我已经拥有了。


但是我拒绝使用锂离子大容量电池。 首先,由于成本高昂,其次,在中国的在线购物中很容易造假。 更准确地说,不是“轻松”,而是“总是”。 另外,锂离子电池需要特殊处理,因此不安全。


因此,从表中可以看出,我们需要3个独立的电源:


  • 用于Arduino开发板和传感器。
  • 用于伺服电机。
  • 适用于4个直流电动机。

在哪里可以得到这么多? 无论如何,Arduino板本身必须由单独的电源供电,因为 例如,当电压“骤降”(由于电动机启动)时,电路板可能会重新启动或完全失效。 在这里,我们使用Krona 9V外形尺寸的电池,并且将要连接到Arduino的连接器应带有“中间加号”。


对于伺服电机和4台直流电机,可以使用一个电源。 唯一的问题是,伺服电机的设计电压为5-6V(最大7.2V),电流为100-300mA(峰值),而DC电机需要6-8V(最大12V),电流为250mA。


为了解决这个问题,有DC-DC转换器,但是我没有。 结果,我应用了我的“专有”接线图(没有任何降压电子电路,只有环境友好的电压和电流!):我连接了8个。 如图所示,将1.2V电池串联,并在正确的位置制作水龙头。


营养学


伺服电动机达到6V,直流电动机达到9.6。 显然,1-5号电池会增加负载。


为了控制伺服和直流电动机,我使用了基于L293D芯片的4通道电动机驱动器护罩。


组装方式


组装完成的机箱是一个小问题。 但是不要以为没有掺杂就可以马上得到所有。 因此,准备文件。


组装方式


组装方式


正常情况下,无法将多个电机,伺服电机或步进电机直接连接到Arduino。 由于Arduino的引脚(结论)是低电流的。 为了解决该问题,还有一个附加的驱动控制模块-基于L293D芯片的Motor Drive Shield,这是为此目的设计的最常见的芯片之一。 L293D芯片也称为H桥。


我使用的板提供了4个通道,用于连接两个L293D芯片和一个移位寄存器。 在eBay上以5美元的价格购买。


此驱动器控制模块板具有以下规格。


  • L293D电机驱动器护罩与Arduino Mega 1280和2560,UNO,Duemilanove,Diecimila兼容
  • 4通道控制
  • 4.5V至36V的电动马达
  • 每通道允许的负载电流600mA,峰值电流-1.2A
  • 过热保护
  • 2个接口和一个精确的Arduino定时器(不会有“抖动”),用于将伺服电机连接到5V,如果电源电压需要更高,则必须按如下所述重新进行电源连接
  • 可以同时控制4个双向DC集电极电机或2个步进电机和2个伺服电机
  • 4个双向直流电动机每个都连接到8位总线,以进行单独的速度选择
  • 最多可连接2个步进驱动器(单极或双极),带有一个线圈,双线圈或交替步进
  • 用于连接外部电源的连接器,用于为控制逻辑和电机提供单独的电源
  • 重置Arduino按钮
  • Adafruit AFMotor库用于管理。

Motor Drive Shield需要一些改进,以便您可以在其后连接任何东西。 我在顶部焊接了必要的连接器,这就是发生的情况。


电机驱动罩


可以将电动机连接到相对于Arduino板的附加电源。 我只推荐这种连接方法。 为此,请卸下并打开跳线,如图所示。


4通道L293D电动机驱动器护罩。外部电源跳线


在这种情况下,Arduino的电源和电动机的电源彼此独立。


电动机通电时,电动机护罩上的LED会亮起,如果未点亮,则电动机将无法工作。


新问题。


电源跳线的位置不适用于伺服器,它们仍将由5V Arduino供电。 由于伺服电机通常会消耗大量电流,并且如果功率不足,则整个设备就会开始出现故障,在“最佳”情况下,只有伺服驱动器会发生故障-它不会以设定角度旋转,或者一直到每转一圈先以0度旋转,然后才旋转以给定的角度(如果可以跟上)。 因此,我建议也通过附加电源为伺服系统供电。 为此,您将不得不稍微重做连接图:从标准连接器上咬掉正极线(通常是红色),然后将其直接连接到电源的正极。


完成伺服电机电源的连接


连接电动机驱动器护罩时,不使用模拟引脚。 不使用数字引脚2、13。


仅在连接和使用相应的直流电动机或步进电动机时,才使用以下引脚:


  • D11:1号直流电机/ 1号步进电机(激活和速度控制)
  • D3:2号直流电机/ 1号步进电机(激活和速度控制)
  • D5:3号直流电机/ 2号步进电机(激活和速度控制)
  • D6:4号直流电机/ 2号步进电机(激活和速度控制)

如果使用任何DC /步进器,则这些引脚将处于忙状态:D4,D7,D8,D12。


仅当使用适当的伺服电机时,才会占用以下引脚:


  • D9:伺服1号控制
  • D10:2号伺服控制

连接表


要开始使用Motor Drive Shield,您需要下载并安装Adafruit AFMotor库。


控制电机的示例代码:


 #include <AFMotor.h> //   Adafruit #include <Servo.h> //     AF_DCMotor motor(1); //   ,    DC    Motor Shiled , ,  frequency Servo servo; //    servo.attach(10); //     9  10 (    Motor Shiled) motor.setSpeed(speed); //   DC   0 ()  255 ( ) motor.run(RELEASE); // DC   motor.run(FORWARD); // DC   motor.run(BACKWARD); // DC   servo.write(90); //    90 . 

直流电动机仅在指示速度大于100时才开始旋转,如果小于100,则仅会发出嗡嗡声。 您将必须通过实验确定电动机的最小速度。


对于连接到M1和M2的电动机,您可以设置频率:MOTOR12_64KHZ,MOTOR12_8KHZ,MOTOR12_2KHZ,MOTOR12_1KHZ。 最高转速在64KHz时达到,可以听到此频率,较低的频率和速度在1KHz时也消耗较少的能量。 电动机3和4始终以1KHz运行;其他值将被忽略。 默认位置是1KHz。


之后,有必要进行电动机测试。 测试草图可以在这里获取 。 在草图的开头,在以下类型的一行(或多行)中更改电动机编号:


 AF_DCMotor motor(); 

绘制草图一段时间会沿着机器人的运动使电动机向前旋转,然后向后旋转。 仔细查看电动机是否沿该方向旋转,并在必要时更改连接的极性。


我们连接了超声波测距仪HC-SR04超声波模块。 引脚排列:


  • Vcc
  • 三角(T)
  • 回声(r)
  • 地线

超声波测距仪在测量上所花费的时间(根据经验确定):


  • 如果距离太长(超出范围),则最大为240毫秒
  • 如果距离太短至少1毫秒
  • 在大约10毫秒内确定1.5 m的距离

超声波测距仪HC-SR04超声波模块


超声波测距仪传感器,由于其物理特性,而不是因为中国,在某些情况下无法确定到障碍物的距离:


  • 如果障碍物的形状复杂,那么超声波会以不同的角度反射并且传感器是错误的,
  • 超声波被软垫的家具或玩具完全吸收(即不被反射),并且传感器认为其前面没有任何东西。

换句话说,对于超声波测距仪,如果所有障碍物都呈垂直于超声波辐射方向的实心平面的形式,则理想地是极好的。


红外距离传感器可以解决一些问题。 但这也不是完美的:


  • 与超声波相比,最大射程较小:0.3-0.8 m和4 m
  • 与超声波相比,最小距离大:10厘米和2厘米
  • 传感器的灵敏度取决于整体照度。

尽管如果将这些测距仪成对安装,则它们的工作效率将大大提高。


连接蓝牙HC-05


从数据表中可以看到“裸” HC-05的主要引脚:


  • TX(引脚1)传输
  • RX(引脚2)接收
  • 3.3V(引脚12)电源3.3V
  • GND(引脚13)接地
  • PIO8(引脚31)模式指示灯
  • PIO9(引脚32)连接状态,如果建立连接,输出将为高
  • PIO11(引脚34)启用AT命令模式

我们的模块焊接到了分线器/基板上,那里已经有一个分压器,因此它的工作电压范围为3.3V至6V。


我们连接我们的蓝牙模块组件:


  • Arduino(TX)-(RX)HC-05
  • Arduino(RX)-(TX)HC-05
  • Arduino(+ 5V)-(VCC)蓝牙
  • Arduino(GND)-(GND)蓝牙
  • LED,KEY引脚未使用

为HC-05蓝牙模块供电后,其LED指示灯应闪烁,这表示蓝牙正在工作。


打开手机上的蓝牙,找到名称为HC-05的设备并连接,密码为1234。


为了进行测试,请在Arduino中填写一个简单的草图:


 int count = 0; void setup() { Serial.begin(9600); Serial.println("Test Arduino + Bluetooth. http://localhost"); } void loop() { count++; Serial.print("Count = "); Serial.println(count); delay(1000); } 

在Android手机上,安装蓝牙终端。 我们已连接到HC-05设备,并在电话屏幕上观察到计数器递增的蠕变线。


为了使模块可以接收AT命令,您需要将其置于适当的模式-为此,您需要将KEY输出(PIO11)设置为逻辑1。在某些Breakout / Base Board上,有一个EN(ENABLE)输出而不是KEY输出,该输出可能或可能不焊接到芯片本身的引脚上。 这仅适用于HC05芯片。 那只是我的EN端子输出没有焊接在任何地方。 因此,可以用另一根导线将其焊接到芯片的端子KEY(PIO11)。 或者,在操作过程中,要将HC05置于AT指令模式,请将KEY芯片输出(PIO11)与Vcc电源输出短路几秒钟。 对于HC06,不需要KEY引脚。


软体类


注意事项 每次将程序下载到Arduino之前,请确保未将Bluetooth模块连接至Arduino。 这将导致草图填充问题。 只需断开蓝牙模块的电源或连接Arduino和RX,TX模块引脚的电线即可。


在草图的开头,在以下类型的行中更改电动机编号:


 AF_DCMotor motor(); 

带有避障功能的自动模式草图请在此处下载


如果您替换字符串


 byte debug = 0; 


 byte debug = 10; 

这将启用调试模式。


在调试模式下,RoboCar4W不会真正行驶或行驶。 相反,激活串行端口监视器,然后您将看到它如何“虚拟”驱动。 字符串“ Forward”将被写入串行端口监视器,而不是真正的向前驱动,而不是向左转“ Return Back L(eft)”等反向。 超声波距离传感器也不执行任何操作,而是通过编程方式随机生成到障碍物的距离。


如果您更改移动算法,而不是抓住打字机在房间周围,只需要检查空闲状态,则此调试模式非常方便。


可在此处下载用于手动控制的蓝牙草图 。 草图没有调试模式,因为那里的所有东西都是透明的。 您按下按钮-机器人走了。


Adnroid蓝牙遥控车程序


好吧,就是这样! 旅途愉快!


旅途愉快!

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


All Articles