Skocz do zawartości
kris2k

Arduino i CanShield - programowe usprawnienia auta

Pomocna odpowiedź

Dnia 13.07.2019 o 11:31, kris2k napisał:

Czy wyjsciami 5V i GND mogę obsłóżyć (zasilić) kilka takich obwodów(gałęzi) ?

Tak, bez problemu. Warunek jest taki, aby nie przekroczyć maksymalnego prądu, który można pobrać z pinu VCC (5V). W przypadku Arduino UNO jest to około 200 mA.

Udostępnij ten post


Link to post
Share on other sites
10 godzin temu, Treker napisał:

Tak, bez problemu. Warunek jest taki, aby nie przekroczyć maksymalnego prądu, który można pobrać z pinu VCC (5V). W przypadku Arduino UNO jest to około 200 mA.

Czyli w praktyce, akurat takich obwodów jak poniżej mogę dopiąć bardzo dużo (tyle ile mam wejsc, czyli 13cyfrowych+5analogow), a limitem będzie to, aby opornik nie był mniejszy niż 0,025 Ohm? (Liczone wprost z prawa Ohma I=U/R -> R=U/I gdzie zmienne: 5V i 200mA) ?

Czy raczej akurat konkretnie w tym wypadku nie ma to absolutnie żadnego znaczenia bo prąd pomiędzy pinem 5V i GND tak czy siak nie popłynie większy niż 200mA bo tyle może dać płytka i koniec a ja de facto w tym układzie nie podpinam żadnych odbiorników prądu a jedynie odczytuje stan zwarty/rozwarty ?

button_sch.png

Udostępnij ten post


Link to post
Share on other sites
41 minut temu, kris2k napisał:

aby opornik nie był mniejszy niż 0,025 Ohm? (Liczone wprost z prawa Ohma I=U/R -> R=U/I gdzie zmienne: 5V i 200mA) ?

Przy takim oporniku dawno spaliłbyś wyjście Arduino, z którego nie powinno pobierać się więcej niż 15-20 mA. Jeśli będziesz wsadzał tam standardowe rezystory (jak na pull-upy) to możesz spokojnie dopiąć ich tyle ile potrzebujesz 🙂

Udostępnij ten post


Link to post
Share on other sites

Reasumujac... Z pinu VCC (+5V) mozna pobrac max. 200mili Amper... ale z pinow wejsciowych/wyjsciowych juz tylko max. 20mili Amper?

Udostępnij ten post


Link to post
Share on other sites

Mniej więcej tak (mniej więcej, bo dokładne wartości mogą być trochę inne) 🙂 W uproszczeniu: pin Vcc to po prostu odnoga stabilizatora 5V, który jest na płytce. Jego obciążenie nie uszkodzi I/O mikrokontrolera, bo prąd ten nie płynie przez mikrokontroler (tylko jest pobierany prosto ze stabilizatora).

Udostępnij ten post


Link to post
Share on other sites

Super, dziękuje za wskazówki!

Projekt się rozwija i powoli zaczynam używać wielu różnych wejśc/wyjść jak i samych pinów GND i 5V (używam płytki Arduino Mega) i zaczynam się zastanawiać jak dużo rzeczy mogę tam nawpychać 😉

Robię to trochę na czuja, ale teraz bardziej świadomie postaram się nie przekraczać tych 20mA jak i 200mA.

Do 5V/GND mam podpiętych w sumie 24diody programowalne RGB (mały prąd pobierają bo nie świecą na 100% jasności), reszta wyjść/wejść służy do odczytu zapiętych klamer od pasów bezpieczeństwa, jest też jedno wyjście sterujące przekaźnikiem od świateł awaryjnych, jest też akcelerometr ale zasilany z 3,3V.

Raczej żadna poważna elektronika to to nie jest, a już na pewno nie prądożerna 😉

Udostępnij ten post


Link to post
Share on other sites
7 godzin temu, kris2k napisał:

do odczytu zapiętych klamer od pasów bezpieczeństwa

[...]

7 godzin temu, kris2k napisał:

Raczej żadna poważna elektronika to to nie jest

Lepiej byłoby, aby systemy z pasami bezpieczeństwa były robione na poważnie 😉 Ale domyślam się, że nie projektujesz nowego samolotu tylko jest to mniej krytyczny układ. Powodzenia!

Udostępnij ten post


Link to post
Share on other sites
1 godzinę temu, Treker napisał:

[...]

Lepiej byłoby, aby systemy z pasami bezpieczeństwa były robione na poważnie 😉 Ale domyślam się, że nie projektujesz nowego samolotu tylko jest to mniej krytyczny układ. Powodzenia!

Absolutnie tak, wszystko odbywa się bez ingerencji w instalację elektryczna auta. Pasy mają dodatkowe małe czujki kontaktronowe 🙂

Fizyczne gmeranie przy pasach które mają powiązanie z AirBag'ami nie byłoby mądre 😉

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Panowie, pytanie pokrewne z zakresu Arduino i jego obecności w aucie.

Czy każdorazowo przy podpinaniu laptopa i wgrywaniu nowego programu do Arduino trzeba odcinać zasilanie płytki?

Czy pomimo faktu ze płytka jest zasilona gniazdem DC (poprzez mala przetwornice step-down 12V->9V) mogę jednocześnie podpiąć kabelek USB?

Na ten moment zawsze zasilanie odpinam, ale czy muszę?

 

 

Edytowano przez kris2k

Udostępnij ten post


Link to post
Share on other sites
Dnia 16.08.2019 o 10:31, kris2k napisał:

Czy każdorazowo przy podpinaniu laptopa i wgrywaniu nowego programu do Arduino trzeba odcinać zasilanie płytki?

Nie ma takiej potrzeby 🙂 Podłączając przewód USB łączysz masę zasilania układu z masą komputera, więc wszystko będzie działać poprawnie.

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Im dalej w las, tym drzew więcej... pojawiła się pewna niedogodność związana z freezowaniem programu.

Funkcja TripLinka jak i ABL (czyli mruganie awaryjnymi przy gwałtownym hamowaniu) są zaimplementowane bez żadnych delayów, wszystko na millis() lub z biblioteki timers.h

Ponieważ w swoim projekcie poszedłem jeszcze dalej, i stworzyłem mini tryb diagnostyczny auta, gdzie dane z samochodu wyświetlam on-line na wyświetlaczu LCD na zegarach (mam tam pozycje przepustnicy, doładowanie i akcelerometr) rodzi to czasami problemy.

Otóż, aby wyświetlić dane na LCD, trzeba wysłać siecią CAN, odpowiednią paczkę ramek, najczęściej 5 ramek w odstępie co 5ms i właśnie to powoduje problemy.

Wstawiam moje kody:

void showACC() {
  if (accVal >= 10 && accVal < 11) {
    CanSend(0xA394021,  0x40,  0x2,   0x4B,  0x97,  0x90,  0x65,  0xE6,  0x9D);
    CanSend(0xA394021,  0x41,  0x2,   0xEB,  0xFE,  0x02,  0x04,  0xB0,  0x58);
    CanSend(0xA394021,  0x42,  0x2,   0xED,  0xE0,  0xFF,  0xEB,  0xCF,  0x3C);
    CanSend(0xA394021,  0x43,  0x2,   0xF3,  0xCF,  0x3C,  0xF3,  0xCF,  0x00);
    CanSend(0xA394021,  0x44,  0x2,   0x03,  0xAF,  0x00,  0x00,  0x00,  0x00);
  }
}

void CanSend(unsigned long address, byte a, byte b, byte c, byte d, byte e, byte f, byte g, byte h) {
  unsigned char DataToSend[8] = {a, b, c, d, e, f, g, h};
  CANslow.sendMsgBuf(address, 1, 8, DataToSend);
  //Serial.println("8bit msg send");
  delay(5);
}

 

To wszystko ładnie działa... ale ten nieszczęsny delay(5); wewnątrz funkcji wysyłającej dane do sieci CAN jednak jest i jednak bruździ.

Potrzebuje podpowiedzi jak zgrabnie przerobić tą funkcję aby kolejne ramki z funkcji showACC() wysyłały sie samoczynnie co 5ms a nie tak jak teraz, samoczynnie ale interwał dyktuje delay zaszyty wewnatrz CanSend.

Inna sprawa że nie mogę zrezygnować z opóźnienia bo linia CAN musi ramki dostawać co określony czas, inaczej się zapcha albo zegary nie zdążą zinterpretować tych ramek.

Aha... gdzie te problemy... ano wysłanie paczki ramek blokuje układ na 30ms, a jeżeli w tym czasie chce użyć TripLinka... to umyka mi odczyt zmiany stanu bitu który za to odpowiada i całość procedurki się nie wykonuje. Oczywiście trzeba mieć "farta" żeby te 30ms trafiło w tym czasie ale życie pokazuje że zdarza się to dość często ;/

ADV-modes.jpg

Edytowano przez kris2k
Uzupełnienie opisu.

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Trochę pogrzebałem przy tym kodzie i przy pomocy pięciu timerów wysyłam poszczególne ramki z każdej grupy pięciu ramek.

Nie jest to jakieś zaawansowane rozwiązanie, ale działa 🙂

A dla bardziej ciekawskich, wstawiam filmik z auta:

 

Edytowano przez kris2k
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...