作品简介
使用这次的作品可以玩一种游戏,让名为“小鸡赛车”的车形机器人向着墙壁行驶,比赛从机器人停下的地方到墙壁的距离谁最短。它采用了可以通过按钮来操作车形机器人的设计,因此任何人都可以轻松享受竞赛游戏。
这款小鸡赛车中配有电机,通过开关使其前进。参加游戏的人手握按钮,当小车马上要撞上墙壁时按下按钮使之停止。
然后使用距离传感器来测量赛车与墙壁之间的距离。即使和好几个人一起玩,只要能测量出到墙壁的距离,就能比出谁在离墙壁最近的位置停下来了,是不是很有趣?
另外,我们还需要提前准备一个用来检测是否已碰撞到墙壁的机制。我的设计是在小鸡赛车的前端安装了开关,这样,如果它撞到墙上开关就会被按下。如果这个开关被按下,就意味着玩家失败。
所需的电子零部件
在确定了小鸡赛车的大致动作之后,让我们来看看需要使用哪些电子零部件。这次我们将使用Arduino进行控制。由于“Arduino UNO”等产品体积较大,不适合安装在这么小的作品上,因此,我决定使用体积小巧的“Arduino Nano”。“Arduino Nano”的尺寸为45×18mm,大小是可以放在食指上的程度,所以正好可以安装在作品上,而不用担心尺寸太大。另外,虽然体积更小,但却具有与“Arduino Uno”相同的功能,这点很关键。
驱动电机使用配有齿轮的电机。这是因为齿轮会增强驱动的力量,这样即使放置电池等较重的部件,也可以轻松地让赛车跑起来。此外,还需要电机驱动器让电机运转。
使小鸡赛车停下来的操作,我用按钮开关来实现。这次,我想将开关线延长,以便从远处也可以控制赛车。
我使用微动开关来判断小鸡赛车是否撞到了墙上,选用了附有金属板的微动开关。金属板的存在可以确保开关被按下而不必担心碰撞角度。此外,通过在前方安装左右两个微动开关,可以提高发生碰撞时按下开关的准确性。
停止时,需要测量到墙壁的距离,我使用距离传感器来完成这项工作。这次用的是可以使用超声波测量距离的距离传感器。
另外,我还希望在显示器上显示结果,以便让玩家知道测量出来的距离。我使用的是字符液晶显示器,这样可以比较容易地显示字符。
可以通过LED让玩家知道开始的时间以及是否成功。安装一个绿色和三个红色的LED。通过倒计时来通知开始时间,先是所有红色LED点亮,然后逐一熄灭,绿色LED点亮表示开始,赛车驶出。另外,如果成功了,绿色LED亮起;如果失败了,则红色LED亮起,据此来告知参赛者结果。
除此之外,还要配备调整电机速度和设置距离的功能。
接下来,我们根据小鸡赛车的结构,来选择电子零部件。这次使用的电子零部件如下:
Arduino Nano Every使用“Arduino Nano Every”作为微控制器来负责控制。Arduino Nano Every是一款于2019年5月发售的新Arduino Nano。当然,如果不想使用Arduino Nano Every,使用旧Arduino Nano或与Arduino Nano兼容的产品也没有问题。
超声波距离传感器通过发射超声波并测量直到接收到墙壁反射回来的超声波的时间来测量与对象物之间的距离。
字符液晶显示器可以显示字符和符号的显示器。这次使用的是“AQM1602Y-FLW-FBW”,最多可以显示2行16个字符。此外,该显示器有背光,因此即使在较暗环境下也可以查看所显示的字符。
圆形机器人底盘套件该套件中包括电机、车轮和壳体。电机采用驱动力量较大的减速电机(齿轮电机)。按照说明书组装,可以很容易地制作出小鸡赛车壳体。将电子电路和传感器等安装到这个壳体里面,即可完成制作。当然,您也可以只购买电机,自己来制作壳体。
电机驱动器使用输出为1.0A的电机适用的可逆电机驱动器来驱动电机。这次我使用的产品规格如下:
【绝对最大额定值(Ta=25℃)】
电源电压(VCC):18V
电源电压(VM):18V
输出电流(lomax):1A
工作温度范围:-20〜75℃
保存温度范围:-55〜150℃
【推荐工作范围】
电源电压(VCC):6.5〜15V
电源电压(VM):6.5〜15V
输出H电压设置:<VCC,VM
编号 | 引脚名 | 功能 |
1 | VREF | 输出H电压设置引脚 |
2 | OUT2 | 输出引脚 |
3 | RNF | 输出单元GND |
4 | OUT1 | 输出引脚 |
5 | VM | 电源(电机输出单元) |
6 | VCC | 电源(小信号单元) |
7 | FIN | 控制输入(正) |
8 | GND | GND |
9 | RIN | 控制输入(反) |
红色LED
绿色LED使用LED来通知倒计时和结果信息。我准备了3个红色和1个绿色的LED。
按钮开关供玩家用来控制小鸡赛车。为了便于操作,最好选择能够连接到面板的形状。
微动开关用来检测是否与墙壁发生了碰撞。在赛车前方安装左右两个微动开关。
除了上述部件之外,我还使用了以下电子元器件:
电子元器件名称 | 数量 | URL |
节拍开关 | 1 | http://akizukidenshi.com/catalog/g/gP-03649/ |
滑动开关 | 2 | https://www.amazon.co.jp/Zhejiang-Jianfu-Electronics-Co-%E5%9F%BA%E6%9D%BF%E7%94%A8%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%89%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81-SS-12D00-G5-10%E5%80%8B%E3%82%BB%E3%83%83%E3%83%88/dp/B01L3MJZGS |
半固定电阻器 | 2 | http://akizukidenshi.com/catalog/g/gP-14855/ |
二极管 | 1 | http://akizukidenshi.com/catalog/g/gI-07699/ |
330Ω电阻器 | 6 | http://akizukidenshi.com/catalog/g/gR-25331/ |
0.1μF电容器 | 4 | http://akizukidenshi.com/catalog/g/gP-10147/ |
3P排针 | 1 | https://www.amazon.co.jp/%E6%9C%AD%E5%B9%8C%E8%B2%BF%E6%98%93-%E3%83%94%E3%83%B3%E3%83%98%E3%83%83%E3%83%80-1%C3%973-3P-2%E5%80%8B%E5%85%A5%E3%82%8A%EF%BC%9Ccon-000%EF%BC%9E/dp/B00TP91KLK |
跳线接头 | 1 | http://akizukidenshi.com/catalog/g/gP-03690/ |
电池扣 | 2 | https://www.marutsu.co.jp/pc/i/14367/ |
电池(006P) | 2 | http://akizukidenshi.com/catalog/g/gB-03257/ |
万用电路板 95×72mm | 1 | https://www.marutsu.co.jp/pc/i/237293/ |
万用电路板 72×47mm | 1 | https://www.marutsu.co.jp/pc/i/144023/ |
电子元器件名称 | 数量 | URL |
L型6P排针 | 1 | http://akizukidenshi.com/catalog/g/gC-05336/ |
42P排母 | 1 | http://akizukidenshi.com/catalog/g/gC-05779/ |
Xh-2P连接器 针座 | 4 | https://www.digikey.jp/product-detail/ja/jst-sales-america-inc/B2B-XH-A-LF-SN/455-2247-ND/1651045 |
XH-2P连接器壳体 | 4 | https://www.digikey.jp/product-detail/ja/jst-sales-america-inc/XHP-2/455-2266-ND/555485 |
Xh连接器 4P针座 | 3 | https://www.digikey.jp/product-detail/ja/jst-sales-america-inc/B4B-XH-A-LF-SN/455-2249-ND/1651047 |
XH-4P连接器壳体 | 3 | https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=2AP6-4SFL# |
XH连接器触头 | 20 | https://www.digikey.jp/product-detail/ja/jst-sales-america-inc/SXH-001T-P0.6/455-1135-1-ND/527370 |
4P连接器壳体 | 1 | http://akizukidenshi.com/catalog/g/gC-12153/ |
导线连接器 | 4 | http://akizukidenshi.com/catalog/g/gC-12160/ |
为Arduino供电
首先需要确保为Arduino提供的电源。由于这是一个能够移动的作品,所以需要在作品自身上安装电池等作为电源。Arduino Nano可以通过连接USB数据线供电。因此,还可以通过安装移动电源等来实现供电。然而,目前市场上的移动电源很多是面向智能手机的,往往又大又重。此外,Arduino消耗的电量很小,不需要像移动电源那么大的容量。
因此,这次我用的是电池。Arduino中配有称为“VIN”的引脚,当它与最大21V的电源相连接时,就会将电压转换为5V并为Arduino供电。因此,我使用了可输出9V电压的006P电池来供电。
将电池扣的正极(红线)连接到“VIN”引脚,将负极(黑线)连接到“GND”引脚即可实现供电。
确认电子部件的工作情况准备好电子部件后,需要确认每个电子部件是否可以正常工作。这是为了一旦出现无法工作的情况,便于采取诸如更换成其他电子部件等的措施。
在确认时,最好使用面包板进行连接。另外,如果能事先确认作品应该可以在实装后正常工作,那么您在编写程序时会更安心。
首先,我们来确认LED和开关是否能够正常工作。另外,我们要确认一下按下开关后是否开始计数。
将LED连接到Arduino的数字输出引脚可以打开和关闭LED。此外,我们还需要给LED连接一个电阻器,以防止过电流(关于更详细的LED使用方法,请参阅“Arduino基础:通过数字输出来控制LED照明”(https://techclass.rohm.com.cn/knowledge/tech-info/how-tos/arduino/the-basics-of-arduino-control-led-lighting-with-digital-output))。
这次我使用3个红色LED和1个绿色LED。将LED分别连接到Arduino的数字输出引脚8、9、10、11。
玩家操作时使用的按钮开关,连接数字输入引脚即可读取开关状态。此外,通过将另一个引脚连接到GND,按下按钮时数字输入引脚的状态会变为0V。另外,还要通过编程来启用上拉功能,以使其在未按下按钮时处于5V状态,如果要了解更详细的内容,请参考“Arduino基础:读取开关状态”(https://techclass.rohm.com.cn/knowledge/tech-info/arduino/the-basics-of-arduino-reading-switch-states)。这次,我们连接数字输入引脚7。
现在,让我们将LED和开关连接到面包板上来尝试计数吧。电子部件的连接如下图所示。由于开关不能直接连接到面包板上,所以我们用焊接导线的方式连接。
连接好之后,创建以下程序。通过这个程序,当您按下开关时,所有红色LED灯亮起,然后每秒熄灭1个LED灯,最后绿色LED灯亮起。
- const int LED_RED1_PIN = 8;
- const int LED_RED2_PIN = 9;
- const int LED_RED3_PIN = 10;
- const int LED_GREEN_PIN = 11;
- const int SW_PIN = 7
- void setup()
- {
- pinMode( LED_RED1_PIN, OUTPUT );
- pinMode( LED_RED2_PIN, OUTPUT );
- pinMode( LED_RED3_PIN, OUTPUT );
- pinMode( LED_GREEN_PIN, OUTPUT );
- pinMode( SW_PIN, INPUT_PULLUP );
- digitalWrite( LED_RED1_PIN, LOW);
- digitalWrite( LED_RED2_PIN, LOW);
- digitalWrite( LED_RED3_PIN, LOW);
- digitalWrite( LED_GREEN_PIN, LOW);
- }
- void loop()
- {
- if( digitalRead( SW_PIN ) == LOW ){
- while( digitalRead( SW_PIN ) == LOW ){
- delay( 10 );
- }
- digitalWrite( LED_RED1_PIN, HIGH );
- digitalWrite( LED_RED2_PIN, HIGH );
- digitalWrite( LED_RED3_PIN, HIGH );
- digitalWrite( LED_GREEN_PIN, LOW );
- delay( 3000 );
- digitalWrite( LED_RED1_PIN, LOW );
- delay( 1000 );
- digitalWrite( LED_RED2_PIN, LOW );
- delay( 1000 );
- digitalWrite( LED_RED3_PIN, LOW );
- digitalWrite( LED_GREEN_PIN, HIGH );
- }
◆◆◆
我们了解了小鸡赛车中使用的电子部件的工作情况。然后,我们会创建一个电子电路,使其能够安装在作品主体上。
可以测量距离的“超声波距离传感器”
当小鸡赛车停在墙壁前面时,我希望能够测量并让我们知道赛车的停止位置距离墙壁有多远。可以使用超声波距离传感器来完成这项任务。超声波距离传感器是利用超声波(声音)从传感器发出、并被墙壁反射回来所需的时间来计算距离的。通过将时间乘以声速(340.29 m/sec)即可计算出距离。然而,由于这个距离是声音从传感器到对象物、并从对象物被反射回到传感器的往复距离,所以实际上到对象物的距离需要减半。虽然在不同的室温下会多少存在一些误差,但由于在测量短距离时忽略误差也不会造成太大的偏差,所以我没有给小鸡赛车配备温度校准功能。
现在,让我们通过Arduino Nano使用超声波距离传感器来测量距离吧。如下连接超声波距离传感器。
超声波距离传感器带有称为“TRIG”和“ECHO”的引脚。通过对“TRIG”施加“HIGH”,可以发出超声波。此外,“ECHO”在接收到反射回来的超声波时会变为“HIGH”。使用Arduino,可以通过测量从将TRIG置“HIGH”发出超声波直到ECHO切换为“HIGH”的时间,来获取从超声波发射到返回所花的时间。当然,需要将TRIG连接到Arduino Nano的数字输入输出引脚2,将ECHO连接到数字输入输出引脚3。
此次的超声波距离传感器的测量工作将使用笔者创建的库。您可以通过下面的链接下载这个库。
下载库文件(HCSR04.zip) https://deviceplus.jp/wp-content/uploads/2020/04/HCSR04.zip
从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 );
- }
显示字符的“字符液晶显示器”
我们使用字符液晶显示器来显示超声波距离传感器测量到的结果。字符液晶显示器是一种在内部存储有字母和数字等字符信息,可以简单地显示字符的显示设备。虽然能够显示的字符数是预先规定好的,但在显示像这次这样的测量距离或简单的介绍文本时,足够用了。
本次使用的字符液晶显示器“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的字符,需要另外的库。这次我们将使用笔者创建的库来来实现显示。您可以从下面的链接下载这个库文件。
下载库文件(AQM1602Y.zip) https://deviceplus.jp/wp-content/uploads/2020/04/AQM1602Y.zip
从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()
- {
- }
要显示的字符串由 lcddisp.charwrite() 指定。
当我将程序传输到Arduino时,显示器上显示“Chicken Racer”。为了便于查看,我打开了背光灯(如下面照片所示),但是实际上没有连接背光灯,所以背光灯不会亮。
推动车轮前进的“电机”
小鸡赛车是通过使装有车轮的电机来推动其前进的。在启动时使电机旋转,在按下开关时使电机停止。
由于使电机运行所需的电流较大,因此无法直接将电机连接到Arduino Nano的数字输入输出引脚。所以需要使用电机驱动器由电机专用电源供电。
要想实际驱动电机,就需要使用电机驱动器进行如下连接。本次使用的电机驱动器带有两个控制引脚,可以控制正转、反转和停止。但是,由于小鸡赛车只能前进,所以将正转控制用的输入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 );
- }
这次的小鸡赛车采用两个电机来使左车轮和右车轮旋转和前进。因此,需要为每个电机准备一个电机驱动器。如果能够独立控制两个电机,不仅可以使赛车前进,还可以实现旋转操作,可以更灵活地进行控制。
不过本次的赛车只需要能够前进和停止,因此只要让两个电机以相同的方式运行即可。所以,通过将两个电机驱动器的控制引脚连接到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 );
- }
- }
在电路板上创建电路
在确认了每个电子部件的工作情况之后,我们来为整个小鸡赛车创建一个配套的电路。电路图如下:
基本上,要让每个确认过的电子部件分别连接好。但是考虑到操作的方便性,我还增加了一个在调整电机转速时使电机旋转的开关、以及为了便于独立控制电机而设置的切换用跳线。
这个电路是在万用板上通过焊接来制作完成的。下面是作者做的电路板。是将主板和电机控制板分开制作的。
在制作电路板时,如果使用连接器进行连接,布线会更容易处理。这是因为一旦电路有什么问题,也可以通过插拔轻松地进行调整。这次,我用的是小型连接器——“XH连接器”。另外,在使用连接器时,需另行准备连接用的导线。
◆◆◆
我们创建了电路。接下来我们将完成壳体制作并创建运行程序,彻底完成小鸡赛车。 制作壳体
我决定使用前面提到的“圆形机器人底盘套件”来制作壳体。利用圆形机器人底盘套件中的两枚金属板做成两层,再安装上电机和车轮,即可轻松完成能行驶的车身了。
但是,对于这次需要安装两块电路板、两节电池、还有超声波距离传感器和微动开关的情况而言,实在是显得太拥挤了。另外,仅凭圆形机器人底盘套件附带的前轮用球头难以直行,而且一旦有点台阶,行进方向还可能会发生偏移。
因此,我决定使用3D打印机自己制作所需部件,以完成壳体制作。我使用的是3D打印机,这种打印机也可以加工板子类的部件,大家也可以试试。
安装电机和车轮
在最底下的一层,除了左右两个电机外,还需要安装前面制作的用来控制电机的电路板。另外,我在赛车的前部安装了自己用3D打印机制作的支架,使之起到加长的作用,以便安装迷你四驱车轮作为前轮。此外,还在与前方墙壁碰撞的部分安装了左右两个微动开关。
安装超声波传感器和电池在电机上方一层安装电池。这次,我分别准备了Arduino和电机工作用的电池。两者都是可提供9V电压的006P电池。小鸡赛车会受到诸如与墙壁碰撞等的冲击。因此,如果不将电池安装牢固,就可能会脱落。另外,由于电机的用电量较大,所以很容易耗尽电池电量。为了便于在没电时更换电池,我用3D打印机做了一个电池盒,这样就能从背面很方便地更换电池了。
除此之外,还在前方安装了超声波传感器,以测量到墙壁之间的距离。这次使用的超声波传感器“HC-SR04”无法测量小于2cm的距离。出于这个原因,超声波传感器应安装在至少离小鸡赛车头部(微动开关被按下的位置)之后2cm的位置。
安装主板将主板安装到赛车顶部。我用3D打印机制作了电池盒的顶盖,这样,就可以将主板安装在它上面了。
组装好车身后,安装车轮,然后将每个电子部件的导线连接到主板上,就完成了。
另外,由于控制开关是用导线连接的,因此需要准备几米左右的导线并将其接到开关上。
用保险杠吸收冲击
如果玩家未能在最后一刻将赛车停下来,那么小鸡赛车就会撞到墙上。而撞到墙上后,车身就会受到冲击。特别是如果有像这次这样的由3D打印机打印的部件时,它们可能会因撞击而开裂。而且,超声波距离传感器也可能会错位,从而无法准确地测量距离。
基于这些可能出现的问题,我给小鸡赛车安装了“保险杠”,以缓冲赛车与墙壁碰撞时的冲击力,防止车身断裂。保险杠上带有弹簧,可以吸收撞击墙壁时的冲击力,从而避免其影响车身。
这次我使用了通过3D打印机制作的保险杠。另外,在保险杠上面还装上了两个微动开关,用来检测与墙壁的碰撞。安装位置要确保墙壁碰到保险杠时开关被按下。
当然,如果您打算以低速行驶赛车,即使有碰撞也不会产生多大的冲击力,那么就不需要安装保险杠。
创建程序
壳体做好后,我们还需要完成编程工作。程序的主要结构如下:
要想实现各个功能,就需把前面介绍过的让每个零部件工作的方法通过编程结合起来。例如,赛车行驶起来之后,判断控制开关被按下了还是保险杠被撞了的程序如下:
- lcddisp.clear();
- lcddisp.move( 0x00, 0x00 );
- lcddisp.charwrite( " G O ! " );
- digitalWrite( MOTOR1_PIN, HIGH );
- flag = 0;
- while( 1 ){
- if( digitalRead( BUMPER_PIN ) == LOW ){
- flag = 2;
- break;
- }
- if( digitalRead( SW_PIN ) == LOW ){
- flag = 1;
- break;
- }
- }
- digitalWrite( MOTOR1_PIN, LOW );
通过第8行的while(),一直持续行驶,直到控制开关被按下或保险杠的微动开关被按下。在保持行进过程中,会随时确认控制开关和微动开关的状态。
第9行用来判断保险杠的开关是否被按下,即是否撞到了墙壁。通过digitalRead来确认微动开关所连接的引脚的状态,若为Low,则判断微动开关已被按下。通过将flag变量置“2”来记录撞到了墙壁。通过第11行的“break”退出while循环。
第13行用来判断控制开关被按下,即玩家按下停止开关。和微动开关的情况一样,通过确认控制开关所连接的引脚的状态,当变为“Low”时,判断开关已被按下。在flag变量中记录“1”并通过break退出循环。
退出循环后,通过第19行,将电机驱动器所连接的引脚置“Low”,使电机停止运行。
然后,确认flag变量并进行相应的处理。如果为“1”,则判断“成功”,通过超声波距离传感器测量到墙壁的距离,并显示在液晶显示器上。如果为“2”,则在液晶显示器上显示“Fail …”,表示挑战失败。
整个程序可以从以下链接下载:
下载程序(chickenracer.zip) https://deviceplus.jp/wp-content/uploads/2020/04/chickenracer.zip
关于其他处理,请参考下载的程序。您可以通过Arduino IDE打开文件,并将程序传输到Arduino Nano,即可用于小鸡赛车。
还配备了距离校准功能
在测量到墙壁之间的距离时,需要使撞墙状态下的距离为“0cm”。这个可以通过从超声波距离传感器测得的距离中减去超声波传感器和微动开关之间的距离来计算。例如,超声波距离传感器和微动开关之间的距离是3.5cm,测得的距离是5.1cm,那么到墙壁的距离可以计算得出“1.6cm”。
但是,在使用过程中,安装位置可能会发生偏移,超声波距离传感器和微动开关之间的距离可能会发生变化。这样的话,即使撞墙,也不会是0cm,成功时测得的距离甚至可能会显示为负数。
在这种情况下,需要每次在程序中改写计算公式并将其传输到Arduino,这需要花费大量的时间和精力。因此,我决定安装一个可以轻松调整距离校准值的功能。
要进行校正,请确保小鸡赛车处于撞墙状态(微动开关被按下的状态),然后按下位于液晶显示器右下方的距离校准开关。接着,测量到墙壁的距离,通过从实际测量值中减去该值,即可得到正确的距离。
让小鸡赛车跑起来
现在,让我们试试做好的小鸡赛车能不能跑起来。打开电源开关后,液晶显示器将显示“Chicken Racer”。想玩赛车比赛游戏时,请按下有线连接的控制开关。然后,LED将开始倒计时。
当倒计时LED变为绿灯时,小鸡赛车开始向前行驶。在快要撞上墙壁之前,按下控制开关,让小鸡赛车停下来。
如果您可以在不撞墙的情况下停下来,液晶显示器上将会显示出与墙壁之间的距离。如果失败,则会显示“Fail …”,让您知道失败了。如果在游戏结束后按下保险杠上的微动开关,就会被重置,您可以重新开始游戏。
到这里,小鸡赛车就大功告成了。本系列连载文章中介绍的电子部件的操作方法和制作过程,在创作其他作品时也会用得到,欢迎参考并尝试使用Arduino挑战各种电子作品的创作!
来源:techclass.rohm