collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: telemetria para bateria lipo  (Lida 3570 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline rappa

  • Mini Robot
  • *
  • Mensagens: 47
telemetria para bateria lipo
« em: 20 de Novembro de 2010, 02:40 »
boas!

por algum tempo estive fora de projectos de electrónica mas como tem andado a chover tenho tido mais tempo:)

O projecto já começou:)

aqui vai:

O projecto veio a propósito de andar com aviões rc e como toda a gente sabe, ou devia saber, as baterias lipo não podem baixar a tensão a menos de 3V, sendo assim o meu objectivo é construir algum sistema que me diga quando devo parar de brincar e aterrar o bicho.

Sei que há vários sistemas, de todos os que conheço o que me interessou mais foi o da telemetria, que consiste num pedaço de componentes electrónicos no avião e outro pedaço de componentes electrónicos no comando e que comunicam entre si e vão dizendo ao "piloto" o estado da bateria e outros componentes.

alguns sistemas:

este tipo já possuo.








estes sao o que quero fazer.







esses últimos sistemas neste momento são um pouco dispendiosos e como um projecto de electrónica verdadeiro não se pode gastar muito dinheiro o meu segundo objectivo e não gastar $:)(ate agora só utilizei material que já tinha)

então meti mãos a obra, pequei em dois arduinos, cabos, um lcd 16*2, um modulo rf 433MHz, umas resistências, condensadores e alguma procura na net.


na procura encontrei



este é um esquema de um monitor para 3celulas "normal" dos primeiros que mostrei.

deste esquema o que me interessa são os divisores de tensão porque o autor da tinha feito os cálculos e no site dele dizia eu não me lembro do site nem guardei (sou um bocado toto).

então peguei num arduino e fiz algumas ligações com resistências, o lcd, uma bateria 3S e algum código e consegui medir a tensão nas 3 células. fiz mais um bocado de condigo e coloquei uma transmissor rf.

peguei no receptor e coloquei um led. como estou a começar pelo mais simples e ainda não consigo programar como gostava saiu o seguinte:

o arduino lê o valor da tensão em cada uma das células depois vê se é 2S ou 3S e vê se alguma das células esta a baixo dos 3.3V se nenhuma das células estiver a baixo dos 3.3V ele manda um sinal pelo transmissor  e faz com que o led pisque de segundo a segundo, se alguma das células estiver a baixo dos 3.3V ele manda um sinal que faz o led piscar de 5 em 5 milissegundos, entretanto vai mostrando no lcd o valor de cada uma das celulas e o valor total da tensão e a percentagem da carga que ainda resta a bateria.

no filme a seguir pode se ver o que fiz. devia ter tirado fotos, mas entretanto também ponho fotos:)
o filme não tem muita qualidade foi feito do tel.



o código que foi feito não é la muito famoso, eu gostava que o pessoal desse uma opinião sobre esse assunto que não é tanto a minha área :(

vou postar aqui o código mas não tenho a certeza se é esta a versão do filme. pode ter mais uns ajustes mas é parecido:)

Citar
#include <LiquidCrystal.h>  //incluir a libraria do lcd
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);  //RS-enable-D4-D5-D6-D7


//declarar variaveis

int analogOutPin = 9;
int sensorPin1 = A0;
int sensorPin2 = A1;
int sensorPin3 = A2;
int cel1=0;
int cel2=0;
int cel3=0;
float volt1 = 0;
float volt2 = 0;
float volt3 = 0;
float volttotal =0;
int pre = 0;
int temp = 0;
float cali=0.494;

void setup() {
 
  pinMode(8, OUTPUT);
  lcd.begin(16, 2); //quantas colunas tem o lcd 16colunas e 2 linhas

}

void loop() {
 
 
  cel1 = analogRead(sensorPin1);//variavel sem calculo para indentificar se 2S ou 3S
  cel2 = analogRead(sensorPin2);
  cel3 = analogRead(sensorPin3);
 
  while ((cel1<10) and (cel2<10) and (cel3<10)){
   
    cel1 = analogRead(sensorPin1);
    cel2 = analogRead(sensorPin2);
    cel3 = analogRead(sensorPin3);
    delay(100);
    lcd.clear();
    lcd.setCursor(0, 0);   
    lcd.print("conectar bateria");
    lcd.setCursor(5, 1);   
    lcd.print("RaPPa");
  }
 
  //detinguir de 2S ou 3S
 
  while (cel3<10 and cel2>10 and cel1>10){   
      digitalWrite(8, HIGH);
      cel3 = analogRead(sensorPin3);     
    //para 2S
   
       
        volttotal=0;
        volt1 = (analogRead(sensorPin1)*cali)/100;  //calculo da voltagem da celula 1
        volt2 = ((analogRead(sensorPin2)*2*cali)/100)-volt1;  //calculo da voltagem da celula 2
        volttotal = volt1+volt2;
       
     //calculo da percentagem em 2S
     
         if (volt1 < volt2 ){
           pre = ((volt2-3.3)/0.9)*100;
         }
          else // caso contrário, isto é voltagem2 > voltagem1
         {
           pre = ((volt1-3.3)/0.9)*100;
         }

     //mostrar valores das celulas no lcd
       
        lcd.clear();
        lcd.setCursor(0, 0);    //começa a escrever na coluna 0 e na linha 0                           
        lcd.print(volt1); //mostra no lcd a variavel voltagem1

        lcd.setCursor(5, 0);   
        lcd.print(volt2);
       
        lcd.setCursor(10, 0); 
        lcd.print("2S");
       
        lcd.setCursor(0, 1);   
        lcd.print(volttotal);
        lcd.setCursor(5, 1);
        lcd.print(pre);
        lcd.setCursor(7, 1);
        lcd.print("%");
       
        lcd.setCursor(9, 1);
        lcd.print("RaPPA");
       
        delay(100);
 
 
                  //sistema bateria fraca em 2S         
                       while ((volt1 < 3.3 and cel1>10) or (volt2 < 3.3 and cel2>10)){
                       
                         cel1 = analogRead(sensorPin1);
                         cel2 = analogRead(sensorPin2);
                         cel3 = analogRead(sensorPin3);
                         digitalWrite(8, HIGH);
                         delay(30);
                         digitalWrite(8, LOW);
                          volt1 = (analogRead(sensorPin1)*cali)/100;  //calculo da voltagem da celula 1
                          volt2 = ((analogRead(sensorPin2)*2*cali)/100)-volt1;  //calculo da voltagem da celula 2
                          volttotal = volt1+volt2;
                         
                         
                          lcd.clear();
                          lcd.setCursor(0,0);
                          lcd.print("bateria fraca");
                         
                          lcd.setCursor(0, 1);   
                          lcd.print(volt1);
                          lcd.setCursor(5, 1);   
                          lcd.print(volt2);
                          delay(30);
                          }
        digitalWrite(8, LOW);
        delay(500);
   }
   
   while(cel3>10 and cel2>10 and cel3>10) {   
     //para 3S
    digitalWrite(8, HIGH);
    cel1 = analogRead(sensorPin1);
    cel2 = analogRead(sensorPin2);
    cel3 = analogRead(sensorPin3);
       
        volttotal=0;
        volt1 = (analogRead(sensorPin1)*cali)/100;  //calculo da voltagem da celula 1
        volt2 = ((analogRead(sensorPin2)*2*cali)/100)-volt1;  //calculo da voltagem da celula 2
        volt3 = ((analogRead(sensorPin3)*cali*3)/100)-(volt1+volt2);  //calculo da voltagem da celula 3
        volttotal = volt1+volt2+volt3;
       
       
        //calculo da precentagem em 3S
 
         if (volt1 < volt2 or volt3 ){
               pre = ((volt1-3.3)/0.9)*100;
             }
              else // caso contrário, isto é voltagem2 < voltagem1
             {
               if (volt2 < volt3){
                   pre = ((volt2-3.3)/0.9)*100;
                   }
                   else//caso contrario voltagem3 < voltagem 1
                   {
                     pre =((volt3-3.3)/0.9)*100;
                   } 
              }
           
          //mostrar valores das celulas no lcd
     
          lcd.clear();
          lcd.setCursor(0, 0);    //começa a escrever na coluna 0 e na linha 0                           
          lcd.print(volt1); //mostra no lcd a variavel voltagem1
          lcd.setCursor(5, 0);   
          lcd.print(volt2);
          lcd.setCursor(10, 0); 
          lcd.print(volt3);
       
         
          lcd.setCursor(0, 1);   
          lcd.print(volttotal);
          lcd.setCursor(6, 1);
          lcd.print(pre);
          lcd.setCursor(8, 1);
          lcd.print("%");
         
          lcd.setCursor(10, 1);
          lcd.print("RaPPA");
         
          delay(100);
         
           //sistema bateria fraca
               
               
               while ((volt1 < 3.3 and cel1>10) or (volt2 < 3.3 and cel2>10)or (volt3 < 3.3) and (cel3 > 10) ){
                     
                 
                      cel1 = analogRead(sensorPin1);
                      cel2 = analogRead(sensorPin2);
                      cel3 = analogRead(sensorPin3);
                      digitalWrite(8, HIGH);
                      delay(50);
                      digitalWrite(8, LOW);
                      volt1 = (analogRead(sensorPin1)*cali)/100;  //calculo da voltagem da celula 1
                      volt2 = ((analogRead(sensorPin2)*2*cali)/100)-volt1;  //calculo da voltagem da celula 2
                      volt3 = ((analogRead(sensorPin3)*cali*3)/100)-(volt1+volt2);  //calculo da voltagem da celula 3
                      volttotal = volt1+volt2+volt3;
                 
                                   
                      lcd.clear();
                      lcd.setCursor(0,0);
                      lcd.print("bateria fraca");
                     
                      lcd.setCursor(0, 1);   
                      lcd.print(volt1);
                      lcd.setCursor(5, 1);   
                      lcd.print(volt2);
                      lcd.setCursor(10, 1);
                      lcd.print(volt3);
                      delay(50);
                      }
                     
     digitalWrite(8, LOW);
     delay(500);
                     
   } 
   
   //volta a por as variaveis a 0
  pre=0; 
  volttotal=0;
  volt1 = 0;
  volt3 = 0;
  volt2 = 0;
  cel1 = 0;
  cel2 = 0;
  cel3 = 0;
delay(100);

sei que não era bem isto que no inicio estava a pensar ate porque queria fazer com dois arduinos e meter o lcd no receptor mas foi isto que fui fazendo agora vou precisar da vossa ajuda para fazer uma coisa a serio mas sem gastar muito dinheiro.
obrigado e agradeço respostas:)

André

Offline rappa

  • Mini Robot
  • *
  • Mensagens: 47
Re: telemetria para bateria lipo
« Responder #1 em: 21 de Novembro de 2010, 23:30 »
boas!

pessoal este fim de semana tive uma ideia que consiste em um monitor de baterias (que produz um bip), por um emissor e enviar esse bip para um receptor com fones e ouvir o bip.

decidi por a ideia em funcionamento

fotos e vídeo












pessoal preciso de ajuda para encontrar um modulo rf que dê para este projecto, claro que tem de ser baratinho.

comentem