sexta-feira, 3 de julho de 2015

HX711 - Aterrar o canal B!

    HX711 - ATERRAR AS ENTRADAS DO CANAL B!

    Hoje estava  analisando a possibilidade de usar o HX711 em outro projeto, relendo a folha de dados me dei conta que não havia aterrado as entradas do canal B e no circuito proposto no datasheet, as entradas do canal B estavam aterradas! Fui para a bancada  e com uns 300 gramas de peso em cima da balança capturei alguns minutos antes de alterar o circuito, e depois capturei novamente. Pude observar que para pequenos pesos e mesmo com filtros bem grandes a diferença foi notável. Bom fica a dica não esqueçam de aterrar as entradas do canal B se o mesmo não for ser usado no seu projeto!
  .

domingo, 28 de junho de 2015

Hx711 6ª Parte - Média + TARA

 

    Pelo esquema do modulo HX-711 podemos ver que o pino RATE e o pino X1 estão ligados ao terra, ou seja esta configurado para usar o oscilador interno com uma taxa de amostragem próxima a 10 amostras por segundo (10 SPS ).
 Como temos 10 SPS a conversão ocorre a aproximadamente a cada 0,1 segundos ou 100ms (100 mili-segundos). Vamos começar com uma media para 5 amostras ou 500ms a cada pedido de captura! 

Média de cinco amostras.

Para o calculo da media (pequeno filtro) a ideia é criar um código bem simples,  um for (loop) que soma a cada passagem depois divide pelo numero de passagens do loop. 

  unsigned long MEDIA = 0;  
  for (int j=0; j<5; j++){             // loop 5 para media
  ........  // Código captura
  MEDIA += CAPTURA;
  }
   CAPTURA = MEDIA/5;
 return CAPTURA;

Determina o valor de TARA.

    Os valores de amostra sem carga (peso em cima da balança) apresentam uma variação muito alta. Somente a partir de uns 3Kg de carga, que as leituras estão se estabilizando, vamos criar uma media bem maior com 10 (dez) passagens de captura. Totalizando 50 AMOSTRAS para o calculo da media da TARA (50 vezes 0,1 segundos da uns 5 segundos para operação de TARA). 

unsigned long TARA = 0; 

  for (int i=0; i<10; i++) TARA +=CAPTURA();

return TARA/10;



    Depois de uns testes rápidos, decidi que o melhor é criar uma sub rotina MEDIA(x), para ser usada dentro das rotinas TARA e CAPTURA, para facilitar o código.

unsigned long setTARA(){

  // reseta o conversor HX711

  digitalWrite(hxSCK, 1);  

  delay (200);

  digitalWrite(hxSCK, LOW); 

  // -------------------------

 return Media(70);        // Calcula média de 350 AMOSTRAS 35 segundos!

}    


Calculo Geral da Média. 

Como na função CAPTURA foi calculada uma media de cinco amostras e para pequenos valores de peso não ficou adequado, vamos fazer uma rotina que possamos definir o numero de AMOSTRAS para o calculo da média para usarmos de uma forma mais dinâmica posteriormente.





long Media(byte vezes)

{

    long soma = 0;

    for (byte i = 0; i < vezes; i++)

    {

        soma += CAPTURA();

    }



    return soma / vezes;


}


Calcular o valor do peso.

    Para calcular o peso iremos precisar determinar uma serie de constantes kx (tabela) para as faixas de pesos de interesse. Inicialmente faremos para pequenos valores de peso até uns 15 Kg, para isso vamos pesar algo próximo a 10Kg e determinaremos o valor de k0 para esta faixa de pesos. Posteriormente teremos mais alguns fatores kx para aumentar a precisão nas faixas de interesse. 


float Peso()

{

    long peso = (Media(X) - TARA); // X numero  de amostras 

    return (float) peso / kconst;

}



Para pequenos valores de peso o valor de X deve ser alto! O próximo passo e criar uma media móvel para que o tempo entre leituras parecer mais adequado. 



O código para o segundo teste ficou (muito tempo entre as leituras ótima repetibilidade):
const int DOUT = A5;      // Pino DT placa HX711
const int hxSCK = A4;     // Pino SCK placa HX711
unsigned long TARA = 0;
float kconst = 21097.164; // Fator para Kilograma pequenos pesos


void setup() {
  Serial.begin(9600);
  pinMode(hxSCK, OUTPUT);
  pinMode(DOUT, INPUT);
  Serial.println("Aguarde estou zerando!");
  TARA = setTARA();
  Serial.println("Estou pronto!");
}

void loop() {
     Serial.print(Peso());
     Serial.println(" Kg");
     delay (10); //Aguarda 10ms

}


unsigned long CAPTURA(){
  unsigned long CAPTURA = 0;
  unsigned long MEDIA = 0;  
  for (int j=0; j<5; j++){             // loop 5 para media
  CAPTURA = 0;
  digitalWrite(hxSCK, LOW); 
  while (digitalRead(DOUT)==1) ;
  for (int i=0; i<24; i++){             // loop 24 pulsos
        digitalWrite(hxSCK, HIGH); 
        CAPTURA = CAPTURA<<1;
        digitalWrite(hxSCK, LOW);
        if(digitalRead(DOUT) == 1) CAPTURA++;
        } 
   // pulso extra 25 pulsos proxima leitura canal A ganho 128     
   digitalWrite(hxSCK, HIGH); 
   delayMicroseconds(10); 
   digitalWrite(hxSCK, LOW);
   //-------------------------------------------------------
  CAPTURA ^= 0x00800000; 
  MEDIA += CAPTURA;
  }
   CAPTURA = MEDIA/5;
 return CAPTURA;
}



unsigned long setTARA(){
  // reseta o conversor HX711
  digitalWrite(hxSCK, 1);  
  delay (200);
  digitalWrite(hxSCK, LOW); 
  delay (1);
  // -------------------------
 return Media(70);
}    

float Peso()
{
    long peso = (Media(50) - TARA);
    return (float) peso / kconst;
}

long Media(byte vezes)
{
    long soma = 0;
    for (byte i = 0; i < vezes; i++)
    {
        soma += CAPTURA();
    }

    return soma / vezes;
}

  


Hx711 5ª Parte - 1º TESTE

Primeiro teste da balança com o HX711.

    Teste realizado com a balança modificada ligada ao Arduino rodando o código para testes descrito na 3ª Parte. Capturamos os dados abaixo, estes foram importamos para o Excel e realizados os cálculos de media, unidade por 100 gramas, etc.

    Valor de médio para captura sem nada em cima da balança (Tara (0,0Kg) = 7949858
    Valor médio com uma pequena bomba d´água sobre a balança 3,6Kg = 83038559,6

    Subtraindo  o valor da Tara do valor da media de 3,6Kg temos aproximadamente 88702 para acharmos o valor por 100 gramas dividimos por 36 o que da aproximadamente 2464 unidades por 100g.

Dados das amostras:


TARA 0Kg 3,6Kg
7524520 8381613
8348843 8148035
8272774 7751601
7663887 8055293
7512317 8387623
8162537 7583913
7828196 8166046
7430495 8357579
8018877 8278283
8370994 7479209
8197661 8380798
7548866 8145954
8340631 7645763
8286908 8070427
7693389 8387336
7492601 7546332
8138838 8240674
7858268 8365151
7422029 8187434
7979998 7603162
8366474 8388085
8229613 7989822
7759448 7862063
8295154 8247079
8338762 8360023
7883126 7420778
7420084 8335708
7977734 8298019
8088607 7437824
7482709 7765166
7687533 8388607
8243542 7837176
8370635 7997023
7432605 8388417
7957698 8338794
8354402 7419103
8293572 8359419
7727311 8253468
8240719 7492450
8367224 7874665
8044706 8388607
7440347 7744070
7737593 8021105
8257996 8387615
7653385 7577870
Média 7949857,956 8038559,6
Diferença 88701,64444
P/3,6Kg 2463,934568 por 100g


Validação:

    Após os primeiros cálculos, foi colocado um balde com água 6,4Kg (pesado em outra balança digital 180Kg) para validação dos dados, o valor médio de amostra foi 8106503 retirando o valor da Tara temos 156645 dividindo pelo valor por 100 g  obtivemos 63,58 ou aproximadamente 6,4Kg. Como são balanças para 180,0 Kg vou considerar que mesmo errando 340 gramas na primeira tentativa estamos no caminho.... 
    Vamos escrever outras partes do código, começando por implementar a Tara e um calculo de media para as amostras! 

 A bomba d´água  foi pesada dentro da sua caixa (3,6Kg) para a coleta de dados!

sábado, 27 de junho de 2015

Hx711 4ª Parte

HX711 - Alterações balança de banheiro.

     Para os testes esta sendo usada uma balança digital de banheiro, um modelo bem simples (baixo custo), para isto modificamos as ligações originais e posteriormente será montada uma versão melhorada.

    A foto abaixo mostra a montagem original de fabrica.

    A placa de circuito no detalhe.

   Com um multímetro verifiquei a ligação dos 4 (quatro) sensores de peso, depois vou detalhar os sensores e as ligações, por enquanto o importante é deixar claro que são 4 (quatro) sensores de carga meia ponte (Half Bridge Load Cell )
   Foram cortados os fios das ligações originais e refeitas as ligações para usar o HX711. Os fios dos sensores foram soldados ao canal A do modulo HX711, o canal B ficou sem ligações como pode ser visto na foto abaixo.


    Para a saída dos fios para o Arduino foi aberto um pequeno canal no corpo da balança, como pode ser visto abaixo. 

    O software feito para o primeiro teste lê o conversor AD e envia para o computador pela porta USB (terminal serial) a cada um segundo (1000 mili segundos).

     Detalhe do corte na lateral para a saída dos fios para o Arduino.

    Ligação com o Arduino em detalhe.


HX711 3ª Parte

HX711 ADC 24bits Exemplo Código C (data sheet).

O código C exemplo do data sheet: (Comentado)

Reference Driver(C)
 //------------------------------------------------------------------- 
sbit ADDO = P1^5; 
sbit ADSK = P0^0;
unsigned long ReadCount(void){ 
     unsigned long Count; 
     unsigned char i;
     ADDO=1; 
     ADSK=0;                                  \\Coloca SCK em 0 
     Count=0;                                    \\ Zera a variável Count 
     while(ADDO);                            \\ Aguarda o pino DT ir para 0 - baixo
     for (i=0;i<24;i++){                      \\Loop para ler os 24 bits
                 ADSK=1;                       \\Coloca SCK em 1
                 Count=Count<<1;           \\Desloca para a esquerda a variável Count
                 ADSK=0;                       \\Coloca SCK em 0
                 if(ADDO) Count++;        \\Testa se DT = 1 se for incrementa a variável Count
           }
     ADSK=1;                                    \\Coloca SCK em 1
     Count=Count^0x800000;             \\Count = Count XOR 0x80 00 00
     ADSK=0;                                     \\Coloca SCK em 0
     return(Count);                                \\Retorna o valor da conversão para o código principal
 } 

O mesmo código adaptado para usar em testes no ARDUINO.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
const int DOUT = A5;      // Pino DT placa HX711
const int hxSCK = A4;     // Pino SCK placa HX711

void setup() {
  Serial.begin(9600);
  pinMode(hxSCK, OUTPUT);
  pinMode(DOUT, INPUT);
  // reseta o conversor HX711
  digitalWrite(hxSCK, 1);  
  delay (200);
  digitalWrite(hxSCK, LOW); 
  // -------------------------
   Serial.println(" INICIO");
}

void loop() {
  
     Serial.print(Converte());
     Serial.println(" AMOSTRA");
     delay (1000); //Aguarda 1 segundo

}


unsigned long Converte(){
 unsigned long CAPTURA = 0;  
  digitalWrite(hxSCK, LOW); 
  while (digitalRead(DOUT)==1) ;
  for (int i=0; i<24; i++){             // loop 24 pulsos
        digitalWrite(hxSCK, HIGH); 
        CAPTURA = CAPTURA<<1;
        //delayMicroseconds(10); 
        digitalWrite(hxSCK, LOW);
        if(digitalRead(DOUT) == 1) CAPTURA++;
        } 
   // pulso extra 25 pulsos próxima leitura do HX711 canal A ganho 128***     
   digitalWrite(hxSCK, HIGH); 
   delayMicroseconds(10); 
   digitalWrite(hxSCK, LOW);
   //-------------------------------------------------------
 CAPTURA ^= 0x00800000; 
  
 return CAPTURA;
}
Esquema de ligação:

sexta-feira, 26 de junho de 2015

HX711 2ª Parte

HX711 ADC 24bits DATASHEET

DESCRIÇÃO

    Baseado em tecnologia patenteada pela Avia Semiconductor, HX711 é um conversor analogio/digital com precisão de 24 bits.
    Canal A pode ser programado com um ganho de 128 ou 64, quando está ligado uma fonte de 5V  correspondente a uma entrada diferencial em larga escala tensão de ± 20mV ou ± 40mV respectivamente.
    Canal B tem um ganho fixo de 32.
    Regulador OnChip regula o fornecimento de energia  para o ADC e para o sensor (célula de carga).
    Entrada de clock é flexível. Pode ser de uma fonte de clock externo, um cristal, ou o oscilador on-chip.
    Os registradores internos são todos configurados através dos pinos do HX711.

CARACTERÍSTICAS


• Dois canais de entrada diferenciais selecionáveis
• PGA (amplificador com ganho programável) de baixo ruído On-chip. Ganho selecionável
de 32, 64 e 128 vezes.
• Regulador de tensão On-chip para alimentação da célula de carga e para alimentação analogica do ADC.
• Oscilador interno não exigindo externo uso de cristal externo opcional.
• On-chip power-on-reset
• Interface serial simples fácil programação
•  Taxa de dados de saída selecionável 10SPS ou 80SPS (amostras por segundo). Selecionável através de pinos, nenhuma programação necessária.
•  Rejeição simultânea para 50 e 60Hz
• Consumo de corrente incluindo a parte analógica regulador da fonte de alimentação on-chip:
  Operação normal <1,5 mA.
  Em modo de baixo consumo <1uA
• Faixa de tensão de alimentação de operação: 2,6 ~ 5.5V
• Faixa de temperatura de operação: -40 ~ + 85 ℃
• Encapsulamento 16 pinos SOP-16

APLICAÇÕES

• Balanças
• Controle de Processos Industriais



Entradas analógicas

O canal A entrada diferencial foi projetada para interagir diretamente com um sensor de ponte (celula de carga) com saída diferencial. Ele pode ser programado com um ganho de 128 ou 64. Os altos ganhos são necessários para condicionar o pequeno sinal de saída da celula de craga. Quando alimentado com 5V, estes ganhos correspondem a uma faixa de tensão diferencial  de entrada de ± 20mV ou ± 40mV respectivamente.
Entrada do canal B diferencial tem um ganho fixo de 32. A faixa de tensão diferencial  de entrada é de  ± 80mV quando alimentado com 5V.

Opções de CLOCK

Ao conectar o pino XI ao terra, o oscilador interno é ativado. A taxa de amostragem nominal de saída utilizando o oscilador interno é 10 SPS (TAXA = 0) ou 80SPS (TAXA = 1) (amostras por segundo).
Se for necessário  taxa de amostragem precisa,  pode ser utilizado cristal ou um sinal de clock externo de referência. O cristal é conectado diretamente aos pinos XI e XO. O sinal de CLOCK externo pode ser ligado ao pino XI, através de um capacitor 20pF. Este sinal de clock não é necessita ser uma onda quadrada. Ele pode vir diretamente do pino de saída de cristal o chip microcontrolador, com amplitude maior que 150 mV.
Ao usar um cristal ou um sinal de clock externo, o oscilador interno é desligado automaticamente.

Taxa de amostragem e formato dos dados.

Ao usar o oscilador interno, a taxa de dados de saída é tipicamente 10 (Taxa = 0) ou 80SPS (TAXA = 1).
Ao utilizar sinal de clock externo ou um cristal, taxa de dados de saída é diretamente proporcional à frequência do sinal de clock ou do cristal. Usando um sinal de clock ou um cristal de 11.0592MHz a taxa de amostragem sera exatamente de 10 (RTE = 0) ou 80SPS (TAXA = 1).
A saída de 24 bits de dados está no formato de complemento de dois. Quando o sinal diferencial de entrada sai da faixa de 24 bits, os dados de saída ficarão saturados pelo 800000h (MIN) ou 7FFFFFh (MAX), até que o sinal de entrada volte para a faixa de leitura.

Interface Serial 

Os pinos PD_SCK e DOUT são utilizados para leitura de dados, seleção de entrada, seleção de ganho e colocar em modo de baixo consumo.
Em quando os dados de saída não estão prontos para leitura, o pino de saída digital DOUT fica em nível logico 1 (alto).
O pino de entrada de clock PD_SCK entrada deve ficar inicialmente em 0 (baixo). Quando DOUT vai para 0 (baixo), indica dados estão prontos para a leitura. Através da aplicação de 25 ~ 27 pulsos de clock no pino PD_SCK, os dados são deslocados para fora a partir do pino de saída DOUT. Cada pulso no PD_SCK desloca um bit para fora, começando com o bit mais significativo (MSB em primeiro lugar), até que todos os 24 bits são deslocados para fora. O 25º  pulso na entrada PD_SCK vai colocar o pino de DOUT de volta par nível logico 1 (alto) (Figura 2).
A seleção de ganho e a entrada é selecionada pelo número de pulsos no pino PD_SCK (Tabela 3).
O numero de pulsos no PD_SCK não deve ser inferior à 25 ou superior à 27 dentro do período de conversão, para evitar causar erros de comunicação.




Reset e Modo de Baixo Consumo

Quando chip é ligado, o power on-chip reset vai resetar o chip.
O pino de entrada PD_SCK é usado para colocar o HX711 em modo de baixo consumo. Quando a entrada PD_SCK fica em 0 (baixo), o chip fica no modo normal de operação.

Quando o pino PD_SCK permanece em 1 (alto) por mais de 60μs, HX711 entra em modo de baixo consumo (figura 3). Quando é usado o regulador interno do chip, tanto o conversor AD do HX711 quanto o transdutor serão desligadoa. Quando PD_SCK retorna para baixo, chip vai resetar e entrar em modo de operação normal.
Depois de um evento de reset ou da saída do modo baixo consumo, a seleção de entrada é padrão é o Canal A, com um ganho de 128.


Continua....
2ª PARTE DATA SHEET
3ª PARTE Primeiro Código
4ª PARTE HARDWARE - Alterações balança de banheiro
5ª PARTE 1º TESTE
6ª PARTE Média + TARA

Hx711 1ª Parte




Placa Hx711 Adc 24-bit para Células De Carga 


     Existem alguns modelos de placas disponíveis para compra on-line, a que eu tenho disponível para testes é do modelo da imagem abaixo.
     
         
     Este modulo conversor A/D e amplificador para células de carga HX711, consiste de um amplificador e um conversor de precisão de 24 bits analógico-para-digital desenhado parar balança industrial e aplicações de controle para ser ligado diretamente a um sensor de carga (célula de carga).
Comparado com outros chips, HX711 não só tem algumas funções básicas necessárias, também contém alta integração, resposta rápida, boa imunidade à ruídos, e outras características.
Os pinos de entrada do módulo sensor de peso são ligados diretamente a célula de carga, sem necessidade de outros componentes externos. A saída de dados tem um protocolo serial simples com exemplos de códigos  no data-sheet
É uma ótima escolha para os entusiastas de eletrônica para fazer em casa uma pequena balança.


O datasheet (folha de dados) pode ser abaixado em:
http://www.dfrobot.com/image/data/SEN0160/hx711_english.pdf

Continua....
2ª PARTE DATA SHEET
3ª PARTE Primeiro Código
4ª PARTE HARDWARE - Alterações balança de banheiro
5ª PARTE 1º TESTE
6ª PARTE Média + TARA