0

Naprednija komunikacija s robotom.

O kodu

U prethodnom odjeljku smo opisali jednostavnu strukturu naredbi. Želite li nešto bolje, proučite dalje ovu stranicu.

Skinite https://www.github.com/PribaNosati/MRMS Arduino kod.

Uključite klasu u vaš kod naredbom na početku .ino datoteke:

#include "Commands.h"

U skinutoj Commands.h su 2 parametra koja je moguće mijenjati:

#define MAX_COMMANDS 10
#define MAX_SHORTCUT_CHARACTERS 3
#define SerialPortCommands Serial2
Pročitajte komentare pored ove 3 linije u Commands.h i promijenite ih po želji. Ovakvi kakvi jesu, uglavnom su u redu pa ne trebate puno proučavati.

Deklarirajte objekt kao globalnu varijablu (izvan loop, setup i drugih funkcija):

Commands commands;

Jedan po jedan dodajte svoje naredbe u funkciji setup. Npr.:

commands.add("sta", 0, 2);
commands.add("cal", calibrateLine);
commands.add("mot", testMotors);
Prvi parametar je ono što utipkate u mobitel, spojen Bluetoothom, da biste pokrenuli željenu naredbu. Umjesto mobitela možete koristiti konzolu Arduino ili Visual Studio okoline. Drugi parametar je ime funkcije. Npr. "sta" će pokrenuti loop() - Arduino glavnu petlju. Druga će pokrenuti calibrateLine(), koja mora biti definirana u kodu. Znači da bi negdje u kodu trebalo biti:
void calibrateLine() {
	lineSensors.calibrate();//Ili što god želite pokrenuti
}

void testMotors() {
	motors.test(1);//Opet, što god želite pokrenuti
}

Treći je parametar broj pina. Spojite na njega tipkalo, npr. jedno s ML-R LEDs Switches (mrm-leds) i pokrećite naredbu pritiskom na tipkalo. Pogodno je za pokretanje robota, kalibraciju nogometaša prije utakmice i slično, kad je bežična veza možda zabranjena.

Slijedi primjer kompletnijeg koda za korištenje naredbi.

#include "ReflectanceSensors.h"
#include "Motors.h"
#include "Commands.h"

Commands; //Objekt za davanje naredbi robotu.
ReflectanceSensors reflectanceSensors(0);
Motors motors(false);


void setup()
{
	Serial.begin(115200);//Komunikacija prema ekranu
	Serial2.begin(9600);//Bluetooth veza na mobitel

	//Dodajemo senzore linije
	reflectanceSensors.add(A12, -10);
	reflectanceSensors.add(A13, -10);

	//Dodajemo motore
	motors.add(5, 25, true, true);//Lijevi 
	motors.add(4, 3, false, true);//Desni

	//Dodajemo naredbe
	commands.add("cal", lineCalibration);//Utipkamo na mobitelu kal i mičemo robota 10 sec. po crnom i bijelom svim senzorima
	commands.add("lix", lineTestX, 11);//Liniju ispisuje kao X znakove.
	commands.add("lib", lineTestNumeric);//Ispisuje vrijednosti (brojeve) koje čitaju senzori linije.
	commands.add("sta", 0, 12);//Start, pokreće robota po liniji.
	commands.add("dis", calibrationDisplay);//Ispis minimuma i maksimuma za senzore linije.
	commands.add("mot", motorTest);//Pali motore naprijed i natrag.

	//Dok se ne utipka naredba "sta", izvršava sve koje se upišu. Nakon "sta" ide dalje u utrku.
	while (commands.prompt())
		;
}

void loop()
{
	/*************** Ovdje ide vaš kod za praćenje linije **************************/

	commands.prompt(false, stop);//Ako je pritisnuta tipka na mobitelu ili PCju, zaustavlja program i motore i čeka naredbu
}

void lineCalibration() {
	reflectanceSensors.calibrate();
}

void lineTestX() {
	reflectanceSensors.test(false, userCommandsEntered);
}

void lineTestNumeric() {
	reflectanceSensors.test(true, userCommandsEntered);
}

void calibrationDisplay() {
	reflectanceSensors.eepromRead();
}

bool userCommandsEntered() {
	return commands.available();
}

void motorTest() {
	motors.test(1, userCommandsEntered);
}

void error(const char * message) {
	Serial2.print(message);
	Serial.print(message);
	while (true)
		;
}

void stop() {
	motors.go(0, 0);
}
userCommandsEntered() je funkcija koja se koristi za zaustavljanje testa. Sve ML-R biblioteke s funkcijama za testiranje koriste ovaj način zaustavljanja testa. Uočite i funkciju stop(), koja kao parametar ide u commands.prompt() i tako zaustavlja motore kad korisnik počne nešto pisati na mobitel.