Skocz do zawartości

Połączenie dwóch arduino za pomocą modułu Bluetooth HC-05, problem z wysyłaniem danych


Motororo

Pomocna odpowiedź

Witam,

mam mały problem z sterowaniem serwomechanizmem za pomocą modułów bluetooth HC-05. Wartością wysyłaną jest sygnał z czujnika zginania, jest on zmapowany.

Łącząc to na jednym arduino wszystko śmiga jak powinno, czyli odpowiednio zginając czujnik - rusza się serwomechanizm o dany kąt. Problem pojawia się gdy próbuję wysłać ten sygnał za pomocą bluetooth (być może kod jest zły, zaczerpnięty z internetu, ale komuś podobno działało, wstawię niżej).

Moje moduły bluetooth zaprogramowałem wydaje mi się prawidłowo, jest między nimi połączenie (lecz musiałem je programować na arduino uno, bo na nano po wpisywaniu komend nic się nie działo). Domyślnie były one na 9600 baud rate. 

Układ z arduino nano jest moim masterem. Zmapowany sygnał z czujnika zginania wziąłem pod monitor i widać takie wartości:
M332
L330
J331
K330
J331
K330
J330
Moim zdaniem powinny być same liczby, a nie jakieś cyferki dodatkowo. (może tu jest problem?)

Układ z arduino uno jest slavem i biorąc pod monitor watości dostarczone tutaj otrzymuje:
13
10
83
51
51
51
10
51
Więc jakby liczby są prawidłowe, ale strasznie one skaczą i zginanie czujnika nie skutkuje zmianą tych wartości.

Oto kod dla MASTERA:

int val1;   
int state=0;
void setup() {
  Serial.begin(9600); 
}

void loop() {
if(Serial.available() > 0){ // Checks whether data is comming from the serial port
state = Serial.read(); // Reads the data from the serial por
}
  val1 = analogRead(A0);            // reads the value of the potentiometer (value between 0 and 1023)
 int val1map = map(val1, 0, 400, 0, 180);     // scale it to use it with the servo (value between 0 and 180)
  Serial.println(val1map);
  Serial.write(val1map);
  delay(10);
}

Oto kod dla SLAVE'a:

#include <Servo.h>

Servo kciuk;  // create servo object to control a servo
int state=20;
void setup() {
  
  kciuk.attach(5);  // attaches the servo on pins to the servo object
  Serial.begin(9600);
}

void loop() {
  if(Serial.available() > 0){ // Checks whether data is comming from the serial port
state = Serial.read();
  }
  kciuk.write(state); 
  Serial.println(state);
  delay(10);

}

Może arduino nano jakoś inaczej trzeba łączyć z bluetoothem? Ja oba bluetoothy połączyłem tak: RX z bluetooth'a do TX na arduino, TX z blue do RX na arduino, GND wiadomo do GND na arduino, Vcc do 5V na arduino. 

Potrzebuje pilnie pomocy i z góry dziękuję za każdą wiadomość!

Link do komentarza
Share on other sites

Serial.write(val1map);

"read" sluzy do odczytania jednego bajtu a twoja zmienna ma dwa, bo jest typu "int"...a sprobuj tak zrobic

uint8_t val1map = map(val1, 0, 400, 0, 180);     

 

Edytowano przez farmaceuta
Link do komentarza
Share on other sites

@farmaceuta

Zmieniłem 

23 minuty temu, Motororo napisał:

int val1map = map(val1, 0, 400, 0, 180);

na 

 

11 minut temu, farmaceuta napisał:

uint8_t val1map = map(val1, 0, 400, 0, 180);

W monitorze nadal to samo, literki oraz inne znaki przed liczbami, ale serwomechanizm waha się tym razem delikatniej, lecz brak reakcji na czujnik zginania.
 

Link do komentarza
Share on other sites

Sprawdziłem jeszcze międzyczasie, czy gdy połączę serwomechanizm do arduino nano (z połączonym czujnikiem zginania) będzie chodziło prawidłowo i tak, chodzi bez zarzutów. Tylko nie jest to połączenie bezprzewodowe. Bezprzewodowo zaczyna coś wariować.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

3 minuty temu, farmaceuta napisał:

Przeciez blue masz podpiety do sprzetowego Uarta to jak chcesz korzystac z monitora? Moze stad te bledy...

Czyli, gdy podłączony jest bluetooth to Serial.println(xxx); nie działa? Czy o co chodzi? Nie mogę wtedy sprawdzić wartości z czujnika na przykład?

 

10 minut temu, farmaceuta napisał:

a zmien jeszcze w odbiorniku zmienna "state" na "uint8_t"

Zmieniłem teraz wszędzie inty na uint8_t i nic nie pomaga

Link do komentarza
Share on other sites

16 minut temu, Motororo napisał:

Zmieniłem teraz wszędzie inty na uint8_t i nic nie pomaga

Możliwe że coś wcześniej źle wgrałem i tym razem po tej zmianie wszystko ustało, a to dlatego że serwo odczytuje state jako 20 i znajduje się cały czas w pozycji 20 stopni.

Link do komentarza
Share on other sites

16 minut temu, Motororo napisał:

Zmieniłem teraz wszędzie inty na uint8_t i nic nie pomaga

@farmaceuta Możliwe że coś wcześniej źle wgrałem i tym razem po tej zmianie wszystko ustało, a to dlatego że serwo odczytuje state jako 20 i znajduje się cały czas w pozycji 20 stopni.

Link do komentarza
Share on other sites

Znalazłem przyczynę, dzięki @farmaceuta, wariacja występuje tylko wtedy, gdy w kodzie mam funkcję "Serial.println(xxx);", gdy ją usunąłem, nagle serwomechanizm zaczął działać. Też musiałem zmienić wartość mapowaną z 400 na 1023, wtedy nie skacze tak serwomechanizm, mimo że bez bluetootha gdy mapowałem zakres 0-400 było wszystko elegancko. Kod dla jednego serwa działa i wygląda następująco (lekko zmodyfikowany): 

MASTER: 

int flex=0;
void setup() {
  Serial.begin(9600); 
}

void loop() {
  flex = analogRead(A0);            // reads the value of the potentiometer (value between 0 and 1023)
 int flexmap = map(flex, 0, 1023, 0, 180);     // scale it to use it with the servo (value between 0 and 180)
  Serial.write(flexmap);
  delay(10);
}

 

SLAVE:
 

#include <Servo.h>

Servo kciuk;  // create servo object to control a servo
int data=0;
void setup() {
  
  kciuk.attach(5);  // attaches the servo on pins to the servo object
  Serial.begin(9600);
}

void loop() {
  if(Serial.available() > 0){ // Checks whether data is comming from the serial port
  data = Serial.read();
  kciuk.write(data); 
  delay(10);
}
}

 

Link do komentarza
Share on other sites

Nie wspominalem nic o zakresie ADC bo myslalem ze celowo zanizyles do 400...i tak, zaly zakres to 1023max bo ADC jest 10-bitowe. Ta wartosc mozesz sobie dowolnie obnizyc gdyby np. przyszlo Ci odczytywac z napiecia do 3.3v podczas kiedy ardu podpiete by bylo z 5v...

  • Lubię! 1
Link do komentarza
Share on other sites

Dzięki jeszcze raz, teraz głowię się jak odczytać na raz z pięciu czujników i wysłać to na odpowiednie serwomechanizmy. Na razie jak próbuję, to funkcję Serial.read() odczytują wszystkie serwomechanizmy i poszczególne serwo otrzymuje sygnał z wielu czujników a nie jednego.. hmm jak to tu wykombinować

Link do komentarza
Share on other sites

Wiesz co to sa tablice? Tworzysz sobie tak np. 5-elementowa, wpisujesz do niej swoje wartosci. Pozniej raz dwa wysylasz te 5 bajtow, po drugiej stronie odbierasz i odpowiednio umieszczasz bajty w tablicy blizniaczej w odbiorniku..

Wysylasz taki pakiet powiedzmy 40-50razy na sekunde i jest ok..oczywiscie to bardzo skromny przesyl bez zabezpieczen itp. ale do twojego projektu to powinno wystarczyc...

Edytowano przez farmaceuta
Link do komentarza
Share on other sites

Nie mam kompletnie pomysłu jak to zrobić, długo szukałem rozwiązania i nic z tego. Wysyłanie i odbieranie przez port szeregowy to ciężka sprawa jak dla mnie 😕 Mógłby ktoś bardziej nakierować na rozwiązanie? Bardzo bym prosił.

Link do komentarza
Share on other sites

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...

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.