跳至主要內容

DIY一个BB8机器人

yczha大约 6 分钟DIYBB83D打印机械设计UG模型

摘要

动手制作一个BB8机器人

首先,来认识一下我们要制作的对象:

bb8
bb8

基本构思

构思好了怎么来做,就开始动手!

Ⅰ 实物建模 - 使用UG进行建模

整体外观仿照BB8实物

大概确定其尺寸为直径90mm的球壳【这是因为楼主前期在某宝找了一番,发现合适大小的亚克力球直径只有这个规格】,然后完善里面的各个细节,最终的建模结果如下:

shell
shell

提示

上图的浅褐色球体就是使用亚克力球,内部灰色的部分是主框架,蓝色代表Arduino芯片,红色代表锂电池,紫色代表蓝牙芯片,深褐色分别是边上的两个接触轮,中间里面的是舵机,比较难的部分在里面看不见的地方有两组减速的齿轮组,下面会讨论到。

动力部分

选用两个6V直流电压的电机作为驱动力,由于电机空载转速为19000rpm,转速过大,需进行电机减速,故设计减速比为20:1的二级齿轮减速组,实现了机器人理论最大1.5m/s的运动速度。为了减小减速系统的摩擦系数,给减速组引进了深沟球轴承(618/2-Z)进行齿轮的轴定位,进而使实际的传动比逼近理论值,降低了系统误差,提高控制的可行性。

structure
structure

头部控制

在机身引进了一个舵机,并在舵机上放置磁铁(8mm),与头部放置的磁铁相互对应而被吸引,紧贴在机身上方。通过Arduino及蓝牙控制舵机,带动头部的转动和前后移动。在结构方案确定之后,按照实际比例对结构以及结构的布局进行了模型建模,同时也按照实际比例对电机、齿轮以及电磁等等零件进行建模。在通过零件与结构之间的装配得到了球形机器人理论机构模型。下图中的中间槽内放置舵机以及提供电源的电磁,与中间槽相连的耳部放置相关的传感器和芯片,耳部底槽为减速系统。图一整个结构底部在通过与放置有两电机的图二相连接,得到实际结构。

head
head

最后为头部的建模

头部分成了两部分建模,一部分为50mm直径的空心半球,半球球面加一突起。底部为一定曲率的圆形底板,其内部建有深度2mm的圆形槽,用于放置磁铁,两槽上方也建有两个通槽并装配有小轮,用于减小头部与机身的摩擦,通过两部分的连接便得到了完整的头部模型。 head2part1

Ⅱ 组装与上漆

完成模型建模之后进行实物制作

首先,联系卖家进行3D打印,打印的材料根据我们所要求的强度和精度选定为未来8000树脂材料,零件精度为100微米,以下为零件实物:

material
material

购买电子原件

devicedevice

开始组装机身部分

安装电机和齿轮组:首先挑选好两组3个齿轮,使其减速比约为20:1,然后在齿轮和铁轴上打定位孔,以便使二者不发生相对转动,然后在机身上安装轴承,使用502胶水固定,然后装入齿轮穿入轴,固定轴和齿轮。安装好齿轮组后,接着开始安装电机,使用电机固定片和m2螺丝螺母固定,安装后如下图:

assemblyassembly

安装上面的舵机结构

先把舵机装入,粘接好磁铁,使热熔胶固定舵机和连杆的接头。

assembly
assembly

接下来开始焊接芯片

首先,把3.7v锂电池放到电池槽里。然后用热熔胶把声控芯片粘到侧面,再用热熔胶依次粘:蓝牙芯片、双路电机控制板、Arduino芯片,无线充电模块。粘好之后焊接导线,其中焊接的电路板根据以下控制逻辑

logic
logic

最后,把外轮固定上去

完成后的效果图:

overlookoverlook

试一试组装后的效果:

组装头部

首先用铁轴把小轮固定,然后使用502把四个小磁铁粘上。再把上面的壳套上即可

part2part2

添加固定圈

为了使小球外壳跟里面接触的部分不至于摩擦力太大,引入一个固定圈,圈的外围使用滚珠减小阻力

looploop

上漆效果如下

paint
paint

Ⅲ 电子控制

使用蓝牙控制,控制逻辑如下

control
control

Arduino代码

#include<Servo.h>
int m1l = 2, m1r = 3 , m2l = 4, m2r = 5; //电机控制引脚
int ser = 9; //舵机控制引脚
int spe = 100; //定义速度
Servo myServo;//初始化舵机对象
void setup() {
  Serial.begin(9600);
  myServo.attach(ser);

  pinMode(m1l, OUTPUT);
  pinMode(m1r, OUTPUT);
  pinMode(m2l, OUTPUT);
  pinMode(m2r, OUTPUT);

}

void loop()
{
  while (Serial.available()) {
    char c = Serial.read();
    if (c == 'b') {
      digitalWrite(m1l, HIGH);
      digitalWrite(m1r, LOW);
      digitalWrite(m2l, LOW);
      digitalWrite(m2r, HIGH);
      delay(20);
    }

    if (c == 'f') {
      digitalWrite(m1l, LOW);
      digitalWrite(m1r, HIGH);
      digitalWrite(m2l, HIGH);
      digitalWrite(m2r, LOW);
      delay(20);
    }

    if (c == 'l') {
      digitalWrite(m1l, HIGH);
      digitalWrite(m1r, LOW);
      digitalWrite(m2l, HIGH);
      digitalWrite(m2r, LOW);
      delay(20);
    }

    if (c == 'r') {
      digitalWrite(m1l, LOW);
      digitalWrite(m1r, HIGH);
      digitalWrite(m2l, LOW);
      digitalWrite(m2r, HIGH);
      delay(20);
    }

    if (c == 's') {
      digitalWrite(m1l, LOW);
      digitalWrite(m1r, LOW);
      digitalWrite(m2l, LOW);
      digitalWrite(m2r, LOW);
      delay(20);
    }

    if (c == 'w') {
      for (int pos = 90; pos < 170; pos++) {
        myServo.write(pos);
        delay(10);
      }
      for (int pos = 170; pos > 89; pos--) {
        myServo.write(pos);
        delay(10);
      }
       for (int pos = 90; pos < 170; pos++) {
        myServo.write(pos);
        delay(10);
      }
      for (int pos = 170; pos > 89; pos--) {
        myServo.write(pos);
        delay(10);
      }
       for (int pos = 90; pos < 170; pos++) {
        myServo.write(pos);
        delay(10);
      }
      for (int pos = 170; pos > 89; pos--) {
        myServo.write(pos);
        delay(10);
      }
       for (int pos = 90; pos < 170; pos++) {
        myServo.write(pos);
        delay(10);
      }
      for (int pos = 170; pos > 89; pos--) {
        myServo.write(pos);
        delay(10);
      }
       for (int pos = 90; pos < 170; pos++) {
        myServo.write(pos);
        delay(10);
      }
      for (int pos = 170; pos > 89; pos--) {
        myServo.write(pos);
        delay(10);
      }
    }

    if (c == 'e') {
      for (int pos = 90; pos > 0; pos--) {
        myServo.write(pos);
        delay(10);
      }
      for (int pos = 1; pos < 90; pos++) {
        myServo.write(pos);
        delay(10);
      }

    }

  }

}

Ⅳ 完成效果