[PROJEKT] Romi Chassis – sterowanie za pomocą smartfona
Teraz można przejść do oprogramowania Kamduino UNO. Kod przygotowanego programu znajduje się poniżej (również w sekcji „do pobrania” na końcu artykułu):
// Romi Chassis – Romi Chassis - Sterowanie przy pomocy smartfona // Program 1 // Autor: Patryk Mądry // Mikrokontroler 2017 r. char OdebraneDane[20]; byte indeks; char znak =""; // Funkcje wykorzystywane do poruszania się void Jedz_do_przodu(int i) { // Lewy silnik digitalWrite(6,LOW); analogWrite(10,i); // Prawy silnik digitalWrite(7,LOW); analogWrite(11,i); } void Jedz_do_tylu(int i) { // Lewy silnik digitalWrite(6,HIGH); analogWrite(10,i); // Prawy silnik digitalWrite(7,HIGH); analogWrite(11,i); } void Obrot_w_prawo(int i) { // Lewy silnik digitalWrite(6,LOW); analogWrite(10,i); // Prawy silnik digitalWrite(7,HIGH); analogWrite(11,i); } void Obrot_w_lewo(int i) { // Lewy silnik digitalWrite(6,HIGH); analogWrite(10,i); // Prawy silnik digitalWrite(7,LOW); analogWrite(11,i); } void Stop() { // Lewy silnik digitalWrite(6,LOW); analogWrite(10,0); // Prawy silnik digitalWrite(7,LOW); analogWrite(11,0); } void setup() { Serial.begin(38400); // Predkosc dla modułu Bluetooth // Ustawienie pinów do obsługi sterownika silników pinMode(10,OUTPUT); pinMode(11,OUTPUT); pinMode(6,OUTPUT); pinMode(7,OUTPUT); } void loop() { if (Serial.available() > 0 ) // Sprawdzanie czy zostały odebrane dane { delay(20); // Zapisanie odbranych danych do tablicy znaków OdebraneDane[] do { znak = (char)Serial.read(); OdebraneDane[indeks] = znak; indeks++; }while(znak != '\n'); //Zerowanie zmiennych OdebraneDane[indeks] = 0; indeks=0; if (OdebraneDane[0]=='F') //Sprawdzanie pierwszego znaku, jeżeli F jedz do przodu { Jedz_do_przodu(50); } else if (OdebraneDane[0]=='B') //Sprawdzanie pierwszego znaku, jeżeli B - jedz do tyłu { Jedz_do_tylu(50); } else if (OdebraneDane[0]=='R') //Sprawdzanie pierwszego znaku, jeżeli R - obrót w prawo { Obrot_w_prawo(50); } else if (OdebraneDane[0]=='L') //Sprawdzanie pierwszego znaku, jeżeli L - obrót w lewo { Obrot_w_lewo(50); } else if (OdebraneDane[0]=='S') //Sprawdzanie pierwszego znaku, jeżeli S - stop { Stop(); } } }
Pierwszym krokiem jest deklaracja niezbędnych zmiennych:
char OdebraneDane[20]; byte indeks; char znak ="";
Następnie należy umieścić funkcje do poruszania podwoziem (zostały one skopiowane z projektu Romi Chassis – montaż oraz sterowanie silnikami):
void Jedz_do_przodu(int i) { // Lewy silnik digitalWrite(6,LOW); analogWrite(10,i); // Prawy silnik digitalWrite(7,LOW); analogWrite(11,i); } void Jedz_do_tylu(int i) { // Lewy silnik digitalWrite(6,HIGH); analogWrite(10,i); // Prawy silnik digitalWrite(7,HIGH); analogWrite(11,i); } void Obrot_w_prawo(int i) { // Lewy silnik digitalWrite(6,LOW); analogWrite(10,i); // Prawy silnik digitalWrite(7,HIGH); analogWrite(11,i); } void Obrot_w_lewo(int i) { // Lewy silnik digitalWrite(6,HIGH); analogWrite(10,i); // Prawy silnik digitalWrite(7,LOW); analogWrite(11,i); } void Stop() { // Lewy silnik digitalWrite(6,LOW); analogWrite(10,0); // Prawy silnik digitalWrite(7,LOW); analogWrite(11,0); }
W funkcji ustawień Setup() trzeba ustawić prędkość transmisji na porcie szeregowym (komunikacja z modułem Bluetooth) na domyślną wartość, czyli 38400. Tu także znalazła się definicja pinów do sterowania silnikiem.
void setup() { Serial.begin(38400); // Predkosc dla modułu Bluetooth // Ustawienie pinów do obsługi sterownika silników pinMode(10,OUTPUT); pinMode(11,OUTPUT); pinMode(6,OUTPUT); pinMode(7,OUTPUT); }
W pętli głównej program sprawdza czy moduł Bluetooth odebrał jakieś dane. Jeżeli tak to dodaje je do tablicy OdebraneDane[], zapisując w niej kolejne znaki.
if (Serial.available() > 0 ) // Sprawdzanie czy zostały odebrane dane { delay(20); // Zapisanie odebranych danych do tablicy znaków OdebraneDane[] do { znak = (char)Serial.read(); OdebraneDane[indeks] = znak; indeks++; }while(znak != '\n'); //Zerowanie zmiennych OdebraneDane[indeks] = 0; indeks=0;
Następnie program sprawdza jaka litera jest na pierwszym miejscu w tablicy OdebraneDane[] (w miejscu w pamięci o indeksie 0):
if (OdebraneDane[0]=='F') //Sprawdzanie pierwszego znaku, jeżeli F jedz do przodu { Jedz_do_przodu(50); } else if (OdebraneDane[0]=='B') //Sprawdzanie pierwszego znaku, jeżeli B - jedz do tyłu { Jedz_do_tylu(50); } else if (OdebraneDane[0]=='R') //Sprawdzanie pierwszego znaku, jeżeli R - obrót w prawo { Obrot_w_prawo(50); } else if (OdebraneDane[0]=='L') //Sprawdzanie pierwszego znaku, jeżeli L - obrót w lewo { Obrot_w_lewo(50); } else if (OdebraneDane[0]=='S') //Sprawdzanie pierwszego znaku, jeżeli S - stop { Stop(); }
Jeśli na pierwszym miejscu w tablicy znajduje się litera:
- F, wykonywana jest funkcja Jedz_do_przodu()
- B, wykonywana jest funkcja Jedz_do_tylu()
- R, wykonywana jest funkcja Obrot_w_prawo()
- L, wykonywana jest funkcja Obrot_w_lewo()
- S, wykonywana jest funkcja Stop()
Połączenie konstrukcji z telefonem oraz działanie programu zostało pokazane na poniższym materiale wideo: