Snímače robota zo súpravy mBot Explorer Kit

Opäť zdravím nadšencov robotiky a programovania hľadajúcich odpoveď na otázku, ako použiť snímače nachádzajúce sa v súprave mBot Explorer Kit. Konkrétne sa jedná o snímače čiary a vzdialenosti, ktoré vám predvediem v praxi.

Ná umocnenie výsledného efektu som zapojil do hry aj dve RGB LED diódy a bzučiak riadiacej dosky mCore bez Bluetooth modulu. Taktiež som nezabudol pripojiť displej Me LED Matrix na port 1 konektora RJ25 zmienenej dosky pomocou prepojovacieho kábla s konektormi RJ25 (6P6C).

Robot mBot sleduje čiaru

Snímač čiary Me Line Follower sa pripevňuje dvomi skrutkami M4 na prednú časť spodnej steny robota zo súpravy mBot Explorer Kit spolu so smerovým kolieskom, čo umožňuje optimálny pohyb robota pri sledovaní čiary. Na pripojenie tohto snímača k portu 2 konektora RJ25 riadiacej dosky mCore som zase použil prepojovací kábel s konektormi RJ25.

Skôr než som prešiel k samotnej tvorbe programu na sledovanie čiary, zistil som aké hodnoty vykazuje tento snímač na čiare a mimo nej. Ďalej mi už nič nebránilo vytvoriť požadovaný program v platforme Makeblock mBlock 5 (s pridaným zariadením mBot) a následne ho otestovať, čím som získal  jeho finálnu verziu:

Program Arduino C – sledovanie čiary

// generated by mBlock5 for mBot
// codes make you happy

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

MeRGBLed rgbled_7(7, 2);
MeLEDMatrix ledMtx_1(1);
unsigned char drawBuffer[16];
unsigned char *drawTemp;
MeBuzzer buzzer;
MeLineFollower linefollower_2(2);
MeDCMotor motor_9(9);
MeDCMotor motor_10(10);

float tla_C4_8D_C3_ADtko = 0;

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;
  }
  motor_9.run((9) == M1 ? -(leftSpeed) : (leftSpeed));
  motor_10.run((10) == M1 ? -(rightSpeed) : (rightSpeed));
}

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

void setup() {
  pinMode(A7, INPUT);
  rgbled_7.fillPixelsBak(0, 2, 1);
  ledMtx_1.setColorIndex(1);
  ledMtx_1.setBrightness(6);
  while(!((0 ^ (analogRead(A7) > 10 ? 0 : 1))))
  {
    _loop();
  }

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

  drawTemp = new unsigned char[16]{0,24,36,66,129,129,66,36,24,24,36,66,66,36,24,0};
  memcpy(drawBuffer, drawTemp, 16);
  free(drawTemp);
  ledMtx_1.drawBitmap(0, 0, 16, drawBuffer);
  _delay(1);
  ledMtx_1.clearScreen();

  buzzer.tone(349, 0.2 * 1000);
  _delay(0.02);
  while(1) {
      if(linefollower_2.readSensors() == 0.000000){

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

          drawTemp = new unsigned char[16]{0,0,120,252,252,120,0,0,0,0,120,252,252,120,0,0};
          memcpy(drawBuffer, drawTemp, 16);
          free(drawTemp);
          ledMtx_1.drawBitmap(0, 0, 16, drawBuffer);

          move(1, 40 / 100.0 * 255);

      }
      if(linefollower_2.readSensors() == 1.000000){

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

          drawTemp = new unsigned char[16]{0,0,120,252,252,120,0,0,0,0,120,132,132,120,0,0};
          memcpy(drawBuffer, drawTemp, 16);
          free(drawTemp);
          ledMtx_1.drawBitmap(0, 0, 16, drawBuffer);

          move(3, 40 / 100.0 * 255);

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

      }
      if(linefollower_2.readSensors() == 3.000000){

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

          drawTemp = new unsigned char[16]{0,0,120,132,132,120,0,0,0,0,120,252,252,120,0,0};
          memcpy(drawBuffer, drawTemp, 16);
          free(drawTemp);
          ledMtx_1.drawBitmap(0, 0, 16, drawBuffer);

          move(4, 40 / 100.0 * 255);

          buzzer.tone(262, 0.2 * 1000);
          _delay(0.02);

      }

      _loop();
  }

}

void _loop() {
}

void loop() {
  _loop();
}

Program mBlock 5 – sledovanie čiary

Video – sledovanie čiary

Robot mBot sa vyhýba prekážkam

Vychádzajúc z vylepšeného umiestnenia snímača vzdialenosti Me Ultrasonic Sensor opísaného v predošlom článku, pustil som sa znovu do programovania za použitia platformy Makeblock mBlock 5. Musel som mať na zreteli pripojenie uvedeného snímača k portu 3 konektora RJ25 riadiacej dosky mCore.

Onedlho som disponoval programom na vyhýbanie sa prekážkam vhodným k testovaniu, ktoré prebehlo bez komplikácií a umožnilo mi dopracovať sa k jeho finálnej verzii:

Program Arduino C – vyhýbanie sa prekážkam

// generated by mBlock5 for mBot
// codes make you happy

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

MeRGBLed rgbled_7(7, 2);
MeLEDMatrix ledMtx_1(1);
unsigned char drawBuffer[16];
unsigned char *drawTemp;
MeBuzzer buzzer;
MeUltrasonicSensor ultrasonic_3(3);
MeDCMotor motor_9(9);
MeDCMotor motor_10(10);

float tla_C4_8D_C3_ADtko = 0;

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;
  }
  motor_9.run((9) == M1 ? -(leftSpeed) : (leftSpeed));
  motor_10.run((10) == M1 ? -(rightSpeed) : (rightSpeed));
}

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

void setup() {
  pinMode(A7, INPUT);
  rgbled_7.fillPixelsBak(0, 2, 1);
  ledMtx_1.setColorIndex(1);
  ledMtx_1.setBrightness(6);
  while(!((0 ^ (analogRead(A7) > 10 ? 0 : 1))))
  {
    _loop();
  }

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

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

  buzzer.tone(262, 0.5 * 1000);
  _delay(0.02);
  while(1) {
      if(ultrasonic_3.distanceCm() < 12){

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

          drawTemp = new unsigned char[16]{0,0,120,252,252,120,0,0,0,0,120,132,132,120,0,0};
          memcpy(drawBuffer, drawTemp, 16);
          free(drawTemp);
          ledMtx_1.drawBitmap(0, 0, 16, drawBuffer);

          move(3, 70 / 100.0 * 255);

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

      }else{

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

          drawTemp = new unsigned char[16]{0,0,120,252,252,120,0,0,0,0,120,252,252,120,0,0};
          memcpy(drawBuffer, drawTemp, 16);
          free(drawTemp);
          ledMtx_1.drawBitmap(0, 0, 16, drawBuffer);

          move(1, 40 / 100.0 * 255);

      }

      _loop();
  }

}

void _loop() {
}

void loop() {
  _loop();
}

Program mBlock 5 – vyhýbanie sa prekážkam

Video – vyhýbanie sa prekážkam

Záver

K záveru patrí poďakovanie za prečítanie môjho článku slúžiaceho na oboznámenie sa so snímačmi robota zo súpravy mBot Explorer Kit. Podarilo sa mi bez náročného programovania do značnej miery využiť potenciál spomínaného robota, čo ma len utvrdilo v jeho praktickosti z pohľadu začiatočníka.

Téme o tomto robotovi zostanem verný aj v nasledujúcom článku, pričom sa zameriam na jeho diaľkové ovládanie.

E-shop

Makeblock Explorer Kit – mBot Bluetooth, modrý, verze 2

Modrý mBot Bluetooth vylepšený o LED matrix displej!


Makeblock mBot, 1800mAh Li-Pol baterie

Li-Pol baterie pro k napájení robota mBot nebo Vašich jiných projektů.




Leave a Reply