Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Computer Controls
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Oświetlenie schodów z użyciem Arduino i PCA9685

HekNos 13 Sty 2018 22:46 1257 30
  • #1 13 Sty 2018 22:46
    HekNos
    Poziom 5  

    Witam

    Zwracam się z prośbą do Was o pomoc w napisaniu programu do oświetlania schodów.

    Przeglądałem różne fora i tematy związane z PCA9685 i niestety nic sensownego nie udało mi się zrobić.

    Planem jest oświetlenie 16 schodów z użyciem modułu PCA9685. Dodatkowo 4 czujniki ruchu (2 na dole i dwa na górze) aby kontroler wiedział czy ktoś jest na schodach czy nie.

    podłączenie:
    PCA9685...........Uno/Nano
    GND...............GND
    OE................N/A
    SCL...............A5
    SDA...............A4
    VCC...............5V

    pozdrawiam

    0 29
  • Computer Controls
  • #2 14 Sty 2018 00:03
    piterek-23
    Poziom 32  

    Prosisz o pomoc w napisaniu programu, a nie pokazujesz co masz, co napisałeś.
    Oczekujesz gotowca?

    0
  • Computer Controls
  • #3 14 Sty 2018 00:26
    22053
    Użytkownik usunął konto  
  • #4 14 Sty 2018 13:01
    HekNos
    Poziom 5  

    R-MIK napisał:
    Temat oświetlenia schodów niedawno był akurat nie na PCA9685. Pytanie, dlaczego konieczność użycia zewnętrznych PWM? Schody to nie ekran telewizora. Czy 12-bit jest konieczne? Nie wystarczy 5 czy 6-bit? PWM zrealizować programowo.


    R-Mik dzięki za odpowiedź
    Czy 5 albo 6 bit wystarczy czy nie - nie mam zielonego pojęcia. Chcę użyć tego modułu bo mam akurat 2 czy 3 sztuki.

    A tak wygląda mój kod który słabo działa ale chociaż po aktywacji PIR diody zapalają się po kolei a chciałbym żeby się rozjaśniały

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #5 14 Sty 2018 13:24
    22053
    Użytkownik usunął konto  
  • #6 14 Sty 2018 20:49
    HekNos
    Poziom 5  

    R-Mik nie ogarniam tego :(

    Mógłbyś napisać kod żeby rozjaśniały się 2 pierwsze diody (i zostały zapalone) w odstępie np.300 ms i gasiły w odstępie 1000 ms ? Zobaczę jak wygląda taki kod i może uda mi się napisać dalej

    0
  • #7 20 Sty 2018 19:54
    HekNos
    Poziom 5  

    Na razie napisałem takie coś:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Napotkałem się na dwa problemy które nie wiem jak naprawić:
    1 - w linijce "for (int jasnosc = 0; jasnosc <= 2500; jasnosc ++)" wartość maksymalną ustawiłem na 2500 (maksymalnie można ustawić 4095) tylko im wyższa wartość tym diody zapalają się wolniej. Więc nie wiem jak to zmienić żeby móc użyć maksymalnej jasności (4095) ale żeby diody zapalały się szybko
    2 - po aktywacji czujnika diody rozświetlają się po kolei ale jak ostatnia dioda się zaświeci to pierwsza całkowicie gaśnie

    0
  • #8 20 Sty 2018 20:11
    tronics
    Poziom 37  

    Cytat:
    tylko im wyższa wartość tym diody zapalają się wolniej

    A co w tym dziwnego? Zwiększasz pułap, ale poruszasz się tak samo szybko. Chcesz mieć w miarę płynnie niezależnie od pułapu to podziel (max-min) na jednakową ilość kroków i co pętlę o tyle zwiększaj. Czyli dla np. 100 kroków zakres 0-2500 będzie co pętlę zwiększać o 25, a zakres 0-4000 o 40.
    Cytat:
    po aktywacji czujnika diody rozświetlają się po kolei ale jak ostatnia dioda się zaświeci to pierwsza całkowicie gaśnie

    Jak program wychodzi z FOR to trafia do loop i co napotyka?
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #9 20 Sty 2018 20:52
    HekNos
    Poziom 5  

    Dzięki za odpowiedź.

    punkt 2 naprawiony

    Jak zmienić kod zeby skok rozjaśniania był 10% wartości pułapu ???

    0
  • #10 20 Sty 2018 21:52
    tronics
    Poziom 37  

    Cytat:
    for (int jasnosc = 0; jasnosc <= 2500; jasnosc ++)

    Co ten fragment oznacza... ano że rozpoczynamy z wartością zmiennej jasnosc = 0, powtarzamy pętlę dopóki spełniony jest warunek jasnosc <=2500 i co iterację zwiększamy jej wartość o 1 (jasnosc++). Nic nie stoi na przeszkodzie by zwiększać o więcej niż 1. Czyli można zamienić jasnosc++ na jasnosc=jasnosc+250 i w kolejnych iteracjach będzie 0, 250, 500, 750, 1000, 1250, 1500, 1750, 2000, 2250 i wreszcie 2500. Można zdefiniować np.
    Kod: c
    Zaloguj się, aby zobaczyć kod
    I później jeśli coś nie będzie tak szybkie jak trzeba to zmieniamy tylko wartości w #define.

    0
  • #11 20 Sty 2018 21:58
    HekNos
    Poziom 5  

    Doszedłem do tego też sam - trochę inaczej ale działa

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Dodano po 4 [minuty]:

    Teraz mam inny problem.

    Potencjometr od regulacji czasu wyjścia jest skręcony na minimum. Diody zapalają się szybciej niż trwa stan wysoki na pinie więc diody na początku zapalają się, po ostatniej cykl się powtarza dając efekt chwilowego zgaśnięcia i zapalenia diody - jak to naprawić ???

    0
  • #12 21 Sty 2018 11:27
    tronics
    Poziom 37  

    Cytat:
    Doszedłem do tego też sam - trochę inaczej ale działa
    Ale niepotrzebnie zajmuje miejsce w RAM :) Choć to w tej aplikacji w zasadzie bez znaczenia, bo raczej go nie zabraknie więc można być nieco rozrzutniejszym. Z drugiej strony pozwala na większą elastyczność np. 2 potencjometry do ustalania dolnego i górnego progu PWM oraz jeden do regulacji szybkości rozjaśniania (ewentualnie parametry ustalane poprzez klawisze).
    Ów inny problem obejść stosunkowo łatwo. I tak taką funkcjonalność ostatecznie będzie kolega musiał zaimplementować. Zamiast if(PIR4 == HIGH) będzie kolega musiał kilka rzeczy zrobić ...
    1. napisać funkcję sprawdzającą stany czujników i zwracającą jakie czujniki są załączone
    np.
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Teraz nie wiem czy jest absolutnie stylistycznie poprawnie, bo piszę "z głowy" ;)
    2. napisać warunek sprawdzający jakie czujniki są załączone i tutaj można rozróżnić kilka sytuacji:
    a) czujniki od dołu - podświetlamy schody zaczynając od dołu do pełnego oświetlenia (jeśli podświetlenie było nieaktywne to wywołanie funkcji zapalającej od dołu i ustawienie flagi, że oświetlenie aktywne)
    b) czujniki od góry - podświetlamy schody zaczynając od góry do pełnego oświetlenia (jeśli podświetlenie było nieaktywne to wywołanie funkcji zapalającej od góry i ustawienie flagi, że oświetlenie aktywne)
    c) z dołu i z góry - można spróbować rozjaśniać z dołu i z góry naraz ze "spotkaniem się" na środku, można olać i rozjaśniać całość naraz aż do pełnego oświetlenia (jeśli podświetlenie było nieaktywne to wywołanie funkcji specjalnego podświetlenia od góry i od dołu i ustawienie flagi, że podświetlenie aktywne)
    d) żaden czujnik - wyłączenie po oświetlenia po ustalonym czasie i zresetowanie flagi, że podświetlenie aktywne.
    W zasadzie to może być jedna sprytna funkcja, która przyjmie jako parametr wejściowy kierunek (0 - gaszenie, 1 od dołu, 2 - od góry, 3 - z obu stron) i będzie odpowiednio zapalać/gasić.

    0
  • #13 21 Sty 2018 13:03
    HekNos
    Poziom 5  

    Dzięki tronics za Twoje cenne info

    Widzę że na tym etapie muszę napisać jak ja to widzę, tak więc:

    Oświetlenie schodów z użyciem Arduino i PCA9685

    Jeżeli 1 da sygnał i po chwili 2 - to zapal schody od 0 do 15 - osoba wchodzi na górę
    Jeżeli 3 da sygnał i po chwili 4 - to gaś schody od 0 do 15 - osoba zeszła ze schodów

    Jeżeli 4 da sygnał i po chwili 3 - to zapal schody od 15 do 0 - osoba schodzi z góry
    Jeżeli 2 da sygnał i po chwili 1 - to zgaś schody od 15 do 0 - osoba zeszła ze schodów

    Jeżeli 1 da sygnał i po chwili 2 - to zapal schody od 0 do 15 - osoba wchodzi na górę
    Jeżeli 2 da sygnał i po chwili 1 - to zgaś schody od 15 do 0 - osoba zawróciła

    Pisząc ten opis wpadłem na pomysł żeby każda aktywacja wchodzenia dodawała jeden do "jakiegoś" licznika a każda aktywacja schodzenia odejmowała jeden od licznika.
    Może się zdarzyć że jedna osoba po drugiej będą wchodziły na górę. Pierwsza osoba opuści schody, schody zgasną. Drugiej spadnie kapeć nie zdąży dotrzeć na górę i katastrofa gotowa. :D

    0
  • #14 23 Sty 2018 18:51
    tronics
    Poziom 37  

    Cytat:
    Pisząc ten opis wpadłem na pomysł żeby każda aktywacja wchodzenia dodawała jeden do "jakiegoś" licznika

    Wszystko zależy jaki to będzie czujnik, jeśli to będzie HC-SR501 to musi kolega zrewaluować założenia, bo podejrzewam, że to zwyczajnie nie będzie tak działać.

    0
  • #15 24 Sty 2018 15:53
    HekNos
    Poziom 5  

    Na razie muszę coś wykombinować. Jeszcze nie wiem co ale znalazłem taki filmik - https://www.youtube.com/watch?v=juOtoUabyH8

    Jak myślicie (bo ja to zielony jestem) - będzie to działać ? tzn czy skróci się czas stanu wysokiego po aktywacji.

    0
  • #16 27 Cze 2018 11:13
    HekNos
    Poziom 5  

    Witam ponownie
    Dopiero wczoraj podłączyłem schody i pomimo ustawienia maksymalnej jasności na 4000 diody świeca na około 50%. Nie wiem czemu ale PCA przy ustawieniu 4000 dale tylko około 2,5V na wyjściu PWM. Na środkowym pinie jest normalnie 5V.
    Dodam że diody są na napięcie 5V. Arduino i PCA są zasilane z osobnych źródeł.

    Nie wiem co dalej

    0
  • #17 27 Cze 2018 11:22
    3149400
    Użytkownik usunął konto  
  • #18 27 Cze 2018 11:29
    HekNos
    Poziom 5  

    wartość 4095 daje 100%

    0
  • #19 27 Cze 2018 12:00
    3149400
    Użytkownik usunął konto  
  • #20 27 Cze 2018 12:23
    HekNos
    Poziom 5  

    Nie chcę niegrzecznie odpowiadać ale skoro temat dotyczy PCA9685 to jak myślisz o jaką płytkę mi chodzi ???
    https://botland.com.pl/sterowniki-serw/2447-a...MI8ILFqcvz2wIVDlQYCh3X5AuzEAAYASAAEgLh-vD_BwE

    Każdy z kanałów od 0 do 15 posiada 3 piny GND, V+, PWM (dlatego napisałem że na środkowym pinie jest cały czas 5V) ponieważ wydaje mi się że płytka została zaprojektowana głównie do sterowania serwami. Diody mam podpięte pod PWM i po uruchomieniu programu zmierzone napięcie na każdym z pinów jest około 2,5 V.
    Program na razie wygląda tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Teraz zauważyłem tekst
    "Set the ON and OFF times for PWM output 0. This function takes 3 parameters, the first is the PWM output pin to control (0 to 15), the second sets the point at which to pull the output high (0 to 4095), the third sets the point at which to pull the pin low again (0 to 4095). With the values below the output will immediately go high at the start of a cycle and then go low half way though the cycle giving a 50% duty cycle."

    Czyli jeżeli zapis np dotyczący pierwszego kanału wygląda tak:

    HCPCA9685.Output(0, 0, 4000); to wypełnienie będzie wynosić 50 %

    a jeżeli tak:

    HCPCA9685.Output(0, 4000, 4000); to wypełnienie będzie wynosić 100 %

    Dobrze myślę ???

    0
  • #21 27 Cze 2018 12:38
    3149400
    Użytkownik usunął konto  
  • #22 27 Cze 2018 13:21
    HekNos
    Poziom 5  

    Dopiero wieczorem będę ponownie testował ten program. Schody robię u kolegi więc teraz nie mam jak sprawdzić programu.

    Dodam że używam klona UNO

    Jak sprawdzić ten rejestr ? Nie znam się zbytnio na tym

    0
  • #23 27 Cze 2018 13:42
    3149400
    Użytkownik usunął konto  
  • #24 27 Cze 2018 20:37
    HekNos
    Poziom 5  

    Coś jest nie tak - chyba płytka jest uszkodzona
    Program wygląda tak

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Usunąłem wszystko i teraz chcę zaświecić jeden schodek (nr 6). Diody świecą na 50 % - nie wiem jak to naprawić.

    Co do sprawdzania tego rejestru to nie mam pojęcia jak to sprawdzić

    0
  • #25 27 Cze 2018 20:47
    3149400
    Użytkownik usunął konto  
  • #26 27 Cze 2018 20:51
    HekNos
    Poziom 5  

    nowyARM napisał:
    HekNos napisał:
    Diody świecą na 50 % - nie wiem jak to naprawić.

    Kilka opcji:
    - Sprawdź oscyloskopem faktyczne wypełnienie przebiegu.
    - Zobacz co tak naprawdę robi biblioteka.
    - Zrób swoja biblioteka to w końcu tylko:
    Start
    Adres układu do zapisu
    Adres rejestru
    Dwa bajty dla on (moga byc 0, 0)
    Dwa bajty dla off
    Stop

    HekNos napisał:

    Co do sprawdzania tego rejestru to nie mam pojęcia jak to sprawdzić

    Podobnie jak zapis
    Start
    Adres układu do zapisu
    Adres rejestru
    Ponowny start
    Odczyt 4 bajtów (dwa dla on, dwa dla off)
    Stop


    Fajnie że coś napisałeś ale dla mnie to ciemna magia no i oscyloskopu nie posiadam

    0
  • #27 27 Cze 2018 21:09
    3149400
    Użytkownik usunął konto  
  • #28 28 Cze 2018 08:47
    tronics
    Poziom 37  

    Cytat:
    Nie wiem czym zajmujesz się zawodowo, ale czy ta pracę można wykonać bez niezbędnych narzędzi?

    Wymaganie od hobbystów pracujących na arduino posiadania oscyloskopu jest niepoważne.
    Cytat:
    Na 99% problem jest w oprogramowaniu.

    To się zgadza, ale przecież kolega lepszej obsługi raczej (jako że to ciemna magia) nie napisze niż jest w bibliotece. Wrócę z pracy to napiszę więcej, ale w tej chwili kolega móglby chociaż wyraźne zdjęcie jak to wszystko jest połączone zrobić. Może błąd leży gdzie indziej, bo biblioteka jest popularna i z pewnością działa prawidłowo. A jak działa układ można sobie obejrzeć od strony 17 w dokumentacji.

    0
  • #29 28 Cze 2018 09:08
    3149400
    Użytkownik usunął konto  
  • #30 28 Cze 2018 15:44
    tronics
    Poziom 37  

    Cytat:
    A może moje, krótkie, uzasadnienie posiadania sprzętu jest mało przekonywujące?

    Jest zupełnie nieprzekonujące, niech kolega przypomni sobie co to za dział. A pytania o to, które arduino wychodzące od kolegi są zupełnie niepotrzebne. HCPCA9685 korzysta z "systemowej" Wire do obsługi I2C. Co za tym idzie będzie działać na każdym Arduino ze standardową realizacją "wire" czyli ESP8266, Mega328, SAMD21 itp. z płytek Arduino oraz STM32 z pakietu STM32Duino (to nie są płytki Arduino, nie ma ani jednej na STM32!) czy cokolwiek innego ze standardową obsługą Wire.h

    Dział arduino jest m.in. dla tych, co nie chcą przeglądać setek stron dokumentacji (dla tego PCA "tylko" 52, można by obciąć zbędne i zmieściłoby się może w 40), zapamiętywać dziesiątek rejestrów, uczyć się obsługi aparatury pomiarowej czy lutowania (bo można większość zrobić na shieldach i stykówkach). I z tego właśnie powodu powstał dział gdzie takie podejście nie będzie piętnowane. Zatem proszę uprzejmie kolegę by to uszanować, to nie "mikrokontrolery" ani "projektowanie".

    A jeśli chodzi o autora to biblioteka z hobby components powinna działać, ale zawsze można spróbować biblioteki adafruit
    https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library
    chociaż funkcjonalnie wygląda niemalże identycznie. Zresztą jak ma nie wyglądać, na ile różnych sposobów można to zrealizować?
    Przydałby się serial debug i weryfikowanie zapisanych parametrów (w bibliotece adafruit jest fragment który można powielić i wykorzystać do odczytu wybranych rejestrów PCA9685).

    1