用Arduino和距离传感器制作小鸡赛车!(第2篇)

电子说

1.3w人已加入

描述

第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。

此次的超声波距离传感器的测量工作将使用笔者创建的库。您可以通过下面的链接下载这个库。

下载库文件(HCSR04.zip)

从Arduino IDE的“Sketch”菜单中选择“Include Library”-“Add .ZIP Library”,打开下载的库。现在,就可以使用超声波距离传感器库了。

创建如下程序,通过这个程序,可以利用超声波距离传感器来获取距离,并在串口显示器上查看。

 

#include 

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的字符,需要另外的库。这次我们将使用笔者创建的库来来实现显示。您可以从下面的链接下载这个库文件。

下载库文件(AQM1602Y.zip)

从Arduino IDE的“Sketch”菜单中选择“Include Library”-“Add .ZIP Library”,打开下载的库。现在,就可以使用该库了。

让我们实际显示一下“Chicken Racer”。创建如下程序:

 

#include 
#include 

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连接器”。另外,在使用连接器时,需另行准备连接用的导线。

◆◆◆

这次我们创建了电路。下次我们将完成壳体制作并创建运行程序,彻底完成小鸡赛车。下一篇更精彩,敬请期待!

电机驱动器

福田和宏

作家,居住在日本札幌。喜欢撰写有关电子创作、电脑、Linux、智能手机等方面的文章。在为“Raspberry Pi Magazine”和“日经Linux”供稿。著有《这本书足够!Raspberry Pi超简单入门教程》(SOTECHSHA)、《学习各种电子元器件的控制!Arduino电子创作 实战教程》(SOTECHSHA)、《Arduino实用入门》(技术评论出版社)等书籍。目前,创办了“札幌电子工艺部”,这里汇集了众多电子创作发烧友,大家使用各自的电子技能创作各种作品。任何人都可以参加,也期待您的加入!

审核编辑 黄宇

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分