sábado, 13 de dezembro de 2014

Arduino Charlieplexing LEDs


    Bom pessoal, vamos voltar um pouco ao foco desse blog que é justamente falar sobre arduino. Hoje eu lhes apresento o Charlieplexing.


    O termo " Charileplexing " não é familiar para muitos entusiastas da eletrônica. Charlieplexing é uma técnica proposta no início de 1995 por Charlie Allen (pelo Maxim Integrated ) para a condução de um display multiplexado em que relativamente poucos pinos de I / O em um microcontrolador são usados ​​para conduzir uma matriz de LEDs. Este método utiliza as capacidades lógicas tri-state de microcontroladores para ganhar eficiência ao longo multiplexing tradicional.

Muitas vezes, quando se trata de seu projeto Arduino , você nunca tem o suficiente de entrada / saída (I / O) pins em seu Arduino microcontrolador .

    Felizmente, você pode Charlieplex uma série de LEDs de algumas portas do Arduino , e salvar essas portas preciosas para algo realmente emocionante. Aqui, eu vou mostrar para você como para combinar perfeitamente um Arduino ea técnica charlieplexing !
Em princípio , a técnica Charlieplexing lhe permite conduzir " n² - n" LEDs usando apenas "n " Pinos do Arduino . Aqui , estamos usando três pinos para conduzir 3²-3 = 6 LEDs. Note-se que , nós definindo pins relacionados ( D5- D6- D7) do Arduino a um dos três estados (lógica tri-state ) :

  • High (5V)
  • Low (0V)
  • Alta impedância

Logic Tri -State ? 

Em electrónica digital a lógica de três estados permite que uma porta de saída para assumir um estado de alta impedância ( Z ) , em adição à alta ( H ) e baixo ( L ) níveis lógicos , removendo eficazmente a saída do circuito . Isso permite que vários circuitos para compartilhar a mesma linha de saída ou linhas.

Abaixo segue o esquemático das ligações feita no arduino.



Código:

 int ledPins[] = {5,6,7};  
 const int NUMBER_OF_PINS = sizeof(ledPins)/sizeof(ledPins[0]);  
 const int NUMBER_OF_LEDS = NUMBER_OF_PINS * (NUMBER_OF_PINS - 1);  
 byte ledPairs[NUMBER_OF_LEDS/2][2] = {{2,1}, {1,0}, {2,0}};  
 void setup() {  
 }  
 void lightLed(int led) {  
  int indexA = ledPairs[led/2][0];  
  int indexB = ledPairs[led/2][1];  
  int ledPinA = ledPins[indexA];  
  int ledPinB = ledPins[indexB];  
  for(int i = 0; i < NUMBER_OF_PINS; i++) {  
   if (ledPins[i] != ledPinA && ledPins[i] != ledPinB) {  
    pinMode(ledPins[i], INPUT);  
    digitalWrite(ledPins[i], LOW);  
   }  
  }  
  pinMode(ledPinA, OUTPUT);  
  pinMode(ledPinB, OUTPUT);  
  if (led % 2 == 0) {  
   digitalWrite(ledPinA, LOW);  
   digitalWrite(ledPinB, HIGH);  
  } else {  
   digitalWrite(ledPinA, HIGH);  
   digitalWrite(ledPinB, LOW);  
  }  
 }  
 void loop() {  
  for (int i = 0; i < NUMBER_OF_LEDS; i++) {  
   lightLed(i);  
   delay(1000);  
  }  
 }  

Nenhum comentário:

Postar um comentário