[RESOURCE] mBot Ranger NOVA Project Version 2.1.1


#1

NOVA - Navigational Optimized Vehicle Arduino

NOVA is an advanced programming project for the mBot Ranger that allows for seamless navigation and diagnostics. To get the most out of NOVA, you will need the following accessories and sensors:

  • Makeblock mBot LED Matrix (8x16)
  • Me RGB LED
  • Me Ultrasonic Sensor
  • Me AudioPlayer
  • Me Infrared Receiver Decode Module
  • Makeblock Bluetooth Controller

Please note that the NOVA Programming only works on the mBot Ranger. You can easily import the code into the Arduino section of mBlock 5 to get started. NOVA also includes a diagnostic mode, accessible via a special combination on the Makeblock Bluetooth Controller: Right Thumb + Up + Left.

Patch Notes for NOVA Version 2.1.1:

  • Removed redundant variables
  • Improved diagnostic usability
  • Enhanced program performance

Make sure to tune up your mBot Ranger regularly for optimal performance!

#include <Arduino.h>
#include <Wire.h>
#include <SoftwareSerial.h>
#include <MeAuriga.h>
#include <MePS2.h>
#include "src/MeAudioPlayer.h"

MeLightSensor lightsensor_12(12);
MeBuzzer buzzer;
MeLEDMatrix ledMtx_6(6);
unsigned char drawBuffer[16];
unsigned char *drawTemp;
MeDCMotor motor_1(1);
MeRGBLed rgbled_0(0, 12);
MeEncoderOnBoard Encoder_1(SLOT1);
MeEncoderOnBoard Encoder_2(SLOT2);
MeRGBLed rgbled_7(7, 4);
MeUltrasonicSensor ultrasonic_8(8);
MeRGBLed rgbled_6(6, 4);
MeInfraredReceiver ir_10(10);
MeAudioPlayer meAudioPlayer(0);

float inNOVADiag = 0;

MePS2 MePS2(PORT_16);
void isr_process_encoder1(void)
{
  if(digitalRead(Encoder_1.getPortB()) == 0){
    Encoder_1.pulsePosMinus();
  }else{
    Encoder_1.pulsePosPlus();
  }
}
void isr_process_encoder2(void)
{
  if(digitalRead(Encoder_2.getPortB()) == 0){
    Encoder_2.pulsePosMinus();
  }else{
    Encoder_2.pulsePosPlus();
  }
}
void move(int direction, int speed)
{
  int leftSpeed = 0;
  int rightSpeed = 0;
  if(direction == 1){
    leftSpeed = -speed;
    rightSpeed = speed;
  }else if(direction == 2){
    leftSpeed = speed;
    rightSpeed = -speed;
  }else if(direction == 3){
    leftSpeed = -speed;
    rightSpeed = -speed;
  }else if(direction == 4){
    leftSpeed = speed;
    rightSpeed = speed;
  }
  Encoder_1.setTarPWM(leftSpeed);
  Encoder_2.setTarPWM(rightSpeed);
}

void _delay(float seconds) {
  if(seconds < 0.0){
    seconds = 0.0;
  }
  long endTime = millis() + seconds * 1000;
  while(millis() < endTime) _loop();
}

void setup() {
  randomSeed((unsigned long)(lightsensor_12.read() * 123456));
  buzzer.setpin(45);
  ledMtx_6.setColorIndex(1);
  ledMtx_6.setBrightness(6);
  rgbled_0.setpin(44);
  rgbled_0.fillPixelsBak(0, 2, 1);
  MePS2.begin(115200);
  TCCR1A = _BV(WGM10);
  TCCR1B = _BV(CS11) | _BV(WGM12);
  TCCR2A = _BV(WGM21) | _BV(WGM20);
  TCCR2B = _BV(CS21);
  attachInterrupt(Encoder_1.getIntNum(), isr_process_encoder1, RISING);
  attachInterrupt(Encoder_2.getIntNum(), isr_process_encoder2, RISING);
  rgbled_7.fillPixelsBak(0, 2, 1);
  rgbled_6.fillPixelsBak(0, 2, 1);
  ir_10.begin();
  meAudioPlayer.PlayerInit();
  _delay(0.1);
  Encoder_1.setPulse(9);
  Encoder_1.setRatio(39.267);
  Encoder_1.setPosPid(1.8,0,1.2);
  Encoder_1.setSpeedPid(0.18,0,0);
  Encoder_2.setPulse(9);
  Encoder_2.setRatio(39.267);
  Encoder_2.setPosPid(1.8,0,1.2);
  Encoder_2.setSpeedPid(0.18,0,0);

  buzzer.tone(3520, 0.1 * 1000);
  _delay(0.02);

  drawTemp = new unsigned char[16]{28,16,28,0,28,20,28,0,16,8,4,24,0,28,40,28};
  memcpy(drawBuffer, drawTemp, 16);
  free(drawTemp);
  ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
  _delay(5);

  buzzer.tone(3520, 0.1 * 1000);
  _delay(0.02);

  motor_1.run(1*100/100.0*255);
  for(int count=0;count<20;count++){

    drawTemp = new unsigned char[16]{0,0,0,0,0,0,60,60,60,56,0,0,0,0,0,0};
    memcpy(drawBuffer, drawTemp, 16);
    free(drawTemp);
    ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
    _delay(0.1);
    ledMtx_6.clearScreen();

    drawTemp = new unsigned char[16]{0,0,0,0,0,0,60,60,56,60,0,0,0,0,0,0};
    memcpy(drawBuffer, drawTemp, 16);
    free(drawTemp);
    ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
    _delay(0.1);
    ledMtx_6.clearScreen();

    drawTemp = new unsigned char[16]{0,0,0,0,0,0,60,56,60,60,0,0,0,0,0,0};
    memcpy(drawBuffer, drawTemp, 16);
    free(drawTemp);
    ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
    _delay(0.1);
    ledMtx_6.clearScreen();

    drawTemp = new unsigned char[16]{0,0,0,0,0,0,56,60,60,60,0,0,0,0,0,0};
    memcpy(drawBuffer, drawTemp, 16);
    free(drawTemp);
    ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
    _delay(0.1);
    ledMtx_6.clearScreen();

    drawTemp = new unsigned char[16]{0,0,0,0,0,0,52,60,60,60,0,0,0,0,0,0};
    memcpy(drawBuffer, drawTemp, 16);
    free(drawTemp);
    ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
    _delay(0.1);
    ledMtx_6.clearScreen();

    drawTemp = new unsigned char[16]{0,0,0,0,0,0,44,60,60,60,0,0,0,0,0,0};
    memcpy(drawBuffer, drawTemp, 16);
    free(drawTemp);
    ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
    _delay(0.1);
    ledMtx_6.clearScreen();

    drawTemp = new unsigned char[16]{0,0,0,0,0,0,28,60,60,60,0,0,0,0,0,0};
    memcpy(drawBuffer, drawTemp, 16);
    free(drawTemp);
    ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
    _delay(0.1);
    ledMtx_6.clearScreen();

    drawTemp = new unsigned char[16]{0,0,0,0,0,0,60,28,60,60,0,0,0,0,0,0};
    memcpy(drawBuffer, drawTemp, 16);
    free(drawTemp);
    ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
    _delay(0.1);
    ledMtx_6.clearScreen();

    drawTemp = new unsigned char[16]{0,0,0,0,0,0,60,60,28,60,0,0,0,0,0,0};
    memcpy(drawBuffer, drawTemp, 16);
    free(drawTemp);
    ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
    _delay(0.1);
    ledMtx_6.clearScreen();

    drawTemp = new unsigned char[16]{0,0,0,0,0,0,60,60,60,28,0,0,0,0,0,0};
    memcpy(drawBuffer, drawTemp, 16);
    free(drawTemp);
    ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
    _delay(0.1);
    ledMtx_6.clearScreen();

    drawTemp = new unsigned char[16]{0,0,0,0,0,0,60,60,60,44,0,0,0,0,0,0};
    memcpy(drawBuffer, drawTemp, 16);
    free(drawTemp);
    ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
    _delay(0.1);
    ledMtx_6.clearScreen();

    drawTemp = new unsigned char[16]{0,0,0,0,0,0,60,60,60,52,0,0,0,0,0,0};
    memcpy(drawBuffer, drawTemp, 16);
    free(drawTemp);
    ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
    _delay(0.1);
    ledMtx_6.clearScreen();
  }
  inNOVADiag = 0;

  motor_1.run(1*0/100.0*255);

  drawTemp = new unsigned char[16]{0,0,0,0,0,0,60,60,60,60,0,0,0,0,0,0};
  memcpy(drawBuffer, drawTemp, 16);
  free(drawTemp);
  ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
  _delay(0.1);
  ledMtx_6.clearScreen();

  drawTemp = new unsigned char[16]{0,0,0,5,0,0,60,60,60,36,0,0,2,128,0,0};
  memcpy(drawBuffer, drawTemp, 16);
  free(drawTemp);
  ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
  _delay(0.1);
  ledMtx_6.clearScreen();

  drawTemp = new unsigned char[16]{0,128,0,16,1,0,20,44,60,36,0,0,0,8,128,1};
  memcpy(drawBuffer, drawTemp, 16);
  free(drawTemp);
  ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
  _delay(0.1);
  ledMtx_6.clearScreen();

  drawTemp = new unsigned char[16]{2,0,0,40,2,0,64,36,56,36,0,2,0,64,18,1};
  memcpy(drawBuffer, drawTemp, 16);
  free(drawTemp);
  ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
  _delay(0.1);
  ledMtx_6.clearScreen();

  drawTemp = new unsigned char[16]{0,0,144,0,4,0,32,1,0,0,1,16,0,0,10,0};
  memcpy(drawBuffer, drawTemp, 16);
  free(drawTemp);
  ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
  _delay(0.1);
  ledMtx_6.clearScreen();

  drawTemp = new unsigned char[16]{0,0,32,4,0,0,8,0,1,0,0,0,1,0,16,0};
  memcpy(drawBuffer, drawTemp, 16);
  free(drawTemp);
  ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
  _delay(0.1);
  ledMtx_6.clearScreen();

  drawTemp = new unsigned char[16]{0,0,32,2,4,0,0,0,0,0,0,0,0,2,0,0};
  memcpy(drawBuffer, drawTemp, 16);
  free(drawTemp);
  ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
  _delay(0.1);
  ledMtx_6.clearScreen();

  drawTemp = new unsigned char[16]{0,0,0,1,2,0,0,0,0,0,0,0,1,0,0,0};
  memcpy(drawBuffer, drawTemp, 16);
  free(drawTemp);
  ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
  _delay(0.1);
  ledMtx_6.clearScreen();

  drawTemp = new unsigned char[16]{0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0};
  memcpy(drawBuffer, drawTemp, 16);
  free(drawTemp);
  ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
  _delay(0.1);
  ledMtx_6.clearScreen();

  drawTemp = new unsigned char[16]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  memcpy(drawBuffer, drawTemp, 16);
  free(drawTemp);
  ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
  _delay(0.1);
  ledMtx_6.clearScreen();

  rgbled_0.setColor(0,0,0,0);
  rgbled_0.show();
  while(1) {
      if(inNOVADiag == 0.000000){
        if(MePS2.MeAnalog(6) > 0){

          move(4, 100 / 100.0 * 255);
          _delay(0.1);
          move(4, 0);

        }
        if(MePS2.MeAnalog(6) < 0){

          move(3, 100 / 100.0 * 255);
          _delay(0.1);
          move(3, 0);

        }
        if(MePS2.MeAnalog(4) > 0){

          move(1, 100 / 100.0 * 255);
          _delay(0.1);
          move(1, 0);

        }
        if(MePS2.MeAnalog(4) < 0){

          move(2, 100 / 100.0 * 255);
          _delay(0.1);
          move(2, 0);

        }
        if(MePS2.ButtonPressed(1)){
          while(!(MePS2.ButtonPressed(1)))
          {
            _loop();

            rgbled_7.setColor(3,  238,255,0);
            rgbled_7.show();
            _delay(0.25);
            rgbled_7.setColor(3, 0, 0, 0);
            rgbled_7.show();
            _delay(0.25);

          }

        }
        if(MePS2.ButtonPressed(5)){
          while(!(MePS2.ButtonPressed(5)))
          {
            _loop();

            rgbled_7.setColor(1,  238,255,0);
            rgbled_7.show();
            _delay(0.25);
            rgbled_7.setColor(1, 0, 0, 0);
            rgbled_7.show();
            _delay(0.25);

          }

        }
        if(MePS2.ButtonPressed(9)){

          drawTemp = new unsigned char[16]{64,160,64,0,0,0,0,0,0,0,0,0,0,0,0,0};
          memcpy(drawBuffer, drawTemp, 16);
          free(drawTemp);
          ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);

          rgbled_7.setColor(0,  255,255,255);
          rgbled_7.show();

        }
        if(MePS2.ButtonPressed(18)){

          motor_1.run(1*0/100.0*255);

          drawTemp = new unsigned char[16]{64,160,78,17,17,14,0,31,20,16,0,31,20,16,0,0};
          memcpy(drawBuffer, drawTemp, 16);
          free(drawTemp);
          ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);

          rgbled_7.setColor(0,  0,0,0);
          rgbled_7.show();
          _delay(1);
          ledMtx_6.clearScreen();

        }
        if(MePS2.ButtonPressed(12)){

          drawTemp = new unsigned char[16]{96,144,144,96,0,0,0,0,0,0,0,0,0,0,0,0};
          memcpy(drawBuffer, drawTemp, 16);
          free(drawTemp);
          ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);

          rgbled_0.setColor(0,255,255,255);
          rgbled_0.show();

        }
        if(MePS2.ButtonPressed(13)){

          drawTemp = new unsigned char[16]{96,144,144,96,28,34,34,28,0,62,40,32,0,62,40,32};
          memcpy(drawBuffer, drawTemp, 16);
          free(drawTemp);
          ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);

          rgbled_0.setColor(0,0,0,0);
          rgbled_0.show();
          _delay(1);
          ledMtx_6.clearScreen();

        }
        if(MePS2.ButtonPressed(10)){

          drawTemp = new unsigned char[16]{127,80,32,0,7,4,4,0,7,5,7,0,5,2,5,0};
          memcpy(drawBuffer, drawTemp, 16);
          free(drawTemp);
          ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
          _delay(1);
          while(!(MePS2.ButtonPressed(18)))
          {
            _loop();
            if(ultrasonic_8.distanceCm() < 25){

              move(4, 50 / 100.0 * 255);
              _delay(1);
              move(4, 0);

            }else{

              move(1, 60 / 100.0 * 255);

              ledMtx_6.showNum(ultrasonic_8.distanceCm(), 3);

            }

          }
          Encoder_1.setTarPWM(0);
          Encoder_2.setTarPWM(0);
          _delay(0.5);
          ledMtx_6.drawStr(0, 0 + 7, String("off").c_str());
          _delay(1);
          ledMtx_6.clearScreen();

        }
        if(MePS2.ButtonPressed(3)){

          drawTemp = new unsigned char[16]{0,0,8,12,10,10,10,12,18,33,0,0,0,0,0,0};
          memcpy(drawBuffer, drawTemp, 16);
          free(drawTemp);
          ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);

          rgbled_0.setColor(0,238,255,0);
          rgbled_0.show();

          buzzer.tone(880, 0.25 * 1000);
          _delay(0.02);

          rgbled_0.setColor(0,0,0,0);
          rgbled_0.show();
          ledMtx_6.clearScreen();

        }
        if(MePS2.ButtonPressed(7)){

          drawTemp = new unsigned char[16]{0,0,1,3,5,9,17,33,91,33,17,9,5,3,1,0};
          memcpy(drawBuffer, drawTemp, 16);
          free(drawTemp);
          ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);

          rgbled_0.setColor(0,255,0,0);
          rgbled_0.show();

          rgbled_6.setColor(0,  255,0,0);
          rgbled_6.show();
          _delay(1);
          while(!(MePS2.ButtonPressed(7)))
          {
            _loop();

            buzzer.tone(3951, 0.5 * 1000);
            _delay(0.02);

            buzzer.tone(3520, 0.5 * 1000);
            _delay(0.02);

          }
          _delay(1);

          rgbled_0.setColor(0,0,0,0);
          rgbled_0.show();

          rgbled_6.setColor(0,  0,0,0);
          rgbled_6.show();
          ledMtx_6.clearScreen();

        }
        if(MePS2.ButtonPressed(11)){

          buzzer.tone(494, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(494, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(523, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(587, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(587, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(523, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(494, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(440, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(392, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(392, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(440, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(494, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(494, 0.65 * 1000);
          _delay(0.02);

          buzzer.tone(440, 0.25 * 1000);
          _delay(0.02);

          buzzer.tone(440, 1 * 1000);
          _delay(0.02);

          buzzer.tone(494, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(494, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(523, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(587, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(587, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(523, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(494, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(440, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(392, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(392, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(440, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(494, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(440, 0.65 * 1000);
          _delay(0.02);

          buzzer.tone(392, 0.25 * 1000);
          _delay(0.02);

          buzzer.tone(392, 1 * 1000);
          _delay(0.02);

          buzzer.tone(440, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(440, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(494, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(392, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(440, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(494, 0.25 * 1000);
          _delay(0.02);

          buzzer.tone(523, 0.25 * 1000);
          _delay(0.02);

          buzzer.tone(494, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(392, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(440, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(494, 0.25 * 1000);
          _delay(0.02);

          buzzer.tone(523, 0.25 * 1000);
          _delay(0.02);

          buzzer.tone(494, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(440, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(392, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(440, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(147, 1 * 1000);
          _delay(0.02);

          buzzer.tone(494, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(494, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(523, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(587, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(587, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(523, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(494, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(440, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(392, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(392, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(440, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(494, 0.5 * 1000);
          _delay(0.02);

          buzzer.tone(440, 0.65 * 1000);
          _delay(0.02);

          buzzer.tone(392, 0.25 * 1000);
          _delay(0.02);

          buzzer.tone(392, 1 * 1000);
          _delay(0.02);

          move(4, 100 / 100.0 * 255);
          _delay(3);
          move(4, 0);

        }
        if(ir_10.getCode() == 177.000000){

          rgbled_0.setColor(0,255,0,0);
          rgbled_0.show();

          drawTemp = new unsigned char[16]{0,0,0,0,0,60,98,82,74,70,60,0,0,0,0,0};
          memcpy(drawBuffer, drawTemp, 16);
          free(drawTemp);
          ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);

          buzzer.tone(3951, 0.25 * 1000);
          _delay(0.02);

          buzzer.tone(3951, 0.25 * 1000);
          _delay(0.02);

          buzzer.tone(3951, 0.25 * 1000);
          _delay(0.02);

        }
        if(ir_10.getCode() == 277.000000){
          meAudioPlayer.playMusicFileName(String("Rescued"));
          _delay(0.1);

          drawTemp = new unsigned char[16]{0,0,0,0,0,60,98,82,74,70,60,0,0,0,0,0};
          memcpy(drawBuffer, drawTemp, 16);
          free(drawTemp);
          ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
          _delay(6);
          ledMtx_6.clearScreen();

        }
        if(MePS2.ButtonPressed(20)){
          meAudioPlayer.setMusicPlayMode(0);
          _delay(0.1);

          meAudioPlayer.setMusicVolume(100);
          _delay(0.1);
          while(!(ir_10.getCode() == 69.000000))
          {
            _loop();

            drawTemp = new unsigned char[16]{0,0,0,0,0,0,60,60,60,56,0,0,0,0,0,0};
            memcpy(drawBuffer, drawTemp, 16);
            free(drawTemp);
            ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
            _delay(0.1);
            ledMtx_6.clearScreen();

            drawTemp = new unsigned char[16]{0,0,0,0,0,0,60,60,56,60,0,0,0,0,0,0};
            memcpy(drawBuffer, drawTemp, 16);
            free(drawTemp);
            ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
            _delay(0.1);
            ledMtx_6.clearScreen();

            drawTemp = new unsigned char[16]{0,0,0,0,0,0,60,56,60,60,0,0,0,0,0,0};
            memcpy(drawBuffer, drawTemp, 16);
            free(drawTemp);
            ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
            _delay(0.1);
            ledMtx_6.clearScreen();

            drawTemp = new unsigned char[16]{0,0,0,0,0,0,56,60,60,60,0,0,0,0,0,0};
            memcpy(drawBuffer, drawTemp, 16);
            free(drawTemp);
            ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
            _delay(0.1);
            ledMtx_6.clearScreen();

            drawTemp = new unsigned char[16]{0,0,0,0,0,0,52,60,60,60,0,0,0,0,0,0};
            memcpy(drawBuffer, drawTemp, 16);
            free(drawTemp);
            ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
            _delay(0.1);
            ledMtx_6.clearScreen();

            drawTemp = new unsigned char[16]{0,0,0,0,0,0,44,60,60,60,0,0,0,0,0,0};
            memcpy(drawBuffer, drawTemp, 16);
            free(drawTemp);
            ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
            _delay(0.1);
            ledMtx_6.clearScreen();

            drawTemp = new unsigned char[16]{0,0,0,0,0,0,28,60,60,60,0,0,0,0,0,0};
            memcpy(drawBuffer, drawTemp, 16);
            free(drawTemp);
            ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
            _delay(0.1);
            ledMtx_6.clearScreen();

            drawTemp = new unsigned char[16]{0,0,0,0,0,0,60,28,60,60,0,0,0,0,0,0};
            memcpy(drawBuffer, drawTemp, 16);
            free(drawTemp);
            ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
            _delay(0.1);
            ledMtx_6.clearScreen();

            drawTemp = new unsigned char[16]{0,0,0,0,0,0,60,60,28,60,0,0,0,0,0,0};
            memcpy(drawBuffer, drawTemp, 16);
            free(drawTemp);
            ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
            _delay(0.1);
            ledMtx_6.clearScreen();

            drawTemp = new unsigned char[16]{0,0,0,0,0,0,60,60,60,28,0,0,0,0,0,0};
            memcpy(drawBuffer, drawTemp, 16);
            free(drawTemp);
            ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
            _delay(0.1);
            ledMtx_6.clearScreen();

            drawTemp = new unsigned char[16]{0,0,0,0,0,0,60,60,60,44,0,0,0,0,0,0};
            memcpy(drawBuffer, drawTemp, 16);
            free(drawTemp);
            ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
            _delay(0.1);
            ledMtx_6.clearScreen();

            drawTemp = new unsigned char[16]{0,0,0,0,0,0,60,60,60,52,0,0,0,0,0,0};
            memcpy(drawBuffer, drawTemp, 16);
            free(drawTemp);
            ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
            _delay(0.1);
            ledMtx_6.clearScreen();

          }
          meAudioPlayer.playMusicFileName(String("Around The World"));
          _delay(0.1);

        }
        if((MePS2.ButtonPressed(21))  &&  ((MePS2.ButtonPressed(16))  &&  (MePS2.ButtonPressed(14)))){
          _delay(1);
          inNOVADiag += 1;
          for(int count9=0;count9<2;count9++){

            drawTemp = new unsigned char[16]{28,16,28,0,28,20,28,0,16,8,4,24,0,28,40,28};
            memcpy(drawBuffer, drawTemp, 16);
            free(drawTemp);
            ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
            _delay(1);

            drawTemp = new unsigned char[16]{124,68,40,16,0,124,0,60,80,60,0,56,68,84,84,8};
            memcpy(drawBuffer, drawTemp, 16);
            free(drawTemp);
            ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
            _delay(1);
          }

        }

      }
      if(inNOVADiag == 1.000000){
        while(!(inNOVADiag == 0.000000))
        {
          _loop();
          if(MePS2.ButtonPressed(18)){
            for(int count13=0;count13<2;count13++){

              drawTemp = new unsigned char[16]{127,73,73,65,0,5,2,5,0,47,0,0,16,127,16,0};
              memcpy(drawBuffer, drawTemp, 16);
              free(drawTemp);
              ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
              _delay(1);
              ledMtx_6.clearScreen();

              drawTemp = new unsigned char[16]{124,68,40,16,0,124,0,60,80,60,0,56,68,84,84,8};
              memcpy(drawBuffer, drawTemp, 16);
              free(drawTemp);
              ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
              _delay(1);
              ledMtx_6.clearScreen();
            }
            inNOVADiag = 0;

          }
          if(MePS2.ButtonPressed(9)){
            for(int count14=0;count14<2;count14++){

              drawTemp = new unsigned char[16]{127,80,32,15,8,8,0,6,9,9,6,0,9,6,6,9};
              memcpy(drawBuffer, drawTemp, 16);
              free(drawTemp);
              ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
              _delay(1);
              ledMtx_6.clearScreen();

              drawTemp = new unsigned char[16]{64,126,64,0,126,82,66,0,34,82,76,0,64,126,64,0};
              memcpy(drawBuffer, drawTemp, 16);
              free(drawTemp);
              ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
              _delay(1);
              ledMtx_6.clearScreen();
            }
            while(!(MePS2.ButtonPressed(9)))
            {
              _loop();

              drawTemp = new unsigned char[16]{62,40,16,6,4,4,0,62,42,34,0,62,42,34,0,0};
              memcpy(drawBuffer, drawTemp, 16);
              free(drawTemp);
              ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
              _delay(1);
              ledMtx_6.clearScreen();

              drawTemp = new unsigned char[16]{0,18,42,42,36,0,0,34,126,2,0,0,0,0,0,0};
              memcpy(drawBuffer, drawTemp, 16);
              free(drawTemp);
              ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
              _delay(1);
              ledMtx_6.clearScreen();

            }
            while(!(ultrasonic_8.distanceCm() < 15))
            {
              _loop();

              move(1, 50 / 100.0 * 255);

            }
            Encoder_1.setTarPWM(0);
            Encoder_2.setTarPWM(0);
            _delay(0.5);

            drawTemp = new unsigned char[16]{0,8,4,8,16,32,8,4,8,16,32,8,4,8,16,32};
            memcpy(drawBuffer, drawTemp, 16);
            free(drawTemp);
            ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
            _delay(1);
            ledMtx_6.clearScreen();

            drawTemp = new unsigned char[16]{124,68,40,16,0,124,0,60,80,60,0,56,68,84,84,8};
            memcpy(drawBuffer, drawTemp, 16);
            free(drawTemp);
            ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);

          }
          if(MePS2.ButtonPressed(12)){

            drawTemp = new unsigned char[16]{0,60,32,60,32,60,0,60,36,60,0,32,60,32,4,0};
            memcpy(drawBuffer, drawTemp, 16);
            free(drawTemp);
            ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);

            move(1, 50 / 100.0 * 255);
            _delay(1);
            move(1, 0);

            move(2, 50 / 100.0 * 255);
            _delay(1);
            move(2, 0);

            move(3, 50 / 100.0 * 255);
            _delay(1);
            move(3, 0);

            move(4, 50 / 100.0 * 255);
            _delay(1);
            move(4, 0);

            drawTemp = new unsigned char[16]{0,126,74,74,66,0,14,8,14,0,14,10,10,0,2,0};
            memcpy(drawBuffer, drawTemp, 16);
            free(drawTemp);
            ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);

            Encoder_1.move(-1*1000,abs(180));
            _delay(5);

            Encoder_1.move(1*1000,abs(180));
            _delay(5);

            Encoder_2.move(-1*1000,abs(180));
            _delay(5);

            Encoder_2.move(1*1000,abs(180));
            _delay(5);

            drawTemp = new unsigned char[16]{124,68,40,16,0,124,0,60,80,60,0,56,68,84,84,8};
            memcpy(drawBuffer, drawTemp, 16);
            free(drawTemp);
            ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);

          }
          if(MePS2.ButtonPressed(10)){
            for(int count15=0;count15<2;count15++){

              drawTemp = new unsigned char[16]{36,84,84,24,0,56,68,68,56,0,120,4,4,120,0,0};
              memcpy(drawBuffer, drawTemp, 16);
              free(drawTemp);
              ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
              _delay(0.5);
              ledMtx_6.clearScreen();

              drawTemp = new unsigned char[16]{0,14,8,14,0,14,10,62,0,0,0,0,0,0,0,0};
              memcpy(drawBuffer, drawTemp, 16);
              free(drawTemp);
              ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
              _delay(0.5);
              ledMtx_6.clearScreen();

              drawTemp = new unsigned char[16]{64,126,64,0,126,82,66,0,34,82,76,0,64,126,64,0};
              memcpy(drawBuffer, drawTemp, 16);
              free(drawTemp);
              ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
              _delay(1);
              ledMtx_6.clearScreen();
            }
            meAudioPlayer.setMusicPlayMode(0);
            _delay(0.1);

            meAudioPlayer.setMusicVolume(100);
            _delay(0.1);
            meAudioPlayer.playMusicFileName(String("T001"));
            _delay(0.1);
            while(!(MePS2.ButtonPressed(9)))
            {
              _loop();

              drawTemp = new unsigned char[16]{60,66,66,66,60,0,126,24,36,0,72,85,36,0,0,0};
              memcpy(drawBuffer, drawTemp, 16);
              free(drawTemp);
              ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
              _delay(1);
              ledMtx_6.clearScreen();

              drawTemp = new unsigned char[16]{62,40,16,6,4,4,0,62,42,34,0,62,42,34,0,0};
              memcpy(drawBuffer, drawTemp, 16);
              free(drawTemp);
              ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
              _delay(1);
              ledMtx_6.clearScreen();

              drawTemp = new unsigned char[16]{0,18,42,42,36,0,0,34,126,2,0,0,0,0,0,0};
              memcpy(drawBuffer, drawTemp, 16);
              free(drawTemp);
              ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
              _delay(1);
              ledMtx_6.clearScreen();

            }
            meAudioPlayer.stopMusic();
            _delay(0.1);

            drawTemp = new unsigned char[16]{124,68,40,16,0,124,0,60,80,60,0,56,68,84,84,8};
            memcpy(drawBuffer, drawTemp, 16);
            free(drawTemp);
            ledMtx_6.drawBitmap(0, 0, 16, drawBuffer);
            _delay(1);

          }

        }

      }

      _loop();
  }

}

void _loop() {
  MePS2.loop();
  Encoder_1.loop();
  Encoder_2.loop();
  ir_10.loop();
}

void loop() {
  _loop();
}