Ir ao conteúdo
  • Cadastre-se
Gabriel G.S. 1023

RESOLVIDO Aterramento de dígito no positivo

Recommended Posts

Saudações,

Estou com uma dúvida cruel. Estou montando um display 7 digitos **catodo** comum e a situação é a seguinte:

O microcontrolador(Arduino[Por favor não movam este tópico para lá]) possui suas saídas fornecendo tensão positiva,até aí beleza,porque os 7 segmentos do display são anodo,ou seja,precisa-se de terminais positivos. Mas o problema é que:

Esses display possuem 7 segmentos por dígito,como na imagem:right.png.4f6a159bb3423d50919e9fbe76cccc69.png

O que faz a corrente fluir é a conexão com o terra do circuito,maaaaasss: O Arduino só possui saídas positivas - não tem condições de 'ativar' o pino e fazer aterramento para que os led's se acendam. Mesmo que eu aterra no próprio terra da placa todos os led's se acenderiam(conforme eu acionasse o A,B,C,D,etc.. de cada dígito),e eu não quero que isso aconteça,já que estou trabalhando com alimentação chaveada,que vai funcionar na seguinte maneira: Eu aterro o primeiro digito,mapeio todos os segmentos123.png.ab8208c7cfdfa5a7b5a204d5d9d591da.png 

Por exemplo,eu quero que apareça no visor o número 13: Aterrar o primeiro dígito ; Acionar segmento B (como na imagem) ; Desligar segmento B; Acionar segmento C; Desligar segmento C; Desaterrar primeiro dígito; Aterrar segundo dígito ; E como no primeiro dígito,ligar os segmentos A, B, C, D, G, sendo que cada um deve ser desligado após o seu acionamento;

Assim ficaria uma alimentação chaveada,dando o efeito POV (Persistência da visão,em PT-BR) e não sobrecarregaria a placa.

Mas como disse,esse aterramento e desaterramento dos dígitos não podem ser feitos a partir da tensão positiva que os terminais ''microcontrolados" do Arduino fornecem.

Eu estava pesquisando e vi que os caras colocavam na pinagem o aterramento no positivo mesmo,e diz eles que davam certo,mas não tem lógica nenhuma,até porque já fiz testes.

Alguém me da uma luz!!!

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

O tal efeito pov você precisa fazer uma varredura duns 20Hz pra cada display. Pra isso use - pesquise - sobre interrupção dum timer qualquer

microcontrolador_PIC_pratica4_fig3.pngassim...

14 minutos atrás, Gabriel G.S. 1023 disse:

podem ser feitos a partir da tensão positiva que os terminais ''microcontrolados" do Arduino fornecem

(tá faltando R)

Compartilhar este post


Link para o post
Compartilhar em outros sites

O propósito é exatamente esta mas a situação que comentei continua do mesmo jeito,já que eu terei que chavear o aterramento.

18 minutos atrás, Isadora Ferraz disse:

 

"(tá faltando R)" 

??????

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

R esistores.

2 minutos atrás, Gabriel G.S. 1023 disse:

chavear o aterramento

No caso de display multiplexado, isso se chama

21 minutos atrás, Isadora Ferraz disse:

varredura

e sinto te informar que é obrigatória.

Pelo que reentendi você quer acionar um (unzinho) segmento de cada vez, é isso? De fato não precisa já que vai ter que usar 8 saídas pros segmentos, acione de 8 em 8 uai.

Já a técnica de acionar um a um até que existe mas num caso avançado (que penso não ser o seu). É pra quando há limitação de potência ou corrente do buffer... algo quando a soma delas - dos pinos - ultrapassa a máxima que o ci fornece no total. (não reexplico)

adicionado 3 minutos depois
45 minutos atrás, Gabriel G.S. 1023 disse:

O Arduino só possui saídas positivas - não tem condições de 'ativar' o pino e fazer aterramento para que os led's se acendam.

Ah sim... você se engana. Sim qualquer mc ativa o zero (ou terra) nos terminais. Basta colocar o anodo no + e catodo nesta saída ativa em zero. (De novo ... falta R)

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
3 horas atrás, Gabriel G.S. 1023 disse:

O Arduino só possui saídas positivas

Quem disse?

Qualquer CI lógico quando está em zero está conectado ao negativo, Arduíno segue o mesmo sistema.

 

3 horas atrás, Gabriel G.S. 1023 disse:

Mas como disse,esse aterramento e desaterramento dos dígitos não podem ser feitos a partir da tensão positiva que os terminais ''microcontrolados" do Arduino fornecem.

Nesse caso deve usar os transistores, igual aparece no exemplo acima postado pela @Isadora Ferraz .

Vai te facilitar na programação, pois quando a saída do Arduíno ficar positiva pra acender o display, o transistor vai conectar o catodo do display ao terra.

Isso também irá ajudar a não sobrecarregar seu arduíno, já que a corrente consumida pelos displays vai passar pelos transistores.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Galera,resolvi o problema!!!!!!!!!!!!

Eu estava programando um "computador de bordo" para a bicicleta,aí eu estava testando o giro da roda com cliques do botão,se bati muito para que quando o botão fosse apertado contasse somente uma vez á variável var02,mas esse trecho excluí do código pois era somente teste do que o receptor infravermelho deveria fazer ao detectar o led infravermelho implantado na roda (quem não tem cachorro caça com gato ~não tenho censor hall nem imã). Consegui resolver esse problema do botão,mas eu fiquei com isso na cabeça o dia todo,como qualquer coisa que aprendo e acho interessante. De repente eu me toco que para o Arduino detectar o toque do botão ele tem que fazer aterramento,COM O pinMode INPUT!!!!!!!!!!!!

EUREKA!!!!!!!! Depois de tanto tempo pesquisando o que é velocidade linear,raio,circunferência,pra tentar programar e fazer algo que funcione;testei agora e deu certo,vocês sempre estavam certos,da pra fazer o aterramento

Ps: Código abaixo não tem ctrl + C e ctrl + V,gosto de escrever os nomes das variáveis em inglês mesmo.

#define a 13
#define b 12
#define c 11
#define d 10
#define e 9
#define f 8
#define g 7
#define pd 10
#define rcv_pn 2
#define terra_1 4
#define terra_2 3
#define pi 3.14159265359
int rtimer = 0;
int timer = 0;
int ic = 0;
int apt;
int velo;
bool var01; // Registro de volta
int var02; //Contador de volta
int var03; //
int vdezena;
int vuni;
bool retract_button =  true;
bool press_button = false;
bool countered;
int media;
bool dispn[11][7] = {
  {1,1,1,1,1,1,0},   // 0
  {0,1,1,0,0,0,0},   // 1
  {1,1,0,1,1,0,1},   // 2
  {1,1,1,1,0,0,1},   // 3
  {0,1,1,0,0,1,1},   // 4
  {1,0,1,1,0,1,1},   // 5
  {1,0,1,1,1,1,1},   // 6
  {1,1,1,0,0,0,0},   // 7
  {1,1,1,1,1,1,1},   // 8
  {1,1,1,1,0,1,1},   // 9
  {0,0,0,0,0,0,1}    // Símbolo -;
};
unsigned short int portmap[7] = {a,b,c,d,e,f,g};
inline void disp(const int decimal,const int numeric){
  int i = 0;
  pinMode(terra_1,OUTPUT);
  pinMode(terra_2,INPUT);
  while(1){
    if(i >= 7){
    digitalWrite(g,0);
    break;
    }
    digitalWrite(portmap[i],dispn[decimal][i]);
    digitalWrite(portmap[--i],0);
    i += 2;
  }
  i = 0;
  pinMode(terra_1,INPUT);
  pinMode(terra_2,OUTPUT);
  while(1){
    if(i >= 7){
    digitalWrite(g,0);
    break;
    }
    digitalWrite(portmap[i],dispn[numeric][i]);
    digitalWrite(portmap[--i],0);
    i += 2;
  }
  
  i = 0;
}
void setup() {
  pinMode(a,OUTPUT);
  pinMode(b,OUTPUT);
  pinMode(c,OUTPUT);
  pinMode(d,OUTPUT);
  pinMode(e,OUTPUT);
  pinMode(f,OUTPUT);
  pinMode(g,OUTPUT);
  //Serial.begin(2000000);
}
void loop() {
timer = millis();
press_button = digitalRead(rcv_pn);
if(press_button != retract_button){
  if(press_button == false && retract_button == true)
  var02++;
 }
retract_button = digitalRead(rcv_pn);
if(timer - rtimer >= 1000){ //each one                                                                                                                second
  velo = ((207.345 * var02)/100) * 3.6;
  if(velo - media > 3){
    media = velo;
  }
  media = (velo + media) / 2;
  */
  /*Serial.println("-------------------------------------------------------------------");
  Serial.print("Media: ");
  Serial.print(media);
  Serial.print("     Var02: ");
  Serial.println(var02);
  
  rtimer = millis();
  var02 = 0;
  vdezena = media / 10;
  vuni = media - vdezena;
  /*Serial.print("vdezena: ");
  Serial.print(vdezena);
  Serial.print("          Vuni: ");
  Serial.println(vuni);
  Serial.println("-------------------------------------------------------------------");
  */
  
  disp(vdezena,vuni);
 
}else
  disp(vdezena,vuni);
}
 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×