• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Arduino Nano z CH340 ciekawy problem
#11
Bardzo dziekuje za sprawdzenie tematu!!

Przypadkiem odkrylem, ze aplikacja na PC laczy sie z UNO nawet jesli w nim wgrany jest zupelnie inny sketch z obsluga seriala. Stalo sie tak, bo przypadkowo kliknalem CONNECT gdy do komputera podlaczone bylo UNO z zaladowanym sketchem Arduino ISP. Aplikacja na PC wykryla to UNO tak jakby to bylo urzadzenie, z ktorym chce wsploracowac.
Wniosekuje z tego, ze najprawdopodobniej sketch zaladowany na UNO mozy byc dowolny byle tylko byl w nim zdefniowany serial na 9600 i moze jakas wymiana komend na RX/TX.

Tutaj od razu kolejne przemyslenia i pytania:

Zalezy mi na kompaktowym i jednoczesciowym rozwiazaniu mikrokontrolera. Uno nieststy nie moge uzyc bo jest za duze.
Obecnie w swoich zasobach mam jeszcze STM32, Leonardo i pro micro (w drodze do mnie) 

Czy w ogole jest jast mozliwe zeby port USB z Leonardo dziala jak ten z UNO (16u2)?
Doczytalem ze Leonardo moze pracowac w trybie HID i CDC. Moze jeden z tych trybow zadzialalby tak jak (16u2) na UNO ? Jesli to nie mozliwe to uwazam, ze nie ma sensu sie meczyc z modifikacja sketach pod Leonardo albo pro micro. Czy uzycie STM32 byloby latwiejsze ?
 
Odpowiedź
#12
(20-09-2019, 01:05)michulus napisał(a): Czy w ogole jest jast mozliwe zeby port USB z Leonardo dziala jak ten z UNO (16u2)?

Doczytalem ze Leonardo moze pracowac w trybie HID i CDC. Moze jeden z tych trybow zadzialalby tak jak (16u2) na UNO ?
Na oba pytania odpowiedź brzmi tak o ile potrafisz to zrobić.

(20-09-2019, 01:05)michulus napisał(a): Czy uzycie STM32 byloby latwiejsze
Tak o ile go znasz i użyjesz odpowiedniego STM do swojej aplikacji. Wiesz, który STM najlepiej pasuje?
 
Odpowiedź
#13
Z Arduino MICRO też mi nie działa, kod chodzi OK. Można to łatwo sprawdzić wysyłając w terminalu :C#:GB#:GH#, odpowiedź jest 00#00#00#. W przypadku CH340 pojawiają się jakieś odpowiedzi w Moonlite (pojedyncze 0), dla Micro nic. Z DUE program w ogóle się zawieszał (to ARM z portem USB).
HID to po prostu Human Interface Device - myszka, klawiatura, itp. Jak użyjesz przykładów z tym HID, to dodatkowo pojawia się np. mysz. Możesz próbować, ale w moim odczuciu to nie o to chodzi.
O STM w Arduino długo by pisać, https://github.com/leaflabs/libmaple/blo...er/LICENSE możesz ściągnąć core, który ma USB i bootloader, ale kod wgrany w ogóle nie działa prawidłowo. Nawet na dane wysłane z palca w terminalu nie ma odpowiedzi /przychodzi po kilkudziesięciu sekundach. Trzeba by głębiej grzebać, bo normalne przykłady z odczytem analogowym na UART/USB działają bez problemu. Biblioteka też nie jest napisana rygorystycznie pod UNO, bo na ESP32 działa OK.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#14
Dzieki za wsparcie !

Troche dlubalem wczoraj przy sketchu na Leonardo. Usuniecie lini kodu z mrugajaca LEDka powoduje, ze
po wyslaniu w Serial Monitorze :C#:GB#:GH#, odpowiedź  00#00#00# pojawia sie natychmiast. Opoznienie najwyarazniej wynikalo wlasnie z tego.

Probowalem tez wygooglac jakies wartosciowe info n/t problemow w komunikacji po USB apliakcji PC z Leonardo.

Znalazlem 2 ciekawe dyskusje

#1

https://forum.arduino.cc/index.php?topic=143028.0

"...The Leonardo requires that DtrEnable be set when opening the serial connection (on the PC end).
The Serial Monitor does that. Most PC applications do not...."

Jako rozwiazanie zaprpoonowane jest zakomnetowanie lini (w pliku ....\Arduino\hardware\arduino\cores\arduino\CDC.cpp.)

gdzie jest nastepujacy warunek: if (_usbLineInfo.lineState > 0) { }

Wbrew podopowiedziom autora tego pomyslu znalazlem 2 takie miesjca w CDC.cpp. Z opisu wynika ze obydwa dotycza odpowiedzi po serialu tylko gdy port jest otwarty i skonfigurowany. Probowalem komentowac cale odowalnie i wgrywac sketch do Leonardo ale nic to nie dalo. Byc moze cos zrobilem zle.

#2

https://www.lattepanda.com/topic-f6t1429.html?start=20

"....
The key is Leonardo doesn't execute SerialEvent() (for some reason!).
It is supposed to execute between loop() passes as all other Arduinos do
...To get this working, I just added a call to SerialEvent() as the first line in loop() and it now works with the Serial Monitor and my C# code....

Przykladowy kod z ta zmiana do pobrania w URL.
https://www.lattepanda.com/forum/downloa...php?id=309

Prosze o komentarz czy to wlasciwa droga poszukiwan ew sugestie gdzie szukac dalej, co zmienic ?
 
Odpowiedź
#15
Podziwiam zacięcie. To z DTR też zauważyłem - aplikacja Moonlight go nie wysyła i w związku z tym nie następuje reset, dlatego w teście z UNO nie jest potrzebny żaden kondensator na reset, możesz sobie pewnie wstawić nawet jakiś pory delay w Setup i nic to nie zmieni.
Może CH340 też wymaga do aktywacji właśnie sygnału DTR i dlatego tu nie działa. Choć reakcja na działanie Moonlight jest inna dla CH340, on jednak coś odpowiada.
Obawiam się, że to tak działa jak twórca programu na PC zamierzał, może sprzedawali konkretny moduł do kompletu z programem i wcale im nie zależało na tym by z każdym konwerterem USB działało to OK.
Program ogólnie nie jest OK też dlatego, że przycisk REFRESH powinien odświeżać listę portów COM, sam napisałem terminal na bazie poradników na YOUTUBE i tak się robi, by wykrywać na życzenie zmiany w podłaczonych portach COM. Ale ta aplikacja tego nie robi, odświeża tylko przy starcie.
Może są jakieś ustawienia DTR w opcjach portu COM w ustawieniach sprzętu, panel sterownia. Nie sprawdzę już dzisiaj, bo ekipa siedzi w aucie i krzyczą, że pora wyjazdu na weekend minęła.
Powodzenia.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#16
Dzieki wielkie za wsparcie merytoryczne!
Walka trwa poki jest nadzieja a nadzieja umiera ostatnia ! Smile
Przy okazji mozna czegos pozytycznego sie nauczyc.

W ustawieniach COM portu pod Win10 nic nie znalazlem. Potwierdzilem tez, ze aplikacja Moonlite ustawia DTR i RTS = OFF  a IDE Serial monitor ustawia DTR i RTS = ON. Latwe do  sprawdzenia (w Win10,  Command Prompt, komenda: mode COM# - gdzie # to numer COM portu na ktorym siedzi arduino). Teoretycznie wychodziloby wiec, ze arduino Nano, Micro czy Leonardo nie chce odpowidac bo nie ma sygnalu, ze terminal jest gotowy oo pracy. Moze idac za tym ciosem da sie ktorys z tych arduinoppodobnych wyrobow zaprogramowac do aplikacji Moonlita?

Googlajac Arduino Release Notes znalazlem takie cos:


ARDUINO 1.8.4 2017.08.23

[ide]

* Added per-board generic option in config file boards.txt for disabling control of dtr+rts. Thanks @d-a-v


W tym pliku boards.txt nic do ustawiania nie znalazlem. Ten IDE release news jest dosyc stary moze ponzniej sie z tego to wycofano albo szukam w zlym pliku IDE?

Z tego co dotad wygooglaem wnioksuje, ze kontrola DTR i RTS dla Leonardo/Micro dostepna jest posrednio w pliku IDE arduino core: CDC.CPP. 

https://github.com/arduino/ArduinoCore-a...no/CDC.cpp

(zobacz linie kodu 232, 254 z odwolaniami: usbLineInfo.lineState 

Probowalem te linie zmienic aby Leonardo/Micro odpowiadalo mimo, ze DTR i RTS = OFF ale jakos bez powodzenia. Zupelnie jakbym zadnych zmian tam nie robil. Czy ten CDC.CPP jest pobierany prze kazdej kompilacji sketcha (upload) ? 

Nie rozumiem tez za bardzo tego pomyslu z zadeklarowaniem SerialEvent a potem odwolaniem sie do tego w Loopie. Jakie to ma znacznie ze (wg autora ) Leonardo/Micro bez tego nie chce odpowiadac po Serialu. W zalaczniku wrzucam sketch z przykladem tego rozwiazania.

Czy w wolnej chwili moglbys rzucic okiem na obydwa rozwiazania i cos podpowiedziec ?

Jeszcze raz wielkie dzieki za cierpliwosc i pomoc !
 
Odpowiedź
#17
Raczej chodzi tylko o konkretne model konwerterów UART, bo na Atmega i CP2102 działa OK.
Serial event nie jest wywoływany na port COM USB w Leonardo, dla UART1 działa OK.
Przykład użycia dwóch serial event w Leonardo:
Kod:
String inputString = "";         // a String to hold incoming data
bool stringComplete = false;  // whether the string is complete
String inputString1 = "";         // a String to hold incoming data
bool stringComplete1 = false;  // whether the string is complete

void setup() {
  // initialize serial:
  Serial.begin(115200);
  Serial1.begin(115200);
  // reserve 200 bytes for the inputString:
  inputString.reserve(200);
  inputString1.reserve(200);
}

void loop() {
   serialEvent();
  // print the string when a newline arrives:
  if (stringComplete) {
    Serial1.println(inputString);
    // clear the string:
    inputString = "";
    stringComplete = false;
  }

    if (stringComplete1) {
    Serial.println(inputString1);
    // clear the string:
    inputString1 = "";
    stringComplete1 = false;
  }
}

/*
  SerialEvent occurs whenever a new data comes in the hardware serial RX. This
  routine is run between each time loop() runs, so using delay inside loop can
  delay response. Multiple bytes of data may be available.
*/
void serialEvent1() {
  while (Serial1.available()) {
    // get the new byte:
    char inChar = (char)Serial1.read();
    // add it to the inputString:
    inputString1 += inChar;
    // if the incoming character is a newline, set a flag so the main loop can
    // do something about it:
    if (inChar == '\n') {
      stringComplete1 = true;
    }
  }
}

void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();
    // add it to the inputString:
    inputString += inChar;
    // if the incoming character is a newline, set a flag so the main loop can
    // do something about it:
    if (inChar == '\n') {
      stringComplete = true;
    }
  }
}
serialEvent(); nie zostanie wywołany przez funkcje Arduino i musi być po prostu wstawiony do loop. 
Tak samo jest z ESP, trzeba wstawić do loop by działało, natomiast testowałem z ESP8266 i ESP32 ten program Moonlight i działa OK. Wniosek - serialEvent nie ma związku.
No i jeszcze ten obrazek:
   
Jedno co jeszcze mogę doradzić to temat na elektrodzie, może jest tam ktoś kto specjalizuje się w portach COM. Ja tylko mam odczucie, że to jest kwestia sprzętu/sterowników i konstrukcji tego programu od strony PC, od strony Arduino grzebanie nic nie da.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#18
Dzieki za sprawdzenie i wskazowki.

Niestety na program kompletnie nie mam wplywu. No chyba tylko w takim sensie, ze napisze swoj wlasny ale calym zalozeniem tego projektu jest aby nie bawic sie w pisanie od nowa wszystkiego tylko uzyc istaniejacy darmowy soft i dorobic do niego strownik i elektronike. Jesli nie da sie na bazie arduino i atmegi to na innej platformie ( np STM).
 
Odpowiedź
#19
No to użyj ESP32 z chipem CP2102, ja go oczywiście używam w Arduino. W ESP8266 raczej nie starczy pinów. STM i ESP są na logice 3.3V, tu może być ewentualnie problem i konieczność dodania konwertera. Lub niezależny konwerter USB z CP2102 podłączony do PRO MINI.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#20
Myslalem o ESP ale nie mam jeszcze pomyslu na zastosowanie wifi do mojego projektu. Poza tym na razie bardzo malo wiem o tym ukladzie. Biore w kazdym badz razie ESP pod uwage. Jest tez za klika dolcow chinski wyrob rzemiesllniczy o nazwie "DM Strong Mini UNO R3". To praktycznie UNO R3 tylko tak na oko ze 2+ razy mniejsze. Powlacze i dam znac co mi z tego wyszlo.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości