|
Dołącz teraz!
|
Dołącz już teraz do największej społeczności miłośników Forda w Polsce. Zarejestruj się i uzyskaj pełen dostęp do wszystkich działów, tematów i opcji jakie oferuje forum! |
|
Narzędzia wątku | Przeszukaj ten temat |
24-02-2022, 00:27 | #1 |
FCP member
Imię: Tadeusz
Zarejestrowany: 04-11-2011
Skąd: Katowice
Model: Mitsubishi Outlander PHEV, C-max Energi (USA) PHEV
Silnik: 2.4 PB, 2.0 PB wolnossące cykl Atkinsona - hybryda plug-in
Rocznik: 2019, 2016
Postów: 16,987
|
ARDUINO - gdy w aucie Ci czegoś brakuje...
Wątek nie dotyczy stricte multimediów samochodowych, ale postanowiłem go umieścić w tym dziale jako "odnoszący się do szeroko rozumianej elektroniki"...Goście nie mogą oglądać obrazków w postach. Zarejestruj się klikając tutaj aby uzyskać pełen dostęp do forum.
Rzecz będzie o tym, "co zrobić jeśli w aucie nam czegoś brakuje a mamy pomysł jak to uzupełnić". Czasy, gdy wystarczył jakiś przekaźnik, trochę przewodów i szczypce płaskie "były wzięły i bezpowrotnie minęły"..Goście nie mogą oglądać obrazków w postach. Zarejestruj się klikając tutaj aby uzyskać pełen dostęp do forum. Dzisiaj wszystko sterowane jest sterownikami wpiętymi w sieć CAN albo LIN i uruchamiane zazwyczaj w oparciu o komunikaty na tych magistralach. Tak więc aby (to są przykłady...): - dodać tylne światło przeciwmgielne w samochodzie Escape 2013-2019 (tym z USA...) i by to działało "jak z fabryki" (europejskiej...) potrzebne jest "magiczne pudełeczko" podpięte do szyny CAN; - by działała (jak z fabryki...) podgrzewana przednia szyba w autach z USA czasem (o dziwo...) wystarczą przekaźniki (po wymianie panelu przycisków klimatyzacji na wersję EU) a czasami znów trzeba użyć "magicznego pudełeczka" wpiętego w CAN. Takich przykładów można mnożyć, ale "nie o tym jest ten wątek"... Postaram się tu pokazać - na rzeczywistym przykładzie - jak rozwiązuje się problemy podobne do powyżej wskazanych. Opis będzie dotyczył mojego Mitsubishi Outlandera 2019 PHEV - w którym (dość dawno temu...) wymieniłem szybę przednią na podgrzewaną (identyczną jak w Fordzie...) bo mi się trafiła za akceptowalne pieniądze i "czułem wewnętrzną potrzebę jej montażu"...Goście nie mogą oglądać obrazków w postach. Zarejestruj się klikając tutaj aby uzyskać pełen dostęp do forum. W Mitsubishi grzana szyba przednia (w skrócie tu nazywana HWS) sterowana jest przez panel klimatyzacji. Musi on być w wersji obsługującej tę opcję. Niestety mój panel (P/N 7820B232) nie obsługiwał tej opcji, a takiego co mógłby go skutecznie w tym zastąpić (P/N 7820B231) na całym świecie na Allegro, eBay, Amazon, OLX i gdzie tam jeszcze nie można było przez ponad rok znaleźć. Nowy w ASO przez Mitsubishi został wyceniony na "drobne" 1100 (tysiąc sto...) EURO! - więc "nie rozważałem tej opcji"... W związku z powyższym, by moja HWS "nie marnowała się w bezczynności" musiałem jakoś sobie "auto uzupełnić". Na początek postanowiłem spróbować "przerobić" (uzupełnić) mój panel 7820B232 do wersji 7820B231 - porobiłem stosowne zdjęcia płytek panelu 231 i z kolegą zabraliśmy się za uzupełninie brakujących elementów. Udało nam się wszystko pouzupełniać (jak nam się wydawało...) zgodnie z posiadanymi zdjęciami i - o dziwo - panel dalej żył... Niestety szczęścia mieliśmy "tylko połowę". Okazało się, że funkcjonuje poprawnie cały tor wejściowy (naciśnięcie klawisza podgrzewania szyby jest "zauważane" przez panel klimatyzacji, są kontrolowane wszelkie warunki włączenia szyby oraz czas jej grzanie itp., kontrolka podgrzewania szyby na mojej fabrycznej navi się pokazuje - niestety tor wyjściowy sygnału "nie ruszył" i przekaźniki uruchamiania przetwornicy napięcia do grzania HWS nie włączają się... Czyli mamy tu sytuację "wypisz wymaluj" dokładnie jak w owym Escape przywołanym powyżej...Goście nie mogą oglądać obrazków w postach. Zarejestruj się klikając tutaj aby uzyskać pełen dostęp do forum. Tak więc w moim rozumieniu "szklanka była do połowy PEŁNA" i mogłem zacząć działać by ją "napełnić do pełna"...Goście nie mogą oglądać obrazków w postach. Zarejestruj się klikając tutaj aby uzyskać pełen dostęp do forum. No i tu wreszcie jest miejsce by na scenę wszedł nasz główny bohater - ARDUINO... Sytuacja jest niejako "wymarzona" do jego użycia - najwyraźniej generowane są stosowne komunikaty CAN o włączeniu/wyłączeniu HWS - no bo nawigacja "umie" włączyć ikonę uruchomionej podgrzewanej szyby... Wystarczy więc "tylko" znaleźć te komunikaty i użyć ich do wypracowania "brakujących" sygnałów załączenia przekaźnika włączającego przetwornicę napięcia do podgrzewania HWS. No więc "DO DZIEŁA". Do realizacji mojego projektu wybrałem "niedawno odkryty" mardzo przyzwoity moduł z MCU ATtiny167 - DigiSpark ATtiny 167 Pro - Goście nie mogą oglądać obrazków w postach. Zarejestruj się klikając tutaj aby uzyskać pełen dostęp do forum. Sam MCU Atmel ATtiny167 opisany jest [Tylko zarejestrowani użytkownicy widzą linki. ] - więc nie będę tu przytaczał opisu, ale dodam, iż bardzo małe rozmiary modułu, 16kB flash (po odjęciu obszaru bootloadera pozostaje ponad 14kB pamięci na program użytkownika), dostęp niezbędnych interfejsów (jako ciekawostkę dodam, iż wbudowany USART posiada możliwość działania jako kontroler LIN...) czynią z tego MCU wprost idealne narzędzie do tworzenia całkiem sporych projektów. Niestety - jak większość MCU na jądrze AVR - nie ma on wbudowanego interfejsu CAN - więc niezbędne jest użycie zewnętrznego modułu. Akurat w tym obszarze "nie ma tłoku" i narzuca się użycie najpopularniejszego modułu opartego o chip MCP2515. Goście nie mogą oglądać obrazków w postach. Zarejestruj się klikając tutaj aby uzyskać pełen dostęp do forum. Dla zapewnienia niezawodności działania urządzenia w aucie ostatnio przestałem polegać na niezawodności stabilizatorów liniowych montowanych na modułach arduino (zbyt dużo poszło mi ich "z dymem"...) i zacząłem stosować miniaturowe przetwornice napięcia - bardzo mi się spodobała taka: Goście nie mogą oglądać obrazków w postach. Zarejestruj się klikając tutaj aby uzyskać pełen dostęp do forum. (tu sfotografowana "z resztą towarzystwa"...) aktualnie dostępna [Tylko zarejestrowani użytkownicy widzą linki. ] Jak widać na zdjęciu - moduł MCP2515 (mimo, że już przeze mnie sporo "przycięty"...) to w stosunku do przetwornicy i ATtiny167 "prawdziwy gigant"... Właśnie ze względów na te rozmiary oraz naprawdę spore możliwości - polecam taki zestaw do realizacji zdecydowanej większości projektów "w aucie" i nie tylko... Ponieważ już wszystko widać "na czym działamy", to pora wreszcie przystąpić do "clou programu" - zaprezentować sam program właśnie... W nomenklaturze Arduino zwany "sketch". Prezentowany poniżej sketch napisany został "w wersji maksymalnej" - w obsłudze magistrali CAN uzywa filtrów sprzętowych modułu MCP2515 oraz przerwań generowanych przez ten moduł. Ponadto - trochę dla "zabawy" oraz z tego powodu, ze mój moduł działa w aucie caly czas (także na wyłączonym zapłonie) - to sketch używa trybu obniżonego poboru energii (uśpienia modułu) właśnie w czasie gdy zapłon jest wyłączony. Oczywiście tryb "sleep" - jak wyżej napisałem - zaprogramowałem "przykładowo" i "dla zabawy" bo cały zestaw zużywa poniżej 100mA... Oto cały kod programu: Kod:
// sketch napisany dla modułu ATtiny167 Digispark Pro // ================================================== // Moduł CAN MCP2515 obsługiwany z użyciem przerwań // oraz masek/filtów do selekcji odbieranych ID ramek // ================================================== // w czasie gdy zapłon jest wyłączony (stan !_READY) // MCU ATtiny167 jest w stanie niskiego poboru energii // // (c) Tedi_k 2022 - użycie oraz modyfikacje dopuszczone // pod warunkiem wskazania autora // #include <SPI.h> #include <mcp2515.h> #include <avr/sleep.h> #define RDY_LED 1 // wewnętrzna (w module) kontrolka stanu READY/HSW ON (jak miga) #define HWS_OUT 2 // grzana przednia szyba - przekaźnik/tanzystor wystawić ma masę. #define PINT0 3 // INT0 jest na pinie PB6 - a to jest D3 #define HWS_IN 5 // włącznik grzania HSV - sterowanie masą #define CS_MCP2515 9 // chip select modułu CAN (reszta na standardowym SPI) #define NUSED1 0 // lista pinów nieużywanych - do inicjalizacji dla trybu sleep() #define NUSED2 4 #define NUSED3 6 #define NUSED4 7 #define NUSED5 12 #define _SW_time 2500UL // force_ON wymaga trzymania przełącznika HWS wciśniętego przez 2,5 sekundy #define _ON_time 180000UL // w trybie force_ON HWS grzeje przez 180 sekund (3 minuty) #define _BLNK_time 500UL // blink co 0,5 sekundy #define _CAN_time 2000UL // 2 sek. bez ramki na CAN == "śmierć CAN" #define ON true #define OFF false #define REL_ON HIGH // sterowanie przekaźnikiem/tranzystorem z portu (wysokim) #define REL_OFF LOW #define LED_ON HIGH // dioda-kontrolka sterowana z portu (wysokim) #define LED_OFF LOW boolean wrk, WINDSHIELD_H_ON, force_ON, prev_HWS_IN; boolean _READY, _blnk; uint32_t _t_ON, _t_BLNK, _t_CAN; // czas (millis()) włączenia trybu force_ON oraz sterowanie miganiem diody int temp; volatile bool interrupt = false; struct can_frame canMsg; MCP2515 mcp2515(CS_MCP2515); // pin CS dla interfejsu SPI do modułu mcp2515 void irqHandler() { interrupt = true; } void (* resetFunc) (void) = 0; // "Programowe" wykonanie RESET modułu (skok pod adres "0"). void setup() { WINDSHIELD_H_ON = force_ON = _READY = false; _blnk = true; prev_HWS_IN = HIGH; temp = 0; pinMode(HWS_OUT, OUTPUT); pinMode(RDY_LED, OUTPUT); pinMode(HWS_IN, INPUT_PULLUP); pinMode(PINT0, INPUT_PULLUP); pinMode(NUSED1, OUTPUT); // Inicjalizacja pinów nieużywanych dla potrzeb trybu oszczędzania energii pinMode(NUSED2, OUTPUT); pinMode(NUSED3, OUTPUT); pinMode(NUSED4, OUTPUT); pinMode(NUSED5, OUTPUT); digitalWrite(NUSED1, LOW); digitalWrite(NUSED2, LOW); digitalWrite(NUSED3, LOW); digitalWrite(NUSED4, LOW); digitalWrite(NUSED5, LOW); digitalWrite(RDY_LED, LED_OFF); // Wyłączenie LED (stan "zanegowany") mcp2515.reset(); mcp2515.setBitrate(CAN_250KBPS, MCP_16MHZ); // Sets CAN at speed 250KBPS and Clock 16MHz - MS-CAN // (digitalPinToInterrupt(PINT0) - nie kompiluje się) mcp2515.setFilterMask(MCP2515::MASK0, false, (uint32_t) 0x3ff); // Trzeba zainicjować obie maski w MCP2515 (ramki poniżej diagnostycznych) mcp2515.setFilterMask(MCP2515::MASK1, false, (uint32_t) 0x3ff); mcp2515.setFilter(MCP2515::RXF0, false, (uint32_t) 0x315); // MCP2515 ma 6 filtrów (ramka z temperaturą zewnętrzną) mcp2515.setFilter(MCP2515::RXF1, false, (uint32_t) 0x188); // ramka ze statusem klimatyzacji mcp2515.setNormalMode(); // setNormalMode() MUSI być za definicjami masek i filtrów attachInterrupt(INT0, irqHandler, FALLING); // INT0 dla przyjętego pinu 6 do podłączenia INT z MCP2515 set_sleep_mode(SLEEP_MODE_IDLE); // Aby działało SPI nie można użyć wyższego trybu uśpienia _t_BLNK = millis(); while(CAN_MsgRead() != MCP2515::ERROR_OK) led_BLNK(); // sprawdzamy "czy CAN żyje"... digitalWrite(RDY_LED, LED_OFF); // Wyłączenie LED (stan "zanegowany") _t_ON =_t_CAN = millis(); } void loop() { if ((uint32_t) (millis() - _t_CAN) > _CAN_time) { // CAN "umarł" - RESET całego sterowania HWS(OFF); resetFunc(); } if (interrupt && CAN_MsgRead() == MCP2515::ERROR_OK) { interrupt = false; _t_CAN = millis(); // jest ramka na CAN switch ((unsigned int)canMsg.can_id) { case (unsigned int) 0x315: // ramka z temperaturą zewnętrzną temp = (int) (canMsg.data[6]>>1) - 40; break; case (unsigned int) 0x188: // ramka statusu klimatyzacji if (canMsg.data[0] == (byte) 0x03) _READY = true; else // po wyłączeniu silnika natychmiast wyłączamy HWS _READY = force_ON = false; { byte s = canMsg.data[2]; s &= 0xF0; if (_READY && s == 0x80) { HWS(ON); // windshield ON force_ON = false; // HWS włączona wtrybie normalnym - kasuje to tryb force_ON } else if (_READY && s != 0x80 && !force_ON) { if (WINDSHIELD_H_ON) // HWS właśnie wyłączana w trybie normalnym prev_HWS_IN = LOW; // zabezpieczenie przed interpretacją przycisku HWS HWS(OFF); // HWS wyłączona w trybie normalnym } } break; default: // Przy prawidłowych filtrach tu nigdy nie trafia... break; } } if (!WINDSHIELD_H_ON) digitalWrite(RDY_LED, (_READY) ? LED_ON : LED_OFF); else led_BLNK(); // Przy włączonej HSW kontrolka led miga if (!_READY) { HWS(OFF); // natychmiastowe wyłączenie HWS w trybie "not READY" sleep_enable(); sei(); sleep_mode(); // przejście w stan uśpienia do czasu przerwania INT0 od następnej ramki CAN sleep_disable(); } else { if (temp <= 5) return; // poniżej 5st. C jedynie tryb "normalny" HWS if (!force_ON && WINDSHIELD_H_ON) return; // Jeśli HWS włączona w trybie normalnym to nic do zrobienia wrk = digitalRead(HWS_IN); if (force_ON) { if(wrk == LOW && wrk == prev_HWS_IN) return; // czekamy na puszczenie klawisza HWS; if (wrk == LOW) HWS(OFF); // ręczne wyłączenie HWS w trybie force_ON if ((uint32_t) (millis() - _t_ON) > _ON_time) HWS(OFF); // upłynął czas włączenia HWS w trybie force_ON prev_HWS_IN = wrk; return; } if (wrk == HIGH) { prev_HWS_IN = HIGH; return; // przycisk włączenia HWS nie jest wciśnięty; } if (wrk != prev_HWS_IN) { // obsługa włączania tryby force_ON if (prev_HWS_IN == HIGH) // właśnie wciśnięto przycisk HWS _t_ON = millis(); prev_HWS_IN = LOW; } else // klawisz HWS nadal wciśnięty... if ((uint32_t) (millis() - _t_ON) > _SW_time) { _t_ON = millis(); force_ON = true; HWS(ON); } } } void led_BLNK() { if ((uint32_t) (millis() - _t_BLNK) > _BLNK_time) { _t_BLNK = millis(); _blnk = !_blnk; } digitalWrite(RDY_LED, _blnk); } void HWS(bool on_off) { digitalWrite(HWS_OUT, (on_off) ? REL_ON : REL_OFF); // przekaźnik HWS WINDSHIELD_H_ON = on_off; if (!on_off && force_ON) { force_ON = false; _t_ON = millis(); } } int CAN_MsgRead() { uint8_t irq = mcp2515.getInterrupts(); if (irq & MCP2515::CANINTF_RX0IF) return(mcp2515.readMessage(MCP2515::RXB0, &canMsg)); if (irq & MCP2515::CANINTF_RX1IF) return(mcp2515.readMessage(MCP2515::RXB1, &canMsg)); return(MCP2515::ERROR_NOMSG); } Po podmianie logiki związanej z tą moją HWS na logikę np. włączania "tylnego światła przeciwmgielnego w Escape" zmieni się w powyższej treści nie więcej niż jakieś 10% kodu... Kluczowym problemem - który w tym poście nie jest nawet sygnalnie opisany ... - jest zidentyfikowanie ramek CAN do użycia w naszym projekcie... Ale tego to już nie da się opisać "pokrótce". To po prostu trzeba umieć zrobić. Sporo godzin z komputerem w aucie, cierpliwość, spostrzegawczość i doświadczenie to zestaw niezbędnych cech... Każdy tu musi już sobie jakoś sam poradzić... Jak łatwo sprawdzić - "w całym Internecie" nie da się znaleźć informacji w jakiej ramce CAN w Mitsubishi Outlanderze PHEV jest status "włączonego zapłonu"... A jednak "jest namierzony"...Goście nie mogą oglądać obrazków w postach. Zarejestruj się klikając tutaj aby uzyskać pełen dostęp do forum. Jak ktoś będzie chciał skonsultować swoje pomysły - to służę pomocą w tym wątku.
__________________
------------------------------------------------------------------------------------------------ Nadal tu jestem - choć jeżdżę Mitsubishi Outlander PHEV 4x4 2019 224KM Ostatnio edytowane przez tedi_k ; 24-02-2022 o 11:56 |
24-02-2022, 09:24 | #2 | |
ford::professional
Imię: Adrian
Zarejestrowany: 26-07-2017
Skąd: Piekary Śląskie
Model: ff3 - dołożone wszystko
Silnik: 1.6 tdci 115KM
Rocznik: 2014
Postów: 1,288
|
Odp: ARDUINO - gdy w aucie Ci czegoś brakuje...
Cytat:
Obyło by się bez przetwornicy i can Goście nie mogą oglądać obrazków w postach. Zarejestruj się klikając tutaj aby uzyskać pełen dostęp do forum. |
|
24-02-2022, 11:48 | #3 | |
FCP member
Imię: Tadeusz
Zarejestrowany: 04-11-2011
Skąd: Katowice
Model: Mitsubishi Outlander PHEV, C-max Energi (USA) PHEV
Silnik: 2.4 PB, 2.0 PB wolnossące cykl Atkinsona - hybryda plug-in
Rocznik: 2019, 2016
Postów: 16,987
|
Odp: ARDUINO - gdy w aucie Ci czegoś brakuje...
Cytat:
Wg moich kryteriów (1. Wielkość pudełka, 2. Cena komponentów, 3. Łatwość programowania, dostępność bibliotek, stabilność kodu, 4. Niezawodność w środowisku automotive/odporność na poziom napięcia zasilania, 5. Przydatność do użycia w innych/podobnych projektach) pokazane powyżej rozwiązanie jest zdecydowanie najlepsze. Niezależnie od pomysłów "na czym to zrobić" najważniejsza i tak jest ta radość: "działa tak jak chciałem! Jak w Fordzie!!!"Goście nie mogą oglądać obrazków w postach. Zarejestruj się klikając tutaj aby uzyskać pełen dostęp do forum. Widok z dzisiejszego poranka... Goście nie mogą oglądać obrazków w postach. Zarejestruj się klikając tutaj aby uzyskać pełen dostęp do forum.
__________________
------------------------------------------------------------------------------------------------ Nadal tu jestem - choć jeżdżę Mitsubishi Outlander PHEV 4x4 2019 224KM Ostatnio edytowane przez tedi_k ; 24-02-2022 o 12:02 |
|
26-02-2022, 17:14 | #4 |
FCP member
Imię: Tadeusz
Zarejestrowany: 04-11-2011
Skąd: Katowice
Model: Mitsubishi Outlander PHEV, C-max Energi (USA) PHEV
Silnik: 2.4 PB, 2.0 PB wolnossące cykl Atkinsona - hybryda plug-in
Rocznik: 2019, 2016
Postów: 16,987
|
Odp: ARDUINO - gdy w aucie Ci czegoś brakuje...
Dzisiaj coś specjalnego dla Kolegi
@[Tylko zarejestrowani użytkownicy widzą linki. ]
- [Tylko zarejestrowani użytkownicy widzą linki. ] zostało zadane pytanie o dołożenie grzanej szyby do Explorera USA.
Tak jak pisałem w pierwszym poście - można spróbować to zrobić "jak z fabryki", ale wtedy konieczna jest co najmniej wymiana panelu przycisków klimatyzacji na wersję EU. Pisałem też, że nie koniecznie może być to wykonalne (osobiście nie sprawdzałem, czy dla Explorera taki panel klawiszy istnieje...). Można też to zrobić "w sposób uproszczony - aby tylko dało się włączyć i wyłączyć grzanie szyby oraz by to grzanie działało przez określony czas i samo się wyłączało". Ten post będzie o takim przypadku. Zresztą znów sprowokowany jest "ze świata Mitsubishi", bo kolega "od tych aut" poprosił mnie o zrobienie takiego "prościutkiego modułu" do załączania przedniej szyby w modelach benzynowych (a nie PHEV jak mój opisany wcześniej moduł). Tym razem (ponieważ to "prościutki moduł") postanowiłem go zrobić na ATtiny 85. Goście nie mogą oglądać obrazków w postach. Zarejestruj się klikając tutaj aby uzyskać pełen dostęp do forum. [Tylko zarejestrowani użytkownicy widzą linki. ] cały opis tej płytki. Schemat płytki jest prościutki: Goście nie mogą oglądać obrazków w postach. Zarejestruj się klikając tutaj aby uzyskać pełen dostęp do forum. Oczywiście dodałem do układu "swoją ulubioną przetwornicę", by zapewnić jakiś racjonalny poziom niezawodności całego rozwiązania. Goście nie mogą oglądać obrazków w postach. Zarejestruj się klikając tutaj aby uzyskać pełen dostęp do forum. Do modułu trzeba jeszcze dodać 2 tranzystory i 2 rezystory po jednym dla każdego z 2 wyjść sterujących załączaniem przekaźników każdej z połówek grzanej przedniej szyby. Układ sterujący może być taki sam (na tranzystorze BC548 ) jak w module ASSoff opisanym swego czasu w dziale Mondeo MK5. Kod programu: Kod:
// sketch napisany dla modułu ATtiny85 // ================================================== // Moduł sterujący włączaniem grzanej przedniej szyby // Bez kontroli warunków (temperatury) i bez uzależnienia czasu grzania szyby // od tych warunków. Sterowany jedynie zasilaniem samego modułu // oraz przyciskiem włączenia/wyłączenia grzania. // ================================================== // Moduł powinien być zasilany jedynie w stanie dopuszczającym włączenie HWS // - czyli z uruchomionym silnikiem. // Przekaźniki HWS1 i HWS2 od włączania grzania połówek szyby powinny być zasilane // po włączeniu zapłonu a sterowane masą z odpowiednio wyjścia HWS_OUT1 i HWS_OUT2 z modułu. // // (c) Tedi_k 2022 - użycie oraz modyfikacje dopuszczone // pod warunkiem wskazania autora // #define RDY_LED 1 // wewnętrzna (w module) kontrolka stanu READY/HWS ON (jak miga) #define HWS_OUT1 2 // grzana przednia szyba - przekaźnik/tanzystor wystawić ma masę. #define HWS_OUT2 3 // INT0 jest na pinie PB6 - a to jest D3 #define HWS_IN 0 // włącznik grzania HSV - sterowanie masą #define _SW_time 500UL // force_ON wymaga trzymania przełącznika HWS wciśniętego przez 0,5 sekundy #define _ON_time 330000UL // grzeje przez 330 sekund (5,5 minuty) #define _BLNK_time 500UL // blink co 0,5 sekundy #define _HWS1_2_delay 5000UL // Odstęp 5 sekund pomiędzy włączeniem połówek HWS #define ON true #define OFF false #define REL_ON HIGH // sterowanie przekaźnikiem/tranzystorem z portu (wysokim) #define REL_OFF LOW #define LED_ON HIGH // dioda-kontrolka sterowana z portu (wysokim) #define LED_OFF LOW boolean wrk, WINDSHIELD_H_ON, prev_HWS_IN; boolean _blnk, wait_SW; uint32_t _t_ON, _t_BLNK, _t_CAN; // czas (millis()) włączenia trybu force_ON oraz sterowanie miganiem diody void setup() { WINDSHIELD_H_ON = wait_SW = false; _blnk = true; prev_HWS_IN = HIGH; pinMode(HWS_OUT1, OUTPUT); pinMode(HWS_OUT2, OUTPUT); pinMode(RDY_LED, OUTPUT); pinMode(HWS_IN, INPUT_PULLUP); digitalWrite(RDY_LED, LED_OFF); // Wyłączenie LED digitalWrite(HWS_OUT1, REL_OFF); // Wyłączenie sygnałów HWS1 digitalWrite(HWS_OUT2, REL_OFF); // i HWS2 while (!digitalRead(HWS_IN)); // Przy włączaniu zapłonu przycisk HWS musi być zwolniony (stan niski) delay(_SW_time); while (!digitalRead(HWS_IN)); // test zwolnionego przycisku przez 0,5 sek. _t_BLNK = _t_ON = millis(); } void loop() { HWS(WINDSHIELD_H_ON); if (!WINDSHIELD_H_ON) digitalWrite(RDY_LED, LED_ON); else led_BLNK(); // Przy włączonej HWS kontrolka led miga wrk = digitalRead(HWS_IN); if(wrk == LOW && wrk != prev_HWS_IN) { // Klawisz HWS właśnie został naciśnięty _t_ON = millis(); prev_HWS_IN = LOW; return; } if(wrk == LOW && wrk == prev_HWS_IN && wait_SW) return; // Czekamy na puszczenie klawisza HWS; if(wrk == LOW && wrk == prev_HWS_IN) { if ((uint32_t) (millis() - _t_ON) > _SW_time) return; // Oczekiwanie na zadany czas utrzymania klawisza wciśniętym else { // Klawisz wciśnięty odpowiednio długo if (!wait_SW) // Jeśli jeszcze nie jest obsłużony WINDSHIELD_H_ON = !WINDSHIELD_H_ON; // to włączenie lub wyłączenie HWS w zależności od jej aktualnego stanu wait_SW = true; // Klawisz już obsłużony, oczekwanie na jego puszczenie return; } } if (wrk == HIGH) { // Klawisz puszczony, zezwolenie na ponowną obsługę wciśnięcia klawisza prev_HWS_IN = HIGH; wait_SW = false; return; } } void led_BLNK() { if ((uint32_t) (millis() - _t_BLNK) > _BLNK_time) { _t_BLNK = millis(); _blnk = !_blnk; } digitalWrite(RDY_LED, _blnk); } void HWS(bool on_off) { if (on_off) { if (!WINDSHIELD_H_ON) _t_ON = millis(); digitalWrite(HWS_OUT1, REL_ON); // Przekaźnik HWS1 pierwszej połowy WINDSHIELD_H_ON = ON; if ((uint32_t) (millis() - _t_ON) > _HWS1_2_delay) digitalWrite(HWS_OUT2, REL_ON); // Przekaźnik HWS2 drugiej połowy if ((uint32_t) (millis() - _t_ON) > _ON_time) WINDSHIELD_H_ON = OFF; } else { digitalWrite(HWS_OUT1, REL_OFF); // Wyłączenie przekaźnika HWS1 pierwszej połowy digitalWrite(HWS_OUT2, REL_OFF); // Wyłączenie przekaźnika HWS2 drugiej połowy WINDSHIELD_H_ON = OFF; } } Trzeba więc zadbać o to, by moduł załączał się jedynie w sytuacji, gdy można włączać podgrzewaną szybę przednią. Może być to na przykład układ z wykorzystaniem jakiegoś modułu od uruchamiania świateł DRL (zwykle takie moduły mierzą napięcie ładowania jako wskaźnik, że silnik jest już uruchomiony). Do włączania podgrzewania szyby można wykorzystać dowolny przycisk niestabilny ("naciskany") podający masę na wejście HWS_IN modułu. Całość jak widać jest "uproszczona do granic możliwości". Są zwolennicy i takich rozwiązań...
__________________
------------------------------------------------------------------------------------------------ Nadal tu jestem - choć jeżdżę Mitsubishi Outlander PHEV 4x4 2019 224KM Ostatnio edytowane przez tedi_k ; 26-02-2022 o 20:09 |
28-02-2022, 20:57 | #5 |
FCP member
Imię: Tadeusz
Zarejestrowany: 04-11-2011
Skąd: Katowice
Model: Mitsubishi Outlander PHEV, C-max Energi (USA) PHEV
Silnik: 2.4 PB, 2.0 PB wolnossące cykl Atkinsona - hybryda plug-in
Rocznik: 2019, 2016
Postów: 16,987
|
Odp: ARDUINO - gdy w aucie Ci czegoś brakuje...
W uzupełnieniu tego postu powyżej (o "prostym module...") - zamieszczam zdjęcie modułu w pełni zmontowanego i okablowanego.
Zamontowane są tranzystory sterowania przekaźnikami oraz "na wszelki wypadek" - tzw. "diody gaszące". Te ostatnie niezbędne są do zniwelowania "napięcia pasożytniczego" generującego się na indukcyjności (na cewce elektromagnesu przekaźnika) przy jej wyłączaniu. Moduł gotowy jest do "zamknięcia w (magicznym?Goście nie mogą oglądać obrazków w postach. Zarejestruj się klikając tutaj aby uzyskać pełen dostęp do forum.) pudełku". Goście nie mogą oglądać obrazków w postach. Zarejestruj się klikając tutaj aby uzyskać pełen dostęp do forum. Uprzejmie proszę NIE OCENIAĆ mych "zdolności lutowmniczych" - gdyż "są żadne. Nie lubię się nimi "chwalić" Goście nie mogą oglądać obrazków w postach. Zarejestruj się klikając tutaj aby uzyskać pełen dostęp do forum., ale inaczej nie będzie jakiegokolwiek przykładu "jak może wyglądać taki "prościutki modulik" po zmontowaniu...
__________________
------------------------------------------------------------------------------------------------ Nadal tu jestem - choć jeżdżę Mitsubishi Outlander PHEV 4x4 2019 224KM Ostatnio edytowane przez tedi_k ; 28-02-2022 o 21:00 |
03-03-2022, 18:29 | #6 |
FCP member
Imię: Tadeusz
Zarejestrowany: 04-11-2011
Skąd: Katowice
Model: Mitsubishi Outlander PHEV, C-max Energi (USA) PHEV
Silnik: 2.4 PB, 2.0 PB wolnossące cykl Atkinsona - hybryda plug-in
Rocznik: 2019, 2016
Postów: 16,987
|
Odp: ARDUINO - gdy w aucie Ci czegoś brakuje...
Wczoraj - w czasie uruchamiania układu z użyciem docelowych przekaźników włączania podgrzewania połówek HWS - zauważyłem dość uciążliwą właściwość układów ATtiny.
Dotyczy to prawdopodobnie wszystkich układów nowych serii ATtiny, posiadający emulowany/wirtualny port USB. Port taki zrealizowany jest programowo z wykorzystaniem standardowych we/wy cyfrowych. W przypadku ATtiny85, linia D+ portu USB zrealizowana jest na wyjściu D2 a linia D- na wyjściu D3. Aktualnie zwykle dla tej rodziny układów rolę bootloadera pełni 'micronucleus' potrafiący dokonywać ładowania zawartości pamięci flash z wykorzystaniem wirtualnego portu USB. Aby móc sprawdzić, czy ma być wykonana funkcja wgrywania zawartości flash, 'micronucleus' musi zainicjalizować ów wirtualny port USB. No i tu zaczynają się potencjalne problemy. Jak łatwo sprawdzić wyżej w kodzie programu dla "prościutkiego modułu", ja przeznaczyłem D3 jako linię wyjściową do sterowania jednym z tranzystorów BC548 załączających przekaźnik. Sterowanie tranzystorem polega na podaniu sygnału wysokiego na jego bazę. Natomiast 'micronucleus' najprawdopodobniej linię D3 pełniącą rolę D- dla portu USB inicjalizuje jako INPUT_PULLUP - co skutkuje wystawieniem (mimo, że to linia INPUT) stanu wysokiego na zewnątrz układu. To z kolei powoduje "otwarcie" tranzystora i ZAŁĄCZENIE PRZEKAŹNIKA! Wszystko to dzieje się ZANIM sketch wejdzie w procedurę SETUP i poustawia parametry wejść/wyjść. Takie zachowanie powodowało "klikanie" przekaźnika przy każdym włączeniu zasilania modułu - a więc w tym przypadku przy każdym włączeniu zapłonu. Sytuacja była nie do zaakceptowania: przekaźnik przecież załącza duży prąd na szybę i takie "ciągłe" włączanie wyłączanie (mimo, że na milisekundę) spowodowało by wypalenie styków przekaźnika w bardzo krótkim czasie. Musiałem więc cały układ przeprojektować i przebudować, by tego uniknąć. Zamieniłem więc linię D0, która była dotychczas wejściem sygnału z przełącznika z linią D3 miejscami i "wszystko zrobiło się OK". Tak więc moja porada dla chcących używać mikrokontrolerów z nowych rodzin ATtiny z portem wirtualnym USB - zwracać szczególną uwagę na sposób użycia linii danych, na których zrealizowana jest linia D- portu USB. W ATtiny85 jest to D3, w ATtiny167 jest to D4. Należy unikać stosowania tych linii jako wyjściowych - w szczególności do sterowania tranzystorami. Przy inicjalizacji bootloadera układu (po włączeniu zasilania) może mieć to niespodziewane i nieprzewidziane konsekwencje.
__________________
------------------------------------------------------------------------------------------------ Nadal tu jestem - choć jeżdżę Mitsubishi Outlander PHEV 4x4 2019 224KM Ostatnio edytowane przez tedi_k ; 04-03-2022 o 09:47 |
04-03-2022, 14:48 | #7 | |
ford::advanced
Imię: Marcin
Zarejestrowany: 28-05-2010
Skąd: Jaworzno
Model: Fusion USA
Silnik: 2.0 eb
Rocznik: 2017
Postów: 250
|
Odp: ARDUINO - gdy w aucie Ci czegoś brakuje...
Cytat:
Super , podane na tacy w zasadzie , zostają tylko chęci i troszkę wiedzy , jak skończę wstawie foto z efektu finalnego , dziękuje |
|
04-03-2022, 21:05 | #8 |
FCP member
Imię: Tadeusz
Zarejestrowany: 04-11-2011
Skąd: Katowice
Model: Mitsubishi Outlander PHEV, C-max Energi (USA) PHEV
Silnik: 2.4 PB, 2.0 PB wolnossące cykl Atkinsona - hybryda plug-in
Rocznik: 2019, 2016
Postów: 16,987
|
Odp: ARDUINO - gdy w aucie Ci czegoś brakuje...
No to na koniec omawiania "prostego moduliku" jeszcze jedna ważna informacja - nie ma sensu umieszczać "diody gaszącej" dla zewnętrznego przekaźnika na samym module - jak to napisałem i pokazałem 3 posty wyżej.
"Dioda gasząca" MUSI być umieszczona pomiędzy 2 kontaktami sterującymi przekaźnika. Trzeba pamiętać, iż ma być spolaryzowana (w stosunku do napięcia na tych kontaktach sterujących) w kierunku zaporowym. Takie "na wszelki wypadek" umieszczenie diody gaszącej na module (przy równoczesnym jej braku na przekaźniku) powodowało nieprawidłową pracę modułu. Tak więc należy podłączenie przekaźnika wykonać "zgodnie ze sztuką"! Drugie "info finalne" to ostateczna postać kodu źródłowego programu sterującego dla "prościutkiego modułu": Kod:
// sketch napisany dla modułu ATtiny85 // ================================================== // Moduł sterujący włączaniem grzanej przedniej szyby // Bez kontroli warunków (temperatury) i bez uzależnienia czasu grzania szyby // od tych warunków. Sterowany jedynie zasilaniem samego modułu // oraz przyciskiem włączenia/wyłączenia grzania. // ================================================== // Moduł powinien być zasilany jedynie w stanie dopuszczającym włączenie HWS // - czyli z uruchomionym silnikiem. // Przekaźniki HWS1 i HWS2 od włączania grzania połówek szyby powinny być zasilane // po włączeniu zapłonu a sterowane masą z odpowiednio wyjścia HWS_OUT1 i HWS_OUT2 z modułu. // // (c) Tedi_k 2022 - użycie oraz modyfikacje dopuszczone // pod warunkiem wskazania autora // #define RDY_LED 1 // wewnętrzna (w module) kontrolka stanu READY/HWS ON (jak miga) #define HWS_OUT1 0 // grzana przednia szyba - tanzystor sterujący przekaźnikiem HWS1. #define HWS_OUT2 2 // tanzystor sterujący przekaźnikiem HWS2 #define HWS_IN 3 // włącznik grzania HWS - sterowanie masą #define _SW_time 500UL // force_ON wymaga trzymania przełącznika HWS wciśniętego przez 0,5 sekundy #define _ON_time 330000UL // grzeje przez 330 sekund (5,5 minuty) #define _BLNK_time 500UL // blink co 0,5 sekundy #define _HWS1_2_delay 5000UL // Odstęp 5 sekund pomiędzy włączeniem połówek HWS #define ON true #define OFF false #define REL_ON HIGH // sterowanie przekaźnikiem/tranzystorem z portu (wysokim) #define REL_OFF LOW #define LED_ON HIGH // dioda-kontrolka sterowana z portu (wysokim) #define LED_OFF LOW boolean wrk, WINDSHIELD_H_ON, prev_HWS_IN; boolean _blnk, wait_SW; uint32_t _t_ON, _t_BLNK, _t_CAN; // czas (millis()) włączenia trybu force_ON oraz sterowanie miganiem diody void setup() { WINDSHIELD_H_ON = wait_SW = false; _blnk = true; prev_HWS_IN = HIGH; pinMode(HWS_OUT1, OUTPUT); pinMode(HWS_OUT2, OUTPUT); pinMode(RDY_LED, OUTPUT); pinMode(HWS_IN, INPUT_PULLUP); digitalWrite(RDY_LED, LED_OFF); // Wyłączenie LED digitalWrite(HWS_OUT1, REL_OFF); // Wyłączenie sygnałów HWS1 digitalWrite(HWS_OUT2, REL_OFF); // i HWS2 while (!digitalRead(HWS_IN)); // Przy włączaniu zapłonu przycisk HWS musi być zwolniony (stan niski) delay(_SW_time); while (!digitalRead(HWS_IN)); // test zwolnionego przycisku przez 0,5 sek. _t_BLNK = _t_ON = millis(); } void loop() { HWS(WINDSHIELD_H_ON); if (!WINDSHIELD_H_ON) digitalWrite(RDY_LED, LED_ON); else led_BLNK(); // Przy włączonej HWS kontrolka led miga wrk = digitalRead(HWS_IN); if(wrk == LOW && wrk != prev_HWS_IN) { // Klawisz HWS właśnie został naciśnięty _t_ON = millis(); prev_HWS_IN = LOW; return; } if(wrk == LOW && wrk == prev_HWS_IN && wait_SW) return; // Czekamy na puszczenie klawisza HWS; if(wrk == LOW && wrk == prev_HWS_IN) { if ((uint32_t) (millis() - _t_ON) > _SW_time) return; // Oczekiwanie na zadany czas utrzymania klawisza wciśniętym else { // Klawisz wciśnięty odpowiednio długo if (!wait_SW) // Jeśli jeszcze nie jest obsłużony WINDSHIELD_H_ON = !WINDSHIELD_H_ON; // to włączenie lub wyłączenie HWS w zależności od jej aktualnego stanu wait_SW = true; // Klawisz już obsłużony, oczekwanie na jego puszczenie return; } } if (wrk == HIGH) { // Klawisz puszczony, zezwolenie na ponowną obsługę wciśnięcia klawisza prev_HWS_IN = HIGH; wait_SW = false; return; } } void led_BLNK() { if ((uint32_t) (millis() - _t_BLNK) > _BLNK_time) { _t_BLNK = millis(); _blnk = !_blnk; } digitalWrite(RDY_LED, _blnk); } void HWS(bool on_off) { if (on_off) { if (!WINDSHIELD_H_ON) _t_ON = millis(); digitalWrite(HWS_OUT1, REL_ON); // Przekaźnik HWS1 pierwszej połowy WINDSHIELD_H_ON = ON; if ((uint32_t) (millis() - _t_ON) > _HWS1_2_delay) digitalWrite(HWS_OUT2, REL_ON); // Przekaźnik HWS2 drugiej połowy if ((uint32_t) (millis() - _t_ON) > _ON_time) WINDSHIELD_H_ON = OFF; } else { digitalWrite(HWS_OUT1, REL_OFF); // Wyłączenie przekaźnika HWS1 pierwszej połowy digitalWrite(HWS_OUT2, REL_OFF); // Wyłączenie przekaźnika HWS2 drugiej połowy WINDSHIELD_H_ON = OFF; } }
__________________
------------------------------------------------------------------------------------------------ Nadal tu jestem - choć jeżdżę Mitsubishi Outlander PHEV 4x4 2019 224KM |
04-03-2022, 21:46 | #9 |
ford::advanced
Imię: Piotr
Zarejestrowany: 04-01-2019
Skąd: Wrocław
Model: Focus MK4
Silnik: 150km EcoBoost
Rocznik: 2018
Postów: 408
|
Odp: ARDUINO - gdy w aucie Ci czegoś brakuje...
Jak już skończycie bawić się w przedszkole, to proponuję spróbować projektować płytki drukowane bo patrząc na takie "szkaradziejstwa" jak tu przedstawione to aż dreszcze przechodzą. Ja wiem, odkrycie nowego świata to ekscytacja ale to jak mechanik vs właściciel próbujący wymienić klocki pierwszy raz w życiu, bez narzędzi.
1) Płytki zamawia się np. w PCBway, $5 za 10 sztuk+ok $25 transport + ok 70zł cła/podatki. Przy kilku projektach PCB wychodzi za grosze. 2) Programy do darmowego projektowania amatorskiego są darmo, co pewnie wiecie. 3) Ta zaproponowana przetwornica to ultra szajs. To są takie potworki z których odpadają elementy, te wszystkie płytki mogą nie przetrwać mrozu. Może wiecie może nie, lutowanie bezołowiowe co ma przetrwać mróz to kosztowna sprawa. A te wszystkie arduina i magiczne moduliki itd. to są zlutowane najpodlej w świecie. Bałbym się to do auta wkładać właśnie ze względu na mróz. Rok dwa i elementy zbiera się paznokciem. Samemu jak się lutuje "ołowiem" to jest nie do za... Elementy też mają zakres od -40C albo od 0. Wszystko co tanie jest podłe, nikt tam nie wsadza tych -40C!!! 3) Micros - tanie ale mały wybór. TME drożej ale jak coś sprzedają to jest takie jak piszą. Taka przetwornica już ujdzie: [Tylko zarejestrowani użytkownicy widzą linki. ] Powodzenia na nowej drodze.
__________________
§23§23§23§23§23§23§23§23§23§23§23§23§23§23§23§23§2 3§23§23§23§23§23§23§23§23§23§23§23§23§23§23§23§23§ 23§23§23§23§23§23§23§23§23§23§23§23§23§23§23§23§23 §23§23§23§23§23§23§23§23§2 Ostatnio edytowane przez michałek ; 04-03-2022 o 22:01 |
04-03-2022, 23:23 | #10 | |
FCP member
Imię: Tadeusz
Zarejestrowany: 04-11-2011
Skąd: Katowice
Model: Mitsubishi Outlander PHEV, C-max Energi (USA) PHEV
Silnik: 2.4 PB, 2.0 PB wolnossące cykl Atkinsona - hybryda plug-in
Rocznik: 2019, 2016
Postów: 16,987
|
Odp: ARDUINO - gdy w aucie Ci czegoś brakuje...
Cytat:
Nikt nikomu nie broni pokazać "co potrafi".Goście nie mogą oglądać obrazków w postach. Zarejestruj się klikając tutaj aby uzyskać pełen dostęp do forum. Poczekamy-zobaczymu co za profesjonalne rozwiązania Kolega zaprezentuje. Tylko prosimy "ze szczegółami" (np. z kodem źródłowym...) - bo to raczej o tym jest ten wątek... Co do meritum - jaki jest sens produkować płytki dla 2-3 sztuk takich modułów? Wyjaśni to Kolega - w przystępnych słowach - reszcie zainteresowanych? Bo ja - całkowicie zresztą programowo - najmniejszego sensu nie widzę dla tego typu prac zabierać się za "wyciąganie armaty z powodu tej muchy". Wtedy, gdy to miało sens (produkowanych było kilkadziesiąt modułów ASSoff) - płytki i owszem były wyprodukowane. Dla pojedynczego egzemplarza czy 2 sztuk - Kolega może sobie płytki produkować, a ja nadal pozostanę przy swoich uniwersalnych... Co do jakości użytych elementów - można sobie dobierać dowolnie perfekcyjne. Nikt nikomu nie broni. Od ponad 3 lat jeżdżą w autach takie moduły tylnego światła przeciwmgielnego dla Escape i parę jeszcze podobnych "drobniutkich wynalazków" i jakoś nic się paznokciem nie zdrapało i nasze mrozy nic nie "odmroziły"...Goście nie mogą oglądać obrazków w postach. Zarejestruj się klikając tutaj aby uzyskać pełen dostęp do forum. Wpis więc bardzo pouczający - czekamy na kontynuację "jak to robi profesjonalista"!Goście nie mogą oglądać obrazków w postach. Zarejestruj się klikając tutaj aby uzyskać pełen dostęp do forum. Do dzieła!
__________________
------------------------------------------------------------------------------------------------ Nadal tu jestem - choć jeżdżę Mitsubishi Outlander PHEV 4x4 2019 224KM |
|
Narzędzia wątku | Przeszukaj ten temat |
|
|