亲手DIY机器人是很多人的梦想,无奈大多数人都是非专业人士,更有一些是完全没接触过类似知识的小白,怎么办,梦想只能就此放弃了吗?最近,wikihow上发表了一篇DIY机器人的文章,详细讲述了大牛DIY机器人的全过程,甚至连程序代码都有,相信你也能跟着他做一个属于自己的机器人。

以下是文章全文:

你想要DIY一个属于自己的机器人?有很多不同类型的机器人,你自己就能DIY出来。大多数人希望看到机器人执行从A点到B点的简单任务,其实这并不难,只要购买一些模拟器件或者入门工具包就可以了。DIY机器人是自学电子学和计算机编程的一种非常好的方式。

第一步:组装机器人

20171030_01_robot01

1、收集电子元器件。DIY机器人需要一些简单的电子元器件,在附近的电子市场(比如华强北)或者在线零售商店(比如某宝)你可以买到其中的大部分,当然,一些基础的套件也可能包含所有所需元器件。这个机器人是不需要焊接的:

• Arduino UNO(或者其他的微控制器) • 2个连续旋转舵机 • 2个适合上述舵机的轮子 • 1个连铸机辊 • 1个小型无焊料的试验电路板(要找一个每边有两个正负线的电路板) • 1个远程传感器(有四脚连接器电缆) • 1个包含1个1万欧姆的电阻的按钮开关 • 1套线对板连接器 • 1个6 x AA的电池支架,包含一个9V DC插座 • 1包跨接线或者22 gauge的布线用电线 • 强力双面胶带或者热粘接剂

20171030_01_robot02

2、翻转电池组,背面朝上。我们用这个电池组作为基础DIY机器人的身体。

20171030_01_robot03

3、将两个舵机与电池组的一端对齐。这应该是电池组的电线伸出来的一端。舵机应该触到底部,并且每个舵机的旋转部分应该在电池支架的两边。舵机被合理的对齐是很重要的,这是为了让轮子放的直一些。舵机的电线应该从电池组的背部出来。

20171030_01_robot04

4、用胶带或胶水粘贴舵机。确定它们被牢牢地粘在一起。舵机的背部应该和电池支架的背部紧紧地贴在一起。舵机现在应该占了电池组背部的一半。

20171030_01_robot05

5.将电路板平行贴在电池组背部空下的区域。它要跟电池组前端有一点点距离,横向在电池组两边应该露出一小部分。在下一步之前,确定它粘附的很牢。“A”排应该很接近舵机。

20171030_01_robot06

6.将Arduino微控制器粘在舵机的顶部。如果两个舵机放的位置很合适的话,它们之间的接触部分应该有一段平整的区域,将Arduino微控制器放在这部分区域上,让Arduino的USB和电源线朝后(远离电路板)。Arduino的前端应该刚好与线路板有重叠。

20171030_01_robot07

7.将轮子装在舵机上。将轮子紧紧地装到舵机的旋转部分,这可能需要很大的力气,因为轮子就是为了紧紧嵌入舵机来提供最大的牵引力。

20171030_01_robot08

8.将连铸辊接在接线板底部。把机身反过来,应该可以看到电路板露在外边一点。将连铸辊装到露在外面的部分,必要的话可以使用立管。连铸辊作为前轮,方便机器人转向。

如果你买了一个工具包,里面可能附带了一些对应连铸辊的立管,可以保证连铸辊接触地面。

第二步:给机器人接线

20171030_01_robot09

1.改造两个三脚连接器。用它们将舵机连到电路板上,移动针部,让两边距离相等。

20171030_01_robot10

2.将两个连接器插入电路板E排的1-3插口和6-8插口。确保它们被牢固地插入电路板上。

20171030_01_robot11

3.将舵机电缆接到连接器上,黑色电缆在左边(接到1口和6口上)。这就将舵机与电路板连接在一起。确定左边的舵机连接到左边的连接器上,右边的舵机连接到右边的连接器上。

20171030_01_robot12

4.红色跳线分别从C2针和C7针连到红色导轨(正级)针上。确定你用的是电路板后部的红色导轨针(red rail)(靠近机身的其他部分区域的红色导轨针)。

20171030_01_robot13

5.将黑色跳线分别从B1针和B6针接到蓝色导轨针(地线)上。确定你用的是电路板后部的蓝色导轨针(blue rail pins),不要插到红色导轨针上。

20171030_01_robot14

6.白色跳线从Arduino 的针12和针13连接到A3和A8上。这样,Arduino就能控制舵机和轮子了。

20171030_01_robot15

7.将传感器装到电路板前面。它不能插到电路板的外部电源区域中,应该插到第一排J行中。确定你精确地插到了中间区域,两边有数量相等的针数剩余。

20171030_01_robot16

8.黑色跳线连接针I14和传感器左侧第一个可用的蓝色针,让传感器接地。

20171030_01_robot17

9.黑色跳线连接针I 17和传感器右侧第一个可用的红色针,给传感器供电。

20171030_01_robot18

10.白色跳线连接针I 15和Arduino上的针9,类似地,再连接针I16和针8,将传感器的信号传递给微控制器。

第三步:连接电源

20171030_01_robot19

1.翻转机身,让电池组的电线从左下角伸出。

20171030_01_robot20

2.用红色的电线连接左下角的弹簧。一定要确定电池组放置位置正确。

20171030_01_robot21

3.用黑色电线连接右下角最后一个弹簧。这两根电线给Arduino供电。

20171030_01_robot22

4.将上述红色和黑色的电线连到电路板最右边红色和蓝色的针上。黑色电线应该插入到蓝色导轨针的针30处。红色电缆线应该插到红色电缆线的针30处。

20171030_01_robot23

5.黑色电线连接Arduino上的GND针和电路板后部的蓝色导轨针。蓝色导轨针处连接位置是针28。

20171030_01_robot24

6.一个黑色电线连接电路板后部的蓝色导轨针和前部的蓝色导轨针(位置均在针29处)。不要连接红色导轨,那样很可能损坏Arduino。

20171030_01_robot25

7.连接电路板前部的红色导轨针(针30)到Arduino上的5V针,给Arduino供电。

20171030_01_robot26

8.在两排的间隔处针24-26处插入按钮开关,这样不需要拔电源就能关闭机器人。

20171030_01_robot27

9.用一根红色线连接H24和传感器右侧下一个可用的针,给按钮供电。

20171030_01_robot28

10.用电阻连接H26和蓝色导轨针。直接将电阻与针连接,并连到几步之前用到的黑色线旁边。

20171030_01_robot29

11.用一根白色线连接G26和Arduino的针2处,让Arduino可以给按钮注册。

第四步:安装Arduino软件

20171030_01_robot30

1.下载并提取Arduino IDE。这是Arduino的开发环境,这样,你可以将指令编程并上传到你的Arduino微型控制器中。你可以从arduino.cc/en/main/software网站中免费下载它。解压下载下来的文件,找到该文件夹,不需要安装程序,只需要双击arduino.exe来运行它。

20171030_01_robot31

2.将电池组连到Arduino上。给Arduino的连接器接上电池组来为其供电。

20171030_01_robot32

3.用USB将Arduino接入电脑。Windows很有可能识别不了这个设备。

20171030_01_robot33

4.按下win+R,并输入“devmgmt.msc”,调出设备管理器。

20171030_01_robot34

5.右键点击 “其他设备”选项中的“未知设备”,并选择“更新驱动软件”。如果你没有看到这个选项,点击“属性”,选择“驱动”标签,接着点击“更新驱动”。

20171030_01_robot35

6.选择“浏览我的电脑来寻找驱动软件。”选择Arduino IDE中自带的驱动软件。

20171030_01_robot36

7.点击“浏览”,接着找到你之前下载并解压好的文件夹。你会在文件夹里找到一个名为“drivers”的文件夹。

20171030_01_robot37

8.选择“drivers”文件夹,并点击“确定”。如果你被警告“这是未知软件”,确认你想要继续。

第五步:给机器人编程

20171030_01_robot38

1.双击IDE文件夹中的“arduino.exe”启动Arduino IDE,新建一个空白的工程。

20171030_01_robot39

2、将以下代码粘贴进去,你的机器人就可以走直线了。

#include <Servo.h> // this adds the "Servo" library to the program

// the following creates two servo objects Servo leftMotor; Servo rightMotor;

void setup() { leftMotor.attach(12); // if you accidentally switched up the pin numbers for your servos, you can swap the numbers here rightMotor.attach(13); }

void loop() { leftMotor.write(180); // with continuous rotation, 180 tells the servo to move at full speed "forward." rightMotor.write(0); // if both of these are at 180, the robot will go in a circle because the servos are flipped. "0" tells it to move full speed "backwards." }

20171030_01_robot40

3.构建并上传代码。点击左上角的“向右的箭头”来将代码构建并上传到USB连接着的Arduino。

你可能要先把机器人拿起来,因为一旦代码上传好,它会不断向前移动。

20171030_01_robot41

4.增加关闭开关功能。增加代码以下到源代码的“void loop()”部分中来激活关闭开关功能。具体位置在“void loop()”中“write()”函数上面。

if(digitalRead(2) == HIGH) // this registers when the button is pressed on pin 2 of the Arduino { while(1) { leftMotor.write(90); // "90" is neutral position for the servos, which tells them to stop turning rightMotor.write(90); } }

20171030_01_robot42

5.上传并测试你的代码。增加关闭开关功能后,就可以将代码上传并测试机器人了。在按下按钮之前,机器人不断前进,按下按钮后,它将停止。全部代码如下

#include <Servo.h>

// the following creates two servo objects Servo leftMotor; Servo rightMotor;

void setup() { leftMotor.attach(12); rightMotor.attach(13); }

void loop() { if(digitalRead(2) == HIGH) { while(1) { leftMotor.write(90); rightMotor.write(90); } }

leftMotor.write(180); 
rightMotor.write(0); 

}

到这里,一个非常简单的机器人就做好了,是不是觉得有点兴奋呢?不过,这个机器人的运动略为简单了一些,因此我们再提供另一段代码给大家,它使用了机器人的传感器,当机器人遇到障碍时,就会左转。代码中的注释解释了代码每个部分是用来做什么的。

#include <Servo.h>

Servo leftMotor; Servo rightMotor;

const int serialPeriod = 250; // this limits output to the console to once every 1/4 second unsigned long timeSerialDelay = 0;

const int loopPeriod = 20; // this sets how often the sensor takes a reading to 20ms, which is a frequency of 50Hz unsigned long timeLoopDelay = 0;

// this assigns the TRIG and ECHO functions to the pins on the Arduino. Make adjustments to the numbers here if you connected differently const int ultrasonic2TrigPin = 8; const int ultrasonic2EchoPin = 9;

int ultrasonic2Distance; int ultrasonic2Duration;

// this defines the two possible states for the robot: driving forward or turning left #define DRIVE_FORWARD 0 #define TURN_LEFT 1

int state = DRIVE_FORWARD; // 0 = drive forward (DEFAULT), 1 = turn left

void setup() { Serial.begin(9600);

// these sensor pin configurations
pinMode(ultrasonic2TrigPin, OUTPUT);
pinMode(ultrasonic2EchoPin, INPUT);

// this assigns the motors to the Arduino pins
leftMotor.attach(12);
rightMotor.attach(13);

}

void loop() { if(digitalRead(2) == HIGH) // this detects the kill switch { while(1) { leftMotor.write(90); rightMotor.write(90); } }

debugOutput(); // this prints debugging messages to the serial console

if(millis() - timeLoopDelay >= loopPeriod)
{
    readUltrasonicSensors(); // this instructs the sensor to read and store the measured distances

    stateMachine();

    timeLoopDelay = millis();
}

}

void stateMachine() { if(state == DRIVE_FORWARD) // if no obstacles detected { if(ultrasonic2Distance > 6 || ultrasonic2Distance < 0) // if there's nothing in front of the robot. ultrasonicDistance will be negative for some ultrasonics if there is no obstacle { // drive forward rightMotor.write(180); leftMotor.write(0); } else // if there's an object in front of us { state = TURN_LEFT; } } else if(state == TURN_LEFT) // if an obstacle is detected, turn left { unsigned long timeToTurnLeft = 500; // it takes around .5 seconds to turn 90 degrees. You may need to adjust this if your wheels are a different size than the example

    unsigned long turnStartTime = millis(); // save the time that we started turning

    while((millis()-turnStartTime) < timeToTurnLeft) // stay in this loop until timeToTurnLeft has elapsed
    {
        // turn left, remember that when both are set to "180" it will turn.
        rightMotor.write(180);
        leftMotor.write(180);
    }

    state = DRIVE_FORWARD;
}

}

void readUltrasonicSensors() { // this is for ultrasonic 2. You may need to change these commands if you use a different sensor. digitalWrite(ultrasonic2TrigPin, HIGH); delayMicroseconds(10); // keeps the trig pin high for at least 10 microseconds digitalWrite(ultrasonic2TrigPin, LOW);

ultrasonic2Duration = pulseIn(ultrasonic2EchoPin, HIGH);
ultrasonic2Distance = (ultrasonic2Duration/2)/29;

}

// the following is for debugging errors in the console. void debugOutput() { if((millis() - timeSerialDelay) > serialPeriod) { Serial.print("ultrasonic2Distance: "); Serial.print(ultrasonic2Distance); Serial.print("cm"); Serial.println();

    timeSerialDelay = millis();
}

}

网友问答时间

1.DIY机器人需要多长时间?

答:这主要取决于机器人的复杂程度。简单的机器人只需要一天左右,比较复杂的机器人,可能需要几个月。

2. 我可以用Arduino的旧手机吗?

答:当然可以。蓝牙模块可用于连接Arduino与手机。

3.哪里可以找到需要的材料?

答:Amazon或者其他购物网站,比如国内的某宝。

4.让机器人的手、手臂和腿运动的设备叫什么?

答:伺服电机。常规舵机的寿命有限。

5. 为什么需要下载Arduino软件?

答:Arduino代码非常简化,基于C ++。 其他微控制器也可以使用其他软件。

6.DIY的机器人可以用来做什么?

答:从理论上说,你可以用它来送餐、洗碗、扫地……这主要取决于你的编程技巧。

7. arduino是什么?

答:Arduino就像手机的操作系统,但它是机器人的操作系统。有很多这样的程序,如C ++或Java等。

8.这是一个简单的机器人吗?

答:是的,可能是最简单的。DIY基本机器人所需的主要必要部件列在页面的顶部。唯一困难的是布线,真的。

9. 机器人会避障吗?

答:可以通过编程来实现。所以,如果想要把机器人做得更好,就需要更好地学习编程。

10. 我无法将代码下载到Arduino板上,该怎么办?

答:您可能需要另外购买一个Arduino板,它有可能破损。在此之前,你可以先尝试将代码系统更新到更高的级别。

11.10岁的孩子能完成这项任务吗?

答:只要按照上述步骤,任何人都能完成。孩子如果看不懂的话,可能需要家长帮忙。

12.DIY这个机器人需要多少钱?

答:影响的因素实在太多了,例如你购买哪些材料,在哪里购买的,等等。

(编译:Yufy Zhang)