制作您的第一个 Arduino 机器人 - 最佳初学者指南!
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 2 | ||||
| × | 2 | ||||
| × | 2 | ||||
| × | 3 | ||||
| × | 3 | ||||
| × | 8 | ||||
| × | 1 |
必要的工具和机器
| ||||
| ||||
|
应用和在线服务
| ||||
| ||||
|
关于这个项目
如果您是 Arduino 的初学者并计划制作您的第一个机器人,那么这里有适合您的教程。看看你今天要构建的图像。
图>在本教程中,我将展示如何制作具有不同功能的 Arduino 机器人。我们可以学习使用不同的程序实现不同的功能,主要是智能手机控制的机器人,带有避障器、墙壁跟随器和迷宫求解器。或者你也可以只为一个功能制作它。
材料和工具 图> 图> 图> 图>
第 2 步:制作机箱
为电机钻两个孔:
连接两个电机:
为脚轮打三个孔:
连接脚轮:
测量并标记正确的直径后,在盒子的两侧开两个孔用于连接电机,在底部开三个孔用于连接脚轮。然后安装电机和脚轮。
电池
连接电池。
连接图。
将电池粘在盒子内。
在脚轮上方的盒子内安装两节 9 伏电池。然后将它们并联并连接一个开关,如上图所示。
连接Arduino和电机扩展板
将电机护罩连接到 Arduino 上方。
将电池线连接到 PWR 电机屏蔽端子。
将电机连接到电机屏蔽。
从此端口移除跳线。
将电机护罩连接到 Arduino 上方并将其放置在电池上方。然后将电机和电池的电线连接到电机护罩。连接前请查看连接图,因为它非常重要。
接线说明:
- 将左侧电机连接到电机护罩的“M1”
- 将正确的电机连接到电机护罩的“M3”
- 将电池的电线连接到电机护罩的“ext pwr”
打两个孔并为 Arduino 供电
标记要打孔的位置。
打孔。
将电池夹连接到 9V 电池的 DC 公头插孔。
将这个 9 伏电池放在盒子里。
制作两个孔用于访问 Arduino 的 USB 端口和 DC 输入端口。另取一块 9 伏电池,将电池夹连接到 DC 公插孔适配器,然后将 DC 公插孔连接到 Arduino DC 输入端口,为 Arduino 供电。然后将电池放在电机和盒子内的 Arduino 之间。
连接蓝牙模块和开关
如连接图所示将蓝牙模块连接到Arduino并将其放入盒子内。然后在盒子的背面打孔安装开关并连接开关(这里因为一些焊接问题我改变了之前使用的开关)。
蓝牙模块接线说明:
- 蓝牙模块的“TX”去Arduino的“RX”
- 蓝牙模块的“RX”去Arduino的“TX”
- 蓝牙模块的“VCC”到Arduino的“5v”
- 蓝牙模块的“GND”到Arduino的“GND”
- BT 模块的状态和关键引脚未使用。
整体电路图
传感器超声波安装
拿起超声波传感器,将一个小的“L”形塑料片粘在上面,然后将其粘在塑料盒的顶部(或者,如果您没有胶棒,请使用双面胶带)。然后按照上面的电路图连接跳线。
超声波传感器接线说明:
- 超声波传感器的“VCC”到Arduino的“+5”
- 超声波传感器的“GND”到Arduino的“GND”
- 超声波传感器的“Trig”引脚连接到Arduino的“模拟引脚1”
- 超声波传感器的“Echo”引脚连接到Arduino的“模拟引脚0”
现在我们完成了所有的连接,是时候进行编程了。
最后一步 - Arduino 代码和蓝牙应用程序编辑
上传“最终草图 " 在代码部分提供。如果您遇到任何错误,请确保您已安装 AFmotor 库。
现在,我们学习了如何轻松地对 Arduino 进行编程。我在这里展示了一些程序,可以将这个机器人用作避障机器人、墙跟随器和蓝牙控制。最后我将这三个功能结合在一起。观看视频了解更多详情和信息
蓝牙应用入门
墙壁跟随器和避障的一些乐趣
在此处访问我的博客 - Robotechmaker.com
如果您有任何问题或任何建议,请在下方评论。
代码
- 蓝牙(受控机器人)草图
- 最终草图(最终代码)
- 避障草图
- 墙跟随草图
蓝牙(受控机器人)草图Arduino
/*作者:Marcelo Moraes 这个项目包含公共领域的代码。允许修改,恕不另行通知。 *///Libraries#include//ObjectsAF_DCMotor motorRight(1, MOTOR12_64KHZ); // 创建电机 #1, 64KHz pwmAF_DCMotor motorLeft(3, MOTOR12_64KHZ); // 创建电机 #3, 64KHz pwm//Constants and variablechar dataIn ='S';char determinant;char det;int vel =0; //蓝牙Stuffvoid setup() { Serial.begin(9600); // 以 9600 bps 的速度设置串行库 //初始化消息 Serial.println("ArduinoBymyself - ROVERBot"); Serial.println("AF 电机测试!"); //关闭电机 motorRight.setSpeed(0); motorLeft.setSpeed(0); motorRight.run(RELEASE); motorLeft.run(RELEASE); }void loop() { det =check(); //调用check()子程序获取串口代码 //串口代码分析开关(det){ case 'F':// F,向前移动motorRight.setSpeed(vel); motorLeft.setSpeed(vel); motorRight.run(FORWARD); motorLeft.run(FORWARD); det =检查();休息; case 'B':// B, 向后移动 motorRight.setSpeed(vel); motorLeft.setSpeed(vel); motorRight.run(向后); motorLeft.run(向后); det =检查();休息; case 'L':// L, 向左移动轮子 motorRight.setSpeed(vel); motorLeft.setSpeed(vel/4); motorRight.run(FORWARD); motorLeft.run(FORWARD); det =检查();休息; case 'R':// R,向右移动轮子 motorRight.setSpeed(vel/4); motorLeft.setSpeed(vel); motorRight.run(FORWARD); motorLeft.run(FORWARD); det =检查();休息; case 'I':// I, 向右转 motorRight.setSpeed(vel/2); motorLeft.setSpeed(vel); motorRight.run(FORWARD); motorLeft.run(FORWARD); det =检查();休息; case 'J':// J,右转 motorRight.setSpeed(vel/2); motorLeft.setSpeed(vel); motorRight.run(向后); motorLeft.run(向后); det =检查();休息; case 'G':// G,左转 motorRight.setSpeed(vel); motorLeft.setSpeed(vel/2); motorRight.run(FORWARD); motorLeft.run(FORWARD); det =检查();休息; case 'H':// H,左转 motorRight.setSpeed(vel); motorLeft.setSpeed(vel/2); motorRight.run(向后); motorLeft.run(向后); det =检查();休息; case 'S':// S,停止 motorRight.setSpeed(vel); motorLeft.setSpeed(vel); motorRight.run(RELEASE); motorLeft.run(RELEASE); det =检查();休息; }}//获取串口收到的蓝牙码int check(){ if (Serial.available()> 0){// 如果串口中有有效数据 dataIn =Serial.read();// 存入数据a varialbe //检查代码 if (dataIn =='F'){//前向行列式 ='F'; } else if (dataIn =='B'){//后向行列式 ='B'; } else if (dataIn =='L'){//左行列式 ='L'; } else if (dataIn =='R'){//右行列式 ='R'; } else if (dataIn =='I'){//Froward Right 行列式 ='I'; } else if (dataIn =='J'){//向后右行列式 ='J'; } else if (dataIn =='G'){//前向左行列式 ='G'; } else if (dataIn =='H'){//向后左行列式 ='H'; } else if (dataIn =='S'){//停止行列式 ='S'; } else if (dataIn =='0'){//速度 0 vel =0; } else if (dataIn =='1'){//Speed 25 vel =25; } else if (dataIn =='2'){//Speed 50 vel =50; } else if (dataIn =='3'){//Speed 75 vel =75; } else if (dataIn =='4'){//Speed 100 vel =100; } else if (dataIn =='5'){//Speed 125 vel =125; } else if (dataIn =='6'){//Speed 150 vel =150; } else if (dataIn =='7'){//Speed 175 vel =175; } else if (dataIn =='8'){//Speed 200 vel =200; } else if (dataIn =='9'){//Speed 225 vel =225; } else if (dataIn =='q'){//Speed 255 vel =255; } else if (dataIn =='U'){//行列式背光 ='U'; } else if (dataIn =='u'){//Back Lights Off determinant ='u'; } else if (dataIn =='W'){//行列式前灯 ='W'; } else if (dataIn =='w'){//前灯关闭行列式 ='w'; } else if (dataIn =='V'){//Horn On determinant ='V'; } else if (dataIn =='v'){//Horn Off 行列式 ='v'; } else if (dataIn =='X'){//额外的行列式 ='X'; } else if (dataIn =='x'){//Extra Off determinant ='x'; } } 返回行列式;}
最终草图(最终代码)Arduino
/*作者:Muhammed Azharvisit -robotechmaker.com*/#include#define trigPin 14 // 定义传感器的引脚#define echoPin 15 //ObjectsAF_DCMotor motorRight(1, MOTOR12_64KHZ); // 创建电机 #1, 64KHz pwmAF_DCMotor motorLeft(3, MOTOR12_64KHZ); // 创建电机 #3, 64KHz pwm//Constants and variablechar dataIn ='S';char determinant;char det;int vel =255; //蓝牙Stuffvoid setup() { Serial.begin(9600); // 设置串行库为 9600 bps pinMode(trigPin, OUTPUT);// 设置触发引脚为输出(发送声波) pinMode(echoPin, INPUT);// 设置回声引脚为输入(接收声波)/ /初始化消息 Serial.println(" Mr.robot"); Serial.println("上班啦!"); //关闭电机 motorRight.setSpeed(0); motorLeft.setSpeed(0); motorRight.run(RELEASE); motorLeft.run(RELEASE);}void loop() { det =check(); //调用check()子程序获取串口代码 //串口代码分析开关(det){ case 'F':// F,向前移动motorRight.setSpeed(vel); motorLeft.setSpeed(vel); motorRight.run(FORWARD); motorLeft.run(FORWARD); det =检查();休息; case 'B':// B, 向后移动 motorRight.setSpeed(vel); motorLeft.setSpeed(vel); motorRight.run(向后); motorLeft.run(向后); det =检查();休息; case 'L':// L, 向左移动轮子 motorRight.setSpeed(vel); motorLeft.setSpeed(vel/4); motorRight.run(FORWARD); motorLeft.run(FORWARD); det =检查();休息; case 'R':// R,向右移动轮子 motorRight.setSpeed(vel/4); motorLeft.setSpeed(vel); motorRight.run(FORWARD); motorLeft.run(FORWARD); det =检查();休息; case 'I':// I, 向右转 motorRight.setSpeed(vel/2); motorLeft.setSpeed(vel); motorRight.run(FORWARD); motorLeft.run(FORWARD); det =检查();休息; case 'J':// J,右转 motorRight.setSpeed(vel/2); motorLeft.setSpeed(vel); motorRight.run(向后); motorLeft.run(向后); det =检查();休息; case 'G':// G,左转 motorRight.setSpeed(vel); motorLeft.setSpeed(vel/2); motorRight.run(FORWARD); motorLeft.run(FORWARD); det =检查();休息; case 'H':// H,左转 motorRight.setSpeed(vel); motorLeft.setSpeed(vel/2); motorRight.run(向后); motorLeft.run(向后); det =检查();休息; case 'S':// S,停止 motorRight.setSpeed(vel); motorLeft.setSpeed(vel); motorRight.run(RELEASE); motorLeft.run(RELEASE); det =检查();休息; case 'm':// 用于墙壁跟随机器人。 motorRight.setSpeed(vel); //设置电机的速度,在0-255之间 motorLeft.setSpeed (vel);持续时间长,距离远; // 开始扫描 digitalWrite(trigPin, LOW);延迟微秒(2); // 成功的传感器操作需要延迟。数字写入(触发引脚,高);延迟微秒(10); //这个延迟也是必需的!数字写入(trigPin,低);持续时间 =脉冲输入(echoPin,高); distance =(duration/2) / 29.1;// 将距离转换为厘米。 if (distance <30)/*需要与墙保持的距离*/ { Serial.println ("Wall is dected!" );Serial.println ("开始跟随墙");Serial.println("转!"); motorRight.setSpeed(vel); motorLeft.setSpeed(0); motorRight.run(FORWARD); motorLeft.run(RELEASE);延迟(500); // 等待一秒钟} else { Serial.println ("没有检测到墙。转身");延迟(15); motorRight.setSpeed(0); motorLeft.setSpeed(vel); motorRight.run(RELEASE); motorLeft.run(前进); } 休息; case 'b'://避障机器人 motorRight.setSpeed(vel); //设置电机的速度,在0-255之间 motorLeft.setSpeed (vel);久久,远方; // 开始扫描 digitalWrite(trigPin, LOW);延迟微秒(2); // 成功的传感器操作需要延迟。数字写入(触发引脚,高);延迟微秒(10); //这个延迟也是必需的!数字写入(trigPin,低); Aduration =pulseIn(echoPin, HIGH); Adistance =(Aduration/2) / 29.1;// 将距离转换为厘米。 if (Adistance <25)/*如果前方25厘米处有障碍物,请执行以下操作:*/ { Serial.println ("Close Obstacle detected!" );Serial.println ("Obstacle Details:");Serial.print ("Distance From Robot is " );Serial.print (Adistance);Serial.print("CM!");//打印出以厘米为单位的距离.Serial.println("由于距离较近,障碍物被宣布为威胁.");Serial.println("转!"); motorRight.setSpeed(vel); motorLeft.setSpeed(vel); motorLeft.run(向后); // 只要前方有障碍物就转弯。 motorRight.run (FORWARD);} else { Serial.println ("没有检测到障碍物。前进");延迟(15); motorRight.setSpeed(vel); motorLeft.setSpeed(vel); motorRight.run(FORWARD); //如果前方没有障碍物,前进! motorLeft.run(FORWARD); } 休息; }}//获取串口收到的蓝牙码int check(){ if (Serial.available()> 0){// 如果串口中有有效数据 dataIn =Serial.read();// 存入数据一个变量//检查代码 if (dataIn =='F'){//前向行列式 ='F'; } else if (dataIn =='B'){//后向行列式 ='B'; } else if (dataIn =='L'){//左行列式 ='L'; } else if (dataIn =='R'){//右行列式 ='R'; } else if (dataIn =='I'){//Froward Right 行列式 ='I'; } else if (dataIn =='J'){//向后右行列式 ='J'; } else if (dataIn =='G'){//前向左行列式 ='G'; } else if (dataIn =='H'){//向后左行列式 ='H'; } else if (dataIn =='S'){//停止行列式 ='S'; } else if (dataIn =='0'){//速度 0 vel =0; } else if (dataIn =='1'){//Speed 25 vel =25; } else if (dataIn =='2'){//Speed 50 vel =50; } else if (dataIn =='3'){//Speed 75 vel =75; } else if (dataIn =='4'){//Speed 100 vel =100; } else if (dataIn =='5'){//Speed 125 vel =125; } else if (dataIn =='6'){//Speed 150 vel =150; } else if (dataIn =='7'){//Speed 175 vel =175; } else if (dataIn =='8'){//Speed 200 vel =200; } else if (dataIn =='9'){//Speed 225 vel =225; } else if (dataIn =='b'){//Extra On determinant ='b'; } else if (dataIn =='m'){//Extra On determinant ='m'; } } 返回行列式;}
避障草图Arduino
/*作者:Muhammed Azharvisit - robotechmaker.com*/#include#define trigPin 14 // 定义传感器的引脚#define echoPin 15 int vel =255; // 机器人速度//ObjectsAF_DCMotor motorRight(1, MOTOR12_64KHZ); // 创建电机 #1, 64KHz pwmAF_DCMotor motorLeft(3, MOTOR12_64KHZ); // 创建电机 #3, 64KHz pwmvoid setup() { Serial.begin(9600); // 设置串行库为 9600 bps pinMode(trigPin, OUTPUT);// 设置触发引脚为输出(发送声波) pinMode(echoPin, INPUT);// 设置回声引脚为输入(接收声波)/ /初始化消息 Serial.println(" Mr.robot"); Serial.println("上班啦!"); //关闭电机 motorRight.setSpeed(0); motorLeft.setSpeed(0); motorRight.run(RELEASE); motorLeft.run(RELEASE);}void loop() { //避障机器人 motorRight.setSpeed(vel); //设置电机的速度,在0-255之间 motorLeft.setSpeed (vel);持续时间长,距离远; // 开始扫描 digitalWrite(trigPin, LOW);延迟微秒(2); // 成功的传感器操作需要延迟。数字写入(触发引脚,高);延迟微秒(10); //这个延迟也是必需的!数字写入(trigPin,低);持续时间 =脉冲输入(echoPin,高); distance =(duration/2) / 29.1;// 将距离转换为厘米。 if (distance <25)/*如果前方25厘米处有障碍物,请执行以下操作:*/ { Serial.println ("Close Obstacle detected!" );Serial.println ("Obstacle Details:");Serial.print ("距离机器人是");Serial.print(距离);Serial.print("CM!");//以厘米为单位打印距离.Serial.println("由于距离较近,障碍物被宣布为威胁.");Serial.println("转!"); motorRight.setSpeed(vel); motorLeft.setSpeed(vel); motorLeft.run(向后); // 只要前方有障碍物就转弯。 motorRight.run (FORWARD);} else { Serial.println ("没有检测到障碍物。前进");延迟(15); motorRight.setSpeed(vel); motorLeft.setSpeed(vel); motorRight.run(FORWARD); //如果前方没有障碍物,前进! motorLeft.run(FORWARD); } }
Wall Follower SketchArduino
/*作者:Muhammed Azharvisit - robotechmaker.com*/#include#define trigPin 14 // 定义传感器的引脚#define echoPin 15 int vel =255; // 机器人速度 //ObjectsAF_DCMotor motorRight(1, MOTOR12_64KHZ); // 创建电机 #1, 64KHz pwmAF_DCMotor motorLeft(3, MOTOR12_64KHZ); // 创建电机 #3, 64KHz pwmvoid setup(){ Serial.begin(9600); // 设置串行库为 9600 bps pinMode(trigPin, OUTPUT);// 设置触发引脚为输出(发送声波) pinMode(echoPin, INPUT);// 设置回声引脚为输入(接收声波)/ /初始化消息 Serial.println(" Mr.robot"); Serial.println("上班啦!"); //关闭电机 motorRight.setSpeed(0); motorLeft.setSpeed(0); motorRight.run(RELEASE); motorLeft.run(RELEASE);}void loop(){ // 用于墙壁跟随机器人。 motorRight.setSpeed(vel); //设置电机的速度,在0-255之间 motorLeft.setSpeed(vel);持续时间长,距离远; // 开始扫描 digitalWrite(trigPin, LOW);延迟微秒(2); // 成功的传感器操作需要延迟。数字写入(触发引脚,高);延迟微秒(10); //这个延迟也是必需的!数字写入(trigPin,低);持续时间 =脉冲输入(echoPin,高); distance =(duration / 2) / 29.1;// 将距离转换为厘米。 if (distance <30)/*需要与墙保持的距离*/ { Serial.println("Wall is ditected!"); Serial.println("开始爬墙"); Serial.println("转!"); motorRight.setSpeed(vel); motorLeft.setSpeed(0); motorRight.run(FORWARD); motorLeft.run(RELEASE);延迟(500); // 等待一秒钟 } else { Serial.println("未检测到墙。转身");延迟(15); motorRight.setSpeed(0); motorLeft.setSpeed(vel); motorRight.run(RELEASE); motorLeft.run(FORWARD); }}
示意图
制造工艺