人头到机器人头
组件和用品
| × | 1 | ||||
| × | 3 | ||||
| × | 1 | ||||
| × | 1 |
必要的工具和机器
|
应用和在线服务
|
关于这个项目
计划做一些新的但不那么昂贵的事情。我非常喜欢机器人学。但是由于伺服器和其他零件的要求,我不喜欢制作它。现在我有 4 个伺服电机,只需 13 美元。我已经将它链接到一块板和 Arduino 板。
所以计划做一个像我们的头一样在所有轴上移动但便宜的机器人头。 研究了不同的传感器和方法,但最终找到了一种方法,所有物品都在我手中。我在这个项目中学习了很多东西。来吧,我解释一下我的研究。 我用粗体表示我学到的东西。
使用智能移动倾斜传感器控制头部
第 1 步:所需材料 图> 图> 图> 图> 图> 图>
我使用的材料
1) Arduino uno。
2) Linkit 一板。
3)3个伺服电机。
4) SensoDuino 免费安卓应用程序从这里下载。
5) 稳压电源板(12V,5V,3.3V).
6) 普通PCB。
7) PCB公连接器
8) 废铝进料切块。
9) 热胶枪。
10) 12V 和 5V 适配器。
11) 还有一些装饰品。
为什么 Linkit one board 和 Arduino uno
如果你有 Linkit 一块板和 3V 伺服电机,那么就不需要 Arduino UNO,因为我的 5V 伺服在 Linkit 一个板。
如果你有 Arduino uno 和蓝牙模块,那么就不需要 Linkit 一个板。
我没有蓝牙屏蔽,所以我使用 Linkit one board 和 Arduino uno。
第二步:自带伺服盾 图> 图>
1)为Arduino制作一个伺服电机屏蔽。(如果你甚至使用3v舵机,请小心Linkit只有2个PWM引脚)
2)我为伺服电机制作了一个类似PCB的屏蔽。
3) 使用此板,我们可以控制 arduino pind (3,5,6,9,10,11) 的 6 个伺服电机。
4) 这里使用了 3 线舵机。其中电源由外部5 V稳压电源板提供。
5) 虽然控制伺服使用 Arduino 板的适配器电源。因为PC USB供电会引起震动。这会导致伺服电机过热并损坏 伺服电机 。 (我的伺服损坏之一)
第 3 步:建立 Linkit 一个连接
1) Linkit one 想和arduino对话来控制舵机。
2) 为此,将 Linkit one 板的 Tx 连接到 Arduino 板的 Rx 和 Gnd。
3) 当收到数据时,它会发送到 Arduino。
注意:-
如果您有 Arduino 蓝牙扩展板,那么您可以使用一块板来控制整个设置。
第 4 步:伺服位置 图>
1) 将所有伺服电机设置为 90 度。为此,将上述程序上传到 arduino..
2)将Servo电源和arduino电源连接到稳压电源板上的5V和12V引脚。
3) 如果我们在 Arduino 数字引脚 3,5,6 中制作的 PCB,请将伺服母连接器连接到公连接器。
3) 将12V适配器连接到稳压电源板上。
4) 打开适配器。
5) 现在所有的电机都按照程序旋转 90 度。
现在断开电机连接在一起,而不会干扰转子。
位置 Arduino IDE 代码为 Servoposition.ino
第 5 步:计划 图> 图>
1) 头部沿 x、y、z 3 轴旋转。
2) 旋转是
a) 偏航 - 左右看。
b) Pitch - 上下看
c) 侧向摇晃。
3) 首先使用双面胶带规划舵机。
4) 将铝隔板切割成L形,将顶部伺服固定到第二个。
5) 按照您的计划或如图所示连接伺服电机喇叭
6) 所有舵机中心在90度时必须是直的。
7) 用双面胶带粘住所有舵机和铝制L片,并检查运动不能干扰其他舵机。
第 6 步:构建 图> 图> 图> 图>
1) 现在是永久修复它的时候了。
2) 将双面贴纸一张一张撕下来,用热胶枪永久固定。
3) 注意不要损坏舵机。
4)再次将伺服连接器连接到arduino板并打开电源
5) 像最后一张图片一样,全部站直。
第 7 步:Android 应用详情 图> 图> 图> 图> 图>
1) 在你的安卓手机中打开 SensoDuino。它具有查看所有移动传感器读数的选项,并能够通过蓝牙发送。
2) 列出了所有最新的传感器,我们只能选择手机中可用的传感器。
3) 进入菜单并选择连接蓝牙。
4) 列表显示可用的蓝牙设备。
5) 选择Linkit一蓝牙。
6)对于我们的项目,我们使用方向传感器。勾选第一个框打开,第二个框通过蓝牙发送数据。
7) 我们还通过在菜单中选择性能选项来设置每个传感器的性能。更改每次读数的时间间隔。
第 8 步:编码
1) 这里有两种编码,一种是 Linkit 一种。
使用蓝牙从手机获取数据并使用串口将其发送到Arduino
2) Arduino程序
当串行端口接收到数据时,它将字符连接为字符串。并使用 indexof 和 substring 划分一个完整的结果集。在该集合中再次使用 indexof 和 substring 来获取每个位置。从使用 arduino 中的地图来控制从 0 到 180 度的伺服。如果您使用蓝牙屏蔽,则根据需要更改程序。
程序如何运作
1)使用方向传感器,机器人像我们一样转头。
a) 偏航是根据磁性位置从 0 到 360 度的旋转。为此,我们使用 90 到 270 度,其中 180 是伺服的 90 度。所以戴帽子的时候要像绳子一样面对180度。
b) 间距是正面上下。它的传感器读数是-180到+180。我们使用-90到+90。
c)Roll 侧向摇晃是 0 到 90 到 0 到 -90 到 0。我们使用 -90 到 90。
Linkitonehead.ino 中给出了 Linkit 一个代码
Arduino 代码在 Arduinohead.ino 中提供
第 9 步:订购电路板
图> 图>1) 将两个屏蔽板连接到两个微控制器的顶部。
2) 用双面贴纸一一粘贴。
3) 小心不要射击任何终端。
第 10 步:用手追踪
现在打开所有电源并使用手头的手机。 180度偏航坐姿,用手机控制三个伺服电机。
第 11 步:修复人脸 图>
1) 圣诞节的时候在店里发现了很多圣诞老人娃娃。
2) 买一个娃娃,用双侧敲击将头部固定在顶部伺服臂上。
第 12 步:准备一个控制帽 图> 图> 图> 图> 图>
1) 带一顶普通的帽子。
2) 如图所示在瓶盖正面粘贴双面贴纸。
3) 将手机贴在双面胶上。
第 13 步:测试视频
测试低性能 表示每 250 毫秒的传感器刷新率。
第 14 步:最终视频
以每 100 毫秒一个读数的传感器读数速率查看动作
代码
- Servoposition.ino
- Linkitonehead.ino
- Arduinohead.ino
Servoposition.inoArduino
#includeServo leftright;Servo updown;Servoshake;void setup() { Serial.begin(9600); leftright.attach(3); updown.attach(5);摇一摇。附加(6); leftright.write(90); updown.write(90);摇。写(90); }void loop() {}
Linkitonehead.inoArduino
#include#include int readval;String inputString ="";String outputString ="";int firstpoint=0;int secondpoint=0;void setup() { if(! LBTServer.begin((uint8_t*)"Sivam_LIO")) { return; }// Serial.begin(9600); Serial1.begin(9600); }void loop() { uint8_t buf[64]; int 字节读取; if(LBTServer.connected()) { while(true) { bytesRead =LBTServer.readBytes(buf, 32); if(!bytesRead) 中断;输入字符串=""; for(int j=0;j<32;j++) { char inChar =char(buf[j]); // 将它添加到 inputString:inputString +=inChar; }// Serial.println(inputString); Serial1.println(inputString);// firstpoint=inputString.indexOf('>');// Serial.println(inputString);// Serial.println(firstpoint);// if (firstpoint>0)// {/ / secondpoint=inputString.indexOf('>',firstpoint+1);// if (secondpoint>0)// {// outputString=inputString.substring(firstpoint,secondpoint);// inputString=inputString.substring(secondpoint);// Serial.println(outputString);// }// } } delay(100); } else { LBTServer.accept(5); }}
Arduinohead.inoArduino
#includeServo leftright;Servo updown;Servoshake;String inputString ="";boolean stringComplete =false;String teststr2;String sensorid;String sensorrecid;String sensorval1;String sensorval2;String sensorval3;int S1;int S2;int S3;int startchr=0;int endchr=0;int rot1;int rot2;int rot3;void setup() { Serial.begin(9600);// inputString.reserve(200); leftright.attach(3); updown.attach(5);摇.attach(6);}void loop() {}void serialEvent() { while (Serial.available()) { char inChar =(char)Serial.read(); if (inChar !='\n') { inputString +=inChar; } } startchr =inputString.indexOf('>'); if (startchr>=0) { endchr =inputString.indexOf('>',startchr+1); if (endchr>0) { teststr2=inputString.substring(startchr,endchr); inputString=inputString.substring(endchr); startchr =teststr2.indexOf(','); sensorid =teststr2.substring(1,startchr); endchr =teststr2.indexOf(',',startchr+1); sensorrecid=teststr2.substring(startchr+1,endchr); startchr=endchr; endchr =teststr2.indexOf(',',startchr+1); sensorval1=teststr2.substring(startchr+1,endchr); startchr=endchr; endchr =teststr2.indexOf(',',startchr+1); sensorval2=teststr2.substring(startchr+1,endchr); startchr=endchr; sensorval3=teststr2.substring(startchr+1); S1=sensorval1.toInt(); S2=sensorval2.toInt(); S3=sensorval3.toInt(); rot1=map(S1, 90, 270, 180, 0);如果 (rot1<0) rot1=0;否则如果 (rot1>180) rot1=180; rot2=map(S2, -90, 90, 0, 180);如果 (rot2<0) rot2=0;否则如果 (rot2>180) rot2=180; rot3=map(S3, 90, -90, 0, 180);如果 (rot3<0) rot3=0;否则如果 (rot3>180) rot3=180;如果 (rot1!=0 &rot1!=180) { leftright.write(rot1); } if (rot1!=0 &rot1!=180) { updown.write(rot2); } if (rot1!=0 &rot1!=180) {shake.write(rot3); } 延迟(15); // Serial.print("Sensor-");// Serial.println(sensorid);// Serial.print("Sensor Val1-");// Serial.println(rot1);// Serial.print("传感器 Val2-");// Serial.println(rot2); // Serial.print("Sensor Val3-");// Serial.println(rot3); } } }
制造工艺