Category Archives: Informação

ESP8266: error: call of overloaded ‘println(time_t (&)())’ is ambiguous

Esse erro pode acontecer por diversas razões, mas no meu caso foi porque eu estava trabalhando em um exemplo feito por outra pessoa onde o desenvolvedor criou uma variável local chamada “now”. Eu fiz uma modificação acidental que escondeu a declaração da variável e então em vez do compilador me avisar disso ele assumiu que todas as referências a “now” no código fossem as declaradas em bibliotecas como a Time.h, que tem variáveis com o mesmo nome. E ele não sabia qual usar.

O compilador não tem como adivinhar sua intenção nesse caso.

A solução foi consertar a declaração que eu havia apagado, mas melhor ainda foi substituir todas as ocorrências de “now” no código por “agora” para evitar acidentes como esse no futuro. Eu acho que nós brasileiros levamos uma pequena vantagem nesse caso por usarmos naturalmente nomes de variáveis em português, o que evita a colisão com os nomes usados em bibliotecas, que geralmente estão em inglês. Se o nome da variável não fosse “now” minha ocultação acidental da declaração teria apenas causado um erro facílimo de entender do tipo “não foi declarada”. Tenha em mente que se o compilador tivesse encontrado apenas uma alternativa e assim não tivesse ficado confuso compilaria o código e eu estaria usando no meu programa o conteúdo da variável errada (a de uma biblioteca em vez da local) o que levaria a defeitos difíceis de debugar.

Postado em Informação | Tags: , | Deixe um comentário

Como criar um ícone transparente de alta resolução para uso no Delphi 7

Este tutorial requer que você saiba o básico de edição de imagens (selecionar, recortar, redimensionar, etc). Eu não vou entrar em muitos detalhes aqui.

Para tornar o fundo da imagem transparente

Para este tutorial eu vou usar a imagem de uma engrenagem que pode ser obtida aqui. Eu recortei antes de começar o tutorial o que não era necessário para mim, o que incluía a sombra.

Usando o Paint.Net (estou usando a versão 4.2.1), selecione a região a tornar transparente. Usando a ferramenta Varinha Mágica, por exemplo, você usa SHIFT+CLICK para selecionar mais de uma região e reduz a Tolerância (indicada pela seta) se o corte automático estiver invadindo uma região que não deve. No exemplo abaixo dei um clique para selecionar a região externa e outro para selecionar a região no centro da imagem:

PaintNet_MagicWand_automalabs.com.br

Tecle DEL para apagar a região selecionada. O Paint.Net já mostrará que está definido como transparente usando o padrão xadrez característico.

PaintNet_TransparentCog_automalabs.com.br

Agora salve como PNG.

Se você precisa criar uma transparência mais complexa, pode usar o plugin Cut Color

Uma alternativa online ao Paint.Net para a criação da transparência está aqui.

Converter o arquivo PNG para ICO usando o Icon Workshop

Obs.:

  • Neste tutorial eu estou usando o Icon Workshop 6.53;
  • É possível que o Icon Workshop tenha ferramentas embutidas para definir a transparência sem precisar de ferramentas extras, mas nesse momento eu não sei como fazer e por isso usei o Paint.Net;
  • Tenha me mente que um arquivo ICO é uma coleção de imagens. Ele pode conter apenas uma, mas também pode conter muitas, que são selecionadas pelo Windows de acordo com a necessidade.

Você precisa abrir o arquivo PNG no Icon Workshop (IW). Isso pode ser feito de diversas maneiras:

  • CTRL-G para a busca de mídia;
  • Clicando no botão Browse;
  • ou arrastando a imagem para a janela do IW.

iconWorkshop_ImageLoaded_automalabs.com.br
Na janela onde aparece a imagem, clique no ícone no canto superior esquerdo. Aquele que tem um “I”:

IconWorkshop_ConvertToIco

O IW te mostrará todas as opções de criação para Windows:

 

IconWorkshop_AsNewIcon_automalabs.com.br

Se você vai usar sua aplicação em um sistema do Windows Vista em diante, marque a caixa indicada pela primeira seta.

Se o PNG for salvo dentro do ICO (um arquivo ICO é uma coleção de imagens) como compressed PNG o Delphi não poderá usá-lo e poderá até não conseguir compilar mais, acusando erro RLINK32: Out Of Memory. Então você precisa desmarcar a caixa apontada pela seta inferior.

Clique em OK, a imagem aparecerá no IW agora como um conjunto de imagens:

IconWorkshop_IconePronto_automalabs.com.br

Atente para as miniaturas. Se alguma (geralmente a primeira) exibir um símbolo de compressão alguma coisa deu errado e a imagem ainda está como PNG Compressed. Clique com o botão direito sobre a miniatura e desmarque a opção indicada.

IconWorkshop_PNGCompressed_automalabs.com.br

Agora você já pode salvar o ícone e carregá-lo no Delphi 7.

 

Não consegue usar o Icon Workshop?

Existem ferramentas online como icoconvert.com que fazem a criação do ícone para você. Se você fizer o upload do PNG do nosso exemplo e escolher a opção “ICO for Windows 7, Windows 8, Vista and XP” o site te devolverá um arquivo ICO com 5 imagens (256×256, 48×48, 32×32, 24×24 e 16×16, todas RGB/A). Porém a primeira imagem está comprimida e o ICO será incompatível com a compilação no Delphi 7. Você poderá, entretanto, carregar esse ícone manualmente no arquivo EXE da aplicação usando o Resource Hacker.

Já se você escolher Custom sizes -> Multi sizes e selecionar apenas as opções 48×48, 32×32, 24×24 e 16×16 (abrir mão do ícone de 256×256) o resultado poderá ser compilado pelo Delphi 7.

Postado em Informação | Tags: , | Deixe um comentário

Delphi: Como atualizar a área de trabalho programaticamente

Se você estiver experimentando novos ícones para a sua aplicação pode ser enganado pelo fato do Windows manter um cache com os ícones apresentados no desktop e assim os ícones nos atalhos podem permanecer os mesmos até pelo menos o Windows ser reiniciado.

Para forçar o Windows a recarregar todos os ícones, acrescente shlobj na seção USES do form e dê o seguinte comando:

SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);

Você deverá notar o desktop “piscar”.

Testado com Delphi 7 e Windows 8.1 64 bits.

 

Postado em Informação | Tags: , | Deixe um comentário

Delphi 7: Erro RLINK32 Out Of Memory ao tentar trocar um ícone

Abra o ícone que você está tentando inserir no Icon Workshop ou outro editor de ícones e verifique se uma ou mais das imagens (um arquivo .ICO pode conter várias) não está em um formato comprimido como “PNG Compressed”. Se estiver, desmarque a opção, salve e recarregue o ícone no Delphi. Isso é suportado pelo Windows Vista em diante mas o Delphi 7 não sabe como manipular.

Postado em Informação | Tags: , | 1 Comment

Módulo para leitura de células de carga HX711

modulo_hx711_DSC03192_640_automalabs.com.br

Datasheet do CI HX711

Se você precisa medir peso com o Arduino esse é o módulo geralmente requerido. Permite conectar até dois conjuntos de células de carga (duas balanças).

Trata-se essencialmente de um amplificador de instrumentação de duas entradas multiplexadas incorporado a um conversor A/D de 24 bits. O que permite uma resolução muito superior à que seria obtida ligando um amplificador de instrumentação diretamente a uma entrada analógica do Arduino, cujo conversor A/D é de 10 bits.

  • Alimentação de 2.7 a 5.5V;
  • Saída digital a dois fios;
  • Duas entradas multiplexadas. Você pode usar apenas a entrada A, se quiser;
  • Taxa de amostragem selecionável de 10 ou 80 amostras por segundo;
  • Ganho selecionável de 32, 64 e 128.

Este é o o diagrama / esquema do módulo:

hx711_module_diagram_2

É quase a mesma coisa que o diagrama típico apresentado no datasheet, com o acréscimo de C4, C5, C6, R8 e R9.

Note que existem duas referências de terra: GND e AGND

Como fazer a leitura

O valor do registrador de 24bits com o resultado da medição é lido serialmente dando 24 pulsos no pino SCK e coletando os bits no pino DT. Isso é realmente simples de fazer mesmo sem uma biblioteca, mas como elas existem vamos usá-las até porque torna o código mais fácil de entender.

A biblioteca de uso mais simples que conheço é a do chinês aguegu. Você precisa fornecer à biblioteca quatro informações:

  • qual o pino de clock;
  • qual o pino de dados;
  • o valor de offset;
  • o valor do ratio.

Você pode usar dois pinos quaisquer. A biblioteca usa nos exemplos os pinos A0 e A1 mas estes são usados no modo digital. Pinos analógicos não são requeridos.

O valor de offset é o valor que o HX711 fornece quando a balança está em repouso (seria o “zero” da balança). Para obtê-lo deixe a balança sem peso e rode o seguinte sketch:

O valor impresso na serial pelo sketch é o offset. É normal que seja um valor grande como 8447426. Note que esse valor é aproximadamente metade de 16777215 (o maior valor possível com 24 bits). Isso é esperado porque o hx711 também lê valores negativos. Agora coloque um peso conhecido na balança, como 1kg (1000g), e execute novamente o sketch acima para obter o que a balança vê agora. Esse valor deve ser maior que o valor obtido de offset. Se não for, experimente inverter os fios S+ com S- e repita. Vamos chamar esse novo valor de “w”. Agora faça a seguinte conta para obter o ratio:

ratio = (w - offset) / 1000

E preencha os valores obtidos no sketch abaixo:

O programa de exemplo acima deverá agora dar o valor aproximado de qualquer peso medido, em gramas.

Nota: a biblioteca tem um bug que faz a execução ser muito lenta. Para corrigir, abra hx711.cpp e os exemplos e mude todas as referências a averageValue() para averageValue(1). Isso na prática anula a função averageValue(), mas elimina o retardo. É melhor você tirar sua própria média dos valores lidos no loop (sugiro uma média móvel) para evitar paradas desnecessárias na execução do programa.

Postado em Informação | Deixe um comentário

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

Postado em Informação | Deixe um comentário

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).

Postado em Informação | Deixe um comentário

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.

Postado em Informação | Tags: | Deixe um comentário

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.

 

Postado em Informação | Tags: | Deixe um comentário

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

Postado em Informação | Tags: | Deixe um comentário