迷宫原型:
国内App Inventor 推广先驱、“老巫婆”~金从军创办的人人可编程的网站:https://www.17coding.net/其中的块语言编程游戏对于初学者很有吸引力。麦昆赛道的构思就是从其中的“迷宫第10关”获得的。
我相信第1~9关很多人能一次性过关,但是第10关却不一定。就连真正的程序员首次遇到这个问题也不是立即就能够解决。这么具有挑战性的关口,建议不要查答案,自己摸索及陪着小孩子一起想办法是件很有意思的事情哟。
走迷宫基本策略:
下图即是迷宫第10关。根据网站提示,可以选择如图所示蓝色路线到达目标。简单地说:假想你就是左下的那个小小机器人,闭上眼睛,在迷宫中自始至终用左手摸着左边的迷宫内墙壁向前走,就一定能够到达目标!
观察后再思考:
1、如果我们把机器人放在迷宫内的任何位置,它都能够准确地到达目标点吗?(无论机器人自身所处方向如何)
2、如果机器人沿着右手侧走又怎么样呢?
被否定方案一:
通过观察虚拟机器人的运动方式,我们可以让麦昆仿照它检测左方及前方是否有路,从而决定转向。看着虚拟机器人轻轻松松转向调头,可是到真正的现实中的麦昆却一点也不顺利。开始选择的检测左方及前方是否有路的传感器~SHARP红外测距传感器,用巡线辅助在迷宫内走直(目的为了不撞墙)反复调试四天时间终于能够左转向,但是最终又发现红外抗干扰不强,偶有测不准而突然转向,直接撞墙!
下图即是麦昆左侧及正前方SHARP红外测距传感器。
被否定方案二:
后来想了想,麦昆可以像人一样贴着墙走,直接在两侧加上碰撞传感器不就容易解决了吗?!
下图安装了两个碰撞传感器,但是实际中我用的KT板实在太轻了,让小小麦昆能够感觉到贴着墙,板子也快弯拆了。
采纳方案:
采用两个超声波,一个位于麦昆车身左侧检测左方距离,一个位于麦昆正前方检测前方距离,就是迷宫里的虚拟机器人一样。而且发现超声波抗干扰很强,测距准确。
(为什么开始不用这种方案,主要是因为麦昆的一个超声波就占用两个接口,而红外传感器两个占用两个接口)
现在加入mirco:bit扩展板,立即解决问题,只是需要上方MICRO:BIT把所接超声波传感器测得的距离及时无线发送给麦昆使用就好了。
迷宫全图:
根据迷宫10基本地形使用KT板,制作麦昆游我湖北随州曾侯乙墓地宫迷宫。(如下)
视频简介:
1、湖北省博物馆馆长简介编钟
2、跟随麦昆一起聆听2400多年前的编钟所奏国乐——“风一样的勇士”片段
走迷宫Mind+积木块代码:
进一步了解整个先秦中国的民乐器:
欢迎到随州,可随意敲一敲仿制编钟的:
勇闯“悬崖”:
自从麦昆勇敢成功地走了一圈曾侯乙墓“地宫”,同时身临其境地聆听了震惊世界的编钟之声~"风一样的勇士",越发士气高涨,准备挑战走“悬崖”!
虽然视频中没有跌落,实际中,你知道的,反反复复修改观察近百次,仍在不断完善中...
走“悬崖”Mind+代码:
备注:由于Mind+里传感器暂不支持SHARP0A41SK,但是支持SHARP0A21,因此通过学习SHARP0A21的代码来调整暂不存在的传感器SHARP0A41,并经过测试正确无误,所以这里只能给出纯代码,而无有效积木块代码。
#include <Maqueen_Motor.h>
Maqueen_Motor motor;
uint16_t get_gp2y41cm(uint8_t pin);
///////////////////////////////////////////
uint16_t get_gp2y41cm(uint8_t pin)
{
uint16_t value = analogRead(pin);
#if defined(NRF5)
value = value * 3.3 / 5.0;
#endif
value = value < 16? 16:value; // Modified
return 2076.0 / (value - 11.0); // Modified
}
///////////////////////////////////////////
void setup() {
delay(3000);
//Serial.begin(9600);
}
///////////////////////////////////////////
void loop() {
motor.motorRun(motor.LEFT,motor.CW,70);
motor.motorRun(motor.RIGHT,motor.CW,70);
if ((get_gp2y41cm(2) > 6)&&(get_gp2y41cm(1) <= 5)) {
motor.motorRun(motor.LEFT,motor.CW,70);
motor.motorRun(motor.RIGHT,motor.CW,0);
delay(300);
}
if ((get_gp2y41cm(2) <= 5)&&(get_gp2y41cm(1) > 6)) {
motor.motorRun(motor.LEFT,motor.CW,0);
motor.motorRun(motor.RIGHT,motor.CW,70);
delay(300);
}
if((get_gp2y41cm(1) > 6) && (get_gp2y41cm(2) > 6)){
motor.motorRun(motor.LEFT,motor.CCW,70);
motor.motorRun(motor.RIGHT,motor.CCW,70);
delay(500);
if(random(0, 2)==0){
motor.motorRun(motor.LEFT,motor.CW,0);
motor.motorRun(motor.RIGHT,motor.CW,70);
delay(300);
}else{
motor.motorRun(motor.LEFT,motor.CW,70);
motor.motorRun(motor.RIGHT,motor.CW,0);
delay(300);
}
}
//Serial.println(get_gp2y41cm(1));
//delay(700);
}
////////////////////////////////////////////
许培享2021.02.01
吴博士的留言很暖
edumaker2020.07.25
我看到了一个幸福的家庭和一颗有趣的心灵
许培享2021.02.01
谢谢博士先生!