Skocz do zawartości

Moduł bluetooth HM-10. Problem z obsługą.


Pomocna odpowiedź

Napisano

Witam, od dłuższego czasu mam problem z modułem HM-10. Chciałem wykorzystać go do komunikacji z moim line followerem, aby ułatwić proces regulacji parametrów robota. Po wielu próbach, testując różne aplikacje na telefon w końcu udało mi się przejąć pełną kontrolę nad modułem podpiętym pod Arduino i mogłem sterować diodą RGB za pomocą aplikacji Arduino Bluetooth Controller (HM-10 Module) .

Tak wyglądała aplikacja:

1932075968_83481254_842350692860411_8483376917242707968_n(7).thumb.jpg.69cf437691fce3eaf71eb6ce02eda83d.jpg

Z takim kodem na Arduino:


int red=25,green=25,blue=25;
char znak;
void setup()
{
  
Serial.begin(9600);   
pinMode(3,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
digitalWrite(12,HIGH);
}

void loop()
{
  if(Serial.available())
  {
  char znak=char(Serial.read());
  Serial.print("odebrane: ");
  Serial.println(znak);
  if(znak=='R')
  {
    red+=10;
    Serial.print("R: ");
    Serial.println(red);
  }
  else if(znak=='G')
  {
    green+=10;
    Serial.print("G: ");
    Serial.println(green);
  }
  else if(znak=='Z')
  {
    red=50;
    green=50;
    blue=50;
  }
  else if(znak=='B')
  {
    blue+=10;
    Serial.print("B: ");
    Serial.println(blue);
  }
  }
  analogWrite(3,red);
  analogWrite(5,green);
  analogWrite(6,blue);
  }
  

Ucieszony że wszystko działa jak należy przeniosłem moduł z płytki stykowej na płytkę główną mojego robota i odpowiednio go przylutowałem.

Na moją Atmegę328p wgrałem prawie bliźniaczy program który na znak 'a' otrzymany z telefonu włącza silniki natomiast na 'A' wyłącza je. Wszystko działało jak należy. Problem zaczął się, kiedy zdalny start chciałem połączyć z algorytmem jazdy. Robot który normalnie bez problemu pokonuje wyznaczoną przeze mnie trasę, po załączeniu komunikacji bezprzewodowej po torze jedzie tak:

83678992_1632538233553336_3328267189571551232_n.thumb.jpg.1b94bbcb3d6546948ac4595a95156dd6.jpg

Wstawię jeszcze fragment kodu jazdy po lini z obsługą modułu, dalej jest już sam algorytm kierowania.

void setup()
{
    pinMode(7, INPUT); //czujnik 1
    pinMode(13,INPUT); //czujnik 2
    pinMode(2, INPUT); //czujnik 3
    pinMode(3, INPUT); //czujnik 4
    pinMode(4, INPUT); //czujnik 5
    pinMode(A0, INPUT); //czujnik 6
    pinMode(A1, INPUT); //czujnik 7
    pinMode(A2, INPUT); //czujnik 8
    pinMode(A3, INPUT); //czujnik 9
    pinMode(A4, INPUT); //czujnik 10
    pinMode(A5, INPUT); //czujnik 11
    
    pinMode(9, OUTPUT); //PWM do komparatora

    pinMode(12, OUTPUT); // silniki wł/wył

    pinMode(5, OUTPUT); // PWM dla silnika LEWEGO
    pinMode(6, OUTPUT); // PWM dla silnika PRAWEGO

    Serial.begin(9600);
}

int lasterror = 0;
int przestrzelony = 0;
int V = 100; //predkosc bazowa
int Kp = 9;
int Kd = 1;


void loop()
{
    if(Serial.available())
    {
      char znak=Serial.read();
      switch(znak)
      {
        case'a': digitalWrite(12,HIGH); break; //włączam silniki
      
        case'A': digitalWrite(12,LOW); break; //wyłączam silniki
      }
    }

Proszę o pomoc, już sam nie wiem co może być tutaj nie tak. Myślałem nad zmianą modułu na popularniejszy typu HC-06 nawet ze względu na łatwość tworzenia aplikacji w App Inventorze, ale chętniej pozostałbym przy tym, gdyby udało się rozwiązać problem.

void setup()
{
    pinMode(7, INPUT); //czujnik 1
    pinMode(13,INPUT); //czujnik 2
    pinMode(2, INPUT); //czujnik 3
    pinMode(3, INPUT); //czujnik 4
    pinMode(4, INPUT); //czujnik 5
    pinMode(A0, INPUT); //czujnik 6
    pinMode(A1, INPUT); //czujnik 7
    pinMode(A2, INPUT); //czujnik 8
    pinMode(A3, INPUT); //czujnik 9
    pinMode(A4, INPUT); //czujnik 10
    pinMode(A5, INPUT); //czujnik 11
    
    pinMode(9, OUTPUT); //PWM do komparatora

    pinMode(12, OUTPUT); // silniki wł/wył

    pinMode(5, OUTPUT); // PWM dla silnika LEWEGO
    pinMode(6, OUTPUT); // PWM dla silnika PRAWEGO

    Serial.begin(9600);
}

int lasterror = 0;
int przestrzelony = 0;
int V = 100; //predkosc bazowa
int Kp = 9;
int Kd = 1;


void loop()
{
    if(Serial.available())
    {
      char znak=Serial.read();
      switch(znak)
      {
        case'a': digitalWrite(12,HIGH); break; //włączam silniki
      
        case'A': digitalWrite(12,LOW); break; //wyłączam silniki
      }
    }
	analogWrite(9,170);

    int cz1 = digitalRead(7); //sczytuję czujnik 1
    int cz2 = digitalRead(13); //sczytuję czujnik 2
    int cz3 = digitalRead(2); //sczytuję czujnik 3
    int cz4 = digitalRead(3); //sczytuję czujnik 4
    int cz5 = digitalRead(4); //sczytuję czujnik 5
    int cz6 = digitalRead(A0); //sczytuję czujnik 6
    int cz7 = digitalRead(A1); //sczytuję czujnik 7
    int cz8 = digitalRead(A2); //sczytuję czujnik 8
    int cz9 = digitalRead(A3); //sczytuję czujnik 9
    int cz10 = digitalRead(A4); //sczytuję czujnik 10
    int cz11 = digitalRead(A5); //sczytuję czujnik 11

    int waga1 = -9; // waga czunika 1
    int waga2 = -6; // waga czunika 2
    int waga3 = -4; // waga czunika 3
    int waga4 = -2; // waga czunika 4
    int waga5 = -1; // waga czunika 5
    int waga6 = 0; // waga czunika 6
    int waga7 = 1; // waga czunika 7
    int waga8 = 2; // waga czunika 8
    int waga9 = 4; // waga czunika 9
    int waga10 = 6; // waga czunika 10
    int waga11 = 9; // waga czunika 11

    int ilosc= 0;   //mianownik średniej
    int wartosc = 0;//licznik średniej

    wartosc = (cz1 * waga1) + (cz2 * waga2) + (cz3 * waga3) + (cz4 * waga4) + (cz5 * waga5) + (cz6 * waga6) + (cz7 * waga7) + (cz8 * waga8) + (cz9 * waga9) + (cz10 * waga10) + (cz11 * waga11);    //licznik średniej
    ilosc = cz1 + cz2 + cz3 + cz4 + cz5 + cz6 + cz7 + cz8 + cz9 + cz10 + cz11;  //mianownik średniej

    int error = 0; //blad odchylenia od srodka
    if (ilosc != 0) //jak jest na lini licz normalnie uskok od srodka
        error = wartosc/ilosc; 
    else if (lasterror > 0)
    {
        przestrzelony = 1;
        error =900;
    }
    else if (lasterror < 0)
    {
        przestrzelony = 2;
        error =-900;
    }
    else
        error = 0;
    int skret = 0; // po prostu skret

    if(przestrzelony == 1 && error >= 0)
          przestrzelony = 0;

     if(przestrzelony == 2 && error <= 0)
          przestrzelony = 0;

     if(przestrzelony)
         error = error / 2;    

    int rozniczka = error - lasterror;
    lasterror = error;

    
    skret = (error*Kp + rozniczka*Kd);
    if (skret > V)
        skret = V;
    else if (skret < -V)
        skret = -V;

   

    if(error >= 0) //jedzie w prawo
    {
       unsigned int Vslow = V - skret;

        analogWrite(5, V);
        analogWrite(6, Vslow);
    }
    else    //jedzie w lewo
    {
        unsigned int Vslow = V + skret;

        analogWrite(5, Vslow);
        analogWrite(6, V);
    }
}

Proszę, oto cały kod robota. Myślę jednak że nie ma błędu w części sterującej, bo robot jeździ po trasie lub nie zależnie od tego czy w programie umieszczam komunikację przez bluetooth czy nie bez żadnych zmian w głównej części programu.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...