Skocz do zawartości

App Inventor + Arduino bluetooth HC-06


Enter24

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

Link do komentarza
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ę.

Link do komentarza
Share on other sites

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
Link do komentarza
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
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

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. 

Link do komentarza
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.

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.