Esse final de semana eu tirei para iniciar meu estudo em eletrônica, alguns amigos da minha faculdade estão fazendo um projeto de controle elétrico da casa via computador e eu aproveitando essa onda começo a aprender eletrônica.

Buscando pela internet achei vários tutoriais passo-a-passo de como fazer algumas ligações e uma me chamou bastante atenção, pois era bem barato e eu já possuia o item mais caro em casa.

Tendo o cabo paralelo que custa por volta de R$ 5 já me deu um animo de tentar iniciar nisso já que o gasto com o resto dos materiais seria mínimo.

Na saída do trabalho fui andando até uma loja de eletrônica e comprei 10 LEDs (R$ 2,50), 10 resistores de 470 ohms (R$ 1,50) e 2 metros de fio de telefone dobrado (R$ 0,40). Peguei emprestado um protoboard com um amigo da faculdade e com apenas R$ 4,40 comecei a brincadeira.

No protoboard eu liguei os resistores em séries com o positivo do LED e o lado negativo eu liguei tudo numa linha só, que será ligado ao GROUND na porta paralela.

Os resistores eu liguei das saídas 2 até a saída 9 da porta paralela, e o ground ficou ligado na saída 25.

Ligando leds pela porta paralela

Com isso já estava com tudo pronto pra começar a programar. Quando liguei o cabo paralelo no computador vi o triste resultado, um único LED aceso e nada do código em C que eu havia pego pronto na net funcionar. Reiniciei e fui ao Windows e nada de ter porta paralela funcionando por lá também, então dei uma fuçada no BIOS e por acaso a porta paralela estava Disabled :P

Voltando ao Linux e executando o software os LEDs já funcionavam perfeitamente, então agora era a segunda missão, entender como funcionava o software.

Daí depois de entendido criei meu próprio controle dos LEDs, bem simples mesmo só para vê-los “dançando”, segue o código e em seguida a explicação:

  1. #include <stdio.h>
  2. #include <sys/io.h>
  3. int main()
  4. {
  5.     int i =1;
  6.     int led = 1;
  7.     int flag = 0;
  8.     ioperm(0×378,3,1);
  9.     outb(0×00, 0×378);
  10.  
  11.     while(i++ <= 128) {
  12.         outb(led, 0×378);
  13.  
  14.         if(led == 128) flag = 1;
  15.         else if(led == 1) flag = 0;
  16.  
  17.         led = (flag == 0) ? led * 2 : led / 2;
  18.  
  19.         usleep(70000);
  20.     }
  21.  
  22.     for(i=1; i<=255; i++) {
  23.         outb(i, 0×378);
  24.         usleep(70000);
  25.     }
  26.  
  27.     for(i=0; i<=15; i++) {
  28.         if(flag == 1) {
  29.             flag = 0;
  30.             outb(255, 0×378);
  31.             usleep(100000);
  32.         } else {
  33.             flag = 1;
  34.             outb(0×00, 0×378);
  35.             usleep(100000);
  36.         }
  37.     }
  38.  
  39.     for(i=255; i>0; i–) {
  40.         outb(i, 0×378);
  41.         usleep(70000);
  42.     }
  43.  
  44.     outb(0×00, 0×378);
  45.     return 0;
  46. }

As funções que devem ser explicadas são somente a ioperm() e outb(), a primeira (ioperm) libera permissão para acessar a porta especificada, a segunda (outb) envia os bits para a porta paralela, que no caso do meu programa é enviado um número decimal mesmo que é equivalente ao número em bits.

Um exemplo de funcionamento é caso seja enviado 6 para o outb() que equivale a 00000110, nesse caso se acenderiam o segundo e o terceiro LED. Simples não?

Um vídeo desse meu código sendo executado:

Uma pena a qualidade ter ficado tão ruim, filmar de madrugada mesmo com a luz acesa não fica tão bom.

O conteúdo te ajudou de alguma forma? Que tal retribuir me pagando um café?

Gostou desse post? Compartilhe:
  • Facebook
  • Rec6
  • Tumblr
  • Posterous
  • del.icio.us
  • Add to favorites
  • LinkedIn
  • Google Bookmarks
  • RSS

Conteúdos relacionados