Componentes Eletronicos

Maker Special Day: Dia dos Namorados

Eletrogate 11 de junho de 2021

Introdução

Já pensou em unir seu lado Maker com alguma data comemorativa e criar um presente único? Se a resposta for sim, você também pensa como nós e por isso aproveitamos o Dia dos Namorados para te mostrar como criar um presente simples, mas visualmente muito bonito para presentear quem você ama. Veja a seguir:


A Técnica Charlieplexing

Nosso projeto de hoje consiste num coração de leds que faz uso de uma técnica de multiplexação conhecida como Charlieplexing, que nos permite controlar um número n de LED’s fazendo uso de poucas portas digitais do microcontrolador. Essa técnica consiste em alterar, via programação, o sentido da corrente elétrica nos pinos de saída e, consequentemente, direcionar essa corrente a um ponto específico do circuito.  O número de LED’s que podemos controlar com um determinado número de pinos se dá pela fórmula n² – n, onde n representa a quantidade de pinos que vamos utilizar e o resultado o número máximo de LED’s permitidos no arranjo.

Por exemplo, se desejamos utilizar 3 pinos do Arduino para controlar o número máximo possível de LED’s, o cálculo seria:

n² – n -> 3² – 3 -> 9 – 3 = 6

Ou seja, usando 3 pinos digitais do Arduino aplicados à Charlieplexing, podemos controlar até 6 LED’s, dispostos da seguinte forma:

Arranjo para Charlieplexing com LED’s iguais. Fonte: Wikipédia

É importante ressaltar que o arranjo acima só deve ser usado quando todos os LED’s forem iguais. Caso sejam diferentes, utilize o seguinte arranjo:

Arranjo para Charlieplexing com LED’s diferentes. Fonte: Wikipédia

Se quiser, você pode montar o circuito acima e carregar o código abaixo em seu Arduino, para entender melhor como essa técnica funciona.

/*
- Arduino & Chralieplexing
- Driving 6 LEDs using only 3 I/O Pins
- Tri-State Logic Implementation
- Demo Code From Internet
- Prepared by T.K.Hareendran
- Tested at TechNode Protolabz
- Source: https://www.electroschematics.com
*/
#define LED_1 5
#define LED_2 6
#define LED_3 7

void setup()
{
   pinMode(LED_1, INPUT);
   pinMode(LED_2, INPUT);
   pinMode(LED_3, INPUT);
}

void loop()
{
   set_pins(LED_1, LED_2);
   delay(100);
   set_pins(LED_2, LED_1);
   delay(100);
   set_pins(LED_3, LED_1); 
   delay(100);
   set_pins(LED_1, LED_3);
   delay(100);
   set_pins(LED_2, LED_3);
   delay(100);
   set_pins(LED_3, LED_2);
   delay(100); 
}

void set_pins(int high_pin, int low_pin)
{
   reset_pins();
   pinMode(high_pin, OUTPUT);
   pinMode(low_pin, OUTPUT);
   digitalWrite(high_pin, HIGH);
   digitalWrite(low_pin,LOW);
}

void reset_pins()
{
   pinMode(LED_1, INPUT); 
   pinMode(LED_2, INPUT);
   pinMode(LED_3, INPUT);
   digitalWrite(LED_1, LOW);
   digitalWrite(LED_2, LOW);
   digitalWrite(LED_3, LOW);
}

Fonte: Electroschematics


Montando o Circuito

Esse projeto é baseado no tutorial criado por Jimmie Rodgers (você pode acessá-lo clicando aqui) e, para a montagem do nosso circuito de dia dos namorados, você vai precisar dos seguintes componentes:

Materiais necessários para o projeto de dia dos namorados

cta_cart

O esquemático de todas as ligações você pode conferir na imagem abaixo. Se tiver dúvidas sobre a interpretação de um esquemático técnico, sugiro que leia nosso artigo sobre o assunto.

Esquemático de conexão do circuito

Montagem na placa

A montagem do coração é relativamente simples, mas requer um pouco de atenção na hora de fazer as conexões. Comece posicionando os LED’s na placa seguindo a imagem abaixo:

Disposição dos LED’s na placa

Para as trilhas, você pode usar fios ou criá-las usando estanho. Fique atento aos pontos de conexão ilustrados no diagrama e cuide para que não haja nenhum curto circuito. Não se esqueça também de verificar a polaridade dos LED’s!

Conexões da placa

Com os LEDs soldados, adicione os resistores e o conector. Note que as ilhas de solda se encontram na parte inferior da placa, nos forçando a fazer uma pequena alteração nos conectores. Você deve deixá-los como na imagem abaixo:

Alteração nos conectores para permitir a conexão na placa

Feito isso, seu circuito estará pronto! Com o auxílio de um multímetro, faça todos os testes necessários para garantir que não existam curtos circuitos e que todos os LED’s estão polarizados corretamente:

Teste de conexões


Código

Com todos os passos acima concluídos, chegou a hora de carregar o código do projeto. Copie e cole-o em sua IDE e faça o upload para seu Arduino:

//**************************************************************//
//  Name    : Charlieplexed Heart control                       //
//  Author  : Jimmie P Rodgers   www.jimmieprodgers.com         //
//  Date    : 08 Feb, 2008  Last update on 02/13/08             //
//  Version : 1.3                                               //
//  Notes   : Uses Charlieplexing techniques to light up        //
//          : a matrix of 27 LEDs in the shape of a heart       //
//          : project website: www.jimmieprodgers.com/openheart //
//****************************************************************   //
#include <avr/pgmspace.h>  //This is in the Arduino library 
int pin1 =8;
int pin2 =9;
int pin3 =10;
int pin4 =11;
int pin5 =12;
int pin6 =13;
const int pins[] = {
  pin1,pin2,pin3,pin4,pin5,pin6};
const int heartpins[27][2] ={
  {pin3, pin1},
  {pin1, pin3},
  {pin2, pin1},
  {pin1, pin2},
  {pin3, pin4},
  {pin4, pin1},
  {pin1, pin4},
  {pin1, pin5},
  {pin6, pin1},
  {pin1, pin6},
  {pin6, pin2},
  {pin4, pin3},
  {pin3, pin5},
  {pin5, pin3},
  {pin5, pin1},
  {pin2, pin5},
  {pin5, pin2},
  {pin2, pin6},
  {pin4, pin5},
  {pin5, pin4},
  {pin3, pin2},
  {pin6, pin5},
  {pin5, pin6},
  {pin4, pin6},
  {pin2, pin3},
  {pin6, pin4},
  {pin4, pin2}
 };
 
 //Controle de brilho. Quanto menor o valor, mais escuro
int blinkdelay = 200;

//Controle de velocidade. Quanto menor o valor, mais rápido
int runspeed = 50;

//Array de animações
const byte heart[][27] PROGMEM ={
  
  {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
 
  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1},
  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,1,1},
  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,0,1,1,1,1},
  {0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,1,1,1,1,1,1,1},
  {0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1},
  {0,1,1,0,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},

  {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0},
  {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1},
  {1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,0,1,0,1,0,0,1,0,0},
  {1,1,1,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,0,1,0,1,1,0,1,1},
  {1,1,1,1,0,0,1,0,1,0,0,0,1,0,1,0,1,0,0,1,0,1,0,0,1,0,0},
  {0,1,1,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,0,1,0,1,1,0,1,1},
  {0,0,0,0,0,0,1,0,1,0,0,0,1,0,1,0,1,0,0,1,0,1,0,0,1,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,1,0,1,1,0,1,1},
  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1},
  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

  {0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0},
  {0,0,0,0,0,1,1,0,1,1,0,0,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0},
  {1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,1,1,1},
  {1,1,1,1,1,0,0,1,0,0,1,1,0,0,0,0,0,1,1,0,0,0,1,1,0,1,1},
  {1,1,1,1,1,0,0,1,0,0,1,1,0,0,0,0,0,1,1,0,0,0,1,1,0,1,1},

  {2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
};


void setup() {
 // blinkall(2); // Use para testes
}
void loop() {
 // sequenceon(); // Use para testes
play();
}
void turnon(int led) {
  int pospin = heartpins[led][0];
  int negpin = heartpins[led][1];
  pinMode (pospin, OUTPUT);
  pinMode (negpin, OUTPUT);
  digitalWrite (pospin, HIGH);
  digitalWrite (negpin, LOW);
}
  void alloff() {
  for(int i = 0; i < 6; i++)   {
    pinMode (pins[i], INPUT);
  }
}
void play() {
  boolean run = true;
  byte k;
  int t = 0;
  while(run == true)   {
    for(int i = 0; i < runspeed; i++)     {
      for(int j = 0; j < 27; j++)       {
        k = pgm_read_byte(&(heart[t][j]));
        if (k == 2)         {
          t = 0;
          
        }
        else if(k == 1)         {
          turnon(j);
          delayMicroseconds(blinkdelay);
          alloff();
        }
        else if(k == 0)         {
          delayMicroseconds(blinkdelay);
        }
      }
    }     t++;
  }
}
void blinkall(int numblink) {
  alloff();
  for(int n = 0;n < numblink;n++)   {
    for(int i = 0; i < runspeed; i++)     {
      for(int j = 0; j < 27; j++)       {
        turnon(j);
        delay(blinkdelay);
        alloff();
      }
    }
    delay(100);
  }
}
void sequenceon() {
  for(int i = 0; i < 27; i++)   {
    turnon(i);
    delay(800);
       alloff();
    delay(200);
     }
}

Créditos: Jimmie Rodgers

Feito isso, basta conectar a placa ao Arduino corretamente e seu presente Maker estará funcionando! Confira o resultado que obtivemos:


Conclusão

Apesar de ser um pouquinho trabalhoso nas conexões, esse é um projetinho simples de se fazer e que traz um resultado visual muito bonito. Esperamos que tenha gostado do projeto de hoje e não deixe de conferir as atualizações do blog. Em breve traremos mais novidades relacionadas à datas comemorativas!
Um feliz dia dos namorados a todos os casais da comunidade Maker e até a próxima!


Curtiu o post? Te convido a visitar a loja da Eletrogate e conferir todos os nossos produtos voltados ao Arduino e à robótica. Bão deixe de conferir também as atualizações do blog e se você fez o projeto ensinado, nos mostre o resultado pelo Instagram, basta seguir nossa página e nos mencionar na foto ou vídeo. Estamos curiosos para ver os projetos dos nossos leitores e clientes!

Conheça a Metodologia Eletrogate e ofereça aulas de robótica em sua escola!


Sobre o Autor


Samuel Martins
@samuel.martins192

Cursando Eletroeletrônica no SENAI CETEL. Fanático por eletrônica, automação, impressão 3D e afins, dedico meu tempo livre a pesquisas e projetos ligados às principais áreas de interesse, pratico aeromodelismo e sou curioso por astrofotografia.


Eletrogate

11 de junho de 2021

A Eletrogate é uma loja virtual de componentes eletrônicos do Brasil e possui diversos produtos relacionados à Arduino, Automação, Robótica e Eletrônica em geral.

Tenha a Metodologia Eletrogate dentro da sua Escola! Conheça nosso Programa de Robótica nas Escolas!

Eletrogate Robô

Cadastre-se e fique por
dentro de novidades!