quarta-feira, 20 de julho de 2016

HX711 – Vários módulos HX711 em paralelo!

Utilizando vários módulos HX711 com a captura em paralelo!


Este código esta em construção, por enquanto somente a captura do canal A esta disponível em cada modulo HX711.

Resolvi atualizar no BLOG, pois acredito que a base para a captura em paralelo já foi construída, e para que não fosse dado um passo muito longo entre as postagens.

A ideia é para X amostras:

1 – Disparar a conversão dos N módulos  HX711

2 – Verificar qual já módulo HX711 terminou a conversão

3- Captura o que já terminou a conversão

3.1 – voltar a disparar a captura para este modulo

 4 – Voltar a (2) verificar qual módulo HX711 já terminou até atingir X amostras por módulo HX711.

O código abaixo  parece estar funcionando a contento para  2 módulos HX 711, ainda não testei com mais módulos.

#define numcelulas 2 // define o mumero de modulos hx711 a serem utilizadas
unsigned long tempo = 0;
float saida = 0;
int DOUT[numcelulas] = A5,A3;  // Pinos DT placa HX711
int hxSCK[numcelulas] = A4,A2;   // Pino SCK placa HX711

 // ALTERAR PARA SUAs CELULAs DE CARGA!!!!!
float kconst[numcelulas] = 21097.164, 21097.164; // Fator para Kilograma pequenos pesos

//Cria variaveis paras as celulas

unsigned long CAPTURAcell[numcelulas];
float pesos[numcelulas];
unsigned long TARA[numcelulas];
unsigned long MEDIAcell[ numcelulas ];


//______________________________________________________________________
//                      SUBROTINAS
//______________________________________________________________________
// Inicia o(s) HX711
void IniciaCAPT( int cell )

   digitalWrite(hxSCK[cell], LOW); 

//______________________________________________________________________
// pega valor HX711
unsigned long Pega( int cell )

   CAPTURAcell[cell] = 0;
   for (int i=0; i<24; i++)             // loop 24 pulsos
        digitalWrite(hxSCK[cell], HIGH); 
        CAPTURAcell[cell] = CAPTURAcell[cell]<<1;
        digitalWrite(hxSCK[cell], LOW);
        if(digitalRead(DOUT[cell]) == 1) CAPTURAcell[cell]++;
         
   // pulso extra 25 pulsos proxima leitura canal A ganho 128     
   digitalWrite(hxSCK[cell], HIGH); 
   delayMicroseconds(10); 
   digitalWrite(hxSCK[cell], LOW);
   //********************************************************
  return CAPTURAcell[cell] ^= 0x00800000;  

//______________________________________________________________________
void CAPTURA(int media)
int Pointermedia [numcelulas]; 
int Pointerblock [numcelulas]; 
// zera e estarta todas as capturas
for (int i = 0; i < numcelulas; i++)
   CAPTURAcell[i] = 0;
   MEDIAcell[i] = 0;  
   Pointermedia[i] = 0; 
   Pointerblock [i] = 0; 
   digitalWrite(hxSCK[i], LOW); 
   
//******************************
  int Aguarda = 0;                                      // Variavel para testar se já capturou todos os canais
  while (Aguarda < numcelulas ) 
    for (int i = 0; i < (numcelulas); i++)
       if (digitalRead(DOUT[i])==0 && Pointerblock [i] == 0) 
          MEDIAcell[i] += Pega(i);                        // Soma o valor capturado ao balde da media
          //leituras [i][Pointermedia [i]] = MEDIAcell[i];
          Pointermedia [i] = Pointermedia [i] + 1;        // incrementa a cada vez que acrescenta um valor a media
         
              if (Pointermedia [i] == media )           // ja capturou todos os valores do canal i
                  MEDIAcell[i] =  (long) MEDIAcell[i]/media;    // divide o valor do balde pelo numero de amostras
                  Pointerblock [i] = 1;                   // Bloqueia canal i pois ja encheu o balde
                  Aguarda++;                              // incrementa quando terminou a captura no canal i
                   else 
                    IniciaCAPT(i);                        // inicia a proxima captura
            
        
   

//______________________________________________________________________
void setTARA()
  // reseta o conversores HX711
  for (int i = 0; i < numcelulas; i++)  digitalWrite(hxSCK[i], HIGH); 
  delay (200);
  for (int i = 0; i < numcelulas; i++)  digitalWrite(hxSCK[i], LOW); 
  delay (1);
  // -------------------------
  CAPTURA(50);
  for (int i = 0; i < numcelulas; i++) 
      TARA[i] = MEDIAcell[i];
  

//______________________________________________________________________
void Peso()

    CAPTURA(20);
    for (int i = 0; i < numcelulas; i++)   
      pesos[i] = (long)(MEDIAcell[i] - TARA[i]);
      pesos[i] = (float) pesos[i] / kconst[i];
          
    

//______________________________________________________________________
// FIM SUBROTINAS
//______________________________________________________________________
void setup() 
  Serial.begin(115200);
  pinMode(hxSCK[0], OUTPUT);
  pinMode(hxSCK[1], OUTPUT);
  pinMode(DOUT[0], INPUT);
  pinMode(DOUT[1], INPUT);
  Serial.println("Aguarde estou zerando!");
  setTARA() ;
  Serial.println("Estou pronto!");

//______________________________________________________________________
void loop() 
     tempo = millis();
     Peso();
     tempo = millis()-tempo;  
     for (int i = 0; i < numcelulas ; i++)
         Serial.print("Celula");
         Serial.print(i);
         Serial.print(" = ");
         Serial.print(pesos[i],3);
         Serial.print(" Kg, ");
        
     
  
  Serial.print("Tempo= ");
  Serial.print(tempo);
  Serial.print(" ms");
  Serial.print(", SPS= ");
  Serial.print(float(20000/tempo)); // 125 Amostras  
  Serial.println(" Amostras/segundo p/ todos canais");


Módulo HX711

O primeiro teste foi feito com um módulo modificado capturando em ~90SPS e um módulo mini HX711 sem alterações com ~11SPS:
Resultado da primeira captura usando o Cod. Paralelo

O resultado foi conforme o esperado, o módulo HX711 mais lento determinou o valor de amostras por segundos para todo o grupo.

Modifiquei o módulo MiniHx711 (muito fácil de alterar) para que ele passa-se a capturar mais vezes por segundo.

O segundo teste foi feito com um módulo modificado capturando em ~90SPS e um módulo mini HX711 modificado com ~90SPS:


Captura paralela com dois módulos HX711 modificados.

No momento estou usando uma célula de carga de  20Kg e uma célula de carga de 2Kg sem seus fatores K ajustados.  Para estes testes iniciais os valores em quilogramas não estarem  ajustados não era importante.

Para os próximos passos, vou montar as células de carga em uma bancada mais adequada para realizar a calibração, (ajuste do fator K individual) e depois vou realizar outros testes comum maior rigor.




HX711 – Vários módulos HX711 em paralelo!

Nenhum comentário:

Postar um comentário