Módulo LCD TFT SPI baseado em chip ILI9341, com leitor SD.

ILI9341_DSC01460_automalabs.com.br

  • Área visível: 2.2 polegadas;
  • Resolução: 320×240;
  • Alimentação: 5 ou 3.3V (veja adiante);
  • Sinalização: 3.3V;
  • A operação do leitor SD é completamente independente;
  • Esta tela não tem touchscreen.

ILI9341_fundo_DSC01453_automalabs.com.br

Componentes relevantes

  • U1: regulador de tensão XC6206P332MR/LM6206N3 de 3.3Vx250mA.
  • Q1: transistor de controle do backlight;
  • U3: posição para memória flash SPI, como a EN25F80 (o pinout desta confere com o do módulo). Essa memória é selecionada pelo terminal F_CS e os demais sinais SPI são compartilhados com os do cartão SD.
  • Os resistores R1, R2 e R3, todos de 10K, funcionam como pull-ups para os terminas SS (SD_CS), SI (SD_MOSI) e SCK (SD_SCK) do cartão SD, respectivamente.

O leitor SD

Tenha em mente que apesar do leitor SD ter um conector quase exclusivo, você ainda precisa alimentá-lo pelo conector da tela. E cartões SD operam com 3,3V na alimentação e sinalização, por isso é recomendável que você conecte os terminais SPI do leitor SD aos terminais SPI da tela para aproveitar qualquer level shifter que você esteja usando. Eu fiz isso para aproveitar os terminais do HCF4050 (veja explicação adiante) e não encontrei nenhum problema.

A presença dos resistores R1 a R3 poderia interferir com o funcionamento da tela, que não tem esses pull-ups. Na realidade a resistência medida dos terminais SPI da tela para +3,3V é de 10M e para GND varia de 130 a 250K, então é possível argumentar que a tela usa resistores de pull-down nos terminais SPI, mas aparentemente não interferiu. É possível que essa diferença é que tenha feito o projetista do módulo separar os terminais SPI.

Terminais da tela

  • SDO/MISO: Não é realmente necessário usar e pode ser deixado desconectado. O terminal MISO é usado para “ler” informações do dispositivo SPI escravo e em quase 100% dos casos você não precisa ler nada de uma tela;
  • LED: Aciona o transistor Q1 para ligar o backlight. Isso significa que você não precisa se preocupar com a corrente neste terminal e qualquer sinal positivo ligará o backlight com brilho máximo. Acionar este terminal por PWM controla o brilho do backlight. Nos meus testes, o valor 10 no comando analogWrite já foi o bastante para leitura do display;
  • SCK: Clock SPI. Precisa ser ligado a um terminal do microcontrolador.
  • SDI/MOSI: Dados SPI. Precisa ser ligado a um terminal do microcontrolador.
  • DC/RS: Data/Command. Usado para alternar entre o modo de dados e o modo de comando da tela. Precisa ser ligado a um terminal do microcontrolador.
  • RESET: Pode ser deixado permanentemente ligado a +3,3V para operação normal do display, mas dessa forma o display só pode ser resetado desligando a alimentação e o ideal é que o display possa ser restado depois da alimentação ter estabilizado. Em algumas situações o display pode travar justamente ao ser conectada a alimentação  e levar algumas tentativas de desligar/religar até que o display “colabore”. Se você tiver uma saída sobrando no arduino/ESP8266, conecte-a a RESET e configure a biblioteca de acordo porque assim o display poderá ser resetado pelo programa e a operação será mais confiável.
  • CS: Chip Select da tela. Se você não estiver usando mais nada no bus SPI (como o leitor SD) pode ser deixado permanentemente ligado a GND para operação normal do display.
  • GND: Alimentação
  • VCC: Alimentação. Como o display tem um regulador de 3,3V você precisa alimentar aqui com 5V. Se quiser alimentar o display com 3,3V você precisa unir o jumper J1 com um ponto de solda. Pode ser que o módulo funcione com 3,3V aqui mesmo sem unir o jumper, mas você deverá notar o backlight tremeluzir e o funcionamento da tela pode não ser estável.

Tenha em mente que apesar de você poder escolher entre alimentar o módulo com 5V ou 3,3V, a sinalização precisa ser de 3,3V. Aparentemente o módulo não é danificado se você sinalizar com 5V (ligar direto a um Arduino) mas não aparecerá imagem. Algumas pessoas tiveram sucesso usando divisores de tensão com resistores mas eu prefiro usar um “level shifter” como o HCF4050. Outras opções são o HEF4050, o 74LVX245 e o 74AHC125

Mas se você usar um módulo microcontrolador de 3.3V como o ESP8266, pode e deve ligar os terminais diretamente. A propósito, este módulo foi testado com sucesso ligado a um ESP-03.

Sugestão de interface para uso com microcontroladores de 5V como o Arduino

Eu usei um HCF4050, que é o modelo de alta velocidade do 4050, mas é possível que funcione com o modelo tradicional, CD4050. O chip é colado com uma gota de cola Super Bonder ao header.

No exemplo abaixo eu fiz RST e CS passarem pelo level shifter, mas se você optar por não controlar esses sinais (leia todo o texto) isso não é necessário.

ILI9341_interface_4050_DSC01478_automalabs.com.br

interface_ili9341_4050_automalabs.com.br

Reparação

A informação a seguir foi obtida por medições enquanto eu reparava um módulo defeituoso e só é importante se você também precisar reparar um módulo. a tela pode ser descolada passando com cuidado um estilete entre ela e a placa.

ILI9341_DSC01456_automalabs.com.br

  • 1 – GND
  • 2 – RST
  • 3 – SCK
  • 4 – DC/RS
  • 5 – CS
  • 6 – MOSI
  • 7 – MISO
  • 8 – GND
  • 9 e 10 – +3,3V
  • 11, 12, 13 e 14 – Para o transistor Q1 (controle do backlight)

Problemas com alimentação

Se o display estiver apresentando estranhos pontos aleatórios piscando ou mudanças inesperadas de cor (por exemplo, uma região programada para ser verde aparecer parcial ou totalmente em outra cor e permanecer assim até ser redesenhada), experimente usar uma fonte de alimentação melhor. O display não é realmente exigente mas fontes chaveadas muito vagabundas podem causar problemas.

Bibliotecas

É importante escolher a biblioteca com cuidado se você vai controlar o display com um arduino. A velocidade e o consumo de flash variam muito entre bibliotecas.

Este módulo funciona igualmente com as versões ILI9340 e ILI9341 das bibliotecas Adafruit e também outras. Neste texto eu vou usar a medição de velocidade do exemplo graphicstest da Adafruit

Todas as variações a seguir requerem a biblioteca Adafruit_GFX instalada.

Adafruit_ILI9341 original

Download aqui.
Operação total leva cerca de 42s (removendo delays)

Adafruit_ILI9341_AS

Esta é uma modificação que encontrei para download aqui. Esta biblioteca tem o dobro da velocidade mas requer muito espaço na flash do Arduino. Só por usá-la você já precisa de 25KB. A biblioteca Adafruit original requer menos de 17KB na mesma situação.

Operação total leva cerca de 17s (removendo delays)

Adafruit_ILI9341_by_casemod
Download aqui (post 191)

Testada no arduino 1.0.5 em conjunto com Adafruit GFX Library version=1.1.3

Para adaptar o exemplo graphicstest para esta versão basta declarar assim:
Adafruit_ILI9341 tft = Adafruit_ILI9341();
em vez de
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, _rst);

Mas o display precisa estar ligado assim (hardware SPI):

  • DC: D9
  • CS: 10
  • SCLK: D13
  • MOSI: D11
  • RESET: +3,3V

Operação leva cerca de 22s (removendo delays)

Esta versão leva cerca de 20% a mais de tempo que a versão AS, mas compila graphicstest para apenas 20K. O mesmo que a versão original.
Esta versão tem suporte e um demo para ler um arquivo do cartão SD e exibir na tela, mas não testei ainda.

Apenas para comparação, aqui está o benchmark quando rodando em um ESP8266 @80MHz (biblioteca não registrada)

ESP8266 @160MHz (biblioteca não registrada)

ESP8266: Módulo modelo 3 (ESP-03)

ESP-03_DSC01438_automalabs.com.br

Este módulo não é diretamente compatível com protoboard pois o espaçamento entre terminais é de apenas 2mm. O espaçamento “tradicional” é de 2.54mm.

Este módulo não possui qualquer LED. Não existe qualquer indicação visual de funcionamento.

O componente onde está escrito “Rainsun” é uma antena cerâmica.

Memória flash de 512KB.

Pinout

Os pequenos retângulos coloridos sem texto representam as cores que eu costumo usar na fiação.

Na figura do módulo eu sobrepus as ligações que normalmente são indispensáveis para que o programa rode: CH_PD ligado a +3v3 e GPIO15 a GND através de um resistor.

Com a chave entre GPIO0 e GND fechada o módulo entra no modo de programação pela UART0.

Este módulo, ao contrário do ESP-01, não tem o sinal RESET disponível nos terminais, mas você pode alcança-lo se for bom com soldagem. Basta ligar o pad indicado abaixo ao terminal NC.

ESP8266-03_detalhe_reset_automalabs.com.br

Como este módulo opera com 3.3V, usando apenas o módulo eu consegui exibir imagens em um display ILI9341. E funciona muito mais rápido que usando um Arduino. Eu ainda não testei controlar o display e usar o WiFi no mesmo programa.

ESP8266: O propósito especial de GPIO0, GPIO2 e GPIO15 (boot e programação).

O estado das portas de entrada e saída de propósito geral 0, 2 e 15 do ESP8266 determina como vai ser o boot:

GPIO15 GPIO0 GPIO2 Modo Descrição
L L H UART Programação via porta serial UART0
L H H Flash Boot pela flash SPI (a flash que vem no módulo)
H x x SDIO Boot por cartão SD

Segundo o que é relatado aqui, essas três GPIO já contam com pull-ups fracos internamente, então você pode deixar ou flutuando se quiser que o estado seja alto ou usar pull-downs.

Para usar essas três GPIO no seu projeto é preciso planejar cuidadosamente.  Por exemplo, você pode até ter três botões nessas portas, desde que você faça o pull-up/pull-down necessário e que o botão em GPIO15 ao ser pressionado mande um sinal de nível alto (3.3V) e os outros dois mandem GND. E que você tenha uma razoável certeza de que ninguém vai estar pressionando os botões na inicialização.

Também tenha em mente que GPIO2 opera como UART1 TX durante a gravação da flash. Se você colocar um LED ali vai vê-lo piscar durante a gravação. E segundo o que é reportado aqui, algo similar ocorre com GPIO0. Isso significa que não é boa idéia ligar esses GPIO diretamente a VCC ou GND. Sempre use resistores. Aliás, como regra geral nunca ligue qualquer GPIO, de qualquer dispositivo, diretamente a +VCC ou GND.

Se você já tentou usar os médulos ESP-01 e ESP-03 pode ter ficado confuso com o fato de que de que o processo de boot/programação nos módulos parece diferente. Na verdade o processo é o mesmo mas no ESP-01 GPIO15 já fica permanentemente ligado a GND e para completar o ESP-01 tem o sinal RST disponível enquanto o ESP-03 não tem. Os tutoriais do ESP-01 fazem parecer que o RST é necessário para a programação, mas não é. O que importa é o estado desses três GPIO durante o boot e a função do RST é apenas provocar o boot. Você pode conseguir o mesmo efeito desligando e ligando a alimentação do módulo.

Como programar um ESP8266 como se fosse um Arduino.

Do jeito que sai da fábrica o módulo ESP8266 precisa ser usado através de comandos AT e você precisa de um outro microcontrolador (um Arduino, por exemplo) para fazer qualquer coisa útil.  Muitos viram isso como um desperdício de capacidade já que qualquer módulo ESP8266 tem mais RAM, flash e roda com um clock mais rápido que o Arduino Mega. Então meses depois do lançamento vários grupos começaram a trabalhar em métodos para usar o o ESP8266 de forma independente, mas o método que eu achei mais impressionante permite que que você use o ESP8266 como se fosse um Arduino, com o mesmo IDE e até mesmo boa parte das bibliotecas existentes. Não é o método mais rápido porque a cada vez que você faz o upload do programa, está recompilando e gravando todo o firmware, mas é o mais simples de configurar e usar.

Procedimento simplificado (o completo pode ser visto aqui)

  • Baixe e instale uma versão recente do IDE Arduino. Todas as versões a partir da 1.6 suportam a definição de novas placas. Se quiser fazer uma versão portável, leia esse meu outro post;
  • Nas preferências, adicione “http://arduino.esp8266.com/stable/package_esp8266com_index.json” em “Additional Board Manager URLs “;

arduino_ide_preferences_BoardsManager_automalabs.com.br

  • Abra o Boards Manager. Uma lista de boards disponíveis irá ser baixada da internet. Procure pela board ESP8266 (geralmente aparece no fim da lista). Clique, escolha a versão (hoje existem duas) e selecione “install”.  O download tem hoje pelo menos 150MB;arduino_ide_BoardsManager_automalabs.com.br
  • Selecione como placa o “Generic ESP8266 Module”;

arduino_ide_boards_esp8266_automalabs.com.br

A Sparkfun lista algumas coisas que você precisa saber ao programar. Relação entre pinouts, diferenças entre bibliotecas, a necessidade de “yielding”, etc.

Tenha em mente que programas feitos especificamente para o ESP8266 sequer passam na verificação se a board escolhida não for o ESP8266. Acusarão  erro de falta de bibliotecas, mesmo você sabendo que elas estão instaladas.

Diferenças entre as versões 1.6.x e 1.0.x do Arduino IDE que podem criar problemas.

  • Por default a versão 1.6.x salva automaticamente os sketches ao verificar ou fazer upload. Se você estava acostumado a fazer pequenas mudanças em um sketch salvo e fazer upload para testar e só salvar se/quando desse certo, no futuro vai descobrir que o código não funciona mais no cenário original e provavelmente não vai saber a razão. O editor salvou suas modificações experimentais sem aviso. Isso pode ser desligado nas preferências;
  • Até versão 1.0.x você podia tranqüilamente ter várias versões do IDE com configurações diferentes sem conflitos, descompactando o ZIP em diretórios diferentes. Isso ainda permitia que sua instalação fosse verdadeiramente portável. A partir da versão 1.5.x o Arduino passou a guardar/procurar suas preferências no perfil do usuário corrente, em %appdata%\Local\Arduino15\. Então uma mudança feita em uma cópia se propaga para outras cópias. Isso é ainda pior se você estiver usando o ESP8266 como board, porque tudo é instalado no perfil do usuário em vez de ser instalado no diretório do Arduino. Mova/copie sua instalação para outro computador e ela não funciona mais. Para contornar isso é preciso, logo depois de descompactar o ZIP, criar um diretório chamado “Portable” no diretório do editor. Ao executar o programa ele detectará a presença do diretório como uma instrução para não usar o perfil do usuário e guardará tudo nele.
  • Em algum ponto entre a versão 1.6.5 e a versão 1.6.7 o compilador passou a ser mais exigente com relação à declaração de funções. Código que compilava perfeitamente pode começar a dar um monte de erros do tipo “undefined”. Verifique se a função está sendo definida depois de ser chamada. Se estiver, isso é resolvido movendo a função para um ponto anterior ao ponto em que ela é chamada. O resultado é que “loop” e “setup” agora dão menos problemas se forem movidos para o final do sketch. Esse é o comportamento “correto” do C++. As versões anteriores do IDE é que estavam sendo “boazinhas” com você.

Receptores de controle remoto IR : Problemas para decodificar comandos.

Mantenha o receptor protegido da iluminação ambiente

Luz incidindo sobre o receptor, mesmo que não seja modulada, pode saturar (“cegar”) o sensor e dificultar sua capacidade de reconhecer outras fontes de luz. É por isso que receptores de aparelhos comerciais ficam dentro dos aparelhos, recuados.

Iluminação fluorescente é especialmente complicada

Muitos reatores eletrônicos para esse tipo de lâmpada operam numa freqüência muito próxima dos controles remotos comerciais e por isso os receptores podem ficar cegos por elas com muito menos iluminação. Isso também vale para TVs LCD: o backlight opera pelo mesmo principio e um receptor voltado para uma TV pode ficar cego.

Problemas com comandos de 36 bits

Se você estiver encontrando uma incomum dificuldade para decodificar remotos que usam comandos 36 bits (XBOX, GVT, OI) , experimente usar outro modelo de receptor.  Eu tive sucesso total usando o TSOP58238 onde um outro modelo mais antigo não decodificava comando algum. O sintoma é que a biblioteca “acha” que o comando é de 32 bits, mesmo sendo uma versão que reconhece comandos de 36 bits, então você pode demorar a perceber que o problema está no comprimento do código.

Controles de ar condicionado são mais complicados

O controle de ar condicionado pode ser muito diferente do controle IR tradicional. Geralmente o controle guarda o estado atual do aparelho e cada vez que você aperta um botão, TODO o estado é retransmitido. Cada parâmetro é um bit ou conjunto de bits na string de transmissão.

Com exceção, provavelmente, dos comandos POWER ON e POWER OFF.

Então, se você quiser transmitir um determinado estado completo, isso é fácil. Mas se quiser apenas aumentar ou diminuir a temperatura sem mexer nas outras configurações feitas, vai precisar entender o protocolo do aparelho e construir os comandos através de manipulação de bits.

Os que eu estudei são assim. Podem haver exceções, mas não vejo como o controle remoto poderia se manter sincronizado com o estado do aparelho, a não ser que este aceite um segundo protocolo, só para comandos discretos.

Módulo GPS V-KEL VK16U6

  • Saída UART TTL;
  • Alimentação de 3.6 a 5V (testado apenas com 5V);
  • Antena integrada;
  • Compatível com Arduino;
  • Pode ser ligado diretamente a um módulo bluetooth. O resultado é um GPS bluetooth que pode ser “lido” por um aparelho Android, por exemplo;
  • Também pode ser ligado diretamente a um módulo serial TTL USB para conexão com o computador.

GPS_module_VK16U6_DSC00712_3_automalabs.com.br

Informações gerais

  • O módulo transmite coordenadas uma vez por segundo, mesmo que não tenha o fix;
  • Você geralmente só precisa de VCC, GND e TX. Os outros fios podem ficar soltos;
  • O LED PPS (verde) pisca sempre que há um fix, no mesmo intervalo das transmissões;
  • Padrão 9600bps 8-N-1;
  • O módulo deve ser instalado com o lado da antena  ( lado oposto ao da identificação do módulo) voltado para o céu.
  • A conexão  “VCC_N” (entrada) é usada para colocar o módulo em modo de economia de energia;
  • A conexão  “PPS” (saída) fica ativa quando há um fix. Pode ser usada como interrupção para “acordar” outro dispositivo apenas quando o GPS tem uma localização.

Sensor de efeito hall S49e, 49e

hall_sensor_49e_automalabs.com.brEste sensor tem uma saída analógica que varia linearmente de acordo com a intensidade do campo magnético nas proximidades do sensor.

A tensão de saída do sensor “em repouso” (termo técnico: “tensão quiescente”) é metade da tensão de alimentação e varia para mais ou para menos de acordo com a intensidade e polaridade do campo. Ou seja: aproxime o pólo de um ímã e a tensão muda numa direção. Inverta a polaridade e a tensão mudará na direção inversa.

Suporta tensões de alimentação de 2.9 a 9V. Testado apenas com 3.3 e 5V.

O sensor satura com +-90mT (militesla) de fluxo.

A tensão máxima na saída do sensor quando saturado é um pouco menor que a tensão de alimentação. Por exemplo, com alimentação de 5V a saída será de no máximo 4.2V.

Sensibilidade de 14 a 18 mV por mT.

Usos:

  • Detecção de proximidade sem contato;
  • Medição de velocidade em máquinas rotativas;
  • etc.

Limitações

  • Não espere detectar campos magnéticos fracos com este tipo de sensor. Por exemplo, um ímã comum só é percebido por esse sensor quando está a alguns milímetros de distância;
  • Embora um dos usos do efeito hall seja detectar corrente elétrica, não espere encostar esse sensor em um fio e conseguir detectar algo. Quando aplicados a detecção de corrente os sensores hall são parte de um dispositivo maior que geralmente faz uso de um núcleo magnético para concentrar o campo produzido pelo fio (em outras palavras: você precisa de bem mais que o sensor para detectar algo).

Encapsulamento TO-92UA (minúsculo – menor que um transistor comum)

Para testar, basta alimentar e ligar a saída à entrada analógica A0 do Arduino e usar o exemplo padrão AnalogInOutSerial. Em repouso você verá na porta serial um valor próximo de 528. Qualquer valor muito diferente disso significa que há algum problema na ligação. Encoste um magneto no sensor e você deverá perceber variação nos valores para mais ou para menos dependendo do pólo que você encostar.

Você também pode, é claro, usar um multímetro. Em repouso a saída do sensor deve ser igual à metade da tensão de alimentação.

Drivers para chip USB – serial UART CH340, CH340G, CH341

O CH340 / CH341 é um chip USB serial chinês que vem substituindo com sucesso os tradicionais chips da Silabs (CP2101, CP2104) e Prolific (PL2303) em diversos produtos e está presente em diversos clones do Arduino fabricados na China.

Direto do fabricante chinês. O link é para a versão Windows, mas na página você tem links para versões MAC, Linux e até Android

 

Fique de olho no tamanho do arquivo de log do arduino

Em certas circunstâncias, notadamente se você desplugar a placa e mantiver o IDE aberto, o arquivo de log criado pelo arduino pode ficar gigantesco, com dezenas de gigabytes, consumindo todo o seu espaço em disco disponível e possivelmente criando um problema de desempenho na máquina. E quando você finalmente fechar e reabrir o IDE outro arquivo de log será inicializado, mas o anterior continuará ocupando espaço em disco.

Os arquivos de log ficam no diretório TEMP do usuário. No Windows 8 isso fica em \Users\<nome do usuário>\AppData\Local\Temp em diretórios que começam com o nome “console”.

Esse problema já foi reportado como bug há anos e ainda hoje, na versão 1.05, ele persiste.

Eu tenho problemas freqüentes com isso porque quando estou trabalhando com Arduino eu desconecto e reconecto os cabos USB sem dar atenção ao IDE. Como meu espaço na partição C: é limitado, em poucas horas o Windows não tem mais espaço livre para usar por culpa do IDE Arduino.