quarta-feira, 19 de junho de 2013

Arduino, Lógica Fuzzy!!! Sensacional!!

O arduino, é uma plataforma de desenvolvimento muito simples para grandes aplicações de engenharia.

Mas, a verdadeira beleza das coisas está na simplicidade.

E apesar de inicialmente parecer uma coisa bastante complexa, a lógica fuzzy é bastante simples de implementar utilizando o arduino.

A principal referência está endereço: http://www.zerokol.com/2012/09/arduinofuzzy-uma-biblioteca-fuzzy-para.html. É um excelente tutorial sobre uma biblioteca de lógica fuzzy para qualquer microcontrolador. Para os curiosos, no link acima, tem uma breve explicação sobre fuzzy, um tutorial explicando como instalar a biblioteca, e também algumas explicações e dicas.


Acabei de desenvolver um sistema de controle de luminosidade utilizando lógica fuzzy.

É bem simples!!

Figura 1 - Sistema Iluminação Automática com Fuzzy

O sistema da figura 1 é composto por um divisor de tensão formado por um LDR e uma resistencia, alimentados no +5V (Figura 2). E como fonte de luz, um led com um resistor de limitação de corrente.
Figura 2 - Divisor de tensão com o LDR
 Depois que instalei a biblioteca no meu arduino, começei a editar o exemplo e consegui executar o programa.

Gostaria de compartilhar aqui as regras de  entrada.

No Fuzzy, a programação é assim, por exemplo: Se Escuro Então BrilhoLED Elevado.

Primeiro, criei 3 situações para a  Iluminação : Escuro, Normal e Iluminado. Lembrando que Iluminação é a saída do sensor LDR. E é portanto a variável de entrada do sistema.

E depois criei 3 condições de saída, ou seja, para o brilho do led: Baixo, Medio, Elevado.

E por fim, criei as regras:

          "SE iluminacao = escuro ENTAO Brilho do LED = elevado"

           "SE iluminacao = normal ENTAO Brilho do LED = medio"

           "SE iluminacao = Iluminado ENTAO Brilho do LED = baixo"


Bem, Definidas as minhas regras, aí os próximos passos, vou apenas citar, mas prometo que num próximo tutorial explico tudo, mas adianto que no link que citei no anterior do artigo tem algumas explicações. Em fim, os passos são:

Fuzzyficar, Inferir, Defuzzificar.

No arduino, os comandos utilizados foram:

  float iluminacao_medida = (analogRead(LDR))*0.09765;  //0.09765 = 100/1024
 
  fuzzy->setInput(1,iluminacao_medida  ); // iluminação medida é a variável de entrada
     
  fuzzy->fuzzify();

 int output = fuzzy->defuzzify(1);

   analogWrite(9,output); // onde output é a saída PWM e varia de 0-255

//***********


Resultados Obtidos

Na figura 3a e 3b, o sistema  encontra - se no escuro, logo o Brilho é Elevado.

Figura 3a - Sensor no Escuro - Brilho Elevado 
Na figura 3b, a forma de onda amarela é o sinal de saída do PWM que aciona o LED. E a forma de onda azul é o sinal de tensão divisor de tensão, tal como mostrado na figura 2. 

A forma de onda amarela é o PWM ( 0 à 255) e a curva azul é a tensão do sensor
Figura 3b - Formas de onda - Escuro
 Na figuras 4a e 4b, o sensor está um ambiente iluminado, logo o pwm (curva amarela) é menor, tal como na figura 4b

Figura 4a - Ambiente Iluminado
Figura 4b - Ambiente iluminado -> Brilho Baixo
 A figura 5a mostra uma tentativa de simular uma condição de baixa luminosidade (tampei o sensor com o dedo), mas o sistema não está totalmente escuro.

Figura 5a - Condição de Baixa luminosidade
E por fim, as formas de onda. A tensão no sensor  caiu e o pwm aumentou, aumentando assim o briho do led. 

Figura 5b - Aumento do brilho do LED
***********************************************************************************
Finalizo deixando aqui o código para que você tenha acesso à informação assim como eu tive. Perdoe-me por erros indevidos, e também por algumas coisas que não consegui deixar claro, principalmente em relação ao processo fuzzy. Apesar disso, estou à disposição para tirar dúvidas por email.

Um abraço

**********
#include <FuzzyRule.h>
#include <FuzzyComposition.h>
#include <Fuzzy.h>
#include <FuzzyRuleConsequent.h>
#include <FuzzyOutput.h>
#include <FuzzyInput.h>
#include <FuzzyIO.h>
#include <FuzzySet.h>
#include <FuzzyRuleAntecedent.h>


int iluminacao_saida = 0;

int LDR = 5;// Sensor de iluminacao

int initPin = 13;

unsigned long pulseTime = 0;

// Instanciando um objeto da biblioteca
Fuzzy* fuzzy = new Fuzzy();

void setup(){
  Serial.begin(9600);
 
  // set init pin as output
  pinMode(initPin, OUTPUT);
  // set sensor lm35 como entrada


  // create array loop to iterate over every item in the array
  for (int thisReading = 0; thisReading < numOfReadings; thisReading++) {
    readings[thisReading] = 0;
  }
 
  // Criando o FuzzyInput iluminacao
 
  FuzzyInput* iluminacao = new FuzzyInput(1);

  // Criando os FuzzySet que compoem o FuzzyInput iluminacao
 
  FuzzySet* escuro = new FuzzySet(0, 40, 40, 65); // iluminacao escuro 15° 35°
  iluminacao->addFuzzySet(escuro); // Adicionando o FuzzySet escuro em iluminacao

  FuzzySet* normal = new FuzzySet(30, 50, 50, 70); // iluminacao normal
  iluminacao->addFuzzySet(normal); // Adicionando o FuzzySet normal em iluminacao

  FuzzySet* Iluminado = new FuzzySet(60, 80, 80, 100); // iluminacao muito normal
  iluminacao->addFuzzySet(Iluminado); // Adicionando o FuzzySet Iluminado em iluminacao
 
  fuzzy->addFuzzyInput(iluminacao); // Adicionando o FuzzyInput no objeto Fuzzy
 
 
  // Criando o FuzzyOutput Brilho da LED
 
  FuzzyOutput* brilho = new FuzzyOutput(1);
   
    // Criando os FuzzySet que compoem o FuzzyOutput Brilho do LED
   
    FuzzySet* baixo = new FuzzySet(0, 80, 80, 130); // Brilho do LED baixo
    brilho->addFuzzySet(baixo); // Adicionando o FuzzySet baixo em brilho
   
    FuzzySet* medio = new FuzzySet(70, 150, 150, 200); // Brilho do LED normal
    brilho->addFuzzySet(medio); // Adicionando o FuzzySet medio em brilho
   
    FuzzySet* elevado = new FuzzySet(150, 190, 255, 255); // Brilho do LED elevado
    brilho->addFuzzySet(elevado); // Adicionando o FuzzySet elevado em brilho
 
    fuzzy->addFuzzyOutput(brilho); // Adicionando o FuzzyOutput no objeto Fuzzy
 
  //-------------------- Montando as regras Fuzzy
 
  // FuzzyRule "SE iluminacao = escuro ENTAO Brilho do LED = Elevado"
 
  FuzzyRuleAntecedent* ifiluminacaoescuro = new FuzzyRuleAntecedent(); // Instanciando um Antecedente para a expresso
  ifiluminacaoescuro->joinSingle(escuro); // Adicionando o FuzzySet correspondente ao objeto Antecedente
 

    FuzzyRuleConsequent* thenbrilhoelevado = new FuzzyRuleConsequent(); // Instancinado um Consenormal para a expressao
  thenbrilhoelevado->addOutput(elevado);// Adicionando o FuzzySet correspondente ao objeto Consenormal
 
 
  // Instanciando um objeto FuzzyRule
  FuzzyRule* fuzzyRule01 = new FuzzyRule(1, ifiluminacaoescuro, thenbrilhoelevado); // Passando o Antecedente e o Consenormal da expressao
  fuzzy->addFuzzyRule(fuzzyRule01); // Adicionando o FuzzyRule ao objeto Fuzzy
 
  // FuzzyRule "SE iluminacao = normal ENTAO Brilho do LED = medio"
  FuzzyRuleAntecedent* ifiluminacaonormal = new FuzzyRuleAntecedent(); // Instanciando um Antecedente para a expresso
  ifiluminacaonormal->joinSingle(normal); // Adicionando o FuzzySet correspondente ao objeto Antecedente
 
  FuzzyRuleConsequent* thenbrilhomedio = new FuzzyRuleConsequent(); // Instancinado um Consenormal para a expressao
  thenbrilhomedio->addOutput(medio);// Adicionando o FuzzySet correspondente ao objeto Consenormal
 
  // Instanciando um objeto FuzzyRule
  FuzzyRule* fuzzyRule02 = new FuzzyRule(2, ifiluminacaonormal, thenbrilhomedio); // Passando o Antecedente e o Consenormal da expressao
  fuzzy->addFuzzyRule(fuzzyRule02); // Adicionando o FuzzyRule ao objeto Fuzzy
 
  // FuzzyRule "SE iluminacao = Iluminado ENTAO Brilho do LED = baixo"
 
  FuzzyRuleAntecedent* ifiluminacaoIluminado = new FuzzyRuleAntecedent(); // Instanciando um Antecedente para a expresso
  ifiluminacaoIluminado->joinSingle(Iluminado); // Adicionando o FuzzySet correspondente ao objeto Antecedente


   FuzzyRuleConsequent* thenbrilhobaixo = new FuzzyRuleConsequent(); // Instancinado um Consenormal para a expressao
  thenbrilhobaixo->addOutput(baixo);// Adicionando o FuzzySet correspondente ao objeto Consenormal
 
  // Instanciando um objeto FuzzyRule
 
  FuzzyRule* fuzzyRule03 = new FuzzyRule(3, ifiluminacaoIluminado, thenbrilhobaixo); // Passando o Antecedente e o Consenormal da expressao
  fuzzy->addFuzzyRule(fuzzyRule03); // Adicionando o FuzzyRule ao objeto Fuzzy
}

void loop(){
  // send 10 microsecond pulse
  digitalWrite(initPin, HIGH);
  // wait 10 microseconds before turning off
  delayMicroseconds(10);
  // stop sending the pulse
  digitalWrite(initPin, LOW);
 

  float iluminacao_medida = (analogRead(LDR))*0.09765;
 
  fuzzy->setInput(1,iluminacao_medida  );
     
  fuzzy->fuzzify();

 int output = fuzzy->defuzzify(1);
   analogWrite(9,output);

  Serial.print(" iluminacao: ");
  Serial.print(iluminacao_medida);
  Serial.print(" Brilho do LED: ");
  Serial.println(output*0.39215);
  Serial.print(" % ");
  // wait 100 milli seconds before looping again
  delay(100);
}


                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     

quarta-feira, 10 de abril de 2013

Sensor de tensão com detector de Picos para Arduino e PIC

No ultimo post, discorri sobre os sensores de tensão e corrente que estou utilizando em meu trabalho.

Hoje, irei apenas apresentar para vocês as formas de onda da tensão do sensor, pois no outro post eu apenas fiz uma ilustração no quadro branco.

O esquemático do sensor está na figura 1. A tensão é abaixada para 12V, passa por um divisor resistivo e depois por um ganho DC.


Figura 1 - Circuito do sensor

Na figura 2, a forma de onda amarela é a tensão de entrada ( teoricamente 12V rms), e a forma de onda azul é a tensão depois do divisor resistivo.
Figura 2 - Formas de onda entrada e divisor resistivo


Quem for projetar um circuito destes para utilizar em seus projetos com microcontrolador deve dimensionar o divisor resistivo para que a tensão de pico a pico fique dentro de uma faixa de 0 a 5 Volts. Sendo que a amplitude do sinal deve ter no máximo 2.5Volts. 
Observem que o sinal da figura 2 tem apenas 2.4 volts de valor máximo, o que dá aproximadamente 4.8V de pico a pico.

Na figura 3, estão as formas de onda dos sinais antes e depois do offset. Vejam que a forma de onda amarela é o sinal sem offset logo depois do divisor resistivo. E a azul é a com o offset. 


Figura 3- Ondas com e sem Offset
Observem na figura 3 a diferença do valor méido da onda amarela e o da azul. O da onda amarela é praticamente nulo e o da onda azul é 2.71V. Este é o valor do ganho DC.  Sendo o valor máximo de 2.4V e o ganho DC de 2.71, o sinal está completamente dentro da faixa de 0 a 5V e agora pode ir para o AD do micro controlador.

Para poupar a capacidade de processamento do meu microcontrolador de 8bits, estou utilizando um circuito analógico com amplificadores operacionais para descobrir o valor máximo. 

Depois de pesquisar bastante sobre estes circuitos, encontrei um guia elaborado pela Microchip, elaborador por Dragos Ducu, em 3, de abril de 2011 cujo título é o seguinte: "Op Amp Rectifiers, Peak Detectors and Clamps"


Eu utilizei o circuito da figura 4 e onde é o RL, coloquei o Capacitor e o resistor da figura 5. 
Figura 4 - Retificador meia onda com amp op

Figura 5 - Circuito detector de pico

O resultado da associação está na figura 6, onde a onda amarela é o sinal de saída do sensor de tensão e a onda azul é o valor máximo.

Figura 6 - Formas de onda - Detector de pico

 Agora, posso simplesmente entrar com o sinal azul no ad do microcontrolador e  pronto.

Testei o circuito para o sensor de corrente e o detector de picos funcionou também!

No próximo post irei falar sobre como fazer a aquisição destes dados com o microcontrolador, no meu caso atualmente o arduino!

Um abraço!!

Até mais!!

Referências:


Op Amp Rectifiers, Peak Detectors and Clamps, disponível em: <http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en552984>



terça-feira, 9 de abril de 2013

Sensores de Tensão e Corrente para microcontroladores (Arduino, Pic e outros)

Neste Post irei discorrer sucintamente sobre um assunto muito importante para aqueles que, assim como eu, necessitam medir uma corrente e tensão alternada em seus projetos.


Para os leigos no assunto e que estão começando agora a trabalhar com eletricidade, irei fazer uma pequena abordagem ao problema.
Suponha que você está fazendo um projeto de automação residencial e que o seu cliente gostaria de saber a potência consumida por uma lâmpada, tal como na figura 1.

A potência elétrica é o produto da corrente pela tensão. P = V*I.

A pergunta e o ponto central deste post é a seguinte: "Como mensurar estas grandezas elétricas?"


Figura 1- Circuito exemplo

Um dos grandes desafios e também dos riscos da eletricidade é justamente o fato de não conseguirmos vê-la diretamente. Nós apenas podemos ver seus efeitos, por exemplo: a luz, o calor, o campo magnético.

Assim para podermos medir a corrente e a tensão elétrica precisamos utilizar sensores. Existem diversos trabalhos bacanas sobre estes tipos de sensores.
Em meu trabalho de conclusão de curso, optei por utilizar os sensores das figuras 2 e 3.



Figura 3 - Sensor de corrente
 
Figura 2 - Sensor de Tensão


A filosofia do circuito do sensor da figura 2 é a seguinte:

A tensão passa por um transformador abaixador de 127 para 12V, a seguir por um divisor resistivo e por final por um acoplamento AC. A tensão de saída do sensor é uma senoide com amplitude entre 0 e 5V com um offset de 2.5Volts. Assim, este sinal pode ser recebido pela entrada analógica do processador. A figura 4 contem o esquemático do sensor de tensão.

Figura 4 - Esquemático do sensor de tensão
O capacitor utilizado foi de 10uF, e as resistencias são: R1 = (10+46)k = 56k e R2 = 22k. R = 10k


Na figura 5, contem os estágios da tensão no sensor. Primeiro ela é reduzida para 12Vrms ou 17 V de pico, depois ela passa pelo divisor de tensão ( Vo = (R2/(R1*R2))*VI) e por final é adicionado o offset. 




Figura 5 - Etapas do sensor


O sensor de corrente (figura 3) utiliza um CI (circuito integrado) de efeito Hall. (Hall foi um cientista que descobriu que regiões positivas e negativas são criadas dentro de um fio quando este está que está sendo percorrido por corrente elétrica é imergido em um campo magnético.)

Optei por comprar uma plaquinha pronta. Ela contem 5 pinos: 2 para corrente da carga e outros 3 para os sinais (+5V, Vout, GND).

O CI utilizado é o ACS 712. A grande vantagem deste ci é que ele isola eletricamente o circuito e protege o seu microcontrolador. Além disso ele já fornece uma saída de tensão senoidal com offset de 2,5 Volts. Assim este sinal pode ser aplicado diretamente nos terminais da entrada analógica do seu microcontrolador.



Bem, Assim que for possível postarei as formas de onda obtidas dos sensores!



Por Enquanto é Só!

Obrigado pela atenção!



Referências: 






Datasheet acs712 https://www.google.com.br/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&sqi=2&ved=0CDEQFjAA&url=http%3A%2F%2Fwww.allegromicro.com%2F~%2FMedia%2FFiles%2FDatasheets%2FACS712-Datasheet.ashx&ei=3LVkUaCiI4GK9QTotYHIBQ&usg=AFQjCNG8Ps3cR0EkgfoM3ZNSpXLpyj7gZg&sig2=4WOo1CrtdZidPfc1GX97LQ&bvm=bv.44990110,d.dmQ



segunda-feira, 8 de abril de 2013

Chopper Ac Trifásico! Um sistema de partida de motores elétricos!


Um motor elétrico é um sistema que converte energia elétrica em energia mecânica. Desde a sua invenção, no fim do século 19, ele tem sido amplamente utilizado pela humanidade.
Eles estão presentes em nossos aparelhos eletro-eletrônicos, nos eletrodomésticos e principalmente nas indústrias.

Quando um motor desligado e o mesmo é energizado, nos instantes iniciais circula - se pela rede de alimentação uma grande quantidade de energia elétrica. Isto ocorre devido à grande inércia que o motor precisa vencer para entrar em movimento e atingir a sua velocidade de operação.

Nos instantes de energização, esta grande quantidade de corrente circula pela rede elétrica causa diversos problemas à qualidade da energia elétrica.

Por exemplo, em nossas casas, quando alguem energiza um liquidificador ou uma lavadoura de roupas e a lampada muda o brilho, isto é um defeito de qualidade de energia elétrica.

Quando estamos em uma indústria e algo do tipo acontece, podem ocorrer grandes prejuízos financeiros. Por exemplo se durante uma energização de um motor o computador que controla um braço robótico pare de funcionar...

Para evitar que grandes quantidades de energia sejam demandadas num único instante de tempo existem dois grandes grupos de sistemas para a partida de motores: os analógicos (leia-se manuais) e os eletrônicos.

Os sistemas manuais são mais antigos, embora ainda sejam muito utilizados. Eles conciliam uma boa solução e muitas vezes de baixo custo.

Por exemplo: chave delta estrela, chave compensadora.

Uma desvantagem destes sistemas é o desgaste físico.

Os sistemas eletrônicos de partida de motores são aqueles que como o próprio nome sugere, utilizam chaves eletrônicas em sua operação.

São eles: os soft starters e os inversores de frequência.

Os soft-starters utilizam triac em sua operação. Estes sistemas são bastante eficientes. O controle da tensão é realizados atraves da variação do angulo de disparo do semicondutor.
E o inversor de frequência transforma a tensão alternada em contínua e posteriormente converte a tensão contínua em alternada. Mas desta vez a tensão tem frequencia e amplitude variáveis.

Os inversores são a melhor opção quando deseja-se ter uma partida suave e o controle de velocidade dos motores de indução.
Mas, para aplicações onde deseja-se apenas controlar a partida, eles tornam -se caros.

Por isto que estou desenvolvendo um sistema de partida para motores elétricos de baixa potência.

O sistema basicamente consiste em chavear em alta frequência a energia alternada e controlar o nível de tensão através da razão entre o tempo que a chave fica aber ou fechada.





Este sistema chama - se Chopper Ac. Por meio de chaves operando em alta frequência, o sistema consegue regular a quantidade de energia disponível para a carga.




Vamos por partes.
Imagine, por exemplo que a carga seja um conjunto de lampadas.
Com o meu trabalho seria possível controlar o brilho das lampadas de 0 a 100%, por exemplo.


Nossa... quanta coisa!!

Falei sobre motores, qualidade de energia, sistemas de energização de máquinas, eletrônica, circuitos elétricos, e garanto que ainda tem muito mais coisas envolvidas!!

No próximo post, continuarei comentando mais sobre o meu trabalho de conclusão de curso! Vou postar algumas fotos e detalhar melhor o que estou fazendo!

Um abraço!!








sábado, 6 de abril de 2013

Algorítimo para detectar Picos! Primeira tentativa

Caros,

Estou aqui em pleno Sabadão tentando desenvolver um algoritmo para encontrar os picos de um sinal.

A figura 1 contém um sinal modelo com diversos pontos.


Figura 1 - Sinal exemplo

O objetivo aqui é encontrar os pontos máximos locais: C, J, Q, U, W, Y, Ç.

A primeira ideia foi a de comparar o valor atual com o anterior. O código está na figura 2, mas ele não funciona.


Figura 2 - Código detector de pico
 O código consegue detectar a apenas o ponto C e J, mas os pontos Q, U e Y não. Isto ocorre por que Q é menor que o ponto J e por isso ele não é identificado como máximo.

Bem, esta é a primeira tentativa de identificar os picos de uma curva!
Vou continuar o trabalho aqui!!

Grande Abraço




O início

Caro Leitor,


Atualmente, estou trabalhando em meu trabalho de conclusão de curso. Estou juntamente com um professor orientador, desenvolvendo um sistema de partida de motores de indução trifásico (Vou explicar isso tudo depois).

O objetivo deste espaço é compartilhar os conhecimentos que tenho adquirido com as horas dedicadas ao trabalho final de graduação.

Quero também no futuro utilizar este espaço para compartilhar conhecimentos sobre eletrônica, programação, matemática, engenharia e etc.

Um abraço,

Até mais!