查看: 6860|回复: 6

[教程] 【桌面萌宠】系列之 Pandy,谁说智能车不能卖萌!

[复制链接]
本帖最后由 铁熊 于 2018-6-15 10:23 编辑

这是“桌面萌宠 Pando 机器人教程”的姊妹篇。

还记得 Pando 卖萌机器人么?【桌面萌宠】系列之 Pando,这个机器人靠卖萌为生好多年

过了这么久,他的兄弟 Pandy 终于与大家见面啦,让大家久等了!

Pando 和 Pandy 机器人是我做的一对小巧玲珑的卖萌机器人组合。他们除了外形可爱会卖萌外,最大的特点是可以共用一个 3D 打印的核心头部结构,当头部加上双足,就变成了 Pando 双足机器人;当头部加上车轮,就变成了 Pandy 智能车。

这篇文章主要介绍 Pandy 的制作教程,Pando 教程传送门:http://mc.dfrobot.com.cn/forum.php?mod=viewthread&tid=35162

具体 Pandy 可以做什么呢?我们先来看一则短片:



这么可爱的机器人,是不是迫不及待想入手一个?别急,马上教你做一个!

pandy.jpg

IMG_1649.jpg

## 准备工作

准备好如下材料:

  • Romeo BLE mini V2.0 控制器 × 1
  • FireBeetle 24×8 LED点阵屏 × 1
  • 循线传感器 × 2
  • 模拟声音传感器(可选) × 1
  • TTP223 触摸传感器 × 3
  • MPU6050 六轴陀螺仪(可选) × 1
  • 蜂鸣器 × 1
  • N20 金属齿轮减速电机 × 2
  • 3PI MiniQ N20电机支架 × 2
  • 3PI miniQ 小车万向轮 × 1
  • 锂电池 × 1
  • 拨动开关2档3脚 SS-12F15G5 × 1
  • 数据线 × 1
  • 3D 打印结构件
  • 2mm 厚的半透明黑色亚克力板
  • 螺丝、螺帽若干
  • 导线若干
  • 热缩管若干


pandy-materials.jpg

需要使用的工具如下:

  • 3D 打印机
  • 电烙铁
  • 螺丝刀
  • 热熔胶枪
  • 502 胶水


首先使用半透明黑色亚克力用激光切割好 Pandy 的“墨镜”,外形如上图中黑色长方形亚克力,图纸见附件。

然后将 Pandy 的外形 3D 打印出来,你可以选择自己喜欢的颜色进行打印。

pandy-print.png

## 电路原理图

Pandy 机器人集成了触摸传感器、声音传感器(可选)、六轴陀螺仪(可选)、蜂鸣器、LED点阵、循线传感器、N20电机、蓝牙等模块,还能集成更多的扩展,电路原理图如下:

pandy-circuit.jpg

## 制作过程

1、用热熔胶分别将3个触摸传感器固定到 Pandy 头部的顶端和两侧,注意触摸端朝外。

pandy-touch-sensors.jpg

2、将 LED 点阵固定到 Pandy 的头部,用螺丝拧紧。此处注意将 LED 点阵的片选拨动开关拨动到 D5。

pandy-eyes.jpg

3、将电机和开关电源线连接到 Romeo BLE mini 主控板上,注意给电机和开关线留足长度,免得影响后面安装。

pandy-switch-motors.jpg

4、将 Romeo BLE mini 主控板固定到 Pandy 头部,用螺丝拧紧。

pandy-head.jpg

6、将 Pandy 头部所有传感器与 Romeo BLE mini 主控板根据电路图连线,适当梳理导线,尽可能整洁一些。

pandy-head-2.jpg

7、将循线传感器固定到 Pandy 身体,用螺丝拧紧。

pandy-line-sensors.jpg

8、用热熔将将蜂鸣器固定到 Pandy 身体。

pandy-buzzer.jpg

9、将万向轮固定到 Pandy 身体,用螺丝拧紧。

pandy-caster.jpg

10、将 N20 电机固定到 Pandy 身体上,用螺丝拧紧。并将电池、循线传感器、蜂鸣器连接到 Romeo BLE mini 主控板上。

pandy-head-body.jpg

11、装上轮子和亚克力镜片,大功告成!赶紧烧上程序试试看吧~

pandy.jpg

## 程序

由于 Romeo BLE mini 主控板集成了蓝牙4.0,而且可以通过配套的 App “走你 GoBle”进行控制,所以 Pandy 的程序也与“走你 GoBle” App 进行了结合。我写了一个示例程序,你也可以根据自己的需求进行修改。具体程序如下:

[C++] 纯文本查看 复制代码
#include <Pandy.h>
#include <Metro.h>
#include "GoBLE.h"

int joystickX, joystickY;
int buttonState[7];

int LeftWheelSpeed;
int RightWheelSpeed;

#define lineSensorR 3
#define lineSensorL 2

#define TOUCH1_PIN A0
#define TOUCH2_PIN A1
#define TOUCH3_PIN A2

int touchVal1 = 0;
int touchVal2 = 0;
int touchVal3 = 0;

// default: joystick mode
int lineFollowModeFlag = 0;
int joystickModeFlag = 1;

int E1 = 5;     //M1 Speed Control
int E2 = 6;     //M2 Speed Control
int M1 = 4;    //M1 Direction Control
int M2 = 7;    //M1 Direction Control

Pandy Pandy;  // This is Pandy!

void setup()
{
  Goble.begin();

  pinMode(lineSensorL, INPUT);
  pinMode(lineSensorR, INPUT);

  pinMode(TOUCH1_PIN, INPUT);
  pinMode(TOUCH2_PIN, INPUT);
  pinMode(TOUCH3_PIN, INPUT);

  for (int i = 4; i <= 7; i++)
  {
    pinMode(i, OUTPUT);
  }

  Pandy.init();
  Pandy.sing(S_connection); // Pando wake up!
  Pandy.putEyes(happyOpen);
  delay(50);
}

void loop()
{
  touchVal1 = digitalRead(TOUCH1_PIN);
  if (touchVal1 == HIGH) {
    Pandy.sing(S_superHappy);
    Pandy.putEyes(heart);
    advance(80, 80);
    delay(300);
    stop();
    Pandy.putEyes(happyClosed);
    back_off(80, 80);
    delay(500);
    stop();

    Pandy.sing(S_superHappy);
    Pandy.putEyes(heart);
    turn_R(80, 80);
    delay(200);
    stop();
    Pandy.putEyes(happyClosed);
    turn_L(80, 80);
    delay(400);
    stop();
    turn_R(80, 80);
    delay(200);
    stop();

    touchVal1 = !touchVal1;
  }

  // joystick mode
  touchVal2 = digitalRead(TOUCH2_PIN);
  if (touchVal2 == HIGH) {
    lineFollowModeFlag = 0;
    joystickModeFlag = 1;
    stop();
    touchVal2 = !touchVal2;
  }

  // line follow mode
  touchVal3 = digitalRead(TOUCH3_PIN);
  if (touchVal3 == HIGH) {
    lineFollowModeFlag = 1;
    joystickModeFlag = 0;
    touchVal3 = !touchVal3;
  }

  if (lineFollowModeFlag == 0 && joystickModeFlag == 1) {
    Pandy.putEyes(happyOpen);
    joystickMode();
  }

  if (lineFollowModeFlag == 1 && joystickModeFlag == 0) {
    Pandy.putEyes(smile);
    lineFollowMode();
  }
}

void joystickMode()
{
  if (Goble.available()) {
    joystickX = Goble.readJoystickX();
    joystickY = Goble.readJoystickY();

    buttonState[SWITCH_UP]     = Goble.readSwitchUp();
    buttonState[SWITCH_DOWN]   = Goble.readSwitchDown();
    buttonState[SWITCH_LEFT]   = Goble.readSwitchLeft();
    buttonState[SWITCH_RIGHT]  = Goble.readSwitchRight();
    buttonState[SWITCH_SELECT] = Goble.readSwitchSelect();
    buttonState[SWITCH_START]  = Goble.readSwitchStart();

    int SpeedX = (2 * joystickX - 256) / 3;
    int SpeedY = (2 * joystickY - 256) / 3;

    LeftWheelSpeed = SpeedX + SpeedY;
    RightWheelSpeed = SpeedX - SpeedY;

    if (SpeedX == 0 && SpeedY == 0) {
      stop();
    }

    if (LeftWheelSpeed > 0 && RightWheelSpeed > 0) {
      advance(RightWheelSpeed, LeftWheelSpeed);
    } else if (LeftWheelSpeed > 0 && RightWheelSpeed < 0) {
      turn_R(-RightWheelSpeed, LeftWheelSpeed);
    } else if (LeftWheelSpeed < 0 && RightWheelSpeed > 0) {
      turn_L(RightWheelSpeed, -LeftWheelSpeed);
    } else if (LeftWheelSpeed < 0 && RightWheelSpeed < 0) {
      back_off(-RightWheelSpeed, -LeftWheelSpeed);
    }

    if (buttonState[SWITCH_UP] == PRESSED) {
      Pandy.putEyes(sadOpen);
      Pandy.sing(S_sad);
      delay(500);
    }
    if (buttonState[SWITCH_UP] == RELEASED) {
      Pandy.putEyes(happyOpen);
    }

    if (buttonState[SWITCH_DOWN] == PRESSED) {
      Pandy.putEyes(confused);
      Pandy.sing(S_confused);
      delay(500);
    }
    if (buttonState[SWITCH_DOWN] == RELEASED) {
      Pandy.putEyes(happyOpen);
    }

    if (buttonState[SWITCH_LEFT] == PRESSED) {
      Pandy.putEyes(happyClosed);
      Pandy.sing(S_sleeping);
      delay(500);
    }
    if (buttonState[SWITCH_LEFT] == RELEASED) {
      Pandy.putEyes(happyOpen);
    }

    if (buttonState[SWITCH_RIGHT] == PRESSED) {
      Pandy.putEyes(angry);
      Pandy._tone(note_A5, 100, 30);
      Pandy.bendTones(note_A5, note_D6, 1.02, 7, 4);
      Pandy.bendTones(note_D6, note_G6, 1.02, 10, 1);
      Pandy.bendTones(note_G6, note_A5, 1.02, 10, 1);
      delay(15);
      Pandy.bendTones(note_A5, note_E5, 1.02, 20, 4);
      delay(400);
      Pandy.bendTones(note_A5, note_D6, 1.02, 20, 4);
      Pandy.bendTones(note_A5, note_E5, 1.02, 20, 4);
      delay(500);
    }
    if (buttonState[SWITCH_RIGHT] == RELEASED) {
      Pandy.putEyes(happyOpen);
    }
  }
}

void lineFollowMode()
{
  if (digitalRead(lineSensorR) == HIGH && digitalRead(lineSensorL) == LOW)
  {
    turn_L(30, 30);
  } else if (digitalRead(lineSensorR) == LOW && digitalRead(lineSensorL) == HIGH) {
    turn_R (30, 30);
  } else if (digitalRead(lineSensorR) == LOW && digitalRead(lineSensorL) == LOW) {
    advance(30, 30);
  } else {
    stop();
  }
}

void stop(void)             // Stop
{
  analogWrite (E1, 0);     // PWM Speed Control
  digitalWrite(M1, HIGH);
  analogWrite (E2, 0);
  digitalWrite(M2, HIGH);
}

void advance(char a, char b)  // Move forward
{
  analogWrite (E1, a);        // PWM Speed Control
  digitalWrite(M1, HIGH);
  analogWrite (E2, b);
  digitalWrite(M2, HIGH);
}

void back_off(char a, char b)  // Move backward
{
  analogWrite (E1, a);
  digitalWrite(M1, LOW);
  analogWrite (E2, b);
  digitalWrite(M2, LOW);
}

void turn_L(char a, char b)    // Turn Left
{
  analogWrite (E1, a);
  digitalWrite(M1, HIGH);
  analogWrite (E2, b);
  digitalWrite(M2, LOW);
}
void turn_R (char a, char b)   // Turn Right
{
  analogWrite (E1, a);
  digitalWrite(M1, LOW);
  analogWrite (E2, b);
  digitalWrite(M2, HIGH);
}


“走你 GoBle” App 下载地址:https://itunes.apple.com/cn/app/zou-ni-lan-ya4.0-kong-zhi-qi/id950937437?mt=8

“走你 GoBle” App Arduino 库下载地址:https://github.com/DFRobot/GoBle


## 其他

另外,根据你的喜好,Pandy 还能集成各种传感器,比如声音传感器、IMU 陀螺仪与加速度传感器,所以可以说 Pandy 充满无限可能,期待看到你的 “Pandy”。








willwii3373  见习技师

发表于 2018-4-26 10:48:00

好萌 厉害了 好想做一个啊
回复 支持 反对

使用道具 举报

willwii3373  见习技师

发表于 2018-4-27 15:12:15

为什么下载不了呢
回复 支持 反对

使用道具 举报

铁熊  版主

发表于 2018-4-27 19:50:17

willwii3373 发表于 2018-4-27 15:12
为什么下载不了呢

权限设置错了,现在可以下载了
回复 支持 反对

使用道具 举报

willwii3373  见习技师

发表于 2018-4-28 11:37:55

好的 谢谢版主
回复 支持 反对

使用道具 举报

好奇吖斌  高级技师

发表于 2018-5-2 10:08:14

好赞,有空也想做一个
回复 支持 反对

使用道具 举报

临海听风1  见习技师

发表于 2018-6-14 21:02:46

没有找到外观的3D模型?楼主能提供吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
wifi气象站

硬件清单

btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2016 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail