Skocz do zawartości
Enter24

App Inventor + Arduino bluetooth HC-06

Pomocna odpowiedź

Cześć.
Wiem, że temat związany z App inventorem pojawiał się już kilka razy, jednakże są już dość stare (sprawdzone w wyszukiwarce, ostatni na tym dziale w maju) a ich treść jakoś nie rozwiązała problemu.
Potrzebuję wysterować jeden serwo tak, by z telefonu zadać mu czas w jakim będzie obrócony po czym wróci do pozycji 0. Do tego wykorzystuję HC-06 podłączone do Arduino nano.
W przypadku prób wysterowania serwo z komputera (zasilanie i monitor portu szeregowego z kompa) bezproblemowo działa - odwraca się np. na 2s po czym wraca do pozycji 0.
W przypadku gdy nano podłączę już pod powerbank, przewody tx i rx z bluetooth, pojawia się problem iż niezależnie od wysłanej liczby serwo ustawia się i natychmiast wraca na pozycję wyjściową. W przypadku jak próbuję zadać mu jakąś konkretną liczbę (np. ma wysyłać 3 po wciśnięciu klawisza) to ustawi się w pozycji "1" gdzie już zostanie. W odpowiedzi aplikacja dostaje krzaki.
Jestem kompletnie zielony, stąd pytania:
- Jaką ustawić prędkość Serial w przypadku bluetooth? Na tutkach widziałem i 9600 i 38400
- Co głównie robię nie tak?

Kod. Skromny, ale właściwie nic więcej ten układ nie potrzebuje robić. Zawiera jedynie serwo i bluetooth:
 

#include <Servo.h>
Servo serwo;
void setup() {
  Serial.begin(9600);
  serwo.attach(5);
  serwo.write(0);

}

void loop() {
  if(Serial.available()>0){
    int czas2 = Serial.read();
    Serial.println(czas2*1000);
    serwo.write(90);
    delay(czas2*1000);
    serwo.write(0);
  }

}

mnożnik "*1000" W celu uzyskania wartości w sekundach. Apka daje np. 1, ardu robi z tego 1000 co daje 1s w delay (jak dobrze kojarzę).
Obstawiam, iż jednym z problemów może być to iż wysyłam liczby zmiennoprzecinkowe, ale wtedy int (o ile dobrze kojarzę) je powinien po prostu pomijać. Wysłałem liczbę całkowitą z podobnym skutkiem. Zamieniłem blok by nie wysyłał tekstu z "Press Time" a "3" i nie było różnicy. 
Sorry za pewnie tak banalny problem, ale spędziłem nad nim wieczór i nie mogę zrozumieć co jest nie tak

układ.png

Udostępnij ten post


Link to post
Share on other sites
Dnia 8.07.2019 o 22:10, Enter24 napisał:

- Jaką ustawić prędkość Serial w przypadku bluetooth? Na tutkach widziałem i 9600 i 38400

Taką samą, jak moduł SPP Bluetooth "rozmawia" z UART. Domyślnie prawie zawsze jest to 9600.

https://wiki.pinguino.cc/index.php/SPP_Bluetooth_Modules

38400 to baud rate stosowany w HC-05, ale tylko w trybie konfiguracji. Jeżeli nie zmieniono nic w ustawieniach, domyślnie podczas normalnej pracy będzie to 9600.

Prędkości komunikacji telefonu z modułem SPP Bluetooth nie trzeba zmieniać - wszystko odbywa się automatycznie. NIe warto więc szukać ustawień baud rate w środowisku, w którym tworzymy aplikację na komórkę.

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
Cytat

W przypadku prób wysterowania serwo z komputera (zasilanie i monitor portu szeregowego z kompa) bezproblemowo działa - odwraca się np. na 2s po czym wraca do pozycji 0.

Z tym kodem, który wkleiłeś i zakładając , że monitor portu szeregowego to ten z Arduino IDE to raczej poprawnie nie działało.

Serial.println(czas2*1000);

zwraca wartość -15536

delay(czas2*1000); //czyli będzie -15536

w monitorze portu szeregowego arduino IDE wysyłam oczywiście 2.

Na początek to najlepiej sprawdzić samą zmienna czas2 czyli :

Serial.println(czas2);

W monitorze arduino IDE  ustaw No line ending i wyślij 2.  Zwracana jest wartość 50. Wyśłij kolejno cyfry od 0 do 9 a zobaczysz że jest tu jakaś prawidłowość. To teraz pora na tabelę ASCII

 

standard-ascii-table.jpg

Edytowano przez slon

Udostępnij ten post


Link to post
Share on other sites

Teraz wyślij wartość 0.01 i zobacz co jest zwracane. I następnie wyślij dowolną cyfrę od 0 do 9 ale w moniorze portu szeregowego ustaw Both NL & CR .Otrzymane wartości sprawdzaj w tabeli ASCII.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Cóż... nie wiem czy to było przemęczenie, ale dziś ponownie przysiadłem nad projektem. Musiałem być zmęczony... bo teraz poprawiłem w kilka minut.
Skorygowałem kod:

#include <Servo.h>
Servo serwo;
void setup() {
  Serial.begin(9600);
  serwo.attach(5);
  serwo.write(0);
}

void loop() {
  if(Serial.available()>0){
    float czas2 = Serial.readStringUntil('\n').toFloat();
    Serial.println(czas2);
    serwo.write(90);
    delay(czas2*1000);
    serwo.write(0);
  }
}

Teraz wszystko śmiga. Pozostaje mi do projektu podłączyć powerbank, obudowę i cieszyć się działaniem. 
O ile rozumiem to w poprzednim kodzie próbowałem odebrać i zapisać znak jako liczbę, przez co układ zamiast "2" zapisywał 50, stąd wynik pomnożony x1000 dał przekręcenie inta i wynik rzędy -15k. Chyba już rozumiem swój błąd 😆
Sorry za tak trywialne zagadnienie. 

Udostępnij ten post


Link to post
Share on other sites
Dnia 10.07.2019 o 22:59, Enter24 napisał:

O ile rozumiem to w poprzednim kodzie próbowałem odebrać i zapisać znak jako liczbę, przez co układ zamiast "2" zapisywał 50, stąd wynik pomnożony x1000 dał przekręcenie inta i wynik rzędy -15k.

Dokładnie tak, zmienna miała poprawny typ, a błąd polegał tylko na braku konwersji do odpowiedniego typu podczas odczytywania danych.

Udostępnij ten post


Link to post
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!

Gość
Napisz odpowiedź...

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