亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

KITtyBot

组件和用品

SparkFun Arduino Pro Mini 328 - 5V/16MHz
× 1
舵机(Tower Pro MG996R)
SG-90 或 9 g 舵机,外形相同
× 12
Adafruit UBEC DC/DC 降压(降压)转换器 - 5V@3A输出
× 1
Adafruit 迷你遥控器
当然你可以使用任何遥控器。这恰好与 IRLib 库配合得很好
× 1
Adafruit IR(红外)接收器传感器 - TSOP38238
× 1
电阻 1k ohm
× 1
电阻 2.2k ohm
× 1
7.4 V / 500 mAh 锂电池
一个容量大约为 R/C 爱好的电池就可以了
× 1

必要的工具和机器

3D 打印机(通用)
烙铁(通用)
面包板设计可能无需焊接

应用和在线服务

Arduino IDE

关于这个项目

简介

我想做一个行走的四足机器人,比普通的“蜘蛛”或“昆虫”更像是“哺乳动物”的风格。灵感来自著名的波士顿动力机器人和其他四足研究机器人。制作这样的机器人非常具有挑战性,因为它很容易由于高重心和身体下方的脚而倾倒,而不是分散到角落。

目的是使用 Arduino 和低成本的微型伺服系统构建一个廉价的机器人。这个解决方案当然有它的局限性。不能指望它是完美的,但我现在已经设法建造了一些机器人,可以执行这部电影中描述的步行行为。以极少的预算做最好的事情本身就是一个挑战,也许是资金雄厚的研究项目的人永远不必面对的事情。 :)

很早就发现需要对倒置运动学 (IK) 进行研究才能使其正确。该代码具有一组方程式,可根据所需的足部运动计算关节角度。这些可以进一步用于一些重复性任务的功能,例如进行身体运动(四足向相反方向移动)和完整的足部运动(向指定方向向上移动并再次放下)。

下一个挑战是进行步态研究,即根据身体和足部运动定义机器人应该如何行走和转身。我的机器人一直使用静态稳定的步态。此时一只脚被抬起并放在一个新的位置。身体靠在其他三只脚上,为了不使重心翻倒,必须保持在这些脚形成的三脚架内。我开发了四种标准步态——向前、向后、向左和向右。这反过来又利用足部和身体运动功能组合成一个完整的序列。

我还设计了一个同步伺服运动的功能。在某些情况下,几个伺服器在设定的时间内进行不同的行程。这必须同步才能实现平稳移动。

最后但并非最不重要的是,我使用完全不受保护的 LiPo 电池。这可能有风险,主要的危害是放电过快或放电过深。只要不是意外短路,第一个危险就可以避免。普通 R/C 电池的放电率为 25 C,在这种情况下允许 12 A。UBEC 将防止它在任何情况下高于 2 A。软件中的监视功能可以防止第二种危险。在模拟引脚之一上测量电压,如果低于 7.0 V,机器人将停止工作。

最后,我必须强调,电池应使用专用充电器充电并照常处理,切勿在无人看管的情况下充电。电池应与机器人分离(使用尼龙搭扣安装)并在防火袋内充电,或至少与易燃材料保持安全距离,以便控制火势而不会蔓延。还要安全地存放电池。

如果您不熟悉 LiPo 电池,请咨询当地的 R/C 业余爱好商店,购买电池以及合适的充电器和防火袋/容器以进行充电和存放。这些项目通常充满警告标志。重新定义它们并使用您自己的良好判断力。 :)

建造机器人

根据提供的文件打印零件。在开始之前花一些时间查看图片并弄清楚如何组装零件。我是斯堪的纳维亚人,但这条指令远非宜家或乐高指令的水平:)

首先应组装髋关节。我使用质量好的双面胶带连接零件。它们也可以粘合,但如果需要修理损坏的部件,它们无法拆卸,一个损坏的伺服器会导致更换整个接头。

将舵机支架放在一个舵机的底部,与驱动轴对齐。然后加入另一个伺服,其轴垂直。下图显示了右前和左后的髋关节。对于另外两个角,应制作镜像接头。

在继续之前,最好确保所有 12 个舵机都居中。最好的方法是组装 PCB(或面包板,见下文),连接所有伺服器并加载代码。当 Arduino 启动时,所有伺服系统都将居中(命令信号 90 度)。机器人组装好之后,需要对中心位置进行微调。

下一步是连接称为大腿的部分,即腿部组件的“上肢”。该部件具有与通常与伺服器一起交付的伺服喇叭配合在一起的凹槽。将角粘在凹槽中。确保使用适用于连接 3D 打印材料和制成喇叭的尼龙塑料的胶水。我用的胶枪工作得很好,虽然我用 CA 胶取得了一些成功(有些品牌有效,其他品牌无效)。

大腿与髋关节呈 60 度角连接。当舵机居中时,尝试找到一个尽可能接近这个角度的位置。使用随附的螺钉(通常是随伺服提供的三个螺钉中较短的一个)将喇叭固定到伺服花键上。下面是两张组装好的大腿和臀部的图片,为了清晰起见,不包括伺服喇叭(或者我从来没有因为懒惰而建模)。

腿的下部也应该组装。在这种情况下,使用螺钉将伺服器连接到腿部。随伺服器提供螺钉(通常是两个较长的“木”螺钉)。

现在可以将腿组装到身体上。我称之为“保险杠”的两个部分分别位于机器人的前部和后部(就像汽车上的保险杠)。它们有用于伺服喇叭的凹槽,就像大腿部分一样。把角粘在它们上面。然后将大腿的舵机支架滑入身体相应的孔中。在两侧完成此操作后,可以通过保险杠固定组件。让腿指向大约 12 度(腿的脚趾向外 20 毫米)。保险杠通过使用剩余的(较长的)伺服螺丝固定在车身上。

最后可以连接机器人的小腿。它们应该在大腿的相反方向成角度,使脚尖正好位于每个腿组件的髋关节下方。

这样就组装了机器人。它应该如下图所示。请注意,与顶部图像和影片剪辑相比,机器人的设计略有变化。机身经过重新设计,以简化并实现更坚固的设计。髋关节的伺服支架和喇叭已经交换了位置。所以要根据3D图像进行组合,避免被照片和影片剪辑所迷惑。

当然,每个关节的角度不可能完全达到要求的角度,SG-90舵机上的样条数为21,导致两个位置之间的角度为17度。您最多可以在 10-20 度内组装机器人,剩余的误差必须通过更改代码中的中立位置来调整,请参阅本说明的进一步内容。再次连接所有伺服系统并启动 Arduino 并检查中立位置可能是一个好主意,如果需要,进行一些机械调整(移动一个或两个样条的关节)。人们在使用时往往会不小心转动舵机。

连接电子设备

有两种选择,将所有内容都放在一个面包板上,或者使用提供的 Fritzing 文件制作 PCB。如果在将所有电源线和地线连接到伺服系统时不小心,您可能会遇到面包板中的电压问题。在极端情况下,一个伺服器会消耗 600 mA,连接不良会导致行为不稳定。 PCB 的电源线有很宽的铜迹线,所以如果你正确焊接它会正常工作。

我的设计中没有电源开关。机器人只需连接电池即可开启和关闭。如果你想添加一个它应该在电池连接器之后,切断 Arduino 和 UBEC 的 7.4 V 电源。

面包板版本

可以在一个半尺寸面包板上安装 Pro Mini、舵机连接器和大多数其他电子设备。我在下图中绘制了原理图。确保使用短跨接导线,尤其是与舵机的 5 V 电源和接地连接。伺服连接器只是超长的公头,被切成三块并压入面包板。

图中未显示的是电池和UBEC。可能需要进行一些焊接来解决这个问题,以便将连接器配件连接到电池上。从连接器两根跳线应连接到面包板的下部“电源轨”,以便为 Pro Mini 供电(连接到 RAW 和 GND)。还将两个电阻从 7.4 V 电源连接到 A0 引脚。 2.2k 来自正极,1k 来自地面。这会将电压分压到一个低于 5 V 的值,该电压在满电池时超过 8 V,可由模拟引脚测量。

UBEC 的输出端有一个伺服连接器。在上面的“电源轨”上加一个两个公头是很方便的。把它放在图中中间的某个位置,以确保舵机的功率分配尽可能平衡。

IR 接收器应连接到 A1 并具有 5V 电源。接收器上的引脚足够长,可以直接插入面包板上的孔中。

下面有一个示意图和一张关于成品面包板外观的图片。请注意,图片显示的是具有不同引脚和连接的旧版本机器人。它仍然给出了如何连接跳线和伺服连接器的想法。

面包板通过其自粘背面附着在机身上。定位它,使舵机连接到引脚 D3、D4 和 D5(示意图中的右上角)的角落位于机器人的前/左角上,并确保电路板位于身体的中心(正确的中心重力至关重要)。

PCB 版本

我在下面添加了一个 Fritzing 文件。这可用于生产 PCB,通过从 Fritzing 提供的服务订购或导出用于 PCB 制造的文件。我做了一系列图片来展示下面的组件。 PCB 是为该机器人定制的,带有连接到所有伺服系统、IR 和电压测量的连接器。但也有连接器从剩余的引脚上断开。如果您以后想扩展机器人,这些可以用来连接其他设备。

机身上有一些小“垫”,适合 PCB 的角落。同样在这里,带有 D3 到 D5 连接器的角落应该在前/左。 PCB 上有安装孔,但我只在机身上使用了一块双面胶带将其固定。它将留在原地。

电池

电池用尼龙搭扣固定在底部。机身上有专门用于此的平面。一块 7.4V/500mAh 的 LiPo 电池通常具有大约 55x30x10 毫米(或多或少几毫米)的外形尺寸,非常适合这个地方。

最后,机器人可以通过将伺服线捆扎成漂亮的束来“修饰”,这样它在行走时就不会被它们绊倒。它还使机器人看起来很漂亮,实际上是一个四足动物,四处走动,而不是一堆伺服电线。 :)

结束

在使用机器人之前,应微调中心位置。这是通过在代码中编辑数组servodeg0来完成的:

const floatservodeg0[12] ={90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90};  

这些值的顺序是 alfa、beta gamma 和前/左、后/左、前/右、后/右。所以右前方的beta是数组中的第八个位置或servodeg0[7](数组的编号从0开始)。

还有一个称为servodir 的数组,用于定义舵机的旋转方向。

const intservodir[12] ={ +1, +1, -1, -1, -1, +1, -1, -1, -1, +1, +1, +1}; // 转向(正为舵机逆时针方向) 

我使用的伺服系统以逆时针方向从 0 度移动到 180 度。我在某处读到过伺服系统在另一个方向上运行。在这种情况下,阵列伺服目录必须一直改变它们的符号。

启动 Arduino 并检查所有伺服系统的角度。采取措施,看看一切看起来笔直和对称。距离和角度应如下图所示。

每次测量都很难在精确的毫米范围内,在厘米范围内是合理的。查看需要进行哪些更改并将它们添加/减去阵列servodeg0 中的值。在一切正常之前,这肯定需要几次迭代。您将以看起来像这样的伺服度数组结束(来自我的一个机器人的实际代码段)。最重要的是,你最终应该拥有一个四脚着地并站直的机器人。

 const floatservodeg0[12] ={80, 95, 100, 100, 110, 90, 100, 115, 100, 80, 80, 100}; 

现在一切都结束了。享受!

可能只是路上的一些提示。

一段时间后,舵机可能需要重新校准。中心位置会随着时间漂移。只需不时检查所有内容是否对齐。

如果您已将所有内容都做对了,但仍有一个会翻倒的机器人,请检查重心。可以移动电池来平衡这一点,使用魔术贴是一件好事。

还有一次。小心对待您的 LiPo 电池。

进一步改进

通过在这里提交我的机器人,我还邀请人们改进设计,添加更多功能或进行稍微不同的布局(更大、更小、更酷的外观)。代码应该可以在布局或大小略有不同的机器人上重复使用。下面的草图显示了代码中的不同常量。如果制造了具有不同措施的机器人,则所有 IK 和运动功能都应该仍然有效。它还显示坐标已定义,x 指向正向。

当然,如果人们为机器人添加功能会很有趣。遥控器上有几个按钮可以提供功能(如果按下按钮,为什么不跳舞或进行其他一些动作)。

我个人尝试模拟输入。我还使用了“边走边转”的步态,以便能够在一定程度上引导机器人,或者在陀螺仪或罗盘的帮助下纠正路线偏差。我还添加了超声波传感器和自主行为(避开障碍物)。我目前的项目是将模拟控制与自主相结合,并通过智能手机控制一切。这迫使我学习了很多新东西(Blynk、ESP6822、设备之间的串行通信等),并希望我可以推出一个改进版的机器人(或者也许有更好的技能的人在这件事上击败了我):)

代码

  • KITtyBot2 的代码
KITtyBot2Arduino的代码
上传到 Arduino Mini
/* KITtyBot 2 的红外控制版本。它使用 Arduino Pro Mini 和我设计的 PCB 板(Fritzing 草图 Kittybotmini.fzz)它基于以前的机器人 KITtyBot 和 KITtyBot mini 使用控制机器人的红外遥控器它使用 NEC(Adafruit)遥控器和 IRLib2 库,请参阅 https://github.com/cyborg5/IRLib2。从存储库下载 IRLib2 库并按照说明进行安装。总体尺寸与原始 KITtyBot 相似,但 gamma 轴和 alfa 轴之间存在 12 毫米的位移(伺服系统安装在彼此的顶部)给予最稳定的行为。 Created by Staffan Ek 2017*/#include #include #include  // 首先包含解码库#include  // 只包含你使用的协议using#define MY_PROTOCOL NEC //定义IR控制(NEC)long Previous;IRrecv My_Receiver(A1);//接收引脚A0IRdecodeNEC My_Decoder;const int Servonum =12; //舵机数量Servo舵机[servonum]; // 创建舵机 objectconst floatservodeg0[12] ={90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90};// 从标称 90 度调整舵机的中性位置(需要校准来调整这些值)floatservodegnew[servonum]; // 以度为单位的所需伺服位置浮动伺服度[servonum]; // 旧的(或当前的)伺服位置// 将下面的值更新到 KITtyBot miniconst int servedir[12] ={ +1, +1, -1, -1, -1, +1, -1, -1, -1、+1、+1、+1}; // 转向(正为舵机逆时针方向)const float pi =3.1416;const float alfa0 =pi / 6; // alfa 的中立位置(30 度)const float beta0 =pi / 3; // beta (60 deg)const float jointlength =50 的中立位置; // 腿部长度(两者长度相同)const float width =120; // 宽度(y 方向双脚距离,加上 toeout0)const float leng =120; // 长度(x 方向双脚距离)const float distag =12; // alfa 和 gamma 轴之间的距离const float toeout0 =20; // 脚距伽玛舵机中心向外的距离(脚向外指的距离)const float leglength0 =2 * jointlength * cos(alfa0);const float gamma0 =asin(toeout0 / (leglength0 + distag)); // gamma 的中性位置(由于 toe out 20 mm 和 distag 12 mm)const float bodyradius =sqrt(pow((width / 2), 2) + pow((leng / 2), 2)); // 对角线长度(中心到脚角的距离)const float phi0 =atan(width / leng); // bodyradius 的角度与 x(向前指向)axisconst float height0 =sqrt(pow(leglength0 + distag, 2) - pow(toeout0, 2)); // 机器人的正常高度(如果有任何角度或距离改变,则必须更新)float leglength [4] ={sqrt(pow(height0, 2) + pow(toeout0, 2)), sqrt(pow(height0, 2) + pow(toeout0, 2)), sqrt(pow(height0, 2) + pow(toeout0, 2)), sqrt(pow(height0, 2) + pow(toeout0, 2)) };// 起始值leglengthunsigned long timestep =500; // 每个序列所用的时间(使用servomove()时)int steplength =40; //行走时x方向的步长(向前和向后爬行)float phi =20; // 转弯时的转角(以度为单位,不是弧度!)// 用于运动浮动的变量footpos[12]; // 脚的位置,顺序 LeftFrontxyz, LeftRearxyz, RightFrontxyz, RightRearxyzfloat stepturn[12] ={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // 转弯时的脚部运动// 脚部位置通过各自的起始位置进行校准const float jointangle0[12] ={alfa0, beta0, 0, alfa0, beta0, 0, alfa0, beta0, 0, alfa0, beta0, 0};浮动关节角[12]; //使用角度向量,顺序LeftFrontAlfaBetaGamma etcconst int voltagepin =A0; // 为电压测量分配的引脚低电压 =0; // 如果电压 goew <7.0 Vint mode =0,则停止机器人的变量; // 当前有序行走模式;前进,后退,左,右无效设置(){ Serial.begin(9600); Serial.println("KITtyBot mini"); //这些行只是为了检查配置。可以删除。 Serial.print("Gamma0:"); Serial.println(gamma0); Serial.print("Leglength0:"); Serial.println(leglength0); Serial.print("身体半径:"); Serial.println(bodyradius); Serial.print("Phi0:"); Serial.println(phi0); Serial.print("Height0:"); Serial.println(height0);伺服[0].attach(3);伺服[1].attach(4);伺服[2].attach(5);伺服[3].attach(6);伺服[4].attach(7);伺服[5].attach(8);伺服[6].attach(2);伺服[7].attach(A3);伺服[8].attach(12);伺服[9].attach(11);伺服[10].attach(10);伺服[11].attach(9); for (int i =0; i  2 * 关节长度)lresult =2 * 关节长度; // 如果leglength大于可能的值,以下某些函数变得不稳定 return lresult;}float legright(float dx, float dz, float gamma) { float lresult =sqrt(pow(leglength0 - (dz / cos(gamma0 - gamma)), 2) + pow(dx, 2));如果(lresult> 2 * 关节长度)lresult =2 * 关节长度; // 如果leglength 大于可能的值,以下某些函数变得不稳定 return lresult;}// Beta,“膝关节”float beta(float leg) { float bresult =2 * acos(leg / (2 * jointlength)); return bresult;}// 阿尔法,另一个臀部伺服浮动 alfafront(float dx, float beta, float leg) { float aresult =(beta / 2) - asin(dx / leg);返回结果;}float alfarear(float dx, float beta, float leg) { float 结果 =(beta / 2) + asin(dx / leg); return aresult;}// 根据转角 f(以度为单位)给出脚的位置。 Stepturn 用于制作脚位值void turnpos(float f) { stepturn[0] =bodyradius * cos(phi0 + (f * pi / 180)) - leng / 2; stepturn[1] =bodyradius * sin(phi0 + (f * pi / 180)) - 宽度 / 2; stepturn[3] =bodyradius * cos(pi - phi0 + (f * pi / 180)) + leng / 2; stepturn[4] =bodyradius * sin(pi - phi0 + (f * pi / 180)) - 宽度 / 2; stepturn[6] =bodyradius * cos(2 * pi - phi0 + (f * pi / 180)) - leng / 2; stepturn[7] =bodyradius * sin(2 * pi - phi0 + (f * pi / 180)) + width / 2; stepturn[9] =bodyradius * cos(pi + phi0 + (f * pi / 180)) + leng / 2; stepturn[10] =bodyradius * sin(pi + phi0 + (f * pi / 180)) + width / 2;}// 根据上述函数中的关节角度计算伺服位置(以度为单位)void serverpos() { for ( int i =0; i <12; i++) {servodegnew[i] =servodeg0[i] +servodir[i] * (jointangle[i] - jointangle0[i]) * 180 / pi; }}// 用于受控和同步运动的伺服算法。所有舵机都应该在 timestepvoid 伺服移动()结束时到达它们的结束位置 { intservotimeold[servonum]; // 上次伺服位置时间的局部变量 int Servotimenew[servonum]; // 舵机 i 定位当前时间的局部变量 int SERVOPULSE[servonum]; // 写入伺服驱动器的局部变量 floatservodeg[servonum]; // 当前伺服位置的局部变量 floatservodegspeed[servonum]; // 所需伺服速度每毫秒递减的局部变量 unsigned long starttime =millis(); // 时间戳算法的开始 unsigned long timenow =starttime; // 现在重置时间 (int i =0; i  

定制零件和外壳

The body of the robot. Carries the PCB and battery.At each end of body, like bumper on a car. You should have two of these.Supports the hip joint. Print four of theseThe upper limb of leg. Print four.The lower limb (or foot). Print four.All parts put together. Not for printing.

示意图

This is a Fritzing file to allow PCB production. Use it to order from Fritzing themselves or export to a suitable format an manufacture elsewhere. kittybotmini_XKZYltyQVJ.fzz

制造工艺

  1. Raspberry Pi 2 上的 Windows 10 IoT Core – Adafruit 传感器数据
  2. 使用 Adafruit 1/4 60 Ring Neopixel 的简单挂钟
  3. UnifiedWater v1
  4. Avenger Assembled:钢铁侠头盔和 Arc Reactor
  5. 移动投票箱
  6. 英特尔 Arduino 101 BLE Blynk Tank
  7. Arduino101 / tinyTILE BLE:相亲太阳镜
  8. Whac-A-Mole(按钮版)
  9. 现代点唱机
  10. Arduino Apple Watch
  11. 感谢所有有礼貌的司机
  12. Rocky Rover:机器人视觉系统 PixyCam 和 Arduino 101