quinta-feira, 30 de outubro de 2014

Atualização do projeto de emulador de interface de disquete (#12) - Pagando pelos pecados.

Olá,

Após um longo período sem postar nada no blog sobre o meu projeto de emulador de interface de disquete para o MSX eu finalmente volto a escrever sobre o tema. O motivo para isto foi a grande quantidade de problemas que encontrei para retirar o projeto do protoboard e leva-lo para uma forma mais definitiva. Abaixo segue as agruras pelo qual passei para sair de um ponto ao outro. Eu trago este relato na esperança de que as minhas experiências descritas abaixo possam ser de utilidde para alguém para evitar que passem pelo mesmo processo sofrido pelo qual passei.

Pois bem, em Novembro de 2013, eu alcancei um estágio em que o circuito estava funcionando muito bem no protoboard e eu senti a necessidade e a vontade de projetar e produzir uma placa de circuito impresso para o projeto. Após umas duas semanas de trabalho eu alcancei o design de uma placa de circuito impresso que eu passei a chamar de revisão A. Boa parte do tempo gasto no design desta placa foi tentando criar um design que me fosse possível produzir a placa em casa mas eu cheguei a conclusão que, apesar de eu conseguir produzir PCIs com ótima qualidade ainda assim não era o suficiente para a produção desta placa em especifico. Ou seja, eu precisava contratar o serviço de uma empresa para fazer a placa para mim.

Meu objetivo era o de produzir 3 placas de circuito impresso. Eu me lembro que eu pedi o orçamento para três empresas especializadas e foi aí que começaram meus problemas. Este tipo de empresa te fornece uma quantidade mínima de placas de normalmente 10 ou 20 placas por pedido a um custo que estava girando na época em torno de R$ 650,00 à R$ 750,00. Eu realmente não estava interessado em ficar com um monte de placas de circuito impresso. Então eu comecei a procurar por alternativas e acabei encontrando o site OSHPark (https://www.oshpark.com/).

Este é um site americano voltado para ajudar quem está criando projetos de hardware open source a obter protótipos dos seus projetos. Este site requer que você compartilhe seu design com os usuários do site e após você publicar seu projeto no site qualquer um pode emitir pedidos para a criação de protótipos. Além disto há uma restrição no site que a quantidade de placas no pedido deve ser múltipla de 3, ou seja, você deve pedir 3 ou 6 ou 9 placas, etc. Para mim este site encaixou como uma luva, pois eu queria três placas e o meu projeto é open source. Então eu coloquei o pedido no site a um custo em torno de R$ 350,00 (U$ 118,55 + U$25,00 USPS Priority Mail) na época.

Eu realmente fiquei surpreso com a qualidade do atendimento do site. Após efetuar o pagamento e em cada etapa do processo o site foi atualizando o status do pedido me informando a cada passo o que estava ocorrendo. E, apesar do site informar que as placas são fabricadas sob demanda e que dependendo do volume de pedidos as placas para serem produzidas podem demorar mais ou menos tempo, as minhas placas demoraram um tempo que eu achei relativamente curto. Eu coloquei o pedido no dia 29/11/2013 e as placas foram despachadas no dia 09/12/2013. Obviamente que o problema após as placas terem sido despachadas foi a nossa querida e amada (Sic) EBCT que demorou mais de dois meses para entregar o produto.


Mas as placas chegaram e novamente fiquei positivamente surpreso com a qualidade da PCI conforme mostrado na foto acima. A máscara de solda púrpura é uma característica do site OSHPark. O site é todo construído nesta mesma cor.

Claro que eu fiquei bastante agitado com a chegada das placas. Eu tratei logo de soldar os componentes na placa e testar a minha plaquinha e... Não funcionou. :-(

Após algum tempo investigando o porque eu percebi que cometi um erro grave. O tempo todo que eu testei o circuito no protoboard eu usei o CPLD EPM3064 versão PLCC 44 pinos. Quando eu desenvolvi a placa eu resolvi usar a versão TQFP 44 pinos do mesmo chip. Sendo que, apesar de fisicamente a posição dos sinais em ambos os chips ser rigorosamente a mesma a forma como os pinos são contados em um encapsulamento e no outro são diferentes conforme podemos ver na imagem abaixo.


No Kicad eu desenvolvi para EESchema um componente EPM3064 levando em consideração a pinagem do PLCC 44 pinos mas na hora de associar o footprint eu associei o footprint do TQFP 44 pinos. Com isto os sinais ficaram deslocados em 6 posições na PCI e obviamente isto não poderia funcionar. Além deste problema eu cometi algumas falhas no diâmetro de furos dos componentes e dos furos de fixação da placa na caixa do Carchano o que dificultou bastante a fixação dos componentes e os furos de fixação eu tive que alargar um pouco para que a mesma encaixasse na caixa corretamente.

Triste mas resoluto eu parti para a criação do design da revisão B da placa corrigindo todos os erros que eu havia cometido na revisão A o que me tomou mais um par de semanas para concluir. Desta vez eu queria a placa em minhas mãos mais rapidamente e na época eu tomei conhecimento de um site nacional com o princípio de funcionamento mais ou menos parecido com o OSHPark. O site que eu estou me referindo é o http://pci.eletronica.org/ que no momento desta postagem está informando que o site está suspenso por tempo indeterminado.

O princípio de funcionamento deste site é mais ou menos o mesmo do site OSHPark. Você envia o design da placa em formato Gerber e o site calcula o preço da placa para você. Na PCI Eletrônica não havia a restrição de múltiplo de 3 placas mas mesmo assim eu pedi três placas porque é o que eu sempre quis: três placas que funcionassem. O custo final ficou em torno de R$ 550,00 na época, ou seja, mais caro que no site OSHPark e foi após pagar o valor que os problemas começaram.

Quando eu emiti a ordem no site o status do meu pedido ficou como (Aguardando aprovação de pagamento). Uma semana após eu ter pago pelo pedido continuava a mesma coisa. Eu mandei um e-mail no qual eu fui respondido informando que o site estava com problemas mas que eles haviam já detectado o meu pagamento e que "muito em breve" eles estariam produzindo a placa. Mais uma ou duas semanas (não me lembro mais o tempo exato) sem nenhum e-mail ou alteração do status do meu pedido eu mandei um e-mail reclamando da demora. Novamente fui respondido só que desta vez eu fui informando que os meus arquivos Gerber estavam com problema e que por isto eles ainda não haviam mandado a placa para produção.

A partir daí eu passei a trocar uma série de e-mails com a "área técnica" da empresa. Inicialmente eu fui informando que os arquivos não estavam abrindo e sugeriram que eu instalasse um programa chamado viewplot que era o programa que eles usavam para verificar os arquivos Gerber que eles recebiam. Instalei o software e não vi qualquer problema nos meus arquivos neste software. Então eles me pediram um par de vezes que eu mandasse os arquivos novamente e no final pediram que eu mudasse a unidade de medida de polegadas para milímetros e que mudasse o formato dos números para ponto fixo. Tudo feito ainda demorou mais umas duas semanas para eles me mandarem as placas e me entregarem o código de rastreamento. Mais umas 3 semanas por conta da nossa querida e amada EBCT (Sic) e finalmente a placa chegou conforme podemos ver na foto abaixo. O processo todo demorou mais de 3 meses entre colocar o pedido no site e efetivamente receber as placas na minha casa.


A PCI.Eletrônica me enviou o dobro de placas que eu havia pedido sem nenhum custo adicional para mim, o que foi um pequeno plus com relação ao que eu queria porque acabou que eu fiquei com uma quantidade de placas acima do que eu queria. Devo dizer que a qualidade da placa é muito boa e inclusive eles se deram ao trabalho de estanhar os contatos da placa, o que não aconteceu com as placas da OSHPark. Um problema com as placas foi que o corte do contorno da placa que eles fizeram ficou em torno de 1,5 mm maior do que eu havia especificado. Com isto eu tive que desbastar o excesso de placa nas laterais porque o design da placa que eu fiz ocupa todo o espaço da caixa do Carchano e com este excesso eu não estava conseguindo encaixar a placa na caixa.

Me pus novamente a soldar os componentes na placa. Desta vez tanto o PIC como o CPLD foram reconhecidos e aceitaram a programação dos seus respectivos programadores. Para fazer um teste inicial eu coloquei a placa sem o painel de controle no meu MSX e eu puder ver que o MSX estava mostrando as mensagens da EEPROM presente na placa - bom sinal. Então eu colouque o painel de controle e... Não funcionou. :-(

Pior, depois que eu coloquei o painel tanto o PIC, como o CPLD pararam de responder aos seus respectivos programadores. Sendo que acabaram-se os CPLD´s com encapsulamento TQFP 44 pinos em casa. Além disto claramente o display de LCD também ficou danificado e eu tive que trocar o display.

Novamente me pus a investigar o problema e percebi que eu inverti a pinagem da alimentação entre o painel de controle e a placa principal. Eu resolvi este problema simplesmente trocando a posição dos fios no cabo flat.

O problema agora era que se acabaram os CPLD´s. No site da Farnel Brasil não havia mais em estoque. Pedi para orçar. Esperei uma semana e nenhuma resposta da Farnell. Fui no Ebay e comprei os CPLD´s e mais alguns componentes no dia 15/08/2014 sendo que até o momento desta postagem estes componentes mantém o status no site do Correios conforme podemos ver abaixo:


Bem, no meio da minha frustação e após um mês eu ter pedido para orçar o componente eu recebi um e-mail da Farnell com o bendito orçamento. Aprovei e paguei o orçamento e por volta de meados de Outubro/2014 eu recebi os CPLDs em casa.

Soldei e programei o CPLD. Chequei vinte vezes tudo novamente só para ter certeza. Pluguei o cartucho no meu Expert e... FUNCIONOU!!!

Finalmente eu consegui colocar o meu "Emulador de Interface de Disco" para funcionar com a placa de circuito impresso revisão B. Depois de praticamente um ano, muito dinheiro gasto, muita espera e aborrecimentos finalmente a placa funcionou.

É óbvio que a primeira pergunta que vem a mente é: Será que realmente valeu a pena? E aí a resposta é: Depende. Se o objetivo fosse exclusivamente para usar os meus computadores MSX a resposta é um NÃO gigantesco. Eu teria poupado não somente aborrecimentos como muito dinheiro comprando uma das outras interfaces que já existem e funcionam muito bem.

Por outro lado este foi apenas uma pequena parte do meu objetivo. Pois o meu objetivo principal sempre foi o de aprender e se eu olhar por este lado apenas a resposta passa a ser um SIM igualmente gigantesco. Eu acredito que eu aprendi muito, tanto sobre microcontroladores, como sobre CPLDs, tal como interfaces de computador. Aprendi muito sobre a estrutura do sistema de arquivos FAT. Aprendi muito também sobre cartões SD. Aprendi inclusive que desenvolver hardware no Brasil é extremamente difícil e caro.

Há ainda um outro lado que é o da satisfação pessoal e do orgulho. Depois de anos de desenvolvimento - eu comecei a pensar e a estudar sobre como eu iria executar este projeto em 2011 - você conseguir êxito no seu projeto é muito gratificante. è uma sensação muito boa e ao mesmo tempo muito difícil de descrever. Eu acredito que só quem desenvolveu e criou algo do zero e obteve êxito no final sabe de verdade como é. E a resposta à pergunta inicial olhando por esta perspectiva é também um SIM gigantesco.

Ou seja, se você é daqueles que realmente não gosta de desenvolver hardware ou software e quer apenas usar o seu MSX então não inicie um projeto como este. Mesmo que você ache que você teve alguma ideia mirabolante que vai "revolucionar" o computador MSX. Por um outro lado eu recomendo que todos que gostam efetivamente de trabalhar com desenvolvimento de hardware e software que tentem, pelo menos uma vez, fazê-lo. Porque apesar de todos os aborrecimentos e gastos, caso você consiga concluir seu projeto a satisfação em fazê-lo supera qualquer dificuldade.

Eu ainda tenho muito a dizer sobre o funcionamento do circuito e muitas coisas aconteceram após a isto e por este motivo eu estou reservando posts futuros para descrever e mostrar em maiores detalhes a interface funcionando.

Um abraço,

José Paulo

terça-feira, 15 de abril de 2014

Curso Online grátis de Java ME Embeded para o RaspBerry PI

 


Bom dia à todos,

Pra quem ainda não sabe, e eu acho difícil de ainda ter alguém que trabalha ou estuda na área técnica que não tenha ouvido falar destes dispositivos, o RaspBerry PI é um "computador" cuja a placa é do tamanho de um cartão de crédito e que expõe um conector com GPIO´s, I2C, SPI, UART, PWM e I2S. Tem muita gente ao redor do Globo fazendo muita coisa bacana com o RPi (abreviação de RaspBerry PI). Em breve eu devo escrever sobre as minhas impressões pessoais sobre o mesmo além de outras novidades, aguarde!

Bom, continuando...

Se você tem um computador, é necessário criar programas para ele. Para criar programas você precisa de uma linguagem de programação. E as principais linguagens de programação disponíveis para o RPi são o Python (considerado pelos criadores do RPi como sendo a principal linguagem para a plataforma) e a linguagem C.

A Oracle está desenvolvendo o Java ME Embeded 8 e está atualmente disponibilizando para download uma versão conhecida como EA2 (Early Access 2) que como o nome sugere se trata de uma versão em que algumas características podem mudar em um futuro próximo.

Para divulgar a nova versão 8 do Java e ajudar a divulgar o Java ME a Oracle está disponibilizando o Java MOOC (Massive Online Open Course). Se trata de um curso online grátis no qual ao longo de 5 semanas você vai aprender a desenvolver uma aplicação Java para o RPi interagindo com vários dispositivos  de hardware e aprendendo vários conceitos de Java no processo. Com certeza que é um curso bem interessante.

Na verdade está notícia em sí não é nova, inclusive já há uma turma em andamento que começou em 31 de Março. A novidade agora é que devido ao sucesso do curso resolveram abrir uma nova turma com o começo previsto para o dia 19 de Maio.

Além de um conhecimento básico de programação e de eletrônica é necessário que você possua um RPi e que você possua alguns acessórios que são vendidos pela Adafruit que fica no EUA. Eu não sei, mas eu acredito que já está meio em cima para comprar o material da Adafruit pelo correio. Até começar o curso o material ainda não vai ter chegado muito provavelmente. Dá última vez que eu comprei alguma coisa dos EUA o material demorou 5 meses pra chegar - devo escrever uma outra matéria a respeito disso.

De qualquer forma, caso você ainda possua o RPi a Farnell vende o aparelho por R$ 189,00 sem o cartão SD Card e sem fonte. Eu comprei o meu RPi da Farnell e usei um cartão SD que eu já tinha e para alimentar o RPi eu estou usando uma fonte de celular. A compra dos acessórios é bacana mas eu não creio que seja imprescindível para poder fazer o curso. Pelo que eu tenho visto até agora dá para se virar sem os acessórios só que fica mais difícil de fazer o curso. Eu devo escrever mais outra matéria explicando como eu estou fazendo para praticar sem os dispositivos da Adafruit.

Segue o link para inscrição no curso:
https://apex.oracle.com/pls/apex/f?p=44785:145:0::::P145_EVENT_ID,P145_PREV_PAGE:1841,143

Espero que isto seja útil. Java é uma linguagem que está muito em voga e aprender Java pode ser um fator importante na carreira de qualquer profissional da área.

Um abraço,

José Paulo

quinta-feira, 13 de março de 2014

Controlando motor de Disco Rígido


Olá,

Outro dia um colega estava desmontando um disco rígido defeituoso atrás dos ímãs de neodímio e ia jogar todo o restante fora. Foi aí que eu me lembrei de alguns vídeos que eu vi no YouTube de "Hard Disk POV". Vídeos como o do link abaixo:

http://www.youtube.com/watch?v=6dygwdisUj0#aid=P9R6_GgRM2I

Então eu pensei; "Taí um projeto muito bacana". Eu peguei o restante do HD que ia para o lixo e comecei a trabalhar para tentar fazer o motor do HD girar. A minha idéia era a de fazer um relógio de ponteiro usando um HD para deixar o bicho paradinho em minha escrivaninha rodando e mostrando a hora indefinidamente. Já posso adiantar que eu descobri que os motores de discos rígidos demandam muita energia para rotacionarem e que isto me desestimulou para fazer o projeto como eu queria. Afinal não é vantajoso você ter um relógio de ponteiro que consuma no final do mês muitos kW/h e acabei por fim jogando "todo o restante do hd fora". Mas não antes de eu fazer alguns testes e de aprender bastante sobre motores BLDC (motores CC sem escova) e sobre circuitos de controle com malha fechada. E é sobre isto o assunto desta matéria.

Para fazer meus testes eu usei um MSP430 launchpad Texas Instruments em conjunto com o software chamado Energia. Eu já descrevi o que é o Energia e o MSP430 lauchpad em mensagens anteriores. Basicamente o MSP430 launchpad é uma placa de testes e prototipagem muito parecida com as placas arduínos (mas não é compatível o arduíno) e o Energia é um ambiente de desenvolvimento muito parecido com o ambiente do arduino (mas não é compatível) no qual permite a você escrever programas também chamados sketchs e programa-los nas placas launchpad.

O disco rígido de teste possuí três bobinas que eu vou chamar durante o resto deste texto de "fases". Estas fases estão interligadas a um ponto comum. Portanto o motor do meu disco rígido possuía 4 contatos. Um contato para o ponto comum e um contato para cada fase. Havia algumas inscrições no motor mas eu não encontrei qualquer referência ou informação técnica na internet. Com um ohmímetro eu descobri que do ponto comum para cada fase existe uma resistência de 1,2 Ohms e entre as fases existe uma resistência de 2,4 Ohms. Com isto eu descobri quem era o ponto comum e quem eram as fases.   O contato do ponto comum ficava numa extremidade e eu deduzi que a ordem de acionamento das fases seguiriam a sequência dos contatos. Eu mantive esta dedução até o final e depois eu obtive a confirmação de que esta dedução estava certa por outros meios que eu vou explicar mais a frente.

Para acionar as fases eu liguei o ponto comum a uma fonte de alimentação de 12Vdc (apesar de não ter informações sobre o motor do HD me pareceu natural o uso deste valor de tensão). Cada fase eu liguei no dreno de um power mosfet canal N IRF840 e a fonte do mosfet eu liguei no terra. Como a tensão de limiar do gate do IRF840 está acima de 4V e o launchpad trabalha com tensão de 3,3V eu tive de usar um circuito auxiliar para comandar o power mosfet. Então eu usei um outro mosfet canal n, o BS270, para ajudar a elevar um pouco mais a tensão de gate do IRF840 quando acionado. Este tipo de configuração para acionamento de cargas é conhecido em inglês como "low side load driving". O circuito em sí não me parece muito importante agora, mas sim os resultados que eu obtive.

Eu comecei a tentar fazer o motor girar simplesmente acionando as fases do motor em sequência e gradativamente diminuindo o tempo de acionamento entre as fases para aumentar gradativamente a velocidade de rotação do motor . O comportamento do circuito foi muito fraco. Na maioria das vezes o motor simplesmente balançava para um lado e para o outro depois ficava estático. Algumas vezes o motor começava a girar e depois de algum tempo parava. E em outras vezes o motor girava lentamente e se eu aplicasse qualquer carga sobre o motor (Ex.: colocando levemente o dedo sobre o disco) o motor parava e não retornava a girar. Girar o motor com as mãos ao iniciar o acionamento elétrico do motor trazia pouca ou nenhuma ajuda. Um outro problema que eu detectei é que das vezes que o motor mantinha a rotação, a velocidade não era igual, i.e., as vezes o motor girava mais rápido e em outras vezes o motor girava mais rápido. Com isto ficou claro para mim que acionar as fases sem ter um controle efetivo da polaridade e da posição do eixo do motor é até possível mas é muito difícil e ineficiente.

Para controlar a posição do eixo e desta forma controlar o acionamento correto do motor há duas formas (pelo menos até aonde eu pude apurar das minhas pesquisas na internet): usando sensores de efeito hall e detectando a força eletromagnética reversa (back EMF). Eu decidi por tentar detectar a força magnética reversa e para isto eu modifiquei o meu circuito de controle para o circuito abaixo:


A ideia do circuito é simples: uma tensão de 3,3V no gate do transistor Q1 faz com que corrente circule na fase. Com o motor em rotação e sem termos corrente circulando na fase faz com que surja um DDP nos terminais da fase que é proporcional a posição do eixo do motor com relação a fase. Ou seja, a tensão será máxima se os pólos dos magnetos do eixo estiverem alinhados com a bobina da fase em questão. Usando as entradas ADC do MSP430 eu posso ler o nível de tensão das fases com o motor já em movimento e nos momentos aonde as três fases não estão sendo acionadas e desta forma acionar as fases de acordo com a posição correta do eixo.

Foi surpreendente a melhoria no comportamento do motor. Com esta última configuração ainda há o problema de "como fazer o motor começar a girar". Mas uma vez que o motor começa a girar eu posso garantir que ele não para mais. Eu posso aplicar carga sobre o motor (pressionando o dedo sobre o disco em movimento) que apesar do motor diminuir a sua rotação ele não mais para. Eu posso ajudar o motor girando o disco com as mãos que com certeza ele vai manter a rotação. E eu posso garantir que em todas as vezes o motor girava sempre na mesma rotação (em torno de 800 rpm). Um outro detalhe curioso é que se eu mudasse a ordem de acionamento das fases o motor ou girava mais lentamente ou não girava o que confirmou a minha suposição inicial sobre a ordem correta de acionamento das fases.

O código do sketch que eu usei nos testes está listado abaixo. Este código eu escrevi sem qualquer planejamento ou pretensão. Foi um código construído por meio de tentativa e erro e com certeza podia ter sido melhor escrito mas como eu não queria levar o projeto adiante eu simplesmente me dei por satisfeito.

//definição das variáveis locais
byte _step;
unsigned long time;
int time_count_on;
int time_count_off;
unsigned long key_pressed_count;
boolean motor_active;
boolean motor_start;
int phase1_level;
int phase2_level;
int phase3_level;

//definição das constantes do sketch
const int PHASE1_SWITCH=P2_0;
const int PHASE2_SWITCH=P2_1;
const int PHASE3_SWITCH=P2_2;
const int PHASE1_LEVEL=A0;
const int PHASE2_LEVEL=A1;
const int PHASE3_LEVEL=A2;

const int START_TIME_ON=15;
const int MIN_TIME_ON=1;
const int START_TIME_OFF=40;
const int MIN_TIME_OFF=1;
const int KEY_PRESSED_TIME=500;

void setup()
{
  // put your setup code here, to run once:
  pinMode(PHASE1_SWITCH,OUTPUT);
  pinMode(PHASE2_SWITCH,OUTPUT);
  pinMode(PHASE3_SWITCH,OUTPUT);
 
  pinMode(PUSH2,INPUT_PULLUP);

  analogReference(INTERNAL1V5);
 
  _step=1;
  time_count_on=START_TIME_ON;
  time_count_off=START_TIME_OFF;
  time=0;
  key_pressed_count=0;
  motor_active=false;
  motor_start=false;
  digitalWrite(PHASE1_SWITCH,LOW);
  digitalWrite(PHASE2_SWITCH,LOW);
  digitalWrite(PHASE3_SWITCH,LOW);
}

void loop()
{
  // put your main code here, to run repeatedly:
  if(digitalRead(PUSH2)==LOW){
    if(key_pressed_count==0){
      key_pressed_count=millis()+KEY_PRESSED_TIME;
    } else {
      if(key_pressed_count<millis()){
        motor_active=!motor_active;
        if(motor_active==true){
          motor_start=true;
        }
        key_pressed_count=millis()+5000;
      }
    }
  } else {
    key_pressed_count=0;
  }
  if(motor_active==true && motor_start==true){
    digitalWrite(PHASE1_SWITCH,HIGH);
    delay(150);
    digitalWrite(PHASE1_SWITCH,LOW);
//    delay(300);
 
    digitalWrite(PHASE2_SWITCH,HIGH);
    delay(100);
    digitalWrite(PHASE2_SWITCH,LOW);
//    delay(300);
 
    digitalWrite(PHASE3_SWITCH,HIGH);
    delay(80);
    digitalWrite(PHASE3_SWITCH,LOW);
//    delay(300);

    digitalWrite(PHASE1_SWITCH,HIGH);
    delay(60);
    digitalWrite(PHASE1_SWITCH,LOW);
//    delay(150);
 
    digitalWrite(PHASE2_SWITCH,HIGH);
    delay(60);
    digitalWrite(PHASE2_SWITCH,LOW);
//    delay(100);
 
    digitalWrite(PHASE3_SWITCH,HIGH);
    delay(60);
    digitalWrite(PHASE3_SWITCH,LOW);
//    delay(50);
    motor_start=false;
  }   

  if(motor_active==true && time==0){
    switch(_step){
      case 2:
        digitalWrite(PHASE1_SWITCH,HIGH);
        digitalWrite(PHASE2_SWITCH,LOW);
        digitalWrite(PHASE3_SWITCH,LOW);
        time=millis()+time_count_on;
        _step++;
        break;
      case 1:
      case 3:
      case 5:
        if(time_count_off!=0){
          digitalWrite(PHASE1_SWITCH,LOW);
          digitalWrite(PHASE2_SWITCH,LOW);
          digitalWrite(PHASE3_SWITCH,LOW);
          time=millis()+time_count_off;
        } else {
          time=millis();
        }
        delay(1);
        phase1_level=analogRead(PHASE1_LEVEL);
        phase2_level=analogRead(PHASE2_LEVEL);
        phase3_level=analogRead(PHASE3_LEVEL);
        if(phase1_level>phase2_level && phase1_level>phase3_level){
          _step=4;
        } else {
          if(phase2_level>phase1_level && phase2_level>phase3_level){
            _step=6;
          } else {
            _step=2;
          }
        }
        break;
      case 4:
        digitalWrite(PHASE1_SWITCH,LOW);
        digitalWrite(PHASE2_SWITCH,HIGH);
        digitalWrite(PHASE3_SWITCH,LOW);
        time=millis()+time_count_on;
        _step++;
        break;
      default:
        digitalWrite(PHASE1_SWITCH,LOW);
        digitalWrite(PHASE2_SWITCH,LOW);
        digitalWrite(PHASE3_SWITCH,HIGH);
        time=millis()+time_count_on;
        _step=1;
    };
    if(time_count_off>MIN_TIME_OFF){
      if(_step==1){
        time_count_off--;
      }
    }
    if(time_count_off<time_count_on){
      if(time_count_on>MIN_TIME_ON){
        time_count_on=time_count_off;
      }
    }
  }
  if(motor_active==true && time<millis()){ 
    time=0;
  }
  if(motor_active==false){
    time=0;
    time_count_on=START_TIME_ON;
    time_count_off=START_TIME_OFF;
    _step=1;
    digitalWrite(PHASE1_SWITCH,LOW);
    digitalWrite(PHASE2_SWITCH,LOW);
    digitalWrite(PHASE3_SWITCH,LOW);
  }
}

Com o código acima eu consigo manter o rotação constante em torno de 800 rpm apesar de que é possível perceber um flutuação na velocidade inicial. É possível eliminar esta flutuação usando as técnicas de controle PID que são o pesadelo de qualquer aluno de engenharia elétrica. Além disto o algoritmo para iniciar a rotação do motor não está bom e precisa ser melhorado. Mas com o circuito e o código acima eu consegui testar vários conceitos interessantes. E é na esperança de que as informações acima sejam de alguma utilidade para alguém que eu termino esta mensagem.

Eu realmente não quis concluir o meu projeto. Nos momentos iniciais de rotação do motor o circuito chega a consumir em torno de 3A e com o motor estabilizado em 800 rpm o circuito consome 1A. Daí dá para perceber que se o motor estiver rodando na velocidade máxima em que ele foi projetado que é 5200 rpm o consumo de energia diminui bastante. Por outro lado é impossível ou extremamente difícil controlar com precisão o acionamento de leds 86 vezes por segundo usando um microcontrolador trabalhando a 16Mhz. Lembrando que este mesmo microcontrolador teria que controlar também o acionamento das fases, ler de tempos em tempos botões para verificar se o usuário não quer interagir com o aparelho e se comunicar de tempos em tempos com um CI RTC tipo o DS1307. Simplesmente muita complexidade para um "projetinho simples" e eu perdi o interesse em continuar na pesquisa.

Mas de qualquer forma aí está a idéia para quem quiser continuar a pesquisar e construir o projeto.

Um abraço,


José Paulo

segunda-feira, 10 de março de 2014

Amplificador para fone de ouvido



 Olá,

Já faz um tempão que eu não escrevo nada no blog! Falta de tempo e de paciência também. Mas ei, eu agora estou de férias e pretendo recuperar o tempo perdido.

Um projetinho rápido que eu fiz a pedido de um amigo foi um amplificador estéreo para fone de ouvido. A idéia é bem simples: Um amplificador de baixa potência, alimentado pela rede elétrica, simples de usar, com controle de volume e que tenha uma boa qualidade de áudio.

Para a tarefa eu selecionei o C.I. TDA2822M que é um amplificador estéreo com encapsulamento DIP ou SMD de 8 pinos. Este C.I. é o 555 dos amplificadores de áudio. É um C.I. que vários fabricantes o produzem e em qualquer lojinha de eletrônica você acha fácil. Na configuração estéreo você consegue colocar para fora algo em torno de 0,6W e em configuração ponte (áudio mono) você consegue uma potência de 1,2W aproximadamente. Além disto a distorção harmônica fica em torno de 0,5% o que é muito bom. E se não bastasse todas as vantagens, ainda é um componente relativamente barato custando em lojas do ramo algo em torno de R$ 2,00 cada um. O link com o datasheet segue listado abaixo:

http://www.unisonic.com.tw/datasheet/TDA2822.pdf

Uma das premissas do projeto é que o amplificador fosse alimentado pela rede elétrica. Eu não queria embutir uma fonte de alimentação na mesma caixa do amplificador com receio que isto fosse gerar ruídos na saída de áudio devido a interferências eletromagnéticas. Com isto eu decidi usar fontes externas. Eu tenho o costume - não sei muito bem o porquê - de guardar as fontes de alimentação de equipamentos que eu descarto. Com isto eu tenho várias e várias fontes de alimentação com saída AC e DC e nas mais variadas tensões e correntes de operação. Então eu decidi por adotar um Jack DC J4 como porta de entrada para alimentação.

Um outro cuidado que eu tomei foi em usar uma caixa metálica ao invés de uma caixa plástica com o objetivo e a esperança que a caixa metálica funcionasse como uma gaiola de Faraday isolando o circuito de ruídos externos. A placa de circuito impresso é preso por um único parafuso à base da caixa que está ligado ao terra do circuito. Desta forma a base da caixa tem o mesmo potêncial que o terra do circuito, porém, eu inicialmente não tomei nenhum cuidado com a tampa da caixa. Quando eu testei o circuito eu percebi que ruído vindo de celulares e monitores próximos "vazava" no áudio e isto era uma coisa bastante irritante. Depois eu tive a idéia de raspar a tinta que faz o contato da base da caixa com a tampa. Para minha agradável surpresa, a interferência cessou completamente. Ao ponto de eu poder apoiar meu celular em cima da caixa do amplificador e não ouvir mais nenhuma interferência vinda do celular. Santo Faraday!

 Pelo incrível que pareça eu fiz duas revisões deste projeto: revisão A e revisão B. Na revisão A o TDA2822M é o único componente ativo. O problema da revisão A é que se você ligasse o aparelho com o fone fechado em sua orelha você escuta um som forte de "POC" que chegava a machucar e isto não era legal. Nada demais, basta você ligar o amplificador e depois colocar o fone de ouvido e tudo funcionaria ok. Mas com o sucesso da primeira versão mais pessoas me pediram para fazer o amplificador, então eu decidi que na próxima revisão eu iria atacar este problema. A solução foi a seguinte: Ao invés de ligar o TDA2822M direto á alimentação  eu liguei a alimentação do C.I. a um transistor NPN em configuração "seguidor de emissor" e coloquei um circuito RC na base do transistor de forma que quando a alimentação fosse ligada, a tensão de alimentação do C.I. subisse gradativamente. Posso dizer que este problema foi resolvido totalmente.

E é isto! Segue abaixo o link com o projeto do kicad.

https://dl.dropboxusercontent.com/u/62498964/Phone%20Amplifier.zip

Até breve,

José Paulo