DIY一个BB8机器人

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

基本构思

  • 滚动的小球使用亚克力球来代替,其余部分使用3D打印
  • 头部与身体连接使用小磁体吸附
  • 控制使用手机蓝牙连接,机器人内部用Arduino Nano芯片控制
  • 驱动使用两个直流小电机

构思好了怎么来做,就开始动手!以下我主要通过3个方面来叙述:

  • 实物建模
  • 组装与上漆
  • 电子控制

PartⅠ:实物建模—使用UG进行建模

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

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

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

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

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

PARTⅡ 组装与上漆

  1. 完成模型建模之后进行实物制作。首先,联系卖家进行3D打印,打印的材料根据我们所要求的强度和精度选定为未来8000树脂材料,零件精度为100微米,以下为零件实物:

  2. 然后购买电子原件

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

  4. 然后安装上面的舵机结构,先把舵机装入,粘接好磁铁,使热熔胶固定舵机和连杆的接头。

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

  6. 最后,把外轮固定上去。完成后的效果图:

试一试组装后的效果:

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

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

  2. 上漆效果如下

PARTⅢ 电子控制

  1. 使用蓝牙控制,控制逻辑如下:

  2. 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);
      }

    }

  }

}

PART Ⅳ 完成效果


   转载规则


《DIY一个BB8机器人》查永春 采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。
  目录