|
你好,
我的目标是建立一个蓝牙控制的机器人,让一个朋友在吉他/低音放大器前移动麦克风。这个机器人被音响工程师用来完美地将麦克风放在扬声器前面的正确位置,以测试声音,最终获得最佳音质。
我知道我还需要设计和编写一个带有迷人用户界面的应用程序,用于任何Android智能手机移动机器人。
该项目分为4个主要部分:
-电子硬件
-力学元素
-固件编程
-应用程序开发
这是一个非常多功能的项目,因为它可以自动和远程移动其他东西,如一个微型投影仪,一盏灯或相机放在一个房间的天花板上。
我为这些照片道歉,因为我非常热衷于制造机器人,所以没有拍到令人满意的照片。
请写信给我,以便进一步解释和评论。
玩得高兴!!
披露:我很喜欢做这个项目,它对我很好,但我不负责任何损害,可能发生在你身上。用电工作的人可能会受伤。这个项目的所有硬件都在非常低的电压(12伏)下工作,所以这是不可能发生的,但在电子元件中总是会过热和燃烧。此外,在建造这样一个机械移动机器人时,非常重要的是要非常小心,因为你的手可能会被困在移动部件中,最终可能会受伤。我推荐这个项目的人知道电子,机械和电气工程至少在中级水平。
教程笔记:
第一步:电子“配料”
硬件:
-1 Arduino Uno(最好是原版)
-1个HC-06蓝牙模块
-1个数控屏蔽
-3个电流为1A的A4988驱动器(或电流为2A的DRV8825)
-3 NEMA 17步进电机(具有良好的扭矩),例如本电机或本电机
-2个微动开关
-1个12V 60W的电源驱动程序例如
-1个EU连接器(示例)
-附加4极电缆
步骤2:机械零件
该项目的大多数机械元件都可以很容易地在网上找到。然而,电机的塑料支架是由我的一个朋友用3d打印机投影和制造的,另一个朋友用他的cnc铣削了中央电机(z轴)的铝支架。
您可以看到最终装配(在步骤4中),使用您喜爱的三维设计cam软件在链接处制作这些零件,并将文件发送到本地fablab。你可以在这里找到你当地的工厂实验室。它们将帮助您制作3D打印和数控铣削零件。
机械材料:
-2件60cm铝挤压35mmx35mm直线导轨(可在线查找)
-8个方位(确保与图片中的方位相同。适用于铝制直线导轨)
-1个3D打印机皮带
-2个滑轮(见图)
-2个用于电机的3D打印机械支架,这些零件用螺钉固定在铝导轨上
-用于中央电机(Z轴)的数控铣削铝支架。设计它,让你当地的工厂来做!
-任何电缆链或柔性电缆管,你可以在图片中找到两个例子
-安装五金件的电箱
步骤3:电子组装
现在我们只需要把硬件连接起来。
1)将防护罩放在Arduino顶部
2)将HC-06蓝牙模块连接到防护罩顶部的插脚上。
小心!看图片2,你可以看到:
HC-06的TX将转到Arduino的RX
HC-06的RX将传送到Arduino的TX
3)连接微动开关或限位开关。从下面的代码中可以看出,微动开关的常开触点必须连接在插脚9和GND之间,以限制X轴;插脚10和GND之间,以限制Y轴。您不需要外部上拉或下推电阻器,因为我们将使用内置Arduino的内部上拉电阻器。关于这个主题的更多信息可以在这里找到。
pinmode(9,input_pullup);
pinmode(10,输入_pullup);
4)将步进电机连接到屏蔽上,但要注意,因为您可以看到步进电机表示为两个感应器,请按照屏蔽销的顺序将感应器的右极连接到右销。如果你搞砸了,不会发生什么严重的事情,但如果你搞砸了,要么马达不动,要么会发出嘎嘎声和震动!
对于我使用过的电机,电缆颜色如下:
A+黑色
A-绿色
B+红色
B-蓝色
我已经附上步进电机数据表,在那里你会发现所有的技术信息,因为你可以看到这些步进电机接受高达2A的电流每相。即使标称电压是2.2V,也不存在像我们这样以12V的电压驱动它们的问题。
小心!如果电机过热,减小电流或插入降压以降低电压!
这个设置允许你使用电机的全部功率,你可以看到这些步进电机有一个很好的扭矩曲线。即使转速(每分钟转数)增加,也会保持30ncm的扭矩。30ncm意味着在距离中心1cm处,它们可以旋转约3kg的重量。这么小的马达真让人印象深刻!
5)驱动器顶部有一个小螺钉,用于限制流向电机的电流量。如果你使用的是A4988(红色的),你可以保持电流的大小不变,通常是1A。或者在上面使用一个更大的散热器,把它也增加到1.5A。
如果您使用DRV8825(紫色的),您可以在2A驱动电机。要测量电流,您需要一个串联的数字万用表或台式电源。
有时如果可能发生马达发出一点烦人的嗡嗡声,你必须调节电流直到嗡嗡声消失,这是由寄生频率引起的。
6)如果您愿意,可以将电源的EU接头放在盒子的预先制作的孔中,并进行一些焊接,以达到Arduino的车辆识别号针脚。12V线也意味着要连接到屏蔽上的蓝色连接器,这是主线,它将给步进电机供电,并最终移动您的轴。
小心!如果你颠倒了电机屏蔽上的正负极,你会烧掉它,使其无法使用。务必用万用表测量从电源到EU接头,再到屏蔽电源接头的导线极性。
7)把所有的电子设备放在盒子里,确保你在盒子里钻孔,以便电缆能出来。我放了一些漂亮的银PG7出来的盒子。
恭喜你搞定了这个乱七八糟的家伙!!
stepper motor datasheet.pdf
(140.25 KB, 下载次数: 8)
Torque_Curve.pdf
(133.26 KB, 下载次数: 6)
步骤4:机械装配
你可以自由地用你自己的创造力去尝试,把轴承和支撑部件连接起来,这两个轴由铝型材制成。
同时激发你的创造力,设计支持步进电机。NEMA17是一个标准,看看数据表中的电机机械规格,确保你设计了一个很好的支架,并用正确的螺栓将其固定在上面。
您可以设计支架并将其三维打印,例如第一张图片,也可以用铝制作支架。你需要有人的帮助,有一个数控铣床这样做。
你将需要相当精确和明智地使用你的卡尺来设计这些零件。
小提示:当你设计两个连接在一起的部件时,我建议你在两个部件之间留有0.2毫米或0.1毫米的公差。
从图片中获取主要想法,并使用您最喜欢的cam软件进行自己的设计,一旦您将三维模型通过电子邮件发送到您当地的fablab,他们将非常乐意使其成为现实。
你可以在这里找到你当地的工厂实验室。
步骤5:使用app inventor开发应用程序
我用一个叫做app inventor的伟大的在线生成器设计了这个应用程序。
你可以在这个链接上找到这个应用程序。(你可以用你的谷歌账号登录)
或者您可以在下面下载.aia文件并将其导入到app inventor中。
我会解释一下这个应用程序:
1)重要的初始位是通过蓝牙将应用程序连接到机器人。
有一个带有蓝牙标志的列表选择器。当用户单击它时,将显示可用的蓝牙列表,用户可以从HC-06连接到蓝牙客户端,该客户端实际上是蓝牙网络。
显示一条消息,说明连接已发生,并显示以下消息,告诉用户打开电机以向系统供电。
2)我想评论的另一点是命令。
-应用程序将通过蓝牙向Arduino发送不同的单个字符。
-我使用了简单的大写字母:例如,字母“d”是将x轴向后移动的命令。同时,此命令还会将应用程序上的小麦克风图标(ImageSprite1)向后移动4像素。
-一些命令是:
A→Y轴前进,麦克风图标4像素前进
O→家
“G”→将当前X和Y位置保存在插槽1中
“H”→从插槽1 X和Y位置加载,并将电机和麦克风图标移到那里
3)用户可以在250px x 250px画布上拖动小麦克风图标,无需使用箭头即可移动电机。这是一个有趣的特性,它是由一个名为imagesprite1.dragged的长逻辑块完成的。
-它获取在画布上拖动图像的像素位置。
-当250 px的最大值对应于72°电机的62次运动以到达铝直线导轨的末端时,进行线性比例。这个比例允许Arduino知道马达必须向前/向后旋转到图标被拖动的相应位置的次数。
-例如,如果系统最初处于起始位置,则图标位于x=0px和y=0px
-用户拖动X=70px和Y=100px位置的图标
-比例后,电机运动为x1=17和y1=24
-一个类似“.17,24*;”的命令字符串被发送到hc-06
-Arduino固件随后将解析此字符串并相应地移动电机。这意味着X轴电机将向前旋转17倍72°,Y轴电机将向前旋转24倍72°。
小心!为了避免在拖动图像时反弹,并确保在用户实际释放拖动图标时执行正确的命令,我还必须插入块imagesprite1.touchup
-在此块中,发送一个简单的“u”字符,以确保当Arduino找到“u”字符时,它将执行上一个最终命令字符串,但忽略上一个跳转的字符串:
例如:“.12,19*;.14,22*;.17,24*;u”要执行的正确命令是“u”之前的命令,也就是说“.17,24*”,在有两个弹跳接触之前。我必须把这个插进去,以避免弹跳的接触,这是混乱的一切。
我希望通过这个解释,你能更清楚地看到应用程序中的逻辑块。不过,你想学多久就学多久。你在下面找到.aia文件。或者只是安装它并下载.apk文件。
Mic Roller.rar
(4.98 MB, 下载次数: 7)
GraphicBluetoothstepmotor_copy.rar
(1.89 MB, 下载次数: 8)
步骤6:Arduino固件
下面是所有C编程爱好者的部分。请随意下载Arduino代码,您可能会注意到某些部分可能会被修改和简化,但它仍然工作得很好。
此代码中使用的最重要的库是laurb9的步进驱动程序库,您可以在github上的以下链接中找到它
https://github.com/laurb9/steperdriver网站
我们最初使用这个库定义步进电机,然后旋转它们。
另一个重要的库是Arduino Uno的EEPROM库,用于保存X、Y和Z轴的位置。
我已经尽力尽可能多地引用代码,给出每一位的所有可能的解释。不过,下面我也将进一步评论一些内容。
1)在void setup()部分中,代码只执行一次。在Arduino代码的以下部分中,检查是否存在串行通信,直到用户发送ON命令,才发生任何事情。用户按下后,等待的下一个命令是:
O→主命令
“Z”→“关闭”命令
do //this cycle waits until someone click the ON button on the app{ if(Serial.available()>0) { state=Serial.read(); Serial.println(readString); //prints string to serial port out } }while(state!='V'); //system ON commanddigitalWrite(8, LOW); do //this cycle waits that the user push either Home Button or OFF button { if(Serial.available()>0) { state=Serial.read(); Serial.println(readString); //prints string to serial port out } } while((state!='O')&&(state!='Z'));
2)-你还记得在应用程序中我们曾经发送命令'd'来向后发送马达吗?-你还记得我们把Y限位开关连接到插脚10和GND?最初,我们检查Y电机是否能够实际后退:如果按下引脚10上的限位开关,Arduino将读取GND,即使在应用程序上按下后退按钮,也不会发生任何事情。如果不按下限位开关,我们只需用简单的步进指令将电机旋转72°。旋转(72)并减小1的y变量。if(limitYstate==HIGH) { if(c == 'B') //Y motor backward { stepperY.rotate(72); //the value is not negative because I mounted the motors upside-down in my assembly, sorry delay(5); Y--; Serial.println("Y value, "); Serial.println(Y); Serial.println("Y motor backward"); readString=""; } }3)这是一个难点,基本上我们在这里捕获用户拖动应用程序上的麦克风图标时发送的字符串,然后我们解析这些数据。例如,也就是说,我们将子字符串转换为整数:x=“17”变成xm=17y=“24”变为ym=24在这个过程中,我们将每个字符串加载到缓冲区数组中,最后使用atoi()命令获取整数值。你还记得拖动麦克风徽标时应用程序中的弹跳问题吗?好吧,电机不会移动,直到在序列上读到字符“u”,然后电机才会根据最后的xm和ym值旋转。
if (c == ';') // character ; means that the user has dragged the microphone icon on the app { Serial.println(); Serial.print("captured String is : "); //we have captured the string with the X Y Z values, now we need to parse it and elaborate it, the following commands are for parsing Serial.println(readString); //prints string to serial port out, used for debugging ind1 = readString.indexOf('.'); //finds location of . ind2 = readString.indexOf(','); //finds location of , XString = readString.substring(ind1+1, ind2); //captures the string between charactes . and , ind3 = readString.indexOf('*'); //find location of * which delimits the end string YString = readString.substring(ind2+1, ind3); //captures the string between charactes , and * char buf1[XString.length()+1]; //create a characters array long as substring X XString.toCharArray(buf1, XString.length()+1); //load string X in the array buf1 char buf2[YString.length()+1]; //create a characters array long as substring Y YString.toCharArray(buf2, YString.length()+1); //load the string Y in array buf2 Xm = atoi(buf1); //convert the string in arra buf 1, which is a character with the value of X in an integer Ym = atoi(buf2); //convert the string in arra buf 2, which is a character with the value of Y in an integer readString=""; //clears variables for new input XString=""; YString=""; Serial.print("X = "); //we print everything on the serial monitor for debugging Serial.println(X); Serial.print("Y = "); Serial.println(Y); Serial.print("Xm = "); Serial.println(Xm); Serial.print("Ym = "); Serial.println(Ym); } if (c == 'U') //move the motors in the position of the X Y values read from the app movement { Serial.print("X = "); Serial.println(X); Serial.print("Y = "); Serial.println(Y); Serial.print("final Xm = "); Serial.println(Xm); Serial.print("final Ym = "); Serial.println(Ym); stepperX.rotate(-72*(Xm-X)); delay(5); stepperY.rotate(-72*(Ym-Y)); delay(5); X=Xm; Y=Ym; readString=""; }
finale4.rar
(3.12 KB, 下载次数: 5)
步骤7:结束
祝贺你!如果你到了这里,你可以好好拍一下自己的肩膀。如果你是一个音响工程师或音乐家,你可能也节省了一点钱,因为蓝牙控制的麦克风放置机器人可能是相当昂贵的。我希望这个项目能激励你做许多类似的其他或升级这个。谢谢你的支持! |
-
2.jpg
(21 KB, 下载次数: 125)
-
3.jpg
(22.36 KB, 下载次数: 136)
评分
-
查看全部评分
|