Skocz do zawartości

Wrona

Użytkownicy
  • Zawartość

    101
  • Rejestracja

  • Ostatnio

Informacje

  • Płeć
    Mężczyzna

Ostatnio na profilu byli

Blok z ostatnio odwiedzającymi jest wyłączony i nie jest wyświetlany innym użytkownikom.

Osiągnięcia użytkownika Wrona

Entuzjasta

Entuzjasta (7/19)

  • Za 100 postów
  • Za 5 postów
  • Za 25 postów
  • To już rok!
  • To już 5 lat!

Odznaki

6

Reputacja

  1. @kaczakat Skoro działa i z kompem się komunikuje a nawet cały układ w pewnych okolicznościach działa to tak jak mówiłem nie ma sensu otwierać pacjenta i omawiać jego bebechów i tworzyć poboczne wątki skoro problemem jest język i uszy :) Tak czy siak dzięki Ci bo sprawa się wyjaśniła. Gdy taki gamoń jak ja pyta o taką błahostkę jak ja zapytałem to wystarczy jednym zdaniem odpowiedzieć że "Bo w komunikacji po USB mamy Device oraz Host (kontroler magistrali np. komputer), a twoje Arduino ani ESP nie są Hostami o bez doinwestowania w dodatkowe nakładki nie będą nimi, a poczytać o tym można np. tu https://forbot.pl/blog/kurs-stm32-f4-11-komunikacja-przez-usb-id13477" Wtedy taki gamoń jak ja, umyje ręce po dojeniu krów i się cieszy że coś już więcej wie, a resztę doczyta. Całe to moje kombinowanie wynikało z podstawowej mej cechy czyli "nie znoszę lutowania elektroniki". W całej tej zabawie lutowanie jest jak kożuch na mleku. No więc jak mam coś polutować to zaczynam kombinować czy nie dałoby się wykorzystać jakiegoś modułu. Teraz już wiem że tego nie ominę w tym przypadku, bo nawet gdybym się szarpnął na HostShield to by była za duża ingerencja w program, bo mam już wszystkie piny zajęte. Sprawa się dzięki Tobie wyjaśniła.
  2. @kaczakat Dzięki. Nie ma żadnego schematu. Ot Cztery kable idą od nadającego Arduino czyli RX, TX i zasilanie i cztery wchodzą do odbierającego ESP. Gdy po drodze stawiałem konwerter stanów logicznych to działało to w sposób nie przewidywalny (po jakiś czasie siadało) dlatego zacząłem kombinować czym by go zastąpić. Jednocześnie gdy na drodze tej komunikacji stawiałem komputer poprzez Pl2303 to wszystko działało bez zakłóceń. Dlatego zrezygnowałem z konwertera stanów logicznych i zacząłem kombinować z programatorem jako pośrednikiem. Kod programu tu jest bez znaczenia bo zarówno wysyłanie jak i odbieranie to określony moment rozdzielony wieloma sekundami. Odbiornik czeka sobie spokojnie na dane i niczym innym się nie zajmuje a dopiero gdy się doczeka to sobie z nimi robi co tam ma robić a potem znowu sobie czeka i nic więcej nie robi. Generalnie komunikacja to tylko kilka znaków wysyłanych co kilka minut. Pierwszy prototyp na płytce stykowej działał wiele dni bez problemu dopiero gdy chciałem ESP oddalić na jakimś kablu i zasilać za pośrednictwem Arduino to się zapędziłem w ten kozi róg. Raz jeszcze dzięki. Jakoś w końcu pogodzę te dwa napięcia w sposób odpowiedni dla mnie i urządzenia.
  3. Powinienem wiedzieć wiele rzeczy. Zapewne powinienem wiedzieć dlaczego dwa programatory połączone beczką nie zadziałają tak jak tego się spodziewałem. Ale nie rzucaj we mnie kredą ani nie bij linijką. Po prostu mnie zignoruj.
  4. Na pewno w twoim pytaniu jest głęboki sens i gdybym był inteligentnym gościem to bym od razu załapał ogrom wiedzy z w nim zawarty, ale ... nie jestem 😞 Ja sobie to wyobraziłem tak: Z Arduino idzie sygnał z TX i wchodzi na pin RX do PL2303 potem beczka zamienia M na F i podpinam kolejne PL2303 gdzie zmieniam napięcie z 5V na 3V by zasilać ESP a sygnał wychodzi z TX do RX ESP. Generalnie układ zaczął reagować poprawnie tylko zamiast danych wysyła jakieś głupoty. Może pokombinuje z dzielnikami napięcia.
  5. Chciałem zrobić komunikacje Arduino i ESP poprzez „SoftwareSerial”. Problemem było że napięcie z Arduino to 5V (i to musi tak zostać) a ESP przyjmuje tylko 3,3V. Rozwiązaniem pierwszego wyboru był konwerter stanów logicznych. Trochę z tym zamieszania, bo z jednej strony trzeba podać 5V a z 3,3V czyli trochę zamieszania z napięciami. No ale się udało, ale raz działało a raz nie. Jak trochę podziałało to potem przestawało. Arduino podpięte do komputera komunikowało się bez problemu. Podobnie ESP podpięte do komputera poprzez PL2303 działało bez najmniejszego problemu. Jednak, gdy tylko oba te podzespoły spinałem poprzez konwerter to znowu robiło się dziadostwo. W mojej główce pojawił się pomysł, że ESP z Arduino połączę poprzez PL2303 zamiast zwykłego konwertera. W zasadzie użyłem dwóch PL2303 spiętych ze sobą beczką USB (docelowa będzie około metra kabla). Załatwia to problem zasilania, bo PL2303 od strony ESP ma zworkę n 3V i spokój. Dodatkowo diody pozwalają stwierdzić, czy są nadawane sygnały RX i TX. No ale układ nie działa, bo pewnie jest coś czego nie wiem i nie rozumiem. Kiedy Arduino nadaje to na PL2303 po jego stronie zapala mi się dioda RX, ale po drugiej stronie „beczki” na PL2303 od strony ESP ciszą i nie zapala się TX (i dane nie dochodzą do ESP). Podobnie w drugą stronę choć to nie jest problem, bo mimo że ESP czasami coś nadaje to i tak Arduino nie słucha. Coś pominąłem w swej ignorancji i nie ma prawa to zadziałać?
  6. Tak jestem pewien bo na serwerze zapisuje się zdjęcie i mam na nie podgląd.
  7. Kodów próbowałem wielu i z każdym mam ten sam problem. Ale oczywiście wstawiam poniżej jeden z nich. #include "esp_camera.h" #include "soc/soc.h" #include "soc/rtc_cntl_reg.h" #include "driver/rtc_io.h" #include <WiFi.h> #include <WebServer.h> #include <WiFiClient.h> #include "ESP32_FTPClient.h" #include <WiFiUdp.h> char* ftp_server = "***"; char* ftp_user = "***"; char* ftp_pass = "***"; char* ftp_path = "***"; const char* ssid = "***"; const char* password = "***"; unsigned long AC = 0; unsigned long ZC = 0; WebServer serverlokalny(80); WiFiUDP ntpUDP; ESP32_FTPClient ftp (ftp_server,ftp_user,ftp_pass, 5000, 2); #define CAMERA_MODEL_AI_THINKER #define PWDN_GPIO_NUM 32 #define RESET_GPIO_NUM -1 #define XCLK_GPIO_NUM 0 #define SIOD_GPIO_NUM 26 #define SIOC_GPIO_NUM 27 #define Y9_GPIO_NUM 35 #define Y8_GPIO_NUM 34 #define Y7_GPIO_NUM 39 #define Y6_GPIO_NUM 36 #define Y5_GPIO_NUM 21 #define Y4_GPIO_NUM 19 #define Y3_GPIO_NUM 18 #define Y2_GPIO_NUM 5 #define VSYNC_GPIO_NUM 25 #define HREF_GPIO_NUM 23 #define PCLK_GPIO_NUM 22 void setup() { WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); Serial.begin(9600); Serial.setDebugOutput(true); Serial.println(); WiFi.begin(ssid, password);delay(1000); while(WiFi.status()!= WL_CONNECTED){delay(500); Serial.print(".");} serverlokalny.begin(); initCamera(); } void initCamera() { camera_config_t config; config.ledc_channel = LEDC_CHANNEL_0; config.ledc_timer = LEDC_TIMER_0; config.pin_d0 = Y2_GPIO_NUM; config.pin_d1 = Y3_GPIO_NUM; config.pin_d2 = Y4_GPIO_NUM; config.pin_d3 = Y5_GPIO_NUM; config.pin_d4 = Y6_GPIO_NUM; config.pin_d5 = Y7_GPIO_NUM; config.pin_d6 = Y8_GPIO_NUM; config.pin_d7 = Y9_GPIO_NUM; config.pin_xclk = XCLK_GPIO_NUM; config.pin_pclk = PCLK_GPIO_NUM; config.pin_vsync = VSYNC_GPIO_NUM; config.pin_href = HREF_GPIO_NUM; config.pin_sscb_sda = SIOD_GPIO_NUM; config.pin_sscb_scl = SIOC_GPIO_NUM; config.pin_pwdn = PWDN_GPIO_NUM; config.pin_reset = RESET_GPIO_NUM; config.xclk_freq_hz = 20000000; config.pixel_format = PIXFORMAT_JPEG; if(psramFound()){config.frame_size=FRAMESIZE_UXGA;config.jpeg_quality=10;config.fb_count=2;} else {config.frame_size=FRAMESIZE_UXGA;config.jpeg_quality=12;config.fb_count=1;} esp_err_t err=esp_camera_init(&config); if (err != ESP_OK) {Serial.printf("Błąd 0x%x", err);return;} } void loop() { serverlokalny.handleClient(); ZZ(); while((AC-ZC)<=60000UL) {AC = millis(); delay(100);}ZC = AC; } void ZZ() { camera_fb_t * fb = NULL; fb = esp_camera_fb_get(); if(!fb) {return;} String NO = "cos.jpg"; ftp.OpenConnection(); ftp.ChangeWorkDir(ftp_path); ftp.InitFile("Type I"); ftp.NewFile(NO.c_str()); ftp.WriteData(fb->buf, fb->len); ftp.CloseFile(); ftp.CloseConnection(); esp_camera_fb_return(fb); }
  8. Mam esp32cam który co kilka minut robi zdjęcie wysyła na serwer. Wszystko działa ale od czasu do czasu dochodzi do błędu i dostaje komunikat: [E][camera.c:1049] camera_probe(): Detected camera not supported. [E][camera.c:1249] esp_camera_init(): Camera probe failed with error 0x20004 Programowy restart nie naprawia problemu i dopiero odłączenie urządzenia i ponowne uruchomienie przynosi pozytywny skutek do czasu aż po kilku czy kilkunastu a czasem kilkudziesięciu wykonanych zdjęciach znów komunikat o błędzie. Ma ktoś jakiś pomysł jak rozwiązać ten problem bez konieczności ciągłego wyłączania i włączania.
  9. @ethanak Nie ma znaczenia. Nie potrafisz skupić się na konkretnym problemie. Już ci napisałem że jest sobie nadajnik i odbiornik. Nie ma dla nas znaczenia jako one się komunikują i czy się rozumieją. Zapewne się rozumieją skoro całość działa bez zarzutu. Dane przekazywane przez nadajnik są prawidłowo odczytywane i przetwarzane przez odbiornik. Cokolwiek się dzieje w pierwotnej wersji tego urządzenia to dzieje się tak jak ma się dziać. Teraz na scenę wchodzę ja "Janusz Hakerstwa". Dzięki sile i godności osobistej rozkręcam obudowę i podpinam swoje Arduino Uno jako "podsłuch" czyli mamy pierwotny odbiornik ale jest też dodatkowy czyli mój. Stworzyliśmy nową linie komunikacji jednostronnej i to na tym trzeba się skupić. Mam więc dostęp do tego stringa i go widzę swymi "paczałkami". Znamy więc jako strukturę i nic nie jest tutaj tajemnicze. Mimo że starasz się pisać tak by nic nie napisać, to moja skromna osoba (która więcej nie wie, niż wie bo nadal raczkuje przed komputerem) wywnioskowała że ma pokombinować tak by: 1. Do pierwotnego nadajnika musze się dobrać i dopisać tam fragment który będzie dodatkowo wysyłał "ciąg znaków" 2. Muszę przekopać internety za jakaś konkretna funkcją która już w odbiorniku/podsłuchu zamieni mi ten ciąg znaków tablicę czy vektor automatycznie rozpoznając gdzie zaczynają się i kończą kolejne zmienne np. rozpoznając kolejne '\t' Dziękuje za poświęcony czas ale widzę że nic z tego nie będzie więc w poszanowaniu tego czasu zakończę w tym miejscu. Raz jeszcze dziękuje i pozdrawiam EDIT: Gdyby tu trafiła przypadkiem, taka jak ja "programistyczna sierota" to pragnę zakomunikować że cały problem rozwiązuje odpowiedz zawierająca się w krótkim - "sprawdź se string.indexOf()" 🙂
  10. @ethanak Jakiś nadajnik wysyła do odbiornika poprzez UART stringa z wynikami. Nie ma dla nas znaczenia czy tamten odbiornik go rozumie i jak go rozumie. Nie wnikamy w to. Ktoś tak to zaprogramował i to działa i jest sprawne i to nie nasza sprawa. Nie to jest rozpatrywana kwestią i o tym nie ma sensu dyskutować. Ja natomiast na drodze stawiam "podsłuch" z Arduino i mam dostęp do tego stringa. Widzę go np. jako 2020-11-02 10:05:24 24.54 24.55 25.84 25 23 24 28 21 24 25 Tak UwagaNaKota Nie WezParasol na końcu jest '\n' bo docelowy odbiornik czyta przekaz do tego znaku Teraz potrzebuje go rozebrać na części by każdą z nich przypisać do moich nowych zmiennych. Bez ingerencji w oryginalny projekt zrobiłem to substringami ale to działa tylko w przypadku liczb do czasu aż temperatury są zawsze powyżej 10oC. Testuje więc możliwość że oryginalny projekt będzie miał dodatkowo (pierwotny string zostanie taki jaki jest i poleci sobie tam gdzie ma docelowa polecieć) możliwość wysłania tablicy stringów zawierającej te same informacje co pierwotny string zbiorczy. Dzięki temu mogę odwoływać się do poszczególnych "szufladek" zamiast określać bezwzględną pozycje początku i końca każdego wyniku. Poszczególne elementy tablicy wysyłam bez problemu np. Serial.println(Tablica[0]) czy Serial.println(Tablica[0]+Tablica[1]) Ja bym chciał wysłać całą tablice w całości by po stronie podsłuchu mieć odebraną jedną konkretną tablicę i korzystać z "szufladek" tablicy. Pierwszy raz podchodzę do tematu tablic więc szukam konkretnej informacji na zasadzie "nie da się i musisz to zrobić inaczej" lub "da się i obczaj sobie komendę taką a taką".
  11. @ethanak Bo tam są również wysyłane komunikaty tekstowe a nie tylko wyniki pomiarów. Gdybym miał najpierw zakodować te teksty na liczby a potem odpowiednio je rozkodować na powrót w teksty to by było trochę karkołomne. Oczywiste dla zmiennych dychotomicznych lub o wąskim zakresie możliwych wyników byłoby to rozsądne rozwiązanie. Gorzej z wynikami daty i czasu bo trzeba by je porozkładać na czynniki pierwsze a data i czas mają stałą szerokość i doskonale można je "ekstrahować" string.substring(x,y). Generalnie jest tak że te cały długi string jest wysyłany w innym celu i do innego urządzenia. Dlatego kombinuje by w niego jak najmniej ingerować, tak by nadal służył temu do czego został zaprojektowany przez innego "wynalazcę". Ja go tylko po drodze przechwytuje i chce podzielić na części składowe. Korzystanie z substrinów pozwala mi całkowicie pozostawić oryginalny projekt takim jakim jest a ja jedynie podsłuchuję transmisje i rozwijam poboczny projekt. No ale skoro to się nie sprawdzi w praktycznym zastosowaniu to szukam innego rozwiązania.
  12. Mam pomiary z 10 czujników temperatury i kilka zmiennych typu String. Wszystko to scaliłem w jeden String i wysłałem za pośrednictwem UART z jednego Arduino UNO do drugiego. Po stronie odbiornika chciałem powyciągać z tego Stringa kilka informacji. Dla takiego szczawika programowania, najprostszym rozwiązaniem było użycie string.substring(x,y). Działa, ale działać będzie jedynie do czasu gdy całość prototypu stoi na biurku i wskazuje temperatury dwucyfrowe. W praktyce pewne czujniki temperatury mogą mieć odczyty jednocyfrowe a wtedy ustawione na sztywno pozycje x i y przestaną mieć sens. Wolałbym uniknąć kombinowania polegającego na tym że gdy temperatura jest jednocyfrowa to dodaje przed nią "0". W efekcie dostałbym stringa o stałej "długości", ale to ostateczność. Uwagę mą zwróciła możliwość zapisywania wyników w postaci jednowymiarowej tablicy stringów bo wtedy odwołuje się do kolejnego numeru i nie trzeba się martwić tym czy są tam dwie czy jedna cyfry i jakie długie są dane tekstowe. Teraz konkretny problem na którym utknąłem, czyli jak przepchnąć taką tablice przez UART by po stronie odbiornika wesolutko odwoływać się do zmiennych po ich indeksach? Jeśli jednak "to se nedá" to może powinienem kombinować z dwuwymiarową tablicą char'ów? Poradźcie coś.
  13. @marek1707 No właśnie coś tam się kiełbasiło. Nawet jeśli kręciłem tylko w jedna stronę to liczby nie zawsze narastały a czasem malały. Już do tego nie wrócę by Ci to zademonstrować bo musiałem uporządkować biblioteki Enkodera. Przerwania nie pomagały a właściwie zaprzepaszczały sens stosowania enkodera. Na razie serdecznie dziękuje za dotychczasową pomoc. W międzyczasie zająłem się kolejnym problemem do rozwiązania. Jak coś znów spierniczę to się odezwę 🙂 Dzięki.
  14. @marek1707 Próbowałem dzielenia przez 4 i robił się syf w kolejności cyfr. Na spokojnie ogarnę to później. Natomiast faktycznie bibliotekę musiałem zmieniać. Dotychczasowa nie rozumiała co właściwie chce jej przekazać i dopiero nowa z linku jaki podałeś rozumiała o co chodzi z tym ENCODER_DO_NOT_USE_INTERRUPTS. Na razie dzięki. Muszę przemyśleć swoje priorytety, bo być może najlepszym rozwiązaniem będzie zamiana enkodera na potencjometr i przycisk.
  15. @marek1707 Dzięki, faktycznie zmieniam bibliotekę enkodera na tą która wskazałeś, by nie działać na przerwaniach. Uruchomiłem przykład: #define ENCODER_DO_NOT_USE_INTERRUPTS #include <Encoder.h> Encoder myEnc(2, 3); void setup() { Serial.begin(9600); Serial.println("Basic NoInterrupts Test:"); } long position = -999; void loop() { long newPos = myEnc.read(); if (newPos != position) { position = newPos; Serial.println(position); } } Krótkie pytanko? Dlaczego jeden krok enkodera daje w efekcie czterokrotne zliczanie? Przykładowo startujemy od 0. Obracam enkoder o jeden "krok a na monitorze mam od razu 1, 2, 3 i 4, kolejny krok i od razu 5, 6, 7 i 8.
×
×
  • 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.