Port szeregowy, ustawienie 0 i 1 na TXD
Moderatorzy: Moderatorzy, Administratorzy
Port szeregowy, ustawienie 0 i 1 na TXD
Witam
Potrzebuję zrobić pewną rzecz na porcie szeregowym (a nie jestem znawcą tematu).
Przed rozpoczęciem transmisji na TXD portu szeregowego występuje 1 (około -12V).
Szukam prostego sposobu na zmianę stanu TXD z 1 na 0 (około +12V ) na określony dłuższy czas rzędu sekund, a następnie zmianę tego stanu znów na 1.
Potrzebuję tego do sterowania urządzeniem zewnętrznym na zasadzie włącz/wyłącz
Byłoby miło gdyby dało się to zrobić w bashu, ewentualnie w C
aksnet
Potrzebuję zrobić pewną rzecz na porcie szeregowym (a nie jestem znawcą tematu).
Przed rozpoczęciem transmisji na TXD portu szeregowego występuje 1 (około -12V).
Szukam prostego sposobu na zmianę stanu TXD z 1 na 0 (około +12V ) na określony dłuższy czas rzędu sekund, a następnie zmianę tego stanu znów na 1.
Potrzebuję tego do sterowania urządzeniem zewnętrznym na zasadzie włącz/wyłącz
Byłoby miło gdyby dało się to zrobić w bashu, ewentualnie w C
aksnet
Re: Port szeregowy, ustawienie 0 i 1 na TXD
Witam
Problem rozwiązałem poprzez zaprojektowanie elektroniki, która wykrywa jakąkolwiek (dowolną)transmisję na TXD.
Potem w pętli przez wybrany czas wysyłam cokolwiek na TXD. Po zakończeniu transmisji na TXD pojawia się znów 1 (-12V).
Jeśli ktoś jest zainteresowany mogę umieścić na forum całe rozwiązanie (dwa tranzystory, dioda, kondensator, trzy rezystory i na końcu przekaźnik)
Steruje tym prosty programik na kilka linii kodu w bashu.
pozdrawiam
aksnet
Problem rozwiązałem poprzez zaprojektowanie elektroniki, która wykrywa jakąkolwiek (dowolną)transmisję na TXD.
Potem w pętli przez wybrany czas wysyłam cokolwiek na TXD. Po zakończeniu transmisji na TXD pojawia się znów 1 (-12V).
Jeśli ktoś jest zainteresowany mogę umieścić na forum całe rozwiązanie (dwa tranzystory, dioda, kondensator, trzy rezystory i na końcu przekaźnik)
Steruje tym prosty programik na kilka linii kodu w bashu.
pozdrawiam
aksnet
Re: Port szeregowy, ustawienie 0 i 1 na TXD
Rozwiązanie dla potomnych (może komuś się przyda)
Moja płyta ma wyprowadzone 2 porty szeregowe, więc robię transmisje na oba (obojętne do którego potem wepnę kabelek)
Zasilanie +12V i masę (GND) biorę z zasilacza komputerowego
Z portu szeregowego używam tylko jednego kabelka TXD.
Jako parametr skryptu podaje czas w sekundach (i tyle czasu jest włączony przekażnik)
Opóźnienie w załączeniu i wyłączeniu przekaźnika wynosi ok. 1 sekundy
(ale dzięki temu elektronika jest odporna na zakłócenia, np. zauważyłem niepożądany krótki impuls na TXD pojawiający się w trakcie wyłączania komputera)
Żeby zmniejszyć opóźnienie można dać trochę mniejszy kondensator.
Używam tego urządzenia do automatycznego restartu (wyłączenie zasilania na kilkanaście sekund) modemów co 48 godzin o 5 rano.
Modemy po kilku dobach pracy niestety potrafiły się mocno zamulić.
Pozdrawiam
aksnet
Moja płyta ma wyprowadzone 2 porty szeregowe, więc robię transmisje na oba (obojętne do którego potem wepnę kabelek)
Zasilanie +12V i masę (GND) biorę z zasilacza komputerowego
Z portu szeregowego używam tylko jednego kabelka TXD.
Jako parametr skryptu podaje czas w sekundach (i tyle czasu jest włączony przekażnik)
Opóźnienie w załączeniu i wyłączeniu przekaźnika wynosi ok. 1 sekundy
(ale dzięki temu elektronika jest odporna na zakłócenia, np. zauważyłem niepożądany krótki impuls na TXD pojawiający się w trakcie wyłączania komputera)
Żeby zmniejszyć opóźnienie można dać trochę mniejszy kondensator.
Używam tego urządzenia do automatycznego restartu (wyłączenie zasilania na kilkanaście sekund) modemów co 48 godzin o 5 rano.
Modemy po kilku dobach pracy niestety potrafiły się mocno zamulić.
Pozdrawiam
aksnet
Kod: Zaznacz cały
#!/bin/sh
if [[ $1 -eq "" ]]
then
echo "podaj czas w sekundach"
exit;
fi
COM1="/dev/ttyS0"
COM2="/dev/ttyS1"
COM_INIT="9600 cs8 clocal -cstopb -parenb -parodd -crtscts -cread"
# COM speeds: 110, 150, 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 56000, 115200
stty -F $COM1 $COM_INIT
stty -F $COM2 $COM_INIT
REBOOT_TIME=$1
NOW=$(date '+%s') # sekund od 1970
STOP_TIME=$(( $NOW + $REBOOT_TIME ))
while [[ $NOW < $STOP_TIME ]] ;
do
echo '\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' > $COM1
echo '\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' > $COM2
NOW=$(date '+%s')
# echo $NOW
done
#stty -a -F $COM1
#stty -a -F $COM2
Ostatnio zmieniony 2016-06-02, 14:39 przez aksnet, łącznie zmieniany 5 razy.
Re: Port szeregowy, ustawienie 0 i 1 na TXD
Thx aksnet, fajnie by było, by temat wskoczył do "Propozycje do FAQ", łatwiej będzie kiedyś to znaleźć w potrzebie
Re: Port szeregowy, ustawienie 0 i 1 na TXD
Podstawa, jeżeli chce się sterować zasilaniem 230V to dla własnej zdrowotności trzeba wiedzieć co się robi albo porozmawiać z kimś kto się zna na rzeczy.
Poniżej kilka mniej oczywistych rozwiązań w różnej skali.
1) W FAQ Slacka (tych z paczek) był kiedyś opis układu załączającego czajnik za pośrednictwem elektroniki podpiętej do LPT.
2) Niektóre programatory do popularnych mikrokontrolerów po zmianie oprogramowania są konwerterami (tty)USB / 8bit więc dodać przekaźnik jest względnie łatwo.
3) Istnieją przemysłowe konwertery RS232 (do kilkunastu metrów) / RS485 (do kilkuset metrów po jednej parze skrętki przy wielu urządzeniach na magistrali) na IO stykowe.
4) Istnieją sterowniki pozwalające na sterowanie przez GSM.
5) Trochę drożej wychodzi zakup najtańszego chińskiego PLC z kilkoma IO i ethernetem/RS485/GSM i oprogramowanie go. Niemniej tu już będzie spora dowolność w sterowaniu i w implementacji sekwencji.
Konwertery przemysłowe i sterowniki będą miały protokół Modbus.
Pozdrawiam,
Poniżej kilka mniej oczywistych rozwiązań w różnej skali.
1) W FAQ Slacka (tych z paczek) był kiedyś opis układu załączającego czajnik za pośrednictwem elektroniki podpiętej do LPT.
2) Niektóre programatory do popularnych mikrokontrolerów po zmianie oprogramowania są konwerterami (tty)USB / 8bit więc dodać przekaźnik jest względnie łatwo.
3) Istnieją przemysłowe konwertery RS232 (do kilkunastu metrów) / RS485 (do kilkuset metrów po jednej parze skrętki przy wielu urządzeniach na magistrali) na IO stykowe.
4) Istnieją sterowniki pozwalające na sterowanie przez GSM.
5) Trochę drożej wychodzi zakup najtańszego chińskiego PLC z kilkoma IO i ethernetem/RS485/GSM i oprogramowanie go. Niemniej tu już będzie spora dowolność w sterowaniu i w implementacji sekwencji.
Konwertery przemysłowe i sterowniki będą miały protokół Modbus.
Pozdrawiam,
Re: Port szeregowy, ustawienie 0 i 1 na TXD
Zmieniam schemat na bardziej aktualny (poprawiona wersja ze wzmacniaczem operacyjnym).
Urządzenia w tej wersji używam od kilku tygodni i sprawuje się dobrze.
Pozdrawiam.
Urządzenia w tej wersji używam od kilku tygodni i sprawuje się dobrze.
Pozdrawiam.
Re: Port szeregowy, ustawienie 0 i 1 na TXD
Może zamiast używać linii TXD lepiej byłoby wykorzystać którąś ze sterujących?
Ten układ na wzmacniaczu operacyjnym to przerost formy nad treścią. O wiele prościej byłby to zrobić na małym mosfecie.
R1 C eliminują załączenia dla chwilowych impulsów, R2 C podtrzymują napięcie na bramce mosfeta. Mosfet zamiast wzmacniacza operacyjnego i tranzystora BD, reszta układu taka sama.
A może:
https://sklep.avt.pl/avt925.html
http://forum.slackware.pl/viewtopic.php?t=14575
Ten układ na wzmacniaczu operacyjnym to przerost formy nad treścią. O wiele prościej byłby to zrobić na małym mosfecie.
Kod: Zaznacz cały
>- D1 -- R1 --o---o---- bramka mosfeta
| |
R2 C
| |
--- ---
A może:
https://sklep.avt.pl/avt925.html
http://forum.slackware.pl/viewtopic.php?t=14575
Re: Port szeregowy, ustawienie 0 i 1 na TXD
Wzmacniacz operacyjny z dodatnim sprzężeniem zwrotnym tworzy dodatkowo histerezę włączania/wyłączania.
Na mosfecie tego nie masz (rozwiązanie z mosfetem pewnie mogłoby być prostsze i wystarczające).
Możesz podać przykład kodu jak sterować inną linią niż TXD? (np. w bash lub C/C++)
Na mosfecie tego nie masz (rozwiązanie z mosfetem pewnie mogłoby być prostsze i wystarczające).
Możesz podać przykład kodu jak sterować inną linią niż TXD? (np. w bash lub C/C++)
Re: Port szeregowy, ustawienie 0 i 1 na TXD
http://ep.com.pl/files/3151.pdf
^ części jest więcej
Wg: http://comments.gmane.org/gmane.org.use ... .ale/30518 wystarczy otworzyć port żeby linia DTR się uaktywniła
"Opening the tty port should raise DTR if the bit rate is non-zero so stty 9600 -hupcl < /dev/ttyS0 should do it.
Use stty hupcl if you want to turn if off after close. sleep 1 < /dev/ttyS0 to pulse it for about a sec."
Tu jest spory kawałek kodu w pytonie:
ftp://ftp.ti.com/pub/data_acquisition/A ... alposix.py
Do zabawy portem szeregowym przymierzałem się już od jakiegoś czasu ale ja od razu użyję mikrokontrolera i maxa232 z czymś prymitywnym w rodzaju sterowania/protokołu. Do tego sterowanie przez www - myślałem nad apache i cgi albo shell_exec z własną binarką. Na razie czasu brak.
^ części jest więcej
Wg: http://comments.gmane.org/gmane.org.use ... .ale/30518 wystarczy otworzyć port żeby linia DTR się uaktywniła
"Opening the tty port should raise DTR if the bit rate is non-zero so stty 9600 -hupcl < /dev/ttyS0 should do it.
Use stty hupcl if you want to turn if off after close. sleep 1 < /dev/ttyS0 to pulse it for about a sec."
Tu jest spory kawałek kodu w pytonie:
ftp://ftp.ti.com/pub/data_acquisition/A ... alposix.py
Do zabawy portem szeregowym przymierzałem się już od jakiegoś czasu ale ja od razu użyję mikrokontrolera i maxa232 z czymś prymitywnym w rodzaju sterowania/protokołu. Do tego sterowanie przez www - myślałem nad apache i cgi albo shell_exec z własną binarką. Na razie czasu brak.