Skocz do zawartości

jordanj

Użytkownicy
  • Zawartość

    23
  • Rejestracja

  • Ostatnio

Reputacja

1 Neutralna

O jordanj

  • Ranga
    2/10

Informacje

  • Płeć
    Mężczyzna
  • Języki programowania
    Objective-c, Swift

Ostatnio na profilu byli

85 wyświetleń profilu
  1. Problem rozwiązałem i myślę, że potomnym się ta wiedzy przyda. Płytki stykowe są niskiej jakości i zależnie od tego gdzie wetkniemy zworki (do którego otworu) opór może wynosić 1 Ohm, 6 Ohm, a nawet ponad 160 Ohm. Spadek napięcia rośnie wraz z oporem oraz prądem. Gdy mikrokontroler pobiera mały prąd np. testowy sketch z mrugającą diodą to pobór prądu jest niewielkie (ok. 25mA) i spadek do ok. 3V, co jest jeszcze akceptowalną wartością do kontrollera. Gdy wyszukujemy sieci WiFi to pobór prądu rośnie do 125-140 mA i spadek prądu nawet do 2,3V, co skutkuje uruchomieniem brownout protection w uC. Zlutowanie identycznego układu na płytce prototypowej rozwiązało problem. Reasumując. Dla innych żółtodziobów takich jak ja. Używanie płytek stykowych do testowania projektów, gdzie istotne jest nie tylko napięcie (sygnał), ale przepływający prąd np. zasilanie czegoś może wpędzić nas w problemy kosztujące dużo bezproduktywnie spędzonego czasu.
  2. Bardzo dziękuję za wyjaśnienie, oczywiście działa.
  3. Dlaczego w getBytes jest rzutowanie tablicy na typ void* ? Przecież ona zwraca typ void, więc rzutowanie powinno by raczej na int8_t[10] czy mi się źle wydaje?
  4. Teraz akurat używam ESP32 i tam jest w Arduino zarówno klasa do zapisywania do EEPROMu bezpośrednio (podając adres) jak i owrapowane preferencje (wygodniejsze bo ma to strukturę key -> value). Key jest char*, a value może być char, int i wiele innych, a w ostateczności const void*. Do tego używam dwóch funkcji: size_t getBytes(const char* key, void * buf, size_t maxLen); size_t putBytes(const char* key, const void* value, size_t len); Czyli mam sobie jakąś tablicę, np. rzeczoną int8_t[10] i muszę do niej stworzyć wskaźnik (pointer).
  5. Nieprecyzyjnie się wyraziłem. Muszę coś zapisać do eepromu, ta funkcje jako argument potrzebuje danych do zapisania typu const void *. ..., a zatem z int8_t[10] muszę zrobić const void* i vice versa.
  6. Cześć, muszę zapisać tablicę, najprościej to zrobić jako bytes i już drugi wieczór męczę się aby z tablicy zrobić bajty i vice versa. Tablica zawiera elementy int8_t czyli 8-bitowe liczby całkowite ze znakiem. Robię tak: Deklaruję jakąś tablicę: int8_t OTCoutdoorArray[10]; int8_t OTCsupplyArray[10]; uint8_t OTCentries; Gdzieś do tych tablic przypisuję wartości, tablice wyświetlam za pomocą pętli for i widzę, że te wartości się tam znajdują. Przypisuję do niej takie wartości. 21 20 18 25 15 30 0 40 -10 50 -20 55 -30 65 Próbuję zamienić te tablice na ciąg bajtów. void *oBytes; void *sBytes; oBytes = (int8_t *)OTCoutdoorArray; sBytes = (int8_t *)OTCsupplyArray; Następnie te ciągi bajtów próbuję zamienić na tablice. int8_t (*oArray)[OTCentries] = (int8_t (*)[OTCentries]) oBytes; int8_t (*sArray)[OTCentries] = (int8_t (*)[OTCentries]) sBytes; ... i sprawdzam w pętli efekt działania tych przekształceń. for(int i = 0; i<OTCentries; i++) { Serial.println(String(OTCoutdoorArray[i]) + " " + String(OTCsupplyArray[i]) + " " + String(*oArray[i]) + " " + String(*sArray[i])); } W rezultacie dostaję taki wynik: 21 20 21 20 18 25 0 30 15 30 50 -37 0 40 30 0 -10 50 8 -5 -20 55 -128 0 -30 65 -5 0 Dwie pierwsze kolumny prezentują dane z tablic bez przekształceń do ciągu bitów, a dwie kolejne po przekształceniu i powrocie do tablic. Pierwsza linijka jest OK, a dalej się coś pieprzy. Już straciłem pomysły dlaczego to nie działa - moja znajomość C++ jest dość podstawowa, szczególnie w zakresie bitwise operations - wstyd się przyznać.
  7. Ja tego rezystora do płytki nie wlutowałem gdyż nie było w zestawie, a w domu miałem tylko THT. Wobec tego celem uruchomienia mam drucik z rezystorem łączący zasilanie z EN lub to samo za pomocą płytki stykowej (płytka ma strasznie duże opory, ale o tym przy okazji). P.s. Takiej właście podstawku szukam, ale jakoś nie mam szczęścia i nie mogę trafić na aukcjach.
  8. Nie, w tej chwili używam tylko pinów 3V3, GND, EN, IO0, 23, TX i RX. Używam https://botland.com.pl/pl/moduly-wifi/7655-uklad-wifi-bluetooth-ble-esp-wroom-32-smd.html w tej chwili na czymś takim: https://botland.com.pl/pl/przejsciowki-smd-dip/8894-adapter-dla-modulu-wifi-esp-32s.html . Po drugiej nocce walki też pomyślałem, że warto spróbować z gotowym modułem, więc zamówiłem: https://botland.com.pl/pl/moduly-wifi/8893-esp32-wifi-bt-42-platforma-z-modulem-esp-wroom-32-zgodny-z-esp32-devkit.html .
  9. Ja właśnie przylutowałem cały moduł, a nie tylko pamięć tj. testowałem na zupełnie nowym ESP32.
  10. Niestety to nie to. Wylutowałem go i wlutowałem nowiutki z paczki nieotwieranej wcześniej i problem nadal występuje. Na płytce zwarć nigdzie nie ma. Do tego podłączałem go do Arduino IDE na innym Macu i rezultat zupełnie taki sam. Kończą mi się pomysły co może być źle. Ten nowy również flashowałem za pomocą NodeMCU (po nieudanej próbie z Arduino IDE), zakończyło się tak jak z poprzednim tj. wg logu sukces, a naprawdę D Command: esptool.py --port COM23 --baud 115200 --after no_reset write_flash --flash_mode dio 0x00000 D:\Desktop\main.ino.esp32.bin --erase-all esptool.py v2.6 Serial port COM23 Connecting.... Detecting chip type... ESP32 Chip is ESP32D0WDQ5 (revision 1) Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None MAC: 3c:71:bf:dc:f9:44 Uploading stub... Running stub... Stub running... Configuring flash size... Auto-detected Flash size: 4MB Erasing flash (this may take a while)... Chip erase completed successfully in 9.0s Compressed 727488 bytes to 406996... Wrote 727488 bytes (406996 compressed) at 0x00000000 in 37.6 seconds (effective 154.9 kbit/s)... Hash of data verified. Leaving... Staying in bootloader. Firmware successfully flashed. Unplug/replug or reset device to switch back to normal boot mode. Po restarcie w konsoli widziałem: rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) flash read err, 1000 ets_main.c 371 ets Jun 8 2016 00:22:57
  11. Cześć, bawię się z ESP32, do wczorajszej nocy wszystko szło OK, ale zaczęły się problemy z uploadowaniem flasha, których nigdy wcześniej nie miałem, a pół nocy Googlania nie przyniosło rezultatu. Otóż, gdy uploaduję za pomocą Arduino IDE (na Mac OS X, jeśli to ma znaczenie) to widzę taki błąd w konsoli: Sketch uses 727370 bytes (55%) of program storage space. Maximum is 1310720 bytes. Global variables use 38448 bytes (11%) of dynamic memory, leaving 289232 bytes for local variables. Maximum is 327680 bytes. esptool.py v2.6 Serial port /dev/cu.usbserial-AM00LYR0 Connecting.... Chip is ESP32D0WDQ5 (revision 1) Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None MAC: 3c:71:bf:dd:0b:00 Uploading stub... A fatal error occurred: Invalid head of packet (0x00) A fatal error occurred: Invalid head of packet (0x00) Restart komputera, zamiana gniazda USB i podobne zabiegi z różnych forów nie przyniosły rezultatu. Zmiana baudrate również bez efektu. Wobec tego dokonałem eksportu do pliku .bin i wgrałem flash na komputerze z MS Windows Vista za pomocą Node MCDU. Sama operacja wg logu zakończyła się powodzeniem. Rzeczywistość jest jednak odmienna. Moduł wpada w bootloopa i do konsoli pluje takim logiem: 13:44:49.957 -> rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) 13:44:49.957 -> flash read err, 1000 13:44:49.957 -> ets_main.c 371 Gdy zewrę GPIO 0 z GND to w konsoli pokazuje: 13:45:00.879 -> rst:0x1 (POWERON_RESET),boot:0x3 (DOWNLOAD_BOOT(UART0/UART1/SDIO_REI_REO_V2)) 13:45:00.879 -> waiting for download Czyli niby dobrze, ale nie mogę zrobić upload. Na koniec taka drobna, ale być może bardzo istotna uwaga. Kilka godzin przed wystąpieniem problemy podłączyłem niechcący odwrotnie zasilanie czyli 3V3 do GND i GND do 3V3. W tym czasie miałem tam program, który między innymi wystawiał access point i serwer HTTP. Jakież było moje zdziwienie gdy po poprawnym podłączeniu działał normalnie. Od tego czasu (..., a może wcześniej, ale nie miałem okazji spróbować) nie mogę zaktualizować flasha. Czyżbym go uszkodził w jakiś nietypowy sposób? Jakikolwiek pomysł mile widziany.
  12. Cześć, odkopałem ten wątek gdyż mam podobny problem z LF33, a dokładnie z LF33CV. Na wejściu podaję 5V, przy obciążeniu 0mA na wyjściu mam 3,3V. Gdy układ próbuje wyciągnąć 110mA to napięcie spada do niespełna 3V i uC nie startuje. Używam ESP32. Kondensatory do ESP32 zgodnie z DS tego mikrokontrolera, a kondensator do LF33 na wejściu zgodnie z notą, a na wyjściu trochę większy - 47uF zamiast 10uF, gdyż tylko taki elektrolit LOW ESR miałem. Próbowałem też z 10uF na wyjściu, ale bez low ESR - efekt dokładnie ten sam, Aby zobrazować problem. Zasilanie prosto z PSU. Na wyjściu z zasilacza są równe 3.3V (sprawdzałem poza kadrem miernikiem na zaciskach), na breadboardzie są chyba dużo opory (kilka Ohm na parę centymetrów) i napięcie ciut spadło, ale w granicach działania. Teraz zasilanie z LF33CV. Na wejściu ustawiam 5V i ograniczam prąd do 0,9A (próbowałem też ograniczać do 2A), bez obciążenia jest ok, pod obciążeniem jest zdecydowanie poniżej 3V. Próbowałem też zwiększać napięcie do okolic górnego limitu wejścia tj. 12V i spadek był taki sam. Poniżej nota stabilizatora. https://botland.com.pl/pl/stabilizatory-liniowe/126-stabilizator-ldo-33v-lf33cv-tht-to220.html?search_query=lf33cv&results=2 (str 11, LF33C) Jeśli dobrze rozumiem to on przy obciążeniu 200mA zadowala się dropout voltage o 0,2-0,35V, a przy obciążeniu 500mA 0,4-0,7V. Dobrze rozumiem? Z góry dziękuję za jakieś sugestie.
  13. Cześć, Edison to fajna zabawka, wrażenia z kursu jeszcze opiszę (co jest aktualne, a co się trochę zdeaktualizowało). Napotkałem pewien problem, pogrzebałem w czeluściach Internetu i nie mogę nigdzie znaleźć sensownego rozwiązania. Mianowicie chodzi o programowanie obiektowe w Arduino. Tak aby nie mieć wszystkiego w jednej funkcji loop, która może mieć nawet tysiące linii kody tylko dzielić kod na klasy, najlepiej te klasy zapisywać w oddzielnych plikach czyli tak bardziej współcześnie (pamiętam jedną z firm, w której pracowałem, pod koniec lat 2000, w której były pliki po 3500 linii kodu zawierajace w sobie PHP, MySQL, HTML, JavaScript i dla urozmaicenia czasami coś jeszcze). Do rzeczy. Poeksperymentowałem i napisałem prosty wrapper do LCD. Podobieństwa do znanych języków i wskazówki z błędów kompilatora dały taki rezultat. #include <LiquidCrystal_I2C.h> class MessageGenerator { String lines[2]; bool clear = false; LiquidCrystal_I2C *screen; public: MessageGenerator() { this->screen = new LiquidCrystal_I2C(0x27, 16, 2); this->screen->init(); this->screen->backlight(); this->screen->noAutoscroll(); } public: ~MessageGenerator() { free(this->screen); free(lines); } public: void setLine(String s, int l) { String oldV = lines[l]; if (oldV != s) { lines[l] = s; clear = true; } } public: void display() { if (clear) { this->screen->clear(); clear = false; } this->screen->setCursor(0, 0); this->screen->print(lines[0]); this->screen->setCursor(0, 1); this->screen->print(lines[1]); } }; MessageGenerator *lcd;// = new MessageGenerator(); void setup() { Serial.begin(9600); Serial.println("setup arduino"); lcd = new MessageGenerator(); lcd->setLine("Have a Nice Day", 0); lcd->display(); } Działa to losowo tj. czasami działa, a czasami nie działa. Nie do końca wiem dlaczego. Nie wiem czy Arduino jest bardziej podobny do C czy bardziej do C++ to też nie wiem jak tego używać np. czy jest jakiś garbage collector czy też manualnie zarządzać pamięcią, jak przydzielać adresy obiektom (zwyczajnie używać keyword new czy np. malloc aby zarezerwować jakiś blok pamięci). Obecnie czasami działa to dobrze, a czasami mam na wyświetlaczu dyskotekę lub aplikacja wiesza się w momencie wywoływania konstruktora klasy na wywołaniu this->screen->init(). Zaglądałem do wnętrza tej biblioteki LiquidCrystal_I2C i tam w init dużo ciekawego się nie dzieje poza tym, że jest powoływana instancja klasy Wire. Miałem już koncepcję, że nie deallocuję, ale nie bardzo wiem jak to debugować - tu niestety minimalizm IDE Arduino daje o sobie znać, a do Eclipse nie mam cierpliwości, choć pewnie wrócę do pomysłu konfiguracji Eclipse za pomocą Sloebera (niestety na Mac OS X nie chce działać tak automatycznie i idiotoodpornie jak to opisują na niektórych forach). Jak na Edisonie i w ogóle na Arduino działają sketche. Czy w danej chwili działa tylko jeden sketch czy też może działać kilka w tym samym czasie. Myślałem, że wgranie nowego sketcha ubija poprzedni. Próbowałem też w konsoli zrobić ps | grep sketch i dalej na niektórych procesach wykonać kill -9, ale to nie daje oczekiwanych efektów - tam jest jakiś proces sketch_restart. Efekt jest taki, że gdy wyświetlacz mi nie działa to nawet uruchomienie przykładowego sketcha nie powoduje, że on działa. Czy po restarcie urządzenia/odłączenia zasilania system bootuje się z aktywnym ostatnio wgranym sketchem? Czasami się też tak zdarza, że na wyświetlaczu widzę napisy, których być nie powinno, gdyż te fragmenty kodu są w danym uruchomieniu zakomentowane. Również czujnik temperatury i wilgotności działa u mnie losowo, tylko tutaj wynik losowania z opcją działanie jest rzadszy (często go nie wykrywa, z braku odpowiedniego modelu kupiłem w Botlandzie Si7021, szczęśliwie jest biblioteka do Arduino, sprawdzałem na przykładach i również zachowuje się losowo). O problemy podejrzewałem luźne wtyki na broadboardzie, ale po podłączeniu bezpośrednio do płytki Intela też nie działa. Mam jeszcze pytanie o programowanie wielowątkowe na Arduino. Czy to w ogóle jest możliwe i praktykowane? Jak rozumiem zasadniczo jest do dyspozycji jeden runloop, który jest zawarty w funkcji loop. Czy jest możliwość wydzielenia jakiejś operacji do innego wątku czy kolejki lub stworzenia własnego, dodatkowego runloopa? To tak bardziej na przyszłość mnie zaczęło zastanawiać. Wiem, że jakieś złudzenie wielozadaniowości można uzyskać za pomocą millis() (pisałeś o tym w ostatniej lekcji drugiej części kursu Arduino), ale to jednak trochę karkołomna implementacja. Próbowałem Googlać, ale większość odpowiedzi o OOP pokazuje tutoriale jak zbudować własną bibliotekę do Arduino, a to nie jest moim celem - przynajmniej narazie. W zasadzie mogłem to napisać jako pomysł na artykuł czyli programowanie w Arduino dla średniozaawansowanych. P.s. Czy w Arduino dostępne są bloki/funkcje anonimowe/clousures czy jak to się może nazywać? P.s. 2 Chciałem połączyć wszystkie lekcje w jeden układ aby było fajniej i sobie trochę skomplikowałem. P.s. 3 Jeśli nie masz czasu odpisywać na moje dziesiątki pytań, a masz jakiś reference handbook do programowania w Arduino to się również ucieszę. Na arduino.cc (https://www.arduino.cc/reference/en/#page-title) nie znalazłem odpowiedzi na nurtujące mnie kwestie. P.s. 4 Miałem pomysł aby zrobić kurs Arduino za pomocą Edisona (uniknąłbym kupowania kolejnych gratów, a większość z nich już mam) tylko zastanawiam się czy to napewno dobry pomysł. P.s. 5 Z góry bardzo dziękuję za odpowiedź, na ten kurs niestety nie mogę Wam zrobić donate kupując zestaw w Botlandzie bo już zestawów nie mają. P.s. 6 Dla zainteresowanych mój losowo działający sketch. #include <Adafruit_Si7021.h> #include <LiquidCrystal_I2C.h> class MessageGenerator { String lines[2]; bool clear = false; LiquidCrystal_I2C *screen; public: MessageGenerator() { this->screen = new LiquidCrystal_I2C(0x27, 16, 2); this->screen->init(); this->screen->backlight(); this->screen->noAutoscroll(); } public: ~MessageGenerator() { free(this->screen); free(lines); } public: void setLine(String s, int l) { String oldV = lines[l]; if (oldV != s) { lines[l] = s; clear = true; } } public: void display() { if (clear) { this->screen->clear(); clear = false; } // screen.home(); this->screen->setCursor(0, 0); this->screen->print(lines[0]); this->screen->setCursor(0, 1); this->screen->print(lines[1]); } }; MessageGenerator *lcd;// = new MessageGenerator(); Adafruit_Si7021 sensor = Adafruit_Si7021(); const int ALARM_PIN = 2; const int DOOR_PIN = 3; const int MOTION_PIN = 4; const int LIGHT_PIN = 0; const int kDuration = 100; int lastLightLevel = 0; double i = 0; void setup() { Serial.begin(9600); Serial.println("setup arduino"); lcd = new MessageGenerator(); pinMode(LED_BUILTIN, OUTPUT); pinMode(ALARM_PIN, OUTPUT); pinMode(DOOR_PIN, INPUT_PULLUP); pinMode(MOTION_PIN, INPUT_PULLUP); digitalWrite(ALARM_PIN, HIGH); lcd->setLine("Have a Nice Day", 0); lcd->display(); // if (!sensor.begin()) { // lcd->setLine("Sensor failure", 1); // lcd->display(); // sensor.reset(); // } } void loop() { digitalWrite(ALARM_PIN, HIGH); monitorAlarm(); i += double(double(kDuration) / 1000); int ii = (int)i; if (ii % 3 == 0) { displayLightLevel(); } else if (ii % 3 == 1) { displayHumidity(); } else if (ii % 3 == 2) { displayTemperature(); } delay(kDuration); } void monitorAlarm() { bool doorOpened = digitalRead(DOOR_PIN); bool motionDetected = digitalRead(MOTION_PIN); if (doorOpened || motionDetected) { // digitalWrite(ALARM_PIN, LOW); digitalWrite(LED_BUILTIN, HIGH); Serial.print("Alarm triggered! "); if(doorOpened) { Serial.print("DOOR "); } if(motionDetected) { Serial.print("MOTION "); } Serial.println(""); lcd->setLine("ALARM!", 0); lcd->display(); } else { lcd->setLine("Alarm Ended", 0); lcd->display(); digitalWrite(ALARM_PIN, HIGH); digitalWrite(LED_BUILTIN, LOW); } } void displayLightLevel() { int val = analogRead(LIGHT_PIN); if (abs(val - lastLightLevel) > 10) { Serial.print("Light lvl = "); Serial.println(val); } String s = "Light " + String(val); lcd->setLine(s, 1); lcd->display(); lastLightLevel = val; } void displayHumidity() { int val = (int)sensor.readHumidity(); String s = "Humidity " + String(val) + "%"; Serial.println(s); lcd->setLine(s, 1); lcd->display(); } void displayTemperature() { int val = (int)sensor.readTemperature(); String s = "Temperature " + String(val); Serial.println(s); lcd->setLine(s, 1); lcd->display(); }
  14. Cześć, niestety mi to nie działa. Też zauważyłem, że na Twoim nagraniu to działa pomimo braku podłączenia CD4026 do GND. Moje oba sterowniki są uszkodzone albo też ja je niechcący uszkodziłem. Do rzeczy. Zmontowałem układ, podłączyłem do baterii i nie działał, przystąpiłem do troubleshootingu. Wyjąłem układ i sprawdziłem testerem diod podłączenie każdego segmentu. Najpierw kontrolnie kropkę, a później w miejscach, w których normalnie wychodzi zasilanie z nóżek układu. Wszystko niby było ok. Wpiąłem układ i spróbowałem ponownie. Niestety znów nie działał. Przy okazji dotknąłem go i zauważyłem, że jest dość ciepły. Szybko odłączyłem zasilanie. Ustawiłem miernik na pomiar natężenia z zakresem do 200 mA i znów na chwilę go podłączyłem tym razem szeregowo wpinając miernik do zasilania. Pobór prądu wynosił 130 mA - wydaje mi się, że strasznie dużo. Układ znów ciepły (już mniej bo tylko zmierzyłem natężenie i odłączyłem). W innej próbie zmierzyłem napięcie - 6,4V, więc OK. Wyłączyłem baterie i dokonałem testu diod z wpiętym układem. Najpierw kontrolnie niepodłączona kropka, a później kolejne segmenty. Ledwo się świeciły (na nagraniu prawie nie widać) i to tylko gdy przyłożyłem sondę za opornikiem. Przed opornikiem w zasadzie się nie świeciły. To mi zasugerowało, że gdzieś wewnątrz układu musi być zwarcie. Spróbowałem z następnym, identyczna sytuacja. Po kilku próbach układy przestały się grzać, a ich pobór prądu wynosił ok. 0 mA, więc są chyba totalnie dead. Przy okazji zamówię w Botlandzie bo nie bardzo mam pomysł co to może być innego. P.s. Do zdjęć też zdemontowałem oporniki i wyprowadzenie masy aby mieć idealnie jak u Ciebie.
  15. To wiem bo to jest kondensator monolityczny czyli jego biegunowość nie ma znaczenia. Tylko skoro on się ładuje do ok. 3,3V, a na wyjściu z US1A jest ok. 6V to skoro tam jest wyższy potencjał dlaczego się on nie ładuje?
×
×
  • Utwórz nowe...