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