电源设计技术信息网站

订阅电子杂志   English   繁體中文   日本語   한국어

下载中心

TECH INFOArduino入门指南

利用Parallax激光传感器制作Arduino激光机器人—第1部分

这篇文章来源于DevicePlus.com英语网站的翻译稿。

arduino robot

 

试想一下,您刚搬到一个新地方,需要尽快添置家具,但是手头没有卷尺可以进行测量。那么,这款Parallax激光Arduino机器人就会派上用场!

我们在之前的文章《如何制作自己的机器人》 《如何制作自己的机器人(第2部分)》中描述了如何利用Arduino UNO R3从零开始搭建属于自己的机器人。在本文中,我们将进一步增加机器人的功能:让它能够动起来并且添加激光测距(LRF)功能,以使该设备能够检测物体并测量距离。

激光传感器会帮我们获得更准确、更可靠的数据。该Arduino机器人的移动方式为自主移动模式。它在移动的过程中能够检测到障碍物并主动避开。

该机器人的设计目标如下:

  • 向前、向后移动;向左和向右旋转90度;向左和向右旋转45度。
  • 基于最佳路径,通过向不同方向移动避开障碍物。
  • 测量各个方向(前方、左右90度、左右45度)的距离。
  • 基于可用的最长距离,确定朝哪个方向前进(向前、向后、向左或向右)。

传感器安装在伺服上,以便机器人可以左右平移以进行多次测量。测量的距离将显示在一块小型OLED显示屏上。我们将使用步进电机实现平稳、安静的运行。

我们会一步一步地讨论该Arduino机器人的构建过程。第一步是如何安装底盘、电机和Arduino/电机开发板。然后,我们利用一个小程序来测试电机,以确保系统连接和软件安装都准确无误。然后,在下一篇文章中,我们会逐步添加其余设备,并且每一步都通过程序来测试安装和连接是否正确。通过这种按部就班的方法能够让我们更方便地解决制作过程中遇到的任何问题。

硬件

制作该机器人所需的硬件请参见以下硬件明细,这些零部件在许多电商处都可以买到(明细中给出了部分地址)。

 

软件

工具

  • 圆锉
  • Dremel 电动工具
  • 电烙铁
  • 迷你钢锯

安装电机、轮子和亚克力底座

Parallax底盘由高强度铝制成。该部件是专门为伺服系统而不是步进电机设计的,因此我们需要做一些修改。

首先,要将电机安装到机箱上,我们得在机箱的两侧开口。请用Dremel电动工具按照电机的安装尺寸精确切割机箱。

我们使用的步进电机型号为NEMA 17,其分辨率为200步/转。其供电规格为12V 350mA。

要将电机装入底盘内,我们需要尺寸为6.5cm x 4.5cm的亚克力板,如图1所示。请用钢锯将亚克力板切割成所需尺寸,然后用Dremel电动工具钻孔。用M2x10mm的螺钉将电机装在亚克力安装板上,两个电机需要8颗螺钉。然后,将制作完毕的亚克力板和电机安装到底盘内。

arduino robot

图1.将步进电机安装在6.5×4.5cm亚克力板上

要固定Arduino和OLED显示屏,我们需要切割一块15cmx8cm的亚克力底座(图2)。请用4个垫片和螺丝安装亚克力底座,然后用附带的销钉安装尾轮。

 

arduino robot

图2.机箱、尾轮和15×8亚克力板底座

 

arduino robot

图3.轮子和轴连接器

 

arduino robot

图4.安装在底盘上的步进电机和尾轮

我们需要用图3中所示的轴连接器安装轮子。但是,我们必须做一个小修改。轴孔的直径为4mm,而步进电机轴的直径为5mm。因此,我们需要将连接器的孔扩大到5mm。请使用圆锉或Dremel工具扩孔。扩孔时一定要小心操作!

arduino robot

图5.安装在底盘上的亚克力底座

请将电机线缆从顶部的孔穿出,然后用双面胶带将电池粘在机箱下方。对于该项目来说,锂聚合物电池是理想解决方案。其供电规格为11.1V 800mAh〜1000mAh,这使得系统续航可超过1小时,而且还可以充电。但是该电池需要专门的充电器。如果您是航空模型或遥控车爱好者,那么您肯定知道这种电池。我们也可以用6或8节AA电池(9-12V)代替。

arduino robot

图6.用双面胶将电池粘在底盘上

将电机电缆连至电机开发板

Adafruit 电机开发板规格 – Adafruit

  • 与Arduino高分辨率专用计时器相连的两个5V Hobby伺服器接口
  • 4个H桥:搭载TB6612芯片组,每个桥可提供1.2A电流(峰值为3A,持续20ms),具有热关断保护功能,以及内部反冲保护二极管。可为电机提供4.5VDC至13.5VDC供电。
  • 可连接最多4个双向直流电机,具有单独8位速度选择功能。
  • 可连接最多2个单线圈、双线圈、交叉步进或微步进电机(单极或双极)。
  • 经测试与Arduino UNO、Leonardo、ADK/Mega R3、Diecimila和Duemilanove兼容。兼容Due,配有3.3v逻辑跳线。兼容Mega/ADK R2及更早版本,具有2个跳线。
  • 5v3.3v逻辑电平(跳线可配置)。

该电机开发板能同时运行2个步进电机和2个伺服器。该步进电机开发板的一个很大优势在于它不占用任何Arduino引脚,因为它通过I2C连接。唯一需要引脚的是伺服器。我们只需按照说明连接电机电缆即可。

要了解步进电机的基本知识及其与Arduino UNO R3的连接,请参考《Arduino与零件和传感器——步进电机第1部分》

arduino robot

图7.将电机连至电机开发板

 

arduino robot

图8.亚克力底座上的Arduino和电机开发板

现在,我们只需要根据下图安装轮子和电池接头即可。

 

arduino robot

图9.步进电机电缆连至电机开发板

安装软件并上传代码

现在,我们可以运行第一段代码了!首先,我们需要从Arduino网站下载并安装Arduino IDE,从Adafruit网站上下载并安装电机开发板库。安装成功后,请将以下源代码复制到Arduino中。

//*******************************************************************************************************************************************

#include <Wire.h>

#include <Adafruit_MotorShield.h>

#include "utility/Adafruit_MS_PWMServoDriver.h"

Adafruit_MotorShield AFMS = Adafruit_MotorShield();

Adafruit_StepperMotor *myMotor1 = AFMS.getStepper(200, 1);

Adafruit_StepperMotor *myMotor2 = AFMS.getStepper(200, 2);

void setup()

{  Serial.begin(9600);           // set up Serial library at 9600 bps

 Serial.println("Stepper test!");

 AFMS.begin();  // create with the default frequency 1.6KHz  

 myMotor1->setSpeed(100);  // 100 rpm   

 myMotor2->setSpeed(100);  // 100 rpm   

 }

void loop()

{

Motor(50,3);                    // turn Left for 50 steps

delay(1000);

Motor(100,4);                   // turn Right for 100 steps

delay(1000);

Motor(50,3);                    // turn Left for 50 steps (back to original position)

delay(1000);

Motor(400,1);                   // move Forward for 400 steps

delay(1000);

Motor(400,2);                   // move Backward for 400 steps

delay(1000);

}

//******************************************* *************************************

void Motor(int x,int y)

{   int i = 0;

 for ( i; (i < x); i ++)

 { if (y == 1)   // move forward

{ myMotor1->step(1, FORWARD, SINGLE);

 myMotor2->step(1, BACKWARD, SINGLE);}

  if (y == 2)   // move backward

 {myMotor1->step(1, BACKWARD, SINGLE);

 myMotor2->step(1, FORWARD, SINGLE);}

 if (y == 3)    // move left

  { myMotor1->step(1, FORWARD, SINGLE);

 myMotor2->step(1, FORWARD, SINGLE);}

 if (y == 4)    // move right

  { myMotor1->step(1, BACKWARD, SINGLE);

 myMotor2->step(1, BACKWARD, SINGLE);}}

}

//********************************************************************************************************************************************

 

这段代码非常简单。其目的是让机器人能够向左旋转90度以及向右旋转90度。该程序还能让机器人返回到起始位置:向前移动400步,然后向后移动回到起始位置。在程序循环中,我们运行Motor函数,该函数具有2个参数。第一个参数表明电机必须旋转多少步,第二个参数表明电机移动方向(向前、向后、向左和向右)。

程序运行后,该Arduino机器人应该会像上述视频显示的那样移动。

在下一篇文章中,我们将继续添加其他系统部件,比如伺服器和激光测距仪(LRF),并编写一个程序,让机器人能够自主移动。因此,敬请关注我的下一篇文章!

Purnomo Nuhalim
Purnomo Nuhalim

来自墨尔本的Purnomo是一名退休人员,也是电子发烧友。目前,他正使用Arduino和Raspberry Pi从事各种开放式硬件项目的研发。除了电子学,他还对航空建模和天文学充满热情。

分享到社交媒体