Motororo Napisano Kwiecień 27, 2021 Udostępnij Napisano Kwiecień 27, 2021 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 More sharing options...
farmaceuta Kwiecień 27, 2021 Udostępnij Kwiecień 27, 2021 (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 Kwiecień 27, 2021 przez farmaceuta Link do komentarza Share on other sites More sharing options...
Motororo Kwiecień 27, 2021 Autor tematu Udostępnij Kwiecień 27, 2021 @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 More sharing options...
Motororo Kwiecień 27, 2021 Autor tematu Udostępnij Kwiecień 27, 2021 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 More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
farmaceuta Kwiecień 27, 2021 Udostępnij Kwiecień 27, 2021 a zmien jeszcze w odbiorniku zmienna "state" na "uint8_t" Link do komentarza Share on other sites More sharing options...
farmaceuta Kwiecień 27, 2021 Udostępnij Kwiecień 27, 2021 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... Link do komentarza Share on other sites More sharing options...
Motororo Kwiecień 27, 2021 Autor tematu Udostępnij Kwiecień 27, 2021 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 More sharing options...
Motororo Kwiecień 27, 2021 Autor tematu Udostępnij Kwiecień 27, 2021 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 More sharing options...
Motororo Kwiecień 27, 2021 Autor tematu Udostępnij Kwiecień 27, 2021 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 More sharing options...
Motororo Kwiecień 28, 2021 Autor tematu Udostępnij Kwiecień 28, 2021 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 More sharing options...
farmaceuta Kwiecień 28, 2021 Udostępnij Kwiecień 28, 2021 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... 1 Link do komentarza Share on other sites More sharing options...
Motororo Kwiecień 28, 2021 Autor tematu Udostępnij Kwiecień 28, 2021 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 More sharing options...
farmaceuta Kwiecień 28, 2021 Udostępnij Kwiecień 28, 2021 (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 Kwiecień 28, 2021 przez farmaceuta Link do komentarza Share on other sites More sharing options...
Motororo Kwiecień 28, 2021 Autor tematu Udostępnij Kwiecień 28, 2021 Rozumiem pomysł, spróbuję coś z tym napisać niedługo jak znajdę chwilę 😄 Link do komentarza Share on other sites More sharing options...
Motororo Maj 4, 2021 Autor tematu Udostępnij Maj 4, 2021 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 More sharing options...
Pomocna odpowiedź
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ę »