sistema de identificaÇÃo de cÉdulas - up.edu.br · figura 23 - exemplo de aplicação do...

68
1 UNIVERSIDADE POSITIVO Núcleo de Ciências Exatas e Tecnológicas Engenharia da Computação SISTEMA DE IDENTIFICAÇÃO DE CÉDULAS UP/NCET Curitiba 2008

Upload: tranminh

Post on 20-Sep-2018

214 views

Category:

Documents


0 download

TRANSCRIPT

1

UNIVERSIDADE POSITIVO Núcleo de Ciências Exatas e Tecnológicas

Engenharia da Computação

SISTEMA DE IDENTIFICAÇÃO DE CÉDULAS

UP/NCET Curitiba 2008

2

UNIVERSIDADE POSITIVO Núcleo de Ciências Exatas e Tecnológicas

Engenharia da Computação

SISTEMA DE IDENTIFICAÇÃO DE CÉDULAS

Autor: Luciano Henrique Albano Prof. Orientador: Alessandro Zimmer

UP/NCET Curitiba 2008

3

RESUMO

Neste trabalho é apresentado um novo sistema de identificação de cédulas para auxiliar

portadores de deficiência visual na identificação do dinheiro em papel. Ele é composto por

um microcontrolador, uma câmera, uma memória e um sistema de áudio para que a

cédula descoberta possa ser informada ao usuário. Através de diversos filtros de

computação gráfica uma foto é tirada da cédula que será identificada, o processamento é

todo feito no próprio protótipo sem a necessidade do uso de um computador, permitindo

ao protótipo ser portátil, para que o usuário possa utilizá-lo em todo lugar que achar

necessário.

Palavras chave: computação gráfica, câmera c3088, OV6620, microcontroladores,

processamento de imagens em sistema embarcado, Freemann.

4

ABSTRACT

This work presents a new system of identification of bills to help people with visual

impairments in the identification of money on paper. He composed of a microcontroller, a

camera, a memory, audio system so that the ballot discovery can be informed to the user.

Through various filters, computer graphics a photo is taken of the ballot to be identified,

the processing is all done in the prototype itself without the need of using a computer,

allowing prototype to be portable so that the user can use it throughout place as

necessary.

Keywords: Computer graphics, camera c3088, OV6620, microcontrollers, the image

processing system on board, Freemann.

5

TERMO DE APROVAÇÃO

Luciano Henrique Albano

Sistema de Identificação de Cédulas

Monografia aprovada como requisito parcial à conclusão do curso de Engenharia da Computação da Universidade Positivo, pela seguinte banca examinadora:

Prof. Msc. Alessandro Zimmer (Orientador)

Prof. Msc. Edson Pedro Ferlin

Prof. Dr. Ibrahim El Chamaa Neto

Curitiba Novembro/2008

6

SUMÁRIO

RESUMO 3

ABSTRACT 4

LISTA DE FIGURAS 8

LISTA DE TABELAS 10

LISTA DE SIGLAS 11

1 INTRODUÇÃO 12

2 FUNDAMENTAÇÃO TEÓRICA 13

2.1 MICROCONTROLADORES 13 2.2 MEMÓRIA 14 2.3 COMPUTAÇÃO GRÁFICA 15 2.4 CÂMERAS DIGITAIS 16 2.5 PROTOCOLO DE COMUNICAÇÃO I2C 17

2.5.1 CARACTERÍSTICAS GERAIS DO BARRAMENTO I2C 18

2.5.2 DEFINIÇÕES DO BARRAMENTO I2C 19

2.5.3 COMUNICAÇÃO 20

2.5.4 CONFIGURAÇÃO DA CÂMERA 21

2.6 PROTOCOLO DE COMUNICAÇÃO SPI 25

3 PROJETO 28

3.1 PROJETO DE SOFTWARE 28

3.1.1 AQUISIÇÃO DA IMAGEM 29

3.1.3 DEFINIÇÃO DO LIMIAR 34

3.1.4 LIMIARIZAÇÃO 36

3.1.5 EXCLUSÃO DAS BORDAS 37

3.1.5 HISTOGRAMA 39

3.1.6 ALGORITMO DE FREEMAN 40

3.1.7 FORMA DE IDENTIFICAR O NÚMERO 42

3.1.7 PLATAFORMA DE DESENVOLVIMENTO E AMBIENTE DE EXECUÇÃO 50

3.1.8 FLUXOGRAMA BÁSICO DE FUNCIONAMENTO 51

3.2 PROJETO DE HARDWARE 52

3.2.1 AQUISIÇÃO DOS DADOS 52

7

3.2.2 ARMAZENAMENTO 54

3.2.3 APRESENTAÇÃO DOS RESULTADOS AO USUÁRIO 55

3.2.4 DIAGRAMA DE BLOCOS 56

3.2.5 INTERAÇÃO ENTRE BLOCOS 56

3.2.6 INTERAÇÃO ENTRE SOFTWARE E HARDWARE 57

3.2.7 ESQUEMA ELÉTRICO 58

3.2.8 FOTOS DO PROTÓTIPO 59

3.3 PROTOCOLO DE TESTES E VALIDAÇÃO 61

APÊNDICE A - PREVISÃO DE CUSTOS 62

APÊNDICE B – CRONOGRAMA 64

4 CONCLUSÃO 65

5 REFERÊNCIAS BIBLIOGRAFIAS 67

1 - LIVROS 67 2 - MONOGRAFIAS, DISSERTAÇÃO E TESE 67 3 – INTERNET 67

6 MANUAL TÉCNICO/USUÁRIO 69

7 ARTIGO TÉCNICO 73

8

LISTA DE FIGURAS

Figura 1 - Microcontrolador Pic24FJ64GA006, modelo utilizado no projeto. 13

Figura 2 - Memória 14

Figura 3 – Exemplo de Comunicação I2C 21

Figura 4 - Análise Digital - Reduz Clock 22

Figura 5 - Análise Digital - Define Ajuste Automático de Branco 23

Figura 6 - Análise Digital - Controle de Contraste 23

Figura 7 - Análise Digital - Ajuste de Brilho 23

Figura 8 - Análise Digital - Ajuste da Saturação 24

Figura 9 - Análise Digital - Coluna Inicial 24

Figura 10 - Análise Digital - Linha Inicial 24

Figura 11 - Comunicação SPI Master Slave 25

Figura 12 - Protocolo SPI 25

Figura 13 - Análise Digital - SPI Gravação 26

Figura 14 - Análise Digital - SPI Leitura 27

Figura 15 - Funcionamento Básico do Software 28

Figura 16 - Funcionamento Câmera - Visão Macro 30

Figura 17 - Funcionamento Câmera - Visão Micro 31

Figura 18 – Erro no cálculo do limiar 34

Figura 19 - Calculo do Limiar Correto 35

Figura 20 – Imagem Limiarizada 37

Figura 21 - Aplicação da Exclusão de Bordas 38

Figura 22 - Exemplo Prático de Histograma 39

Figura 23 - Exemplo de Aplicação do Histograma 40

Figura 24 - Cadeias de Orientação 40

Figura 25 – Aplicações de Freemann 41

Figura 26 - Algoritmo Adaptado / Aplicação no Número 1 42

Figura 27 - Comparativo de Largura 42

Figura 28 - Exemplo de Vales 44

Figura 29 – Fluxograma Básico de Funcionamento 51

Figura 30 – Layout Visão Lateral 52

9

Figura 31 - Câmera CMOS 53

Figura 32 - Memória Flash de 2 Mbytes 54

Figura 33 - Diagrama em Blocos 56

Figura 34 – Interação em Blocos 56

Figura 35 – Interação Entre o Software e Hardware 57

Figura 36 - Esquema Elétrico 58

Figura 37 - Circuito Montado em Protoboard 59

Figura 38 - Placa Finalizada 59

Figura 39 - Visão Superior do Protótipo 60

Figura 40 - Visão Frontal e da Parte Inferior 60

Figura 41 – Gráfico do Rateio Entre os Centros de Custos 63

Figura 42 - Cronograma MS Project 64

10

LISTA DE TABELAS

Tabela 1 - Relação de Notas e Bips 55

Tabela 2 - Planilha de Custos 62

11

LISTA DE SIGLAS

UP – Universidade Positivo

NCET – Núcleo de Ciências Exatas e Tecnológicas

JPG – Joint Photographic Experts Group (Grupo Experiente da União Fotográfica – formato

de arquivo de imagem).

I2

C – Inter-Integrated Circuit (Circuito Inter-Integrado).

D/A – Digital/Analog (Analógico/Digital)

RAM – Random Access Memory (Memória de Acesso Aleatório)

RGB – Red, Green and Blue (Vermelho, Verde e Azul – padrão de cores)

SPI – Serial Peripheral Interface (Interface Periférica Serial)

CMOS – Circuito integrado do tipo semicondutor metal-óxido complementar

NMOS – Semicondutor que utilize transistors de efeito de campo de metal óxido-

semicondutor.

VCC – Alimentação.

GND – Terra.

CLOCK – Relógio.

START – Condição de início.

STOP – Condição de parada.

ACK – Condição de sincronização.

MASTER – Dispositivo mestre.

SLAVE – Dispositivo escravo.

FLASH – Memória do tipo não volátil.

DATASHEET – Manual de um semicondutor.

Buzzer – Pequeno alto falante.

12

1 INTRODUÇÃO

A solução de problemas do cotidiano tem sido fonte de pesquisa e realização de trabalhos

de muitos alunos da rede universitária, seja para ajudar um conhecido, seja apenas para

disponibilizar uma solução para que uma parcela da população possa viver com mais

conforto.

Dentre esses problemas, um que merece destaque é a dificuldade que deficientes visuais

têm na identificação do dinheiro em papel, isto porque, mesmo com marcações nas

cédulas em alto relevo, após algum tempo elas vão se desgastando tornando impossível

sua identificação.

No Brasil existem cerca de 11,7 milhões de deficientes visuais conforme [11], é uma

parcela relativamente alta da população que sofre desta dificuldade.

O objetivo deste projeto é contribuir na melhoria da qualidade de vida destas pessoas,

tornando-as mais independentes da ajuda de desconhecidos, para isto este projeto irá

reconhecer uma cédula a partir de sua imagem e retornará seu valor através de uma

saída sonora.

Para isto foram utilizados diversos componentes como: câmera, microcontrolador,

memória flash, além de outros componentes cabos, conectores que auxiliarão o projeto.

13

2 FUNDAMENTAÇÃO TEÓRICA

Neste capítulo será apresentado um estudo dos principais assuntos abordados neste

projeto, que envolvem pesquisas sobre circuitos digitais, câmeras para obtenção de

imagens, microcontroladores e computação gráfica.

2.1 MICROCONTROLADORES

Microcontroladores, como definido por [Neto,2006] “São pequenos processadores

compostos de memória de programa, memória de dados, conversor de sinais analógicos

para sinais digitais, entradas e saídas de dados. São utilizados em larga escala em

aparelhos presentes do cotidiano como em fornos micro-ondas, televisores, câmeras

digitais, telefones, etc”.

O microcontrolador pode execucar várias operações matemáticas ou quaiquer outras

operações com os dados obtidos e/ou armazenado em suas memórias conforme [2].

Além disto, ele é responsável por executar o código fonte do programa, ou seja, cabe a

ele o processamento de todas as informações sejam de entrada ou saída de um outro

dispositivo. Na Figura 1 pode ser observado uma imagem do microcontrolador empregado

neste projeto.

Figura 1 - Microcontrolador Pic24FJ64GA006, modelo utilizado no projeto.

14

2.2 MEMÓRIA

Conforme [5], pode-se entender a memória com um grande armário repleto de gavetas,

onde cada gaveta armazena pequenas quantidades de roupas, cada roupa pode ser

considerada um arquivo.

Cada projeto deve possuir um local para armazenamento das informações, sejam elas

estáticas como o código fonte do programa ou dinâmicas como informações de entrada

ou saída que precisam ser processadas e logo em seguida descartadas.

A memória é o componente fundamental em qualquer projeto, por padrão a maioria dos

microcontroladores já possui tanto a memória estática bem com a dinâmica mas em

pequenas capacidades de armazenamento, obrigando assim que sejam utilizadas

memórias externas as que estão no microcontrolador.

As memórias externas por sua vez possuem uma capacidade de armazenamento muitas

vezes superior as que já veêm embutidas nos microcontroladores, permitindo que o

código fonte de programa que será executado possa ser maior ou ainda processar mais

dados de entrada e saída.

Na Figura 2 pode ser visto um desenho da memória utilizada neste projeto.

Figura 2 - Memória

15

2.3 COMPUTAÇÃO GRÁFICA

A computação gráfica surgiu da necessidade humana de visualizar informações. Com o

auxílio da álgebra linear a computação gráfica pode transformar e obter qualquer tipo de

informação a partir de uma imagem, utilizando-se diversos filtros, estes nada mais são do

que operações algébricas realizadas na imagem de origem sendo que o resultado é

enviado para uma imagem destino.

Na imagem destino haverá o resultado da aplicação do filtro. Existem inúmeros tipos de

filtros dentro da computação gráfica, cada filtro oferece um resultado diferente.

Na maioria das vezes o processo de se obter alguma informação de uma imagem não se

dá através da aplicação de um único filtro, mas sim da combinação de diversos filtros,

sempre aplicando o próximo filtro na imagem de saída do filtro anterior.

Com o alto processamento computacional disponível no mercado, a computação gráfica

ganhou um grande espaço entre programas de tratamento de imagens, diversas revistas

utilizam esses programas para melhoria das fotos disponibilizadas em suas edições.

Com isso é possível obter os mais diversos resultados, atingindo assim um objetivo

satisfatório.

16

2.4 CÂMERAS DIGITAIS

O olho humano, assim como os ouvidos, é um conversor A/D. Ele capta os diferentes tons

de luz refletidos pelos objetos do mundo real para pulsos elétricos, fazendo assim com

que o cérebro possa identificar objetos e cores.

A câmara digital revolucionou o processo de captura de imagens, contribuindo para a

popularização da fotografia que ao invés de utilizar a película fotossensível para o registro

das imagens, ela as registra através de um sensor que entre outros tipos podem ser do

tipo CMOS ou CCD, armazenando as imagens em cartões de memória.

Conforme [3], CCD (charge-coupled device) ou Dispositivo de Carga Acoplado é um

sensor para captação de imagens formada por um circuito integrado contendo uma matriz

de capacitores ligados (acoplados). Sob o controle de um circuito externo, cada capacitor

pode transferir sua carga elétrica para outro capacitor vizinho.

A capacidade de resolução ou detalhe da imagem depende do número de células

fotoelétricas do CCD. Se expressa este número em pixels. Quanto maior o número de

pixels, maior a resolução da imagem.

17

2.5 PROTOCOLO DE COMUNICAÇÃO I2C

Conforme descrito em [1], para explorar todos os benefícios dos sistemas e dispositivos

eletrônicos, os engenheiros e projetistas visam melhorar a eficiência do hardware e

minimizar a complexidade dos circuitos.

Para facilitar esta árdua tarefa surgiu o protocolo de comunicação I2C.

O protocolo de comunicação em 2 sinais I2C foi originalmente desenvolvido pela Philips

em meados de 1996. Atualmente este protocolo está amplamente difundido e interconecta

uma ampla gama de dispositivos eletrônicos. Dentre estes encontramos vários

dispositivos de controle inteligente, normalmente microcontroladores e

microprocessadores assim como outros circuitos de uso geral, como drivers LCD, portas

de E/S, memórias RAM e EEPROM ou conversores de dados.

Muitas vantagens podem ser atribuídas ao protocolo I2C. Destacam-se entre elas:

- Organização funcional em blocos, providenciando um simples diagrama esquemático

final.

- Não há necessidade dos projetistas desenvolverem interfaces. Todos os dispositivos

integram as interfaces "on-chip", o que aumenta a agilidade no desenvolvimento.

- Endereçamento e protocolo de transferência de dados totalmente definido via software.

- Possibilidade de inclusão ou exclusão de dispositivos no barramento sem afetá-lo ou

outros dispositivos conectados a este.

- Diagnóstico de falhas extremamente simples. O mau funcionamento é imediatamente

detectado.

18

- Desenvolvimento simplificado do software através do uso de bibliotecas e módulos de

software reutilizáveis.

- Facilidade no desenvolvimento de placas de circuito impresso, devido a quantidade de

interconexões.

Adicionalmente, utilizando as vantagens da tecnologia CMOS na fabricação dos

dispositivos, temos:

- Baixíssimo consumo de corrente.

- Alta imunidade à ruídos.

- Ampla faixa de tensões para a alimentação.

- Ampla faixa de temperatura para a operação.

2.5.1 Características Gerais do Barramento I2C

- Suporta qualquer tecnologia de produção.

- Duas vias de comunicação: serial data (SDA) e serial clock (SCL), ambas bidirecionais,

conectadas ao positivo da fonte de alimentação através de um resistor de pull-up.

Enquanto o barramento está livre, ambas as linhas ficam em nível lógico alto.

- A taxa de transferência máxima é de 100kbit/s no modo padrão, ou 400kbit/s no modo

rápido.

- Todo dispositivo possui um endereço único no barramento, independente de sua

natureza.

19

- Qualquer dispositivo conectado pode operar com transmissor ou receptor. Claro que isso

depende da natureza do dispositivo - um LCD não vai operar como transmissor, assim

como um teclado não operará como receptor. Independente disto, qualquer dispositivo

endereçado é chamado de escravo (slave).

- O número de interfaces conectadas fica dependente da capacitância máxima do

barramento, que é de 400pF.

2.5.2 Definições do Barramento I2C

- Transmiter (Transmissor): dispositivo que envia dados através do barramento.

- Receive (Receptor): dispositivo que recebe dados através do barramento.

- Master: dispositivo que inicia a comunicação, gera o sinal de clock e encerra a

comunicação.

- Multi-master: vários dispositivos podem controlar o barramento, mesmo sem

comprometer a mensagem. Quando isto ocorre temos vários dispositivos operando em

modo master.

- Arbitrarion (Arbitrariedade): procedimento para o controle do barramento em modo multi-

master. Visa não corromper a transmissão dos dados e perder a sincronização do clock.

- Sincronização: procedimento para sincronizar o clock de um ou mais dispositivos.

20

2.5.3 Comunicação

Níveis lógicos: Como o protocolo de comunicação I2C aceita uma ampla gama de

métodos de fabricação para os seus dispositivos (CMOS, NMOS, Bipolar, etc.) os níveis

lógicos alto e baixo não possuem valores pré-estabelecidos, dependendo diretamente da

tenção de alimentação (VCC).

Validação dos dados: O dado na linha de dados precisa ser estável durante o período

ALTO do clock. A mudança entre os níveis lógicos alto e baixo só podem ser feitos

enquanto o sinal de clock estiver BAIXO.

Condições Iniciais e Finais: Durante todo o processo apenas dois sinais são

caracterizados como condições de START e STOP.

O procedimento de comunicação do protocolo I2C é extremamente simples. Basicamente

tem-se 6 itens para análise, pode ser acompanhado na Figura 3:

1. O dispositivo master ajusta a condição inicial.

2. O dispositivo master envia 7 bis de endereçamento.

3. O dispositivo master envia o 8o bit, RW/RD.

4. O dispositivo slave envia o sinal de ACK (Acknowledge).

5. O dispositivo master (ou slave) envia pacotes de 8 bits de dados, sempre

seguidos de um sinal ACK enviado pelo dispositivo slave (ou master) confirmando a

recepção.

6. O dispositivo master encerra a comunicação.

21

Figura 3 – Exemplo de Comunicação I2C

É importante fazer algumas observações:

O endereçamento padrão é feito com 7 bits, mas existe o modo extendido que possibilita

o uso de 10 bits de endereçamento (1024 dispositivos).

A quantidade de pacotes de transmissão é controlada pelo dispositivo master, não

possuindo um valor máximo definido. Este é um ponto importante a ser observado, pois

como os dados são transmitidos serialmente, na utilização de memórias, perde-se os

limites de endereçamento que existem nos dispositivos paralelos.

A comunicação pode ser suspensa, simplesmente travando-se o sinal de clock. Isto pode

ser útil para efetuar o tratamento de interrupções ou derivados, sem, no entanto,

corromper os dados transmitidos.

2.5.4 Configuração da Câmera

Conforme [4], o protocolo de comunicação I2C é utilizado exclusivamente para

configuração da câmera, ou seja, configuração de brilho, contraste, saturação, clock, etc.

Abaixo uma seqüência de comandos demonstra a forma de configuração da câmera.

Na Figura 4 pode ser visto a simulação do código que baixa o

Na linha superior I2C_CLK é enviado o sinal de

base do que é transmitido na linha inferior, a linha de

linhas em modo Alto, quando inicia

baixo, ficam em 0, a linha superior dispara o

linha inferior é enviado o primeiro comando

escrita. Na segunda seqüência de

neste caso o endereço é o valor 11 e por último é enviado o valor que será armazenado

na câmera, o valor 0x0A.

Figura 4 - Análise Digital - Reduz Clock

Na Figura 5 pode ser visto a simulação do código que define que a câmera não terá

ajuste automático de branco.

neste caso os valores são outros, primeiro vai o comando de escrita C0, depois vai o valor

do endereço que neste caso é 0x12 e por último o valor que será armazenado 0x20.

I2C_Cam_Write(0x11, 0x0A);

I2C_Cam_Write(0x12,0X20);

I2C_Cam_Write(0x05,0X00);

I2C_Cam_Write(0x06,0X00);

I2C_Cam_Write(0x03,0XFF);

I2C_Cam_Write(0x17,0XB5);

I2C_Cam_Write(0x19,0X3F);

//Primeiro Parâmetro: Registrador interno da c

//Segundo Parâmetro: Valor que será passado para o registrador.

pode ser visto a simulação do código que baixa o clock da câmera.

é enviado o sinal de clock, com este sinal é que sem tem a

do na linha inferior, a linha de dados. Inicialmente tem se ambas a

linhas em modo Alto, quando inicia-se a transmissão dos dados o sinal de

em 0, a linha superior dispara o clock composto por 9 bordas de subida e na

linha inferior é enviado o primeiro comando, o valor C0 indicando que é um comando de

escrita. Na segunda seqüência de clock é enviado o endereço onde será feito a escrita,

neste caso o endereço é o valor 11 e por último é enviado o valor que será armazenado

Clock

pode ser visto a simulação do código que define que a câmera não terá

Conforme explicado acima, a sequência é a mesma, porém

neste caso os valores são outros, primeiro vai o comando de escrita C0, depois vai o valor

do endereço que neste caso é 0x12 e por último o valor que será armazenado 0x20.

//BAIXA O CLOCK DA CAMERA

//AJUSTE AUTOMATICO DE BRANCO 24h SIM, 20 NÃO

//AJUSTE DE CONTRASTE MÁXIMO FF, MINIMO 00

//AJUSTE DE BRILHO MÁXIMO FF, MINIMO 00

//AJUSTE DE SATURAÇÃO MÁXIMO FF, MINIMO 00

//AJUSTE DA COLUNA INICIAL

//AJUSTE DA LINHA INICIAL

metro: Registrador interno da câmera.

//Segundo Parâmetro: Valor que será passado para o registrador.

22

da câmera.

, com este sinal é que sem tem a

dados. Inicialmente tem se ambas a

al de ambas vai para

composto por 9 bordas de subida e na

C0 indicando que é um comando de

onde será feito a escrita,

neste caso o endereço é o valor 11 e por último é enviado o valor que será armazenado

pode ser visto a simulação do código que define que a câmera não terá

Conforme explicado acima, a sequência é a mesma, porém

neste caso os valores são outros, primeiro vai o comando de escrita C0, depois vai o valor

do endereço que neste caso é 0x12 e por último o valor que será armazenado 0x20.

//AJUSTE AUTOMATICO DE BRANCO 24h SIM, 20 NÃO

MINIMO 00

//AJUSTE DE SATURAÇÃO MÁXIMO FF, MINIMO 00

Figura 5 - Análise Digital - Define Ajuste Automático de Branco

Na Figura 6 é mostrada a simulação do código que ajusta o contraste.

de escrita C0, depois vai o endere

neste endereço, 0.

Figura 6 - Análise Digital - Controle de Contraste

Na Figura 7 é simulado o ajuste do brilho.

vai o endereço 0x06 e por último o valor que será armazenado o 0.

Figura 7 - Análise Digital - Ajuste de Brilho

Define Ajuste Automático de Branco

é mostrada a simulação do código que ajusta o contraste. Primeiro vai o valor

de escrita C0, depois vai o endereço 0x05 e por último o valor que será armazenado

Controle de Contraste

é simulado o ajuste do brilho. Primeiro é enviado o valor de escrita C0, depois

vai o endereço 0x06 e por último o valor que será armazenado o 0.

Ajuste de Brilho

23

Primeiro vai o valor

ço 0x05 e por último o valor que será armazenado

Primeiro é enviado o valor de escrita C0, depois

Na Figura 8 é ajustada a configuração da saturação.

escrita, depois o endereço 0x03 e por último o valor o valor 0xFF.

Figura 8 - Análise Digital - Ajuste da Saturação

Na figura 9 é definido a coluna inicial que a câmera enviará, pois ela permite definir ajuste

da coluna inicial e final e da linha inicial e final.

a escrita, depois é enviado o endereço 0x17 e por último o valor 0xB5.

Figura 9 - Análise Digital - Coluna Inicial

Na Figura 10 é mostrada a configuração da linha inicial que a câmera enviará.

enviado o valor C0, depois é enviado o endereço 0x19 e por úl

Figura 10 - Análise Digital - Linha Inicial

é ajustada a configuração da saturação. Primeiro é enviado o comando de

escrita, depois o endereço 0x03 e por último o valor o valor 0xFF.

Ajuste da Saturação

é definido a coluna inicial que a câmera enviará, pois ela permite definir ajuste

da coluna inicial e final e da linha inicial e final. Primeiro é enviado o valor C0 para definir

o o endereço 0x17 e por último o valor 0xB5.

Coluna Inicial

a configuração da linha inicial que a câmera enviará.

enviado o valor C0, depois é enviado o endereço 0x19 e por último o valor 0x3F.

Linha Inicial

24

Primeiro é enviado o comando de

é definido a coluna inicial que a câmera enviará, pois ela permite definir ajuste

Primeiro é enviado o valor C0 para definir

a configuração da linha inicial que a câmera enviará. Primeiro é

timo o valor 0x3F.

25

2.6 PROTOCOLO DE COMUNICAÇÃO SPI

Conforme [12], o protocolo SPI (Serial Peripheral Interface) foi desenvolvido pela Motorola

para a linha de processadores da família MC68K. O SPI é um protocolo de comunicação

síncrono e opera no modo full-duplex. O protocolo SPI é composto por 4 sinais (Figura

11), são eles:

Sinais de dados: MOSI (Master data Output, Slave data Input) e MISO (Master data

Input, Slave data Output) são responsáveis pela transferência de dados entre o master e

o slave.

Sinais de controle: SCLK (Serial Clock) e /SS (Slave Select).

Figura 11 - Comunicação SPI Master Slave

Na Figura 12 pode ser observado a comunicação entre o dispostivo master e vários

dispositivos em modo slave utilizando o protocolo SPI.

Figura 12 - Protocolo SPI

Comunicação entre o dispositivo master e vários dispositivos slave utilizando o protocolo

SPI. Note que a seleção é feita pelo pino /SS, no caso da comunicação de um master

com diversos dispositivos slaves, requerem do microcontrolador um número grande de

pinos de seleção.

O protocolo de comunicação é muito simples, não

Por isso mesmo, este protocolo permite velocidade de comunicação mais alta que o I

Na Figura 13 é mostrado uma operação de gravação e na F

leitura.

Na Figura 13 uma análise será feita, a

instruções compostas por 8 pulsos cada, na segunda linha fica o

dados do microcontrolador para o dispositivo escravo,

enviado o valor 0x06 em binário 00000110, i

enviado a instrução de programação através do comando 0x02 ou 10 em binário, no

terceiro octeto de clock é enviado a primeira de três partes do endereço onde será

armazenado o dado, que neste caso é 0, depois é

0 novamente, esse foi o endereço.

Depois de enviado o endereço onde será gravado a informação, bastará enviar a

informação em si, o último octeto serve para isto, neste caso foi armazenado o valor 0x05

ou 101 em binário.

Figura 13 - Análise Digital - SPI Gravação

O protocolo de comunicação é muito simples, não requer uma programação complicada.

Por isso mesmo, este protocolo permite velocidade de comunicação mais alta que o I

uma operação de gravação e na Figura 14 uma operação de

igura 13 uma análise será feita, a primeira linha é a de Clock, são necessários 6

instruções compostas por 8 pulsos cada, na segunda linha fica o SDO, canal de envio de

para o dispositivo escravo, no primeiro pulso de

enviado o valor 0x06 em binário 00000110, isso habilitará o canal para escrita, depois é

a instrução de programação através do comando 0x02 ou 10 em binário, no

é enviado a primeira de três partes do endereço onde será

armazenado o dado, que neste caso é 0, depois é enviado 1 e no quinto octeto é enviado

0 novamente, esse foi o endereço.

Depois de enviado o endereço onde será gravado a informação, bastará enviar a

informação em si, o último octeto serve para isto, neste caso foi armazenado o valor 0x05

SPI Gravação

26

requer uma programação complicada.

Por isso mesmo, este protocolo permite velocidade de comunicação mais alta que o I2C.

igura 14 uma operação de

são necessários 6

, canal de envio de

no primeiro pulso de clock é

sso habilitará o canal para escrita, depois é

a instrução de programação através do comando 0x02 ou 10 em binário, no

é enviado a primeira de três partes do endereço onde será

enviado 1 e no quinto octeto é enviado

Depois de enviado o endereço onde será gravado a informação, bastará enviar a

informação em si, o último octeto serve para isto, neste caso foi armazenado o valor 0x05

27

A instrução de leitura composta na Figura 14 é mais simples, é composto por 5 octetos de

clock, no primeiro octeto é enviado através do canal SDO a informação de leitura,

composta pelo valor 0x03 ou 11 em binário, agora é enviado o endereço de onde será

lido, igual ao da Figura 13, no segundo octeto é enviado 0 no terceiro é enviado 1 e no

quarto octeto é enviado o 0 novamente e por último o dispositivo retorna através da

terceira linha o SDI o valor que está naquele endereço, neste caso o valor que foi gravado

o 5 ou em binário 101.

Figura 14 - Análise Digital - SPI Leitura

28

3 PROJETO

Neste capítulo será descrito o software e o hardware que foi utilizado para implementar

este projeto, bem como as tecnologias utilizadas, conceitos, esquemáticos e a forma que

as mesmas foram integradas para que o resultado seja satisfatório.

A Figura 15 ilustra o funcionamento básico do software.

Figura 15 - Funcionamento Básico do Software

3.1 PROJETO DE SOFTWARE

Para a elaboração do firmware (Software utilizado em dispositivos embarcados) foi

utilizada a linguagem de programação ANSI C, pela sua eficiência, praticidade e

funcionalidade. Quando a aplicação é utilizada em sistema embarcado as opções de

programação são restritas, além do ANSI C, pode se utilizar diretamente o Assembly

(Linguagem de programação utilizada na arquitetura de microcontroladores), mas é uma

linguagem de baixo nível, ou seja, extremamente complexa e isto acaba consumindo um

tempo desnecessário do projeto somente no estudo de sua arquitetura.

Início Obtenção da Imagem

Processamento Identificação

Saída Sonora Fim

29

3.1.1 AQUISIÇÃO DA IMAGEM

A aquisição da imagem se dá através de um sensor CMOS com uma lente embutida,

chamada de câmera, ela enviará a imagem da cédula para a memória, o software por sua

vez, buscará a imagem na memória e fará seu processamento.

Para configurações internas da câmera como brilho, saturação, contraste, é utilizado o

protocolo de comunicação I2C, quando o microcontrolador foi escolhido, ter este protocolo

como nativo foi fator decisivo, com isso, não será necessário efetuar o controle via

software para emular este protocolo.

Após abrir o canal de comunicação com a câmera, a mesma passa a enviar os dados

obtidos pelo sensor no formato YUV, onde o Y é o canal em escala de cinza que varia de

16 sendo o preto e 240 o branco, os valores abaixo de 16 e acima de 240 são utilizados

para controles internos da câmera.

Para converter a informação em RGB, utilizam-se as seguintes fórmulas, descritas no

datasheet do sensor da câmera:

Y = 0.59G + 0.31R + 0.11B

U = R – Y

V = B – Y

A resolução máxima da câmera é de 292 x 356, disponibilizando aproximadamente 110

mil pixels.

Para aquisição da imagem foi necessário baixar a velocidade da câmera, porque o

processador escolhido não era rápido o suficiente para leitura dos dados da mesma, a

velocidade original da câmera é de 8Mhz, isso gera aproximadamente 25 imagens por

segundo, para que o processador consiga efetuar a leitora a velocidade foi baixada para 1

imagem a cada 0,8 segundos.

30

O esquema de envio dos dados da câmera pode ser visto na Figura 16.

Figura 16 - Funcionamento Câmera - Visão Macro

O canal Vsync é o que controla uma nova imagem, toda vez que ele é acionado é porque

começou uma imagem. Depois que o Vsync vai para nível lógico baixo começa então o

Href, ele é responsável pelo início e fim de cada linha da imagem, enquanto o Href está

em nível lógico alto são enviados 255 valores através do canal Y e UV. Quando o Href vai

para nível lógico baixo foi porque aquela linha foi totalmente transmitida, depois ele irá

novamente para nível lógico alto causando a transmissão da próxima linha e isso se

repetirá até que todas as linhas sejam transmitidas, neste caso são 292 linhas.

Assim que todas as linhas foram transmitidas o Vsync vai para nível lógico alto

novamente indicando que uma nova imagem vai começar.

Na Figura 17 é possível ver o esquema de envio dos dados em uma visão micro, ou seja,

com possibilidade de análise do clock da câmera. As Figuras 16 e 17 foram modificadas,

não são as mesmas que constam no datasheet da câmera. A informação que consta lá

está confusa, com isso acabou dificultando o entendimento do funcionamento da câmera.

31

Figura 17 - Funcionamento Câmera - Visão Micro

Na Figura 17 pode ser visto os canais Y e UV de forma detalhada, o funcionamento é

idêntico ao da Figura 16, com diferença que agora pode ser visto cada um dos valores

dos canais. O Vsync vai para nível lógico alto indicando uma nova imagem, depois o Href

vai para nível lógico alto e os pixels são transmitidos, do primeiro a último, neste caso é o

352, depois se repetirá até que o Href chegue na última linha, 292.

Mesmo na menor velocidade da câmera (I2C_Cam_Write(0x11, 0x1F)), que gera cerca de

uma imagem a cada 1,4 segundos ainda não foi possível obter toda a imagem de uma

única vez, foi necessário obter um único valor de cada linha enviada, ou seja, a cada

imagem enviada pela câmera, era obtida uma única coluna. Na próxima imagem, outra

coluna e assim sucessivamente até terminar a imagem.

Para um melhor entendimento pode ser analisado a função de obtenção da imagem

seguindo o código abaixo.

32

void Foto(void){

unsigned char Imagem[QuantLinhas][QuantColunas]; //QuantLinhas e QuantColunas são definidas

unsigned short int linha = 0;

unsigned short int coluna = 0;

unsigned short int posicao = 0;

unsigned short int largura = 0;

unsigned short int limiar = 0;

for(coluna = 0; coluna<QuantColunas; coluna++){

while(isVSYNup); //Enquanto VSYNC estiver em ALTO

while(isVSYNdown); //Enquanto VSYNC estiver em BAIXO

for(linha = 0;linha<QuantLinhas;linha++){

while(isHREFdown); //Enquanto linha não começar

//For que controla qual coluna está sendo lida

for(posicao = 0;posicao<coluna;posicao++){

while(isPCLKup); //Enquanto clock estiver em ALTO

while(isPCLKdown); //Enquanto clock estiver em BAIXO

}

Imagem[linha][coluna] = PORTD & 0xFF;

while(isHREFup); //Enquanto linha não terminar

}

}

}

33

3.1.2 PRÉ-PROCESSAMENTO

Como a memória externa não pode ser implementada, devido a problemas de fabricação

dos chips, houve a necessidade de restringir o projeto, invés de utilizar a imagem inteira

foi utilizado apenas um dos cantos com tamanho de 70 x 80 pixels, este tamanho é

restrito devido ao tamanho da memória RAM do microcontrolador 8 kbytes.

Assim que a imagem é obtida, é necessário efetuar uma operação conhecida como

limiarização, porque nesse momento a imagem contém diversos tons diferentes de cinza,

essa operação transforma a imagem em apenas dois tons de cores o branco e o preto.

Como a imagem já é enviada pela câmera em tons de cinza, não houve a necessidade de

aplicação do filtro de média,

processo de identificação da imagem

Pode-se entender como limiar, o divisor de águas de uma imagem, ou seja, quem está

acima deste valor será agora branco e quem está abaixo será preto, porém este valor é

muito importante, porque se a cédula está escura o limiar deverá ser meno

clara o limiar será maior.

Quando o limiar não é calculado de maneira precisa

a seguir:

Figura 18 – Erro no cálculo do limiar

Esse limiar é considerado incorreto pois não conseguiu isolar o número da borda, c

na imagem da Figura 18, não é possível aplicar filtros que possam isol

ruído presente.

Para a definição do limiar existem algoritmos prontos como

computacional gasto por ele para definir o limiar acaba sendo muito grande quando se

utilizado em um microcontrolador.

3.1.3 DEFINIÇÃO DO LIMIAR

Como a imagem já é enviada pela câmera em tons de cinza, não houve a necessidade de

aplicação do filtro de média, que transforma a imagem em tons de cinza,

processo de identificação da imagem mais rápido.

er como limiar, o divisor de águas de uma imagem, ou seja, quem está

acima deste valor será agora branco e quem está abaixo será preto, porém este valor é

muito importante, porque se a cédula está escura o limiar deverá ser meno

Quando o limiar não é calculado de maneira precisa, acontece casos como o da

Erro no cálculo do limiar

Esse limiar é considerado incorreto pois não conseguiu isolar o número da borda, c

, não é possível aplicar filtros que possam isol

Para a definição do limiar existem algoritmos prontos como Otsu, porém o poder

computacional gasto por ele para definir o limiar acaba sendo muito grande quando se

utilizado em um microcontrolador.

34

Como a imagem já é enviada pela câmera em tons de cinza, não houve a necessidade de

que transforma a imagem em tons de cinza, isto tornou o

er como limiar, o divisor de águas de uma imagem, ou seja, quem está

acima deste valor será agora branco e quem está abaixo será preto, porém este valor é

muito importante, porque se a cédula está escura o limiar deverá ser menor e se estiver

acontece casos como o da Figura 18

Esse limiar é considerado incorreto pois não conseguiu isolar o número da borda, como

, não é possível aplicar filtros que possam isolar o número do

, porém o poder

computacional gasto por ele para definir o limiar acaba sendo muito grande quando se

Neste projeto o limiar é definido de acordo com a média dos pixels que estão no canto

extraído, quando a imagem é muito escur

a imagem é mais clara.

Um limiar bem calculado resulta em uma imagem isolada

bons resultados, conforme Figura 19

Figura 19 - Calculo do Limiar Correto

Na Figura 19, o cinco ficou completamente isolado da borda, um filtro que

bordas não terá dificuldades.

escrito que possa isolar o número de forma a ser possível diferenciá

Para definir o limiar foi utilizado o seguinte

para x de 1 até [LarguraImagem]

para y de 1 até [AlturaImagem]

Valor = Valor + Imagem

fim para

fim para

Limiar = Valor/(AlturaImagem*LarguraImagem)

definido de acordo com a média dos pixels que estão no canto

extraído, quando a imagem é muito escura o limiar tende a ser menor e vice versa quando

Um limiar bem calculado resulta em uma imagem isolada de forma que os filtros tenha

ons resultados, conforme Figura 19.

Calculo do Limiar Correto

, o cinco ficou completamente isolado da borda, um filtro que

das não terá dificuldades. Isso só é possível com a aplicação de um código bem

escrito que possa isolar o número de forma a ser possível diferenciá-lo das bordas.

utilizado o seguinte o pseudo-código abaixo.

até [LarguraImagem]

até [AlturaImagem]

Valor = Valor + Imagem[LarguraImagem][AlturaImagem]

Limiar = Valor/(AlturaImagem*LarguraImagem)

35

definido de acordo com a média dos pixels que estão no canto

o limiar tende a ser menor e vice versa quando

de forma que os filtros tenham

, o cinco ficou completamente isolado da borda, um filtro que retirará as

Isso só é possível com a aplicação de um código bem

lo das bordas.

[LarguraImagem][AlturaImagem]

36

3.1.4 LIMIARIZAÇÃO

O processo de limiariação (também conhecido como binarização) da imagem consiste em

dividir os pixels em apenas dois níveis, branco e preto, de acordo com os níveis de cinza.

Para que isso seja possível, escolhe-se um valor chamado de limiar T, esse valor definirá

quais pixels serão brancos e quais serão pretos.

Se o valor do pixel for maior que T, ele será modificado para branco (valor igual a 255),

caso seja menor que T ele será transformado para preto (valor igual a 0).

O limiar T pode ser definido manualmente ou de forma automática, a partir da análise do

histograma, assim que ele é definido percorre-se a imagem efetuando a nova

classificação, tendo assim uma nova imagem somente em dois tons de cores.

O pseudo-código abaixo ilustra como isso pode ser feito:

Na Figura 20 um exemplo da cédula após o filtro de limiarização, é possível observar

como já se destaca o número que deverá ser localizado.

para x de 1 até [LarguraImagem]

para y de 1 até [AlturaImagem]

se NovaImagem[x][y] > T então

NovaImagem[x][y] = 255;

senão

NovaImagem[x][y] = 0;

fim se

fim para

fim para

Figura 20 – Imagem Limiarizada

3.1.

Como pode ser observado na Figura 20

envolta do número, essa borda precisa ser elimi

ser aplicados.

O processo de exclusão das bordas, é um processo fixo, são excluídas 10 linhas

quatro lados da imagem, isso garante que as bordas pretas e eventuais ruídos sejam

excluídos.

A exclusão pode ser simulada

pode ser visto na Figura 21:

3.1.5 EXCLUSÃO DAS BORDAS

omo pode ser observado na Figura 20, é possível identificar que existe uma borda preta

envolta do número, essa borda precisa ser eliminada para que os próximos filtros possam

O processo de exclusão das bordas, é um processo fixo, são excluídas 10 linhas

quatro lados da imagem, isso garante que as bordas pretas e eventuais ruídos sejam

simulada de acordo com o pseudo-código abaixo

37

, é possível identificar que existe uma borda preta

nada para que os próximos filtros possam

O processo de exclusão das bordas, é um processo fixo, são excluídas 10 linhas dos

quatro lados da imagem, isso garante que as bordas pretas e eventuais ruídos sejam

código abaixo e um exemplo

Figura 21 - Aplicação da Exclusão de Bordas

QuantBorda igual 10

//Extrai a borda superior

para x de 1 até QuantBorda

para y de 1 até [

Imagem[x

//Extrai a borda inferior

para x igual AlturaImagem

para y de 0 até LarguraImagem

Imagem[x

//Extrai a borda esquerda

para x de 0 até QuantBorda

Para y de 0 até AlturaImagem

Imagem[x

//Extrai a borda direita

para x de 0 até LarguraImagem

para y de 0 até AlturaImagem

Imagem[linha][coluna]=255;

Aplicação da Exclusão de Bordas

//Extrai a borda superior

QuantBorda

[LarguraImagem]

x][y]=255;

borda inferior

para x igual AlturaImagem-QuantBorda até QuantLinhas

para y de 0 até LarguraImagem

x][y]=255;

//Extrai a borda esquerda

para x de 0 até QuantBorda

Para y de 0 até AlturaImagem

Imagem[x][y]=255;

//Extrai a borda direita

para x de 0 até LarguraImagem-QuantBorda ate LarguraImagem

para y de 0 até AlturaImagem

Imagem[linha][coluna]=255;

38

QuantBorda ate LarguraImagem

39

3.1.5 HISTOGRAMA

Depois que a imagem é limiarizada o número fica bem definido, ele fica em meio de um

grande número de pontos brancos, o histograma nada mais faz, que passar esses pontos

que estão no meio da imagem para o inicio, ou seja, passa a impressão de que todos os

pontos caíram e ficaram amontoados como se a gravidade deixasse de existir!

Se uma imagem fosse impressa e analisada com um microscópio seria possível ver algo

como a Figura 22, onde cada quadradinho representa um pixel, e o número que consta

em cada quadrado é o valor de cada pixel.

Figura 22 - Exemplo Prático de Histograma

Na Figura 22, têm-se três planilhas simulando uma imagem, na primeira planilha é uma

imagem que já foi limiarizada, onde o 0 representa os pontos pretos e o 1 os pontos

brancos. Na planilha 2, os pontos pretos foram removidos, ficando somente os pontos

brancos e por último na planilha 3 foi aplicado um histograma que transferiu todos os

números para o início da planilha. Está é apenas um exemplo didático do funcionamento

do histograma.

Na Figura 23 um exemplo da aplicação do histograma.

Imagem Normal

Somente Pontos Pretos

Histograma

0 0 0 0 0 0

0 0 0 1 1 0

1 1

0 0 1 1 1 0

1 1 1

0 1 1 1 1 0

1 1 1 1

0 0 0 1 1 0 1 1

1 1

0 0 0 1 1 0

1 1

1 1

0 0 0 1 1 0

1 1

1 1

0 0 0 1 1 0

1 1

1 1

0 0 0 0 0 0

1 1 1

0 0 0 0 0 0

1 1 1 1

Figura 23 - Exemplo de Aplicação do Histograma

3.1.6

Uma determinada região pode ser representada

existe o código de cadeia de Freeman

provável número esteja.

O algoritmo de Freeman descrito na F

possível da forma da região. O

seqüência conectada de segmentos de 4 ou 8 segmentos.

Figura 24 - Cadeias de Orientação

Na Figura 25 um exemplo de aplicação, utilizando ambas as cadeias com

(a) Código de Cadeia de 4 direções (b) Código de Cadeia com 8 direções.

Exemplo de Aplicação do Histograma

3.1.6 ALGORITMO DE FREEMAN

Uma determinada região pode ser representada em termos de seu contorno

existe o código de cadeia de Freeman, ela é aplicada assim que a região onde um

descrito na Figura 24 é a técnica de representação mais fiel

possível da forma da região. O mesmo é usado na representação do contorno por uma

ência conectada de segmentos de 4 ou 8 segmentos.

Cadeias de Orientação

um exemplo de aplicação, utilizando ambas as cadeias com

Código de Cadeia de 4 direções (b) Código de Cadeia com 8 direções.

40

em termos de seu contorno, para isso

, ela é aplicada assim que a região onde um

é a técnica de representação mais fiel

ão do contorno por uma

um exemplo de aplicação, utilizando ambas as cadeias como base.

Código de Cadeia de 4 direções (b) Código de Cadeia com 8 direções.

41

Figura 25 – Aplicações de Freemann

Antes da aplicação do algoritmo de Freeman é necessário codificar cada um dos números

que terão de ser encontrados, ou seja, encontrar a seqüência de caracteres que o número

impresso na cédula representa.

Depois de codificado, bastará aplicar o algoritmo e comparar os valores encontrados, com

os valores previamente especificados, assim é possível descobrir qual é o número que

está sendo analisado.

Para este projeto foi adaptado um algoritmo específico, que foi inspirado nos mesmos

passos aplicados por Freemann, o algoritmo é mais simples pois foi utilizado apenas para

as formas do histograma, ou seja, só vai para baixo, cima e para frente, ao contrário do

algoritmo original que permite que a borda seja mapeada em 360 graus.

Essa adaptação tornou mais simples e mais rápido o processamento, uma vez que se

fosse utilizado o algoritmo original o tempo para aplicar o filtro acabaria sendo muitas

vezes maior.

Conforme pode ser visto na Figura 26, o algoritmo trata apenas valores da esquerda para

direita isso torna mais rápido o processamento do que se percorresse o número conforme

Figura 25.

(c) Aplicação com cadeia de 4 direções. (d) Cadeia com 8 direções.

Figura 26 - Algoritmo Adaptado / Aplicação no Número 1

3.1.7 FORMA DE IDENTIFICAR O NÚMERO

Para identificar cada um dos números são isoladas 3 características, a largura de cada

número, a quantidade de vales que possui cada número e a soma do resultado do

algoritmo de Freemann.

Pode se perceber que a largura do número 1 é menor que a largura do

conforme Figura 27. Essa é uma característica

identificar o número, o 2 e o 5 possuem larguras semelhantes, para isso outras

características são extraídas de cada número.

Figura 27 - Comparativo de Largura

Algoritmo Adaptado / Aplicação no Número 1

FORMA DE IDENTIFICAR O NÚMERO

Para identificar cada um dos números são isoladas 3 características, a largura de cada

número, a quantidade de vales que possui cada número e a soma do resultado do

Pode se perceber que a largura do número 1 é menor que a largura do

. Essa é uma característica, porém somente com ela não é po

e o 5 possuem larguras semelhantes, para isso outras

características são extraídas de cada número.

Comparativo de Largura

42

Para identificar cada um dos números são isoladas 3 características, a largura de cada

número, a quantidade de vales que possui cada número e a soma do resultado do

Pode se perceber que a largura do número 1 é menor que a largura do número 10,

porém somente com ela não é possível

e o 5 possuem larguras semelhantes, para isso outras

43

Conforme código abaixo pode ser visto como é obtida a primeira característica, a largura.

unsigned short int CalculaLargura(unsigned char Imagem[70][80]){

unsigned short int linha=0;

unsigned short int coluna=0;

unsigned short int valor=0;

unsigned short int cont=0;

unsigned short int primeiraColuna=0;

unsigned short int ultimaColuna=0;

unsigned char HistoHorValores[QuantColunas];

unsigned short int largura=0;

//Conta a quantidade de pixels pretos em todas as colunas (Histograma)

for(coluna=0;coluna<QuantColunas;coluna++){

for(linha=0;linha<QuantLinhas;linha++){

valor = Imagem[linha][coluna];

if (valor==0)

cont++;

}

HistoHorValores[coluna]=cont;

cont=0;

}

valor = 0;

//Localiza a primeira coluna que contenham valores validos

for(coluna=0;coluna<QuantColunas;coluna++){

valor = HistoHorValores[coluna];

if(valor>2 && valor<40 && primeiraColuna==0){

primeiraColuna=coluna;

coluna=QuantColunas;

}

}

valor = 0;

//Localiza a ultima coluna que contenham valores validos

for(coluna=QuantColunas-1;coluna>0;coluna--){

valor = HistoHorValores[coluna];

if(valor>2 && valor<40 && ultimaColuna==0){

ultimaColuna=coluna;

coluna=1;

}

}

largura = ultimaColuna - primeiraColuna;

return(largura);

}

A segunda característica analisada é a quantidade de vales que o número possui, um vale

pode ser entendido como o pequeno espaço que separa o um do zero na nota de dez

reais, ou o dois e o zero na nota de vinte reais.

Na Figura 28 abaixo pode ser entendido melhor o conceito de vales.

Figura 28 - Exemplo de Vales

O código abaixo demonstra o algoritmo utilizado em linguagem

soma dos vales presentes em uma imagem.

10 possuí 1 único vale. 100 possuí 2 vales

A segunda característica analisada é a quantidade de vales que o número possui, um vale

pode ser entendido como o pequeno espaço que separa o um do zero na nota de dez

reais, ou o dois e o zero na nota de vinte reais.

abaixo pode ser entendido melhor o conceito de vales.

abaixo demonstra o algoritmo utilizado em linguagem ANSI C para localização e

soma dos vales presentes em uma imagem.

10 possuí 1 único vale. 100 possuí 2 vales

44

A segunda característica analisada é a quantidade de vales que o número possui, um vale

pode ser entendido como o pequeno espaço que separa o um do zero na nota de dez

C para localização e

45

E por último a terceira característica, conforme explicado acima sobre Freemann, é

encontrado uma “identidade” do número, por exemplo:

unsigned short int EncontraVales(unsigned char Imagem[70][80]){

unsigned short int linha=0; unsigned short int coluna=0;

unsigned short int valor=0; unsigned short int cont=0;

unsigned short int primeiraColuna=0; unsigned short int ultimaColuna=0;

unsigned short int numero=0; unsigned short int preVale=0;

unsigned char HistoHorValores[QuantColunas]; unsigned short int vales=0;

//Conta a quantidade de pixels pretos em todas as colunas (Histograma)

for(coluna=0;coluna<QuantColunas;coluna++){

for(linha=0;linha<QuantLinhas;linha++){

valor = Imagem[linha][coluna];

if (valor==0) cont++;

}

HistoHorValores[coluna]=cont;

cont=0; } valor = 0;

//Localiza a primeira coluna que contenham valores validos

for(coluna=0;coluna<QuantColunas;coluna++){

valor = HistoHorValores[coluna];

if(valor>2 && valor<40 && primeiraColuna==0){

primeiraColuna=coluna; coluna=QuantColunas;

} }

valor = 0;

//Localiza a ultima coluna que contenham valores validos

for(coluna=QuantColunas-1;coluna>0;coluna--){

valor = HistoHorValores[coluna];

if(valor>2 && valor<40 && ultimaColuna==0){

ultimaColuna=coluna;

coluna=1;

} }

for(coluna=primeiraColuna;coluna<ultimaColuna;coluna++){ //Localiza vales

valor = HistoHorValores[coluna];

//Localiza o primeiro ponto preto

if(valor>3 && numero==0){ //Achou o primeiro numero

numero=1; }

//Continua o processamento até encontrar o primeiro branco 1v0

if(numero==1 && valor<=3){

preVale=1;

}

//Achou o primeiro vale - 1v0

if(preVale==1 && valor>3){

vales++; preVale=0; numero=0;

} }

return(vales);

}

46

• 2 Reais

2,4,4,4,4,4,3,4,3,3,4,4,4,4,3,4,4,4,3,4,4,4,3,4,4,0,2,3,0,1,3,3,4,4,4,4,4,4,4,3,1,0,0,1,

0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,2

Cada número possui um código único, uma das formas para distinguir cada número, seria

fazer N médias até padronizar em 8 valores por exemplo, porém isso consumiria muito

tempo de processamento, para uma aplicação embarcada é quase inviável, a não ser que

o poder de processamento do microcontrolador seja muito alto.

Como já se possui outras duas características de cada número foi optado por efetuar uma

soma desses números, tendo assim um único número que varia em média 10%, mesmo

com essa variação grande ainda é possível efetuar a identificação de cada número.

Para o número 2 através de uma média entre 10 amostras a soma ficou próximo de 143,

para o número 10 a medida da soma foi de 293 e assim por diante.

Unindo as 3 características é possível classificar e identificar cada número.

O código abaixo demonstra a função utilizada para aplicar o filtro de Freemann.

unsigned short int Freemann(unsigned char Imagem[70][80]){

unsigned short int linha=0;

unsigned short int coluna=0;

unsigned short int valor=0;

unsigned short int cont=0;

unsigned short int primeiraColuna=0;

unsigned short int ultimaColuna=0;

unsigned char HistoHorValores[QuantColunas];

unsigned char identidade[256];

unsigned char achei=0;

unsigned char buffer[50];

unsigned short int colunaAjustada=0;

identidade[cont] = 2; //Todo numero inicia por 2 por causa da condição do 0 e do 4.

47

//Conta a quantidade de pixels pretos em todas as colunas (Histograma)

for(coluna=0;coluna<QuantColunas;coluna++){

for(linha=0;linha<QuantLinhas;linha++){

valor = Imagem[linha][coluna];

if (valor==0)

cont++;

}

HistoHorValores[coluna]=cont;

cont=0;

}

valor = 0;

//Localiza a primeira coluna que contenham valores validos

for(coluna=0;coluna<QuantColunas;coluna++){

valor = HistoHorValores[coluna];

if(valor>2 && valor<40 && primeiraColuna==0){

primeiraColuna=coluna;

coluna=QuantColunas;

}

}

valor = 0;

//Localiza a ultima coluna que contenham valores validos

for(coluna=QuantColunas-1;coluna>0;coluna--){

valor = HistoHorValores[coluna];

if(valor>2 && valor<40 && ultimaColuna==0){

ultimaColuna=coluna;

coluna=1;

}

}

linha = QuantLinhas;

coluna = primeiraColuna;

cont = 1;

achei = 0;

//Implementação de Freemann

while(primeiraColuna<=ultimaColuna){

//4

//&& identidade[cont-1]!=4 -> Condição adicionada para que não fique em looping

// entre o 4 e o 0 quando for um pico com caminho apenas de ída.

if(Imagem[linha-1][coluna]==0 && achei==0 && identidade[cont-1]!=0){

identidade[cont] = 4;

cont++;

48

achei=1;

linha--;

colunaAjustada=0;

}

//3

if(Imagem[linha-1][coluna+1]==0 && achei==0){

identidade[cont] = 3;

cont++;

achei=1;

linha--;

coluna++;

primeiraColuna++;

colunaAjustada=0;

}

//2

if(Imagem[linha][coluna+1]==0 && achei==0){

identidade[cont] = 2;

cont++;

achei=1;

coluna++;

primeiraColuna++;

colunaAjustada=0;

}

//1

if(Imagem[linha+1][coluna+1]==0 && achei==0){

identidade[cont] = 1;

cont++;

achei=1;

linha++;

coluna++;

primeiraColuna++;

colunaAjustada=0;

}

//0

//&& identidade[cont-1]!=4 -> Condição adicionada para que não fique em looping

// entre o 4 e o 0 quando for um pico com caminho apenas de ída.

if(Imagem[linha+1][coluna]==0 && achei==0 && identidade[cont-1]!=4){

identidade[cont] = 0;

cont++;

achei=1;

linha++;

49

Código 1 - Função de Freemann

Após a descoberta destas 3 características, uma quarta função composta por uma cadeia

de IFs, compara e decide qual o valor que se encaixa nas 3 características informadas.

colunaAjustada=0;

}

//Passou por todos e não encontrou valores que se encaixavam

//Ajuste, avança para a próxima coluna e vai aumentando a linha até chegar no chão

if(achei==0){

//A coluna soh pode ser ajustada uma vez

if(colunaAjustada==0){

coluna++;

colunaAjustada=1;

}

identidade[cont] = 0;

cont++;

linha++;

}

achei=0;

}

valor = 0;

Escreve_UART2("Freemann: ");

for(coluna=0;coluna<cont;coluna++){

sprintf(buffer,"%d,\0",identidade[coluna]);

Escreve_UART2(buffer);

valor = valor + identidade[coluna];

}

Escreve_UART2("Soma: ");

sprintf(buffer,"%d,\0",valor);

Escreve_UART2(buffer);

//Faz a Media

//Media_256_To_8(identidade,cont);

//Somatorio(identidade[256], cont);

return(valor);

}

50

3.1.7 PLATAFORMA DE DESENVOLVIMENTO E AMBIENTE DE EXECUÇÃO

A plataforma de desenvolvimento escolhida foi a MPLAB IDE 8.1, ela é oferecida

gratuitamente pelo fabricante de componentes eletrônicos Microchip, isto garantirá a

compatibilidade entre o código fonte e a arquitetura do microcontrolador, facilidade para

encontrar falhas, verificação em tempo real do quanto já foi utilizado da memória de

programa e a possibilidade de gravação diretamente no hardware, debug in circuit

(permite verificar erros em tempo real diretamente no hardware).

Este projeto não oferece um software para interação com o usuário, oferece apenas o

firmware, por este motivo não foi necessário a utilização de outras plataformas de

desenvolvimento.

Para auxiliar no desenvolvimento além da MPLAB, foi utilizado também o software

Borland C++ Builder Professional como complemento.

Para desenvolvimento do circuito foi utilizado o software Proteus, um programa muito

poderoso que oferece integração com o MPLAB, os códigos podem ser testados

diretamente no circuito, caso exista algum problema ele será descoberto antes que seja

confeccionada uma placa.

51

3.1.8 FLUXOGRAMA BÁSICO DE FUNCIONAMENTO

A Figura 29 demonstra o funcionamento do firmware.

Figura 29 – Fluxograma Básico de Funcionamento

Disponibiliza Som

Fim

Áudio

Não

Identificado

Nota=1 Nota=2 Nota=5 Nota=10 Nota=20 Nota=50 Nota=100

Áudio=1 Áudio=2 Áudio=5 Áudio=10 Áudio=20 Áudio=50 Áudio=100

Acabou Quadro

Desativa Câmera

Processa Imagem

Aplica Filtros

Identificação Positiva

Caso Nota

Inicio

Ativa Câmera

Envia Quadro

Não

Sim

Sim

Não

Seleciona Áudio

52

3.2 PROJETO DE HARDWARE

O hardware envolvido neste projeto é composto por: uma câmera digital, um

microcontrolador, uma memória FLASH e outros componentes que servirão para a

interligação, como resistores, capacitores, etc.

A Figura 30 mostra o layout do protótipo medindo 10(cm) de largura, 20(cm) de altura e

15(cm) de profundidade.

Figura 30 – Layout Visão Lateral

3.2.1 AQUISIÇÃO DOS DADOS

Para a obtenção da imagem foram necessários padronizar o fundo e as laterais na caixa

onde a cédula é fotografada, eliminando dessa forma ruídos que poderiam surgir na

imagem, como por exemplo: texturas diversas, cores semelhantes ao da cédula, bordas

que dificultariam o processo de identificação utilizado pelo software, etc.

53

Com essa padronização o sistema é mais rápido e o resultado mais confiável, caso não

houvesse a padronização haveria a necessidade de um tratamento através de software,

mesmo assim não seria possível garantir um nível de acerto tolerável, além de aumentar

o tempo de processamento.

Após a proposta inicial de se utilizar uma câmera digital convencional, lendo a imagem

diretamente do cartão de memória, verificou-se inviável este método, pois o formato que

as atuais câmeras salvam seus arquivos é o (JPG). Para trabalhar com este formato em

um software embarcado é praticamente inviável, pois o algoritmo de descompressão

deste arquivo é extremamente complexo e pesado.

Por este motivo foi escolhido uma micro câmera CMOS com saída digital, específica para

aplicações embarcadas. Este conjunto composto de sensor de captura de lentes é capaz

de obter imagens a distâncias inferiores a 4 (mm), além de ser colorido e enviar

diretamente quadros compostos pelos pixels RGB. Isso facilitará muito o processamento

da imagem. Na Figura 31 uma ilustração do módulo C3088, composto com sensor CMOS,

lente e placa.

Figura 31 - Câmera CMOS

54

3.2.2 ARMAZENAMENTO

Assim que a câmera começar a enviar os dados da imagem, eles terão de ser

armazenados em uma memória, para isto foi necessário unir ao projeto uma memória

flash externa ao microcontrolador.

A memória utilizada terá capacidade de armazenamento de 2 Mbytes embora à

quantidade estimada necessária para atender o projeto seja de 1 Mbyte, optou-se por

utilizar esta memória com capacidade superior, pois assim será possível armazenar todas

as imagens, economizando assim alguns ciclos de clocks que seriam utilizados para

apagar as imagens que já tivessem sido processadas.

A memória utilizada foi a M25P16 da ST Microeletronics, ela tem 16 pinos, 75MHz de

clock máximo e interface de comunicação SPI.

Na Figura 32 a ilustração dos pinos e tipo de encapsulamento da memória.

Figura 32 - Memória Flash de 2 Mbytes

55

3.2.3 APRESENTAÇÃO DOS RESULTADOS AO USUÁRIO

Após o processamento da imagem, é necessário informar ao usuário o resultado obtido,

para isto foi utilizado um pequeno alto falante que tocará bips distintos para cada uma das

notas conforme Tabela 1. Em caso da não identificação da mesma será tocado um bip

intermitente por 2 segundos.

Conforme [6], um sistema de áudio pode ser desenvolvido a partir de uma única saída do

microcontrolador, inicialmente foi feito somente com bips, porém no futuro o protótipo terá

um dispositivo mais avançado de som.

Tabela 1 - Relação de Notas e Bips

1 Real 1 Bip Rápido

2 Reais 2 Bips Rápidos

5 Reais 3 Bips Rápidos

10 Reais 1 Bip Longo

20 Reais 2 Bips Longos

50 Reais 1 Bip Longo e 1 Bip Curto

100 Reais 1 Bip Longo e 2 Bips Curtos

56

3.2.4 DIAGRAMA DE BLOCOS

A Figura 33 mostra o diagrama de blocos.

Figura 33 - Diagrama em Blocos

3.2.5 INTERAÇÃO ENTRE BLOCOS

A Figura 34 mostra a interação entre os blocos.

Figura 34 – Interação em Blocos

Inicia M I C R O C O N T R O L A D O R

Armazena Imagem na Memória Memória de

Programa

Sistema de Som

Câmera

Câmera

Ativa Câmera

M I C R O C O N T R O L A D O R

Memória Flash

Interna

Memória de Programa

Sistema de Som

57

3.2.6 INTERAÇÃO ENTRE SOFTWARE E HARDWARE

A Figura 35 representa a interação entre o usuário o software e o hardware.

Figura 35 – Interação Entre o Software e Hardware

Disponibiliza Som

Obtém Imagem

Ativa Câmera

Início

Usuário Firmware Hardware

58

3.2.7 ESQUEMA ELÉTRICO

Na Figura 36 o esquema elétrico dos componentes, não foi possível utilizar o componente

real da câmera, pois o mesmo não foi encontrado no software Proteus.

Para resolver este problema, foi desenhado um componente com as pinagens da câmera.

Figura 36 - Esquema Elétrico

59

3.2.8 Fotos do Protótipo

As Figuras 37, 38, 39 e 40, mostram o protótipo desde projeto montado em protoboard até

sua conclusão.

Figura 37 - Circuito Montado em Protoboard

Figura 38 - Placa Finalizada

60

Figura 39 - Visão Superior do Protótipo

Figura 40 - Visão Frontal e da Parte Inferior

61

3.3 PROTOCOLO DE TESTES E VALIDAÇÃO

O protocolo de testes e validação define as regras a serem seguidas para garantir que o

projeto funcione de acordo com o objetivo proposto de identificar o dinheiro inserido no

mesmo.

Como o projeto não foi modular não foi possível definir um protocolo em separado para

cada item, resumindo, ou o projeto está totalmente concluído para que possa ser testado

ou não havia possibilidade de testar somente a câmera ou o processador em separado.

Para a correta identificação da cédula, tem-se de inseri-la dentro da caixa do projeto

conforme Figura 40 onde a figura do rosto contido na cédula fique para cima e o número

pequeno fique na entrada da caixa.

Isto foi necessário porque a memória acabou não funcionando, por este motivo foi

necessário restringir a imagem a uma pequena área, então o sistema sempre fotografa

essa parte específica da cédula para efetuar o processamento.

Como o foco principal do projeto são deficientes visuais, logicamente eles não saberão

que lado está o rosto e que lado está o número, pensando nisto na pior das hipóteses o

usuário precisará inserir a imagem em 4 posições diferentes com isso levando 1 minuto

para identificar a cédula.

Além disso é necessário inserir a cédula junto a lateral esquerda e o fundo, de forma que

a cédula fique reta junto ao fundo, se ela ficar dobrada ou amassada não é possível ter

certeza de que o sistema conseguirá identificar a cédula.

Não é necessário utilizar uma iluminação extra, a câmera está configurada para trabalhar

com a iluminação fornecida pelo próprio sistema, em caso de uma luz extra acabará

saturando a imagem e fazendo com que o sistema não identifique a cédula.

O projeto será considerado válido desde que respeite os dados acima descritos.

62

APÊNDICE A - PREVISÃO DE CUSTOS

Na Tabela 2 é demonstrado o custo aproximado do projeto, caso fosse um projeto real e

não somente um trabalho de conclusão de curso. O valor é estimado com base tempo e

materiais, para uma melhor compreensão foi gerado um gráfico na Figura 41 que

representa a soma dos materiais e horas trabalhadas.

Recurso Custo Total

Horas de Engenheiro: Luciano Henrique Albano R$ 52.304,64

Borland C++ Builder Professional R$ 2.700,00

Consultoria: Alessandro Zimmer R$ 2.350,00

Laboratórios R$ 1.800,00

Notebook R$ 950,00

Aprovação: Edson Pedro Ferlin R$ 540,00

Utensílios R$ 500,00

Microsoft Project R$ 400,00

Proteus R$ 400,00

Osciloscópio R$ 350,00

Ferramental R$ 250,00

Microsoft Office R$ 200,00

Quartus II R$ 180,00

Microsoft Windows R$ 170,00

Câmera Digital CMOS R$ 100,00

Kit de Desenvolvimento ICD2 R$ 270,00

Conversor de Áudio R$ 50,00

Memória Flash R$ 50,00

Caixa do Dispositivo R$ 50,00

Cabos e Conectores R$ 50,00

Componentes R$ 50,00

Total R$ 63.714,64

Tabela 2 - Planilha de Custos

Na Figura 41 é apresentado o gráfico dos custos do projeto, separado por centros de

custo.

Figura 41 – Gráfico do Rateio Entre os Centros de Custos

R$52.304,64

Relatório de Resumo de Custo do Projeto

é apresentado o gráfico dos custos do projeto, separado por centros de

Gráfico do Rateio Entre os Centros de Custos

R$11.190,00

R$52.304,64

Relatório de Resumo de Custo do Projeto

63

é apresentado o gráfico dos custos do projeto, separado por centros de

Relatório de Resumo de Custo do Projeto

Material

Trabalho

64

APÊNDICE B – CRONOGRAMA

Na Figura 42 é demonstrado um cronograma com o tempo decorrido do projeto.

Figura 42 - Cronograma MS Project

65

4 CONCLUSÃO

O desenvolvimento deste projeto permitiu demonstrar que é possível a utilização de um

sistema de processamento de imagens embarcado, ou seja, sem a utilização de um

computador.

Diversos filtros aplicados na imagem acabaram demandando um tempo de

processamento superior ao esperado, porém os resultados foram satisfatórios, tendo em

vista que este projeto acabou sofrendo alguns problemas no decorrer do

desenvolvimento.

A memória empregada no projeto acabou não funcionando, o programa se comunica com

outras memórias com tamanho de armazenamento menores e mesmo protocolo de

comunicação, o SPI. Segundo informações do fornecedor um lote da memória estava com

problemas, isso fez com que o projeto ficasse limitado ao processamento de parte da

imagem apenas, e não da imagem inteira como previsto no início do projeto.

Diversos testes foram realizados depois que o protótipo estava funcionando, detectou-se

a necessidade de extrair mais características das cédulas, como cor e melhoramento do

sistema de identificação do limiar da cédula, porém mesmo sem esses parâmetros houve-

se um grau considerável de acertos da cédula fotografada.

A câmera empregada no sistema para fotografar a imagem demandou muito mais tempo

do que o esperado, além de envolver tecnologias não ensinadas no curso, isso fez com

que diversos conhecimentos sobre protocolos de comunicação fossem estudados

conforme [7, 8, 9 e 10], isso contribuiu para que outros sistemas possam ser

desenvolvidos, pois as tecnologias utilizadas são muito comuns em outros tipos de

dispositivos encontrados no mercado.

O microcontrolador utilizado acabou sendo um pouco lento para a aplicação, em média

está levando para fazer todo o processamento 15 segundos, esse tempo embora seja

66

pouco, a expectativa era de que não fosse superior a 5 segundos, porém isso não invalida

o projeto visto que futuras melhorias poderão deixar o projeto mais rápido.

O sistema de áudio desenvolvido para o projeto acabou sendo através de bips, um buzzer

ligado a uma porta do microcontrolador que faz o som se propagar de acordo com a

Tabela 1, devido ao problema da memória, descrito acima foi necessário utilizar este

sistema de saída de som, porque o tamanho de cada arquivo de som contendo o valor da

nota era superior ao que o microcontrolador tinha de memória interna.

67

5 REFERÊNCIAS BIBLIOGRAFIAS

1 - Livros

GONZALEZ, R. C.; WOODS, R. E. Processamento de Imagens Digitais. Editora Edgar

Blücher Ltda. São Paulo. 2000.

2 - Monografias, Dissertação e Tese

NETO, ERNANI DE SOUZA CUBAS – Interpretador de Textos Escritos em Linguagem

Braille. Curitiba, 2006. Monografia (Graduação).

3 – Internet

1 – Grupo de estudos sobre eletrônica

(http://www.eletronica.org/modules.php?name=News&file=print&sid=13).

2 – Microchip – Fabricante internacional de microcontroladores

(http://www.microchip.com).

3 – Omini Vision – Fabricante de chips de obtenção de imagens (http://www.ovt.com).

4 – CMUCam – Grupo de estudos sobre o sistema desenvolvido pela Carnegie Mellon

University (http://www.cmucam.org)

5 – Fabricante de Memórias – (http://www.numonyx.com).

6 – Roman Black – Grupo de estudos sobre som em sistemas embarcados

(http://www.romanblack.com).

7 – Jrobot – Grupo de desenvolvimento de um sistema utilizando a Camera C3088

(http://www.jrobot.net).

8 – Electronics123.com – Loja virtual com algumas informações de utilização da câmera

(http://www.electronics123.com).

68

9 – CoMedia.com – Fabricante da câmera C3088 – (http://www.comedia.com.cn).

10 – Burgos Eletrônica – Solda de Componentes smd –

(http://www.burgoseletronica.net/pgsmd/dessoldagemdesmdcomsolda.htm).

11 – Resultados do IBGE (http://www.entreamigos.com.br/noticias/BrasilRadiografia.html).

12 – Protocolo SPI (http://www.ee.pucrs.br/~terroso/html/protocolos.html).