Skip to content

Commit

Permalink
mod-AM
Browse files Browse the repository at this point in the history
  • Loading branch information
arnaldojr committed Oct 25, 2024
1 parent c026396 commit 605f0c2
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 142 deletions.
146 changes: 65 additions & 81 deletions content/classes/projeto8/enunciado.md
Original file line number Diff line number Diff line change
@@ -1,117 +1,101 @@
# Projeto Loopback
# Modulação AM

## Introdução
## Descritivo

Neste projeto, você irá construir um código em Python para realizar transmissões e recepções seriais simultâneas utilizando um Arduino. O objetivo é enviar uma imagem através da porta serial e receber simultaneamente uma cópia dessa imagem.
Neste projeto, vamos implementar a transmissão e recepção em Modulação em Amplitude (AM), que permite transmitir sinais de áudio através de diferentes frequências portadoras. Essa prática permitirá compreender os conceitos de modulação e demodulação, além de técnicas de filtragem e análise de sinais.

## Objetivos

1. Enviar uma imagem (a menor possível) através da porta de comunicação serial.
2. Receber a imagem simultaneamente ao envio e salvá-la como uma cópia.
3. Adquirir compreensão do código base de transmissão UART.
- Transmitir um áudio que ocupa bandas de baixas frequências (até 4 kHz) através de um canal de transmissão acústico, utilizando apenas as bandas entre 10 kHz e 18 kHz da placa de áudio do PC.
- Após a transmissão via sinal acústico (alto-falante do PC), o receptor deverá gravar o sinal transmitido, demodular e reproduzi-lo de maneira audível novamente.

## Materiais Necessários

- **Hardware:**
- Arduino (verificar modelo compatível)
- Cabo USB para conexão com o computador
- Jumpers para curto-circuitar os pinos RX e TX

- **Software:**
- Python instalado no computador
- Biblioteca `pyserial` (instalar com `pip install pyserial`)
- Arquivos de código fornecidos (5 no total)

## Montagem
## Implementação

### Configuração do Hardware
Para isso, você deverá construir uma aplicação que executa as seguintes tarefas, sequencialmente:

!!! exercise
Conecte o Arduino ao computador via USB. Em seguida, curto-circuite os pinos RX e TX do Arduino:

- **Passo 1:** Identifique os pinos RX e TX no seu modelo de Arduino.
- **Passo 2:** Utilize um jumper para conectar o pino RX ao pino TX.
!!! tip "Dica"
Em cada etapa da implementação, verifique por meio da Transformada de Fourie se a mesma está corretamente implementada.

!!! warning "Atenção!"
Em alguns modelos de Arduino (como o UNO), é necessário manter o botão de reset pressionado ou aterrar o pino reset.

### Configuração do Software
### Modulação

1. **Instalação da Biblioteca PySerial:**
1. Faça a leitura de um arquivo de áudio `.wav` de poucos segundos (entre 2 e 5) previamente gravado com uma `taxa de amostragem de 44100 Hz`. Se o áudio for estéreo, utilize apenas um dos canais (esquerdo ou direito) para simplificar a implementação.
2. Aplique um filtro passa baixas com fc em `4kHz`.
3. Reproduza o sinal filtrado e verifique que ele continua audível, embora com menos componentes de alta frequência.
4. Module esse sinal de áudio em AM com uma `portadora de 14.000 Hz`. A portadora deve ser uma senoide começando em zero, gerada com a mesma taxa de amostragem do sinal de áudio.
5. Calcule e normalize o vetor de áudio modulado de modo que todos os pontos do sinal permaneçam `dentro do intervalo [-1, 1]`. Isso pode ser feito dividindo todos os valores do sinal pelo valor máximo absoluto encontrado.
6. Reproduza o sinal modulado e observe que pode não ser audível, devido às altas frequências utilizadas (na faixa superior de audição humana). Isso é esperado e indica que a modulação foi realizada corretamente.

```bash
pip install pyserial
```
!!! tip "Dica"
A modulação do sinal poderá ser feita com a multiplicação entre a portadora de amplitude 1 e o sinal importado e normalizado.

1. **Configuração da Porta Serial:***

### Demodulação

!!! exercise
- Verifique em seu gerenciador de dispositivos qual porta COM o Arduino está utilizando.
- Ajuste o arquivo de aplicação Python para utilizar essa porta.
7. No outro computador, grave o áudio transmitido através do microfone, utilizando uma `taxa de amostragem de 44.100 Hz`.
8. Utilize a Transformada de Fourier para verificar que o sinal recebido tem componentes significativas dentro da banda de `10 kHz a 18 kHz`.
9. Demodule em AM o sinal usando a `frequência da portadora`.
10. Aplique um filtro passa-baixas com frequência de corte em `4 kHz` para eliminar as componentes de alta frequência e recuperar o sinal de áudio original.
11. `Reproduza o sinal demodulado` e verifique que ele é audível novamente. Compare a qualidade do áudio com o sinal original filtrado.

## Implementação
!!! tip "Dica"
A demodulação deverá ser feita com um filtro passa-baixa na frequência de corte do sinal importado. O módulo do sinal poderá ser obtido com a multiplicação do sinal de áudio e a portadora.

### Manipulação de Imagens em Python
#### Filtro passa baixas

Para transformar uma imagem em uma lista de bytes e vice-versa, você pode usar os seguintes trechos de código:
A função a seguir aplica um filtro passa baixas de frequência de corte : *cutoff_hz* e frequência de amostragem *fs* no sinal *signal* passado. O filtro utiliza a janela de Kaiser para projetar um filtro FIR com uma determinada atenuação de ripples na banda de parada (60 dB) e largura de transição.

```python
# Caminho da imagem original
img_origin = "original_image.jpg"
```
from scipy import signal as sg
def LPF(signal, cutoff_hz, fs):
#####################
# Filtro
#####################
# https://scipy.github.io/old-wiki/pages/Cookbook/FIRFilter.html
nyq_rate = fs/2
width = 5.0/nyq_rate
ripple_db = 60.0 #dB
N , beta = sg.kaiserord(ripple_db, width)
taps = sg.firwin(N, cutoff_hz/nyq_rate, window=('kaiser', beta))
return( sg.lfilter(taps, 1.0, signal))
```

# Leitura da imagem e conversão para bytes
with open(img_origin, 'rb') as f:
img_bytes = f.read()
Exemplo de uso :

# Salvando a imagem recebida como uma cópia
img_copy = "copy_image.jpg"
with open(img_copy, 'wb') as f:
f.write(img_bytes)
```
yDemodFiltrado = LPF(yDemod, 4000, fs)
```

## Transmissão e Recepção Serial

!!! exercise
Utilize as funções fornecidas nos arquivos de código para enviar e receber os bytes da imagem através da comunicação serial.
Importando um áudio
````
import soundfile as sf
audio, samplerate = sf.read('dois.wav')
yAudio = audio[:,1] # Se o áudio for estério
samplesAudio = len(yAudio)
````

## Entrega e Avaliação

### Conceito C

- Demonstrar a transmissão e recepção da imagem ocorrendo corretamente.

### Conceito B

- Responder às perguntas feitas pelo professor sobre as seguintes funções:

- `getBufferLen`
- `getAllBuffer`
- `getBuffer`
- `getNData`
- `sendBuffer`

### Conceito B+

- Entender e explicar os seguintes termos da comunicação UART:
1. Fazer uma apresentação ao seu professor gravando um áudio, filtrando, modulando e executando esse áudio (antes e depois da modulação). Um segundo computador deve receber esse áudio modulado, demodular e executar o áudio demodulado. Seu professor poderá pedir explicações.

1. **Transmissão assíncrona**
2. **UART – Start bit**
3. **UART – Stop bit**
4. **UART – TX, RX, GND**
5. **UART – Baud rate**
6. **UART – Bit rate**
7. **UART – Buffer**
8. **UART – Frame**
9. **UART – Bit de Paridade**
10. **UART – CRC**
2. Obrigatório: Apresentar os seguintes gráficos, no domínio do tempo e da frequência (Fourier):

### Conceito A+
- Gráfico 1: Sinal de áudio original normalizado – domínio do tempo.
- Gráfico 2: Sinal de áudio filtrado – domínio do tempo.
- Gráfico 3: Sinal de áudio filtrado – domínio da frequência.
- Gráfico 4: Sinal de áudio modulado – domínio do tempo.
- Gráfico 5: Sinal de áudio modulado – domínio da frequência (verifique se as bandas não permitidas não estão sendo ocupadas).
- Gráfico 6: Sinal de áudio recebido (após transmissão) – domínio da frequência.
- Gráfico 7: Sinal de áudio demodulado – domínio do tempo.
- Gráfico 8: Sinal de áudio demodulado – domínio da frequência.
- Gráfico 9: Sinal de áudio demodulado e filtrado – domínio da frequência.

- Corrigir a função `getStatus`, que não está funcionando corretamente, e apresentar uma solução.

## Data Limite

- **15/08** - Após essa data, a nota terá uma redução de 25% a cada semana de atraso.
- **xx/11** - Após essa data, a nota terá uma redução de 25% a cada semana de atraso.

64 changes: 4 additions & 60 deletions content/classes/projeto8/intro.md
Original file line number Diff line number Diff line change
@@ -1,63 +1,7 @@
# Transmissão e Recepção Serial UART
# Introdução à Modulação

## Introdução à Comunicação Serial

A comunicação serial é uma forma de transmitir dados entre dispositivos eletrônicos de forma sequencial, enviando um bit por vez, ao longo de uma única linha de comunicação. Ao contrário da comunicação paralela, onde vários bits são enviados simultaneamente em várias linhas, a comunicação serial utiliza menos cabos, é mais simples e é frequentemente utilizada em dispositivos que precisam enviar informações a longas distâncias ou com recursos limitados.

## O Que é UART?

UART, ou **Universal Asynchronous Receiver-Transmitter**, é um protocolo de comunicação serial assíncrona amplamente utilizado para permitir a troca de dados entre um dispositivo (como um microcontrolador) e um periférico (como um computador). Esse protocolo é assíncrono porque não requer um sinal de clock comum para sincronizar os dispositivos comunicantes.

### Estrutura de Dados na Comunicação UART

A comunicação UART transmite os dados em "frames". Um frame é uma sequência de bits que inclui os dados a serem transmitidos e informações de controle, como bits de início, parada e, opcionalmente, paridade. A estrutura básica de um frame UART é a seguinte:

1. **Start Bit**: Um único bit que indica o início da transmissão de um frame. O start bit é sempre um '0' (nível baixo).
2. **Data Bits**: Entre 5 e 9 bits que representam os dados a serem transmitidos.
3. **Parity Bit (Opcional)**: Um bit adicional utilizado para verificar erros durante a transmissão.
4. **Stop Bit**: Um ou dois bits que indicam o final de um frame. O stop bit é sempre '1' (nível alto).

### Diagrama de um Frame UART:

| Start | Data Bits (5-9) | Paridade (Opcional) | Stop (1-2) |


## Termos Importantes

Aqui estão alguns termos que você precisa entender para compreender a comunicação UART:

1. **Transmissão Assíncrona**: É um tipo de comunicação onde o receptor e o transmissor não compartilham um sinal de clock comum. Em vez disso, o receptor sincroniza com o transmissor através dos bits de start e stop do frame de dados.

2. **Start Bit**: Sinaliza o início da transmissão. Normalmente, é um nível lógico baixo (0).

3. **Stop Bit**: Indica o fim de uma transmissão. É um nível lógico alto (1) e pode haver um ou dois bits de stop.

4. **TX, RX, GND**: TX é o pino de transmissão, RX é o pino de recepção, e GND é o aterramento comum entre os dispositivos.

5. **Baud Rate**: A taxa de bits por segundo (bps) transmitidos na comunicação UART. Exemplo: 9600 bps significa que 9600 bits são transmitidos a cada segundo.

6. **Bit Rate**: Refere-se à quantidade de dados (bits) transmitidos ou recebidos por unidade de tempo.

7. **Buffer**: Área de memória usada temporariamente para armazenar os dados durante a comunicação.

8. **Frame**: A estrutura completa de dados transmitidos, composta por bits de início, dados, paridade e parada.

9. **Bit de Paridade**: Bit opcional usado para detecção de erros. Pode ser par ou ímpar.

10. **CRC (Cyclic Redundancy Check)**: Um método de verificação de erros mais robusto do que a paridade simples, utilizado para garantir a integridade dos dados.

## O Que é Loopback?

O conceito de **loopback** envolve conectar o pino de transmissão (TX) ao pino de recepção (RX) para criar um ciclo fechado de comunicação. Nesse projeto, o loopback é feito para que tudo o que o seu computador enviar ao Arduino seja imediatamente devolvido, espelhando a transmissão de dados. Isso é útil para testar a comunicação sem um segundo dispositivo.


## Leituras Recomendadas

Para se aprofundar na transmissão serial UART, consulte os seguintes links:

- [UART em FreeBSD](https://docs.freebsd.org/pt-br/articles/serial-uart/)
- [Transmissão Serial UART](http://www1.rc.unesp.br/igce/demac/alex/disciplinas/MicroII/EMA864315-Serial.pdf)
- [Transmissão e Recepção Assíncrona](https://www2.pcs.usp.br/~labdig/pdffiles_2012/tx_e_rx_as.pdf)
- [UART Basics](https://ece353.engr.wisc.edu/serial-interfaces/uart-basics/)
A modulação é um processo utilzado em telecomunicações que permite a transmissão de sinais de informação (como voz ou dados) através de um meio de comunicação, utilizando uma onda portadora. A onda portadora é uma onda de alta frequência que pode ser facilmente transmitida por meios como cabos, fibras ópticas ou ondas de rádio. Ao modular esta portadora com o sinal de informação, conseguimos "carregar" a informação ao longo de distâncias maiores e com menor perda de qualidade. Essa técnica é aplicada em áreas como processamento de sinais digitais, sistemas embarcados e redes de comunicação.

## Modulação AM (Amplitude Modulation)

A `Modulação em Amplitude (AM)` é uma técnica na qual a amplitude da onda portadora é variada de acordo com o sinal de informação que se deseja transmitir. Nesta modulação, a frequência e a fase da portadora permanecem constantes, enquanto sua amplitude reflete as variações do sinal de áudio ou outro tipo de informação.
2 changes: 1 addition & 1 deletion mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ nav:
- "Projeto 7":
- classes/projeto7/intro.md
- classes/projeto7/enunciado.md
- "Projeto 8":
- "Projeto 8 - modulação AM":
- classes/projeto8/intro.md
- classes/projeto8/enunciado.md
- "Projeto 9":
Expand Down

0 comments on commit 605f0c2

Please sign in to comment.