Diody LED czyli jak migac i świecić

wtorek, kwiecień 14, 2009 14:25 by netmaniac | Filled in arduino, dla początkujących, howto, projekty

Ostatnio zapadła cisza na StarterKicie, bo przed świętami przygotowywałem się do Bootstrapa 9.4, które to przygotowania zajęły mi większość wolnego czasu. Teraz korzystając z dnia wolnego, który sobie po świętach zostawiłem, nadrabiam zaległości.

Poprzednio zajmowaliśmy się tym jak Arduino może odczytać wartość z zewnętrznego czujnika (fotorezystora). Teraz będziemy starać się odczyt pokazać.

Użyjemy do tego 7 diod LED, które ułożone w rząd będą tworzyć wskaźnik – im więcej światła pada na fotorezystor tym więcej diod się zapali. Zaczniemy od końca, czyli jak to wygląda w akcji.


Arduino’s Eye from Starter Kit on Vimeo.

Wybaczcie słabą jakość, ale kamera w komórce to jedyne czym dysponuję aby uwiecznić moje eksperymenty.

Widać jednak co się dzieje. Poza kadrem przybliżam i oddalam fotorezystor do lampy, kolejne diody zapalają się i gasną w miarę jak natężenie światła padające na fotorezystor rośnie i maleje.

Diody LED są zamocowane bezpośrednio na płytce prototypowej, przez sprytne wygięcie i przycięcie nóżek układają się w linię i jednocześnie trzymają się pewnie na płytce.

Dioda LED zamocowana na płytce prototypowej

Dioda LED zamocowana na płytce prototypowej

Zdjęcie jest trochę nieostre (znowu komórka w akcji) ale widać dobrze jak jest zamocowana dioda. W jednym z dolnych rzędów otworów w płytce prototypowej podłączona jest masa układu i wszystkie diody dzielą to jedno podłączenie.W jaki sposób wygięte są nóżki diody pokazuje następne zdjęcie.

Pojedyncza dioda przygotowana do montażu

Pojedyncza dioda przygotowana do montażu

Schemat

Schemat

Masa z Arduino (Gnd) zostaje podłączona do dolnego rzędu na płytce prototypowej. Dzielnik napięcia z fotorezystorem zostaje wpięty między masę a zasilanie z Arduino. Jako drugi rezystor użyłem 5,7 kΩ. Mając na uwadze, że rezystancja mojego fotorezystora zmienia się od kilkuset Ω do kilku MΩ mierzone napięcie na rezystorze 5,7kΩ będzie się wahać między prawie 5V a ledwo nad 0V, dlatego wartości odczytywane z wejścia analogowego będą w pełnej skali od 0 do 1023.

Tutaj na prośbę czytelników rysunek układu we Fritzingu – dla czytelności umieściłem na nim tylko 3 diody:

Podłączenie układu - rysunek

Podłączenie układu - rysunek

Wszystkie diody zostają podłączone do szyny z masą. Każda z diod zostaje dopięta do wyjść cyfrowych Arduino przez rezystor. Rolą tego rezystora jest ograniczenie maksymalnego prądu jaki popłynie przez diodę. Nie chodzi o bezpieczeństwo diody ale wyjścia cyfrowego Arduino.

KOD:

// pin 1 nie jest używany
// gdy wartość jest 0 - to nie ma świecić
int leds[] = {-1,7,8,2,3,4,5,6};
int photoPin = 0;
int size = 8;
int val = 0;

void setup()
{
  //ustawiamy
  for (int i=1; i< size; i++) {
    pinMode(leds[i], OUTPUT);
  }
}

void loop()
{
  val = analogRead(photoPin);
  val = val/128;
  for (int i=1;i<size;i++) {
    if (i <= val ) {
      digitalWrite(leds[i], HIGH);
    } else {
      digitalWrite(leds[i], LOW);
    }
  }
  delay(200);
}

leds jest tablicą zawierające numery wyjść cyfrowych, do których podłączyliśmy kolejne diody. Ponieważ tablica jest numerowana od zera, wpisując nieistniejącą wartość wyjścia oraz pracując na indeksie tablicy zawsze od 1, pomijając zerowy, gdy natężenie światła jest najsłabsze gasną wszystkie diody.

Nasz wyświetlacz ma 8 stanów (od 1 do 7 diod świecących oraz stan zerowy ze zgaszonymi wszystkimi diodami) dlatego wartość odczytaną z wejścia analogowego dzielimy przez 128, uzyskując wynik od 0 do 7, co określa nam które diody mamy zaświecić.

Podsumowanie

Jest to pierwszy z postów, w którym zajmujemy się diodami LED, w jednym z następnych będzie o tym, jak wybrnąć z sytuacji gdy chcemy sterować diodami LED w liczbie większej niż 14. W takim przypadku odpada nam rozwiązanie użyte w tym układzie, gdzie jedno wyjście cyfrowe steruje jedną diodą.

You can leave a response, or trackback from your own site.

Komentarze: 16 to Diody LED czyli jak migac i świecić

  1. RaV says:

    kwiecień 14th, 2010 at 19:21

    Cześć, od niedawna się tym bawię – fajne rzeczy piszesz na tych stronach.
    Niestety ten opis mi nie wychodzi, nie widzę opisu po lewej części obrazka – pod które piny należy podłączyć kabelki w okolicy czujnika światła?
    Pozdrawiam

  2. netmaniac says:

    kwiecień 14th, 2010 at 20:30

    Chodzi o odręczny schemat? No to link do obrazka jest tutaj http://starter-kit.nettigo.pl/wp-content/uploads/2009/04/schemat.jpg

    podłaczeie: +5V – fotorezystor – Analog – rezystor 5.7k – masa

    Analog – to wejście analogowe photoPin.

  3. RaV says:

    kwiecień 15th, 2010 at 07:00

    Tak, dokładnie o to chodziło. Tylko pod które wejście Analogowe to podpiąć – z kodu rozumiem, że jest to Analog 0, czy tak?
    Przy okazji, możesz wytłumaczyć zapis:
    int leds[] = {-1,7,8,2,3,4,5,6};
    dlaczego mamy tu “-1″ a pozostałe cyfry nie są w kolejności, ma to jakieś znaczenie?

    I jeszcze jedno poza tym – tego już totalnie nie mogę rozgryźć – często w opisach (również w tym) spotykam zapis:
    (int i=1; i< size; i++)
    lub podobny,
    możesz mi powiedzieć o co tu chodzi i jaki jest tego funkcja i cel, co to jest “i”?
    Może pytania laika, ale o elektronice nie mam zielonego pojęcia i właśnie próbuję coś z tego zrozumieć

    Pozdrawiam

  4. netmaniac says:

    kwiecień 15th, 2010 at 07:58

    Tak, photoPin w tym kodzie to jest 0, wiec analog 0.
    -1 – to pozostałość ze starego kodu, bo miało być wyjście pomijane gdy wartość w tablicy jest mniejsza niż 0. Ale w pętli potem zaczynamy od indexu 1, wiec ten pierszy o numerze 0 (tablice w C są liczone od 0) i tak jest pomijany.

    Można by w sumie usunąć to -1 z początku tablicy i w pętli potem zacząć od 0 i kończyć na size-1

    for (int i=1; i< size; i++) {}
    to konstrukcja z języka C definiująca pętlę – w nawiasie są trzy pola oddzielone średnikiem. Pierwsze jest definicją tymczasowej zmiennej dostępnej ‘w pętli’, drugie pole jest warunkiem który jest sprawdzany przed każdym wykonaniem pętli – jeśli rezultat jest TRUE to kod zawarty w {} jest wykonywany raz. Ostanie pole jest wykonywane po każdym przebiegu kodu {}.

    Czyli definiujemy zmienną i o wartości początkowej 1, pętla jest wykonywana dopóki i nie jest równe lub większe od wartości size, a po każdym wykonaniu kodu wewnątrz {} i zostanie zwiększone o 1.

  5. RaV says:

    kwiecień 15th, 2010 at 09:18

    OK,
    coraz więcej rozumiem i mam coraz więcej pytań,
    1. co z tą kolejnością cyfr w “int leds[] = {-1,7,8,2,3,4,5,6};” czy jest dowolna?

    2. z tego co widzę, to zawartość void setup() – “for (int i=1; i< size; i++)” czyli ta mała pętla, jest powtórzona w void loop().
    Po co ona jest w setup? Nie można pozostawić pustego setup?

    3. jeszcze pytanie z początku kodu, tu definiujemy co jest czym, prawda? czyli ustawiamy, że int to są diody, oraz, że int to photoPin, skąd program np. w tym miejscu “int i=1; i< size; i++” wie, o które int mi chodzi – czy ma wartości dodawać do diód czy do tego zera przy photoPin?

    Jeszcze raz zaznaczam, że się nie znam, dlatego jak będziesz tracił cierpliwość daj znać. Albo poleć jakiś adres gdzie akurat te proste podstawy programowania (?) są jeszcze prościej wyjaśnione ;-)

    Pozdrawiam

  6. netmaniac says:

    kwiecień 15th, 2010 at 09:48

    zwartość tablicy leds to są numery portów do których podłączamy kolejne diody – jak pomieszasz kolejność numerów to albo inaczej diody podłącz, albo diody nie będą się ‘po kolei’ zapalać.

    W setup pętla ustawia odpowiedni pin cyfrowy w tryb pracy wyjścia. W loop petla przechodzi po wszystkich wyjściach cyfrowych z diodami i zapala albo gasi w zależności od wartości odczytanej z fotrezystora.

    Co do 3 – to ze tablica “leds to sa diody” to nie wynika wprost z nazwy czy tego jak to zostało zdefiniowane – zależy to od kontekstu w jakim dane zostają użyte – wartości leds są używane aby zainicjować porty wyjścia i potem zeby wiedzieć gdzie jest która dioda i zapalać/gasić używając digitalWrite.

    Trudno to wytłumaczyć- trzeba poszukać tutoriali – jeżeli angielski to nie problem to polecam http://arduino.cc/en/Tutorial/HomePage do spraw związanych z Arduino. Tutoriala do samego C nie polecę, bo takowego nie potrzebuję, więc trduno mi coś polecić.

  7. RaV says:

    kwiecień 15th, 2010 at 11:26

    Dzięki, będę walczył i kombinował.

    Pozdrawiam

  8. RaV says:

    maj 6th, 2010 at 10:09

    Mam pytanie, dlaczego w każdym z układów podłączamy osobny opornik pod każdą diodę?
    Z tego co wyczytałem w sieci, spadek napięcia na diodzie koloru czerwonego wynosi 2V a prąd używany to 20mA.
    Czyli moglibyśmy np. 5 diód podłączyć równolegle do wspólnej masy przez opornik, którego opór wyliczymy tak:
    spadek napięcia 5V-2V=3V, równolegle podłączone 5 diód potrzebuje prąd wartości 5*20mA = 100mA. Czyli potrzebowalibyśmy jeden opornik o wartości R=3V/0,1A = 30ohm.
    Teoria powinna się zgadzać, ale dlaczego nie stosujemy tego w praktyce.
    (Problem pojawiłby się oczywiście przy stosowaniu diód o różnych kolorach-różne spadki napięć).

    Byłbym wdzięczy za informację na ten temat.

    Pozdrawaim

  9. netmaniac says:

    maj 6th, 2010 at 10:49

    To by działało tylko jak zapalić chcesz wszystkie diody na raz. Jak chcesz zapalić jedną, to przez jedną by poszedł prąd 100 mA. Tyle nie da wyjście cyfrowe z Arduino a i dla żywotności diody to ma znaczenie. Jak dobierzesz mniejszy prąd to będą różnice w jasności świecenia w zależności od tego czy świeci jedna czy 5 diod…

  10. RaV says:

    maj 6th, 2010 at 14:59

    No racja. O tym nie pomyślałem. Dzięki!

  11. Krzysztof says:

    maj 17th, 2011 at 18:17

    A możesz dodać do tego bardziej czytelny schemat podłączenia jak w innych tutkach narysowany w Fritzing?
    Chciałbym zrobić ten schemat ale nie wiem do końca jak podłączyć kabelki.

  12. netmaniac says:

    maj 17th, 2011 at 21:50

    OK, postaram się taki przygotować.

  13. Krzysztof says:

    maj 30th, 2011 at 22:34

    I jak z tym schematem do tego tutka? Proszę o odpowiedz

  14. netmaniac says:

    maj 30th, 2011 at 23:19

    @Krzysztof
    Będzie tylko jeszcze trochę czasu – standardowa dioda LED we Fritzingu ‘nie pasuje’ – rysunek będzie bardzo mało czytelny. Przerabiam część tak aby pasowała lepiej do tego zastosowania.

    Daj mi jeszcze dzień lub dwa i postaram się skończyć tak żeby było ładnie widać :)

  15. netmaniac says:

    czerwiec 1st, 2011 at 10:30

    @Krzysztof
    Rysunek dodany. Mam nadzieję, że ułatwi to złożenie układu.

  16. Mati says:

    styczeń 7th, 2012 at 10:20

    uważam że fajnie by było umieścić wartości rezystorów na schemacie

Dodaj komentarz