Skocz do zawartości

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


Pomocna odpowiedź

Napisano

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ść!

(edytowany)
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

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

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

15 minut temu, Motororo napisał:

 

W monitorze nadal to samo, literki oraz inne znaki 

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

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

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.

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.

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);
}
}

 

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

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ć

(edytowany)

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

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

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