Última atualização em: 2024-01-15 19:09

Conectando um RTC DS3231 na Orange Pi Zero 3

Após configurar uma Orange Pi Zero 3 com um sensor de temperatura (um HTU21D) para obter dados de temperatura e umidade, eu estava tendo um problema com o salvamento dos dados: era possível que a hora estivesse errada. O cenário problemático é simples: os equipamentos são desligados. Ao ligá-la, por padrão a Orange Pi continua a partir do último horário que estava ligada: caso ela fique 4 horas desligada, o horário estará 4 horas atrasado. Logo ao iniciar, ela busca o horário na internet com NTP e se sincroniza. Mas aí surgem alguns problemas: com o modem inicializando mais lentamente que a Orange Pi, ela estará coletando dados ainda com o horário incorreto e no caso de não haver internet, o horário permanecerá errado.

Eu enfrento esse problema com uma Raspberry Pi Zero W que vai fazer 4 anos coletando dados. No caso da Raspberry, eu não adicionei mais equipamentos: ajustei o serviço de sincronização do horário para pular para o horário correto independentemente da diferença, o que não é ideal. No caso da Orange Pi, eu queria fazer algo melhor. É aí que entra o DS3231.

DS3231

O módulo RTC (Real Time Clock) DS3231 mantém o horário correto, desde que esteja energizado. O módulo que estou usando com a Orange Pi possui um conector para uma pilha CR2032 que fornece energia para o módulo quando a Orange Pi estiver desligada. Ele se conecta através do protocolo I2C. O módulo também possui um sensor de temperatura (preciso o suficiente para minimizar o desvio do horário, não espere muito dele) e uma EEPROM de 32 kB a qual eu não uso, acredito que seria mais útil com um Arduino.

Configuração da Orange Pi

Na imagem com Ubuntu com kernel 6.1 da Orange Pi Zero 3, vem no sistema um RTC em hardware mas que não vai funcionar de forma apropriada, por não ter a entrada de energia (e também não sei onde ficaria o cristal nesse caso). O caminho dele no sistema é /dev/rtc0. É necessário desativá-lo para poder usar o DS3231 sem fazer configurações muito mais complicadas. Para desativá-lo, é possível adicionar um overlay no sistema. Essa página do Armbian possui informações relevantes sobre overlays, apesar de estar sendo usado o sistema Ubuntu 22.04 do site da Orange Pi nesse caso.

O overlay que desativa o RTC é o seguinte:

/dts-v1/;
/plugin/;

/ {
	compatible = "allwinner,sun4i-a10", "allwinner,sun7i-a20", "allwinner,sun8i-h3", "allwinner,sun50i-a64", "allwinner,sun50i-h5", "allwinner,sun50i-h616";

	fragment@0 {
		target-path = "/aliases";
		__overlay__ {
            rtc = "/soc/rtc@7000000";
		};
	};

	fragment@1 {
		target = <&rtc>;
		__overlay__ {
			status = "disabled";
		};
	};
};

Salve o conteúdo desse arquivo no sistema da Orange Pi com extensão dts, por exemplo, noRTC.dts. Depois disso, abra o terminal e use o comando:

sudo orangepi-add-overlay noRTC.dts

Esse comando adiciona o overlay ao sistema, gerando um arquivo dtb que será copiado para o local correto e o arquivo /boot/orangepiEnv.txt será atualizado para usar o novo overlay. Uma vez que o comando terminar de executar, reinicie a Orange Pi. O que deve ocorrer é que o arquivo /dev/rtc0 não deve mais existir.

O RTC que não funciona foi removido, agora é necessário adicionar o DS3231. Esse é um processo de várias etapas, que vai exigir instalar o módulo fisicamente e configurar o sistema para usá-lo.

A primeira configuração necessária no sistema operacional será ativar a interface I2C. Será utilizada a interface ph-i2c3 da Orange Pi Zero 3. Para ativar a interface ph-i2c3, é necessário usar o seguinte comando no terminal:

sudo orangepi-config

Abrirá a seguinte tela:

Tela inicial do orangepi-config

Nessa tela, escolha "System", aparecerá o seguinte:

Tela após escolher System

Então, escolha "Hardware":

Tela mostrando as opções em Hardware

Aqui, é necessário marcar a opção ph-i2c3. Tem mais opções marcadas na imagem porque a Orange Pi usada no exemplo possui mais módulos instalados. Marcando a opção ph-i2c3, pressione Enter para selecionar "Save", então escolha a opção "Back" para voltar. Caso as opções estejam diferentes de antes, o programa perguntará se deseja reiniciar para aplicar as configurações. Escolha "Reboot" para reiniciar imediatamente, ou cancele caso precise fazer algo antes de reiniciar o sistema, lembrando que a alteração só é aplicada após reiniciar:

Tela mostrando a opção para reiniciar o sistema

Uma vez com o sistema reiniciado, o que deve ser localizado é um novo arquivo: /dev/i2c-3. Caso ele esteja presente, quer dizer que a ativação da interface I2C foi bem sucedida. Se esse arquivo não existir, revise a configuração usando sudo orangepi-config.

Agora, é necessário fazer a conexão física do módulo à Orange Pi Zero 3. Para isso, DESLIGUE a Orange Pi e a desligue a energia. Não é uma boa ideia mexer no GPIO com ela ligada, pois manusear os componentes de forma incorreta pode causar um curto-circuito que pode danificar o módulo ou até mesmo a Orange Pi.

Em relação ao módulo, quatro das seis conexões serão usadas do lado onde os pinos já vem soldados: GND, VCC, SDA e SCL. Instale uma pilha CR2032 no módulo, para que ele possa continuar funcionando quando a Orange Pi estiver sem energia. Na Orange Pi, os pinos físicos relevantes serão o pino 1 (OUT 3,3 V, fundo amarelo), 3 (SDA/PH5, fundo azul), 5 (SCK/PH4, fundo azul) e 6 (GND, fundo preto).

Descrição dos pinos da Orange Pi Zero 3

O pino 1 da Orange Pi deve ser conectado ao VCC do módulo, o pino 3 ao SDA do módulo, o pino 5 deve ao SCL do módulo e o pino 6 deve ser conectado ao GND do módulo.

Eu infelizmente não achei um modelo do Fritzing da Orange Pi Zero 3, então vou ficar devendo um gráfico no momento. Mas seguem fotos (não foi fácil tirar fotos que mostrassem os nomes no módulo e os números na Orange Pi).

Lado do móduloLado da Orange Pi Zero 3

Confirmando que as conexões estão corretas, ligue a Orange Pi. Então, use o seguinte comando:

sudo i2cdetect -y 3

Caso o módulo DS3231 seja o único módulo instalado, a saída deveria ser algo assim:

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- 57 -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --  

O DS3231 é o 68 nessa saída. 57 é o EEPROM. Caso não apareça o 68 na saída do comando, desligue tudo e reveja as conexões.

Dessa forma, já seria possível acessar o módulo através de aplicativos, mas como o objetivo é que o sistema operacional use o módulo, ainda há mais configurações para fazer. É necessário adicionar mais um overlay ao sistema operacional. Segue o conteúdo dele:

/dts-v1/;
/plugin/;

/ {
	compatible = "allwinner,sun4i-a10", "allwinner,sun7i-a20", "allwinner,sun8i-h3", "allwinner,sun50i-a64", "allwinner,sun50i-h5", "allwinner,sun50i-h616";

	fragment@0 {
		target-path = "/aliases";
		__overlay__ {
			rtc0 = "/soc/i2c@5002c00/ds3231@68";
		};
	};

	fragment@1 {
		target = <&i2c3>;
		__overlay__ {
			#address-cells = <1>;
			#size-cells = <0>;
			ds3231@68 {
				compatible = "maxim,ds3231";
				reg = <0x68>;
				status = "okay";
			};
		};
	};
};

Salve o arquivo com o nome ds3231.dts. Adicione-o ao sistema usando:

sudo orangepi-add-overlay ds3231.dts

Então, reinicie o sistema. Se tudo der certo, o comando sudo i2cdetect -y 3 deve ter uma saída um pouco diferente agora:

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- 57 -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         

Note que, no lugar do 68, agora existe UU. Isso significa que o sistema operacional está usando esse componente I2C. Ou seja, o Linux achou o módulo DS3231 e ele está em funcionamento! Para testar, verifique a hora. Então, desligue a Orange Pi da energia. Desligue a internet: se está usando de forma cabeada, remova o cabo; se estiver usando Wi-Fi, desligue o roteador. Então, ligue a Orange Pi e verifique se a hora está correta. Caso ela esteja, o módulo está funcionando.

Além disso, o comando sensors vai trazer uma nova informação:

ds3231-i2c-3-68
Adapter: mv64xxx_i2c adapter
temp1:        +30.2°C  

Espero que esse guia tenha sido útil. Boa sorte nos seus projetos com a Orange Pi Zero 3.

Nota: vários recursos sobre a Orange Pi Zero 3 (inclusive a imagem que mostra o que cada pino faz) podem ser encontrados na página oficial.