Skocz do zawartości

kris2k

Użytkownicy
  • Zawartość

    51
  • Rejestracja

  • Ostatnio

Reputacja

1 Neutralna

O kris2k

  • Ranga
    4/10

Informacje

  • Płeć
    Mężczyzna
  • Lokalizacja
    TG
  • Zainteresowania
    podstawy elektroniki
  • Zawód
    CAD Design
  1. 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ę?
  2. 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
  3. 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
  4. Reasumujac... Z pinu VCC (+5V) mozna pobrac max. 200mili Amper... ale z pinow wejsciowych/wyjsciowych juz tylko max. 20mili Amper?
  5. 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 ?
  6. Panowie, mam szybkie pytanie. Zrobiłem użytek z jednej z Waszych podpowiedzi, czyli rozpoznawania stanu wciśniętego guzika. https://www.arduino.cc/en/Tutorial/StateChangeDetection Moje pytanie brzmi: Czy wyjsciami 5V i GND mogę obsłóżyć (zasilić) kilka takich obwodów(gałęzi) ? Każdy obwód oczywiści będzie sprawdzany innym pinem cyfrowym, tylko masa i 5V będą wspólne dla wszystkich.
  7. W miedzy czasie przeprosiłem się z biblioteką Timers.h i uzyskałem to co chciałem dzięki niej ;) ale Twoje rady też już wdrożyłem i nawet przerobiłem kod na działający przykład z przyciskiem. W końcu to sobie wytłumaczyłem po swojemu (o co chodzi ze stanem i jego zmianą) i zaskoczyło... SUPER, bardzo dziękuję za pomoc i cierpliwość!!! bool coRobimy = false; unsigned long czasStartu = 0; int X = 0; int CZAS_MIGNIECIA = 500; void setup() { pinMode(6, INPUT_PULLUP); //Przycisk jako wejście Serial.begin(115200); } void loop() { if ( digitalRead(6) == LOW && coRobimy == false ) //jak mamy sygnał LOW i stan False, to odpalamy warunek i zmieniamy stan { coRobimy = true; //zmiana stanu czasStartu = millis(); //czas sie zapamieta przy zmianie stanu } uint32_t czasWykonania = millis() - czasStartu; if (coRobimy == true && czasWykonania <= 2000) //mrugamy { X = ( ( czasWykonania % CZAS_MIGNIECIA) < (CZAS_MIGNIECIA / 2) ); } if (coRobimy == true && czasWykonania > 2000){ coRobimy = false; //po uplywie 2sek, zmieniam stan i powyzszy if przestaje sie spelniac, przestajemy mrugac } }
  8. ethanak, bardzo fajnie mi rozpisałeś metodologię i jestem za to bardzo wdzięczny, co do zasady, zrozumiałem :) Zatarłem rączki i zacząłem to przepisywać w program który mógłby coś robić, więc wstawiam mój ćwiczeniowy kod, wraz z pytaniem dot. jego działania (bo jakże inaczej, nie działa :P ) Domyślam się że coś jest nie tak jak powinno ze zmienną czasWykonania, sposób jej wyliczenia w tym kodzie zawsze daje zero, więc całość nie generuje cyklicznych zmian 1/0. const int ledPin = LED_BUILTIN;// the number of the LED pin unsigned long previousMillis = 0; // will store last time LED was updated const long interval = 500; // interval at which to blink (milliseconds) bool coRobimy = false; unsigned long czasStartu = 0; int X = 0; int CZAS_MIGNIECIA = 500; void setup() { // set the digital pin as output: pinMode(ledPin, OUTPUT); pinMode(6, INPUT_PULLUP); //Przycisk jako wejście Serial.begin(115200); } void loop() { if ( millis() > 2000 && millis() < 4000) //jak mamy spełniony warunek to coś robimy { coRobimy = true; czasStartu = millis(); }else // a jak nie, to nic nie robimy { coRobimy = false; czasStartu = 0; } // tutaj pierwszy krzak... co ma reprezentowac zmienna "czasWykonania" skoro ona cały czas daje ZERO ? // użycie jej w takiej postaci, sprawia że cały warunek z reszta z dzielenia i tak sie nie spełnia uint32_t czasWykonania = millis() - czasStartu; if (coRobimy == true) { //X = ( ( millis() % CZAS_MIGNIECIA) < (CZAS_MIGNIECIA / 2) ); // Na próbe wpisane samo millis() - Działa, są cykliczne zmiany 1/0 //X = ( ( millis() % (2* CZAS_MIGNIECIA) ) < CZAS_MIGNIECIA ); // Na próbe wpisane samo millis() - Działa, są cykliczne zmiany 1/0 X = ( ( czasWykonania % CZAS_MIGNIECIA) < (CZAS_MIGNIECIA / 2) ); //brak cyklicznych zmian 1/0 //X = ( ( czasWykonania % (2* CZAS_MIGNIECIA) ) < CZAS_MIGNIECIA ); //brak cyklicznych zmian 1/0 Serial.println(X); //printem podglądam czy wyrażenie daje dobre rezultaty } }
  9. A to też bardzo sprytny kawałek kodu, zapewne użyję prędzej czy później. Dzięki! (Cykl 6 razy po to żeby przekaźnik którym będę sterować pozostawić w pozycji otwartej -> przewody rozwarte -> kierunek zgaszony). Generalnie chodzi o to żeby zacząć od włączenia a zakończyć na wyłączeniu. Na ten moment muszę się skupić na wykonaniu sekwencji konkretną ilość razy po kliknięciu przycisku. Co do zasady, kod slon'a (przerobiony z mrugania LED'em) działa bardzo dobrze, nawet mogę zmusić go do wykonania się konkretną ilość razy... ale działa to tylko po zainicjowaniu pracy Arduino. Nie potrafię tego przerobić na inicjację przyciskiem. Zmienna aktualnyCzas przybiera duże wartości, bo millis() rośnie szybko w czasie i wtedy ten kod już mi nie działa ;/ Przy inicjalizacji Arduino owszem, ale z klikaniem guzikiem już nie. const int ledPin = LED_BUILTIN;// the number of the LED pin // Variables will change : int ledState = LOW; // ledState used to set the LED unsigned long previousMillis = 0; // will store last time LED was updated const long interval = 500; // interval at which to blink (milliseconds) void setup() { // set the digital pin as output: pinMode(ledPin, OUTPUT); pinMode(6, INPUT_PULLUP); //Przycisk jako wejście Serial.begin(115200); } void loop() { unsigned long currentMillis = millis(); //warunek spelnia sie tylko co 500ms i jego zawartosc updejtuje sie tez tylko co 500ms if (currentMillis - previousMillis >= interval){ //Serial.println(previousMillis); previousMillis = currentMillis; // rosnie w nieskonczonosc co interwal 500ms // if the LED is off turn it on and vice-versa: if (ledState == LOW) { ledState = HIGH; } else { ledState = LOW; } if ( previousMillis <= 3001UL ) // ogranicznie wydruku w czasie { previousMillis = currentMillis; // set the LED with the ledState of the variable: //digitalWrite(ledPin, ledState); Serial.println(ledState); // wydrukuje się tylko 6razy, pierwszy krok to 1 / HIGH, ostatni krok to 0 / LOW } } }
  10. Informacyjnie dla niedowiarków Wasze podpowiedzi bardzo mocno przyczyniają się do rozbudowy mojego projektu i jak najbardziej z nich korzystam, tutaj z akcelerometrem ADXL345. Czyli aktywacja awaryjnych przy gwałtownym hamowaniu. Przykład na filmiku poniżej: Zastosowałem kod ethank'a a później przerobiłem go na kod slon'a. Dzięki temu nie wysyłam tony niepotrzebnych zdublowanych komunikatów do linii CAN, a tylko co 250ms zmieniam komunikat: int sekwencjaCzynnosciACC() { byte A = 0x00; if (aktualnyCzas - previousMillis >= interval) // ten IF spelnia sie raz co 250ms { previousMillis = aktualnyCzas; // if the LED is off turn it on and vice-versa: if (ACCmiga == false) { ACCmiga = true; A = 0x60; } else { ACCmiga = false; A = 0x00; } CanSend(0x02214000, 0x00, 0x00, A, 0x00, 0x00, 0x00); //ramka CAN która odpala kierunki na odcietej głowie :P //Serial.println(A, HEX); wydruk dla sprawdzenia stanu } } Tak więc naprawdę Wam dziękuje za wszelkie podpowiedzi !!! Natomiast jak sobie nie radzę z adaptacją Waszych podpowiedzi na moje potrzeby, to nie miejcie mi tego za złe, cały czas się staram!
  11. Idąc tropem Slon'a, póki co, wywaliłem funkcje i wpisuje kod od razu w głównym IF'ie (jak opanuje sytuacje to potem wrzucę to do funkcji). Wszystko działa poza tym, że mam problem z poprawnym zdefiniowanym ostatniego warunku który ma drukować zmiany tylko przez 3sek. (przy interwale 0,5sek mamy 6cykli). Zmienną ledState zmieniłem na bool, wartościami 0x60 i 0x50 się nie przejmujcie, to jest ćwiczenie komend do wysyłania danych na linie CAN. if (digitalRead(6) == LOW ) { //Jeśli przycisk wciśnięty click1 = true; //startuje zliczanie czasu klikniecia } else { zapamietanyCzas = aktualnyCzas; // zapamietuje kiedy zjawisko ustało, tutaj, przycisk zostal puszczony, ewentualnie nigdy nie klikniety click1 = false; //stopuje zliczanie czasu klikniecia } if (click1 == true) { dlugoscKliku = aktualnyCzas - zapamietanyCzas; //zapamietuje roznice w czasie trwania stanu LOW, czyli pokazuje czas przez jaki guzik byl wcisniety } if (dlugoscKliku > 1 && dlugoscKliku < 1000 && click1 == false) //dlugoscKliku musi byc mierzona od 1 bo przy 0 po odpaleniu programu warunek jest od razu spelniony { unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) // ten IF spelnia sie raz co 500ms, interval = 500; { previousMillis = currentMillis; // podpinam swoją zmienna pod zmiany true/false if (ledState == false) { ledState = true; B = 0x60; } else { ledState = false; B = 0x50; } if ( WARUNEK <= 3000 ) // <<--- TU TKWI PROBLEM { // set the LED with the ledState of the variable: //digitalWrite(ledPin, ledState); Serial.println(B, HEX); // <<--- bo ma się wykonywać tylko przez pierwsze 3sek } } } Belferek, przepraszam że nie skomentowałem Twojego kodu wcześniej, po prostu jest napisany takim stylem że nie mam pojęcia co tam się w nim dzieje, o próbie adaptacji na swoje potrzeby nie wspominając Wolę pomęczyć się z bezpośrednio z millis() i dobrze je zrozumieć niż brnąc dalej i dalej nie rozumując podstaw.
  12. Jeżeli moja logika myślowa jest poprawna to właśnie uświadomiłem sobie gdzie leży mój problem. No to opowiadam: if (digitalRead(6) == LOW ) { //Jeśli przycisk wciśnięty click1 = true; //startuje zliczanie czasu klikniecia } else { zapamietanyCzas = aktualnyCzas; // zapamietuje kiedy zjawisko ustało, tutaj, przycisk zostal puszczony, ewentualnie nigdy nie klikniety click1 = false; //stopuje zliczanie czasu klikniecia } if (click1 == true) { dlugoscKliku = aktualnyCzas - zapamietanyCzas; //zapamietuje roznice w czasie trwania stanu LOW, czyli pokazuje czas przez jaki guzik byl wcisniety } if (dlugoscKliku > 1 && dlugoscKliku < 1000 && click1 == false) //dlugoscKliku musi byc mierzona od 1 bo przy 0 po odpaleniu programu warunek jest od razu spelniony { sekwencjaCzynnosci(); //<<------------ TA FUNKCJA WYWOŁA SIE TYLKO RAZ PO PUSZCZENIU PRZYCISKU } Przy takim kodzie jak w/w, a kod takowy jest mi niestety potrzebny (bo to dzięki niemu moja sekwencja się wykona tylko raz i tylko gdy przycisk jest wciśnięty od 1ms do 1000ms) nie mogę wewnątrz tej funkcji używać kodu który w sposób ogólny odwołuje się do jakichkolwiek zmiennych bazujących na millis(). Dlaczego? Bo żeby millis() działało to program naturalnym biegiem musi te funkcje mielić, nadpisywać itd.... a jak mam taki kod wrzucony wewnątrz funkcji która wykonuje się tylko RAZ, no więc raz się przemieli i na tym koniec, program nie działa. Poprawcie mnie proszę jeżeli się mylę! Tym samym rodzi się pytanie, jak dobrze napisać moją sekwencjeCzynnosci(), inaczej niż delay'ami? (choć tak jak poniżej też działa!) void sekwencjaCzynnosci() { Serial.println("1 - krok 1"); delay(250); Serial.println("0 - krok 2"); delay(250); Serial.println("1 - krok 3"); delay(250); Serial.println("0 - krok 4"); delay(250); Serial.println(dlugoscKliku); // tylko informacyjnie wypluwam czas przez jaki przycisk byl klikniety dlugoscKliku = 0; //po wykonanej sekwencji ustawia ta zmienna na 0 i to sprawia że sekwencja już sie kolejny raz nie wykona } Mam wrażenie że zatoczyłem jakieś koło myślowe przez ostatnie dwa dni
  13. Zasada działania jest całkiem fajna, choć zupełnie nie mam pomysłu jak połączyć to z odliczaniem frazy: x = ( (( aktualnyCzas - zapamietanyCzas02) % CZAS_MIGNIECIA) < (CZAS_MIGNIECIA / 2) );
  14. Good point! Biorąc pod uwagę fakt, że w aucie nie mam przycisku tylko będę śledził stan napięcia na 2 przewodach to będzie to działać z użyciem w/w techniki sprawdzania zmiany stanu?
  15. No właśnie nie mieliśmy jeszcze możliwości przedyskutowania tego przykładu bo wdałem się w rozmowę z Belferkiem. Niestety ten kod tak nie działa, kawałek praktycznego kodu poniżej: void loop() { aktualnyCzas = millis(); int CZAS_MIGNIECIA = 1000; if (digitalRead(6) == LOW ){ long x = 0; x = ( (( aktualnyCzas - zapamietanyCzas02) % CZAS_MIGNIECIA) < (CZAS_MIGNIECIA / 2) ); Serial.println(x); delay(100); } else { zapamietanyCzas02 = aktualnyCzas; } } Masz racje, zawsze zaczyna się od 1... ale wydruk w monitorze portu szeregowego trwa w nieskończoność... a raczej tak długo jak trzymam przycisk. A ja bym chciał żeby zrobił się dwa/trzy/cztery razy i na tym koniec, bez względu na to czy trzymam przycisk dalej, czy nie.
×
×
  • Utwórz nowe...