** Edimar Calebe Castanho **
** Aluno de Engenharia da Computação do 4º ano ** ###### Redes Sociais
Calebe94 | /u/Calebe94 | calebe94 |
---|---|---|
* System on a Chip (SoC) - Microcontrolador; * Baixo Custo; * "Baixo Consumo"; * com Wi-Fi embutido; * Bluetooth 4.2 e BLE embutido; * Dual-core;
- Espressif Systems (Shanghai - China);
- Empresa apenas projeta os CI's(Não os fabrica);
- Mesma empresa do ESP8266;
- Desenvolve soluções para IOT;
- Microprocessador dual-core Tensilica Xtensa LX6(32 bit);
- Frequência de Clock de 80Mhz até 240MHz;
- Co-processador de baixíssimo consumo
- Permite fazer conversões ADC em deep sleep
- Comunicações sem fio:
- Wi-Fi: 802.11b/g/n/e/i (2.4GHz)
- Bluetooth: v4.2 e BLE
- ROM: 448 kB (Usada para Boot e funções do core);
- SRAM: 520 kB (Para dados e instruções);
- RTC fast SRAM: 8 kB (para armazenamento e CPU durante o boot do RTC);
- RTC slow SRAM: 8 kB (Utilizado pelo co-processador durante o deep-sleep);
- Flash: entre 0 e 4 MB (Suporta até 16MB);
- 36 GPIOs
- 10 pinos com Touch capacitivo;
- Conversores 18 pinos ADCs e 2 pinos DACs;
- 2 I2C e 2 I2S;
- 3 UART;
- CAN 2.0;
- 3 SPI;
- 16 PWM;
- Padrão de segurança IEEE 802.11, incluindo WFA, WPA/WPA2;
- Secure Boot;
- Flash Encryption;
- Criptografia em hardware: AES, SHA-2, RSA, ECC e RNG;
| | ESP32 | ESP8266 | Arduino UNO | |:--:|:--:|:----:| | Cores | 2 | 1 | 1 | | Arquitetura(bits) | 32 | 32 | 8 | | Clock(MHz) | 160 | 80 | 16 | | Wifi | Sim | Sim | Não | | Bluetooth | Sim | Não | Não | | RAM (KB) | 512 | 160 | 2 |
| | ESP32 | ESP8266 | Arduino UNO |
|:--:|:--:|:----:|
| Flash | 16Mb | 16 Mb | 32KB |
| GPIO | 36 | 17 | 14 |
| Interfaces | SPI/I2C/
UART/I2S/CAN | SPI/I2C/
UART/I2S | SPI/I2C/UART |
| ADC | 18 | 1 | 6 |
| DAC | 2 | 0 | 0 |
ESP32 | ESP8266 | Arduino UNO |
---|---|---|
Arduino Framework | ESP-IDF (C/C++) | MicroPython |
---|---|---|
@title[Hello World com Arduino]
Pisca LED
void setup() {
pinMode (2, OUTPUT);
}
void loop() {
digitalWrite (2, HIGH);
delay(500);
digitalWrite (2, LOW);
delay(500);
}
@[1,2,3](função setup() seta o GPIO 2 como saída digital) @[4](Cria loop infinito) @[5,6](Seta GPIO 2 para estado lógico ALTO e espera 500ms) @[7,8](Seta GPIO 2 para estado lógico BAIXO e espera 500ms)
@title[Hello World com ESP-IDF]
Pisca LED
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <driver/gpio.h>
void app_main(){
gpio_pad_select_gpio(GPIO_NUM_2);
gpio_set_direction(GPIO_NUM_2, GPIO_MODE_OUTPUT);
while(1){
gpio_set_level(GPIO_NUM_2, 1);
vTaskDelay(500/portTICK_RATE_MS);
gpio_set_level(GPIO_NUM_2, 0);
vTaskDelay(500/portTICK_RATE_MS);
}
}
@[1,2](Importa as bibliotecas de FreeRTOS necessárias para a utilização do vTaskDelay - delay) @[3](Importa a bilblioteca de acesso à GPIO) @[4](Igual a função main do C Padrão) @[5,6](Exporta a GPIO 2 e seta como saída) @[7](Cria o loop infinito) @[8,9](Seta GPIO 2 para estado lógico ALTO e espera 500ms) @[10,11](Seta GPIO 2 para estado lógico BAIXO e espera 500ms)
@title[Hello World com MicroPython]
Pisca LED
import utime
import machine
pin2 = machine.Pin(2, machine.Pin.OUT)
while True:
pin2.value(1)
utime.sleep_ms(500)
pin2.value(0)
utime.sleep_ms(500)
@[1](Importa módulo de tempo p/ o "delay") @[2](Import módulo de acesso ao hardware) @[3](Instancia a classe de Pin setando o GPIO 2 para saída) @[4](Cria loop infinito) @[5,6](Seta GPIO 2 para estado lógico ALTO e espera 500ms) @[7,8](Seta GPIO 2 para estado lógico BAIXO e espera 500ms)
- Inter-Integrated Circuit(Circuito Inter-Integrado);
- Comunicação Serial Síncrona;
- Multi-Mestre;
- Multi-Escravo;
- Desenvolvido pela Philips em 1982(Atual NXP Semiconductors)
- Muito utilizada para conectar perifericos:
- de baixa velocidade;
- em curtas distâncias(Máx. 1m, além disso podemos ter problemas de impedância);
- Desde 2006 nenhuma taxa é cobrada para implementar o protocolo I2C.
- Porém, taxas são cobradas para obter endereços I2C para dispositivos escravos.
- Vários concorrentes, como Texas Instruments, STMicroelectronics e Motorola possuem produtos que implementam o protocolo desde a década de 90.
- I2C utiliza apenas 2 linhas bidirecionais de dreno aberto;
- SDA (Serial Data) - Dados Seriais;
- SCL (Serial Clock) - Clock Serial (Gerado pelo Mestre);
- As duas linhas precisam utilizar resistores de pull-up;
- Tensões tipicamente utilizadas são 5V ou 3,3V.
- Possui endereçamento de 7 bits ( e 10 bits em casos raros )
- velocidade do barramento:
- Low-speed mode: 10 kbit/s;
- Standard mode: 100 kbit/s;
- Fast Mode: 400 kbit/s;
- Fast Mode Plus: 1 Mbit/s;
- High Speed Mode: 3.4 Mbit/s.
- Todas as transações:
- Iniciam com um START(S);
- E terminam com um STOP(P);
- Sempre geradas pelo MESTRE
- START: ALTO p/ BAIXO em SDA enquanto SCL está em ALTO;
- STOP: BAIXO p/ ALTO em SDA enquanto SCL está em ALTO.
- O barramento é considerado ocupado depois de uma condição de START;
- O barramento é considerado livre novamente após a condição de STOP;
- O barramento permanece ocupado se um START repetido (Sr) for gerado ao invés de um STOP;
- START e Repeated START (Sr) são funcionalmente identicas;
- Cada BYTE colocado no SDA deve ter 8 bits;
- Cada byte deve ser seguido de um bit de Reconhecimento(*Acknowledge bit);
- O bit mais significativo (MSB)são transferidos primeiro;
- Terminologia:
- ACK - Acknowledge: Bit de Reconhecimento;
- NACK - Not Acknowledge: Bit de Não Reconhecimento;
- ACK:
- Ocorre após cada byte.
- Permite ao RECEIVER informar o TRASMITTER que o byte foi recebido com sucesso.
- O mestre gera todos os pulsos de clock.
- O Bit de Reconhecimento é definido da seguinte forma:
- O TRANSMISSOR libera a linha SDA durante o clock de reconhecimento(nono pulso de clock);
- Então o RECEPTOR pode colocar a linha SDA para estado BAIXO e gerar o bit de RECONHECIMENTO;
- O Bit de Reconhecimento é definido da seguinte forma:
- Ou o RECEPTOR pode manter a linha SDA em estado ALTO e gerar um bit de NÃO RECONHECIMENTO;
- O MESTRE então pode gerar uma condição de STOP para abortar a transferência;
- Ou pode gerar uma condição de ** Repeated START**-(START REPETIDO), para inicializar uma nova transferência.
- Ou o RECEPTOR pode manter a linha SDA em estado ALTO e gerar um bit de NÃO RECONHECIMENTO;
- Existem 5 condições que podem gerar um Bit de Não Reconhecimento:
-
- Não existe nenhum receptor no barramento que reconhece o endereço transmitido;
-
- O Receptor está imcapacitado de receber ou trasmitir pois está executando alguma função interna;
-
- Existem 5 condições que podem gerar um Bit de Não Reconhecimento:
-
- Durante a transferência, o receptor recebeu dados ou comandos que ele não reconhece;
-
- Durante a transferência, o receptor não pode receber mais dados;
-
- Um MESTRE-RECEPTOR deve sinalizar o final da tranferência para um ESCRAVO-TRANSMISSOR.
-
- A transferência de dados segue o formato da figura acima;
- Após a condição de START(S) gerada pelo MESTRE, um endereço de escravo é enviado;
- Este endereço possui 7 bits, seguido por um 8º bit, que é a direção dos dados (Leitura ou Escria);
- WRITE: 0
- READ: 1
- A transferência de dados é sempre terminada pela condição de STOP(P) gerada pelo MESTRE
- Entretanto, se o MESTRE ainda querer se comunicar com o barramento, ele pode gerar uma condição Repeated START(Sr) sem ter que gerar um STOP;
---
- Utiliza o barramento I2C0 do ESP32;
- configura o CI DS1307 (que é um relógio de tempo real com calendário)
- configura a CI AT24C32 (EEPROM que fornece 4096 palavras de 8 bits cada)
- os CI's estão montados em um módulo chamado de TinyRTC que pode ser visto na figura abaixo.
- Funcionamento
- Dois botões
- um botão armazena os valores de tempo do RTC na EEPROM(SAVE);
- o outro botão imprimir no terminal serial os valores adquiridos na EEPROM(GET).
- Dois botões
---
- Verificar os datasheets para obter os endereços;
AT24C32 | DS1307 |
---|---|
0x50 | 0x68 |
- Como o AT24C32 tem 4096 palavras, 1 byte(8 bits) não é capaz de endereçar os offsets;
- pois o valor máximo que cabe em 8 bits é 255;
- para endereçar 4096 palavras é necessário 12 bits; Então ...
---?code=project/main/at24c32.c&lang=c&title=AT24C32
@[1](Inclui variáveis de 8 bits-uint8_t- e 16 bits-uint16_t- ...) @[2](Inclui as funções para Habilitar a I2C) @[3](Inclui defines do kernel FreeRTOS) @[4](Inclui apenas os protótipos das funções) @[6](Endereço da EEPROM) @[7](Número máximo de offsets da EEPROM)
@[9](Função para gravar dados na EEPROM) @[11](Gera a condição de START) @[12](Envia o Endereço da EEPROM, informa que é escrita e informa que espera o bit ACK) @[13](Envia os bits mais significativos do offset) @[14](Envia os bits menos significativos do offset) @[15](Envia o valor para ser gravado na EEPROM) @[16](Gera a condição de STOP) @[17](Informa ao periférico I2C0 para iniciar a transação)
@[22](Função para ler dados da EEPROM) @[24-27](Informa o Offset para a EEPROM) @[29](Gera a condição de START Repetido) @[31](Informa que quer ler) @[32](Lê o valor do offset e grava na variável data) @[33-34](Gera a condição de STOP e inicia a transação)
---?code=project/main/ds1307.c&lang=c&title=DS1307
@[1-5](Mesma coisa da EEPROM) @[7](Endereço I2C do DS1307) @[9](Função para obter o tempo do DS1307, retorna o tempo em time_t - C Padrão -) @[11](Gera condição de Start) @[12](Envia o Endereço do Relógio e informa que a operação é de escrita) @[13](Informa o registrador primeiro registrador) @[14](Gera condição de Start Repetido) @[15](Dessa vez é leitura) @[18](Lê os 7 registradores- Segundos, Minutos, Horas, ... e Força o NACK) @[19](Gera a Condição de STOP) @[22](Transforma o vetor de 7 posições lido do Relógio em uma variável time_t)
---?code=project/main/main.c&lang=c&title=MAIN
@[1-7](Inclui todas as Bibliotecas necessárias) @[9-12](Defines das GPIOs utilizadas)
@[14-25](Habilita o periférico I2C0 do ESP32)
@[66](app_main = main) @[67-71](Habilita as GPIO 32 e 33 como entrada e habilido o I2C0) @73 @[75-79](Verifica se o botão SAVE foi apertado e chama a função save_to_eeprom)
@[27](Função para gravar a Data e Hora na EEPROM) @[29-32](Transforma o time_t -32 bits- para 4 variáveis de 4 bits) @[36-45](Procura um espaço vazio na EEPROM para armazenar o tempo e hora)
@[80-83](Verifica se o botão GET foi apertado e chama a função get_from_eeprom) @[49](Função para pegar a data e hora da EEPROM) @[53-63](Lê todos os offsets, imprimo a data e hora na terminal serial)
Calebe94 | /u/Calebe94 | calebe94 |
---|---|---|
- ESP32 - FEATURES & SPECIFICATIONS
- Getting Started with MicroPython on ESP32 – Hello World, GPIO, and WiFi
- Spakfun - ESP32 Thing Hookup Guide
- Overview of ESP32 features. What do they practically mean?
- Hello World with ESP32 Explained
- ESP32 Arduino IDE "Hello World"
- Conheça o Barramento I2C
- I2C – Protocolo de Comunicação
- I2C Info – I2C Bus, Interface and Protocol
- The I2C-bus and how to use it (including specifications)
- I2C-bus specification and user manual
- Sparfun - I2C