mBot+LED点阵屏 给你一点表情看看 4 years ago

mBot是一款可编程、易操控和可扩展的小车,可以通过手机和红外遥控器进行操控。结合mBot萌萌的外形,加上LED点阵屏,mBot可以显示各种表情,并通过红外遥控器进行不同表情间的切换。

Part list

Constructing Steps

组装mBot和LED点阵屏

按照说明书组装mBot和LED点阵屏,注意连线,其中巡线模块接Port 2,超声波传感器接Port 3,LED点阵屏接Port 4。

用mBlock编程

mBlock是一款基于Scratch 2.0的图形化编程软件,通过拖动不同的图形化模块就能完成编程,没有任何编程基础也可以很快上手。

 

首先创建一个变量,通过点击位于Data&Blocks部分的Make a Variable按钮,创建一个名为num的变量,如下图所示,后面将会用到这个变量。

 

设定在LED点阵屏上超声波模块的两种工作模式,一种是直接显示超声波模块检测到的距离数据,另一种是根据不同的距离段显示不同的表情,通过红外遥控器上的按钮进行不同模式间的切换。

 

mBlock里面有一个非常方便的表情制作面板,点击下图的红圈部分即可弹出表情制作面板。

 

设定红外遥控器上的不同按钮来切换显示不同的表情。

最终mBlock程序见附件。

测试

先用USB连接mBot和电脑,选择合适的串口,控制板选择mBot,并安装固件。

 

固件安装完成后断开串口连接,切换到蓝牙或2.4G无线连接模式,点击程序,就可以开始测试了。

 

通过红外遥控器上的不同按钮,可以切换到不同的表情模式。

 

 

进阶,使用Arduino IDE编程

使用mBlock可以输出Arduino代码,如果你更习惯于在Arduino IDE里面编程,可以先用mBlock搭出程序的框架,然后输出Arduino代码,再做一些修改,这样省时省力。首先将mBlock里的程序开头部分替换为mBot Program, 切换到Arduino mode模式,选择Edit with Arduino IDE,然后就可以在Arduino IDE里面编辑代码了。

 

在Arduino代码里面,通过使用for循环改变LED的亮度,能够实现图案一闪一闪的效果,效果见下图。

 

Arduino源代码如下:

#include <Arduino.h>
#include <Wire.h>
#include <Servo.h>
#include <SoftwareSerial.h>

#include "mBot.h"
#include "MePort.h"
MeBoard myBoard(mBot);
#include "MeIR.h"
#include "MeUltrasonic.h"
#include "MeLEDMatrix.h"
#include "MeDCMotor.h"

double angle_rad = PI/180.0;
double angle_deg = 180.0/PI;
double num;
MeIR ir;
MeUltrasonic ultrasonic_3(3);
MeLEDMatrix ledMtx_4(4);
unsigned char drawBuffer[16];
unsigned char *drawTemp;
MeDCMotor motor(0);
char tempString[10];


void setup(){
    ir.begin();
    num = 2;
    Serial.begin(9600);
}

void loop(){
    
    if(ir.keyPressed(82)){ // key 8
        num = 2;
    }
    if(ir.keyPressed(74)){ // key 9
        num = 1;
    }
    if(((num)==( 1 ))){
        ledMtx_4.clearScreen();
        ledMtx_4.setColorIndex(1);
        ledMtx_4.setBrightness(3);
        dtostrf(ultrasonic_3.distanceCm(),2,2,tempString);
        Serial.print(tempString);
        Serial.println("cm");
        ledMtx_4.drawStr(0,7,tempString);
        delay(100);
    }
    if(((num)==(2))){
        if((ultrasonic_3.distanceCm()) < (15)){
            ledMtx_4.clearScreen();
            ledMtx_4.setColorIndex(1);
            ledMtx_4.setBrightness(6);
        drawTemp = new unsigned char[16]{0,0,0,0,32,34,36,8,4,34,32,32,0,0,0,0};
            memcpy(drawBuffer,drawTemp,16);
            free(drawTemp);
            ledMtx_4.drawBitmap(0,0,16,drawBuffer);
            delay(1000*0.2);
        }else{
            if((ultrasonic_3.distanceCm()) > (30)){
                ledMtx_4.clearScreen();
                ledMtx_4.setColorIndex(1);
                ledMtx_4.setBrightness(6);
            drawTemp = new unsigned char[16]{0,62,65,93,85,77,61,0,61,77,85,93,65,62,0,0};
                memcpy(drawBuffer,drawTemp,16);
                free(drawTemp);
                ledMtx_4.drawBitmap(0,0,16,drawBuffer);
                delay(1000*0.2);
            }else{
                ledMtx_4.clearScreen();
                ledMtx_4.setColorIndex(1);
                ledMtx_4.setBrightness(6);
            drawTemp = new unsigned char[16]{0,0,0,32,64,128,76,18,18,76,128,64,32,0,0,0};
                memcpy(drawBuffer,drawTemp,16);
                free(drawTemp);
                ledMtx_4.drawBitmap(0,0,16,drawBuffer);
                delay(1000*0.2);
            }
        }
    }
    if(ir.keyPressed(69)){ // key A
        Serial.println("got it");
        num = 0;
        ledMtx_4.clearScreen();
        ledMtx_4.setColorIndex(1);
        ledMtx_4.setBrightness(3);
        for(int16_t i=0; i<84; i++){
          ledMtx_4.drawStr(15-i,7,"Hello World");  
          delay(100);        
        }
        ledMtx_4.drawStr(3,7,"Hi");
    }
    if(ir.keyPressed(70)){ // key B
        num = 0;
        ledMtx_4.clearScreen();
        ledMtx_4.setColorIndex(1);
    drawTemp = new unsigned char[16]{0,0,0,0,48,72,68,34,68,72,48,0,0,0,0,0};
        memcpy(drawBuffer,drawTemp,16);
        free(drawTemp);
        // blink Bitmap
        ledMtx_4.drawBitmap(0,0,16,drawBuffer);
        for(uint8_t k=0; k<5; k++){
          for(uint8_t i=7;i>0;i--){
            ledMtx_4.setBrightness(i);
            delay(50);
          }
          for(uint8_t i=0;i<8;i++){
            ledMtx_4.setBrightness(i);
            delay(50);
          }                    
        }
    }
    if(ir.keyPressed(71)){ // key C
        num = 0;
        ledMtx_4.clearScreen();
        ledMtx_4.setColorIndex(1);
        ledMtx_4.setBrightness(6);
    drawTemp = new unsigned char[16]{0,0,0,0,0,36,0,129,66,60,0,0,0,0,0,0};
        memcpy(drawBuffer,drawTemp,16);
        free(drawTemp);
        ledMtx_4.drawBitmap(0,0,16,drawBuffer);
        delay(1000*1);
    }
    if(ir.keyPressed(68)){ // key D
        num = 0;
        ledMtx_4.clearScreen();
        ledMtx_4.setColorIndex(1);
        ledMtx_4.setBrightness(6);
    drawTemp = new unsigned char[16]{0,0,0,0,48,0,2,4,4,2,0,48,0,0,0,0};
        memcpy(drawBuffer,drawTemp,16);
        free(drawTemp);
        ledMtx_4.drawBitmap(0,0,16,drawBuffer);
        delay(1000*1);
    }
    if(ir.keyPressed(67)){ // key E
        num = 0;
        ledMtx_4.clearScreen();
        ledMtx_4.setColorIndex(1);
        ledMtx_4.setBrightness(6);
    drawTemp = new unsigned char[16]{0,0,0,0,32,64,36,2,2,36,64,32,0,0,0,0};
        memcpy(drawBuffer,drawTemp,16);
        free(drawTemp);
        ledMtx_4.drawBitmap(0,0,16,drawBuffer);
        delay(1000*1);
    }
    if(ir.keyPressed(13)){ // key F
        num = 0;
        ledMtx_4.clearScreen();
        ledMtx_4.setColorIndex(1);
        ledMtx_4.setBrightness(6);
    drawTemp = new unsigned char[16]{0,0,0,62,0,24,36,18,18,36,24,0,60,2,60,0};
        memcpy(drawBuffer,drawTemp,16);
        free(drawTemp);
        ledMtx_4.drawBitmap(0,0,16,drawBuffer);
        delay(1000*1);
    }
    if(ir.keyPressed(64)){ // key UP
        motor.move(1,100);
    }
    if(ir.keyPressed(25)){ // key DOWN
        motor.move(2,100);
    }
    if(ir.keyPressed(7)){ // key LEFT
        motor.move(3,100);
    }
    if(ir.keyPressed(9)){ // key RIGHT
        motor.move(4,100);
    }
    if(ir.keyPressed(24)){ // key 2
        motor.move(1,0);
    }
    ir.loop();
    
    
}

把Arduino代码上传到mBot,就可以开始玩了。

 

扩展玩法:表白神器什么的,或者利用mBot上的巡线模块,在表情面板上画个面包的图案,让它到达妹子那里,叫她一起吃饭,嘿嘿,想象力越大,玩法越多。

 

3
  • Project Difficulty Level
    Preliminary