手残党又来了,😊
话说昨天有个老师问我一个问题:如何判断麦昆现在是什么方向?(前进?后退?左转?右转?)要显示在Microbit板上。
我想了一下,认为这个问题很简单
麦昆的转向都是由程序控制的
在程序控制转向之前加一句显示代码不就可以解决了吗?
好像是解决了这个问题
但是我越想越不对
有些时候麦昆是可能出现一些随机方向的
比如:
在运动过程中遇到了外星人,外星人强制把麦昆人为转向了
又比如它遇到了一个美女麦昆,被迷得晕头转向了
……
总之有很多我们不可控的因素在导致我们的麦昆不知道是什么方向
那怎么办呢?
作为一个新时代的好青年,必须得有目标有方向
不能迷失方向
说做就做
其实这也是对我做扫地机器人路径规划的一个很好补充
步骤1 查找相关知识,确定思路
前后左右是一个相对方向,因此不能拿来作为定位
我首先考虑到的是用一个GPS定位传感器
上网搜索了一下相关知识和产品
应该都能解决这个问题
看到其中一个产品叫十轴惯导陀螺仪传感器
陀螺仪?
MICROBIT不是本身就带有电子罗盘吗?
那这不是放着现成的不用,反而舍近求远?
查了一下相关资料,绝对可以实现。
就这么办。
但是真正做的时候就发现行不通
因为MICROBIT要感知方向,必须要平放,而麦昆是竖着插的
那怎么办呢?
有了,再加一块Microbit板,专门来感知方向
然后将方向传送给麦昆,这样不就可以了
完美
材料清单
- 好青年麦昆一枚 X1 链接
- MICROBIT X1
步骤2 动手制作发射端
方法定好了,做起来就简单了
在麦昆身上绑一块MICROBIT板,注意接口方向要对着车头的方向
先给感知方向的MICROBIT板进行编程
我们先来了解一下基本原理
MICROBIT中可以读取指南针的朝向
它是一个角度值,具体如下
因此我们设置一个变量 fx ,用来读取指南针指向角度
当 fx=315度的时候,它就是指向北方(N)
当 fx>45度 并且 fx225度 并且 fx
#include <DFMicrobit_Radio.h>
#include <Microbit_Sensors.h>
#include <Microbit_Matrix.h>
double df_fx;
const uint8_t bitmap_ZmEZ[5] = {B10001,B11001,B10101,B10011,B10001};
const uint8_t bitmap_7XwX[5] = {B11110,B10000,B11110,B10000,B11110};
const uint8_t bitmap_npeC[5] = {B11111,B10000,B11111,B00001,B11111};
const uint8_t bitmap_miMs[5] = {B10101,B10101,B10101,B01010,B00000};
void setup() {
Sensors.calibrate();
Radio.turnOn();
Radio.setGroup(7);
}
void loop() {
df_fx = (Sensors.compassHeading());
if (((df_fx <= 45) || (df_fx >= 315))) {
Radio.send("N");
MMatrix.show(bitmap_ZmEZ);
}
if (((df_fx > 45) && (df_fx < 135))) {
Radio.send("E");
MMatrix.show(bitmap_7XwX);
}
if (((df_fx <= 225) && (df_fx >= 135))) {
Radio.send("S");
MMatrix.show(bitmap_npeC);
}
if (((df_fx > 225) && (df_fx < 315))) {
Radio.send("W");
MMatrix.show(bitmap_miMs);
}
delay(500);
}
注意:上传完之后系统会提示要对MICROBIT进行校准
至于怎么校准,MIND+会提示也会告诉你如何校准,我就不多说了
(插一句:以前用MIXLY,自从发现MIND+之后,越来越觉得MIND+好用)
自此发射端的程序就搞定了。
步骤3 制作接收端程序
下面是接收端程序了
原理很简单,让小麦昆以60的速度往前走
为什么是60呢?因为道路限速,麦昆守规矩(😊)
道路千万条,安全第一条……
遇到障碍物转向
然后无线电打开接收数据,把接收到的数据显示在LED上
代码如下
#include <DFMicrobit_Radio.h>
#include <Microbit_Matrix.h>
#include <Maqueen_Motor.h>
#include <DFRobot_URM10.h>
String df_fx2;
Maqueen_Motor motor;
DFRobot_URM10 urm10(1,2);
const uint8_t bitmap_EHfH[5] = {B10001,B11001,B10101,B10011,B10001};
const uint8_t bitmap_OXOn[5] = {B11110,B10000,B11110,B10000,B11110};
const uint8_t bitmap_Capa[5] = {B11111,B10000,B11111,B00001,B11111};
const uint8_t bitmap_OyOs[5] = {B10101,B10101,B10101,B01010,B00000};
void onRadioReceive(String message)
{
df_fx2 = message;
if ((df_fx2 == "N")) {
MMatrix.show(bitmap_EHfH);
}
if ((df_fx2 == "E")) {
MMatrix.show(bitmap_OXOn);
}
if ((df_fx2 == "S")) {
MMatrix.show(bitmap_Capa);
}
if ((df_fx2 == "W")) {
MMatrix.show(bitmap_OyOs);
}
}
void setup() {
Radio.turnOn();
Radio.setGroup(7);
MMatrix.clear();
digitalWrite(8,HIGH);
digitalWrite(12,HIGH);
Radio.setCallback(onRadioReceive);
}
void loop() {
motor.motorRun(motor.LEFT,motor.CW,60);
motor.motorRun(motor.RIGHT,motor.CW,60);
if (((urm10.getDistanceCM()) <= 10)) {
motor.motorRun(motor.LEFT,motor.CW,60);
motor.motorRun(motor.RIGHT,motor.CW,0);
delay(1000);
motor.motorRun(motor.LEFT,motor.CW,60);
motor.motorRun(motor.RIGHT,motor.CW,60);
}
}
步骤4 测试
测试一切正常,可以看到小麦昆时时刻刻很清楚知道自己是谁,自己在哪,自己该去哪(😊)
果然是有目标有方向的时代好麦昆
这段程序虽然简单
但是它其实能解决很多问题
比如我们要让麦昆在已知环境中做路径规划的时候就可以采用这种方式
能快速的规划好我们需要的代码
比起其他方式要快很多。
另外我们还可以利用这个程序,解决麦昆如何去到某个地方,如何回到某个地方
……
当然还有更多的用途值得我们去发掘
刚接触MICROBIT不久,之前不觉得它有多强大
但是越学习越发现它的强大
感谢小麦昆给我的启发
我也要向小麦昆学习,做一个有目标有方向的时代好青年
袁家栋1233212020.01.31
沙发