Skocz do zawartości

Tablica liderów

Popularna zawartość

Pokazuje zawartość z najwyższą reputacją od 12.08.2022 w Posty

  1. Wiele czasu minęło, ale podczas wczorajszej aktualizacji forum został wdrożony bardzo rozbudowany system rang i odznak. Aktualnie nie jest on jeszcze w pełni uruchomiony. Jednak niedługo system reputacji na forum będzie miał dużo więcej sensu. Od teraz możliwe jest przyznawanie zróżnicowanej liczby punktów reputacji m.in. za: Zakładanie nowych tematów w konkretnych działach - np. punktowanie opisów DIY Odpowiadanie w tematach innych osób Za otrzymane oceny postów Za ocenianie postów Za ukończenie quizów z dobrym wynikiem Za regularne odwiedzanie forum itd. Możliwości są więc bardzo duże, ale postaram się skonfigurować to w taki sposób, aby nie przesadzić. Oczywiście różnice w liczbie punktów przyznawanych za konkretną akcję będą duże. Oprócz rang możliwe będzie również wprowadzenie równoległych, jednorazowych odznak, które są widoczne w profilu użytkownika - przykładowo po opisaniu pierwszego DIY można będzie zdobyć odznakę "Konstruktor", a po opisaniu 5 DIY "Doświadczony konstruktor" lub coś takiego. To tylko wstępne przemyślenia. Mechanizm jest i działa, kwestia uruchomienia. PS Tak, punkty będą naliczone wstecznie.
    4 punkty
  2. W końcu się zebrałem i złożyłem ustrojstwo do kupy więc niniejszym chwalę się pierwszym projektem nadającym się do chwalenia Projekt oparty o F401CCU6, sterowanie za pomocą trzech przycisków. Wyświetlacz 1.8" na ST7735S (ten z kursu). Funkcje: Dalmierz (moduł TF-Luna) z funkcją ciągłego i pojedynczego pomiaru Poziomica (MPU6050) z możliwością ustawienia "zera" użytkownika Pomiar temperatury i wilgotności (DHT11) Latarka (WS2812B) świecąca kolorem białym, czerwonym lub zielonym Ustawienia - zmiana jasności, tryb jasny/ciemny, zmiana jednostek Najwięcej pracy było oczywiście z tworzeniem interfejsu użytkownika. Ikonki brałem z http://flaticon.com przy czym musiałem je dodatkowo edytować żeby dobrze się prezentowały na wyświetlaczu. Ponadto musiałem robić po dwie wersje - dla trybu jasnego i ciemnego. Zasilanie - bateria 9v 6f22 zamknięta w obudowie. Dodatkowo dorobiłem płytkę ze stabilizatorami napięcia na 5V i 3.3V, na której dodatkowo umieściłem bufor cyfrowy dla diod programowalnych. Obudowa to ceownik aluminiowy z panelem drukowanym na drukarce 3D. Ogólnie jestem dość zadowolony z efektu ale jest kilka mankamentów: Zielony przycisk mi odstaje Wyświetlacz muli na napisach. Pasowałoby zrobić swoją bibliotekę bo ta, z której korzystałem jest średnio optymalna ale uznałem, że szkoda roboty.0 Pobór energii jest za wysoki, również po wyłączeniu urządzenia. Tu by konieczna była rozbudowa płytki zasilającej bo obecnie bateria padnie najprawdopodobniej po kilku dniach (jeszcze nie dobiłem do limitu). Spaghetti w obudowie w pewnym momencie bałem się, że nie dam rady tego tam upchnąć ale skracanie kabli załatwiło temat. Na ten moment jeszcze nie bawiłem się w rysowanie płytek więc jest jak jest. Pewnie nie będę już przy tym dłubał bo zaczynając od etapu gdzie nie wiedziałem jak podłączyć programator do BlackPilla spędziłem przy tym aż nadto czasu Pora zacząć coś nowego
    4 punkty
  3. Prawo Ohma, prawo Kirchoffa, metoda oczkowa[1], coś jeszcze z okolic... ew. tabliczka mnożenia też się przydaje. --- [1] Nie, Oczkow to nie był genialny radziecki uczony który opracował metodę obliczania obwodów.
    4 punkty
  4. Po długiej przerwie ostatnia aktualizacja w tym temacie. Niestety mam sporo innych spraw i mało czasu na ten projekt, a chcę go spiąć w całość i opublikować jako osobny DIY. Więcej mocy STM32 Okazało się, że niepotrzebnie szukałem rozwiązań sprzętowych, bo wystarczającą wydajność ma biblioteka CMSIS od ARM oferująca pakiet DSP w tym FFT. 1024 punkty FFT liczą się w pomijalnie krótkim czasie (w porównaniu z czasem próbkowania) i jedyne co wymaga uwagi to dobranie częstotliwości próbkowania ale ze sprzętowym wsparciem i to nie jest problemem. W nowej odsłonie projektu korzystam z układu STM32F446RET taktowanego zegarem 104 MHz - częstotliwość dobrana tak by wygenerować przebieg wyzwalający próbkowanie. Ultraszybki ADC SAR daje naprawdę spore możliwości dlatego korzystam z wbudowanego przetwornika. Ustawiam ADC DMA dla podwójnego bufora 2048 próbek i sprawdzam 2 przerwania zgłaszane w połowie i na koniec ładowania DMA. Takie podejście daje stały okres próbkowania nieco powyżej 44 kHz (45,73 kHz). Po każdorazowym przerwaniu wyzwalany jest algorytm FFT i bufory zapisu/odczytu są zamieniane (double buffering). Następnie pomiary są zawężane do 19 pasm przy pomocy LUT wygenerowanej w skrypcie Pythona i wyznaczane są parametry dynamiczne jak pierwsza i druga pochodna (prędkość i przyspieszenie) modułu odpowiedzi FFT. Zwłaszcza prędkość jest tu przydatna bo pozwala wyznaczyć "energię" jaką niesie muzyka, czyli jak dużo jest zmian, a z tego łatwo o estymację BPM. Kod programu Kod znowu zrobił się obszerny, napisałem go na nowo od razu wychodząc z założenia, ze ma być wygodny system wyboru animacji na bazie wzorca projektowego strategii. Dzięki temu udało się łatwo zaimplementować dodatki np. wygaszacz ekranu, który uruchamia się automatycznie przy braku sygnału. Za wybór animacji odpowiada funkcja, która przyjmuje wskaźnik na funkcję animacji: ASD_CORE_attachAnimation(ASD_Animation_flame); Tym razem udało się dobrze wyizolować te funkcje, dlatego że tuż po FFT wyznaczana jest struktura (w zasadzie interfejs) trzymająca wszystkie parametry. Ta struktura jest przekazywana do funkcji obliczającej animacje: void ASD_Animation_flame(bounds_t* bouds) {} Funkcją która wyznacza wartość bounds wygląda tak: void ASD_FFT_evalDynamics(float32_t* boundHeights, bounds_t* bounds, float32_t dts) { //current ACCELERATION evaluated on previous values for(int i = 0; i < BANDS_COUNT; i++) bounds_acceleration[i] = PHYSICS_MUL * (bounds_velocity[i] - bounds_last_velocity[i]) / dts; //current VELOCITY evaluated on previous values and save discarded as last for(int i = 0; i < BANDS_COUNT; i++) { bounds_last_velocity[i] = bounds_velocity[i]; bounds_velocity[i] = PHYSICS_MUL * (boundHeights[i] - bounds_last_heights[i]) / dts; } //current HEIGHT(POSITION) and save discarded as last for(int i = 0; i < BANDS_COUNT; i++) { bounds_last_heights[i] = bounds_heights[i]; bounds_heights[i] = 0; } float boundsSum = 0; for(int i = 0; i < BANDS_COUNT; i++) { bounds->heights[i] = boundHeights[i]; boundsSum += bounds->heights[i]; bounds->velocities[i] = bounds_velocity[i]; bounds->accelerations[i] = bounds_acceleration[i]; } bounds->heightsSum = boundsSum; bounds->isIdle = boundsSum < IDLE_SUM_THRESHOLD; float bassEnergy = 0; for(int i = 0; i < ENERGY_COLLECT_COUNT; i++) { bassEnergy += bounds->velocities[i]; } if(bassEnergy < 0) bassEnergy = -bassEnergy; bounds->bassEnergy = bassEnergy; bounds->bassTrig = bassEnergy > BASS_ENERGY_THRESHOLD; bounds->dt_sec = dts; } Nie jest to nic strasznego - tylko kolejne pochodne wyznaczane w dyskretnym czasie. Nieco ciekawsza może być funkcja wyzwalana po pobraniu próbek: void ASD_CORE_processSignal() { /* Evaluate sampling time - load recorded time and start over. Then evaluate sampling frequency */ _samplingTimeMicros = __HAL_TIM_GET_COUNTER(&htim6); __HAL_TIM_SET_COUNTER(&htim6, 0); _samplingFrequency = 1000.0 * FFT_SAMPLES_COUNT / _samplingTimeMicros; /* Calculate FFT then convert it to bounds. Save evaluation time. */ HAL_GPIO_WritePin(BATCH_DONE_GPIO_Port, BATCH_DONE_Pin, GPIO_PIN_SET); ASD_FFT_toggleBuffers(); ASD_FFT_evalFFT(bands); ASD_FFT_evalDynamics(bands, &bounds, _samplingTimeMicros); updateIdleDetector(&bounds); _currentAnimation(&bounds); ASD_DISP_prepare(); HAL_GPIO_WritePin(BATCH_DONE_GPIO_Port, BATCH_DONE_Pin, GPIO_PIN_RESET); } Widzimy tu wyznaczanie czasu próbkowania używanego jako podstawa czasu przy obliczeniach pochodnych. Jest tu też zamiana buforów aby nie doszło do jednoczesnego zapisu/odczytu przez DMA i zwykły kod. Dalej: wyznaczanie FFT, dynamiki i użycie animacji lub wygaszacza ekranu. Na koniec przygotowanie danych do wyświetlenia. Ciekawym dodatkiej jest przełączanie GPIO - słuzy ono do wyznaczania zużycia czasu procesora. Wypełnienie sygnału obserwowane np na oscyloskopie oznacza czas jaki układ wykorzystuje na obliczenia w stosunku do czasu jaki ma czyli czasu próbkowania. Przekroczenie tego czasu oznacza, że zostanie zapełniony bufor i wykonane kolejne przerwanie - do tego nie wolno dopuścić. Dobrze napisany program powinien spowodować zużycie około 40% czasu procesora, wiec nie ma co się martwić a pamiętajmy, że próbkowanie zajmuje naprawdę dużo czasu: Sampling time o 1024 samples: 22.39 ms. Sampling frequency: 45.73 kHz, s_idx 0, m_idx 1 22.39 ms daje częstotliwość odświeżania 44,6 Hz - to naprawdę dobry wynik oczywiście możliwe jest uzyskanie lepszych wyników używając przesuwającego się okna wycinającego próbki do przetworzenia, ale naprawdę nie ma potrzeby - efekt jest naprawdę bardzo responsywny! Mówiąc bardziej kolokwialnie "żyleta". Efekt Tu po raz kolejny efekt ognia, ale tym razem nieco bardziej ułożony void ASD_Animation_flame(bounds_t* bouds) { float32_t dt = bouds->dt_sec; /****************************************************** * GRAVITY * ******************************************************/ /* Acceleration */ for (int ix = 0; ix < BANDS_COUNT; ix++) { _barAccelerations[ix] = -GRAVITY_FACTOR; } /* Velocity */ for (int ix = 0; ix < BANDS_COUNT; ix++) { _barVelocity[ix] += _barAccelerations[ix] * dt; } /* Position */ for (int ix = 0; ix < BANDS_COUNT; ix++) { _barHeights[ix] += _barVelocity[ix] * dt; if(bouds->heights[ix] > _barHeights[ix]) { if(!bouds->isIdle) //prevent from bottom flicekring, i hope _barHeights[ix] = bouds->heights[ix]; _barVelocity[ix] = 0;//todo alboz roznicy polozen albo ze struktury _barAccelerations[ix] = 0;//todo inertia } if(_barHeights[ix] <= 0.0) { _barHeights[ix] = 0.0; _barVelocity[ix] = 0; _barAccelerations[ix] = 0; } } /****************************************************** * Burn * ******************************************************/ if(HAL_GetTick() - lastBurnTime > BURN_INTERVAL) { lastBurnTime += BURN_INTERVAL; makeDisplayBurnTick(); } //////////////////// _hueCounter += 1; if(_hueCounter > 8){ _hueCounter = 0; _hueShift++; if(_hueShift > 255) _hueShift = 0; } /****************************************************** * Animation * ******************************************************/ _flicker += dt * FLICKER_SPEED; while(_flicker >= FLICKER_LENGTH) _flicker -= FLICKER_LENGTH; uint32_t flickerIndex = (uint32_t)(_flicker); for (int ix = 0; ix < BANDS_COUNT; ix++) { int barHeight = (int)(60.0 * _barHeights[ix]); //drawable if(barHeight > DISPLAY_HEIGHT) barHeight = DISPLAY_HEIGHT; for (int iy = 0; iy < barHeight; iy++) { uint8_t hue = (FIRE_TONGUE_HUE[DISPLAY_HEIGHT - 1 - (barHeight - iy - 1)] + _hueShift) % 255; uint32_t saturation_32 = 160 + (DISPLAY_HEIGHT - 1 - (barHeight - iy - 1)) * 6; uint8_t saturation = saturation_32 > 255 ? 255 : (uint8_t)(saturation_32); uint8_t flickerIndexShifted = (uint8_t)((flickerIndex + iy + ix * 3)%FLICKER_LENGTH); uint8_t value = 255 - (uint8_t)(FLICKER[flickerIndexShifted]*0.75); ASD_DISP_setPixel(ix, iy, hue, saturation, value); uint8_t burnValue = 14 + (uint8_t)(ASD_UTILS_getRandom()%22); setPixelBurnTicks(ix, iy, burnValue); } for (int iy = barHeight; iy < DISPLAY_HEIGHT; iy++) { uint8_t burnTick = getPixelBurnTick(ix, iy); if(burnTick > 0) { ASD_DISP_setPixel(ix, iy, 255 +_hueShift, 255, burnTick); } else { ASD_DISP_setPixel(ix, iy, 0, 255, 0); } } } /****************************************************** * Blaze * ******************************************************/ if(bouds->bassTrig) _lastBlazeTime = HAL_GetTick(); if(HAL_GetTick() - _lastBlazeTime < BLAZE_INTERVAL){ float32_t blazeValue = (MAX_BRIGHTNESS - MIN_BRIGHTNESS)*(1.0 - ((HAL_GetTick() - _lastBlazeTime) / BLAZE_INTERVAL)); ASD_DISP_setMaxBrightness(MIN_BRIGHTNESS + blazeValue); } else ASD_DISP_setMaxBrightness(MIN_BRIGHTNESS); } Widoczne są sekcje. Na początek obliczanie zachowania pixeli pod wpływem symulowanej grawitacji. Dalej obliczanie wypalanego tła, odświeżanie, aplikowanie koloru, nasycenia na podstawie LUT i rozbłysków wyznaczanych przy użyciu wspomnianej energii FFT (pierwszej pochodnej). WS2812B z SPI? Myślałem jak zrealizować sprzętową obsługę diod programowalnych i udało się użyć MOSI z SPI! Wystarczy zakodować każdy bit protokołu uzywając 4 bitów sygnału z SPI. Stąd zmienna uint32_t zastępuje 1 bajt danych protokołu WS2812B. Do obliczenia wykorzystałem funkcję konwersji HSV -> RGB z biblioteki fastLED oraz własny LUT do konwersji uint32_t na dane wynikowe. Skorzystałem także z bardzo szerokiego marginesu błędu o którym pisałem już kiedyś - bity danychj można zmodulować przy pomocy 2 bitów a dokładnie 4 stanów. Funkcja przygotowująca dane do wglądu: void ASD_DISP_prepare() { /* Clear transmit buffer */ for(int i = 0; i < 1245; i++) _transmit_buffer[i] = 0; // for(int pixel_idx = 0; pixel_idx < 399; pixel_idx++) { hsvData = _draw_hsv_buffer[pixel_idx]; hsv2rgb_raw_C(&hsvData, &rgbData); // //convert rgb to protocol data each pixel send as 3xuint32_t int green_transmit_data_idx = pixel_idx * 3 + 0; int red_transmit_data_idx = pixel_idx * 3 + 1; int blue_transmit_data_idx = pixel_idx * 3 + 2; // _transmit_buffer[green_transmit_data_idx] |= COLOR_LUT[rgbData.g]; _transmit_buffer[red_transmit_data_idx] |= COLOR_LUT[rgbData.r]; _transmit_buffer[blue_transmit_data_idx] |= COLOR_LUT[rgbData.b]; } } Wraz z DMA i trybem circular udało się osiągnąć genialne rezultaty. Wzorzec częstotliwości Dobrze byłoby mieć wartość referencyjną pod ręką. Pomyślałem że DAC będzie idealnym rozwiązaniem, ale z jakiegoś powodu nie dało się go przestawić. Poza tym nawet przy 128 próbkach wyniki dla stablicowanej sinusoidy były całkiem dobre. No trudno. Nie ma wielkiej straty. Mam w końcu okazję użyć AD9833 do generowania sygnału referencyjnego. Głośnik do testów W końcu dodałem coś co powinno być od początku - wbudowany głośnik do testów. Znowu korzystam z TDA2822 i głośników ze starego laptopa. Największą motywacją były problemy ze słuchawkami które zawsze do tego używałem. Nowa płytka PCB Tak, w końcu! Zamiast lepić układ na płytce testowej chcę mieć płytkę z prawdziwego zdarzenia. W końcu projekt bez szumów i zbędnej filtracji Tu z pomocą przyszedł PCB Way który docenił sukces mojego projektu na Instructables i zaoferował pomoc w wykonaniu płytek PCB. W Eaglu zaprojektowałem płytkę, tym razem dodałem trochę nowych funkcji, które na ten moment nie są jeszcze uwzględnione w programie ale kiedyś będą: bargraph do wskaźnika wysterowania, 3 LED do dowolnego wykrozystania, wybór źródła dźwięku przekaźnikami, generator sygnału testującego na AD9833, wzmacniacz stereo dla głośników testowych na TDA2822, wzmacniacz mix stereo do mono dla sygnału wejściowego, różne złącza wejściowe: Jack 3,5mm, goldpin, RCA, cyfrowy potencjometr MCP40D18 do automatycznego sterowania poziomem sygnału. Zamiast lutować układ SMD STM32 korzystam z Nucleo - może nie jest to profesjonalne ale PCB jest też prototypowe, w kolejnej wersji będzie już pełnoprawna płytka gotowa do ewentualnej większej produkcji Na schemacie można zauważyć kilka bloków: Zasilanie - podstawowe zabezpieczenia, 3,3V, sygnalizacja i kondensatory: Bargraph ze źródeł prądowych: Przekaźniki do wyboru sygnału: Źródła sygnału : Wzmacniacze z wydzieloną masą analogową: Nucleo z własnej biblioteki: Układ ESP32 do przyszłej integracji z WiFi: Schemat i płytka są dość obszerne, ale składają się z dość prostych koncepcji. PCB po dosłownie tygodniu otrzymałem płytkę PCB. Przy takim upakowaniu musiałem skorzystać ze ścieżek 8 mil i widzę że jest super Jedyne co nie wyszło jak powinno to nadruk - chyba skończył się tusz Poza tym płytka naprawdę super Niedługo będę testował i wtedy spiszę wszystkie informacje oraz obliczenia w osobnym artykule. Jak widać projekt istnieje już kilka miesięcy i dalej żyje Bardzo dziękuję za pomoc @Elvis i @FlyingDutch
    3 punkty
  5. Witajcie. Chciałbym się pochwalić drugim projektem ( mieszanina kilku gotowców do jednego ). Mianowicie Przyjemny Zegar połączony z datą oraz pokazaniem aktualnej temperatury. Wiadomo, że w skład zestawu wchodzi Arduino UNO, zegar RTC DS3231 + 24c32 , Sonda-czujnik temperatury DS18B20 ( wodoodporny - będzie na zewnątrz budynku ) do tego wyświetlacz LCD 20x4 I2C , a przewodziki i płytka Kod jest jeszcze w trakcie poprawek. Mianowicie są błędy jeśli chodzi o pokazanie na LCD znaku "stopnia Celsjusza" . Kombinuje i na razie zostawiłem jak jest. Może ktoś ma inny pomysł ? Chciałem z tego wszystkiego podpiąć pod RF czyli standardowy transmiter i receiver 433MHz, ale coś są kłopoty z tymi dwiema rzeczami. Niby nadaje, ale przy sprawdzaniu portu COM na odbiorniku to nic nie wyświetla. Nadajnik standardowy FS1000A i odbiornik do niego. Podłączone kabelki ( antenki ) 17cm. i za "grzybka" nie wiem co jest grane. A pomysłem było, aby nadawało mi temperaturę zdalnie ( arduino Nano ) za pomocą sondy, do właśnie UNO i pokazywało to samo co jest na screenach. Jeśli ma ktokolwiek pomysł na poprawki, zmiany, to proszę śmiało pisać z góry dzięki. Aha, jeszcze kod wrzucę #include <Wire.h> //WireLibrary comes with arduino #include <LiquidCrystal_I2C.h> //i2c LCD Library #define DS3231_I2C_ADDRESS 0x68 //RTC Address #include <OneWire.h> #include <DallasTemperature.h> // Data wire is conntec to the Arduino digital pin 4 #define ONE_WIRE_BUS 4 // Setup a oneWire instance to communicate with any OneWire devices OneWire oneWire(ONE_WIRE_BUS); // Pass our oneWire reference to Dallas Temperature sensor DallasTemperature sensors(&oneWire); LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 20, 4); // Set the LCD I2C address //Degree symbol: byte Degree[] = { B00111, B00101, B00111, B00000, B00000, B00000, B00000, B00000 }; void setup() { // lcd.createChar(0, byte degree); Wire.begin(); //initialise the TWI lcd.begin(20, 4); //20 x 4 LCD (Change if required) for (int i = 0; i < 2; i++) //Flash LCD backlight 2 times on startup { lcd.backlight(); delay(250); } lcd.backlight(); // finish with backlight on lcd.setCursor(0, 0); //Start at character 0 on line 0 lcd.print(" Witaj Marku :)"); // Start serial communication for debugging purposes Serial.begin(115200); // initialize the Serial Monitor at a baud rate of 9600 // Start up the library sensors.begin(); // initialize the DS18B20 temperature sensor: } void loop() { displayTime(); //calls the display time function { sensors.requestTemperatures(); //zazadaj odczyt temperatury z czujnika // lcd.clear(); //wyczysc ekran lcd.setCursor(0,3); //ustaw kursor w pozycji 0,0 lcd.print("Temperatura: "); //wyswietl "Temperatura: " lcd.print(sensors.getTempCByIndex(0)); //wyswietl wartosc z czujnika 0 //lcd.print((char)0); //wyswietl znak stopnia lcd.print("C"); delay(50); } delay(100); } byte decToBcd(byte val)//used when sending time { return ( (val / 10 * 16) + (val % 10) ); } // Convert binary coded decimal to normal decimal numbers byte bcdToDec(byte val) { return ( (val / 16 * 10) + (val % 16) ); } void readDS3231time(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year) { Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0); // set DS3231 register pointer to 00h Wire.endTransmission(); Wire.requestFrom(DS3231_I2C_ADDRESS, 7); // request seven bytes of data from DS3231 starting from register 00h *second = bcdToDec(Wire.read() & 0x7f); *minute = bcdToDec(Wire.read()); *hour = bcdToDec(Wire.read() & 0x3f); *dayOfWeek = bcdToDec(Wire.read()); *dayOfMonth = bcdToDec(Wire.read()); *month = bcdToDec(Wire.read()); *year = bcdToDec(Wire.read()); } void displayTime() { byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); if (hour < 10) { lcd.setCursor(0, 1); lcd.print("0"); lcd.setCursor(1, 1); lcd.print(hour , DEC); } if (hour > 9) { lcd.setCursor(0, 1); lcd.print(hour , DEC); } lcd.setCursor(2, 1); lcd.print(":"); if (minute < 10) { lcd.setCursor(3, 1); lcd.print("0"); lcd.setCursor(4, 1); lcd.print(minute , DEC); } if (minute > 9) { lcd.setCursor(3, 1); lcd.print(minute , DEC); } lcd.setCursor(5, 1); lcd.print(":"); if (second < 10) { lcd.setCursor(6, 1); lcd.print("0"); lcd.setCursor(7, 1); lcd.print(second, DEC); } if (second > 9) { lcd.setCursor(6, 1); lcd.print(second, DEC); } if (dayOfMonth < 10) { lcd.setCursor(9, 1); lcd.print("0"); lcd.setCursor(10, 1); lcd.print(dayOfMonth, DEC); lcd.setCursor(11, 1); lcd.print("/"); } if (dayOfMonth > 9) { lcd.setCursor(9, 1); lcd.print(dayOfMonth, DEC); lcd.setCursor(11, 1); lcd.print("/"); } if (month < 10) { lcd.setCursor(12, 1); lcd.print("0"); lcd.setCursor(13, 1); lcd.print(month, DEC); lcd.setCursor(14, 1); lcd.print("/"); } if (month > 9) { lcd.setCursor(12, 1); lcd.print(month, DEC); lcd.setCursor(14, 1); lcd.print("/"); } lcd.setCursor(15, 1); lcd.print(year, DEC); switch (dayOfWeek) { case 1: lcd.setCursor(0, 2); lcd.print("Dzis Poniedzialek"); break; case 2: lcd.setCursor(0, 2); lcd.print("Dzis jest Wtorek"); break; case 3: lcd.setCursor(0, 2); lcd.print("Dzis jest Sroda"); break; case 4: lcd.setCursor(0, 2); lcd.print("Dzis jest Czwartek"); break; case 5: lcd.setCursor(0, 2); lcd.print("Dzis jest Piatek"); break; case 6: lcd.setCursor(0, 2); lcd.print("Dzis jest Sobota"); break; case 7: lcd.setCursor(0, 2); lcd.print("Dzis jest Niedziela"); break; } }
    2 punkty
  6. Z doświadczenia: zależy od zasilania, z reguły lepiej nie ryzykować. Ewentualnie możesz dać większy.
    2 punkty
  7. Masz teraz zesniffowane ramki CAN z samej turbiny, po podaniu napięcia te pięć adresów które pokazywałeś wcześniej. Po pierwsze musisz się upewnić czy turbina ma podpięte wszystko co potrzebuje... Czy wymaga ona tylko tego jednego napięcia które podajesz. Jeśli będzie wszystko podpięte to w pierwszym teście sprawdź czy lecą jakieś dane na tych ramkach jeśli zakręcisz turbiną ręcznie. Jeśli chodzi o drugi test to trzeba by sprawdzić co leci na tych ramkach na podpiętej turbinie w pojeździe. Masz już część adresów na których turbo wysyła dane do pojazdu więc będziesz wiedział na co zwracać uwagę w danych pojazdu (na początek sprawdzasz te same adresy). Bez sniffowania pojazdu będzie ciężko cokolwiek zrobić. Sniffowanie przez obd może być niewystarczające bo nie ma pewności czy te ramki będą przekazywane przez gateway na obd, a jeśli nawet będą to mogą mieć na obd inne adresy niż te które masz tutaj. Trzeba próbować i się nie zrażać. Temat bardzo ciekawy acz dość trudny. Jeśli miałbyś dostępny taki samochód do sniffowania to polecam zamiast wpinania sniffera do obd (o ile jest to możliwe ze względu na dostęp do turbo) wpięcie się bezstykowo bezpośrednio do magistrali przy turbo. Będziesz miał pewność że w danych lecą interesujące Cię ramki, a są szanse że wszystkich ramek do analizy będzie mniej niż z obd.
    1 punkt
  8. @kiki_plk witam na forum Cieszę się, że kurs zachęcił Cię do nauki w praktyce - o to w tym chodzi, powodzenia!
    1 punkt
  9. Cześć, Właśnie ukończyłem kurs, jutro mają do mnie dotrzeć zestawy na wszystkie 3 kursy elektroniki. Przetestuję w praktyce. Mam nadzieję, że po ukończeniu 3 kursów będę miał jakotakie pojęcie i będę w stanie sam coś zaprojektować i wykonać. Mam nadzieję, że złapę bakcyla i następny będzie kurs lutowania. Pozdrawiam, bardzo przystępna wiedza
    1 punkt
  10. Cześć, jestem Rafał, zawodowo zajmuję się projektowaniem elektroniki oraz tworzeniem softu zarówno na mikrokontrolery jak i systemy wbudowane. Od czasu do czasu zdarza mi się popełnić jakąś aplikację na telefon lub desktopową. Kiedyś, za czasów studenckich, a było to ponad 10 lat temu, zaczynałem uczyć się programowania od zera z kursu https://kursc.forbot.pl/ Wygląda na to, że od tego kursu zaczęła się moja kariera zawodowa . Dziś dołączam do użytkowników i tym razem może ja pomogę komuś z Was.
    1 punkt
  11. Nie uważasz że wymagasz czegoś niemożliwego? Jeśli ograniczysz prąd do 1A to na wyjściu będziesz miał 2.4V. Wspominałem coś na temat prawa Ohma czy zapomniałem?
    1 punkt
  12. Jeśli masz tylko jeden obwód mocy, i jest sterowany PWMem, to tak, tylko wypełnieniem i tylko tym tranzystorem. Nawet ograniczenie termiczne po prostu zmusi układ sterowania do redukcji wypełnienia.
    1 punkt
  13. Nooo, niezupełnie. Powiedzmy, że możesz się poruszać w granicach w jakich potrzebujesz. Bo to jakie parametry możesz uzyskać zależny od obciążenia. Możesz regulować wypełnieniem tak aby uzyskać zadany prąd albo napięcie. Bo popatrz, nie da się uzyskać prądu 1A i 30V jak nic do zasilacza nie podłączysz, no nie? Zasilacz będzie podbijał wypełnienie dopóki nie dobije do zadanego napięcia albo prądu, jeśli któreś zostanie osiągnięte to na tym zostanie.
    1 punkt
  14. A jak sobie inaczej wybrażasz ograniczenie prądu? Prawo Ohma kojarzysz?
    1 punkt
  15. Praw fizyki nie ominiesz W rzeczywistości napięcie zawsze jest uzależnione od prądu. [AFAIK] Możesz co najwyżej ograniczyć maksymalny prąd np. układem rezystor-BJT. (Napięcia nigdy nie ograniczałem, ale z tego co się orientuję też się da). Tak działają zasilacze laboratoryjne. Przykładowy układ ograniczający prąd możesz zerżnąć tutaj (ten też jest zerżnięty z AVT738)
    1 punkt
  16. Po prostu obniżasz wypełnienie tak, żeby prąd się zgadzał z zadanym, i tyle
    1 punkt
  17. @farmaceuta a tu masz akurat coś nowego - to jest przetwornica synchroniczna z półmostka H. Może ten rysunek będzie bardziej pomocny: Cewka wymusza przypływ prądu, a dioda jest tu drogą przepływu prądu.
    1 punkt
  18. @mechani co do pierwszego to wzór na częstotliwość rezonansową układu LC jest prosty: f = 1/(2 PI sqrt(LC)). W takiej sytuacji reaktancja (czyli rzeczywista część impedancji charakteryzującej elementy inercyjne jak cewki i kondensatory) jest równa czyli Xc = XL. Ciekawe że dla małych częstotliwości reaktancja kondensatora rośnie ale cewki maleje, a dla wysokich częstotliwości jest odwrotnie stąd ta pasmowość - 2 elementy konkurują ze sobą w połączeniu równoległym. Obok częstotliwości rezonansowej masz też pojęcie dobroci, która jest parametrem danego egzemplarza cewki. Tu odsyłam cie do lektury internetu ale dobroć cewki wpływa na to jak szerokie będzie pasmo przenoszenia częstotliwości przez taki filtr. Na wiele pytań możesz też odpowiedzieć przez matematykę. Zapoznaj się z zespoloną impedancją cewki i kondensatora i razem z impedancją rezystorów, która jest czysto rzeczywistą rezystancją, możesz policzyć sobie wartości częstotliwości rezonansowej, częstotliwości granicznej itp i narysować ładny wykres. Patrząc na schemat to domyślam się, że przydałby się tranzsyotr wzmacniajacy prąd. Zasilanie głośnika z fali radiowej to za mało. Nie wiem jaki sygnał napięciowy uzyskasz w tym układzie, ale sygnał prądowy będzie bardzo mały. Później postaram się podesłać ci obliczenia.
    1 punkt
  19. @farmaceuta trochę dziwnie wygląda potencjomtr działający w roli regulowanego rezystora, wygląda jakby jedna nóżka była podłączona do masy. Nie wiem czy ta dioda jest tu aż tak istotna. Najważniejsze że masz na wyjściu dzielnik z którego pobierasz referencyjny prąd (z napięcia na rezystorze), który podajesz jako feedback. Obejrzyj materiały Great Scotta o przetwornicach, ma ich całkiem sporo:
    1 punkt
  20. @Wortan miło słyszeć, dziękuję Kurs lutowania to będzie dobry wybór, ale spójrz też na kurs techniki cyfrowej
    1 punkt
  21. Dziękuje serdecznie za kurs, mam nadzieję, że w krótkim czasie wykorzystam jak najwięcej wiedzy której uzyskałem żeby móc ją lepiej zapamiętać. A teraz pewnie wezmę się za kurs lutowania. Jeszcze raz, wielkie dzięki.
    1 punkt
  22. @Sianokiszonka witam na forum i życzę udanych eksperymentów z "programowaniem" elektroniki @uralx witam na Forbocie @Fae cześć!
    1 punkt
  23. @ethanak Użyłem UART. Trudno mi trochę odpowiedzieć na pytanie "jak się sprawuje?" bo jak widzisz moja aplikacja zbyt wymagająca nie jest a użyłem go tylko dlatego jako jedyny zapewniał sensowny zasięg. W każdym razie, problemów z nim nie miałem, czułość jest bardzo fajna, specyfikacja podaje maksymalny dystans na 8m ale zmierzyłem nim nawet 10m (ale to zależy od oświetlenia).
    1 punkt
  24. Wrzuciłem na githuba chyba wszystko co jest potrzebne do skonstruowania urządzenia (stl, scad, szkic płytki). Gwoli informacji: nie zajmuję się produkcją suwmiarek, metrówek, poziomic i innych ustrojstw, nie mam na to ani czasu ani warunków. Wybaczcie - ale druk 3d można zamówić i wyjdzie lepszy niż mój, a z elektroniką i programowaniem poradzi sobie co bardziej rozgarnięty nastolatek.
    1 punkt
  25. Po lutowaniu możesz dosłownie wrzucić płytkę do izopropanolu i całość się wyczyści.
    1 punkt
  26. @Torianen musisz pamiętać jak zachowuje się kondensator wpięty szeregowo - w takiej sytuacji będzie on przewodził prąd aż się naładuje, a później przestanie. To zależy co masz na myśli pod hasłem "usunięcie diody" - jeśli po prostu wyciągasz ją z płytki i jest tam przerwany obwód to prąd nie płynie, bo kondensator jest wpięty do obwodu tylko jedną nóżką. Z kolei, jeśli usuniesz D2 i wstawisz tam zworkę to kondensator C2 staje się właściwie równolegle połączony z D1 i może zasilać tę diodę tak samo jak C1.
    1 punkt
  27. @Michlak03 najlepiej byłoby, gdybyś dla pewności pokazał zdjęcia swoich układów i zaznaczyłbyś co i gdzie mierzyłeś. Jeśli bateria ma w praktyce 9,6 V to do obliczeń powinieneś podstawiać właśnie tyle. Zwróć tylko uwagę, aby pomiaru napięcia na baterii dokonać, gdy cały układ działa i z baterii jest już pobierany prąd. "Goła", niepodłączona bateria może mieć zupełnie inne napięcie niż taka pod obciążeniem.
    1 punkt
  28. @tru_IN dobre obserwacje co do długości działania układu Jeśli chodzi o drugie pytanie to nie, nic złego się nie stanie w tym przypadku. Trzeba jednak ogólnie o tym pamiętać, że w kondensatorach jest zgromadzona jakaś energia. Tutaj się nic nie stanie, ale jakbyś zabrał się np. za naprawę telewizora to mogłoby się okazać, że pomimo odłączenia urządzenia od prądu coś Cię "kopnęło". Trzeba też uważać, jeśli korzysta się z mierników pojemności kondensatorów (niektóre mierniki mają wbudowaną taką funkcję) - wpięcie naładowanego kondensatora do takiego miernika może go uszkodzić. @Torianen witam na Forbocie Schemat narysowany bardzo ładnie - oby wszyscy początkujący takie robili! Na przyszłość możesz jeszcze opisywać elementy, aby łatwiej było się do nich odnosić (np. C1, C2, R1, R2 itd). Pierwsza dioda, która jest podłączona równolegle z kondensatorem jest też właściwie połączona prosto z baterią (zakryj sobie ręką kondensator na schemacie). W związku z tym po włączeniu zasilania dostaje ona od razu zasilanie. Po odłączeniu baterii (zasłoń baterię na schemacie) jest wtedy zasilana prosto z kondensatora. Ma on mniejszą pojemność niż bateria, więc dioda z czasem gaśnie. Jaki efekt chciałeś uzyskać za pomocą drugiego kondensatora?
    1 punkt
  29. Sądząc po tym co swego czasu przylazło z ogłoszenia "poszukujemy programisty pythona po studiach do przyuczenia" dyplomami mogłem sobie kanciapę wytapetować. Niestety, prostego sprawdzianu z podstaw nikt nie zaliczył. A wszystkie byli magistry i inżyniery...
    1 punkt
  30. Po odłączeniu kondensatora ceramicznego nie zauważyłem, żeby dioda świeciła się dłużej. Przy podłączeniu 4 kondensatorów 1000 µF dioda gasła chyba z 15 sekund. Na koniec mam jeszcze pytanie. Czy jak się weźmie kondensator z układu przed jego kompletnym rozładowaniem, to czy może to wpłynąć na jego żywotność? Bo przez przypadek tak zrobiłem i po ponownym jego włożeniu dioda mi się jeszcze minimalnie świeciła.
    1 punkt
  31. stworzyłem coś takiego jako tako działa wyswitlacz sie odswieża tylko wtedy gdy zmienia się częstotliwość i radio działa po ustawieniu częstotliwości mam jednak wrażenie że nie zmienia częstotliwosci tak jak powinno więc proszę żeby ktoś to skontrolował z góry dziękuje #include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define OLED_RESET 4 #define SCREEN_ADDRESS 0x3C Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); #include <TEA5767Radio.h> TEA5767Radio radio = TEA5767Radio(); float freq ; void setup() { Serial.begin(9600); if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) { Serial.println(F("SSD1306 allocation failed")); for (;;); } display.display(); delay(2000); display.clearDisplay(); wyswietlacz(); freq = 90.1 ; radio.setFrequency(freq); } void loop() { radio.setFrequency(freq); if (digitalRead(4) == LOW) { freq = freq + 0.01 ; wyswietlacz(); } if (digitalRead(3) == LOW) { freq = freq - 0.01 ; wyswietlacz(); } if (freq < 84) { freq = 113 ; } if (freq > 113) { freq = 84 ; } } void wyswietlacz() { radio.setFrequency(freq); display.clearDisplay(); display.setTextSize(2); // Normal 1:1 pixel scale display.setTextColor(WHITE); // Draw white text display.setCursor(0, 10); display.print(freq); display.setCursor(85, 10); display.println("MHz"); display.display(); }
    1 punkt
  32. Z ciekawości zbudowałem taki układ (mam nadzieję, że schemat jest prawidłowo "przepisany" ze zdjęcia). Próbuję zrozumieć jednak, dlaczego układ zachowuje się tak, jak się zachowuje tzn. po podłączeniu zasilania dioda podłączona równolegle z kondensatorem świeci cały czas jasno, po odłączeniu zasilania powoli przygasa. Druga dioda natomiast na początku świeci mocno, jednak w ciągu kilku sekund przygasa. Po odłączeniu zasilania gaśnie natychmiastowo. Kondensator połączony z nią szeregowo ma prawie cały czas około 7V (np. 6.7V). Na diodzie nieświecącej po odłączeniu zasilania jest około 4.7V, ale mimo tego nie świeci. Czegoś tutaj nie rozumiem. Dodatkowa obserwacja: Zwarcie nóżek diody połączonej z kondensatorem szeregowo powoduje, że dioda połączona równolegle dostaje "kopa" i zaczyna świecić mocniej (przy wyłączonym zasilaniu)
    1 punkt
  33. @SOYER A moja wnuczka w wieku lat 4ch mówiła po angielsku jak kanadyjka wsch. wybrzeża. Jej siostra dziś ma ~3lata i po angielsku mówi jak po polsku. Młodsza w dodatku jest urocza
    1 punkt
  34. No więc postanowiłem zrobić dokładnie to samo co gość w filmiku, który mi poleciłeś. Nawet zainstalowałem starszą wersję Arduino IDE. 1.8.12. Ustawienia prędkości i częstotliwości transmisji dokładanie takie same jak na filmie. Udało mi się przesłać prosty program wyświetlający napis "Hello" i właściwie to koniec. Widać, że jednak coś się dzieje i transmisja jest ok. Napis wyświetlam za pomocą funkcji Serial.println("Hello"); i odczytuję w monitorze portu szeregowego. Kolejnym krokiem było wysłanie programu z przykładów Arduino GetChipID i po uruchomieniu zwrotnie coś otrzymuję ale to są jakieś krzaki. Dołączam screen. Próbowałem też wyświetlić coś na wyświetlaczu płytki ale niestety, nie działa nawet kod zmiany ekranu na czerwony. Po prostu nic się nie dzieje pomimo, że kod jest banalnie prosty: #include <TFT_eSPI.h> #include <SPI.h> tft=TFT_eSPI(); void setup() { Serial.begin(9600); Serial.println("Hello"); tft.init(); tft.fillScreen(TFT_RED); } void loop() { } Pomyślałem, że może zepsuł się wyświetlacz ale raczej nie bo jak płytka miała fabryczny soft to ekran działał. Myślę co dalej, żeby ruszyć z miejsca. Jak ktoś ma jakieś sugestię to bardzo bym prosił o radę.
    1 punkt
  35. Na prostym przykładzie może być przywitanie , zaraz po wejściu do domu. Oczywiście dołączyć trzeba czujnik ruchu
    1 punkt
  36. Ja tam nie wiem, my mieliśmy 2x przedmioty dedykowane CAD'om (u nas akurat jakoś na 2gim semestrze był autocad i na którymś tam solidworks) w dodatku z możliwością zdobycia cswa i cswp z tego drugiego. Niestety co uczelnia/prowadzący to inne odczucia i tego nie zmienimy.
    1 punkt
  37. @Jan_Kunicki @Jan_Kunicki Dobra, już skończ z tą zawodówką... Jeżeli ktoś się nie nadaje do tego typu studiów to odpada z reguły po pierwszym semestrze i to jest normalne, ale zarzucanie komuś że pomylił studia z zawodówką to jest kpina... No słabo trafiłeś, bo osobiście bardzo dużo zrobiłem dla innych w trakcie studiów. 2 lata byłem prezesem koła naukowego i działalnością naszego koła starałem się zapełniać te potworne luki, które tworzyła uczelnia. Osobiście prowadziłem wiele kursów jak choćby z Inventora, projektowania płytek PCB, elektroniki czy Arduino. Na jednym z przedmiotów mieliśmy w Inventorze zaprojektować przez semestr ramię robota przy czym nauka oprogramowania praktycznie nie istniała, przez 3 wykłady prowadzący na projektorze pokazywał co gdzie robi, co jest absurdalnym sposobem nauki i to było widać bo wszyscy szukali jakichś kursów i tutoriali żeby w ogóle zacząć projektowanie. Prowadzący totalnie zignorował moją uwagę, że w ogóle nie pokazał na czym polegają i po co są wiązania w szkicach, a później widziałem jaki ludzie mieli śmietnik jak próbowali zmienić jedną wartość w szkicu. Raz w tygodniu były "zajęcia projektowe" co było jakimś żałosnym żartem, bo zajęcia był w sali komputerowej, gdzie na żadnym komputerze nie było Inventora i cały projekt musieliśmy robić w domu i raz w tygodniu przyjść na "zajęcia projektowe" pokazać postępy choćby jako screeny w telefonie. Prowadziłem np. szkolenie podstawowe dla 32 osób i dodatkowo zorganizowałem szkolenie rozszerzone prowadzone przez firmę i osoby chętne miały możliwość odbycia tego szkolenia z niezłym rabatem (ponadto nie musieli płacić za poziom podstawowy), a po jakimś czasie słyszałem, że 2 osoby dzięki temu załapały się do fajnej pracy. Zakupiłem również kilkanaście zestawów do nauki Arduino i elektroniki i również prowadziliśmy szkolenia. Do naszego koła na rekrutację zawsze przychodziło po kilkadziesiąt osób. Bardzo często były osoby będące na 3 roku, które mówiły że chcą do nas dołączyć bo chcą w końcu się czegoś nauczyć i porobić coś praktycznie. I od razu odbijam zarzut o ich "nadawaniu się do uczelni technicznej" bo były to osoby bardzo inteligentne, którym w ogóle nie było pokazane jak zacząć. Moim zdaniem to jest wstyd dla uczelni, że studenci 3 roku na kierunku automatyka i robotyka nie potrafią używać płytki stykowej i samodzielnie bawić się elektroniką. Oczywiście nie robię z tego żadnego wyznacznika, ale takich zaległości jest dużo dużo więcej.
    1 punkt
  38. Następna część kursu ukończona! Miałem problem z wykonaniem eksperymentu, tak jak był pokazany na filmiku przy prawie Ohma, ale w artykule było to o wiele bardziej przejrzyście pokazane i w tedy zadziałało. Quiz udało się wykonać na 100%
    1 punkt
  39. Streszczenie Urządzenie generuje impulsy wysokiego napięcia. Było pierwotnym projektem, który zainspirował mnie do nauki elektroniki i wreszcie miałem okazję się nim zająć. Jest to tańsza alternatywa dla AVT-738 o znacznie większych możliwościach. UWAGA: AUTOR NIE ODPOWIADA ZA NIEBEZPIECZEŃSTWA WYNIKAJĄCE Z WŁASNEJ REALIZACJI PROJEKTU. PROJEKT JEST NIEBEZPIECZNY I PRZED JEGO WYKONANIEM NALEŻY ZWERYFIKOWAĆ GO U NIEZALEŻNYCH ŹRÓDEŁ ORAZ SKONTAKTOWAĆ SIĘ Z LEKARZEM W CELU KONSULTACJI O MOŻLIWOŚCI ZASTOSOWANIA PODOBNEGO URZĄDZENIA. UWAGA: PROJEKT ZAGRAŻA ŻYCIU OSÓB Z ROZRUSZNIKIEM SERCA LUB POMPĄ INSULINOWĄ. ZABRANIA SIĘ TESTOWANIA GO PRZEZ WSKAZANE OSOBY. Zasada działania Urządzenie składa się z przetwornicy wysokiego napięcia widocznej po prawej stronie powyższego obrazka. Wykorzystana została cewka 1mH z diodą UF4007 (szybka dioda impulsowa, która była tutaj głównie do testów, ale wbrew pozorom nadaje się całkiem dobrze do tego celu). Przetwornica zależnie od zastosowanego tranzystora (STP5NK50 lub STP5NK80) oraz częstotliwości sterującej może wygenerować impuls napięcia w wysokości odpowiednio 500 lub 800 V. Impulsy zaczynają się robić bolesne już przy 300V, więc urządzenie ma spory zapas "mocy" (w znaczeniu możliwości zakresu napięciowego, gdyż maksymalny prąd wyjściowy urządzenia mieści się w zakresie mikroamperów). Sterowanie częstotliwością przetwornicy oraz sygnału wyjściowego jest izolowane galwanicznie, co nie ma większego znaczenia w przypadku zastosowania sprzężenia zwrotnego, aczkolwiek w przypadku jego braku pozwala na całkowite odcięcie urządzenia od mikrokontrolera. W przypadku używania sprzężenia zwrotnego mikrokontroler jest zabezpieczony wyłącznie diodą Zenera (D11), co w przypadku uszkodzenia zabezpieczenia może spowodować (a nawet zagwarantować) zniszczenie mikrokontrolera, stąd używanie sprzężenia zwrotnego nie jest zalecane. Wysokim napięciem sterują tranzystory MOSFET firmy STM, które są sterowane przy użyciu rezystorów podciągających 2.2k, a ich bramka za pomocą tranzystora jest zwierana do masy. W przypadku sterowania częstotliwością sygnał jest odwrócony, co automatycznie powoduje stały przepływ prądu przez cewkę w momencie braku sygnału FREQ. Z tego też powodu został zastosowany system OCP składający się z tranzystora NPN oraz rezystora wpiętego między jego bramkę a masę. Zgodnie z zastosowanym rezystorem prąd płynący przez tranzystor nie powinien przekroczyć 200-300mA (w zależności od jakości użytych komponentów). Sygnał SIG jest podwójnie odwrócony, gdyż w przypadku zastosowania pojedynczego odwrócenia (i braku sygnału SIG) tranzystor byłby cały czas otwarty, a wysoka częstotliwość pracy przetwornicy powodowałaby wysyłanie impulsów wysokiego napięcia o wysokiej częstotliwości na wyjście urządzenia, co jest bardzo nieprzyjemne (ciekawe jak autor się o tym dowiedział...) Wielki szereg diod Zenera pozwala ograniczyć maksymalne napięcie na wyjściu urządzenia, aczkolwiek jest to zabezpieczenie opcjonalne (diody mogą się przegrzewać przy dużych częstotliwościach pracy urządzenia). Kondensator C1 służy jako magazyn energii dla impulsów wychodzących z urządzenia (rezystor rozładowujący R6 jest opcjonalny), a częstotliwość pracy Q3 określa częstotliwość impulsów wychodzących. By wysłać impuls wystarczy otworzyć Q3 na kilka milisekund. System FeedBack to zwykły dzielnik napięcia zabezpieczony diodą Zenera. Wartości elementów można odczytać w tabelce w schemacie. Napięciem wyjściowym przetwornicy sterujemy za pomocą manipulowania częstotliwością PWM sygnału FREQ z wypełnieniem 50% (mikrokontroler lub układ CD4046). Taka modulacja jest modulacją podobną do FM, aczkolwiek wolę ją określić jako PWM, by ułatwić implementację urządzenia. Domyślnie napięcie przetwornicy nie jest przekazywane na linię OUT, więc wymagane jest przekazanie jej sygnału SIG (w domyślnym zastosowaniu jest to sygnał PWM o małym wypełnieniu z regulowaną częstotliwością). Wartość początkową najlepiej obrać w okolicach 100kHz i poruszać się w dół, by uniknąć nieprzyjemnych niespodzianek. Dla wykonujących projekt: Tranzystor sterujący przetwornicą musi być chłodzony, gdyż inaczej grzeje się niemiłosiernie. Napięcie wyjściowe polecam zmierzyć multimetrem przed użyciem urządzenia, inaczej można się niemile zaskoczyć Na start polecam okolice 100-150V. O ile dla Q1 można zastosować tranzystor IRF840, tak w przypadku Q3 posiada on zbyt niski opór po zamknięciu i nie powoduje całkowitego zaniku napięcia wyjściowego dla zakładanego obciążenia. Stąd wybór tranzystorów STP5NKXX, których opór po zamknięciu jest na tyle duży, że napięcie na obciążeniu przy zamkniętym tranzystorze spada niemal do zera. Tranzystory te kupione były "ze starej serii" (jeszcze przed zakazem ołowiu), więc nie wiem jak ich współczesne odpowiedniki poradzą sobie z tym zadaniem, ale zakładam, że są one kompatybilne. Schemat / PCB / Pliki EasyEDA Uwaga: płytka prototypowa pochodzi ze starszej wersji schematu (bez podwójnego odwrócenia linii SIG, z maksymalnie 5 diodami Zenera dla sygnału 500V i bez systemu FeedBack). Shocky_1.4.zip Więcej zdjęć... Inne dodatkowe zbędne gadanie: Koszt urządzenia (nie licząc "nadmiarowych" komponentów) wyniósł poniżej 10 PLN, co w porównaniu do rozwiązania AVT-738 i zastosowania w nim tranzystora TS2/033 o koszcie 20-30zł jest znakomitym wynikiem, zwłaszcza zwiększając możliwości sprzętu. Płytka drukowana była pierwszym projektem wykonanym przez moją frezarkę (i to był pierwszy raz jak lutowałem czystą miedź), więc wybaczcie jakość (A i utlenianie miedzi mi nie przeszkadza, bo to był tylko prototyp, teraz pewnie wrzucę płytki do następnego zamówienia z JLCPCB). Częstotliwość pracy przetwornicy zwykle mieści się w granicach 10-100kHz, więc urządzeniem można sterować analogowo za pomocą CD4046BE. Przetwornica była testowana z obciążeniem w okolicach 1-3MOhm. Jej zachowanie dla innego zakresu obciążenia może odbiegać od założeń.
    1 punkt
  40. Znalazłem Cóż... ślepi nie powinni grać w karty i programować, faktycznie błąd był w maszynie stanów w źle postawionym warunku, zostawiam poprawioną wersję, być może ktoś skorzysta. Działa bez zająknięcia nawet na zdezelowanym enkoderze. #include "main.h" #include "tim.h" #include "stm32l4xx_hal.h" #include "enco.h" typedef enum {idle, count}encoState_t; static uint8_t encodir = 0; static uint16_t encoInterval = 50; static void(*enc_event_callback)(void); void enco_init(const uint16_t interval) { encoInterval = interval; } void register_enc_event_callback(void(*callback)(void)){ if(callback)enc_event_callback = callback; } void ENCODER_EVENT() { static uint16_t encoval = 0; static uint32_t tickStart = 0; static encoState_t enc = idle; static uint16_t roznicaPlus, roznicaMinus; if (encoval != __HAL_TIM_GET_COUNTER(&htim4) && enc == idle) { // zaczeto krecic enc = count; // liczenie encoval = __HAL_TIM_GET_COUNTER(&htim4); // roznicaPlus = __HAL_TIM_GET_COUNTER(&htim4) + (ENCO_STEP - 1); roznicaMinus = __HAL_TIM_GET_COUNTER(&htim4) - (ENCO_STEP - 1); tickStart = HAL_GetTick() + encoInterval; // timeout return; } if (enc == count) { if (roznicaPlus == __HAL_TIM_GET_COUNTER(&htim4)) { encodir = encoRight; encoval = __HAL_TIM_GET_COUNTER(&htim4); enc = idle; if (enc_event_callback)enc_event_callback(); }else if (roznicaMinus == __HAL_TIM_GET_COUNTER(&htim4)) { encodir = encoLeft; encoval = __HAL_TIM_GET_COUNTER(&htim4); enc = idle; if (enc_event_callback)enc_event_callback(); } } if (enc == count && (tickStart < HAL_GetTick())) { // timeout encoval = __HAL_TIM_GET_COUNTER(&htim4); // przypisanie aby nie zmenial statusu bez potrzeby enc = idle; } } encoDir getEncoDir(void){ return encodir; // zwraca kierunek obracania }
    1 punkt
  41. To ja coś od siebie dorzucę, choć bez bezpośredniego odniesienia do automatyki, ale w odniesieniu do niektórych opinii w tym wątku. Zakładam, że czytają go również przyszli studenci. 1. W ostatniej dekadzie czy dwóch widać trend, że "trzeba iść na studia". Jeśli właśnie kończysz technikum (po liceum sprawa jest nieco inna) i chcesz iść na studia tylko dlatego, że rodzina nalega albo idą wszyscy koledzy, to się zastanów. Można być świetnym fachowcem będąc technikiem, a uczelnie nie potrzebują studentów, którzy poszli tam "z musu". 2. Studia mają kilka zadań. Po pierwsze ułożyć pewne rzeczy w głowie. Człowiek z tytułem zawodowym (zwłaszcza mgr) powinien mieć nieco szersze horyzonty, więc te przedmioty typu filozofia czy etyka to nie tylko "zapchajdziury". Jeśli się ma ochotę, to coś z nich w głowie zostanie - niekoniecznie wiedza, raczej rodzaj patrzenia na niektóre sprawy. Po drugie - dać podstawy teoretyczne do wielu rzeczy, w związku z czym... 3. Jest sporo zajęć, w których teorii jest dużo. I to nie tylko na matematyce. Z przymrużeniem oka - w technikum nauczysz się wbijać gwóźdź, na studiach dowiesz się, dlaczego robisz to w taki, a nie inny sposób. 4. Pierwszy rok to uzupełnienie tego, co jest potrzebne na studiach, a czego mogło nie być w średniej (np. całki?) oraz sposób na odsianie tych, którzy trafili na dany kierunek przypadkiem. 5. Zajęcia praktyczne (laboratoria) uczyć powinny umiejętności rozwiązywania zadań niezależnie od środowiska (np. programu), a nie samego programu (klikamy w 3. opcję w 7. menu). Ja wiem, że to się czasem rozmija. Prowadzący, którzy bywają tak samo przypadkowi, jak studenci, przedmioty zupełnie niezwiązane z kierunkiem (bo ktoś musiał dostać godziny), niespójność ładnych deklaracji z ulotek rekrutacyjnych z rzeczywistością nauczania... Uczelnie mają swoje problemy, niektórym pracownikom przeszkadza student, ale dobrze wybrany kierunek powinien dać zadowolenie, choć nie da gwarancji pracy, ani nie da odczuć na własnej skórze realiów pracy w rzeczywistym środowisku (presja czasu, kompromisy między tym, jak coś powinno być zrobione, a jaki jest budżet lub jakie są wymagania klienta, odpowiedzialność za projekt - w firmie nie ma oceny 3, albo sesji poprawkowej, jest dyscyplinarka ).
    1 punkt
  42. Jakby ktoś, tak jak ja pół dnia szukał jak pozbyć się lagów przy streamowaniu, to polecam https://elinux.org/RPi-Cam-Web-Interface
    1 punkt
  43. Jak formatować wiadomości? Niżej opisane funkcje można testować w tym temacie » Z edytora na forum korzysta się w sposób podobny do popularnych programów typu Microsoft Word. Wszystkie opcje dostępne są z poziomu prostego paska narzędzi: Pasek z dostępnymi opcjami Dostępne są tam następujące opcje (od lewej), pogrubieniem zaznaczone zostały opcje, o których wiele osób (niestety) zapomina: Pogrubienie tekstu Pochylanie tekstu Wstawianie kodu programu. Każdy program publikowany na forum powinien być umieszczany za pomocą tej opcji, która odpowiednio koloruje składnię. Wstawianie symboli (np. Ω, µ) Wstawianie linków (odnośników do innych stron) Wstawianie emotikon Wstawianie cytatów np. z dokumentacji lub innych stron Tworzenie listy wypunktowanej Tworzenie listy numerowanej Centrowanie tekstu lub zdjęć Jak dodawać do wiadomości zdjęcia, załączniki i filmy? W celu wstawienia zdjęć należy skorzystać z pola dostępnego pod edytorem, do którego można jednocześnie przesłać wiele obrazków. Każdy obrazek można wstawić w dowolne miejsce wiadomości. Wystarczy przenieść kursor do odpowiedniej linii i nacisnąć znak plusa przy danym obrazku. Wstawiając kilka zdjęć warto ustawić je obok siebie (tak jak powyższe). Podczas pisania opisów DIY mile widziane jest wyrównywanie obrazków do środka. Inne załączniki np. archiwa zip lub pdf'y można dodawać do wiadomości analogicznie jak zdjęcia: W celu wstawienia filmu np. z YouTube wystarczy wkleić link do filmu w nowej linii i nacisnąć klawisz Enter: Częste błędy nowych użytkowników. Jak ich unikać? Ręcznie dodawane, sztucznych odstępów. W celu przejścia do nowej linii należy nacisnąć jeden raz klawisz Enter (jeden, nie dwa lub trzy). Dodawanie przejść do nowej linii po każdym zdaniu. Nie ma potrzeby, aby łamać tekst po każdym zdaniu. Można spokojnie pisać ciągiem, a przejścia do nowej linii stosować wyłącznie w celu otworzenia nowego akapitu Ręczne tworzenie list wypunktowanych. Zamiast wymieniać elementy "ręcznie po myślniku" najlepiej wykorzystać dedykowane opcje z paska narzędzi. Umieszczanie kodów programów w załączniku. Wszystkie programy należy umieszczać w wiadomości za pomocą narzędzia do wstawiania kodów, które dostępne jest na pasku edytora. Dodatkowe triki, które ułatwiają pisanie Istnieje możliwość zawołania konkretnego użytkownika poprzez wpisanie jego nicku poprzedzonego znakiem małpy. Przykład @Treker. Wołana osoba otrzymuje powiadomienie (jeśli wyraziła na to zgodę w swoich ustawieniach). Możliwe jest zacytowania tylko wybranego fragmentu danego posta. W tym celu wystarczy zaznaczyć tekst i skorzystać z opcji cytowania selektywnego: W celu wstawienia emotikon można skorzystać z ikonki buźki w edytorze. Pojawi się wtedy menu z dostępnymi wszystkimi emoji. Znacznie szybsza i wygodniejsza jest jednak opcja wstawiania "ręcznego". Wystarczy napisać znak dwukropka i zacząć pisać po polsku lub angielsku jakiej emotki szukamy. Przykład wstawienia emoji "sowy" oraz "mrówki": Opcja ręcznego wstawiania emotikon Zagnieżdżenie list wykonuje się analogicznie do sposobu znanego z innych popularnych edytorów (np. Word), czyli: tworzymy listę, zaznaczamy odpowiednie pozycje i za pomocą klawisza Tab robimy wcięcie. Powrót do głównego poziomu wykonujemy analogicznie, ale wciskając Shift + Tab. Przykład: Raz Dwa Trzy Cztery Pięć Co jeszcze warto wiedzieć? Każdy post można oceniać za pomocą reakcji "Nie zgadzam się!", "Pomogłeś!", "Lubię!". Pierwsza reakcja jest równoznaczna z negatywną opinią, pozostałe dwie są pozytywne. Bardzo mocno zachęcam do korzystania z reakcji, ponieważ mechanizm ten pozwala na wiele ciekawych opcji jak np. automatyczne zwracanie uwagi moderatora na negatywnie ocenianą wiadomość, podświetlanie i oznaczanie dobrze ocenianych wiadomości itd. W górnym menu forum zdefiniowane są najpopularniejsze strumienie postów czyli. "Nieprzeczytane" oraz "Od ostatniej wizyty", które ułatwiają poruszanie się po forum. Ciekawa zakładką jest "Cała aktywność", czyli strumień wszystkich informacji z forum. Znajdują się tam informacje o każdym poście, nowym użytkowniku oraz o każdej reakcji. Zakładki tej nie trzeba odświeżać, dane ładowane są automatycznie. Szablon dla autorów artykułów publikowanych na forum Osoby zainteresowane publikowaniem swoich artykułów na naszym forum znajdą odpowiednie wskazówki w osobnym artykule: Jak powinien wyglądać dobrze sformatowany artykuł? Instrukcja dla autorów
    1 punkt
  44. Prąd kolektora liczysz wychodząc od prądu bazy i wzmocnienia. Jeżeli do bazy wpływa Ic a wzmocnienie wynosi β to prąd kolektora powinien być β*Ic. Piszę "powinien być" a nie "jest", bo z tego prostego wzoru wyznaczasz jaki prąd tranzystor chciałby widzieć w kolektorze. To jaki płynie w rzeczywistości, zależy od sposobu zasilania kolektora czyli w tym przypadku od napięcia zasilania i wartości rezystora obciążenia (czyli tego w kolektorze). Jeżeli te wartości umożliwiają przepływ takiego prądu, tyle będzie płynąć. Jeśli nie, tranzystor wejdzie w nasycenie. Po prostu jego chęć "wciągania" prądu będzie na tyle duża, że napięcie kolektora spadnie do minimalnej wartości kilkudziesięciu mV i koniec. Dalej tranzyustor nie może już obniżyć napięcia Uce (bo tylko to zwiększa prąd Ic) więc i prądu więcej nie popłynie a całe napięcie zasilania odłoży się na rezystorze kolektorowym. Jest oczywistym, że maksymalny prąd jaki może popłynąć w kolektorze to Uzas/Rc. Dla poprawności można jeszcze od Uzas odliczyć 50-100mV spadku na samym nasyconym tranzystorze. Wyobrażaj sobie kolektor jako elektrodę która "zasysa" (w przypadku npn) prąd w takiej ilości ile wpychasz do bazy razy wzmocnienie. Tranzystorowi wszystko jedno czy jest tam w kolektorze jakiś opornik czy go nie ma. Będzie płynęło tyle prądu ile kolektor potrzebuje chyba, że ograniczysz go sztucznie opornikiem lub w jakiś inny sposób. Wtedy także prąd kolektora będzie liniowo rósł z prądem bazy ale tylko do momentu, aż osiągnie właśnie Uzas/Rc. Potem przestanie. W praktyce wzmocnienie nie jest niestety stałe. Wartości podawane w danych katalogowych (widełki) odnoszą się do wszystkich produkowanych sztuk tak samo się nazywających. Wzmocnienie mierzone jest zawsze w jakichś warunkach (Ib lub Ic i Uce) i są one podane w tabelce obok deklarowanej wartości wzmocnienia. Wzmocnienie zależy przede wszystkim od prądu bazy. Dla małych prądów (< 10% Ic_max) raczej będzie takie jak zmierzone miernikiem - on też mierzy przy bardzo małym prądzie (np. Ic=1mA). Im będziesz tranzystor bardziej obciążął, tym wzmocnienie będzie spadać i to znacznie. Dla Ic_max może to być już tylko np. 20% początkowego. Dlatego jeśli projektujesz jakiś klucz tranzystorowy włączający duże (dla danego typu tranzystora) obciążenie, musisz w bazę pompować znacznie więcej prądu niż wychodzi to z pomiaru wzmocnienia zrobionego multimetrem. Np. jeśli masz dużą, latarkową diodę LED o zapotrzebowaniu 300mA, wstawiasz tranzystor o powiedzmy Ic_max=800mA i wzmocnieniu katalogowym β=200 to wychodzi, że w bazę wystarczy wpuścić 1.5mA. Jeżeli nie dasz jakichś 5-8mA, tranzystor może nie wejść w nasycenie i nie pochłonąć w kolektorze całych 300mA. To oznacza większe napięcie Uce i dużo mocy wydzielanej w ciepło a to bardzo boli.
    1 punkt
Tablica liderów jest ustawiona na Warszawa/GMT+02:00
×
×
  • 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.