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