你有不用的玩具吗?让我们加入一些聪明才智和爱好技能,使它令人兴奋!灵感来自我的智能机器人汽车套件模型。
我们中的许多人家里都有一些玩具,我们不知道如何处理它。也许是因为我们不知道如何使用它,或者它的功能非常简单(就像我的情况一样),因此变得有点太无聊了。我想展开函数。所以我们可以把一些聪明才智,一些我们最喜欢的爱好放在一起。因为你可能没有同样的玩具车,这篇博客文章可以作为灵感。我也在给智能机器人汽车套件施加控制。下文将详细介绍。
在这种情况下,所选择的玩具是一辆玩具店的汽车,它只有后轮上的直流电机和两个位置的前进或倒车开关。为了能够驾驶,车顶上有一个轮子,手动驱动齿轮机构。
我们将做的修改是安装四个直流电机(每个车轮一个)。我们将做一个新的转向机构,它将由一个驱动。我们将做的修改是安装四个直流电机(每个车轮一个)。我们将制造一种新的转向装置,通过向前或向后驾驶汽车,或向右或向左转向来驱动汽车。
我们还将为AZ-Delivery的智能机器人汽车2WD使用相同的功能。由于这辆车没有转向装置,转换起来非常简单。我们只需要安装侧面的超声波传感器。
一旦我们选择了我们想要改装的汽车,我们准备一杯咖啡或茶,并开始计划。我们需要知道的第一件事是每种情况需要哪些组件。
首先我们将开发和解释玩具车的改装,然后我们将对智能机器人车做同样的事情。
电路及所用元件说明
根据组件计划,我们将使用“4通道L293D电机驱动器屏蔽”模块来移动四个直流电机。它简化了电机的编程,并消除了许多电缆。此外,我们只需要在草图中的一个对象为每个电机,我们可以选择电机速度和工作与前进,逆转和停止命令。由于这是一个屏蔽模块,我们只需要将其连接到ATmega328微控制器,它们形成一个单元。
我们将使用两个SG90微伺服电机,其中一个将驱动车辆的转向,另一个将执行一个小的40度回转与前超声波传感器。HC-SR04超声波传感器告诉我们与物体或障碍物的距离。我使用的4个直流电机是机器人汽车套件的常用电机。对于整个套件的电源,我使用了两个带1A的外部5V直流电池,但您可以使用任何提供最低5V直流电压的电池组。
请密切关注不同模块的最大功耗。
车辆转向系统的改装
我将简要说明我是如何改变汽车的转向系统的。
这辆车的手动系统在车顶上有一个轮子,用来移动齿轮。这些齿轮带动到汽车前部的轴来移动方向盘。从图中可以看出,这个系统非常麻烦,而且还是人工操作的。
新的转向系统由两个轴操作,对应于图片中的绿点。这样,当伺服电机被驱动时,整个装配在这两点上移动和转动。在图片的左侧,您还可以看到伺服电机,我们将连接到前面的超声波传感器。
车辆的操作说明和草图
这三个超声波传感器是汽车的“眼睛”。微控制器向超声波传感器发送信号,使其连续发射脉冲。当它们在物体上反弹时,传感器接收信号并将其传输到微控制器。经过的时间除以2,因为信号必须来回传递。有了所用时间的信息和声速的数据,就可以计算出到物体的距离。每个传感器的信息存储在变量中,并在带有if-else条件的多回路中永久地与距离限制进行比较。测量到物体的距离,物体可以在车的右边、左边和前面。如果距离更大,汽车继续行驶,如果其中一个距离更小,它比较左右两边的距离。如果右侧更大,并且与物体的距离大于极限,则向右转。如果右侧之间的距离小于左侧,则检查到对象的左侧距离是否大于极限值。如果是这样,它将转向左边。如果这三个距离恰好小于我们设定的限制,汽车将停止并倒车2秒,然后再次开始距离检查过程。根据不同的情况,微控制器执行一些动作来激活电机屏蔽模块的L293D芯片的h桥,使电机向一个方向或另一个方向转动。
让我们从草图的发展开始。为了使用伺服电机、超声波传感器和电机控制板,我们需要在草图开始时包括它们的库。我选择了这些sr04库,因为我已经使用它很长时间了,从来没有遇到过任何问题。你必须下载并解压缩它。在子文件夹中,您将找到ZIP文件HC-SR04.zip,您可以通过菜单Sketch-> integration library->Add.ZIP library安装在Arduino IDE中。
添加库之后,我们需要继续执行所有已安装组件的实现和配置。我们将从超声波传感器的实现开始。我们需要告诉微控制器我们将每个传感器的引脚连接到哪个引脚。一个发送信号(ECHO),一个在击中目标后接收信号(TRIG)。接下来,我们需要为每个传感器创建一个带有一些参数的名称。这是通过实现SR04库中的一个对象来实现的,该对象包含传感器的名称,以及作为参数的发送和接收信号的引脚的名称。现在我们需要存储距离数据,并为每个传感器定义一个变量。
下面是两台伺服电机的实现。我们为每个伺服电机创建一个对象。我们连接伺服电机信号的引脚将在稍后的草图的setup()-方法中定义。
“4通道L293D电机驱动器屏蔽”是我们需要配置和实现的最后一个组件,因此我们可以管理电机的控制。我们需要为电机控制的每个输出通道创建一个库对象。在我们的例子中是4个通道。作为参数,我们必须指定端口号和工作信号的频率。根据微控制器的数据表,端口3和4仅以1KHz的频率工作,因此我们将所有端口配置为此频率。此外,在这个更新速度下,功耗更低,所以我们可以节省电池。
移除屏蔽上相应的跳线是非常重要的,因为我们将为电路板提供外部电压,而不是来自微控制器。
现在我们需要setup()-method。在其中,我们定义了连接伺服电机线路的引脚。这里我们使用数字引脚的PWM输出。幸运的是,由于我们使用的是屏蔽模块及其库,因此我们只需要指定0到255之间的一个数字,这分别是最小值和最大值。
setup()方法的前两行非常简单:我们初始化串行监视器并在其上输出一条消息。
现在我们在这里定义引脚,我们向两个伺服电机发送信号。
现在我们配置电机的转速以及微控制器初始化或复位时电机的初始状态。转速是用指令motor_name.setSpeed(120)设置为最大速度的一半,电机必须停止,后者是用指令motor_name.run(RELEASE)配置完成的。
在setup()-方法的末尾,我们调用两个方法在汽车开始移动之前检查伺服电机。我们将在后面解释这些方法。
loop()方法非常短,因为操作已外包给方法。这使得代码更加清晰。这个loop()方法的唯一一行是调用执行前超声波传感器的伺服电机旋转运动的方法。
该方法通过将伺服电机定位在三个角度(70,90和110度)来执行平移。一旦定位到这些角度,就调用这三种方法来测量可能的物体或障碍物到右、左和前方的距离。在测量前方距离之后,调用object_distance_compare()方法来比较三个测量值,并针对车辆的方向执行一个特定的操作。
我解释了上面提到的方法。定位后的前三个测量汽车在行驶途中遇到的物体或障碍物的距离。超声波传感器测量到最近的物体或障碍物的距离,并将此距离存储在我们在开始时定义的变量中。我们通过串行监视器显示距离数据。每个传感器都有一个单独的方法。
下面的方法将三个超声波传感器的测量值进行比较。如果三个值都匹配,则调用car_advances()方法。另一方面,如果三个测量值中有一个较低,则执行第二行,检查现有对象在右侧是否比在左侧更远,以及它们是否也比30厘米更远。如果是,则调用turn_right()方法。如果向左的距离大于向右的距离,并且物体距离也大于30厘米,则调用turn_left()方法。如果要检查的三个距离小于我们配置的距离,则最后一行调用方法go_back()。
使我们的汽车以直线前进的方法将用于转向的伺服电机定位为100度角,并使用指令motor_name.run(forward)激活它,以激活微控制器的引脚,使L293D电机屏蔽模块为正确的电机提供正确的电压,使车轮向前转动。提醒一下,只要超声波传感器测量到物体的距离大于或等于我们设置的距离,这个方法就会运行。
如果超声波传感器对某一物体的测量结果小于指定的测量值,则将横向传感器的测量值进行比较。如果右侧的距离大于左侧的距离,并且这个距离也大于我们指定的距离,则条件命令块调用turn_right()方法,该方法会使伺服电机将汽车的方向定位为184度。然后马达执行一组指令向前移动。这样我们的车就可以右转然后向前开。
相反,如果向左的距离确定为20度,则执行方法turn_left(),以便车辆在该方向上转弯而不停车。
要调用的最后一个方法是go_back(),如果前面三个条件都不满足,则执行该方法。当车辆进入前方障碍物小于1米,侧面障碍物小于20厘米的区域时,将执行以下命令:将车辆定位成100度角,并命令停止发动机。motor_name.run(RELEASE),暂停500毫秒,然后使用命令motor_name.run(BACKWARD)停止2秒,这与方法delay(2000)的最后一行相同,对应于时间设置。
最后两个方法接收setup()方法的调用,因此它们只执行一次以检查伺服电机是否正常工作。第一个检查前超声波传感器的伺服电机。定位度与servo_ultrasonic_scan()方法相同,但我们在位置之间编程了500毫秒的延迟。
草图的下一个也是最后一个方法检查驱动车辆转向系统的伺服电机的运动。伺服电机放置在转向的工作角度,检查其是否正常工作。这个伺服电机在这辆车的中心位置是100度,车右转弯的位置必须是184度,车左转弯的位置必须是20度。两个位置之间的暂停时间为1秒。
AZ-Delivery智能机器人汽车改装
智能机器人汽车的改装有点不同。我们不需要“4通道L293D电机驱动器屏蔽”模块,因为它只有两个电机。在这种情况下,我们使用“L298N电机驱动板”模块,该模块还包含一个h桥,提供驱动两个直流电机所需的功率。因为我们没有转向系统,改变方向是通过改变马达的旋转方向来实现的。“V5扩展板屏蔽”模块用于连接所有组件。
障碍物检测的过程和需要采取的行动与前面解释的类似。超声波传感器以类似的方式测量距离,即如果前方和侧面障碍物比设定的距离更远,汽车就向前行驶。当其中一个传感器检测到障碍物的距离小于设定的距离时,将比较与旁边物体的距离,并转向与障碍物距离更大的方向。如果三个传感器检测到到障碍物的距离小于设定的距离,汽车就会向后移动。
这两款车的区别在于马达的工作方式和编程方式。在这种情况下,使用“L298N电机驱动板”模块,我们没有FORWARD, REVERSE和RELEASE命令。为了使电机转动,我们必须首先使其启动,并在电机上的两个触点之一上施加电压。根据用哪个触点供电,它会朝一个方向或另一个方向转动。在“L298N电机驱动板”模块中,EN A引脚激活一台电机的IN1和IN2线,EN B引脚激活另一台电机的IN3和IN4线,因此电机的编程如下:激活电机通过将EN引脚设置为HIGH并转动相应的电机,必须将电机的两个In连接中的一个设置为HIGH,另一个设置为LOW。如果改变两个连接的状态,电机将向相反方向旋转。从这个意义上讲,我们将使用AZ-Delivery Modify智能机器人汽车。
为了在两侧安装传感器和伺服器,需要进行一些修补。
草图描述
和往常一样,要做的第一件事是添加必要的库。在这种情况下,我们只需要超声波传感器和伺服电机的传感器。
在下面几行中,我们声明了6个常量来命名用于控制电机的微控制器的引脚。
接下来,要实现超声波传感器和前超声波模块的伺服电机。连接引脚和传感器的名称与之前车辆的改装相同。伺服电机的名称也相同。
在setup()方法中,唯一的区别是缺少转向伺服电机和我们配置电机的方式。我们必须将“L298N电机驱动板”模块所连接的微控制器的引脚配置为OUTPUT。我们将改变他们的状态之间的高和低,使电机和提供电压到他们的接触取决于所需的旋转方向。连接伺服电机信号和调用servo_ultrasonic_front_check()方法是相同的。
方法loop(), servo_ultrasonic_scan(), right_distance_object(), left_distance_object(), front_distance_object(), object_distance_compare()和servo_ultrasonic_front_check()与前一章完全相同,并且执行与上面解释的相同的功能。
方法car_advances()、turn_right()、turn_left()和go_back()负责给两个电机端子供电,使智能机器人小车向前、向右或向左或向后移动。我将解释的第一个方法是car_advances()。注释的第一行通过串行监视器显示我们的汽车正在向前移动。在下一行中,我们将正确的电机使能引脚设置为HIGH。接下来的两条线是两个电机触点。我们将一个引脚设置为HIGH-level(供电电压),另一个引脚设置为LOW-level,电机将向前旋转(如果电机向相反方向旋转,我们只需要改变“L298N电机驱动板”模块中的电机连接)。该方法的最后3行与上面描述的完全相同,也适用于其他电机。
turn_right()方法导致汽车向右转弯。我们可以观察到,右电机的引脚状态是相反的。这导致电机向相反方向旋转。因此,如果左电机向前转,右电机向后转,我们的智能机器人汽车将围绕其想象的中心轴迅速向右转。
在以下两种方法中,只有电机引脚的状态被交换以使它们向一个方向或另一个方向转动。通过这种方式,智能机器人汽车可以向左或向后移动。
如果我们不希望旋转如此突然,当我们调用激活电机时,我们必须使用digitalWrite(enable_name_motor, state),我们必须将参数状态设置为LOW设置。这将允许我们禁用电机,无论电机触点的状态如何,它都不会向任何方向旋转,并且会在另一个电机继续旋转时停止,因此旋转将在停止的轮子上。
正如你所看到的,智能机器人汽车非常多功能。我们可以给它改装,装上两个超声波传感器,让它有点自主。例如,它也可以被改装成智能机器人汽车的追随者。
本文编译自hackster.io