第1篇:在最后一刻停下来!用Arduino和距离传感器制作小鸡赛车!(第1篇)
该项目旨在介绍用Arduino让传感器工作的一个电子作品。此次的分享嘉宾是福田和宏先生!他过去曾在DevicePlus上连载过“Arduino基础”等作品。
◆◆◆
大家好!在第1篇中,我为大家介绍了小鸡赛车的全貌。在本文中,我们一起来了解一下小鸡赛车中使用的电子部件的工作情况。然后,我们会创建一个电子电路,使其能够安装在作品主体上。
可以测量距离的“超声波距离传感器”
当小鸡赛车停在墙壁前面时,我希望能够测量并让我们知道赛车的停止位置距离墙壁有多远。可以使用超声波距离传感器来完成这项任务。超声波距离传感器是利用超声波(声音)从传感器发出、并被墙壁反射回来所需的时间来计算距离的。通过将时间乘以声速(340.29 m/sec)即可计算出距离。然而,由于这个距离是声音从传感器到对象物、并从对象物被反射回到传感器的往复距离,所以实际上到对象物的距离需要减半。虽然在不同的室温下会多少存在一些误差,但由于在测量短距离时忽略误差也不会造成太大的偏差,所以我没有给小鸡赛车配备温度校准功能。
现在,让我们通过Arduino Nano使用超声波距离传感器来测量距离吧。如下连接超声波距离传感器。
超声波距离传感器带有称为“TRIG”和“ECHO”的引脚。通过对“TRIG”施加“HIGH”,可以发出超声波。此外,“ECHO”在接收到反射回来的超声波时会变为“HIGH”。使用Arduino,可以通过测量从将TRIG置“HIGH”发出超声波直到ECHO切换为“HIGH”的时间,来获取从超声波发射到返回所花的时间。当然,需要将TRIG连接到Arduino Nano的数字输入输出引脚2,将ECHO连接到数字输入输出引脚3。
此次的超声波距离传感器的测量工作将使用笔者创建的库。您可以通过下面的链接下载这个库。
从Arduino IDE的“Sketch”菜单中选择“Include Library”-“Add .ZIP Library”,打开下载的库。现在,就可以使用超声波距离传感器库了。
创建如下程序,通过这个程序,可以利用超声波距离传感器来获取距离,并在串口显示器上查看。
#include <HCSR04.h> const int US_TRIG_PIN = 2; const int US_ECHO_PIN = 3; HCSR04 hcsr04( US_TRIG_PIN, US_ECHO_PIN ); void setup() { Serial.begin( 9600 ); hcsr04.begin(); } void loop() { float distance; distance = hcsr04.get_length(); Serial.print( distance ); Serial.println( "cm" ); delay( 500 ); }
将程序传输到Arduino并打开串口显示器,就会显示出距离。接下来,您可以把书本等物体放在超声波距离传感器前来改变距离,可以看到显示器上的距离数据也会随之发生变化。
显示字符的“字符液晶显示器”
我们使用字符液晶显示器来显示超声波距离传感器测量到的结果。字符液晶显示器是一种在内部存储有字母和数字等字符信息,可以简单地显示字符的显示设备。虽然能够显示的字符数是预先规定好的,但在显示像这次这样的测量距离或简单的介绍文本时,足够用了。
本次使用的字符液晶显示器“AQM1602Y-FLW-FBW”可以在屏幕上显示32个字符(16个字符×2行)。
AQM1602Y-FLW-FBW通过I2C由Arduino来控制。在Arduino Nano Every中,模拟输入引脚A4和A5可用于I2C通信。
现在,让我们来尝试通过Arduino Nano实际控制字符液晶显示器,并使之显示任意字符。连接如下。由于背面的背光引脚的干扰,AQM1602Y-FLW-FBW可能无法插入面包板。在这种情况下,最好准备一个针座并通过针座将其插入面包板。
要在AQM1602Y-FLW-FBW上显示来自Arduino的字符,需要另外的库。这次我们将使用笔者创建的库来来实现显示。您可以从下面的链接下载这个库文件。
从Arduino IDE的“Sketch”菜单中选择“Include Library”-“Add .ZIP Library”,打开下载的库。现在,就可以使用该库了。
让我们实际显示一下“Chicken Racer”。创建如下程序:
#include <AQM1602Y.h> #include <Wire.h> int VDD_VOLT = 5; const int AQM1602Y_ADDR = 0x3E; AQM1602Y lcddisp( AQM1602Y_ADDR, VDD_VOLT ); void setup() { lcddisp.begin(); lcddisp.set_cursol( false ); lcddisp.set_blink( false ); lcddisp.set_contrast( 0x0f ); lcddisp.move( 0x01, 0x00 ); lcddisp.charwrite("Chicken Racer"); } void loop() { }
lcddsip.move () 是将光标移动到希望开始显示的位置。需要按照位和行的顺序指定。屏幕左上角为0位0行。例如,如果要在第2位第1行显示,就需要指定“lcddisp.move (0x01, 0x00)”。
要显示的字符串由 lcddisp.charwrite() 指定。
当我将程序传输到Arduino时,显示器上显示“Chicken Racer”。为了便于查看,我打开了背光灯(如下面照片所示),但是实际上没有连接背光灯,所以背光灯不会亮。
推动车轮前进的“电机”
小鸡赛车是通过使装有车轮的电机来推动其前进的。在启动时使电机旋转,在按下开关时使电机停止。
由于使电机运行所需的电流较大,因此无法直接将电机连接到Arduino Nano的数字输入输出引脚。所以需要使用电机驱动器由电机专用电源供电。有关电机和电机驱动器的详细信息,请参阅“Arduino基础:控制电机”。
要想实际驱动电机,就需要使用电机驱动器进行如下连接。本次使用的电机驱动器带有两个控制引脚,可以控制正转、反转和停止。但是,由于小鸡赛车只能前进,所以将正转控制用的输入1(引脚7)连接到Arduino进行控制,将反转控制用的输入2(引脚9)连接到了GND。
另外,通过本次使用的电机驱动器的“VREF”引脚(引脚1),还能够调整可提供给电机的电压。正转或反转时,电机会输出与VREF相同的电压。当施加在电机上的电压发生变化时,电机的转速也会改变。因此,可以事先安装旋钮来调节施加于VREF的电压,这样就能够调整电机的转速了。这个旋钮是学龄前儿童可以慢慢转动、小学生可以快速转动的程度。
连接完成后,让我们试着通过Arduino来实施控制。这次我们尝试以5秒的间隔反复旋转和停止。创建如下程序:
const int MOTOR1_PIN = 4; void setup() { pinMode( MOTOR1_PIN, OUTPUT ); } void loop() { digitalWrite( MOTOR1_PIN, HIGH ); delay( 5000 ); digitalWrite( MOTOR1_PIN, LOW ); delay( 5000 ); }
通过这个程序,连接电机驱动器的数字输入输出引脚(引脚4)被置“High”时将会旋转,被置“Low”时将会停止。因此,可以通过使用digitalWrite()切换引脚4的输出来实现电机控制。
这次的小鸡赛车采用两个电机来使左车轮和右车轮旋转和前进。因此,需要为每个电机准备一个电机驱动器。如果能够独立控制两个电机,不仅可以使赛车前进,还可以实现旋转操作,可以更灵活地进行控制。
不过本次的赛车只需要能够前进和停止,因此只要让两个电机以相同的方式运行即可。所以,通过将两个电机驱动器的控制引脚连接到Arduino的一个数字输入输出引脚,即可执行相同的动作。
当然,在某些情况下,电机的转速可能会有所不同,可能无法直线行驶。在这种情况下,可使用连接到VREF引脚的旋钮将转速调整为同一转速。
用来检测碰撞的“微动开关”
要想判断是否失败,就需要检测到是否与墙壁发生了碰撞;另外,当撞到墙上时需要立即使电机停止。针对这种需求,我使用的是微动开关。微动开关是一种响应性能良好的开关,按下开关后,当到达特定位置时会立即切换。它也常用于鼠标的单击按钮。
另外,如果是带有金属板的微动开关,那么即使按下角度有偏差,也能够确保开关被按下。像这次需要检测是否碰撞墙壁的情况,某些碰撞角度,可能无法按下开关。而如果使用带有金属板的微动开关,那么即使撞击角度有一定程度的倾斜,开关也能够被按下。此外,通过在左侧和右侧同时安装开关,可以进一步确保开关在撞击时被按下。
微动开关带有3个引脚。未按下开关时,COM引脚和NC引脚处于连接状态。当按下开关时,开关由NC切换到NO,COM引脚和NO引脚连接。
由于我们这次是希望通过开关被按下来检测碰撞,所以将使用COM引脚和NO引脚。我们将一个引脚连接到Arduino Nano的数字输入输出引脚,将另一个引脚连接到GND,这样,当开关被按下时,数字输入输出引脚将会被切换到GND状态。另外,需要启用上拉功能,使数字输入输出引脚在开关未被按下时处于5V状态,以稳定输入。
下面,让我们来试用一下微动开关吧。这次,先试试当开关被按下时让安装在Arduino Nano上的 LED灯亮起来吧。连接方法如下。我们使用引脚12作为数字输入输出引脚来读取微动开关的状态。
连接好之后,创建以下程序:
const int LED_PIN = 13; const int BUMPER_PIN = 12; void setup() { pinMode( LED_PIN, OUTPUT ); pinMode( BUMPER_PIN, INPUT_PULLUP ); } void loop() { if( digitalRead( BUMPER_PIN ) == LOW ){ while( digitalRead( BUMPER_PIN ) == LOW ){ delay( 10 ); } digitalWrite( LED_PIN, HIGH ); } else { digitalWrite( LED_PIN, LOW ); } }
当将程序传输到Arduino并按下微动开关时,您可以看到安装在Arduino Nano上的LED亮了。
在电路板上创建电路
在确认了每个电子部件的工作情况之后,我们来为整个小鸡赛车创建一个配套的电路。电路图如下:
基本上,要让每个确认过的电子部件分别连接好。但是考虑到操作的方便性,我还增加了一个在调整电机转速时使电机旋转的开关、以及为了便于独立控制电机而设置的切换用跳线。
这个电路是在万用板上通过焊接来制作完成的。下面是作者做的电路板。是将主板和电机控制板分开制作的。
在制作电路板时,如果使用连接器进行连接,布线会更容易处理。这是因为一旦电路有什么问题,也可以通过插拔轻松地进行调整。这次,我用的是小型连接器——“XH连接器”。另外,在使用连接器时,需另行准备连接用的导线。
◆◆◆
这次我们创建了电路。下次我们将完成壳体制作并创建运行程序,彻底完成小鸡赛车。下一篇更精彩,敬请期待!