LinkedIn YouTube Facebook
Szukaj

Wstecz
Artykuły

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

Autor: Patryk Mądry