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

Jak zredukować ilość kabli?

31 Maj 2013 13:44 5196 30
  • Poziom 9  
    Witam,
    potrzebuję zrobić zobrazowanie stanów kontaktronów (ok 50) za pomocą LED lub żarówek. Układ ma tylko zapalać lampkę jak kontaktron się "zamknie". Nie mam pomysłu jak to zrealizować bo nie jest to układ typu jeden z wielu, a raczej wiele z wielu bo może dojść do sytuacji, że zapali się większość lampek. Odległość do pokonania około 120 - 150 metrów. Myślałem o dwóch atmegach połączonych poprzez radio lub rs485 i dla zwiększenia ilość portów expandery na i2c.
    Nie bawiłem się jeszcze w połączenie dwóch procesorów i szczerze mówiąc przeraża mnie takie rozwiązanie. Więc proszę o podpowiedź czy da się taki układ zrobić prościej? Może jakieś gotowe rozwiązanie. Niestety jak na razie programuję tylko w Bascomie, ale w razie "W" jakoś poradzę sobie z C.
    Pozdrawiam.
  • Poziom 39  
    Jak zredukować ilość kabli?
    1. Zorganizuj odczytywanie stanu kontraktonów przez multipleksowanie - tak samo sterowanie LED/żarówek.
    2. Przesyłaj paczkę informującą o stanie kontraktonów (50 bitów) -> zmieści się w 7 bajtach, a je można przesłać dość szybko przez RS485 czy nawet RF (radio).
    3. Expanderów nie musiałbyś stosować. Dwa wolne porty ATMEGA (8bitów x8bitów =64 bity) wystarczą. Dobierz odpowiednie AVR-y i do dzieła.
  • Poziom 9  
    Stworzyłem schemat, na początek strony monitorowanej i zastanawiam się czy w ten sposób będzie możliwy odczyt wielu kontaktronów na raz czy tylko jednego.
    Dalej zastanawiam się nad najprostszym sposobem na komunikację bo radio chyba odpadnie ze względu na zakłócenia. Więc zostaje chyba tylko RS-485 bo na tą odległość inne będą chyba nie odpowiednie (i2c, 1wire, itp.)


    Jak zredukować ilość kabli?



    Edytuj

    Dzięki za zainteresowanie.
    Pozdrawiam
  • Poziom 36  
    AVE...

    Jeśli chcesz sprawdzać wszystkie kontaktrony na raz, to użyj siedmiu rejestrów 74HC165. Porównuj stan odczytany z zapamiętanym, jak jest inny, to odczytany wysyłasz po RSie do układu odbiorczego i zapamiętujesz go do następnego porównania. Co do komunikacji, to moim zdaniem właśnie jakiś RS się sprawdzi, nawet 232 da radę przy odpowiednio małym bitrate. Ponieważ wysyłasz komunikaty tylko jak jest zmiana, to możesz sobie pozwolić nawet na 1kbps i wciąż mieć dobre osiągi...
  • Poziom 39  
    tomik83 napisał:
    Popełniłem schemat, na początek strony monitorowane
    Popełniłeś nie do końca dobry schemat: Zablokowałeś sobie port RS232 :-( Zmień miejscami porty PC z PB i będzie OK. Nie zapomnij o złączu do programowania (jeśli nie będziesz programował Atmeg-i "na zewnątrz").
    Dołóż też kwarc, aby osiągnąć większą dopuszczalną prędkość transmisji na RS. Na wbudowanym generatorze nie osiągniesz większych prędkości.
    Co do RS485 - to jak najbardziej może być.
    Schemat połączenia tych kontraktonów jak żywo przypomina "klawiaturę matrycową"... Szukaj pod tym kątem przykładów :)
  • Specjalista elektronik
    A zauważyłeś, że przy włączeniu kilku (powyżej 2) kontaktronów może nie dać się ustalić, które są włączone?
    W układzie 2x2: włączenie dowolnych 3-ch kontaktronów daje takie same sygnały, jak włączenie wszystkich...

    Do przesyłania danych z prędkością kilku kB/s na odległość nawet paru kilometrów świetnie nadaje się skrętka,
    po której przesyłasz sygnał różnicowy - kiedyś CEMI robiło do tego układy UCY751xx, ale to przerost formy
    nad treścią, ważna jest sama idea sygnału różnicowego, nadajnik można zrobić na tranzystorach, odbiornik
    na komparatorze. Do paruset metrów sprawdza się przesyłanie według standardu 1-Wire.

    Jak przesyłacz między dwoma uC, to warto zadbać o jakieś sprawdzanie poprawności danych, np. liczyć CRC.
  • Poziom 9  
    Dziękuję za cenne uwagi, zastosuję i pokażę z kolejnymi fragmentami tak by widać było koncept całości.
    Mam dalej niejasność czy tak skonstruowana klawiatura (tablica) ma możliwość sygnalizowania np. wszystkich lub "n-kilka" stanów w jednym czasie łącznie z długotrwałym wciśnięciem "klawisza/klawiszy"?
    Urgon czyli w Twojej koncepcji rejestry połączone po I2C i zapis/odczyt do pamięci kontrolera, a komunikacja po RS?

    _jta_ Więc jak zorganizować tą tablice?? Może być z układami specjalizowanymi tylko w rozsądnych cenach i trudności realizacji (uczę się).

    Pozdawiam
  • Specjalista elektronik
    Najprościej (o ile napięcia będą pasować) dać diodę (w "dobrą" stronę) szeregowo z każdym kontaktronem.
    Kiedyś była taka nazwa "matryca diodowa", i nie chodziło o LED-y, bo ta nazwa jest starsza od nich...
  • Poziom 36  
    AVE...

    Rejestry przesuwne nie pracują po I2C. Te łączy się w łańcuszek. Podajesz sygnał przepisania z wejść do wewnętrznej pamięci, a potem podajesz sygnał zegarowy, by odczytać ich zawartość. Z każdym zboczem narastającym bodaj na wyjście jest "przesuwany" pojedynczy bit...
    Ale lepiej zrób, jak radzi Jta. Będziesz potrzebować tyle diod, ile masz komórek w matrycy...
  • Poziom 39  
    _jta_ napisał:
    A zauważyłeś, że przy włączeniu kilku (powyżej 2) kontaktronów może nie dać się ustalić, które są włączone?
    W układzie 2x2: włączenie dowolnych 3-ch kontaktronów daje takie same sygnały, jak włączenie wszystkich...
    Skąd takie (błędne poniekąd) wnioski?
    Czy kolega wie na czym polega odczytywanie matrycy przycisków? Chyba nie wie :(
  • Poziom 36  
    AVE...
    mickpr napisał:
    Skąd takie (błędne poniekąd) wnioski?
    Czy kolega wie na czym polega odczytywanie matrycy przycisków? Chyba nie wie :(

    Kolega sam nie wie, i powinien poczytać o klawiaturach, na przykład tutaj: http://pcbheaven.com/wikipages/How_Key_Matrices_Works/
  • Poziom 39  
    Urgon napisał:
    Kolega sam nie wie, i powinien poczytać o klawiaturach, na przykład tutaj: http://pcbheaven.com/wikipages/How_Key_Matrices_Works/
    Ma kolega absolutnie racje - przyznaję się do błędu i przepraszam.
    _jta_ napisał:
    Najprościej (o ile napięcia będą pasować) dać diodę (w "dobrą" stronę) szeregowo z każdym kontaktronem.
    Kiedyś była taka nazwa "matryca diodowa", i nie chodziło o LED-y, bo ta nazwa jest starsza od nich...
    A co kolega na ten pomysł z diodą?
  • Poziom 9  
    Przejrzałem tą stronę i tam właśnie jest przykład z diodami podłączonymi do każdego z przycisków.
    Więc coś się już kreuje, ale chciałbym aby było to rozwiązanie skalowalne i dające możliwość rozbudowy o moduły (tak monitorujące jak i wyświetlające).
    Ponadto zmieniła się koncepcja odnośnie zobrazowania: powinny być dwie tablice w dwóch odrębnych pomieszczeniach oddalonych od miejsca monitorowania.
    Dziękuję za zainteresowanie tym złożonym problemem.
  • Specjalista elektronik
    Zajrzałem do linku, który podał Urgon - całkiem przystępnie jest opisana idea, natomiast mam uwagę praktyczną, tam sugerują diody Schottky do większej ilości przycisków. BŁĄD: dioda Schottky ma spory prąd wsteczny i wiele takich diod połączonych równolegle może przepuszczać dużo za dużo, a zwykła 1N4148 ma czas przełączania 2ns, z tego względu mogłaby działać nawet około 100MHz, ale praktycznie trzeba zastosować znacznie mniejsze częstotliwości, bo po pierwsze dużo połączonych równolegle diod ma sporą pojemność, którą trzeba przeładowywać, po drugie chyba nie tak łatwo o uC, który by dawał przełączanie 100MHz, a i zapotrzebowania na taką częstotliwość specjalnie nie ma, do miliona przełączników ze sprawdzaniem co 1ms wystarczy częstotliwość 1MHz.

    Jeśli nie ma potrzeby stosowania dużych częstotliwości, to są takie układy, które mogą się przydać: licznik Johnsona (CD4017), demultiplekser z zatrzaskiem (np. 74LS259 - zobacz tu), rejestr przesuwny z zatrzaskiem (CD4094, 74HC595 - zobacz tu), może jakiś multiplekser... przykładowo, łącząc N rejestrów (CD4094, 74HC595) uzyskuje się 8N wyjść, na które można przesłać dowolny układ stanów logicznych używając 3-ch sygnałów: dane i zegar do przesyłania, sygnał przepisania danych na wyjście.

    Z matrycą diodową i układami TTL jest pewien problem: spadek napięcia na diodzie i mała tolerancja TTL na niewłaściwe napięcia - TTL w stanie niskim gwarantuje poniżej 0.4V, a wymaga poniżej 0.8V, czyli dioda musiałaby mieć spadek napięcia poniżej 0.4V - krzemowe mają około 0.6V... Dlatego stosując diody trzeba dobrać układy w odpowiedniej technologii... albo wydać odrobinę więcej, i zamiast realizować funkcję AND na diodach dać 8-wejściowe bramki NAND - każdy przełącznik do innego wejścia bramki, do 64 przełączników w matrycy 8x8 potrzeba 8 bramek NAND8 (74LS30?), 8 wyjść do podawania sygnałów na przełączniki (na jednym '0', na pozostałych '1'), każde wejście tej samej bramki przez przełącznik do innego sygnału.
  • Poziom 36  
    AVE...

    Możesz użyć rejestrów przesuwnych do robienia dowolnie dużych matryc. Łańcuszek rejestrów 74HC595 do wybierania rzędu matrycy, a łańcuszek 74HC165 do odczytywania stanu matrycy. Po trzy rejestry każdego rodzaju pozwalają na matrycę z 576 komórkami. Po cztery i masz już matrycę 1kb lub 128B. Używając ośmiu rejestrów 74HC595, w tym czterech z tranzystorami, i bardzo dużo diod LED, i masz matrycę diodową 1kb lub 128B...
  • Poziom 9  
    Poprawiłem, pozmieniałem i proszę o sprawdzenie oraz sugestie jak to do scalaka dopiąć. Czy linie sterujące tymi 74HC mogą być dowolnymi pinami (stan wysoki/niski) na uC?

    Jak zredukować ilość kabli?



    Edytuj

    Pozdrawiam
  • Specjalista elektronik
    Układy TTL 74xxx potrzebują pobierania prądu z wejścia, żeby stan na wejściu był '0' - nie podłączone wejście ma stan '1' - diody musiałyby być w przeciwną stronę; no i kwestia poziomów napięć, o której pisałem.

    Ale 74HCxxx poradzą sobie z tym: na wyjściu jako '0' dają 0.4V, zadowolą się 1.35V jako '0' na wejściu (przy zasilaniu 4.5V, jak wyższe, to może być większe napięcie na wejściu jako '0') - diody mogą mieć spadek napięcia np. 0.9V (a zwykle mają mniej). Czyli potrzebny jest 74HC165. Z tym, że 74HC nie mają określonego kierunku prądu wejściowego (i jest on mały, rzędu 1uA) - należałoby jego wejścia połączyć przez oporniki (kilkadziesiąt k) z '+' zasilania.

    Ponadto, jeśli wejścia F,G,H nie są używane: po wpisaniu stanów z wejść A..E i podawaniu zegara wysyłania pierwsze 3 bity będą z wejść H,G,F - a więc bezużyteczne.
  • Poziom 9  
    Dobra, rozjaśnia się :)

    _jta_ - czy mówiąc o diodach masz na myśli te przy kontaktronach w matrycy? Bo chyba ja je poobracam to zaporowo będą stały w kierunku, z którego 74HC595 będzie podawał napięcie?
    Czy niepodłączone wejścia na 74HC165 mogą "wisieć" czy raczej przez jakieś 22kOhm do masy je podłączyć?
    Jeszcze jedno pytanie do połączenia ich z atmegą mogę wykorzystać Port C?
    Tzn po kolei PC.0 - PC.2 do 74HC165, a PC.3 - PC.5 do 74HC595?

    Pozdrawiam
  • Specjalista elektronik
    Mam na myśli właśnie te diody. Układy 74HC, jakkolwiek mają mniejszą asymetrię między stanami '0' i '1' na wyjściach, wciąż podobnie jak TTL dają większy sygnał na '0', niż na '1': np. przy zasilaniu 4.5V i obciążeniu 4mA '0' daje 0.4V, '1' - 3.7V (jakby była symetria, to by było np. 0.6V, 3.9V), a mają symetrię na wejściach (przy zasilaniu 4.5V 0..1.35V to '0', 3.15..4.5V to '1'), więc korzystniej jest używać '0' jako stanu aktywnego - jak użyjesz '1', to przy zasilaniu 4.5V musiałbyś mieć diody o napięciu przewodzenia poniżej 3.7-3.15=0.55V, a używając '0' - poniżej 0.95V (przy zasilaniu 6V: 1.0V i 1.4V - ale przecież masz zasilanie 5V).

    Wejść CMOS (np. 74HCnnn, CD40nn) nie wolno zostawiać "wiszących" - za to można je połączyć z masą, albo z '+' zasilania.

    Nie wiem, który port atmegi jest do czego - przypuszczam, że są dość uniwersalne i można użyć dowolnego.

    Zamiast używać 74HC165 możesz użyć multipleksera analogowego (CD4051) - dla takiej matrycy będziesz potrzebował jednego dodatkowego wejścia atmegi (bo na CD4051 trzeba podać 3 bity adresu do wybierania 1 sygnału z 8), ale za to tylko na tym jednym wejściu będziesz musiał uważać na poziomy napięć bardziej, niż to się zwykle robi - i ewentualnie mógł wstawić tam jakiś tranzystor. Przy bardziej rozbudowanej matrycy lepiej używać 74HC165, bo multiplekser wymaga więcej sygnałów przy wybieraniu z większej ilości wejść, a rejestr przesuwny (albo rejestry) zawsze tylko 3.

    Aha: być może do sterowania 74HC595 wystarczą dwa sygnały (wspólny zegar wprowadzania danych szeregowych i wyprowadzania równoległych).
  • Poziom 9  
    Panowie składam te matryce pomalutku celem potestowania i tak przy okazji przeglądania towarów i porównywania cen zaczynam wątpić w RS - cena za kabel może mnie chyba przygnieść :/
    Musi to być kabel, który można stosować na zewnątrz i... podwiesić. Dodatkowo w miejscu gdzie będzie to docelowo zamontowane występują zakłócenia (silniki wentylatorów, itp.) i tak zastanawiam się czy istnieje jakiś odporny sposób komunikacji RF ponieważ cenowo może chyba wyjść podobnie, a nie będzie plątaniny kabli. Podpowiedzcie proszę.
    Dodam, że prędkość transmisji nie jest jakoś specjalnie ważna ponieważ cały układ ma tylko przesyłać zobrazowanie jednej matrycy na dwie pozostałe. No może dojdą jakieś wolne w zmianach dodatkowe stany do zobrazowanie w podobny sposób.
    Pozdrawiam.
  • Poziom 9  
    Witam, chciałem być cwańszy niż się należało i zrobiłem jeszcze inaczej. Mianowicie znalazłem na YT filmik jak gościu używa 74HC595 jako rejestr wejściowy.
    I popadłem w kałabanie. Ponieważ obsługa przycisków odbywa się w przerwaniu i tylko w przerwaniu jest cały program nie mam możliwości poprawnego wysłania transmisji przez RS :<
    Proszę sprostujcie mnie czy to wina programu czy prawidłowość, że w przerwaniu, które tu trwa cały czas można użyć Serial.xxxxxx Jak zredukować ilość kabli?

    edit:
    nie działało dodawanie schematów więc wstawiam obrazek

    edit2:

    oto kod, którego chciałem użyć w procesorze, który będzie zbierał dane i wysyłał po RS485

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    edit 3:

    kod jest napisany dla jednej kostki 74HC595, jeżeli jednak realizacja założeń będzie możliwa przy tym wariancie połączeń to będzie ich 5 lub 6 i tu kolejne pytanie: jak wysłać 6 bajtów - chyba "int" jest za mały?
  • Specjalista elektronik
    Stosując rejestry PISO (parallel in serial out) możesz uzyskać to samo bez diod (za to będą potrzebne oporniki, zwłaszcza jeśli ten rejestr będzie miał wejścia CMOS), a i program będzie prostszy...
  • Poziom 9  
    Witam,
    74HC165 już do mnie jadą, co nie zmienia faktu, że ten sposób też zadziałał i to nawet całkiem sprawnie (po poprawkach kodu i eksperymentach). Jest jedno "ALE" i to duże: nie wiem jak to w programie załatwić, żeby działało na powiedzmy sześć rejestrów w łańcuchu :/
    Nie mam po prostu koncepcji na zorganizowanie danych bo przecież będzie to 6 bajtów - tak? czyli 111111111111111111111111111111111111111111111111 mniej więcej tak będzie wyglądał wynik (chodzi mi o ilość bitów).
    Jak złożę to na stykówce to będę miał jakieś środowisko do testów (czekam również na dużą płytkę prototypową), ale bardzo proszę o podpowiedź jak zbudować - zorganizować pobieranie tych danych i wysyłanie ich w takiej ilości.

    Pozdrawiam
  • Specjalista elektronik
    W programie trzeba liczyć bajty - np. dwie pętle jedna wewnątrz drugiej, zewnętrzna liczy bajty, wewnętrzna bity w bajcie.
  • Poziom 9  
    A podpowiesz jak to w kodzie ma wyglądać? Bo przecież muszę wiedzieć, który bajt jest właśnie zapisywany, czy różni się od poprzednio odczytanego (na tej samej pozycji) i spakować to do wysyłki.
    Dobrze rozumuje?
    No chyba że po prostu należy zadeklarować 6 oddzielnych zmiennych i zrobić 6 kolejnych pętli (takich jak już mam dla 8 bitów), które oddadzą wartość po kolei do tych zmiennych wcześniej zadeklarowanych (a nie do "Output") i wysyłać je po kolei do odbiorników (tu slav'y).
    Teoretyzuję bo dalej nie mam jak tego złożyć w całości, a szkoda mi czasy tracić na nic robienie.
    Pozdrawiam
  • Specjalista elektronik
    Dlatego dwie pętle, żeby liczyć bajty w tej zewnętrznej. W sumie wykonasz 48 odczytów, po jednym bicie.
    Kod: C
    Zaloguj się, aby zobaczyć kod
  • Poziom 9  
    _jta_ nie mam pojęcia co robi "data[byte_i]|=(in_data()&1)<<bit_i; }" - czyli chyba sedno?
    próbowałem to przepisać do mojego programu (tego co wykorzystuje 595) tj. na wzór pierwszą pętle for i później tą którą mam (wypełnianie bitów) efekt jest taki, że zlicza co pewien skok i ciągle rośnie.

    Dodam, że 74HC165 też już próbowałem połączyć w łańcuch i dla 2 jest dobrze, a dla trzech ostatniego nie widzi w ogóle.
  • Specjalista elektronik
    in_data() to ma być funkcja, która odczytuje 1 bit danych.
  • Poziom 9  
    Czyli tam mogę zwracać to co normalnie zwracam do "Output"?

    Kod: c
    Zaloguj się, aby zobaczyć kod


    edit:
    Serial.println jest tylko do sprawdzenie co to to wysyła tak naprawdę.
    I sprawdza tylko trzy rejestry (24 bity).
  • Specjalista elektronik
    Jak u ciebie Check jest byte, to twój program może działać tylko do 8 wejść.
    Rozumiem, że używasz 595? Funkcja in_data() może chyba być:
    Kod: C
    Zaloguj się, aby zobaczyć kod
    Ale przed pętlą, w której jest użyta, trzeba wykonać:
    Kod: C
    Zaloguj się, aby zobaczyć kod

    Z 74HC165 byłoby prościej - nie byłoby pinu 11, przed pętlą wystarczyłoby:
    Kod: C
    Zaloguj się, aby zobaczyć kod
    i nie robiłoby się tego w funkcji in_data(), miałaby o linijkę mniej.