anonymous@RULINUX.NET~# | Last login: 2024-08-24 23:09:22 |
Регистрация Вход | Новости | Разметка | Пользователи | Галерея | Форум | Статьи | Неподтвержденное | Трекер | Правила форума | F.A.Q. | Ссылки | Поиск |
Форум - Talks | [RSS] |
Для тех кто хочет сделать вот такую штуку, очень краткий мануал, пара ссылок и исходник.
http://lor-ng.org/message.php?newsid=243&fid=-1
Есть несколько вариантов подключения диодов к LPT. Самый простой - 8 штук, к пинам данных это пины 2-9, если лень искать пинаут. Можно сделать и посложнее, матрицей, это от 16 до 36ти диодов выйдет.
Рассмотрим первый вариант. тупо 8 диодов к дата выводам.
Теория для совсем далеких от этого дела: LPT, параллельный порт. Очень и очень просто из программы можно рулить напряжением на отдельных пинах или считывать что на них подается. )зависит от того на ввод работает пин или на выход. Некоторые пины могут работать как на вход, так и на выход, некоторые только на вход, некоторые только на выход. Более подробно теорию читаем тут: http://parapin.sourceforge.net/doc/parapin.html Там же можем забирать либу для очень удобного руления лпт портом из программы. Если на пин мы выставили единицу, то там будет порядка +3,7 вольт. Ток до 25 милиампер LPT держит нормально. Исходя из этих параметров подбираем резистор и светодиод.
Вариант подключения один. Резистор последовательно со светодиодом подключается между пином работающим на вывод (например дата[n]) и землей. И так 8 штук.
Вариант 2. матрицей. Этот способ хитрозадее, так как позволяет подрубить 16 диодов только при помощи 8 пинов. Но это потребует немного усложнить программное обеспечение. Итак, пускай светодиод одним концом воткнут к выводу дата0 (+), а другим в дата7(-). Условие его зажигания: 3,7 вольт (1) на плюсе, 0 на минусе. мы должны в цикле очень быстро "сканировать" матрицу, зажигая поочередно те диоды, которые по должны в этот момент гореть,
Вариант3. более хитрозадой матрицей. вместо каждого диода предыдущего варианта ставим два, только поменяв на одном полярность. когда на дата0 1, а на дата7 - 0, то горит один из них. а на дата7 - 1, дата0 - 0, горит другой. Таким образом суммарное количество подключенных диодов умножаем еще на два. (хватит чтобы мониторить серверную стойку)
Далее. Теперь исходники. Можете юзать парапин, там все придельно просто. Можно напрямую через ioperm, а далее писать в регистры лпт. Кому что больше нравится. Лично я быстренько набросал для сервака две компоненты: ledserver и led_set
Первая из них работает от рута (нужно если хотим писать в лпт), читает из шареной памяти периодически желаемые статусы диодов и выставляет их, а вторая, которая работает и в юзермоде вызывается из баш скриптов, которые и мониторят через ps aux|grep чототам|wc -l всякое разное. например led_set 3 1 (врубает третий диод).
Вот и весь трюк. сырцы квик энд дирти, ибо торопился в тот момент, но там не сложно понять.
юзермод клиент:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/io.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> typedef struct { int mode; char status[8]; } mode_str_t;
int main(int argc, char* argv[]) { key_t key = ftok("/tmp/lptled", 0); int mem = shmget(key, 1024, IPC_CREAT | 0666); mode_str_t* setup = shmat(mem, NULL, NULL); int nmd; int st; sscanf(argv[1],"%d",&nmd); sscanf(argv[2],"%d",&st); //setup->mode = nmd; setup->status[nmd]=(st<<nmd); printf("led %d is %d ",nmd, st); exit(0); }
сервер:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/io.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h>
#include <fcntl.h>
#define BASEPORT 0x378 /* lp1 */
typedef struct { int mode; char status[8]; } mode_str_t;
int main() { int pid = fork(); if (pid) { exit(0); printf("Forked!"); } char c; int n, tem; key_t key = ftok("/tmp/lptled", 0); int mem = shmget(key, 1024, IPC_CREAT | 0666); mode_str_t* setup = shmat(mem, NULL, NULL); printf("md is %d ",setup->mode); bzero(setup,sizeof(mode_str_t)); setup->mode = 1;
if (ioperm(BASEPORT, 3, 1)) {perror("ioperm"); exit(1);}
tem = fcntl(0, F_GETFL, 0); fcntl (0, F_SETFL, (tem | O_NDELAY)); int i; int load = 0; double avg[3]; char out=0; int time=0;
while (1) { //n = read(0, &c, 1); //if (n > 0) break;
switch (setup->mode) { case -1: outb(~0, BASEPORT); exit(0); break; case 0: outb(~0, BASEPORT); sleep(1); break;
case 1: for (i=0;i<=8;i++) { out+=((1 << i) & setup->status[i]); outb(~out, BASEPORT); usleep(500000); } setup->mode=2 ; break;
case 2: for (i =0;i<=8;i++) { outb(~((1 << i) & setup->status[i]), BASEPORT); usleep(50000);
} for (i=8;i>=0;i–) { outb(~((1 << i) & setup->status[i]), BASEPORT); usleep(50000); } break;
case 3: for (i =0;i<=8;i++) { outb(~(1 << i), BASEPORT); usleep(50000); } break;
case 4: for (i=8;i>=0;i–) { outb((1 << i), BASEPORT); usleep(50000); } break;
case 5: outb(255, BASEPORT); usleep(50000); outb(0, BASEPORT); usleep(50000); break;
default: outb((setup->mode-10),BASEPORT); usleep(50000); break; }
//printf("md is %d ",setup->mode); }
fcntl(0, F_SETFL, tem); outb(0, BASEPORT);
if (ioperm(BASEPORT, 3, 0)) {perror("ioperm"); exit(1);}
exit(0);
}
Примеры для 8ми диодов. матрицу я не делал. Светодиоды на сервере в сортире у меня инвертированы... не помню уж с какого перепоя так сделал. Так что подправите сырец как кто хочет, рпазобраться не сложно. Вопросы - стучитесь в жаббер подскажу. Но тут все предельно просто.
AiFiLTr0(*) (2009-08-30 21:51:00)
Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.12) Gecko/2009072221 Iceweasel/3.0.12 (Debian-3.0.12-1)
|
|
|
![]() |
Скрыть
Re: [REQUEST] Для тех, кто реквестировал.Так и знал, что там ioperm и outb прям в LPT, а не что то вроде libiee1284. З.Ы. Была ещё какая то консольная утилита, parashell или как то так, которая позволяла управлять портом прям из командной строки, но там тоже outb. |
![]() |
![]() |
AiFiLTr0(*)(2009-08-31 01:01:34)
Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.12) Gecko/2009072221 Iceweasel/3.0.12 (Debian-3.0.12-1) |
|
|
|
Этот тред читают 1 пользователь: |
Анонимных: 1 Зарегистрированных: 0 |
Re: [REQUEST] Для тех, кто реквестировал.
Порваный боян.
Mozilla/5.0 (X11; U; Linux i686; ru-RU; rv:1.9.1.2) Gecko/20090828 Mandriva Linux/1.9.1.2-1.1mdv2009.1 (2009.1) Firefox/3.5.2