Fundamentos das células de carga

Este texto está em rascunho

Princípio de funcionamento

Vamos começar lembrando como funciona um simples divisor de tensão

celulas_de_carga_divisores_automalabs.com.br

 

Nos três divisores acima a tensão é sempre a mesma: 6V. Com dois resistores de valor idêntico temos metade do valor da tensão no ponto A. Se experimentarmos aumentar o valor do resistor inferior a tensão medida aumenta como vemos no ponto B. Mas se em vez disso aumentarmos o valor do resistor superior a tensão medida diminui como vemos no ponto C.

Digamos que nós temos dois divisores de tensão cada um com uma resistência variável e que essas resistências variem ao mesmo tempo. Para medir o desequilíbrio entre os dois divisores isso não daria certo:

celulas_de_carga_divisores_2_automalabs.com.br

4V-4V = 0V

2V-2V = 0V

Note que a diferença entre as tensões dos pontos B e C é sempre zero. Para o medidor é como se nada estivesse mudando. Porém se invertemos a posição de uma das resistências variáveis nós passamos a poder medir o desequilíbrio:

celulas_de_carga_divisores_3_automalabs.com.br

B-C = 4V – 2V = 2V

A diferença de tensão se torna proporcional à variação das resistências

 

A medição desse desequilíbrio é o princípio da Ponte de Wheatstone. A medição de células de carga se baseia nesse princípio. A célula de carga é uma Ponte de Wheatstone (ou meia ponte) cujo valor dos resistores variáveis muda com a pressão exercida.  Uma particularidade muito importante é que ao contrário dos exemplos que usei onde a variação da resistência é facilmente mensurável, na célula de carga essa variação é muito pequena sendo que quando você a pressiona com os dedos é de apenas décimos de ohm, por isso é impraticável medir/testar com um ohmímetro.

Com a variação de resistência é muito pequena, a variação de tensão também é. Tão pequena que um Arduino não poderia medir diretamente (tipicamente varia menos de 1mV por kg). Para isso precisamos de um circuito chamado amplificador de instrumentação (um tipo de amplificador operacional) e a saída desse amplificador é conectada ao Arduino. Você está livre para escolher que amplificador de instrumentação usar mas o mais comumente usado em projetos com Arduino é o HX711, que além de ser amplificador especificamente desenhado para ler células de carga incorpora um conversor A/D de 24 bits. Uma resolução muito maior que a do Arduino, que é de 10 bits.

É também comum nas células de carga que a resistência que estamos considerando como fixa também varie, mas no sentido oposto. Ou seja: enquanto uma resistência aumenta de valor a outra diminui. Para simplificar as explicações neste texto eu vou considerar que uma resistência é sempre fixa.

 

As células de baixo custo, usadas em balanças de banheiro e vendidas para projetos de automação com Arduino costumam ter as seguintes características:

  • Apenas três fios, característico de meia ponte;
  • Dos dois resistores internos apenas um é variável (ativo, valor muda com o stress) e o outro é fixo, usado como referência. Vou considerar que o ativo seja o resistor ligado ao fio branco.

Como explicado acima, ao fazer as ligações você deve ter em mente que as resistências variáveis precisam ficar em lados opostos da ponte.

Esquemas de ligação

Nos esquemas a seguir considere o seguinte:

  • As células tem três fios nas cores vermelho, branco e preto;
  • Os círculos coloridos representam as cores dos respectivos fios;
  • Se você ligar tudo certinho e ainda assim ao pressionar uma das células não aparecer variação, inverta a polaridade de um (e apenas um) dos pares. Nos meus desenhos eu considero que ao aplicar stress na célula o valor da resistência ativa aumente (tração). Se o valor diminui (compressão) a polaridade é oposta ao representado nos meus desenhos.

Ligação de 2 células de 3 fios

celulas_de_carga_ligacoes_2x_1

Ligação de 4 células de 3 fios

Ao contrário da ligação com duas células aqui ligamos preto com preto e branco com branco. A idéia é sempre colocar os resistores ativos nos mesmos “braços” da ponte.

celulas_de_carga_ligacoes_4x_3_automalabs.com.br

 

Ligação de 1 célula de 3 fios

Esse modo não é recomendado, mas funciona. Você substitui uma das células de 3 fios por dois resistores de precisão do mesmo valor da resistência medida da célula que você vai usar. Como vai existir um resistor fixo no lugar onde deveria haver um variável, o valor da tensão entre S+ e S- é metade do do que haveria com duas células. Explicando de outra forma: se você fizer isso em uma balança, substituindo uma das células por resistores, o peso apresentado será metade do esperado.

A colocação de resistores também desbalanceia a ponte (em repouso a diferença entre S+ e S- é diferente do esperado) por isso é recomendado colocar um trimpot de precisão (multivoltas) de valor imediatamente superior no lugar onde deveria estar o resistor ativo da célula. Esse trimpot consegue balancear a ponte mas não tem nenhuma influência sobre o problema anterior.

celulas_de_carga_ligacoes_1x_1_automalabs.com.br

Apps Android para a criação de GUIs (HMI/MMI) de controle para seus projetos

Isso é basicamente um rascunho onde vou escrever minha opinião sobre algumas apps que testei.

O que me interessa:

  1. Poder criar uma ou mais telas (num tablet, uma tela pode bastar, mas num celular, nem sempre) com botões e indicadores a meu gosto;
  2. Não depender de internet, nem de servidores locais. Eu quero poder mandar mensagens diretamente para meus projetos, sem intermediários;
  3. Ter o controle sobre o conteúdo das mensagens, para poder criar meus próprios protocolos ou usar os que já uso.

NETIO – É uma app paga, mas é barata e atende os requisitos acima. Para cada botão na tela você pode definir um destino e mensagens distintos, logo numa mesma tela você pode mandar mensagens para diversos projetos. Você cria as telas em um editor online (não pode fazer no próprio celular), mas tudo é salvo em arquivos JSON que você pode baixar, guardar e editar em outros programas se quiser. Se o editor online desaparecer alguém da comunidade pode criar um editor offline, porque a app apesar de (para sua comodidade)  sincronizar via internet aceita que você coloque os arquivos manualmente na memória do telefone. Mas em anos a app e seu editor não evoluíram quase nada e NETIO está deixando a desejar em beleza e funcionalidade.

Para fazer múltipla seleção de elementos não clique, apenas segure SHIFT e mova o mouse sobre eles. Depois disso veja na aba seleção instruções para mover, dimensionar e apagar

A resolução definida no editor corresponde ao tamanho da janela que você vê, como parte do seu monitor. E não bate com a do dispositivo. Por exemplo, precisei definir 1050×1700 para o Samsung A5, que tem uma resolução de 720×1280.

Para aumentar as chances de que as páginas sejam exibidas corretamente em outros dispositivos, acrescente o atributo fittoscreen a cada página.

Não há opção de definir uma fonte no dispositivo ou uma relação entre a fonte no dispositivo e a do editor. Fontes muito pequenas no editor ficam muito grandes no aparelho, o que atrapalha muito o WYSIWYG.

Você pode especificar apenas arquivos PNG existentes no dispositivo, que não aparecem no editor, o que atrapalha muito o WYSIWYG.

VIRTUINO – Grande quantidade de opções de ícones para a GUI a tornam muito mais atraente que o NETIO, mas você não tem controle sobre o conteúdo das mensagens e por isso precisa usar as bibliotecas do Virtuino. Pior que isso, as opções padrão são muito engessadas, porque ele espera que cada comando seja para acionar ou ler um certo I/O no arduino. Você não pode, por exemplo mandar um código com um comando a ser interpretado, o que dificulta a criação de interfaces de controle remoto IR por Wi-Fi. Entretanto se o que você quer é justamente com alguns toques na tela definir que um botão x acione a saída y no arduino, Virtuino pode ser uma ótima escolha.

Tem suporte ao ESP8266 ESP-01, mas apenas como interface Wi-Fi, controlada por comandos AT (como vem de fábrica). Não tem suporte a programar um ESP-01 como se fosse um arduino.

O editor fica no próprio aparelho.

REMOTE XY – A versão free da app é bastante limitada e a paga custa hoje R$22. Editor online. Mais bonito que o NETIO mas com menos opções de elementos que o Virtuino. Não parece ter opção de fazer o download dos projetos. Não parece fazer proveito de telas grandes. Requer que você use um arduino e um módulo de comunicação (não permite usar um ESP-01 como se fosse um arduino). Elementos na tela são ligados diretamente ao I/O do arduino (você não pode definir mensagens).

ESP8266: Usar ESP Touch / SmartConfig é seguro?

Aparentemente, não.

Para quem não conhece, ESP Touch é o nome dado pela ESPRESSIF a um engenhoso método de comunicação de credenciais aparentemente copiado da Texas Instruments, que esta chama de SmartConfig (marca registrada Texas). Nesse método, um ESP8266 ainda não configurado, que não faz idéia de a qual rede se conectar e muito menos a senha, é colocado em “modo de monitoramento” e fica continuamente escutando o tráfego de todas as redes Wi-Fi a seu alcance (uma por vez, rapidamente).  Uma app rodando em um computador ou smartphone conectado a um roteador Wi-Fi o mais próximo do ESP8266 quanto possível transmite continuamente via pacotes UDP o SSID e a senha que você quer que o ESP8266 conheça.  Quando o ESP8266 finalmente esbarrar nessa informação ele se auto configura com o SSID e a senha coletados.

Nota: embora o protocolo permita que você transmita o SSID e a senha de um roteador diferente do qual está conectado, é recomendável que você se conecte ao mesmo roteador cuja senha quer dar ao dispositivo porque isso permite que a app detecte que o dispositivo se conectou (estarão no mesmo domínio de broadcast). Se o dispositivo se conectar a outro roteador provavelmente não será detectável. Por causa disso algumas apps nem te dão a opção de escolher o SSID.

Isso é possível mesmo numa rede criptografada porque a app codifica essa informação em um campo da transmissão Wi-Fi que qualquer um pode ver: o tamanho do pacote. É como usar código morse. O pacote continua criptografado, mas você pode ver o seu tamanho e esse tamanho corresponde a “uma letra” específica (não é exatamente assim, mas o princípio é esse).

Engenhoso e prático mas com um grande problema: qualquer outro dispositivo ou software compatível com SmartConfig ao alcance pode ver o mesmo tráfego e recuperar as credenciais de acesso. Aqui é explicado como se faz isso.

Aparentemente a Texas Instruments incluiu em versões mais recentes do Smart Config a capacidade de criptografar essa transmissão com AES. No caso a app e o dispositivo precisam ter combinado antes uma chave que vai ser usada para poder decodificar a transmissão (a app da Texas tem um campo para a chave, que vem em um QRCode no dispositivo). Essa é uma mudança trivial do ponto de vista do usuário, mas aparentemente não foi implementado no ESP8266. Segundo a documentação da biblioteca ESP8266 Arduino Core a sintaxe para iniciar o monitoramento é:

E apenas isso. Eu ficaria mais à vontade para usar o recurso se a sintaxe fosse algo como

E você precisasse colocar a mesma chave na app, junto com a senha do roteador.

A propósito, outro problema do SmartConfig é que raramente funciona e um dos problemas (mas não o único) é que o ESP8266 suporta apenas redes de 2.4GHz e a app não consegue diferenciar uma rede de 2.4GHz de uma de 5GHz. Pior ainda: se existirem duas redes com o mesmo SSID o Android dá preferência a se conectar à rede de 5GHz. Você ou o cliente do seu produto podem não se dar conta disso e o SmartConfig não vai funcionar. Usando o método “tradicional” de configuração se conectando ao SoftAP, pelo menos você tem menos chances de errar porque a varredura do ESP8266 só mostra as redes de 2.4GHz. Eu recomendo que você esqueça o SmarConfig e use SoftAP com CaptivePortal para a configuração.

ESP8266: Como obter o endereço IP do cliente HTTP

Essa informação é útil quando, por exemplo, você precisa determinar se o cliente está conectado pelo SoftAP, porque o endereço IP do cliente normalmente estará na faixa 192.168.4.x.

Só vai funcionar corretamente em uma função que manipule uma requisição do servidor, como as definidas por “WebServer.on()”. Em outras o resultado pode ser “0.0.0.0” ou o endereço IP de outro cliente.

Testado com ESP8266 Arduino Core 2.3.0.

 

ESP8266: O tamanho do stack é fixo em 4KB

Isso pode pegar você de surpresa. Mesmo com 30KB ou mais de RAM livre seu programa vai dar stack overflow com resultados imprevisíveis se você usar mais de 4KB em alguma rotina ou sucessão de rotinas encadeadas, o que é muito fácil usando, por exemplo, manipulação de strings com ArduinoJSON.

Isso é definido em cores\esp8266\cont.h:

#define CONT_STACKSIZE 4096

ESP8266: Problemas enlouquecedores provocados por alimentação

Se você acha que problemas de alimentação só podem levar a travamentos e resets vai ficar espantado. Estes são os problemas que podem ocorrer na falta de um capacitor eletrolítico de desacoplamento na linha de 3.3V, bem perto do chip:

  • SoftAP com funcionamento irregular, chegando a ser impossível usar. Fica aparecendo e desaparecendo da lista de APs detectados pelo celular;
  • No modo STA ou AP_STA não conecta a certos roteadores. Dá consistentemente erro de senha errada, apesar de consistentemente conectar a outros e funcionar por semanas sem problemas aparentes.

Problema detectado com diversos módulos ESP-01 usando o firmware ESP8266 Arduino Core. O mais louco é que o primeiro problema desaparece se você fizer um downgrade para a versão 2.0.0 do Core. Com as versões mais recentes 2.3.0 e 2.4.0-rc2 sempre se manifesta. Isso faz você achar que se trata de um bug de software quando se dá conta de que módulos programados dois anos atrás não manifestam o problema. Tirando esses problemas o módulo funciona aparentemente sem falhas.

Colocar um capacitor de 220uF x 10V (100uF podem bastar) entre os terminais +3.3V e GND do módulo resolve o problema

ESP8266: O que fazer quando WiFi.hostname() não funciona

Primeiramente é preciso que fique claro que o hostname definido nesta função é o chamado “DHCP hostname” e praticamente só serve para definir o que aparece na listagem de “DHCP leases” do roteador. Você não vai pode usá-lo para dar um “ping” a não ser que seu servidor DHCP seja também um servidor DNS. O ESP8266 já tem um hostname padrão no formato ESP_XXXXXX onde XXXXX são os seis últimos caracteres do endereço MAC e você não precisa usar WiFi.hostname() se esse hostname for suficiente para você.

Requerimentos para que WiFi.hostname() funcione:

  • A função precisa ser executada antes de WiFi.begin();
  • Só funciona se o ESP8266 estiver configurado para obter IP por DHCP;
  • Você precisa reiniciar o roteador e depois obter um IP por DHCP para ver o novo nome aparecer na lista.

Testado com ESP8266 Arduino Core 2.3.0.

 

Como fazer o Delphi executar uma função Javascript em um TwebBrowser

Meu exemplo é um resumo desta excelente explicação de Paul Johnson aqui.

Fazer isso é muito simples. Muito mais simples que o oposto, que é fazer o seu programa em Delphi responder a eventos que ocorrem no TwebBrowser.

Digamos que você tenha um componente TwebBrowser no seu projeto Delphi nomeado webbrowser1 que esteja carregado com uma página que tem a função javascript exibirGrafico(). Para chamar essa função você só precisa fazer algo assim:

Executar “ExecutaJS” no seu programa irá chamar a função “exibirGrafico()” carregada no documento HTML.

Note que a maior parte do que você vê acima é manipulação de erros. Se você não se preocupar com isso a procedure se resume a isto:

Só existe um inconveniente: você não pode receber o retorno da função. É possível contornar esse problema e o artigo de Paul explica como fazer, mas eu ainda não precisei dessa funcionalidade e por isso só vou abordar esse problema outro dia.

Note que o motivo número 1 para você se deparar com erros ao tentar executar o script é estar usando a configuração errada. O número 2 é esquecer que javascript é Case Sensitive. Isto é: exibirGrafico() e ExibirGrafico() são funções diferentes.

Como passar um parâmetro para a função.

Digamos que a função javascript exibirGrafico espere por um parâmetro texto que está no componente edit1. Você pode executá-la com algo assim:

 

Como criar um programa baseado em Chromium no Lazarus.

O Lazarus é mais ou menos uma tentativa de fazer uma versão opensource do Delphi.

Chromium é o nome da versão opensource do browser/navegador Google Chrome. Ao contrário do que acontece no Delphi, que já vem com tudo o que é necessário para criar um browser baseado no Internet Explorer, o Lazarus não vem com tal funcionalidade. O que vou explicar aqui será o suficiente para alguém que já programa em Delphi rodar sua primeira aplicação baseada no Chromium no Lazarus.

Você precisa de quatro coisas:

  • O Lazarus. Eu usei a versão 1.6.4 de 32 bits (em geral eu acho que versões de 64 bits só complicam as coisas);
  • Um componente chamado fpCEF3;
  • Um conjunto de bibliotecas e outros arquivos do projeto Chromium Embedded Framework (CEF);
  • O Winrar ou o 7-zip para poder abrir o arquivo acima.

É preciso ter em mente que o componente é feito para uma versão específica do CEF. Você deve baixar o componente e a versão do CEF feita para ele. Essa é possivelmente a parte mais complicada do processo e por isso eu vou detalhar aqui como eu fiz.

  • Vá na página de Releases do fpCEF3 e veja que versões estão disponíveis. Digamos que você queira fazer com a versão 3.3029, que hoje é a mais recente. Baixe o ZIP do source code dessa versão.
  • Vá na página de builds do CEF e procure pela build mais recente para o seu sistema operacional da versão que você escolheu. Note que nessa página existem seções para Linux, Windows e MAC OSX. 32 bits e 64 bits. Você deve baixar o aquivo “Standard” ou o “Minimal”. A build mais recente Standard para Windows de 32bits v3.3029 é esta. Você poderia usar a versão de 64 bits, mas enquanto está aprendendo é melhor limitar as complicações.

Baixar a build mais recente é importante porque o componente é configurado para a build mais recente. Não é frescura. Se você usar outra build pode ter problemas ao compilar ou rodar o programa.

Guarde esses arquivos porque senão mais tarde você pode ter problemas para refazer sua aplicação.

Instale o Lazarus;

OBS: No Lazarus a janela Mensagens é importante mas tem o hábito de desaparecer em segundo plano e deixar você sem saber o que está havendo. Sempre procure colocá-la em primeiro plano quando você achar que “algo deveria estar havendo” e você não está vendo nada.

Instale o componente. Isso é feito colocando a pasta “fpCEF3-x.xxxx” do componente dentro da pasta Components do Lazarus e depois clicando duas vezes em fpCEF3-x.xxxx\Component\cef3.lpk. Na janela que se abre clique em Compilar e aguarde aparecer “Sucesso” na janela de mensagens. Depois clique em Usar -> Instalar, em SIM no diálogo que vai aparecer e aguarde o Lazarus reiniciar.  Sim, ao contrário do Delphi o default do Lazarus requer reiniciar o editor ao instalar um componente. A partir desse ponto você deve ter uma aba “Chromium” na barra de componentes.

Descompacte a build do CEF. Você precisa do conteúdo das pastas “Release” e “Resources”;

O componente vem com projetos de exemplo. Para rodar um deles você precisa colocar na pasta do projeto os arquivos obtidos no passo anterior. Fica tudo misturado mesmo.

Como o Lazarus pode criar para várias plataformas ele pode “se perder” e querer compilar para Linux apesar de você estar no Windows. À esquerda do botão Executar existe o botão “Modo de Construção” (Build Mode) que controla isso. Certifique-se de estar no modo certo.

Problemas que podem acontecer:

Exceção ao rodar o programa pode acontecer ao usar a build errada do CEF ou porque o programa não está achando os arquivos.

Ao executar o navegador fica em branco: Experimente colocar um botão que ao ser clicado manda abrir o navegador no Google e clique nesse botão depois que o programa abrir completamente. Existe um problema de “timing” nos exemplos (que não ocorre nos exemplos do CEF4Delphi) que faz o programa ignorar a página que deveria abrir automaticamente. Se mesmo assim não funcionar a documentação diz que o CEF pode estar travando e talvez você precise de outra combinação de componente e build.

 

Como criar um programa baseado em Chromium no Delphi 7.

Chromium é o nome da versão opensource do browser/navegador Google Chrome. Normalmente você não precisa disso porque o Delphi 7 já vem com tudo o que é necessário para criar um browser baseado no Internet Explorer, que é o suficiente em projetos de automação (o foco deste blog). Na maioria das vezes os erros no uso de twebbrowser são provocados pela falta de uma configuração. Mas se por alguma razão o Chromium for realmente necessário, o que vou explicar aqui será o suficiente para alguém que já programa em Delphi rodar sua primeira aplicação baseada no Chromium.

Você precisa de quatro coisas:

  • O Delphi 7, claro;
  • Um componente chamado CEF4Delphi;
  • Um conjunto de bibliotecas e outros arquivos do projeto Chromium Embedded Framework (CEF);
  • O Winrar ou o 7-zip para poder abrir o arquivo acima.

É preciso ter em mente que o componente é feito para uma versão específica do CEF. Você deve baixar o componente e a versão do CEF especificada. Guarde esses arquivos porque senão mais tarde você pode ter problemas para refazer sua aplicação.

  • Baixe o CEF4Delphi aqui. Clique em “Clone or Download”;
  • Na mesma página, siga o link para baixar o arquivo do CEF desejado. Eu usei o de 32bits.

A instalação do Delphi4CEF é quase como a de qualquer outro componente:

  • Crie uma pasta vazia chamada “dcu” dentro do diretório “Sources”;
  • Clique duas vezes em “Sources\CEF4Delphi_D7.dpk”, compile e instale. Uma nova aba “Chromium” deve aparecer na barra de componentes;
  • Adicione o diretório Sources do componente ao Library Path do Delphi;

No diretório “demos” você encontrará diversos exemplos de uso, mas para funcionar você ainda precisa fazer algumas coisas:

  • Apague todos os arquivos que não são requeridos em um projeto do Delphi7. No meu caso a presença de algum deles estava travando o Delphi logo ao abrir o projeto;
  • Apague os arquivos .res (serão recriados automaticamente) para evitar um erro de access violation  em RLINK32;
  • Comente a linha {$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} no código-fonte.

A partir deste ponto você deve ser capaz de compilar o demo. Vai dar um erro “CEF Binaries Missing!” que significa que não pode achar o CEF, mas é normal e vamos resolver adiante. Mas enquanto o programa não compilar não adianta prosseguir. Se não compilar releia o explicado acima.

O programa compilou? Agora abra o arquivo do CEF no Winrar ou 7-zip (é normal demorar a abrir) e extraia todo o conteúdo dos diretórios “Resources” e “Release” para o mesmo diretório do exemplo que você quer rodar. Você precisa fazer isso para cada um deles que você queira rodar. Sim, os arquivos vão ficar misturados com os arquivos do projeto.

Agora execute o programa de novo. O navegador baseado em Chromium deve abrir.

Se continuar dando o erro “CEF Binaries Missing!” verifique se o código-fonte especifica onde devem ser colocados os arquivos. Por exemplo, o demo “Geolocation” faz as seguintes especificações:

Você pode comentar essas linhas (em especial as três primeiras) ou colocar os arquivos nos diretórios certos.