汤果 发表于 2019-6-16 09:06:15

麦昆爬楼记

项目来源

之前我为麦昆设计了一个瓦力的造型(详见:麦昆变身瓦力),想着要么做些周边吧。于是跑去重温《机器人瓦力》这部电影。


在电影的开头,我看到了瓦力的本职工作:在垃圾堆里面将垃圾挤压成方块,然后规则地叠起来。其中这样一幕让我觉得很有意思。

https://makelogimg.dfrobot.com.cn/Fi6am3zBreLwKMZt3wNvfIVR7a1L?imageView2/2/w/1600
瓦力堆积的垃圾块实在太多了,以至于搭建起了一座座高楼!看着瓦力从大楼上跑下来,心想,那我为什么不做一个这样的高楼呢?于是开始为瓦力造楼。

材料清单


2x纸箱
1x直尺
1x剪刀
1x美工刀
1x铅笔
1x热熔胶枪
1x绝缘胶带
1x麦昆: micro:bit教育机器人 V3.0链接
1xCR123A锂电池电源管理模块链接
1xCR123A可充电式锂电池-3.6V链接

步骤1裁剪纸板


https://makelogimg.dfrobot.com.cn/lq4JgNGWMZnkeNEQf8wh7YiBLtJt?imageView2/2/w/1600
这是用到的工具,两个大纸箱。我测算了一下,麦昆的尺寸大概 8 cm 左右。为了防止跑道太窄跌落,我把过道尺寸设置为 11 cm。于是裁剪了若干纸条。

https://makelogimg.dfrobot.com.cn/lpTOkpeb15zBLWbd8SLd1NYtbp_7?imageView2/2/w/1600
步骤2搭建跑道

跑道搭建很简单,只要把过道固定到纸箱子上就好了。但是,问题多多啊!首先涉及到坡度问题。我先假设用 45 度,结果跑了两步直接栽跟头。那就降低坡度。然后只有很平的情况下才不会翻跟头(大概 15 度吧)。不行,我要换个方案。
仔细端详了一番,发现可能是标配的电池盒加上三节电池太重了。于是我就拿出了刚买的 CR123A 电池套装。对比了一下,这个组合的确轻一些。然后我就把电源换掉了。但是,这个模块比原先的电池盒要宽,我的瓦力外壳套!不!上!去!那好吧,我就放弃瓦力的造型了。

https://makelogimg.dfrobot.com.cn/FqPvymzU2n6QPdy5eJBiDrcuRNYI?imageView2/2/w/1600
测算好坡度后,用热熔胶枪将跑道固定在纸盒子上就好了。原本中间的纸盒(大楼)很高。按照现在的坡度至少围绕两周才能到顶。我最终还是放弃了,直接在中间结束掉算了。期间一不小心多裁剪了一刀,以至于后面又要用热熔胶固定。

步骤3贴巡线轨迹

这个超级简单,直接拿电工绝缘胶带贴上去就好了。只是在拐弯的地方用直角还是弯头是个需要考量的问题。一开始想用弯头的,但是可能需要占比较大的空间,我怕麦昆直接翻出来。所以用了直角。

https://makelogimg.dfrobot.com.cn/lnHV7cgmMO8zZkBUkdg5_r4AtiE_?imageView2/2/w/1600
这是贴好后的样子。下面再来几张四周视角。

https://makelogimg.dfrobot.com.cn/lqD0J_WaoT-UYl37pR-8_cyXJUNx?imageView2/2/w/1600
https://makelogimg.dfrobot.com.cn/ljoj4m-ytXbo9xmG_Db-DY-KQEhM?imageView2/2/w/1600
https://makelogimg.dfrobot.com.cn/ljlVbwSj9EPzX2OA2yDyVgEvtjZw?imageView2/2/w/1600
https://makelogimg.dfrobot.com.cn/ll5oTjlOXwKhZ1sVz-bqw8QmRyrM?imageView2/2/w/1600
步骤4编写代码

最后就是编写代码,让麦昆实现巡线爬楼的效果。因为用了直角,巡线不太好控制。于是参考了 @LYon 的巡线处理思路。右传感器一直在黑线,左传感器在黑线左侧的方式行走。当检测左右传感数据不一样的时候优先判断左传感器是否在黑线上,如果在黑线则依次通过降低左轮速度、左轮停转、左轮倒转来向左修正路线,否则直行。

https://makelogimg.dfrobot.com.cn/FkiGNrxXD_CyJjYLP1kAPCLXA0cS?imageView2/2/w/1600
这是程序结束时的代码:
https://makelogimg.dfrobot.com.cn/FgsHoUvbIhfQmHXPEW51-jDADKPQ?imageView2/2/w/1600完整代码如下:

#include <Maqueen_Motor.h>
#include <Microbit_Matrix.h>
#include <DFRobot_NeoPixel.h>
#include <Microbit_Sound.h>

double df_speed;
double df_LR;
double df_Rev;

Maqueen_Motor motor;
DFRobot_NeoPixelrgb_display_15;
void df_END();

void df_END()
{
      motor.motorStop(motor.LEFT);
      motor.motorStop(motor.RIGHT);
      MMatrix.show(MMatrix.HAPPY);
      rgb_display_15.setRangeColor(0, 0, 0xff0000);
      rgb_display_15.setRangeColor(1, 1, 0xff7d00);
      rgb_display_15.setRangeColor(2, 2, 0x0000ff);
      rgb_display_15.setRangeColor(3, 3, 0xffff00);
      MSound.play(0, RINGTONE, OnceInBackground);
      while (1) {
                rgb_display_15.rotate(1);
                delay(200);
      }
}


void setup() {
      rgb_display_15.begin(15, 4, 255);
      df_speed = 60;
}

void loop() {
      if ((digitalRead(13) && digitalRead(14))) {
                if ((df_LR == 1)) {
                        motor.motorRun(motor.LEFT,motor.CW,100);
                        if ((df_Rev == 1)) {
                              motor.motorRun(motor.RIGHT,motor.CCW,50);
                              digitalWrite(12,HIGH);
                        }
                        else {
                              motor.motorRun(motor.RIGHT,motor.CW,0);
                              delay(50);
                              if (digitalRead(14)) {
                                        df_Rev = 1;
                              }
                        }
                }
                else {
                        motor.motorRun(motor.RIGHT,motor.CW,100);
                        if ((df_Rev == 1)) {
                              motor.motorRun(motor.LEFT,motor.CCW,50);
                              digitalWrite(8,HIGH);
                        }
                        else {
                              motor.motorRun(motor.LEFT,motor.CW,0);
                              delay(50);
                              if (digitalRead(13)) {
                                        df_Rev = 1;
                              }
                        }
                }
      }
      else {
                if ((digitalRead(13) == digitalRead(14))) {
                        df_LR = 3;
                        delay(50);
                        if ((digitalRead(13) && digitalRead(14))) {
                              motor.motorRun(motor.LEFT,motor.CW,30);
                              motor.motorRun(motor.RIGHT,motor.CW,30);
                              delay(100);
                              if (((!digitalRead(13)) && (!digitalRead(14)))) {
                                        df_END();
                              }
                        }
                }
                else {
                        if (digitalRead(13)) {
                              df_LR = 1;
                        }
                        else {
                              df_LR = 2;
                        }
                        motor.motorRun(motor.LEFT,motor.CW,df_speed);
                        motor.motorRun(motor.RIGHT,motor.CW,df_speed);
                        digitalWrite(8,LOW);
                        digitalWrite(12,LOW);
                        df_Rev = 0;
                }
      }
      MMatrix.print(df_LR);
}附件
巡线升级版.sb3

效果演示

https://makelogimg.dfrobot.com.cn/lk4i1UH56DSJJST_L9paBqnmKm2e?imageView2/2/w/1600
https://v.qq.com/x/page/d0885aelvr7.html

事实上测试的时候麦昆经常栽跟头或者从楼上翻下来(跳楼)。所以想让麦昆爬楼还是挺难的一件事╮( ~ ▽ ~' )╭

原帖发布于:https://makelog.dfrobot.com.cn/article-1464.html

页: [1]
查看完整版本: 麦昆爬楼记