mBot Ranger

The mBot Ranger robot is equipped with a new Arduino Mega 2560 compatible controller and has 10 I/O ports to connect external sensors and motors.

Instalacja dedykowanego oprogramowania na komputerze

https://mblock.makeblock.com/en-us/download/

Pierwsze uruchomienie programu

Wybór robota mbot ranger

Dostępne rozszerzenia dla Mbot Rangera

Dwa tryby działania – tryb live (przesyłanie komend) oraz tryb autonomiczny (upload)

Tryb live- robot działa według instrukcji wysyłanych w czasie rzeczywistym przez komputer.

Tryb Upload – robot otrzymuje instrukcje przez komputer i może działać po odłączeniu od niego.

Robot obsługuje instrukcje języka Arduino C oraz blokowe

Robot ma zainstalowany moduł bluetooth dzięki czemu możemy nim sterować zdalnie przy użyciu komputera lub telefonu  z systemem Android – z zainstalowaną aplikacją Makeblock dostępną w sklepie Google Play:

https://play.google.com/store/apps/details?id=cc.makeblock.makeblock&hl=pl&gl=US

Zrzuty ekranu z aplikacji:

Aplikacja umożliwia podstawowe sterowanie robotem. Posiada funkcje takie jak: Włączanie silników DC. Uruchamianie wbudowanej muzyki. Podstawowe kodowanie przy użyciu bloków. Zawiera tez wbudowaną funkcje line followera.

Tutorial dla aplikacji Makeblock na windows: https://www.youtube.com/watch?v=MPz-wFm2PKk

Instalacja Arduino IDE dla mbot rangera: https://support.makeblock.com/hc/en-us/articles/1500004053721-Programming-mBot-Ranger-in-Arduino

Poradnik do konfiguracji: https://github.com/wirthdrewneu/RobotRangerSetUp

Po uruchomieniu aplikacji wybieramy Arduino Mega 2560.

Przykładowy program wyświetlający wszystkie lampki w różnych kombinacjach w pętlach na płytce  z zaimplementowaną obsługą polecenia stop wpisywanego w Serial Monitor

Przykładowy tutorial dotyczący programowania arduino do mbot rangera: https://docs.google.com/document/d/1EpMWJo9pP2J_pstzXA-XHK8t00Z70SCZYwZ_Kl7VLuw/edit#

   #include <MeAuriga.h>
   
  #define AURIGARINGLEDNUM  12
  #define RINGALLLEDS        0
   
 #ifdef MeAuriga_H
  // on-board LED ring, at PORT0 (onboard), with 12 LEDs
  MeRGBLed led_ring( 0, 12 );
  #endif
  
. void stopProgram() {
   Serial.println("Otrzymano komende stop.");
13.   led_ring.setColor( RINGALLLEDS, 0, 0, 0 );
14.   led_ring.show();
15.   while (true) {
16.     if (Serial.available() > 0) {
17.       String input = Serial.readStringUntil('\n');
18.       if (input == "start") {
19.         break;
20.       }
21.     }
22.   }
23. }
24.  
25. void setup()
26. {
27.     Serial.begin( 9600 );
28. #ifdef MeAuriga_H
29.     // 12 LED Ring controller is on Auriga D44/PWM
30.     led_ring.setpin( 44 );
31. #endif
32. }
33.  
34. void loop()
35. {
36.   int i;
37.     for ( i = 50; i <= 150; i+=50 ) 
38.     {
39.       Serial.print("RED ");
40.       led_ring.setColor( RINGALLLEDS, i, 0, 0 ) ;
41.       led_ring.show();
42.       delay( 500 );
43.       Serial.print("GREEN ");
44.       led_ring.setColor( RINGALLLEDS, 0, i, 0 );
45.       led_ring.show();
46.       delay( 500 );
47.       Serial.println("BLUE ");
48.       led_ring.setColor( RINGALLLEDS, 0, 0, i );
49.       led_ring.show();
50.       delay( 500 );
51.  
52.       if (Serial.available() > 0) {
53.         String input = Serial.readStringUntil('\n');
54.         if (input == "stop") {
55.           stopProgram();
56.           return;
57.         }
58.       }
59.     }
60.     led_ring.setColor( RINGALLLEDS, 0, 0, 0 );
61.     led_ring.show();
62.     delay( 500 );
63.  
64.     for ( i = 1; i <= AURIGARINGLEDNUM; i++ )
65.     {
66.         // Turn on  LEDs one at a time with some interesting color
67.         Serial.print(i);
68.         led_ring.setColor( i, 40, 10, 40);
69.         led_ring.show();
70.         delay( 200 );
71.  
72.         if (Serial.available() > 0) {
73.           String input = Serial.readStringUntil('\n');
74.           if (input == "stop") {
75.             stopProgram();
76.             return;
77.           }
78.           if (input == "start") {
79.             break;
80.           }
81.         }
82.     }
83.     Serial.println("");
84. }
85.  

Kod do sterowania silnikami oraz czujnikami

UWAGA: nie uruchamiamy programu makeblock i arduino jednocześnie, ponieważ kolidują ze sobą.

Po uruchomieniu z arduino należy aktualizować firmware.

Dla poprawnego wyjścia w monitorze portu szeregowego ustawić wartość 115200.

#include <MeAuriga.h>
 
#define AURIGARINGLEDNUM  12
#define RINGALLLEDS        0
 
MeBuzzer buzzer;
#define BUZZER_PORT  45
 
MeEncoderOnBoard Encoder_1(SLOT1);
MeEncoderOnBoard Encoder_2(SLOT2);
 
MeLineFollower lineFollower(PORT_6);
MeUltrasonicSensor ultrasonicSensor(PORT_7);
MeOnBoardTemp temp(PORT_13);
MeSoundSensor dbsense(14);
 
int16_t moveSpeed = 200; // predkosc silników 
int Hz = 1000; /// parametry dzwieku hz 
int Dlugosc = 1000; /// parametry dzwieku czas 
void stopProgram() {
  Serial.println("Otrzymano komendę stop.");
  Stop();
  while (true) {
    if (Serial.available() > 0) {
      String input = Serial.readStringUntil('\n');
      if (input == "k") {
        break;
      }
    }
  }
}
 
void Forward(void)
{
  Encoder_1.setMotorPwm(-moveSpeed); // setMotorPwm writes to the encoder controller
  Encoder_2.setMotorPwm(moveSpeed);  // so setting the speed change instantly
}
 
void Backward(void)
{
  Encoder_1.setMotorPwm(moveSpeed);
  Encoder_2.setMotorPwm(-moveSpeed);
}
void TurnLeft(void)
{
  Encoder_1.setMotorPwm(-moveSpeed);
  Encoder_2.setMotorPwm(-moveSpeed);
}
void TurnRight(void)
{
  Encoder_1.setMotorPwm(moveSpeed);
  Encoder_2.setMotorPwm(moveSpeed);
}
 
void Stop(void)
{
  Encoder_1.setMotorPwm(0);
  Encoder_2.setMotorPwm(0);
}
 
void readDistanceSensor() {
  int distance = ultrasonicSensor.distanceCm();
  Serial.print("Odległość: ");
  Serial.print(distance);
  Serial.println(" cm");
}
 
void readColorSensors() {
  uint8_t *sensors = lineFollower.readSensors();
  int leftSensorValue = sensors[0];
  int rightSensorValue = sensors[1];
  Serial.print("Czujnik lewy: ");
  Serial.print(leftSensorValue);
  Serial.print(" Czujnik prawy: ");
  Serial.println(rightSensorValue);
}
 
void setup()
{
  Serial.begin(115200);
 
  buzzer.setpin(BUZZER_PORT);
  buzzer.noTone();
 
  TCCR1A = _BV(WGM10);
  TCCR1B = _BV(CS11) | _BV(WGM12);
  TCCR2A = _BV(WGM21) | _BV(WGM20);
  TCCR2B = _BV(CS21);
#ifdef MeAuriga_H
  MeRGBLed led_ring( 0, 12 );
  led_ring.setpin( 44 );
#endif
}
 
void loop()
{
  static String input ="";
  while(true){
    Serial.println("Loop executed");
  if (Serial.available() > 0) {
    String input = Serial.readStringUntil('\n');
    if (input == "w") {  // silnik wprost 
      Serial.println("Jazda do przodu");
      Forward();
      delay(1000); 
      Stop();
    }
    else if (input == "s") { // silnik do tyłu 
      Serial.println("Jazda do tyłu");
  Backward();
   delay(1000); 
      Stop();
    }
    else if (input == "a") { // silnik w lewo 
      Serial.println("Skręt w lewo");
      TurnLeft();
      delay(1000);
      Stop();
    }
    else if (input == "d") { // silnik w prawo
      Serial.println("Skręt w prawo");
      TurnRight();
       delay(1000);
       Stop();
    }
    else if (input == "f") { // czujnik dystsansu
      Serial.println("czujnik dystansu");
      readDistanceSensor();
    }
    else if (input == "t") { // czujnik podczerwieni
       Serial.println("czujnik podczerwieni : ");
      readColorSensors();
    }
    else if (input == "k") { // przerwanie 
      stopProgram();
      return;
    }
    else if (input == "x") { // czujnik temperatury 
      Serial.print("temperatura wynosi = ");        
      Serial.println(temp.readValue());  
      delay(50);                          
    }
     else if (input == "o") {
      Serial.print("wartosc dzwieku = ");          
      Serial.println(dbsense.strength()); 
      delay(50);                              
    }
    else if (input == "z") {
      Serial.print(" odtwarzam dzwiek"); 
      buzzer.tone(Hz, Dlugosc);    
      Serial.print("wartosc dzwieku = ");          
      Serial.println(dbsense.strength()); 
      delay(1000);                              
    }
    else {
      Serial.println("Nieznana komenda");
    }
  }
  delay(1000); 
}
delay(1000); 
}

Tabela dostępnych wartości (Hz) dla generatora muzyki:

Opracowanie: Paweł Deptuła

Scientific Circle of Robotics