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

Technologie End of Life i bezpieczeństwo sieci – wyzwania Europy związane z tzw. długiem technologicznym
Najczęstsze błędy firm przy wyborze dostawcy energii i jak ich uniknąć
Fotorezystor, czyli czujnik światła dwojakiego działania. Przykład innowacji w automatyce i elektronice możliwej dzięki technologii fotooporników 



