Skocz do zawartości
Gal_kris

Program do oświetlenia pojazdu z kontrolą kierunku

Pomocna odpowiedź

Napisano (edytowany)

Witam serdecznie po tak długim czasie, mimo że  nie loguję się na forum to muszę przyznać cze co najmniej raz dziennie czytam je od deski do deski.

Bardzo dziękuję wszystkim aktywnym na forum, wiele się można od Was dowiedzieć.

Forumowicze jestem tu ponieważ mimo przeglądnięcia wielu tematów nie potrafię dopasować nic do swojego projektu a że mam dysleksję nauka idzie mi powoli.

co takiego ma na stole?  kontroler jazdy dcc, atmegę88, 9 diod, 4 wyjścia sterowane z kontrolera jazdy.

problem dotyczy dwóch warunków If do tego samego pinu 

int led4 = 10;
int led7 = 12;
int led5 = 11;
int led = 9;
int jas = 255;  
int moc = 0; 
#define pin A5
#define pin9 A4
#define pin2 1
void setup() {
  pinMode(led4, OUTPUT);
  pinMode(led7, OUTPUT);
  pinMode(led5, OUTPUT);
  pinMode(led, OUTPUT);
  pinMode(pin, INPUT);
  pinMode(pin9, INPUT);
  pinMode(pin2, INPUT);

}

void loop() {
digitalWrite(pin, HIGH);
digitalWrite(pin2, HIGH);
digitalWrite(pin9, HIGH);

   if (digitalRead(pin) == LOW){
  jas = 255;
   }else{
    jas = 0;
   }
    analogWrite(led, jas);
            jas = jas + moc;
   if (jas <= 0 || jas >= 255){ 
    moc = -moc;
   }
    analogWrite(led5, jas);
            jas = jas + moc;
  if (jas <= 0 || jas >= 255) {
    moc = -moc;
  }
    analogWrite(led4, jas);
        jas = jas + moc;
  if (jas <= 0 || jas >= 255) {
    moc = -moc;
  }
  
    
  if ((digitalRead(pin) == LOW) && (digitalRead(pin2) == LOW)){
    digitalWrite(led7, HIGH);
    analogWrite(led4, jas);
  jas = 0;
    analogWrite(led4, jas);
       jas = jas + moc;
  if (jas <= 0 || jas >= 255) {
    moc = -moc;
  } 
}else{
    jas = 255;
   digitalWrite(led7, LOW);
  }
}

wytłumaczę o co tu biega

pin to ogólne zasilanie nie mam na nie wpływu, by mieć zasilanie pin musi być LOW i wtedy zapalam diody led, led5, led4, teraz aktywuję pin2 również stanem niskim i gaszę led4 a zapalam led7 gdy zwolnię pin2 led7 off led4 on pełna jasność

tyle w teorii bo nie dochodzi do zupełnego wygaszenia led4

myślę że teraz lepiej wytłumaczyłem

Proszę o sugestię jak sobie z tym poradzić, czasami zaskakuje po czasie 

Gal

Edytowano przez Gal_kris

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
52 minuty temu, Gal_kris napisał:

if ((digitalRead(pin) == LOW) and (digitalRead(pin2) == LOW))

Ten warunek jest zły - zobacz

Potrzebujesz logicznego iloczynu (nie binarnego - a i tu używamy & a nie and) więc taki zapis będzie prawidłowy:

if ((digitalRead(pin) == LOW) && (digitalRead(pin2) == LOW)) .........

Edytowano przez Belferek

Udostępnij ten post


Link to post
Share on other sites

Witaj tak też już sprawdzałem, jednej rzeczy nie napisałem PIN jest stale HIGH i tak musi być dlatego moje pytanie bo są dwa warunki sprzeczne najpierw stan wysoki a w drugim if jest stan niski z tym że go nie zamienia

Udostępnij ten post


Link to post
Share on other sites
15 godzin temu, Gal_kris napisał:

PIN jest stale HIGH i tak musi być dlatego moje pytanie bo są dwa warunki sprzeczne

To przecież Twój program więc tylko Ty wiesz dlaczego takie bzdury tworzysz. Napisz ten programik od podstaw samemu, tak jak ma działać, a wtedy wszystko będzie jak należy. Ty przepisujesz jakieś szkice, nie wnikasz w szczegóły, wklejasz niekompletny kod ... Tak się nie da zacznij od początku samemu.

Udostępnij ten post


Link to post
Share on other sites

Poprawiłem program, połączyłem oba kody, stary kod usunołem

Udostępnij ten post


Link to post
Share on other sites

problem nadal nie rozwiązany

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Może, gdybyś zamieścił schemat swojego układu, łatwiej byłoby zrozumieć, co usiłujesz osiągnąć? Może wtedy szybciej uzyskałbyś pomoc? Czy słyszałeś coś o komentarzach w kodach źródłowych? 😉

Inne uwagi:

  1. Fatalne formatowanie kodu!
  2. moc jest z Tobą? ale gdy wynosi zero to dużo Ci nie pomoże. Wszystko byle nie zero jeden czy nawet minus jeden będzie dużo lepiej, czyż nie?
  3. loop {} "biegnie" szybko i jak się mało dzieje, może być za szybko? Może warto dodać jakiś mały delay(..), a najlepiej poczytaj o millis().
  4. Czytanie stanu włącznika bez debounce i bez usuwania zakłóceń  i w nadmiarze, gdy szybka pętla loop{} nie zawsze jest dobre.
  5. digitalWrite(pin....{2, 9}, HIGH); te trzy instrukcje, możesz spokojnie wstawić do setup, a najlepiej, zastąpić dwie instrukcje jedną:
    pinMode(pin.., INPUT_PULLUP); w setupie.

  6. Jeżeli chcesz więcej [po]mocy, bez schematu będzie ciężko.

  7. No i pamiętaj, że do zadawania pytań, jest forum, a nie chat. Jeżeli się nie poprawisz, nie mam pojęcia co zrobię, może po prostu będę Cię ignorował.

 

PS

Jeżeli poprawiasz wcześniejszy kod, to nie rób tego przez edycję swojego pierwszego wpisu. Po prostu nowy, poprawiony umieszczaj jako kolejny nowy wpis.

Edytowano przez narbej

Udostępnij ten post


Link to post
Share on other sites
int led4 = 10; // dioda biała do wyłączenia gdy zapali się czerwona
int led7 = 12; // doda czerwona
int led5 = 11; // dioda biała zapala się gdy z zewnątrz przyjdzie sygnał z danego kierunku
int led = 9; // dioda biała zapala się gdy z zewnątrz przyjdzie sygnał z danego kierunku
int jas = 255;  //pwm do późniejszego wykożystania
int moc = 0; //pwm
#define pin A5 // z zewnętrzego źródła, jazda do przodu
#define pin1 A4 // z zewnętrzego źródła, jazda do tyłu
#define pin2 1 // zmieniam kolor jednej z diod zestawu oświetlenia
void setup() {
  pinMode(led4, OUTPUT);
  pinMode(led7, OUTPUT);
  pinMode(led5, OUTPUT);
  pinMode(led, OUTPUT); // diody jako wyjścia
  pinMode(pin, INPUT);
  pinMode(pin1, INPUT);
  pinMode(pin2, INPUT); // piny jako wejścia

}

void loop() {
digitalWrite(pin, HIGH); //mimo że na płytce oryginalnej te piny są przez rezystor podciągnięte do zasilania 5v ustawiam stan wysoki
digitalWrite(pin2, HIGH);// zewnętrze źródło w momęcie podania dygnału kierunku, bądź zmiany diody białej na diodę czerwoną daje nam stan niski
digitalWrite(pin1, HIGH);

   if (digitalRead(pin) == LOW){ //dlatego tu jest stan niski
  jas = 255;
   }else{
    jas = 0;
   }
    analogWrite(led, jas);
            jas = jas + moc;
   if (jas <= 0 || jas >= 255){ 
    moc = -moc;
   }
    analogWrite(led5, jas);
            jas = jas + moc;
  if (jas <= 0 || jas >= 255) {
    moc = -moc;
  }
    analogWrite(led4, jas);
        jas = jas + moc;
  if (jas <= 0 || jas >= 255) {
    moc = -moc;
  }
  
    
  if ((digitalRead(pin) == LOW) && (digitalRead(pin2) == LOW)){ // deklaracja aktywująca włączenie diody czerwonej w miejsce białej
    digitalWrite(led7, HIGH);
    analogWrite(led4, jas); // biała dioda nie gaśnie tylko się lekko przyciemnia taki wpis też nic nie daje analogWrite(led4, 0);
  jas = 0;                  // ani digitalWrite(led4, LOW);
    analogWrite(led4, jas);
       jas = jas + moc;
  if (jas <= 0 || jas >= 255) {
    moc = -moc;
  } 
}else{
    jas = 255;
   digitalWrite(led7, LOW);
  }
}

schemat narysuję w domu, ale myślę że wystarczy opis

Udostępnij ten post


Link to post
Share on other sites

int moc = 0;

moc = - moc;

jas = jas + moc;

Czy moc cały czas nie ==== zero?!

Jeżeli tak, to czyż jas ==== jas i nic się nie zmienia?

PS

Ok doczytałem, że to do późniejszego wykorzystania. Więc w takim razie, może najlepiej skróć kod, ten który tu pokazujesz i zostaw tylko to co wykorzystujesz aktualnie, aby nie obciążać usiłujących pomóc niepotrzebnymi analizami?

 

PS 2

zamiast:

int led7 = 12; // doda czerwona

nie lepiej:

int czerwona = 12;

lub

int ledRed = 12;

i anaLOGICZNIE [sorry capslock] do różnych innych użytych zmiennych? Wtedy komentarz byłby zbędny,  chyba, że opisuje dziaŁAnie:

int led4 = 10; // dioda biała do wyłączenia gdy zapali się czerwona

int ledWhite = 10; // off when red on 

Na razie, bez schematu albo opisu nie rozumiem, czy są 3 oddzielne białe diody, czy jedna biała podpięta do 3 pinów, a na początku wspominałeś nawet o 9? Więc na razie nie mam pojęcia o co chodzi, więc jak mam analizować twój program?

PS 3

A tak naprawdę, zanim zaczniesz bawić się podłączaniem diod do pinów i pisaniem programu, przemyśl wszystko, narysuj jakiś schemat blokowy i opisz co i jak. Jeżeli ma to być model samochodu, to może wystarczy podłączyć odpowiednie diody zabezpieczone opornikami bezpośrednio równolegle do silnika napędzającego i same będą się zapalały odpowiednio do podanego na silnik napięcia?

Kombinujesz jeszcze coś z PWM, więc może chcesz sterować jasnością? Ale jeżeli chcesz pomocy, to wszystko musisz dokładnie opisać i narysować, bo to że masz tam coś na stole nie wiele daje.

/// czy chodzi Ci o takie coś? 
loop {
     if ((digitalRead(pin) == LOW) && (digitalRead(pin2) == LOW)){
         digitalWrite(led7, 1);
         analogWrite(led4, 0);
     }
     else {
         digitalWrite(led7, 0);
         analogWrite(led4, 255);
     }
}

 

Udostępnij ten post


Link to post
Share on other sites

dziękuję za odpowiedź, i na szybko już odpowiadam to nie samochód tylko ciuchcia, na szybko sobie wyobraź jak wygląda oświetlenie lokomotywy górne światło i dwa dolne, prawe i lewe  wszystko ma kształt trójkonta z tym że dwie dolne są dwukolorowe biało czerwone.

PWM tak do przygaszenia diod,

problem w tym że dekoder DCC który steruje pracą silnika i wyjściami aux wymusza stan na wejściu atmela, dlatego pisałem że wejście jest podciągnięte przez rezystor do zasilania bo dekoder daje stan niski.

więc reasumując 5 diod na jedną stronę pojazdu trzy białe i dwie czerwone, jak sobie poradzę z tym wyłączeniem diody mimo dwóch stanów z dwóch funkcji pójdę dalej.

 

Gal 

jeżeli jesteś zainteresowany i chcesz zobaczyć jak wygląda dekoder i jak działa bo w zasadzie cały program już napisałem z tym że diody białe tylko przygasają to możemy się umówić na połączenie video gdzie pokażę dokładnie o co biega, i myślę że to najszybciej odda problem, bo by to dokładnie wyjaśnić muszę Ci podać schematy dekodera wytłumaczyć sterowanie i co robi program jest tego dużo. Pokazać będzie łatwo.

do dyspozycji Skype, facetime, viber

Gal

Udostępnij ten post


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

więc reasumując 5 diod na jedną stronę pojazdu

Pisząc stronę, masz na myśli przód i tył? Jeżeli mają się palić czerwone z tyłu a białe z przodu, a przy zmianie kierunku zmiana, to wystarczy Ci jedna funkcja z dwoma wartościami a nie dwie. Albo jedzie do przodu albo do tyłu. Gdy stoi światła mogą świecić do jazdy w przód? No i co z tym przygasaniem? Które i kiedy. Czy to ma jakiekolwiek znaczenie ile jest diod? Czy nie można połączyć je równolegle z przodu, trzy białe oraz  dwie czerwone i identycznie z tyłu?

 

1 godzinę temu, Gal_kris napisał:

jeżeli jesteś zainteresowany

 

Nie tak bardzo i nie używam nic z tych rzeczy [skype itd.....]

A dokładniej albo jedzie do przodu == 1 albo nie == 0. 

Udostępnij ten post


Link to post
Share on other sites

nie jak jedzie do przodu pin jak do tyłu pin1 sygnały na dwie różne nogi atmegi 

1 sygnał do przodu trzy białe po trójkącie do tyłu to samo 

2 sygnał do przodu trzy diody białe z przodu dwie czerwone z tyłu, do tyłu to samo

3 sygnał do przodu górna i lewa biała prawa czerwona , do tyłu to samo

4 sygnał do przodu górna i lewa biała prawa czerwona i dwie czerwone z tyłu, do tyłu to samo

5 sygnał niezależnie od kierunku tylko prawa dioda z przodu i tyłu

6 sygnał do przodu górna biała i dwie czerwone, to tyłu to samo

tyle tego na początek

Gal

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

image.thumb.png.0395b6ef08e475a33247ca0b0b6e88dc.png

Czy potrafisz sobie wyobrazić, co będzie się działo w powyższym schemacie, jeżeli ustawisz pin 8 jako wyjściowy i będziesz na zmianę podawał na niego raz HIGH, a po jakimś czasie LOW [1, 0].Czy potrafisz sobie wyobrazić, że jedna dioda jest koloru białego, a druga czerwonego? Czy możesz ewentualnie zastąpić lub wyobrazić sobie, diody jakimś elementem wykonawczym, np przekaźnikiem lub tranzystorem i wtedy podłączyć odpowiednio równolegle wszystkie białe diody z przodu + czerwone z tyłu, a do drugiego wszystkie czerwone z przodu + białe z tyłu?

   

PS

Pisałem w tej samej chwili, zanim wyedytowałeś i dodałeś. No i sobie na komplikowałeś.

 

Edytowano przez narbej

Udostępnij ten post


Link to post
Share on other sites

Owszem potrafię ale jednej rzeczy nie zrozumiałeś, a ja nie do końca dobrze opisałem

wciśnięcie na sterowniku jazdy klawisza F0 czyli pin A5 mojej atmegi, powoduje włączenie obsługi obu kierunków jazdy kierunki pokazują się wtedy tak Do przodu A5 LOW, A4 HIGH a do przodu A5 HIGH a A4 LOW i nie można zrobić na opak czyli np. nie aktywując F0(A5) mieć aktywnego A4. 

innymi słowy A5 to jakby włącznik włączasz i tak już jest do wszystkich sygnałów.

 

i tu moje pytanie z początku  pin A5 jest zwarty do masy czy można go podnieść na HIGH pomijając zwarcie na zewnątrz scalaka ?

Gal

 

 

no schemató to ja rysować nie umiem

schemat.png

pomijam rezystory które są oczywiste

 

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

 

1 godzinę temu, Gal_kris napisał:

i tu moje pytanie z początku  pin A5 jest zwarty do masy czy można go podnieść na HIGH pomijając zwarcie na zewnątrz scalaka ?

Może Ty wiesz o co pytasz, ja nie mam pojęcia czy Ty wiesz? Ale jak pytasz to pewnie nie masz pojęcia. Więc uściślij, co masz na myśli zwarty do masy? 

Jak jest zwarty do masy, to oczywiście, można i nie ma to najmniejszego znaczenia, bo jak jest zwarty to zawsze odczytasz jako low ale oczywiście możesz podnieść na HIGH.

 

Zaczynając ten wątek, napisałeś, że chodzi o pojazd i faktycznie lokomotywa, czy właściwie model lokomotywy to jakiś tam pojazd. Napisałeś, że masz a stole, a chodzi raczej chyba o makiete? Gdybyś od razu podał link np do: http://www.transportszynowy.pl/koloswietlpoc.php

oraz do http://forum.modelarstwo.info/threads/dcc-samoróbka-oparta-na-arduino.39867/ lub https://www.dcc24.eu/content/teoria-dcc czy też https://ep.com.pl/files/9782.pdf, byłoby przynajmniej wiadomo o co Ci chodzi.

Niestety nie jestem ani kolejarzem ani modelarzem makiet kolejowych, więc Ci nie pomogę.

Edytowano przez narbej

Udostępnij ten post


Link to post
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »

×