20 de dez. de 2022

Raspberry Pi PICO - Temperatura ambiente

        Em uma sala de servidores, se os aparelhos de ar condicionado falharem a temperatura ambiente pode chegar fácil aos 70ºC. Isso seria fatal aos componentes dos servidores, principalmente as CPUs, que nessa situação, podem chegar a mais de 120ºC, literalmente 'fritando' os chips. Já tivemos ocorrências em que alguns servidores chegaram a desligar por alta temperatura.

        Para contornar essa situação, a primeira coisa que vem à mente é um alarme de temperatura. Sim, essa seria uma boa solução, porém esses alarmes não seriam ouvidos por ninguém, já que as salas de servidores são fechadas. É claro que existem paliativos, como por exemplo uma instalação elétrica que leve o sinal do alarme a um outro local, porém o custo seria proibitivo. Outra solução seria um transmissor de alarme com chip 4G. Se o sinal 4G for confiável dentro da sala, seria uma outra boa opção, mas o custo destes transmissores é também elevado.

        Foi pensando em todos estes problemas, que desenvolvemos um sistema de alarme de temperatura com um aparelho microprocessado de 4 dólares, o Raspberry Pi PICO. No post anterior já fizemos uma breve introdução ao mesmo. Porém, nest post trago o projeto completo, inclusive o código fonte.

        O código fonte do PICO foi desenvolvido em PyTHON.
        O primeiro passo para a programação da placa, foi a instalação da Thonny IDE, que é o ambiente onde desenvolvemos e pelo qual gravamos o código na placa. Para isso, basta fazer o download da IDE na página https://thonny.org/, e então escolha a opção certa para o seu sistema operacional. Para a instalação em computadores Linux não é necessário baixar um arquivo, apenas enviar o comando exibido na janela que é aberta ao colocar o mouse sobre a opção "Linux" pelo terminal de comando. No próprio site do Thonny você pode aprender os primeiros ´passos ´para programação do Raspberry Pi PICO.

        Partindo para a solução implantada: Decidimos fazer um projeto em que um dos próprios servidores serviria como ponte entre o sensor de temperatura dentro do PICO e um email. Assim, a cada uma hora o sistema deveria enviar um email a uma lista de destinatários, enviando a temperatura daquele horário. Assim, mesmo que a temperatura não estivesse alta, este email serviria para sabermos que o sistema está em operação. Agora, se a temperatura passar de um limite máximo (estipulamos 32ºC), um email é enviado aos destinatários a cada 5 minutos, até que a temperatura volte ao normal.

        Depois de 3 meses da implantação do projeto, todos os envolvidos (IT, manutenção e usduários) reconheceram que o sistema foi de absoluto sucesso, tanto pela sua simplicidade, baixo custo e alta eficiência.

        Segue abaixo o código fonte desenvolvido:


import serial
#import datetime
from datetime import datetime
import smtplib
import email.message
import time

i = 0

def SendGmail(DataHora,Temp):
# def enviar_email():
corpo_email = 'Temperatura = ' + str(Temp) + " " + str(DataHora)[0:16]
msg = email.message.Message()
msg['Subject'] = 'Temperatura da Sala de Servidores - NILIT'
msg['From'] = 'datasigmabr@gmail.com'
msg['To'] = 'martigej@gmail.com'
password = '**********'
msg.add_header('Content-Type', 'text/html')
msg.set_payload(corpo_email)
s = smtplib.SMTP('smtp.gmail.com: 587')
s.starttls()
# Login Credentials for sending the mail
s.login(msg['From'], password)
s.sendmail(msg['From'], [msg['To']], msg.as_string().encode('utf-8'))
print('Email enviado')
HoraUltimoEnvio = (datetime.now())
#time.sleep(60)



ser = serial.Serial(port='COM3', baudrate=9600, timeout=1)
n=0
while n == 0:
i = i + 1
y_str = ser.readline()
y = y_str.decode("utf-8")
if(len(y)>0):
z = float(y[0:4])
agora = (datetime.now())
print(agora, " ", z)
print(i)
if(i > 82800):
SendGmail(agora, z)
i = 0
if(z > 32):
if(i > 900):
print("QUENTE!!!")
SendGmail(agora,z)
i = 0






No código pode-se perceber que utilizamos o próprio GMAIL como suporte para o envio dos emails.

Exemplo de email enviado a cada hora pelo sistema:



Nos próximos posts estarei falando mais do surpreendente Raspberry Pi PICO!

19 de dez. de 2022

Raspberry Pi PICO - Primeiro Projeto

Comprei um Raspberry Pi PICO por USD 4,00. Nunca tinha trabalhado com um destes, mas pelo preço, achei que valeria a pena.

Estava guardado na gaveta há meses, quando então resolvi testá-lo, já que apareceu uma necessidade: "Monitorar a temperatura da sala de servidores na empresa onde trabalho". Na hora lembrei do Raspberry Pi Pico, que tem um sensor de temperatura embutido. Isso é uma mão na roda, pois não precisaria de nenhum circuito externo. Somente um cabo USB!

Comecei as pesquisas, e descobri que teria de aprender Python. Baixei o editor PyCharm, conectei o PICO na porta USB e em 5 minutos já tinha um LED piscando na placa (UAU!!!). Depois de dois dias estava com o sensor medindo a temperatura da sala de servidores e enviando emails de alerta, caso a temperatura da sala ultrapasse 30ºC. Já está em operação desde Setembro, cumprindo muito bem seu papel de medir a temperatura, salvar em um banco de dados SQL e enviar email de alerta caso necessário.

No próximo post vou colocar mais detalhes do projeto, bem como o código fonte.

27 de set. de 2010

Ciclos de Máquina e Temporização de Barramento

          Todas as instruções são uma série de operações básicas. Cada uma destas operações tomam de 3 a 6 períodos de clock para serem realizadas. Os períodos de clock são chamados de ciclos T (tempo) e as operações são chamadas ciclos M (máquina).

  

Neste exemplo, notamos que a instrução é constituída de 3 ciclos de máquina (M1, M2, e M3). O primeiro ciclo de toda instrução é um ciclo de BUSCA (FETCH) e pode ter um comprimento de 4, 5 ou 6 ciclos T. Como o nome diz, este ciclo lê o OPCODE da próxima instrução a ser executada.
          A seguir, temos a descrição detalhada da temporização de cada ciclo de máquina:
         

- Ciclo de BUSCA da instrução:
Como vemos na figura, durante o ciclo M1 (BUSCA), o PC (Contador de Programa) é colocado no bus de endereços. Meio clock depois, o sinal  é ativado. O sinal de  também é ativado para indicar à memória que os dados devem ser colocado no bus de dados. O Z80 então recebe os dados na borda de subida do estado T3. Neste momento, o sinal de  e  são desativados. Os ciclos T restantes (T3 e T4) são utilizados para REFRESH das memórias dinâmicas.

Modelo de Software do Z80

          Vamos descrever agora o modelo do Z80, conforme mostrado na Figura 2. Este modelo inclui o Acumulador, o Flag, registradores de uso geral, o apontador de memória e os registradores de uso especial.

Figura 2

          Registradores de Uso Geral
          O Z80 possui 6 registradores de uso geral, chamados B, C, D, E, H e L. Todos são de 8 bits e são utilizados para armazenamento de dados durante a execução do programa. Eles podem ser combinados aos pares (BC, DE, HL) para constituirem registradores de 16 bits. O programador tem acesso a estes registradores para escrita e leitura.
          Acumulador
          O Acumulador, identificado com registrador “A”, faz parte da ULA. É utilizado para armazenar dados de 8 bits e para fazer operações lógicas e aritméticas. O resultado das operações feitas pela ULA sempre é armazenado no Acumulador.
          Registrador de Flags
          A ULA possui 6 flip-flops que são setados e resetados de acordo com as condições após uma operação da ULA, e o estados destes flip-flops, também conhecidos como FLAGS (bandeiras), são armazenados no registrador de 8 bits chamado “regostrador de Flags”. Por exemplo: após uma soma em que o resultado gera um “carry”, o flip-flop de carry será setado e o bit D0 do registrador de flags mostrará nível lógico ‘1’. A figura 3 mostra a posição de cada bit dentro do registrador de flags.

Figura 3

          Registradores de 16 bits
          O Z80 possui 4 registradores de 16 bits, que são classificados como “apontadores de memória”.
           Index Registers (IX and IY) – Registradores de Índice: são registradores de 16 bits utilizados para endereçamento indireto de memória.
          Stack Pointer (SP) – Apontador de pilha: utilizado para guardar endereços de memópria durante a execução de uma instrução de “salto”.
          Program Counter (PC) – Contador de Programa: Sua função é apontar o endereço de memória em que a próxima instrução a ser executada está armazenada.

Arquitetura do Microprocessador Z80 - II

4.     Sinais de Requisições Externas
Este conjunto de linhas de controle é utilizado para requisições ao microprocessador dos dispositivos externos.
-    Reset: Sinal utilizado para “zerar” o processador. Basicamente, a principal função é zerar o registrador “contador de programa” (PC). O reset é ativado através de uma chave externa. Durante o reset, todas as linhas de dados e endereços são colocadas em tri-state.
-    Requisição de Interrupção: Requisita que o processador execute uma determinada função, através de um sinal externo.
-    Interrupção “Não-Mascarável”: um tipo especial de interrupção.
-     Requisição de Barramento (Bus Request): O microprocessador coloca todos o seus barramentos em tri-state, e entrega o controle a um dispositivo externo – por exemplo, o HD acessando diretamente às memórias. Este dispositivos são conhecidos como DMA – Direct Access Memory.
-     Espera: É requisitado por um dispositivo externo (memória, por exemplo). O processsador não executa nenhuma função durante este estado. Era muito utilizado quando as memórias tinham uma velocidade de acesso menor que a velocidade de trabalho do Z80. Hoje em dia, as memórias não necessitam mais deste recurso.

5.     Sinais Especiais
-     Bus Acknowledge (Reconhecimento do pedido de barramento): Com este sinal, o Z80 indica que recebeu e aceitou o pedido de controle do barramento.
-     Parada: Sinal emitido pelo Z80 para indicar que uma instrução HALT foi executada.
-    Atualização: Sinal urilizado para indicar que o Z80 está atualizando (REFRESH) as memórias dinâmicas.

6.     Alimentação e Sinal de Clock
Este grupo de sinais inclui:
-   CLK: Pino usado para conectar-se o gerador de pulsos externo.
-   +5V e GND: Pinos utilizados para a alimentação do Z80.

Arquitetura do Microprocessador Z80 - I

O Z80 é um dos mais famosos microprocessadores devido sua larga utilização em diversos sistemas computadorizados. Até hoje, o Z80 ainda é utilizado, por exemplo nos “Game Boy” da Nintendo.

I. Modelo de Hardware do Z80
          O Z80 é um microprocessador de uso geral, com 16 linhas de endereço e 8 linhas de dados, encapsulado em um chip de 40 pinos. A frequência de trabalho varia de 2,5 a 8 MHz.
          A figura abaixo mostra a configuração da pinagem do Z80:

          Todos os sinais podem ser divididos em 6 grupos:
1.     Barramento de endereços
2.     Barramento de dados
3.     Sinias de controle
4.     Sinais de requisições externas
5.     Sinais especiais
6.     Alimentação e sinal de clock

1.     Barramento de Endereços
O Z80 possui 16 linhas tri-state (A15-A0), conhecidas como “barramento de endereços”. São linhas unidirecionais capazes de endereçar até 64K (216) registradores de memória. O barramento de endereços é utilizado para enviar os endereços de memória e dos dispositivos de I/O.

2.     Barramento de Dados
Consiste de 8 linhas tri-state bi-direcionais (D7-D0), e é usado para transferência de dados entre o Z80 e memórias e dispositivos de I/O.

3.     Sinais de Controle e Status
Este grupo é consistido de 5 linhas individuais:
-  - Ciclo de Máquina 1: Indica que o o microprocessador está executando um ciclo de BUSCA de instrução.
- - Requisição de Memória: Indica que o barramento de endereços possui um endereço válido para operações de escrita/leitura de memória.
-  - Requisição de I/O: Indica que os bits A7-A0 (“low order addres bus”) possui um endereço válido para uma operação de escrita/leitura em dispositivos de I/O.
-  - Read (Leitura): Indica que o microprocessador está pronto para ler dados da memória ou de um dispositivo de I/O.
 - Write (Escrita): Indica que o microprocessador colocou um byte de dados no barramento de dados e está pronto para escrever na memória ou num dispositivo de I/O.
    
Os sinais de  e de  devem ser utilizados em conjunto com os sinais  e . Por exemplo:


Figura2: Arranjo dos sinais de controle para acesso à memória e dispositivos de I/O