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
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