Skocz do zawartości

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


Adi525

Pomocna odpowiedź

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.

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.