41304浏览
查看: 41304|回复: 11

[教程] 铁熊玩创客 | 桌面萌宠 Pandy,谁说智能车不能卖萌!

[复制链接]
这是“桌面萌宠 Pando 机器人教程”的姊妹篇。

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

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

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

这篇文章主要介绍 Pandy 的制作教程,Pando 教程传送门:https://mc.dfrobot.com.cn/thread-35162-1-1.html

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



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





# 准备工作

准备好如下材料:

  • 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 厚的半透明黑色亚克力板
  • 螺丝、螺帽若干
  • 导线若干
  • 热缩管若干





需要使用的工具如下:

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



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

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



# 电路原理图

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



# 制作过程

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



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



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



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



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



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



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



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



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



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



# 程序

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

  1. <font face="微软雅黑">#include <Pandy.h>
  2. #include <Metro.h>
  3. #include "GoBLE.h"
  4. int joystickX, joystickY;
  5. int buttonState[7];
  6. int LeftWheelSpeed;
  7. int RightWheelSpeed;
  8. #define lineSensorR 3
  9. #define lineSensorL 2
  10. #define TOUCH1_PIN A0
  11. #define TOUCH2_PIN A1
  12. #define TOUCH3_PIN A2
  13. int touchVal1 = 0;
  14. int touchVal2 = 0;
  15. int touchVal3 = 0;
  16. // default: joystick mode
  17. int lineFollowModeFlag = 0;
  18. int joystickModeFlag = 1;
  19. int E1 = 5;     //M1 Speed Control
  20. int E2 = 6;     //M2 Speed Control
  21. int M1 = 4;    //M1 Direction Control
  22. int M2 = 7;    //M1 Direction Control
  23. Pandy Pandy;  // This is Pandy!
  24. void setup()
  25. {
  26.   Goble.begin();
  27.   pinMode(lineSensorL, INPUT);
  28.   pinMode(lineSensorR, INPUT);
  29.   pinMode(TOUCH1_PIN, INPUT);
  30.   pinMode(TOUCH2_PIN, INPUT);
  31.   pinMode(TOUCH3_PIN, INPUT);
  32.   for (int i = 4; i <= 7; i++)
  33.   {
  34.     pinMode(i, OUTPUT);
  35.   }
  36.   Pandy.init();
  37.   Pandy.sing(S_connection); // Pando wake up!
  38.   Pandy.putEyes(happyOpen);
  39.   delay(50);
  40. }
  41. void loop()
  42. {
  43.   touchVal1 = digitalRead(TOUCH1_PIN);
  44.   if (touchVal1 == HIGH) {
  45.     Pandy.sing(S_superHappy);
  46.     Pandy.putEyes(heart);
  47.     advance(80, 80);
  48.     delay(300);
  49.     stop();
  50.     Pandy.putEyes(happyClosed);
  51.     back_off(80, 80);
  52.     delay(500);
  53.     stop();
  54.     Pandy.sing(S_superHappy);
  55.     Pandy.putEyes(heart);
  56.     turn_R(80, 80);
  57.     delay(200);
  58.     stop();
  59.     Pandy.putEyes(happyClosed);
  60.     turn_L(80, 80);
  61.     delay(400);
  62.     stop();
  63.     turn_R(80, 80);
  64.     delay(200);
  65.     stop();
  66.     touchVal1 = !touchVal1;
  67.   }
  68.   // joystick mode
  69.   touchVal2 = digitalRead(TOUCH2_PIN);
  70.   if (touchVal2 == HIGH) {
  71.     lineFollowModeFlag = 0;
  72.     joystickModeFlag = 1;
  73.     stop();
  74.     touchVal2 = !touchVal2;
  75.   }
  76.   // line follow mode
  77.   touchVal3 = digitalRead(TOUCH3_PIN);
  78.   if (touchVal3 == HIGH) {
  79.     lineFollowModeFlag = 1;
  80.     joystickModeFlag = 0;
  81.     touchVal3 = !touchVal3;
  82.   }
  83.   if (lineFollowModeFlag == 0 && joystickModeFlag == 1) {
  84.     Pandy.putEyes(happyOpen);
  85.     joystickMode();
  86.   }
  87.   if (lineFollowModeFlag == 1 && joystickModeFlag == 0) {
  88.     Pandy.putEyes(smile);
  89.     lineFollowMode();
  90.   }
  91. }
  92. void joystickMode()
  93. {
  94.   if (Goble.available()) {
  95.     joystickX = Goble.readJoystickX();
  96.     joystickY = Goble.readJoystickY();
  97.     buttonState[SWITCH_UP]     = Goble.readSwitchUp();
  98.     buttonState[SWITCH_DOWN]   = Goble.readSwitchDown();
  99.     buttonState[SWITCH_LEFT]   = Goble.readSwitchLeft();
  100.     buttonState[SWITCH_RIGHT]  = Goble.readSwitchRight();
  101.     buttonState[SWITCH_SELECT] = Goble.readSwitchSelect();
  102.     buttonState[SWITCH_START]  = Goble.readSwitchStart();
  103.     int SpeedX = (2 * joystickX - 256) / 3;
  104.     int SpeedY = (2 * joystickY - 256) / 3;
  105.     LeftWheelSpeed = SpeedX + SpeedY;
  106.     RightWheelSpeed = SpeedX - SpeedY;
  107.     if (SpeedX == 0 && SpeedY == 0) {
  108.       stop();
  109.     }
  110.     if (LeftWheelSpeed > 0 && RightWheelSpeed > 0) {
  111.       advance(RightWheelSpeed, LeftWheelSpeed);
  112.     } else if (LeftWheelSpeed > 0 && RightWheelSpeed < 0) {
  113.       turn_R(-RightWheelSpeed, LeftWheelSpeed);
  114.     } else if (LeftWheelSpeed < 0 && RightWheelSpeed > 0) {
  115.       turn_L(RightWheelSpeed, -LeftWheelSpeed);
  116.     } else if (LeftWheelSpeed < 0 && RightWheelSpeed < 0) {
  117.       back_off(-RightWheelSpeed, -LeftWheelSpeed);
  118.     }
  119.     if (buttonState[SWITCH_UP] == PRESSED) {
  120.       Pandy.putEyes(sadOpen);
  121.       Pandy.sing(S_sad);
  122.       delay(500);
  123.     }
  124.     if (buttonState[SWITCH_UP] == RELEASED) {
  125.       Pandy.putEyes(happyOpen);
  126.     }
  127.     if (buttonState[SWITCH_DOWN] == PRESSED) {
  128.       Pandy.putEyes(confused);
  129.       Pandy.sing(S_confused);
  130.       delay(500);
  131.     }
  132.     if (buttonState[SWITCH_DOWN] == RELEASED) {
  133.       Pandy.putEyes(happyOpen);
  134.     }
  135.     if (buttonState[SWITCH_LEFT] == PRESSED) {
  136.       Pandy.putEyes(happyClosed);
  137.       Pandy.sing(S_sleeping);
  138.       delay(500);
  139.     }
  140.     if (buttonState[SWITCH_LEFT] == RELEASED) {
  141.       Pandy.putEyes(happyOpen);
  142.     }
  143.     if (buttonState[SWITCH_RIGHT] == PRESSED) {
  144.       Pandy.putEyes(angry);
  145.       Pandy._tone(note_A5, 100, 30);
  146.       Pandy.bendTones(note_A5, note_D6, 1.02, 7, 4);
  147.       Pandy.bendTones(note_D6, note_G6, 1.02, 10, 1);
  148.       Pandy.bendTones(note_G6, note_A5, 1.02, 10, 1);
  149.       delay(15);
  150.       Pandy.bendTones(note_A5, note_E5, 1.02, 20, 4);
  151.       delay(400);
  152.       Pandy.bendTones(note_A5, note_D6, 1.02, 20, 4);
  153.       Pandy.bendTones(note_A5, note_E5, 1.02, 20, 4);
  154.       delay(500);
  155.     }
  156.     if (buttonState[SWITCH_RIGHT] == RELEASED) {
  157.       Pandy.putEyes(happyOpen);
  158.     }
  159.   }
  160. }
  161. void lineFollowMode()
  162. {
  163.   if (digitalRead(lineSensorR) == HIGH && digitalRead(lineSensorL) == LOW)
  164.   {
  165.     turn_L(30, 30);
  166.   } else if (digitalRead(lineSensorR) == LOW && digitalRead(lineSensorL) == HIGH) {
  167.     turn_R (30, 30);
  168.   } else if (digitalRead(lineSensorR) == LOW && digitalRead(lineSensorL) == LOW) {
  169.     advance(30, 30);
  170.   } else {
  171.     stop();
  172.   }
  173. }
  174. void stop(void)             // Stop
  175. {
  176.   analogWrite (E1, 0);     // PWM Speed Control
  177.   digitalWrite(M1, HIGH);
  178.   analogWrite (E2, 0);
  179.   digitalWrite(M2, HIGH);
  180. }
  181. void advance(char a, char b)  // Move forward
  182. {
  183.   analogWrite (E1, a);        // PWM Speed Control
  184.   digitalWrite(M1, HIGH);
  185.   analogWrite (E2, b);
  186.   digitalWrite(M2, HIGH);
  187. }
  188. void back_off(char a, char b)  // Move backward
  189. {
  190.   analogWrite (E1, a);
  191.   digitalWrite(M1, LOW);
  192.   analogWrite (E2, b);
  193.   digitalWrite(M2, LOW);
  194. }
  195. void turn_L(char a, char b)    // Turn Left
  196. {
  197.   analogWrite (E1, a);
  198.   digitalWrite(M1, HIGH);
  199.   analogWrite (E2, b);
  200.   digitalWrite(M2, LOW);
  201. }
  202. void turn_R (char a, char b)   // Turn Right
  203. {
  204.   analogWrite (E1, a);
  205.   digitalWrite(M1, LOW);
  206.   analogWrite (E2, b);
  207.   digitalWrite(M2, HIGH);
  208. }</font>
复制代码

“走你 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”。



# 资料分享

鉴于总是碰到一些无理取闹的伸手党,资料不再免费提供……请大家见谅!



# 往期作品

## 创客技巧

- 创客项目缺少高颜值电路图?看这里就对了:https://mc.dfrobot.com.cn/thread-289862-1-1.html
- 小白也能学会的激光切割创意盒子设计方法:https://mc.dfrobot.com.cn/thread-276550-1-1.html

## 桌面机器人

- 桌面萌宠 Pando,这个机器人靠卖萌为生好多年:https://mc.dfrobot.com.cn/thread-35162-1-1.html
- 桌面萌宠 Pandy,谁说智能车不能卖萌:https://mc.dfrobot.com.cn/thread-36721-1-1.html
- 吃货战车:谁说泡面只能用来填肚子:https://mc.dfrobot.com.cn/thread-34679-1-1.html
- 纯野生黑科技,分分钟教你自制最skr的全向麦熊小车:https://mc.dfrobot.com.cn/thread-268968-1-1.html

## 智能家居

- Hey Siri, 打开 HAY 旋转灯:https://mc.dfrobot.com.cn/thread-26865-1-1.html
- Hey Siri,请告诉我传感器数据:https://mc.dfrobot.com.cn/thread-28859-1-1.html

## 创意生活

- HAY,你好 ── DIY HAY旋转灯:https://mc.dfrobot.com.cn/thread-26212-1-1.html
- DIY 你的专属酷炫照片投影灯:https://mc.dfrobot.com.cn/thread-26900-1-1.html
- 好色灯:你们吸猫,我吸色:https://mc.dfrobot.com.cn/thread-34483-1-1.html
- DIY 你的专属酷炫照片投影灯:https://mc.dfrobot.com.cn/thread-26900-1-1.html
- 没有什么问题是猜拳不能解决的:https://mc.dfrobot.com.cn/thread-38060-1-1.html
- 律动头饰皇冠:每个女孩心中都有一个公主梦:https://mc.dfrobot.com.cn/thread-267927-1-1.html

## 学生作品

- 陈朔:戒烟帽:https://mc.dfrobot.com.cn/thread-280204-1-1.html
- 梁立昊:体感骑行安全帽:https://mc.dfrobot.com.cn/thread-280093-1-1.html

## HCRbot 机器人(SLAM)


- HCRbot 系列 1──HCRbot 机器人简介:https://mc.dfrobot.com.cn/thread-26938-1-1.html
- HCRbot 系列 2──HCRbot 硬件介绍与设置:https://mc.dfrobot.com.cn/thread-26939-1-1.html
- HCRbot 系列 3──HCRbot 上位机 PC 端软件设置:https://mc.dfrobot.com.cn/thread-26975-1-1.html
- HCRbot 系列 4──HCRbot下位机设置(树莓派版):https://mc.dfrobot.com.cn/thread-27020-1-1.html
- HCRbot 系列 5──HCRbot下位机设置(Odroid XU4版):https://mc.dfrobot.com.cn/thread-27161-1-1.html
- HCRbot 系列 6──HCRbot 底层驱动 OpenCR 设置:https://mc.dfrobot.com.cn/thread-27296-1-1.html
- HCRbot 系列 7──启动 HCRbot 机器人:https://mc.dfrobot.com.cn/thread-28248-1-1.html
- HCRbot 系列 8──远程控制 HCRbot 机器人:https://mc.dfrobot.com.cn/thread-29354-1-1.html
- HCRbot 系列 9──控制 HCRbot 机器人绘制平面地图(SLAM):https://mc.dfrobot.com.cn/thread-29936-1-1.html

## 其他

- 让掌控板像 Mixly 串口监视器一样绘图:https://mc.dfrobot.com.cn/thread-288929-1-1.html



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

临海听风1  见习技师

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

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

使用道具 举报

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

好赞,有空也想做一个
回复

使用道具 举报

laai  初级技师

发表于 2019-12-11 12:34:58

真心不错!~
回复

使用道具 举报

红通通  中级技师

发表于 2020-2-28 16:20:37

太酷了,点赞点赞!
回复

使用道具 举报

车厘子  学徒

发表于 2020-9-27 08:05:11

有空也想做一个
回复

使用道具 举报

QQQQQQQ  初级技匠

发表于 2022-2-17 20:15:16

厉害厉害
回复

使用道具 举报

糖醋花生  高级技师

发表于 2022-6-11 11:49:45

好可爱,可惜零件不够
回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

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

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

mail