UNIVERSIDADE ANHEMBI MORUMBI ANDERSON DA SILVA BISCONSIN DIEGO LEITE DE SOUSA GABRIEL TREVISAN RAFAEL PEGORARO SOARES DESENVOLVENDO O JOGO PONG COM ARDUINO São Paulo 2011 ANDERSON DA SILVA BISCONSIN DIEGO LEITE DE SOUSA GABRIEL TREVISAN RAFAEL PEGORARO SOARES DESENVOLVENDO O JOGO PONG COM ARDUINO Trabalho de Conclusão de Curso apresentado como exigência parcial para a obtenção de título de Graduação do Curso de Ciência da Computação da Universidade Anhembi Morumbi Orientador: Prof. Msc. Emerson S. Paduan São Paulo 2011 ANDERSON DA SILVA BISCONSIN DIEGO LEITE DE SOUSA GABRIEL TREVISAN RAFAEL PEGORARO SOARES DESENVOLVENDO O JOGO PONG COM ARDUINO Trabalho de Conclusão de Curso apresentado como exigência parcial para a obtenção de título de Graduação do Curso de Ciência da Computação da Universidade Anhembi Morumbi Aprovado em: PROF. EMERSON DOS SANTOS PADUAN Universidade Anhembi Morumbi PROF.: REGIANE APARECIDA MARUCCI Universidade Anhembi Morumbi PROF.: EDSON LUIZ RECCHIA Universidade Anhembi Morumbi RESUMO O Arduino é uma plataforma de prototipação eletrônica que possui diversas versões e com módulos disponíveis para uso em diversas aplicações, ele é um projeto que disponibiliza todas as suas documentações técnicas e diagramas esquemáticos para uso livre sobre uma licença Open Hardware, que permite o uso livre desses recursos contanto que os resultados sejam igualmente livres. Ele possue uma linguagem de programação própria, que é uma modificação da linguagem C baseada no projeto Wiring e com ambiente de desenvolvimento escrito em Java baseado no projeto Processing, ambos projetos Open-source, ou seja, de código aberto. O Arduino possibilita o desenvolvimento de aplicações complexas de forma simples, facilitando o aprendizado e o desenvolvimento por qualquer pessoa. Para demonstrar estas características este trabalho tem o objetivo de recriar o jogo Pong integrando a uma interface de controle fisica com as paletas de jogo. Apresentando as características, recursos e possibilidades existentes no Arduino desenvolvendo o jogo Pong. Palavras-chave: Linguagem C. Eletrônica. Desenvolvimento para Arduino. ABSTRACT The Arduino is an electronics prototyping platform that has many versions and modules available for use in many applications, it is a project that provides all technical documentation and schematics for free use on an Open Hardware License, which allows free use these resources as long as the results are equally free. He possesses an own programming language, which is a modification of the C language based on Wiring design and development environment written in Javabased on Processing project, both open-source project, or open source. The Arduino allows for the development of complex applications in a simple, facilitating learning and development by anyone. To demonstrate these features our work aims to recreate the game Pong with a game controller that integrates physically palettes of the game control. Demonstrating its features, possibilities and resources developing the game Pong with Arduino. Key words: Language C. Electronics. Development for Arduino. LISTA DE FIGURAS Figura 1 - Tela do Jogo Pong .............................................................................13 Figura 2 - Tela do Jogo Tennis no Odyssey.......................................................14 Figura 3 - Protótipo Pong de 1972 .....................................................................15 Figura 4 - Arcade Pong de 1973.........................................................................15 Figura 5 - Diagrama de Blocos ..........................................................................20 Figura 6 - PWM, Ciclo de Trabalho. .................................................................21 Figura 7 – Dotklok ..............................................................................................22 Figura 8 - Wifi Robot ..........................................................................................22 Figura 9 - Arduino gamepack..............................................................................23 Figura 10 - Arduino Uno .....................................................................................24 Figura 11 - Arduino Duemilanove.......................................................................24 Figura 12 - Arduino Nano....................................................................................25 Figura 13 - Arduino Mega ..................................................................................27 Figura 14 - Arduino BT (Bluetooth) ....................................................................28 Figura 15 - Arduino LilyPad ...............................................................................28 Figura 16 - Arduino Fio ......................................................................................29 Figura 17 - Arduino Mini .....................................................................................29 Figura 18 - Arduino Pro ......................................................................................30 Figura 19 - Arduino Pro Mini...............................................................................31 Figura 20 - Arduino Mini USB Adapter ...............................................................31 Figura 21 - Uso simultâneo de Shields...............................................................32 Figura 22 - Arduino Ethernet Shield ..................................................................33 Figura 23 - Arduino Input Shield ........................................................................33 Figura 24 – Freeduino ........................................................................................34 Figura 25 – Seeeduino ......................................................................................34 Figura 26 – Severino ..........................................................................................35 Figura 27 - Brasuino BS1 ..................................................................................35 Figura 28 - IDE Processing.................................................................................36 Figura 29 - IDE Arduino .....................................................................................37 Figura 30 - Barra de Ferramentas......................................................................38 Figura 31 - Seleção de Placas Arduino..............................................................40 Figura 32 - AVR Studio.......................................................................................40 Figura 33 - Seleção de Bibliotecas.....................................................................45 Figura 34 - Ping Pong com Matriz de LEDs.......................................................47 Figura 35 - Relação, Arduino e Protótipo...........................................................48 Figura 36 - Campo de jogo ................................................................................48 Figura 37 - Componentes do Arduino Mega ......................................................50 Figura 38 - Matriz de LED 8x8 60mm ................................................................50 Figura 39 - Potenciômetro .................................................................................51 Figura 40 - Display de 7 Segmentos .................................................................51 Figura 41 - Buzzer .............................................................................................52 Figura 42 - Motor 4,5V........................................................................................52 Figura 43 - Shield Motor ....................................................................................53 Figura 44 - Chip da Shield Motor (L298N) .........................................................53 Figura 45 – Protoboard ......................................................................................54 Figura 46 – Ligações internas da Protoboard ...................................................54 Figura 47 – Fonte de Alimentação Universal .....................................................55 Figura 48 – Diagrama para ligação de uma Matriz de LEDs 8x8 .....................56 Figura 49 – Ligação do Potenciômetro ao Arduino ...........................................57 Figura 50 – Primeiro protótipo do Projeto ..........................................................58 Figura 51 – Pinos de um Display de 7 Segmentos ...........................................58 Figura 52 – Sequências de bits para exibição de numerais no Display ............59 Figura 53 – Ligação do Buzzer ao Arduino .......................................................59 Figura 54 – Diagrama de ligação da Shield Motor no Arduino ..........................61 Figura 55 – Tela Inicial .......................................................................................61 Figura 56 – Visão do Jogo .................................................................................62 Figura 57 - Telas de fim de jogo ........................................................................62 Figura 58 - Diagrama das ligações dos componentes no Arduino ....................63 Figura 59 – Projeto final .....................................................................................64 Figura 60 – Falha lógica ....................................................................................65 LISTA DE TABELAS Tabela 1 - CRITÉRIOS OPEN HARDWARE......................................................17 Tabela 2 - TABELA COMPARATIVA DE TIPOS DE ARDUINO..........................32 Tabela 3 - BARRA DE MENUS...........................................................................40 Tabela 4 - TABELA DE VARIÁVEIS....................................................................43 SUMÁRIO 1 INTRODUÇÃO ................................................................................................11 1.1 OBJETIVO ....................................................................................................11 1.2 JUSTIFICATIVA ............................................................................................11 1.3 ABRANGÊNCIA ...........................................................................................11 1.4 ESTRUTURA DO TRABALHO ....................................................................12 2 O JOGO PONG ..............................................................................................13 3 OPEN HARDWARE ........................................................................................16 3.1 DENIFIÇÃO DOS CRITERIOS DO OPEN HARDWARE ............................16 3.1.1 DOCUMENTAÇÃO....................................................................................16 3.1.2 ESCOPO ...................................................................................................16 3.1.3 SOFTWARE NECESSÁRIO. ....................................................................17 3.1.4 PRODUTOS DERIVADOS. ......................................................................17 3.1.5 LIVRE REDISTRIBUIÇÃO ........................................................................17 3.1.6 ATRIBUIÇÃO ............................................................................................17 3.1.7 NÃO DISCRIMINAÇÃO DE PESSOAS OU GRUPOS ............................18 3.1.8 NÃO DISCRIMINAÇÃO DE CAMPOS DE UTILIZAÇÃO .........................18 3.1.9 DISTRIBUIÇÃO DA LICENÇA ..................................................................18 3.1.10 A LICENÇA NÃO DEVE SER ESPECÍFICA DE UM PRODUTO ...........18 3.1.11 NÃO RESTRINGIR OUTROS SOFTWARES OU HARDWARES ..........18 3.1.12 A LICENÇA DEVE SER TECNOLOGICAMENTE NEUTRA ..................18 4 ARDUINO .......................................................................................................19 4.1 APLICAÇÕES ..............................................................................................20 4.1.1 DOTKLOK..................................................................................................21 4.1.2 WIFI ROBOT..............................................................................................22 4.1.3 ARDUINO GAMEPACK ............................................................................23 4.2 TIPOS DE ARDUINO ...................................................................................23 4.2.1 UNO ..........................................................................................................23 4.2.2 DUEMILANOVE ........................................................................................24 4.2.3 UNO SMD .................................................................................................25 4.2.4 NANO ........................................................................................................25 4.2.5 DIECIMILA ................................................................................................26 4.2.6 MEGA ........................................................................................................26 4.2.7 MEGA 2560 ...............................................................................................27 4.2.8 BT (BLUETOOTH) ....................................................................................27 4.2.9 LILYPAD ....................................................................................................28 4.2.10 FIO ..........................................................................................................28 4.2.11 MINI .........................................................................................................29 4.2.12 PRO ........................................................................................................30 4.2.13 PRO MINI ................................................................................................30 4.2.14 MINI USB ADAPTER ..............................................................................31 4.2.15 COMPARATIVO ENTRE OS MODELOS................................................32 4.3 SHIELDS ......................................................................................................32 4.4 HARDWARES BASEADOS NO ARDUINO..................................................33 4.4.1 FREEDUINO..............................................................................................34 4.4.2 SEEEDUINO..............................................................................................34 4.4.3 SEVERINO................................................................................................35 4.4.4 BRASUINO BS1........................................................................................35 4.5 ARDUINO ALPHA (IDE) ..............................................................................36 4.5.1 CARACTERÍSTICAS DA FERRAMENTA (IDE)........................................38 4.5.2 INSTALAÇÃO ...........................................................................................41 4.5.3 UTILIZAÇÃO .............................................................................................42 4.5.4 LINGUAGENS...........................................................................................42 4.5.4.1 VARIAVEIS .............................................................................................42 4.5.4.2 FUNÇÕES .............................................................................................44 4.5.4.3 BIBLIOTECAS........................................................................................44 4.5.4.3.1 BIBLIOTECAS STANDARD.................................................................45 4.5.4.3.2 BIBLIOTECAS CONTRIBUTED..........................................................45 5 TRABALHO RELACIONADO.........................................................................46 6 MODELAGEM DO PROJETO........................................................................48 6.1 HARDWARES UTILIZADOS .......................................................................49 6.1.1 RAZÃO PARA USO DO MEGA ................................................................49 6.1.2 MATRIZ DE LED .......................................................................................49 6.1.3 POTENCIÔMETRO ..................................................................................50 6.1.4 DISPLAY CÁTODO DE SETE SEGMENTOS ..........................................50 6.1.5 BUZZER ....................................................................................................50 6.1.6 MOTOR .....................................................................................................51 6.1.7 SHIELD MOTOR DUAL H-BRIDGE .........................................................51 6.1.8 PROTOBOARD ........................................................................................52 6.1.9 FONTE DE ALIMENTAÇÃO .....................................................................53 6.2 DESENVOLVIMENTO .................................................................................54 6.2.1 FUNCIONAMENTO DO JOGO PONG .....................................................54 6.2.2 LIGANDO UMA MATRIZ DE LEDS AO ARDUINO ..................................55 6.2.3 LIGANDO UM POTENCIÔMETRO AO ARDUINO ..................................55 6.2.4 PRIMEIRO PROTÓTIPO ..........................................................................56 6.2.5 LIGANDO UM DISPLAY CÁTODO AO ARDUINO ...................................57 6.2.6 LIGANDO UM BUZZER AO ARDUINO ....................................................58 6.2.7 LIGANDO A SHIELD E UM MOTOR NO ARDUINO.................................59 6.2.8 TELAS DO JOGO .....................................................................................60 6.2.9 INTELIGÊNCIA ARTIFICIAL .....................................................................61 6.3 MONTAGEM ................................................................................................62 6.3 TESTES .......................................................................................................62 7 DIFICULDADE ENCONTRADAS...................................................................64 8 CONCLUSÃO E TRABALHOS FUTUROS....................................................64 9 TRABALHOS FUTUROS................................................................................64 REFERÊNCIAS BIBLIOGRÁFICAS .................................................................65 APENDICE A – CÓDIGO FONTE .....................................................................71 APENDICE B – IMAGENS DO PROCESSO DE MONTAGEM .......................81 APENDICE C – COMPARAÇÃO ENTRE MODELOS .....................................81 11 1 INTRODUÇÃO A cada ano que passa a tecnologia avança mais, e observa-se que no mercado de Jogos e Hardwares existem grandes empresas investindo em novas tecnologias para novos projetos (MICROSOFT, 2011; ESTADAO, 2011; VEJA, 2011). Com o objetivo de oferecer aos seus usuários maior liberdade, realismo e interação através de novas tecnologias de captura de movimento, tornando tudo mais próximo da realidade. Pode-se facilmente notar esses avanços observando os jogos atuais que, com o uso da criatividade e das novas tecnologias, permitem uma maior interação e realismo proporcionando maior liberdade de movimento. Neste projeto foi utilizado o hardware Arduino para recriar o jogo Pong em uma interface mais amigável, tornando o funcionamento do jogo mais interativo e realista. 1.1 OBJETIVO Este projeto tem por objetivo desenvolver o jogo Pong utilizando o hardware Arduino e com ele desenvolver uma nova interface de controle para este jogo, com o objetivo de tornar o jogo mais intuitivo. 1.2 JUSTIFICATIVA O intuito deste projeto é cobrir temas como robótica, games e eletrônica, áreas não abordadas ou pouco discutidas pelo curso. Esse trabalho tem como objetivo o desenvolvimento de um jogo eletrônico utilizando a placa Arduino, tendo em vista proporcionar um aprendizado não adquirido até o momento. E tem como motivação a criação de um trabalho divertido que incentiva o aprendizado, servindo de referência futura para a área. 1.3 ABRANGÊNCIA O projeto abrange o desenvolvimento do jogo eletrônico Pong sem opção multi-jogador utilizando o open hardware Arduino como base. Será construído um hardware que possibilitará a interação do jogador, que controlará uma das barras 12 laterais que representam as raquetes no jogo, enquanto a máquina controlará a barra lateral oposta no jogo, os movimentos da bolinha e terá inteligência para validar as jogadas. As barras laterais serão físicas, sendo uma delas dotada de um controlador, enquanto a bolinha será representada virtualmente. Haverá contagem dos pontos obtidos por cada jogador e será possível a visualização desta contagem. A cada colisão da bolinha com uma barra lateral, um falante será acionado, emitindo um som para representar a colisão. 1.4 ESTRUTURA DO TRABALHO Além do capítulo introdutório, o trabalho está estruturado em 7 capítulos. No capítulo 2 é apresentada a história do jogo Pong e curiosidades acerca do jogo. É abordado no capítulo 3 o significado de Open Hardware, elencando as principais exigências do conceito no que diz respeito à documentação e licença de distribuição. No capítulo 4 é apresentado o Arduino, open hardware que será utilizado no projeto, descrevendo os modelos existentes e a linguagem de programação utilizada pelo projeto. No capítulo 5 são abordadas a IDE e a linguagem do Arduino. O capítulo 6 contempla o desenvolvimento e a montagem do projeto, descrevendo os hardwares utilizados e o funcionamento da inteligência artificial. Já no capítulo 7 são apresentadas as conclusões da monografia e sugestões de trabalhos futuros. 13 2 O JOGO PONG A história do jogo Pong, e também a história dos videogames, teve origem em 1951, quando Ralph Baer, um jovem engenheiro, foi encarregado de construir o melhor aparelho de televisão do mundo. A idéia de Ralph era possibilitar que as pessoas interagissem com o aparelho de TV, jogando. Essa idéia não foi bem aceita pelo engenheiro chefe Sam Lackoff, e o conceito de vídeo games de Raplh Baer não pode ser implementado. Somente em 1966, Raplh retomou a sua idéia de 1951 e começou a construir protótipos, cerca de sete, do que viria a ser o primeiro vídeo game da história. Em 1968, Ralph construiu seu último protótipo, a Brown Box, (PONGSTORY, 2011). Em 1971, Ralph Baer licencia seu projeto Brown Box para ser produzido exclusivamente pela Magnavox e auxilia a empresa na produção de uma versão do seu protótipo, que seria lançado no ano seguinte com o nome Odyssey, (BAER, 2011). O jogo Pong (Figura 1) foi criado em 1972 pelo engenheiro elétrico e cientista da computação Al Alcorn, com ajuda de Nolan Bushnell, que fundou a empresa Atari juntamente com Ted Dabney no mesmo ano, (CLASSICGAMING, 2011; NONUBA, 2009). Figura 1 - Tela do jogo Pong. Fonte: (OLD COMPUTERS, 2011). Pong foi o primeiro produto da Atari e funcionava de forma semelhante a uma partida de tênis, onde os jogadores rebatiam uma bola de um lado para outro, e era controlado por botões rotativos, parecidos com um controlador de volume de aparelho de som. Apesar de ser o primeiro jogo lucrativo da história, a idéia de Pong 14 não era original, pois Nolan Bushnell havia visitado uma feira e visto o jogo Tennis (Figura 2) do videogame Odyssey e pediu que Alcorn criasse um jogo baseado nele, a título de exercício, dado que Alcorn não tinha experiência com jogos eletrônicos. Bushnell ficou tão surpreso com a qualidade do jogo feito por Alcorn, que decidiu investir no jogo, (CLASSICGAMING, 2011; NONUBA, 2009). Figura 2 - Tela do Jogo Tennis no Odyssey. Fonte: (VIDEOGAME CONSOLELIBRARY, 2011). No mesmo ano, Nolan Bushnell e Al Alcorn criaram um protótipo do jogo, que possibilitava jogar contra a própria máquina ou contra um amigo mediante pagamento, e colocaram em um bar na Califórnia, chamado "Andy Capps Tavern". Após duas semanas da instalação do jogo, Alcorn foi informado pelo gerente do bar que o jogo havia quebrado e que ele adoraria que o jogo fosse concertado. Quando Alcorn verificou a máquina, encontrou um problema pouco comum. O motivo da máquina ter parado de funcionar era a quantidade de moedas que havia dentro dela. Em poucos meses outras empresas lançaram imitações do Pong, até que a Magnavox, empresa responsável pelo vídeo game Odyssey, processou a Atari por infringir as patentes de Ralph Baer, criador do videogame, em 700 mil dólares, ocasionando a primeira batalha judicial sobre videogames da história, (CLASSICGAMING, 2011; NONUBA, 2009). Em 1973, foram construídas de 8 a 10 mil unidades da máquina com o jogo Pong, conforme mostrado nas figuras 3 e 4, tornando-o um sucesso sem precedentes. No mesmo ano, Ted Dabney vendeu metade da sua parte nas ações da Atari para Nolan Bushnell, que criou uma nova empresa para concorrer com a Atari, a Kee Games, (CLASSICGAMING, 2011; NONUBA, 2009). 15 Figura 3 - Protótipo Pong de 1972. Fonte: (VIDEOGAMETRADER, 2011). A partir de 1974, diversas empresas, como Atari, Magnavox e Coleco, começaram a trabalhar em versões caseiras do jogo Pong, aproveitando o sucesso do Arcade. Elas criaram diversas variações do jogo nos anos seguintes, até que em 1977 Pong perdeu a sua popularidade com a chegada dos videogames baseados em cartuchos, cujos jogos não se limitavam a variações de Pong (CLASSICGAMING, 2011; NONUBA, 2009). Figura 4 – Arcade Pong de 1973. Fonte: (VIDEOGAME CONSOLELIBRARY, 2011). 16 3 OPEN HARDWARE Open Hardware é um hardware de especificação aberta, ou seja, todas as informações necessárias para compreensão e reconstrução devem estar acessíveis e seus arquivos abertos e lidos por qualquer programa de código aberto, isto é, sem o auxílio de qualquer ferramenta comercial. Isso significa dizer que todo o seu design está à disposição de todo o público, para que esse possa estudá-lo, modificálo, fazer a sua distribuição, produção e até a venda do mesmo (OPEN HARDWARE ORG, 2011). 3.1 DENIFIÇÃO DOS CRITERIOS DO OPEN HARDWARE. Os critérios proporcionam às pessoas a liberdade de controlar a tecnologia e partilhar de seus conhecimentos, além de incentivar o comércio através da livre troca de projetos. Vale salientar que não se pode fazer o uso de um open hardware em quaisquer projetos proprietários, com especificação fechada (OPEN HARDWARE ORG, 2011). No dia 10 de fevereiro de 2011 foi lançada uma definição de open hardware, nela está escrita que para sua distribuição 12 critérios devem ser cumpridos (OPEN HARDWARE ORG, 2011). Os critérios são: 3.1.1 DOCUMENTAÇÃO. Ele deve ser distribuído com documentação, isso deve incluir os arquivos de design e também permitir a modificação e distribuição desses arquivos. Caso o produto físico não venha acompanhando da documentação, deve obtê-la, preferencialmente via download na Internet, (OPEN HARDWARE ORG, 2011). 3.1.2 ESCOPO. Sua documentação deve especificar de forma clara quais as partes de seu design são distribuídas sob licença, (OPEN HARDWARE ORG, 2011). 17 3.1.3 SOFTWARE NECESSÁRIO. Caso haja a necessidade de usar um software para o hardware operar corretamente, sua licença deve requisitar que uma das condições a seguir seja cumprida: a) Sua interface deve ser devidamente documentada e de maneira descomplicada, possibilitando a criação de um software open source para que o dispositivo possa funcionar corretamente. b) Distribuição de uma licença open source para o software necessário. Tornando o software alterável por qualquer pessoa, (OPEN HARDWARE ORG, 2011). 3.1.4 PRODUTOS DERIVADOS. Deve-se permitir a modificação e criação de produtos derivados do hardware original. Também se deve permitir a distribuição, manufatura e venda dos produtos derivados, contanto que os mesmos sejam distribuídos sob os mesmos termos da licença original, (OPEN HARDWARE ORG, 2011). 3.1.5 LIVRE REDISTRIBUIÇÃO A licença não pode fazer a cobrança de direitos autorais ou de qualquer outra taxa para a venda ou redistribuição, (OPEN HARDWARE ORG, 2011). 3.1.6 ATRIBUIÇÃO A licença pode fazer a requisição de nota de direitos autorais aos seus produtos derivados, (OPEN HARDWARE ORG, 2011). 18 3.1.7 NÃO DISCRIMINAÇÃO DE PESSOAS OU GRUPOS Não pode ser feita qualquer discriminação contra uma pessoa, ou grupo de pessoas, (OPEN HARDWARE ORG, 2011). 3.1.8 NÃO DISCRIMINAÇÃO DE CAMPOS DE UTILIZAÇÃO Não se deve restringir o uso do produto em nenhum campo de utilização, (OPEN HARDWARE ORG, 2011). 3.1.9 DISTRIBUIÇÃO DA LICENÇA Todos que tiverem produtos redistribuídos devem possuir os mesmos direitos garantidos pela licença original, sem necessidade de nenhuma outra licença adicional, (OPEN HARDWARE ORG, 2011). 3.1.10 A LICENÇA NÃO DEVE SER ESPECÍFICA DE UM PRODUTO Não se deve permitir que produtos licenciados sejam partes de um produto particular, ou seja, caso uma parte seja extraída de um produto, que esteja dentro dos termos da licença, todas as partes devem ter os mesmos direitos garantidos do produto original, (OPEN HARDWARE ORG, 2011). 3.1.11 A LICENÇA NÃO DEVE RESTRINGIR OUTROS SOFTWARES OU HARDWARES Não se deve fazer nenhuma restrição a outros itens que sejam agregados ao produto mas não derivados do mesmo, (OPEN HARDWARE ORG, 2011). 3.1.12 A LICENÇA DEVE SER TECNOLOGICAMENTE NEUTRA Não se pode aplicar nenhuma parte da licença a uma tecnologia em particular, componente, material ou ao estilo da interface, (OPEN HARDWARE ORG, 2011). 19 4 ARDUINO O conceito Arduino surgiu na Itália em 2005 com o objetivo de criar um dispositivo para controlar projetos / protótipos construídos de uma forma que exija menos despesas do que outros sistemas disponíveis no mercado (DA FONSECA; BEPPU, 2010). O Arduino é uma plataforma de computação física (são sistemas digitais ligados a sensores e atuadores, que permitem construir sistemas que percebam a realidade e respondam com ações físicas), baseada em uma simples placa de Entrada / Saída microcontrolada e desenvolvida sobre uma biblioteca que simplifica a escrita da programação em C (DA FONSECA; BEPPU, 2010). Um microcontrolador, também denominado MCU é um computador em um chip, que contém processador, memória e periféricos de entrada / saída, e que pode ser programado com funções específicas, em contraste com outros microprocessadores de propósitos gerais (como os utilizados nos PCs). Eles são acoplados no Arduino para que o Arduino possa controlar suas funções ou ações através de programação. O Arduino é capaz de interpretar variáveis no ambiente e transformá-las em sinal elétrico correspondente, através de sensores ligados aos seus terminais de entrada, e atuar no controle ou acionamento de algum outro elemento eletroeletrônico conectado ao terminal de saída. Ou seja, é uma ferramenta de controle de entrada e saída de dados, que pode ser acionada por um sensor, por exemplo, um resistor dependente da luz – LDR, e que logo após passar por uma etapa de processamento, o microcontrolador poderá acionar um atuador, por exemplo, um motor. É como um computador, tendo como periféricos de entrada o mouse e o teclado, e de saída impressoras, motores de passo e caixas de som, só que fazendo interface com circuitos elétricos, podendo receber ou enviar informações / tensões através deles. 20 Para melhor entendimento, na figura 5 é possível identificar os elementos principais do circuito através de um diagrama em blocos (DA FONSECA; BEPPU, 2010). Figura 5 – Diagrama de Blocos. Fonte: (DA FONSECA; BEPPU, 2010). O Arduino é baseado em um microcontrolador ATmega, e dessa forma é logicamente programável, ou seja, é possível a criação de programas (Sketchs), utilizando uma linguagem própria baseada em C, que quando implementados fazem com que o hardware execute certas ações (DA FONSECA; BEPPU, 2010). O grande diferencial desta ferramenta é que ela é desenvolvida e aperfeiçoada por uma comunidade que divulga os seus projetos e códigos fonte de aplicações, pois a concepção dela é open source (código fonte aberto). Ele foi projetado com a finalidade de ser de fácil entendimento, programação e aplicação, além de ser multiplataforma, ou seja, pode-se configurá-lo em ambiente Windows, GNU / Linux e Mac OS (DA FONSECA; BEPPU, 2010). Assim sendo, pode ser perfeitamente utilizado como ferramenta educacional sem se preocupar com o fato do usuário não ter um conhecimento específico de eletrônica. Entretanto, pelo fato de ter o seu esquema e software de programação open source, chamou a atenção de todos os envolvidos na área, que começaram a aperfeiçoar e a criar aplicações mais complexas (DA FONSECA; BEPPU, 2010). 4.1 APLICAÇÕES O Arduino pode ser usado para desenvolver artefatos interativos stand-alone, aplicação que não está conectada a um computador, ou conectados a um computador através de bibliotecas para comunicação com programas como Adobe Flash, Processing, Max/MSP, Pure Data ou Super Collider e outros demais. 21 Suas aplicações são diversas e abrangem tanto usos industriais quanto domésticos. Em indústrias, ele pode ser usado para controlar elevadores de carga, esteiras rolantes, guinchos e demais máquinas através do PWM (Pulse-Width Modulation - Modulação por Largura de Pulso). Conforme pode ser visto na figura 6, o PWM é uma tecnologia que permite controlar o período cíclico de alimentação ou frequência de operação do dispositivo. Aumentando ou diminuindo o percentual energético enviado para o dispositivo conectado ao Arduino é possível alterar a sua frequência de operação, (DA FONSECA; BEPPU, 2010). Figura 6 – PWM, Ciclo de Trabalho. Fonte: (DA FONSECA; BEPPU, 2010). Já em aplicações domésticas, ele pode ser usado para controle de iluminação, portões, cortinas elétricas, dentre outros equipamentos domésticos que podem prover um gerenciamento de sua energia elétrica e da água de sua residência (DA FONSECA; BEPPU, 2010). Alguns exemplos de aplicações com o Arduino são apresentados a seguir. 22 4.1.1 DOTKLOK O Dotklok (Figura 7) é um relógio digital feito com Arduino que exibe diversas animações enquanto mostra as horas. Essas animações variam entre números e padrões abstratos, figuras geométricas, código Morse, faces de um relógio analógico e algumas inspiradas em jogos de vídeo clássicos como Pong, Tetris, Pacman e Space Invaders. O Dotklok possui um modo de animações aleatórias opcional, onde a animação é alterada todo dia à meia-noite, (TECHNOETC, 2011). Figura 7 – Dotklok. Fonte: (TECHNOETC, 2011). 4.1.2 WIFI ROBOT O Wifi Robot (Figura 8) é um carro controlado remotamente pela internet ou com um laptop sem fio de até 500m de distância. Ele possui uma webcam e utiliza um roteador Linksys WRT54GL para o recebimento dos comandos. Seu código fonte é aberto e foi distribuído sob os termos da GNU GPL v2, então qualquer pessoa pode utilizá-lo livremente, (JBPROJECTS, 2011). Figura 8 – Wifi Robot. Fonte: (JBPROJECTS, 2011). 23 4.1.3 ARDUINO GAMEPACK O GamePack (Figura 9), é um projeto de um videogame portátil, baseado no Nintendo Game Boy utilizando a tecnologia do Arduino. Ele possui uma tela de LED, um joystick pequeno, dois botões de controle e uma bateria de lítio. Atualmente, o GamePack está disponível em forma de kit para que pessoas possam construir a sua versão. O seu sistema só executa alguns códigos de demonstração rudimentar, mas a esperança é que futuramente ele rode jogos mais avançados, ou talvez um emulador de Nintendo, (TECHNABOB, 2011). Figura 9 – Arduino gamepack. Fonte: (TECHNABOB, 2011). 4.2 TIPOS DE ARDUINO Atualmente, existem 13 tipos de Arduino, nesta seção são detalhadas suas especificações e características. Também serão apresentadas as Shields, componentes externos que podem ser usados para se estender as funcionalidades do Arduino. 4.2.1 UNO O modelo Uno, mostrado na figura 10, é baseado no microcontrolador ATmega328. Diferentemente de outros modelos, ele não faz uso do chip FTDI (usado para converter o sinal USB para conexão UART), que foi substituído pelo microcontrolador ATmega8U2, programado para converter USB para serial. 24 Este modelo marca a versão 1.0 do Arduino e pode ser alimentado através da entrada USB, com um adaptador AC-DC ou uma bateria, (ARDUINO, 2011). Figura 10 – Arduino Uno. Fonte: (ARDUINO, 2011). 4.2.4 DUEMILANOVE O modelo Duemilanove (2009 em italiano), mostrado na figura 11, é baseado no microcontrolador ATmega368 e ATmega168 nas versões anteriores. Esse modelo de Arduino pode trabalhar com voltagens entre 6 e 20 volts. Entretanto, com voltagens inferiores a 7 volts, a voltagem dos pinos não alcança os 5 volts, apresentando instabilidade no funcionamento. O problema ocorre também com voltagens superiores a 12, o regulador de voltagem pode superaquecer e queimar a placa. Devido a estes problemas, as voltagens recomendadas estão entre 7 e 12 volts (ARDUINO, 2011). Figura 11 – Arduino Duemilanove. Fonte: (ARDUINO, 2011). 25 4.2.2 UNO SMD O modelo Uno SMD é uma versão do Arduino Uno que usa o microcontrolador ATmega328P montado na superfície da placa, ao invés de montada por furos. Esta versão foi feita em resposta a um escassez na oferta do ATmega328P para montagem por furos (ARDUINO, 2011). 4.2.3 NANO O modelo Nano, mostrado na figura 12, possui uma placa muito pequena, 0.7" x 1.7", baseada nos microcontroladores ATmega168 ou ATmega328, dependendo da versão. Sua funcionalidade se assemelha ao modelo Duemilanove, porém com um pacote diferente. Ele possui uma entrada USB mini-B, que pode ser utilizada como fonte de alimentação com voltagem entre 6 e 20 volts, ou por outra fonte de alimentação de 5 volts (ARDUINO, 2011). O modelo com microcontrolador ATmega168 possui 16 KB de memória flash, enquanto o modelo com microcontrolador ATmega328 possui 32 KB. Outras diferenças entre os modelos são o tamanho da EEPROM, 512 bytes para o modelo ATmega168 e 1 KB para o modelo ATmega328 e da SRAM, 1 KB e 2 KB, respectivamente. Diferente dos demais modelos de Arduino, as versões do modelo Nano não possuem o botão Reset impresso, elas foram projetadas para serem reiniciadas via software. Outra facilidade é o envio de código para a placa, feito através do botão Upload no software do Arduino (ARDUINO, 2011). Figura 12 – Arduino Nano. Fonte: (ARDUINO, 2011). 26 4.2.5 DIECIMILA O modelo Diecimila representa a marca de 10.000 placas fabricadas e é baseado no microcontrolador ATmega168. Ele tem basicamente as mesmas características do Arduino Duemilanove, mas com a praticidade de que este seleciona automaticamente a fonte de energia vindo ou da entrada USB ou da Fonte de energia externa, enquanto o Duemilanove tem um jumper que pode ser colocado conforme se queira utilizar (ARDUINO, 2011). 4.2.6 MEGA O modelo Mega, mostrado na figura 13, é baseado no microcontrolador ATmeg1280 e é o modelo que possui a maior quantidade de pinos, 54 ao todo, dos quais 14 podem ser utilizados para saída PWM, que podem ser utilizados tanto para entrada quanto para saída de dados. Possui também 16 entradas analógicas, 4 portas seriais UARTS, um cristal oscilador de 16 MHz, conexão USB, uma entrada para energia, um conector ICSP e um botão Reset. O Mega é compatível com a maioria das Shields projetados para os modelos Arduino Duemilanove e Diecimila. Além de possuir um botão Reset, este modelo foi desenhado para reiniciar automaticamente quando conectado ao computador, permitindo o upload de novos códigos sem a necessidade de pressionar fisicamente o botão Reset. Existe uma trilha, identificada como "RESET-EN", que pode ser cortada para desabilitar o auto reset e os terminais de cada lado da trilha podem ser soldadas novamente para reativá-lo. Também é possível desativar o auto reset ligando um resistor de 110 Ohms num pino de 5 volts e no pino Reset. Outra característica deste modelo é a presença de um poli fusível reajustável que protege a entrada USB contra curtos e sobre-tensões. O poli fusível quebra 27 automaticamente, caso uma corrente superior a 500 mA for aplicada a entrada USB (ARDUINO, 2011). Figura 13 – Arduino Mega. Fonte: (ARDUINO, 2011). 4.2.7 MEGA 2560 O modelo Mega 2560 é uma versão atualizada do modelo Mega e é baseada no microcontrolador ATmega2560. Está versão conta também com 256 KB de memória flash, dos quais 8 KB são reservados para o gerenciador de boot. Assim como o modelo Uno, esta versão do modelo Mega não faz uso do chip FTDI, que foi substituído pelo microcontrolador ATmega8U2, programado para converter USB para serial. O Mega 2560 também é compatível com a maioria das Shields projetados para os modelos Arduino Uno, Duemilanove e Diecimila (ARDUINO, 2011). 4.2.8 BT (BLUETOOTH) O modelo BT, mostrado na figura 14, é baseado no microcontrolador ATmega168 e no módulo Bluetooth Bluegiga WT11. Este modelo suporta comunicação serial sem fio, bluetooth, mas não é compatível com fones de ouvido ou outros dispositivos de áudio que disponham dessa tecnologia. O módulo Bluetooth WT11 foi especialmente configurado para o uso no Arduino BT. Ele possui um nome de identificação e exige uma senha numérica para iniciar qualquer comunicação. 28 O gerenciador de boot se comunica utilizando o protocolo STK500, mas também pode ser ignorado e o microcontrolador programado através do ICSP (InCircuit Serial Programming), (ARDUINO, 2011). Figura 14 – Arduino BT (Bluetooth). Fonte: (ARDUINO, 2011). 4.2.9 LILYPAD O modelo LilyPad, mostrado na figura 15, possui duas versões baseadas nos microcontroladores ATmega168V, para a versão de baixa potência, e ATmega328V. Este modelo foi desenvolvido e projetado por Leah Buechley e Eletrônica SparkFun para computação vestível e pode ser costurado em tecidos e ligado a fontes de alimentação, sensores e atuadores com fio condutor. Apesar de ter sido projetado para computação vestível, não é recomendado lavá-lo. Entretanto caso isso seja necessário é recomendado lavá-lo à mão com detergente neutro e deixar escorrer. Também é fundamental que a placa esteja desligada da fonte de alimentação (ARDUINO, 2011). Figura 15 – Arduino LilyPad. Fonte: (ARDUINO, 2011). 29 4.2.10 FIO O modelo Fio, mostrado na figura 16, é baseado no microcontrolador ATmega328P. Este modelo foi projetado por Shigeru Kobayashi e SparkFun Electronics, e desenvolvido pela SparkFun Electronics para aplicações sem fio. Ele possui conexões para bateria de lítio, com um circuito para carga via USB disponível, e uma conexão para XBee na parte inferior. Sendo destinado para aplicações sem fio, neste modelo o usuário pode carregar programas (Sketchs) com um cabo FTDI (cabo com conector Uart e USB) ou uma placa SparkFun. Além disso, usando um adaptador específico é possível carregar programas (Sketchs) sem o uso de cabos. A placa vem sem conexões pré-montadas, permitindo o uso de vários tipos de conectores ou solda direta dos fios, (ARDUINO, 2011). Figura 16 – Arduino Fio. Fonte: (ARDUINO, 2011). 4.2.11 MINI O modelo Mini, mostrado na figura 17, possui uma placa um pouco maior que a do modelo Nano e é baseado no microcontrolador ATmega168. Este modelo é destinado ao uso em protoboards, onde o espaço é bastante escasso. É possível programar o Arduino Mini utilizando um adaptador USB Mini, outros dispositivos USB semelhantes ou um adaptador serial RS232 para TTL, (ARDUINO, 2011). Figura 17 – Arduino Mini. Fonte: (ARDUINO, 2011). 30 4.2.12 PRO O modelo Pro, mostrado na figura 18, possui duas versões, baseadas nos microcontroladores ATmega168 e ATmega328. Este modelo não possui conexões pré-montadas e como foi projetado para a instalação de componentes de forma semi-permanente possibilita o uso de vários tipos de conectores ou solda direta de fios. Sua pinagem é compatível com a maioria das Shields para Arduino. A versão com microcontrolador ATmega168 possui 16 KB de memória flash enquanto o ATmega328 32 KB, nas duas versões 2 KB são utilizados pelo gerenciador de boot. O Arduino Pro não exige que o botão Reset seja pressionado antes de um upload de código, ele foi projetado para permitir upload enquanto está conectado ao computador. Um pino é conectado a linha de Reset do microcontrolador utilizando um capacitor de 100 nanofarad e também à linha de controle de fluxo do hardware que converte USB para serial. Este recurso é utilizado para que a reinicialização funcione de forma automática e reduz o tempo de carregamento do gerenciador de boot (ARDUINO, 2011). Figura 18 – Arduino Pro. Fonte: (ARDUINO, 2011). 4.2.13 PRO MINI O modelo Pro Mini, mostrado na figura 19, é baseado no microcontrolador ATmega168 e foi projetado e fabricado pela SparkFun Electronics. Assim como ocorre no modelo Pro ele não possui conexões pré-montadas e como foi projetado para a instalação de componentes de forma semi-permanente, possibilita o uso de vários tipos de conectores ou solda direta de fios. 31 Sua pinagem é compatível com o modelo Arduino Mini. Existem duas versões do modelo Mini Pro, uma que opera a 3.3 volts e freqüência de 8 MHz, e outra que opera a 5 volts e 16 MHz de freqüência, (ARDUINO, 2011). Figura 19 – Arduino Pro Mini. Fonte: (ARDUINO, 2011). 4.2.14 ADAPTADORES E CONECTORES (MINI USB ADAPTER) O Modelo Mini USB Adapter, mostrado na figura 20, é a placa que converte uma conexão USB em TX e RX (entrada e saída) de 5 volts, permitindo comunicação direta entre o Arduino Mini, ou outros microcontroladores, e o computador. Esta placa é baseada no chip FT232RL da FTDI (ARDUINO, 2011). Figura 20 – Arduino Mini USB Adapter. Fonte: (ARDUINO, 2011). A. CHIP FTDI E CABO FTDI O chip FTDI FT232R é uma interface USB para serial UART com saída opcional geradora de clock, entre 6MHz e 48MHz, e pode ser utilizado para acionar um microcontrolador a outro dispositivo usado em conjunto (FTFICHIP ICS). O cabo FTDI é um conversor USB para Serial UART nível TTL que permite uma interface de dispositivos TTL para USB (FTDICHIP CABLES, 2011). 32 4.3 SHIELDS As Shields são placas que simplificam e diminuem o custo da inclusão de novas tecnologias nos projetos desenvolvidos com Arduino. Elas podem ser conectadas diretamente ao Arduino aumentando seus recursos (ARDUINO SHIELDS, 2011). Através da modularidade disponível nas Shields, o Arduino pode trabalhar com muitas delas simultaneamente, conforme ilustrado na figura 21, caso sejam compatíveis e suas especificações estejam de acordo com os recursos disponíveis, (SHIELDLIST, 2011). Figura 21 – Uso simultâneo de Shields. Fonte: (SHIELDLIST, 2011). Para cada tecnologia existe pelo menos um modelo de Shield, Arduino Ethernet Shield (Figura 22), usado para conexão com a Internet e o Arduino Input Shield (Figura 23), utilizado para a construção de um joystick. Apesar da diversidade de Shields, nem todos os modelos são compatíveis com todos os modelos de Arduino. Visando centralizar e reunir o máximo de informações sobre os modelos de Shield e de sua compatibilidade com os modelos do Arduino, foi criado um banco de dados originado no fórum de discussões oficial no site do Arduino. Esse banco de dados enumera a maioria dos modelos de Shield disponíveis, juntamente com a indicação dos pinos que ele utiliza, tornando mais fácil a análise de compatibilidade (SHIELDLIST, 2011). Existem diversos fabricantes de Shields compatíveis com Arduino, e cada fabricante pode, ou não, distribuir a especificação do seu hardware, para isso 33 utilizam algumas das várias licenças de distribuição disponíveis, como GPL v2, GPL v3, Creative Commons e BSD (SHIELDLIST, 2011). Figura 22 - Arduino Ethernet Shield. Fonte: (ARDUINO SHIELDS, 2011; HACKDAY, 2008). Figura 23 - Arduino Input Shield. Fonte: (DFROBOT WIKI, 2010). 4.4 HARDWARES BASEADOS NO ARDUINO Devido ao fato do Arduino ser um hardware de especificação aberta, pode-se encontrar alguns projetos baseados em sua tecnologia e totalmente compatíveis com ele. Alguns exemplos são o Freeduino, Seeeduino e os modelos brasileiros Severino e Brasuino. 4.4.1 FREEDUINO Inicialmente, o Freeduino era um projeto colaborativo para a publicação de arquivos de código aberto compatíveis com o Arduino. Os arquivos resultantes 34 desse projeto permitem aos usuários criar placas 100% funcionais. Com o passar do tempo ele passou a ser um hardware independente, mas totalmente compatível com o Arduino. O Freeduino vem com uma licença totalmente livre e sem restrições quanto ao uso de seu nome, ou seja, o usuário não precisa se preocupar com uma violação de marca. A figura 24 mostra o Freeduino na sua versão 2.1, (FREEDUINO ORG 2011). Figura 24 – Freeduino. Fonte: (FREEDUINO ORG, 2011). 4.4.2 SEEEDUINO O Seeeduino é uma placa totalmente compatível com o Arduino, assim como seus programas (Sketchs). Ele foi produzido pela empresa SeeedStudio e é baseado no layout das placas Arduino Diecimila, Duemilanove e UNO, ou seja, as posições dos pinos são as mesmas. Na versão 2.21 ATmega 168P e ATmega 328P o seu hardware sofreu algumas mudanças para melhorar a flexibilidade e a experiência do usuário. A figura 25 mostra a placa Seeeduino versão 2.21 ATmega 168P, (SEEEDSTUDIO, 2011). Figura 25 – Seeeduino. Fonte: (SEEEDSTUDIO, 2011). 35 4.4.3 SEVERINO O Severino é um microcontrolador projetado pelo brasileiro Adilson Akashi e foi baseado no Arduino Diecimila ATmega8. Atualmente ele está na sua terceira versão, (ARDUINO SEVERINO, 2011). Ele foi batizado dessa maneira pela tradição italiana do nome Arduino e pelo fato do nome ser bem brasileiro. O projeto é totalmente compatível com Shields, e possui 3 jumpers de fio, função auto reset e um jumper para desligá-la (ARDUINO TUTORIAL, 2011). A figura 26 mostra o Severino versão 3. Figura 26 – Severino. Fonte: (ARDUINO TUTORIAL, 2011). 4.4.4 BRASUINO BS1 A Holoscópio é uma empresa que atua na área de consultoria e desenvolvimento de soluções tecnológicas livres, e foi a responsável pelo desenvolvimento do Brasuino BS1. O Brasuino utiliza um microcontrolador AVR ATmega328 em 16MHz, com 32KB de memória Flash, 2KB de memória RAM e 1 KB de memória EEPROM. Utiliza um microcontrolador secundário ATmega8U2 que pode ser usado para criar dispositivos USB diversos. Ele é compatível com o Shields do Arduino Uno e o software Arduino (HOLOCÓPIO, 2011). A figura 27 mostra o Brasuino BS1. Figura 27 – Brasuino BS1. Fonte: (HOLOSCOPIO, 2011) 36 4.5 ARDUINO ALPHA (IDE) O ambiente de desenvolvimento do Arduino é uma IDE (Integrated Development Environment ou Ambiente Integrado de Desenvolvimento) que pode ser usada para escrever, editar, compilar (transformar os códigos em linguagem que o microcontrolador irá processar) e para enviar o programa compilado ao Arduino através de interface USB, usando o botão Upload (MARGOLIS, 2011). Essa ferramenta de desenvolvimento foi criada em Java baseado na IDE usada pela linguagem Processing, uma linguagem de programação e ambiente de desenvolvimento. Criados com o intuito de proporcionar um ambiente e linguagem de fácil entendimento para manipulação e criação de imagens, animações e interações para uso em recursos multimídia por artistas, designers, hobbistas ou qualquer outra pessoa (PROCESSING, 2011). Pode-se notar na figura 28 o ambiente de desenvolvimento do Processing, que é bem limpo e objetivo. Figura 28 - IDE Processing. Fonte: (PROCESSING, 2011). O resultado foi uma IDE simples e objetiva semelhante à IDE do Processing. Na figura 29, pode-se notar a interface da Arduino IDE. 37 Essas características ajudam pessoas com pouco ou nenhuma experiência em desenvolvimento a criar suas aplicações rapidamente. Barra de Ferramentas Abas Editor de textos Área de Mensagem Console Figura 29 - IDE Arduino. Fonte: (O Autor, 2011). 4.5.1 CARACTERÍSTICAS DA FERRAMENTA (IDE) O ambiente de desenvolvimento do Arduino é um Editor AVR (uma família de micro-controladores da fabricante ATmel), que é um ambiente de desenvolvimento para a Linguagem C para chips Atmel, que possui uma Área de Codificação, uma Área de Mensagens, Console, Abas, Barra de Ferramentas e uma Barra de Menus onde estão disponíveis outras opções. Sendo este um software gratuito e Open Source. Os programas do Arduino são escritos usando-se a IDE (Ambiente de Desenvolvimento Integrado), Arduino Alfa. Através dela são realizadas todas as implementações e modificações nos programas que serão executados no microcontrolador. 38 A Área de Mensagens mostra notificações para as ações executadas como Salvar, Exportar (Upload) e exibição de erros. O Console exibe as respostas do Arduino, como os programas de console Java, e através dele também é possível a visualização das mensagens de erro completas, além de outras informações. A Barra de Ferramentas (Figura 30), permite Abrir, Criar, Salvar, Verificar e realizar o Upload dos programas criados. Além de permitir abrir o Monitor Serial. Figura 30 - Barra de Ferramentas. Fonte: (O Autor, 2011). Verify/Compile (Verificar/Compilar) – Verifica o código à procura de erros. Stop (Parar) – Para o Monitor Serial, ou retira o foco de outros botões. New (Novo) – Cria um novo programa (Sketch). Open (Abrir) – Abre um Menu com os Programas no Sketch book. Ele abre o mesmo na janela atual. Save (Salvar) – Salva o programa. Upload to I/O Board (Enviar) – Compila e envia o programa para a placa do Arduino usando a porta de comunicação atual. Serial Monitor (Monitor Serial) – Abre o Monitor Serial. Mas como se trata de um ambiente de desenvolvimento Alfa ainda podem ocorrer mudanças em seu desenvolvimento até a versão final, incluindo novas funcionalidades ou resultando na exclusão de outras. Outra opção interessante é a possibilidade de usar o modo Verbose ampliando as funções disponíveis pelos botões, segurando-se a Tecla SHIFT e passando o mouse pelos itens da barra de ferramentas é possível abrir programas em novas janelas, Abrir uma nova janela de projeto ou até depurar o envio do programa. 39 Outras opções podem ser encontradas na Barra de Menus nos menus File, Edit, Sketch, Tools, Help. Algumas das principais opções disponíveis na IDE podem ser vistas na tabela 1: Tabela 1 – Barra de Menus. Copia o código para a Copy for Discourse clipboard, área de transferência, com a formatação necessária para a postagem em Fóruns. Copia o código para a clipboard com uma Edit Sketc Copy as HTML formatação em HTML, perfeito para uso em Verify/Compile páginas da web. Procura erros no programa. Adiciona bibliotecas ao programa Import Library Show Sketch Folder h Add File... Auto Format Board Serial Port usando o #include. Abre o diretório do programa. Adiciona um arquivo ao seu projeto. Ele irá aparecer em uma nova aba. Formata o código do programa. Aqui é possível selecionar o modelo de placa Arduino usada no programa. Neste menu é possível selecionar os dispositivos seriais que estão conectados ao computador, seja o Arduino ou qualquer outra placa AVR. Esse menu permite gravar um bootloader no Tools microcontrolador do Arduino. Normalmente usado Burn Bootloader em placas bootloader. ATmega É que importante não possuem selecionar a um placa Arduino correta no menu Board antes de se criar o bootloader. Fonte: (ENVIRONMENT, 2011). Na figura 31, pode ser visualizada uma das opções da Barra de Menu expandida. Neste menu é possível selecionar o Arduino que será usado no desenvolvimento de sua aplicação. 40 Figura 31: Seleção de Placas Arduino. Fonte: (O Autor, 2011). Outros ambientes de desenvolvimento como Editores AVR também podem ser usados, como é o caso do AVR Studio da própria Atmel, mostrado na figura 32. Figura 32 - AVR Studio. Fonte: (USING-AVR, 2011). 4.5.2 INSTALAÇÃO A instalação do ambiente de desenvolvimento exige do usuário apenas um conhecimento básico de operação do sistema e como instalar drivers para novos 41 dispositivos, é recomendo se possuir acesso de administrador da maquina onde o ambiente será instalado para se evitar problemas na hora de instalar algum recurso. Para começar o desenvolvimento de programas no Arduino é necessário realizar o download da IDE no site oficial (http://www.arduino.cc) na sessão download. Utilizando um cabo de dados que conecte o Arduino ao computador, ligue a fonte de energia do Arduino e verifique se o LED verde acende. Aguarde a instalação do driver (essa instalação irá falhar devido à falta do driver no Windows), após a falha entre no Gerenciador de dispositivos e localize em portas “Arduino UNO (COMxx)”, clique com o botão direito e escolha a opção para Atualizar o driver que se encontra na pasta Drivers dentro do diretório da IDE Arduino. Siga as etapas seguintes e após a instalação do driver, o Arduino estará pronto para o uso. Ele funciona como um pen-drive, por isso, é necessário conectálo ao computador somente para realizar o upload do novo programa. No site do Arduino estão disponíveis tutoriais de instalação para os sistemas MacOS e Linux, além de tutoriais específicos para cada versão do Arduino (GETSTART, 2011). 4.5.3 UTILIZAÇÃO A utilização da IDE é muito simples: como exemplo, abra o arquivo de Blink em File > Examples > Basics > Blink. Escolha a versão do Arduino que será usada em Tools > Boards. Após ter conectado o Arduino ao computador, selecione a porta onde ele está instalado em Tools > Serial Port. Após desenvolver seu programa, o processo de upload é efetuado simplesmente clicando no botão Upload to I/O Board (GETSTART, 2011). 4.5.4 LINGUAGENS O Arduino é programado usando-se uma linguagem de programação baseada no projeto Wiring (ARDUINO, 2011). Wiring é uma iniciativa que tem por objetivo 42 ilustrar conceitos de programação de eletrônicos e controle de mecanismos, necessários para o entendimento das interações físicas entre hardware e software (WIRING, 2011). A linguagem de programação usada no Arduino Alfa trata-se de uma modificação da linguagem C, que permite a qualquer usuário com conhecimento em C desenvolver aplicações para o Arduino. No Arduino os programas são chamados sketches e são criados através de sua IDE ou qualquer Editor AVR. As definições de variáveis, funções e bibliotecas, são feitas da mesma forma que em qualquer linguagem derivada de C. A seguir, são demonstradas as definições e sintaxes de declaração de variáveis, funções e inclusão de bibliotecas (ARDUINO FAQ, 2011). 4.5.4.1 VARIÁVEIS São locais na memória onde são armazenadas informações. Possui um Nome usado para referenciá-la, um Tipo que identifica como a informação está/será armazenada e um Valor que se trata de seu conteúdo. A sintaxe para a declaração de variáveis é a seguinte: Tipo Nome = Valor; Na tabela 2 são mostradas as variáveis disponíveis na linguagem, suas características, memória consumida e valores aceitos. Por usar uma linguagem baseada na linguagem C suas variáveis possuem características semelhantes. Tabela 2 – Tabela de Variáveis. Tipos int Características Representa numero inteiros positivos e negativos. Memória usada 2 Bytes Valores possíveis -32768 a 32767 43 unsigned int long Unsigned long float double boolean char byte string void Representa somente valores positivos. Usado para representar valores muito grandes com o uso de sinal. Usado para armazenar números inteiros muito grandes. Sem sinal. Representa valores de precisão que usem ponto flutuante. Ao contrario de C, em Arduino o double é apenas outra referência ao tipo Float. Representa valores booleanos como 0 e 1 ou verdadeiro e falso. Usado para representar um único caractere, representa valores entre -128 até 127. Semelhante ao char é usado para valores sem sinal. De 0 a 255. Representa arrays de caracteres (char), usado para guardar textos. Usado em funções para determinar que nenhum valor será retornado. Fonte: (MARGOLIS, Michael, 2011). 2 Bytes 4 Bytes 4 Bytes 4 Bytes 0 a 65535 -2147483648 a 2147483647 0 à 4294967295 3.4028235E+38 a -3.4028235E+38 4 Bytes - 1 Bytes false (0) ou true (1) 1 Bytes -128 a 127 1 Bytes 0 a 255 Não se Aplica. Não se Aplica. Não se aplica. Não se aplica. Nem sempre o Valor precisar ser declarado ao se iniciar a variável, também é possível se atribuir outros valores à variável usando-se o operador de atribuição (=) durante a execução do programa. Conforme mostrado na tabela 2, é possível o uso de diversos tipos de variáveis (ARDUINO REFERENCES, 2011). 4.5.4.2 FUNÇÕES Uma função é um seguimento de código que pode ser usado diversas vezes no decorrer do programa. Nela são definidas as tarefas que serão executadas sempre que esta for chamada. Seu uso possibilita vantagens, como a organização e a simplificação do código, redução de erros, redução do tamanho do código e simplifica o reuso de determinado recurso. A declaração de uma função segue a seguinte sintaxe: 44 Tipo NomeDaFuncao(Valor){ x = Valor++; } Como uma variável, a função também necessita de declaração de tipos, pois isso define o tipo de informação resultante do seu processamento. O NomeDaFuncao será usado para chamar a função quando a for necessário. Na declaração são delimitados os valores que serão passados como parâmetros para a função durante sua chamada, e que serão usados durante sua execução, sendo necessário seu uso em conjunto com o nome da função quando declarado. Segue a sintaxe de chamada da função (ARDUINO REFERENCES, 2011): NomeDaFuncao(Valor); 4.5.4.3 BIBLIOTECAS Biblioteca é um arquivo com diversas funções, ou declarações, que possuem ações semelhantes ou que trabalham sobre o mesmo objetivo. Um exemplo seria uma biblioteca de comunicação que possui funções de comunicação ou que contribuem com esse tipo de função. A declaração de uma função é bem simples: #include “NomeBiblioteca” Ou #include <NomeBiblioteca> A biblioteca é anexada ao código através do comando #include. Após sua declaração, todas as funções e comandos desta biblioteca poderão ser usados no código do programa da mesma forma que as funções no arquivo do programa. O NomeBiblioteca entre < e >, é usado para definir bibliotecas nativas, enquanto NomeBiblioteca entre as aspas duplas, é usado para definir bibliotecas exclusivas do projeto atual. As declarações seguem o mesmo formato usado na linguagem C, o que torna muito mais fácil seu entendimento, principalmente para quem já possui algum conhecimento da linguagem C. 45 O Arduino possui um conjunto de bibliotecas que permitem ampliar o conjunto de funcionalidades disponíveis. Para usá-las, basta ir até o menu Sketch > Import Library e selecionar a biblioteca desejada conforme mostrado na figura 33. Figura 33: Seleção de Bibliotecas. Fonte: (O Autor, 2011). 4.5.4.3.1 BIBLIOTECAS STANDARD Essas são as bibliotecas que estão presentes na IDE do Arduino, nelas estão funções básicas que podem ser usadas no desenvolvimento de aplicações exemplo encontradas no site do Arduino, para desenvolvimento de Shields Standard ou para desenvolvimento de novas aplicações. • EEPROM – Para leitura e escrita para armazenamento físico. • Ethernet – Para utilizar funções de conexão de rede da Ethernet Shield. • Firmata – Para comunicação entre o computador e o Arduino usando interface serial. • LiquidCrystal – Para o controle de telas de cristal líquido. • SD – Para leitura e escrita em cartões SD. • Servo – Para controle de motores do tipo Servo. • SPI – Para comunicação usando a interface serial Bus. 46 • SoftwareSerial – Para comunicação serial usando os pinos digitais. • Stepper – Para controlar motores de paso. • Wire – Para comunicação de dados com dispositivos I2C / TWI. • Matrix – Biblioteca básica de manipulação de matriz de LED. • Sprite – Biblioteca básica de manipulação de imagens para animações com uma matriz de LED. 4.5.4.3.2 BIBLIOTECAS CONTRIBUTED Além das bibliotecas Standard, existem outras denominadas Contributed (Contribuição), que devem ser instaladas no subdiretório Libraries do diretório do IDE Arduino. As bibliotecas Contributed estão divididas entre as categorias de: Comunicação, Sensores, Displays e LED, Geradores de freqüência e áudio, Motores e PWM, Timing e Utilidades. Todas elas disponibilizadas para download gratuito (ARDUINO LIBRARIES, 2011). Uma das diferenças entre a linguagem Arduino e C é a existência de duas estruturas predefinidas setup() e loop(), que são usadas em quase todos os programas. A estrutura setup() é executada apenas uma única vez, quando o programa é iniciado. Ela normalmente é usada para configurar recursos que serão utilizados. A estrutura loop() é executada continuamente durante a execução do programa. Essa estrutura é usada para executar as tarefas. Essas duas estruturas são usadas para simplificar o desenvolvimento no Arduino (ARDUINO REFERENCES, 2011). No site do Arduino estão disponíveis muitos tutoriais que ensinam como trabalhar com os principais recursos do Arduino, o que ajuda na aprendizagem. 5 TRABALHO RELACIONADO O projeto encontrado no Blog de Bruno Soares foi a referência mais sólida e objetiva encontrada, pois em relação as referências encontras no fórum do Arduino essa foi a única que especificava características da matriz e que possuía um vídeo (disponibilizado em seu blog). Sua versão do jogo Pong foi desenvolvida para suportar dois jogadores onde cada jogador controla uma das barras (raquetes). Porém seu código não implementa 47 nenhuma inteligência artificial, pontuador ou mesmo um motor. Como pode ser observado na figura 34. Figura 34 – Ping Pong com Matriz de LEDs. Fonte: (SOARES, 2009). O projeto do Bruno Soares se iniciou com o intuito de testar uma Matriz de LED 8x8 que ele havia obtido. Para iniciar o desenvolvimento ele inicialmente desenvolveu um protótipo em Flash com o uso do Action Script 3.0 (linguagem de programação do Abobe Flash). Após a prototipagem em Flash ele iniciou o desenvolvimento no Arduino utilizando como referência para ligar os LED um código encontrado em “Arduino Playground (DirectDriveLEDMatrix)”, mas, devido a diferenças entre sua matriz e a explicada no código algumas alterações foram necessárias no método doubleBuffer (responsável por ascender os LEDs da matriz), pois as linhas cátodo do código exemplo eram as colunas cátodo da matriz (nomenclatura usada para designar o contato positivo), o resultado foi o jogo pong para dois jogadores com código disponível em seu blog, (SOARES, 2009). 6 MODELAGEM DO PROJETO Neste trabalho foi realizado o desenvolvimento do jogo eletrônico Pong para interação de 1 (um) jogador humano contra a CPU. O hardware foi construído utilizando como base controladora o Arduino Mega, com microcontrolador ATmega1280, que deverá controlar todos os recursos eletrônicos, e seu funcionamento ocorrerá como exemplificado na figura 35. 48 Figura 35 - Relação, Arduino e Prototipo. Fonte: (O Autor, 2011). A bola do jogo será desenhada em uma matriz de LEDs, denominada “campo de jogo”, enquanto as barras verticais que servem de "raquetes" para o jogo serão físicas. Uma das barras verticais será controlada pelo jogador humano e outra pelo Arduino através de um motor. Foram utilizados sensores para detecção da posição Y das barras verticais e com esta informação, em conjunto com a informação do eixo XY da bola, o hardware controlador irá verificar se houve, ou não, colisão entre a bola e a barra vertical. Caso haja colisão, a velocidade da bola será incrementada e um falante será acionado fazendo assim o som do impacto da bola, como no jogo virtual. Caso não haja colisão e a bola ultrapasse a marca que delimita o "campo de jogo", conforme mostrado na figura 36, será computado um ponto. A pontuação é exibida pelos displays de sete segmentos localizados acima do "campo de jogo". 49 Figura 36 - Campo de jogo. Fonte: (O Autor, 2011). 6.1 HARDWARES UTILIZADOS Para o desenvolvimento desse projeto, foram utilizados diversos componentes que serão descritos a seguir: 6.1.1 RAZÃO PARA USO DO MEGA O Arduino Mega foi escolhido para este projeto por se tratar do modelo mais completo. Por possuir maior numero de portas entre as demais versões ele fornecia uma vida útil maior, alem de permitir a implementação de projetos mais sofisticados. Sua memória interna é a maior entre todos os Arduinos, ele possui uma entrada USB, entrada para fonte de energia, um botão de reset e de não necessitar da gravação do bootloader. Na figura 37, é possível se observar os componentes do Arduino Mega. 50 Figura 37 – Componentes do Arduino Mega. Fonte: (ARDUINO, 2011). Uma comparação mais detalhada pode ser observada na tabela disponível no Apêndice C. 6.1.2 MATRIZ DE LED Para o campo de jogo foi utilizada uma Matriz de LED 8x8 de 60mm x 60mm RGB, mostrada na figura 38, usada para o campo de jogo. Figura 38 – Matriz de LED 8x8 60mm. Fonte: (ITEADSTUDUIO, 2011). 6.1.3 POTENCIÔMETRO 51 Um potenciômetro, também conhecido como resistor variável, é um dispositivo elétrico que pode ter a sua resistência elétrica alterada mecanicamente. (UFRGS, 2011). Para esse projeto foram utilizados dois potenciômetros de 16mm, servindo como sensores para indexar a posição das raquetes. A figura 39 mostra um potenciômetro (comum). Figura 39 – Potenciômetro. Fonte: (MULTI COMERCIAL, 2011). 6.1.4 DISPLAY CATODO DE SETE SEGMENTOS Esse display é responsável por mostrar o placar do jogo, com segmentos de cor vermelha para o CPU e de cor verde para o jogador. A figura 40 mostra um exemplo desse display. Figura 40 – Display de 7 Segmentos. Fonte: (ELETRODEX, 2011). 6.1.5 BUZZER O Buzzer é um dispositivo utilizado para emitir os sons do jogo, a cada colisão da bola, pontos marcados ou fim de jogo. A figura 41 mostra um buzzer como o utilizado no projeto. O som do buzzer varia de acordo com a frequência e o tempo 52 de duração que são passados para ele, e para cada evento do jogo foram utilizadas frequências e durações diferentes. Figura 41 – Buzzer. Fonte: (DIGI-KEY CORPORATION, 2011). 6.1.6 MOTOR Um motor de 4,5 V retirado de uma impressora foi utilizado, como visto na figura 42. Ele é controlado pela Shield Dual H-Bridge. Figura 42 – Motor 4,5V. Fonte: (MITSUMI, 2011). 6.1.7 SHIELD MOTOR DUAL H-BRIDGE Essa Shield é responsável por controlar o motor de acordo com as informações que são passadas pelo Arduino. Ela é capaz de controlar até dois motores simultaneamente. Sua aparência pode ser vista na figura 43. 53 Figura 43 – Shield Motor. Fonte: (DFROBOT, 2011). A Shield possui um chip, que pode ser visto na figura 44, que tem como principal função ativar ou desativar o motor. Figura 44 – Chip da Shield Motor (L298N). Fonte: (ROBOKITS, 2011). 6.1.8 PROTOBOARD A Protoboard, também conhecida como breadboard ou matriz de contato, permite a construção de protótipos de circuitos complexos sem a necessidade de solda. Na superfície de uma protoboard existe uma base de plástico com diversos orifícios onde são conectados os componentes, enquanto na parte inferior existem contatos metálicos que interligam eletricamente os componentes inseridos na placa. Geralmente, elas suportam correntes entre 1 A e 3 A (ARDUINO PIAUI, 2010). A figura 45 ilustra uma protoboard básica, com duas fileiras horizontais, sendo uma na parte superior e uma na parte inferior, elas são utilizadas para alimentação e todos os orifícios são ligados horizontalmente, em geral possuem um rótulo indicando a fileira positiva e a negativa. 54 Figura 45 – Protoboard. Fonte: (ELETRONICA DIDATICA, 2011). Existem também duas fileiras de orifícios verticais que são ligados na mesma orientação, de A a E e de F a J, em todas as fileiras, conforme a imagem 46 demonstra como são as ligações internas da protoboard (ARDUINO PIAUI, 2010). Figura 46 – Ligações internas da Protoboard. Fonte: (ELETRONICA DIDATICA, 2011). 6.1.9 FONTE DE ALIMENTAÇÃO Com muitos componentes eletrônicos ligados ao mesmo tempo, o consumo de energia aumentou, tornando a bateria de 9 Volts comum e a alimentação pelo cabo USB insuficientes. Portanto, para suprir esta necessidade, foi utilizada uma fonte universal, mostrada na figura 47, com a possibilidade de alteração da voltagem, entre 1.5 volts até 12 volts. 55 Figura 47 – Fonte de Alimentação Universal. Fonte: (GSM INFORMATICA, 2011). 6.2 DESENVOLVIMENTO Nesta seção são mostrados os passos seguidos na adaptação do jogo base ao projeto, da implementação das novas funcionalidades e de sua montagem. 6.2.1 FUNCIONAMENTO DO JOGO PONG O funcionamento do jogo é simples, o jogador e a Inteligência Artificial devem impedir que a bola toque seu respectivo lado, o que pontua o oponente. Para isso o jogador ou a CPU devem mover as barras laterais (raquetes) para interceptar a bolinha, rebatendo a mesma para a outra extremidade da matriz. A cada ponto marcado o contador aumenta em um ponto, o contador que alcançar três pontos primeiro vence terminando a rodada. Exibindo uma animação de vitória caso os 3 pontos sejam alcançados pelo jogador ou de derrota caso a CPU alcance os 3 pontos. Após o fim da rodada o jogo é iniciado novamente exibindo uma animação do nome Pong exibido letra por letra. Essa animação também é exibida quando o jogo é ligado. 6.2.2 LIGANDO UMA MATRIZ DE LEDS AO ARDUINO 56 Para ligar a Matriz de LEDs ao Arduino, foi utilizado, além do datasheet que acompanha a matriz, o diagrama da figura 46. Nele é possível visualizar de forma menos técnica as referências de linhas e colunas com cada pino da Matriz. Figura 48 – Diagrama para ligação de uma Matriz de LEDs 8x8. Fonte: (OOMLOUT, 2009). A matriz utilizada possibilita a exibição de mais de uma cor por LED, porém para este projeto só seria necessária a exibição de uma única cor e por esse motivo nem todos os pinos da matriz estão ligados ao Arduino. 6.2.3 LIGANDO UM POTENCIÔMETRO AO ARDUINO No potenciômetro, as conexões das extremidades são referentes a alimentação, e devem ser ligadas nas fileiras negativas e positivas da protoboard, ou às entradas GND e 5V do Arduino, respectivamente. A conexão central do potenciômetro serve para a comunicação e deve ser ligada à uma entrada analógica do Arduino. Existem diversos modelos de potenciômetros disponíveis no mercado, porém o modelo escolhido ofereceu uma vantagem técnica pois pode ser utilizado junto de engrenagens. Na figura 49 é possível se observar as ligações do potenciômetro. 57 Figura 49 – Ligação do Potenciômetro ao Arduino. Fonte: (ARDUINO, 2011). Para que o Arduino possa ler o valor do potenciômetro deve ser utilizada a função analogRead() e informando como parâmetro o pino ligado à conexão central do potenciômetro, conforme trecho de código a seguir, (ARDUINO, 2011): int potPin = 2; // Pino conectado ao potenciômetro int val = 0; void setup() { } void loop() { var = analogRead(potPin); // ler o valor do potenciômetro Serial.println(var); // Exibe no console valor lido do potenciômetro } 6.2.4 PRIMEIRO PROTÓTIPO Para a implementação do primeiro protótipo do projeto, mostrado na figura 50, foram implementadas adaptações ao código-fonte disponibilizado pelo Bruno Soares para que funcionasse com os pinos do Arduino utilizados na ligação da Matriz de LEDs e dos potenciômetros. Sua alimentação de dava através do cabo UART conectado na USB do computador. 58 Figura 50 – Primeiro protótipo do Projeto. Fonte: (O Autor, 2011). Com o protótipo funcional, foram iniciadas pesquisas sobre o funcionamento de um Display de sete segmentos, para exibição da pontuação no jogo, de um Buzzer, para a sonorização, do controle de um Motor DC utilizando uma Shield, e para a movimentação da raquete da CPU utilizando uma inteligência artificial. 6.2.5 LIGANDO UM DISPLAY CÁTODO AO ARDUINO Figura 51 – Pinos de um Display de 7 Segmentos. Fonte: (TECNOMELQUE, 2011). No diagrama da figura 49 são mostrados os pinos existentes em um Display Cátodo. Os pinos são ligados ao Arduino em ordem alfabética, onde os pinos de A a G são referentes aos segmentos, e devem ser ligados às entradas digitais do Arduino, e o pino K a alimentação. Caso o display utilizado seja Cátodo, os dois pinos K existentes no display devem ser ligados à fileira negativa da protoboard ou às entradas GND do Arduino, caso seja Anodo, os pinos K devem ser ligados à fileira positiva da protoboard ou à entrada 5V do Arduino (TECNOMELQUE, 2011). 59 Para que sejam exibidos numerais de 0 a 9 no Display Cátodo, uma seqüência de bits deve ser enviada ao Display Cátodo para informar quais segmentos deverão ser acesos ou apagados, conforme a figura 52. Figura 52 – Sequências de bits para exibição de numerais no Display. Fonte: (TECNOMELQUE, 2011). 6.2.6 LIGANDO UM BUZZER AO ARDUINO Para possibilitar o uso de efeitos sonoros no projeto, foi utilizado um Buzzer, descrito na seção 6.1.5. A ligação do Buzzer é bem simples, bastando ligar a conexão negativa do Buzzer à fileira negativa da protoboard, ou a entrada GND do Arduino, e a conexão positiva à uma entrada digital do Arduino, como pode ser observado na figura 53. Figura 53 – Ligação do Buzzer ao Arduino. Fonte: (SUHANKO, 2011). 60 Para que seja emitido qualquer som através do Buzzer, deve-se utilizar a função tone(), informando como parâmetros o pino ligado à conexão positiva do Buzzer, a frequência do som e a duração, conforme demonstrado no trecho de código a seguir, (SUHANKO, 2011): int buzzPin = 2, // Pino conectado ao positivo do buzzer void setup(){ pinMode(buzzPin,OUTPUT); // Declara o pino buzzPin como saída } void loop(){ tone(buzzPin,3100,800); // Toca tom com frequência 3100 por 800 milissegundos delay(1000); // Delay em milissegundos } 6.2.7 LIGANDO A SHIELD E UM MOTOR NO ARDUINO Para ligar a shield de controle e um motor ao Arduino, foi utilizado o diagrama da figura 54. Nele é possível visualizar uma descrição detalhada de cada uma das conexões da shield Motor Dual H-bridge. Para controle do motor são utilizadas as funções analogWrite() e digitalWrite(). A função analogWrite() recebe como parâmetro o pino referente a porta E (E1 ou E2) da Shield, e a velocidade que se deseja para a movimentação do motor, enquanto que a função digitalWrite() recebe como parâmetros o pino referente a porta M (M1 ou M2) as Shields, e o sentido da rotação, HIGH ou LOW (DFROBOT WIKI, 2011). Com estas duas funções é possível mover o motor no sentido e velocidade desejados. O motor é ligado à shield através das conexões positiva e negativas, cada lado da shield possui duas conexões. Para movimentar o motor no sentido correto foi necessário um teste em conjunto com as engrenagens, isso facilitou a calibração. 61 Figura 54 – Diagrama de ligação da Shield Motor no Arduino. Fonte: (DFROBOT WIKI, 2011). 6.2.8 TELAS DO JOGO Por se tratar de um jogo simples, ele possui poucas telas, quatro no total. A primeira delas é a tela de apresentação, mostrada na figura 55, onde é escrito o termo “PONG!”, uma letra por vez, devido à limitação da matriz de LED. Figura 55 – Tela Inicial. Fonte: (O Autor, 2011). A figura 56 mostra a visão do jogo. Nela, a matriz de LED reproduz a bola e as barras verticais são feitas de Lego e presas à barras de ferro. Existem também dois displays de sete segmentos, onde são exibidos os pontos. 62 Figura 56 – Visão do Jogo. Fonte: (O Autor, 2011). As duas últimas telas são: a tela de vitória e de derrota. Caso o jogador humano ganhe, um rosto feliz é apresentado, caso contrário um rosto triste aparece. Ambas as telas são mostradas na figura 57. Figura 57 – Telas de fim de jogo. Fonte: (O Autor, 2011). 6.2.9 INTELIGÊNCIA ARTIFICIAL O algoritmo da inteligência artificial é bem simples, ele apenas se aproxima da bola uma casa por vez, de acordo com a posição dela no eixo Y da matriz. Isso significa que, se a bola estiver acima da raquete da CPU ela decrementa sua posição em um, caso esteja abaixo sua posição é incrementada em um e caso seja igual ela não se move. Ela também não se moverá quando a bola estiver indo em direção ao campo de defesa do jogador, a partir da posição 5 do eixo X da matriz. 63 Sua lógica é semelhante ao Robocode, onde o movimento da bolinha na tela é acompanhado e uma ação é tomada para cada ação realizada pela bolinha. Fazendo com que a maquina se movimente em paralelo. O problema com essa abordagem, é que ela torna a CPU invencível, algo inaceitável em um jogo. Para variar o nível de dificuldade do jogo foi implementado um atraso na movimentação da CPU que influencia em sua velocidade, e a cada gol marcado pelo jogador ele diminui esse atraso e se torna mais rápido fazendo com que o jogo fique mais difícil. Porém uma rotina faz com que a CPU tenha uma movimentação restringida quando o delay esta configurado para 1, tornando ela mais lenta para buscar bolas mais rápidas quando a dificuldade esta alta. 6.3 MONTAGEM O diagrama da figura 58 demonstra a ligação de cada componente à protoboard e ao Arduino adotado neste projeto: Figura 58 – Diagrama das ligações dos componentes no Arduino. Fonte: (O Autor, 2011). 64 A protoboard e os demais componentes foram colocados dentro de uma caixa de madeira, onde foram afixadas três barras de ferro retiradas de uma impressora. Essas barras servem de trilhos para os carros onde ficam os cartuchos da impressora. Esses carros também retirados da impressora, e neles foram presas peças de Lego, que representam as raquetes do jogo. Duas barras de ferro foram usadas para o lado do jogador, uma para prender o carro e outra para a sua sustentação. Uma engrenagem retirada de um drive de CD-ROM foi colada a um dos carros da impressora, para movimentar o potenciômetro quando o carro for movido. A terceira barra é usada no lado da CPU como apoio para o carro, enquanto uma correia, também retirada da impressora, é usada para mover o carro, que fica preso a ela, e girar o potenciômetro através de uma engrenagem. Um motor afixado na caixa e ligado à Shield Dual H-Bridge, que por sua vez é ligada ao Arduino, move a correia, que é sustentada por roldanas. Esse segundo potenciômetro é usado apenas para saber a posição do carro, que é acessada no início do jogo. A figura 59 mostra o projeto final. Figura 59 – Projeto final. Fonte: (O Autor, 2011). Nos apêndices A e B podem ser encontrados o código fonte do projeto e várias fotos das etapas do processo de montagem. 65 6.4 TESTES Durante a etapa de testes foi encontrado um problema relacionado ao funcionamento do jogo Pong em uma Matrix de numero Par (8x8) com raquetes com numero Par de LED. Foi identificado que devido a esta paridade caso a raquete seja colocada em uma posição central o jogo ficaria em Loop até a derrota da CPU ou em alguns casos pode continuar por tempo indeterminado. Isso ocorre pois ao bater na laterais a bolinha sempre percorre a mesma distancia para todos os casos. Para solucionar esse problema seria necessárias uma matriz impar ou barras (raquetes) de numero impar. Na figura 60 é possível se observar o problema em questão. Figura 60 – Falha lógica. Fonte: (O Autor, 2011). Mas como o jogador costuma alternar a posição da aste essa situação foi considerada aceitável, pois isso só ocorre se o lado especifico da aste tocar na bolinha. Pois permitia ao jogador ter uma vantagem imperceptível durante a partida contra a CPU. 66 7 DIFICULDADE ENCONTRADAS Durante o desenvolvimento do projeto, um dos maiores problemas enfrentados foi referente a compra dos equipamentos, pois parte dos hardwares que foram utilizados no projeto foi adquirida no exterior e o tempo para entrega somado ao atraso gerado pela greve dos correios atrapalharam o cumprimento do cronograma. Outro problema enfrentado, foi durante a pesquisa sobre o funcionamento de alguns equipamentos, como por exemplo, a shield para motor. A documentação que acompanhava a shield estava no idioma coreano e após pesquisas utilizando o modelo da shield, foi encontrada documentação em inglês. No início do projeto, também foram enfrentados problemas relacionados aos pinos do Arduino Mega 1280, pois os exemplos disponíveis na internet, em sua maioria, foram desenvolvidos utilizando os modelos Uno e Duelimanove, que possuem pinagem diferente do modelo utilizado no projeto. Estudadas as equivalências dos pinos desses modelos com o Arduino Mega 1280, foram feitas adaptações dos códigos de exemplo e o desenvolvimento se tornou mais simples. No desenvolvimento da jogabilidade da CPU, foram enfrentadas dificuldades em relação a sincronização das partes mecânica e eletrônica do jogo. A ideia de que as raquetes do jogo fossem físicas demandou o uso de engrenagens para girar os potenciômetros, e dado o alto custo dessas engrenagens, elas foram adaptadas de uma impressora multifuncional. Para a movimentação das raquetes do jogo, também foram utilizadas, inicialmente, peças de um drive de CD-ROM. A idéia acabou sendo descartada por limitar o espaço de movimentação da raquete e as peças do driver também foram substituídas pelas peças da multifuncional. 67 8 CONCLUSÃO E TRABALHOS FUTUROS No desenvolvimento deste projeto foi constatado que a linguagem usada pelo Arduino é basicamente C, e que ela não permite orientação a objeto sendo sua lógica estruturada. O funcionamento do Arduino em conjunto com a Shield de motor foi melhor entendido e está intimamente ligado a amperagem disponível na fonte de energia. Foi possível também a compreender o funcionamento de um circuito elétrico fechado, devido a simplicidade e facilidade de desenvolvimento em Arduino. Com a utilização de peças e partes de equipamentos quebrados e inutilizados, foi possível a montagem dos mecanismos usados para mover e fixar os componentes de jogo na caixa. O estudo dos diagramas retirados de sites dos fabricantes, todos disponíveis gratuitamente, de cada componente tornou possível o entendimento de seu funcionamento e o uso para a construção do jogo Pong. 9 TRABALHOS FUTUROS 68 Para os trabalhos futuros referentes a este projeto estão previstas melhorias na estrutura do hardware e das peças usadas no jogo, a impressão de uma placa de circuito impresso (PCB), a implementação de um botão de Liga / Desliga e de um melhor acabamento. É esperado o desenvolvimento de novos trabalhos, como robôs autônomos e utensílios para casas inteligentes com o uso de Shields. Tendo como base os conhecimentos adquiridos com este projeto, como a criação equipamentos autônomos ou controlados por computador. REFERÊNCIA BIBLIOGRÁFICAS 69 ARDUINO SEVERINO. Arduino Single-Sided Serial Board, 2011. Disponível em: <http://www.arduino.cc/en/Main/ArduinoBoardSerialSingleSided3> Acessado em 30 de agosto de 2011. ARDUINO. Entrada analógica, 2011. Disponível em: <http://www.arduino.cc/playground/Portugues/LearningAnalogInput> Acessado em 17 de setembro de 2011. ARDUINO FAQ. Frequently Asked Questions Arduino, 2011. Disponível em: <http://www.arduino.cc/en/Main/FAQ> Acessado em 26 de abril de 2011. ARDUINO LIBRARIES. Writing a Library for Arduino, 2011. Disponível em: <http://www.arduino.cc/en/Hacking/LibraryTutorial> Acessado em 1 de maio de 2011. ARDUINO REFERENCES. Language Reference, 2011. Disponível em: <http://www.arduino.cc/en/Reference/> Acessado em 29 de abril de 2011. ARDUINO HARDWARE. Hardware, 2011. Disponível em: <http://www.arduino.cc/en/Main/Hardware> Acessado em 27 de abril de 2011. ARDUINO PIAUI. Conectando um LED externo ao Arduino, 2010. Disponível em: <http://www.arduinopi.net/2010/12/conectando-um-led-externo-ao-arduino.html> Acessado em 17 de setembro 2011. ARDUINO SHIELDS. Shields, 2011. Disponível em: <http://www.arduino.cc/en/Main/Arduinoshields> Acessado em 4 de maio de 2011. ARDUINO TUTORIAL. Arduino Severino USB/Serial DIY, 2011. Disponível em:<http://arduinotutorial.blogspot.com/> Acessado em 27 de junho de 2011. BAER, Ralph. Video Game History, 2011. Disponível em: <http://www.ralphbaer.com/> Acessado em 15 de agosto de 2011. 70 CLASSICGAMING. História do Jogo Pong, 2011. Disponível em: <http://www.classicgaming.com.br/cgi-bin/vgh/03.asp?IDConsole=4> Acessado em 06 de abril de 2011. DFROBOT WIKI. Arduino Input Shield, 2011 Disponível em: <http://www.dfrobot.com/wiki/index.php? title=Arduino_Input_Shield_(SKU:_DFR0008)> Acessado em 10 de maio de 2011. DA FONSECA, Erika Guimarães Pereira; BEPPU, Mathyan Motta. Apostila Arduino Universidade Federal Fluminense - Centro Tecnológico e Engenharia, Niterói, 2010. Disponível em: <http://www.telecom.uff.br/pet/petws/downloads/tutoriais/arduino/Tut_Arduino.pdf> Acessado em 29 de abril de 2011. DIGI-KEY CORPORATION. Buzzer, 2011. Disponível em: <http://kr.digikey.com/1/5/index15.html> Acessado em: 30 de outubro de 2011. DFROBOT. 2A Dual Motor Controller, 2011. Disponível em: <http://www.dfrobot.com/index.php?route=product/product&path=51&product_id=66> Acessado em: 30 de outubro de 2011. ELETRODEX. Display 7 Segmentos + PT 2,3" Vermelho, 2011. Disponível em: <http://eletrodex.com.br/Produto-7-Segmentos--Matriz-Display-7-Segmentos--PT-23Vermelho-versao-396-955.aspx> Acessado em: 30 de outubro de 2011. ELETRONICA DIDATICA. PROTOBOARD, 2011. Disponível em: <http://eletronicadidatica.com.br/equipamentos/protoboard/protoboard.htm> Acessado em 11 de novembro de 2011. ENVIRONMENT. Arduino Development Environment, 2011. Disponível em: <http://www.arduino.cc/en/Guide/Environment/> Acessado em 7 de maio de 2011. 71 ESTADAO. Nintendo mostra Wii com controle em forma de tablet, 2011. Disponível em: <http://www.estadao.com.br/noticias/impresso,nintendo-mostra-wii-comcontrole-em-forma-de-tablet,729405,0.htm> Acessado em 30 de agosto de 2011. FREEDOMDEFINED. OSHW, 2011. Disponível em: <http://freedomdefined.org/OSHW> Acessado em 30 de abril de 2011. FREEDUINO ORG. About Freeduino, 2011. Disponível em: <http://www.freeduino.org/about.html> Acessado em 27 de junho de 2011. FTDICHIP CABLES. USB TTL Serial Cables, 2011. Disponível em: <http://www.ftdichip.com/Products/Cables/USBTTLSerial.htm> Acessado em 3 de maio de 2011. FTDICHIP ICS. FT232R - USB UART IC, 2011. Disponível em: <http://www.ftdichip.com/Products/ICs/FT232R.htm> Acessado em 3 de maio de 2011. GETSTART. Getting Started w/ Arduino on Windows, 2011. Disponível em: <http://www.arduino.cc/en/Guide/Windows/> Acessado em 2 de maio de 2011. GSM INFORMATICA. Fonte Universal Bivolt VAC 1000MA ST1462P – Smart, 2011. <http://www.gsmi.com.br/index.php?local=7&id=120&pid=423> Acessado em 14 de novembro de 2011. HACKDAY. Oficial Arduino Ethernet Shield, 2011. Disponível em: <http://hackaday.com/2008/11/06/official-arduino-ethernet-shield/> Acessado em 10 de maio de 2011. HOLOSCOPIO. Brasuino Holoscópio, 2011. Disponível em: <http://brasuino.holoscopio.com/> Acessado em 28 de junho de 2011. 72 ITEADSTUDUIO. 60mm square 8x8 LED Matrix - super bright RGB, 2011. Disponível em: <http://iteadstudio.com/store/index.php? main_page=product_info&products_id=189> Acessado em: 30 de outubro de 2011. JBPROJECTS. Wifi Robot, 2008. Disponível em: <http://www.jbprojects.net/projects/wifirobot/> Acessado em 25 de Agosto de 2011. MARGOLIS, Michael – Livro Arduino Cookbook, O’Reilly Media, Inc., 1005 Gravenstein Highway North, Sebastopol, (46 p). Editora O’REILLY, 2011. MICROSOFT. Microsoft anuncia grandes lançamentos para Xbox 360 durante a E3 e surpreende indústria de games, 2011. Disponível em: <http://www.microsoft.com/latam/presspass/brasil/2009/junho/e3.mspx> Acessado em 30 de agosto de 2011. MITSUMI. M36N-1 Series DC Mini-Motors, 2011. Disponível em: <http://www.mitsumi.co.jp/latest/Catalog/compo/motorav/m36n1series_e.html> Acessado em: 11 de novembro de 2011. MULTI COMERCIAL. Potenciômetro 16mm com eixo Estriado, 2011. Disponível em: <http://loja.multcomercial.com.br/ecommerce_site/produto_6473_4689_Potenciometr o-16mm-com-eixo-Estriado> Acessado em: 30 de outubro de 2011. NONUBA. Momento Old School: A história de Pong, 2009. Disponível em: <http://www.nonuba.com.br/exclusivos/curiosidades/934-momento-old-school-ahistoria-de-Pong> Acessado em 07 de abril de 2011. OLD COMPUTERS. Pong, 2011. Disponível em: <http://www.old-computers.com/museum/software_detail.asp?id=315> Acessado em 08 de abril de 2011. OPEN HARDWARE ORG. Open Hardware Definition 1.0 Released, 2011 Disponível em: <http://www.openhardwaresummit.org/2011/02/10/Open-Hardware-definition-10-released/> Acessado em 30 de abril de 2011. 73 OOMLOUT. LED Displays, 2009. Disponível em: <http://oomlout.com/8X8M/8X8MGuide.pdf> Acessado em 17 de setembro 2011. PROCESSING. Processing, 2011. Disponível em: <http://www.processing.org/> Acessado em 6 de maio de 2011. PONGSTORY. Welcome to PONG-Story - The Site of the First Video Game, 2011. Disponível em: <http://www.pong-story.com/intro.htm> Acessado em 15 de agosto de 2011. ROBOKITS. L298 Motor Driver, 2011. Disponível em: <http://robokits.co.in/shop/index.php? main_page=product_info&cPath=14_17&products_id=80> Acessado em: 30 de outubro de 2011. SEEEDSTUDIO. Seeeduino v2.21, 2011 Disponível em: <http://garden.seeedstudio.com/index.php?title=Seeeduino_v2.21#Schematic> Acessado em 27 de junho de 2011. SHIELDLIST. Sparkfun Joystick Shield, 2011. Disponível em: <http://shieldlist.org/sparkfun/joystick> Acessado em 10 de maio de 2011. SHIELDLIST. Arduino Shield List, 2011. Disponível em: <http://www.shieldlist.org/> Acessado em 10 de maio de 2011. SOARES, Bruno. Ping Pong com Matriz de LEDs 8×8, 2009. Disponível em: <http://blog.bsoares.com.br/arduino/ping-pong-with-8x8-led-matrix-on-arduino> Acessado em 17 de setembro de 2011. SUHANKO, Djames. Eletrônica digital com Arduino – Buzzer, parte 1, 2011. Disponível em: <http://suhanko.com/2011/06/26/eletronica-digital-com-arduinobuzzer-parte-1/> Acessado em 19 de setembro de 2011. TECHNOETC. DOTKLOK, 2011. Disponível em: <http://www.technoetc.net/dotklok/> Acessado em 25 de Agosto de 2011. 74 TECNOMELQUE. Arduino dimmer com display de sete segmentos, 2011. Disponível em: <http://tecnomelque.blogspot.com/2011/01/arduino-dimmer-com-display-desete.html> Acessado em 19 de setembro de 2011. TECHNABOB. Arduino Gamepack: Make Your Own Open Source Gameboy , 2011. Disponível em: <http://technabob.com/blog/2008/10/27/arduino-gamepack-make-your-own-opensource-gameboy/> Acessado em 25 de Agosto de 2011. USING-AVR, Using AVR Studio 5, 2011. Disponível em: <http://maxembedded.wordpress.com/2011/06/12/using-avr-studio-5/> Acessado em 31 de agosto de 2011. WIRING, About Wiring, 2011. Disponível em: <http://www.wiring.org.co/> Acessado em 25 de abril de 2011. UFRGS, Instituto de Física UFRGS, 2011, Disponível em: <http://www.if.ufrgs.br/mpef/mef004/20061/Cesar/SENSORES-Potenciometro.html> Acessado em 2 de novembro de 2011 VEJA. Sony lança sensor de movimento para Playstation 3, 2011. Disponível em: <http://veja.abril.com.br/noticia/vida-digital/sony-lanca-sensor-de-movimento-paraplaystation-3> Acessado em 30 de agosto de 2011. VIDEOGAMECONSOLELIBRARY, Magnavox Odyssey, 2011. Disponível em: <http://www.videogameconsolelibrary.com/pg70-odyssey.htm> Acessado em 06 de abril de 2011. VIDEOGAMETRADER, The story behind Pong and Andy Capp’s Tavern, 2011. Disponível em:<http://www.videogametrader.com/2009/03/31/the-story-behind-Pongand-andy-capps-tavern/> Acessado em 07 de abril de 2011. 71 APENDICE A – CÓDIGO FONTE /** * Pong com * * @author * * * * * @version */ Arduino Rafael Pegoraro Soares Diego Leite de Souza Anderson Bisconsin Gabriel Trevisan 1.6b #include "TimerOne.h" // Pinos de controle das barras do jogo #define PIN_LEFT 5 #define PIN_RIGHT 4 // Pino de conbtrole do buzzer #define PIN_BUZZER 36 // Pinos de ligacao do Motor #define PIN_DM 2 #define PIN_AE 3 // Forca do motor #define MOTOR_POWER 215 unsigned int left = 0; unsigned int right = 0; unsigned int motor_pot = 0; //variavel pro potenciometro do motor int angle = 0; // Pinos ligados ao display de 7 segmentos int pts_right[7] = {34, 32, 30, 28, 26, 24, 22}; int pts_left[7] = {35, 33, 31, 29, 27, 25, 23}; // Pinos onde estao ligadas linha e colunas da matriz de LEDs byte rows[8] = {4, 5, 6, 7, 8, 9, 18, 19}; byte cols[8] = {10, 11, 12, 13, 14, 15, 16, 17}; // Referencias a tela do jogo (Matriz de LEDs) byte screen[8] = {0, 0, 0, 0, 0, 0, 0, 0}; volatile byte screenRow = 0; volatile byte screenCol = 0; // Cada byte abaixo corresponde a um numero no display. Desprezando o primeiro 0 cada bit corresponde a um segmento (a,b,c,d,e,f,g) respectivamente. // Bit 1 significa segmento correspondente aceso. Bit 0 significa segmento correspondente apagado // 0 1 2 3 4 5 6 7 8 9 byte numero[10] = {B01111110, B00110000, B01101101, B01111001, B00110011, B01011011, B01011111, B01110000, B01111111, B01111011}; int _angle; // Angulo da direcao da bolinha int _px; // Posicao X int _py; // Posicao Y 72 int _w = 8; // Largura do campo de jogo (7 com a barra e 8 sem) int _h = 7; // Altura do campo de jogo int _wall[] = {3, 3}; // Dimensoes das barras (raquetes) int _count = 0; // Temporizacao para reducao da velocidade da bolinha no jogo int _speed = 3; // Velocidade da bolinha int _countPoints = 0; // Quanto maior o valor mais rapida fica a bolinha int _delay = 0; // Tempo de atraso para o CPU int _maxPoints = 3; // Pontucao maxima do jogo int _level = _maxPoints; // Quanto maior o numero mais facil se for 0 fica invencivel int _playerPts = 0, _cpuPts = 0; void setup() { Timer1.initialize(100); // Seta os 16 pinos usados pela matriz de leds for(int i = 0; i<8; i++){ pinMode(rows[i], OUTPUT); pinMode(cols[i], OUTPUT); } // Seta os 14 pinos utilizados pelos displays catodo for(int i = 0; i<7; i++) { pinMode (pts_right[i], OUTPUT); pinMode (pts_left[i], OUTPUT); } // Seta pino utilizado pelo buzzer pinMode(PIN_BUZZER,OUTPUT); // Seta pino do motor pinMode(PIN_DM, OUTPUT); Timer1.attachInterrupt(doubleBuffer); Serial.begin(9600); } _delay = 0; _level = _maxPoints; _playerPts = 0; _cpuPts = 0; updateScore(); entry(); motor_pot = analogRead(PIN_LEFT); // Posicao inicial do motor motor_pot = constrain(map(motor_pot, 223, 800, 0, 6), 0, 6); left = motor_pot; // Recebe valor do potenciometro reset(); // Escreve na matriz de LEDs void doubleBuffer() { digitalWrite(rows[screenRow], LOW); digitalWrite(cols[screenCol], HIGH); screenCol++; if (screenCol >= 8) { screenCol = 0; screenRow++; if (screenRow >= 8) { screenRow = 0; 73 } } } if((screen[screenRow] >> screenCol) & B1 == B1) { digitalWrite(rows[screenRow], HIGH); digitalWrite(cols[screenCol], LOW); } else { digitalWrite(rows[screenRow], LOW); digitalWrite(cols[screenCol], HIGH); } // Escreve pontuacao no display catodo 7 segmentos void pts_write(int num, int sete_seg[7]) { byte aux; aux = numero[num]; for(int i= 7; i >= 0; i --) // O laco despreza o bit mais significativo { if(bitRead(aux,i )==1) // Le bit a bit { digitalWrite(sete_seg[i] , HIGH); } else { digitalWrite(sete_seg[i] , LOW); } } } // Liga um led na matriz void on(byte row, byte column) { screen[column-1] |= (B1 << (row - 1)); } // Apaga um led na matriz void off(byte row, byte column) { screen[column-1] &= ~(B1 << (row - 1)); } // Calcula as barras (raquetes) do jogo void calcWall() { left = AIwall(); //left = analogRead(PIN_LEFT); // Usado somente para multiplayer motor_pot = analogRead(PIN_LEFT); right = analogRead(PIN_RIGHT); //left = constrain(map(left, 223, 800, 0, 6), 0, 6); // Usado somente para multiplayer right = constrain(map(right, 223, 800, 0, 6), 0, 6); motor_pot = constrain(map(motor_pot, 223, 800, 0, 6), 0, 6); clearWall(); // Para exibir a barra (raquete) do9 lado CPU //on(1, left + 1); //on(1, left + 2); // Para exibir a barra (raquete) do9 lado jogador //on(8, right + 1); 74 //on(8, right + 2); _wall[0] = left; _wall[1] = right; show(); } // Apaga as barras (raquetes) do jogo void clearWall() { for (int i = 0; i < 8; i++) screen[i] &= B01111110; } // Limpa a tela do jogo void clearGame() { for (int i = 0; i < 8; i++) screen[i] &= B10000001; } void loop() { if (_playerPts == _maxPoints) { clearGame(); happyFace(); setup(); } else if (_cpuPts == _maxPoints) { clearGame(); sadFace(); setup(); } } calcWall(); enterFrameHandler(); delay(50); // Motor void runMotor(char direcao) { if (direcao == 'C') // Para cima { digitalWrite(PIN_DM, LOW); // LOW gira o motor pra um lado e HIGH pro outro analogWrite(PIN_AE, MOTOR_POWER); // Seta a potencia do motor } if (direcao == 'B') // Para caixo { digitalWrite(PIN_DM, HIGH); // LOW gira o motor pra um lado e HIGH pro outro analogWrite(PIN_AE, MOTOR_POWER); // Seta a potencia do motor } if (direcao == 'P') // Parar { analogWrite(PIN_AE, 0); // Zera a potencia do motor } } 75 // Campo de jogo void enterFrameHandler() { if (_count++ < _speed) return; } _count = 0; checkCollision(); calcAngleIncrement(); show(); // Seta angulo de retorno da bolinha apos colisao void retorted(int angle) { //Serial.println(angle); _angle = angle; } if (++_countPoints % 5 == 0 && _speed > 1) _speed--; void resetAnim() { for (int i = 0; i < 8; i++) { screen[i] = B11111111; delay(25); } for (int i = 0; i < 8; i++) { screen[i] = B00000000; delay(25); } } void reset() { resetAnim(); _px = random(3, 5); _py = random(3, 5); _angle = random(0, 2) == 0 ? 0 : 180; _speed = 5; _countPoints = 0; } show(); delay(500); void show() { clearGame(); on(_px + 1, _py + 1); } // Verifica se houve colisao da bolinha void checkCollision() { 76 if (_px == _w - 1) // Colisao com player { if (_angle == 315 || _angle == 0 || _angle == 45) { if (_py == _wall[1] || _py == _wall[1] + 1) { play_sound(2); } if (_angle == 0 && retorted(225); else if (_angle == retorted(135); else if (_angle == retorted(135); else if (_angle == retorted(180); else if (_angle == retorted(180); else if (_angle == retorted(225); _py == _wall[1]) 0 && _py == _wall[1] + 1) 45 && _py == _wall[1]) 45 && _py == _wall[1] + 1) 315 && _py == _wall[1]) 315 && _py == _wall[1] + 1) } } else if (_px == 0) // Colisao com CPU { if (_angle == 225 || _angle == 180 || _angle == 135) { if (_py == _wall[0] || _py == _wall[0] + 1) { play_sound(2); if (_angle == 180 && _py == _wall[0]) retorted(315); else if (_angle == 180 && _py == _wall[0] + 1) retorted(45); else if (_angle == 135 && _py == _wall[0]) retorted(45); else if (_angle == 135 && _py == _wall[0] + 1) retorted(0); else if (_angle == 225 && _py == _wall[0]) retorted(0); else if (_angle == 225 && _py == _wall[0] + 1) retorted(315); } } } if (_px == _w) // Bolinha passou pelo player { _delay = 0; _cpuPts++; play_sound(4); updateScore(); reset(); } else if (_px == -1) // Bolinha passou pelo CPU { _delay = 0; _playerPts++; play_sound(3); updateScore(); 77 _level--; reset(); } else if (_py == _h) // Colisao com lateral { if (_angle == 45) { play_sound(1); _angle = 315; } else if (_angle == 135) { play_sound(1); _angle = 225; } } else if (_py == 0) // Colisao com lateral { if (_angle == 225) { play_sound(1); _angle = 135; } else if (_angle == 315) { play_sound(1); _angle = 45; } } } // Movimentacao da bolinha void calcAngleIncrement() { if (_angle == 0 || _angle == 360) { _px += 1; } else if (_angle == 45) { _px += 1; _py += 1; } else if (_angle == 135) { _px -= 1; _py += 1; } else if (_angle == 180) { _px -= 1; } else if (_angle == 225) { _px -= 1; _py -= 1; } else if (_angle == 315) { _px += 1; _py -= 1; 78 } } // Inteligencia do CPU int AIwall() { runMotor('P'); // Para o motor int result = left; if (_px < 4) // Se a posicao do eixo X for menor que 4, anda (px distancia) { if (_delay == 0) // Quando delay for 0 { if (left == _py) // Se estiver na mesma posicao da bola nao se move (py = altura) result = _py; else if (left < _py) // Se for menor, move para baixo { result = left +1; runMotor('B'); // Move para baixo } else // Se for maior, move para cima { result = left -1; runMotor('C'); // Move para cima } _delay ++; // Incrementa o delay } else if (_delay == _level) // Se o delay for igual ao level, zera ele para andar _delay = 0; else // Senao, incrementa o delay _delay++; } if (result == 7) // Condicao para nao ultrapassar o tamanho da matriz result --; } return result; // Atualizacao do placar void updateScore() { pts_write(_playerPts, pts_right); pts_write(_cpuPts, pts_left); } // Sons executados durante o jogo void play_sound(int soundType) { // Colisao com laterais if (soundType == 1) { tone(PIN_BUZZER,180,100); } // Colisao com players else if (soundType == 2) { tone(PIN_BUZZER,500,100); 79 } // Ponto para o player else if (soundType == 3) { tone(PIN_BUZZER,1600,100); } // Ponto para CPU else if (soundType == 4) { tone(PIN_BUZZER,100,100); } } // Som executado quando o player vence void winnerSound() { tone(PIN_BUZZER,1300,200); delay(200); tone(PIN_BUZZER,1050,200); delay(200); tone(PIN_BUZZER,1200,200); delay(200); tone(PIN_BUZZER,800,200); } // Som executado quando o player perde void loserSound() { tone(PIN_BUZZER,1500,200); tone(PIN_BUZZER,100,200); delay(200); tone(PIN_BUZZER,300,200); delay(200); tone(PIN_BUZZER,150,200); } // Animacao inicial do jogo void entry() { allOFF(); delay(1000); // P on(2, 2); on(2, 3); on(2, on(2, 6); on(2, 7); on(3, on(4, 2); on(4, 5); on(5, on(6, 2); on(6, 5); on(7, delay(500); allOFF(); // O on(2, 3); on(2, 4); on(2, on(3, 2); on(3, 7); on(4, on(5, 2); on(5, 7); on(6, on(7, 3); on(7, 4); on(7, delay(500); allOFF(); // N on(2, 2); on(2, 3); on(2, on(2, 6); on(2, 7); on(3, on(5, 5); on(6, 6); on(7, on(7, 4); on(7, 5); on(7, delay(500); 4); 2); 2); 3); on(2, on(3, on(5, on(7, 5); 5); 5); 4); 5); 2); 2); 5); on(2, on(4, on(6, on(7, 6); 7); 7); 6); 4); 3); 2); 6); on(2, on(4, on(7, on(7, 5); 4); 3); 7); 80 allOFF(); // G on(2, 3); on(2, on(3, 2); on(3, on(5, 2); on(5, on(6, 7); on(7, delay(400); allOFF(); // Exclamation on(4, 2); on(4, on(5, 2); on(5, delay(800); allOFF(); 4); 7); 7); 5); on(2, on(4, on(6, on(7, 5); on(2, 6); 2); on(4, 7); 2); on(6, 5); 6); 3); on(4, 4); on(4, 6); on(4, 7); 3); on(5, 4); on(5, 6); on(5, 7); } // Apaga todos os leds da matriz void allOFF() { for (int col = 0; col < 8; col++) { for (int row = 0; row < 8; row++) { screen[col] &= ~(B1<<(row)); } } } // Liga todos os leds da matriz void allON() { for (int col = 0; col < 8; col++) { for (int row = 0; row < 8; row++) { screen[col] |= (B1<<(row)); } } } void happyFace() { winnerSound(); on(1, 1); on(1, 2); on(2, 1); on(2, 2); on(7, 1); on(7, 2); on(8, 1); on(8, 2); on(1, 1); on(1, 2); on(4, 4); on(4, 5); on(5, 4); on(5, 5); on(2, 7); on(7, 7); on(3, 8); on(4, 8); on(5, 8); on(6, 8); delay(5000); 81 } void sadFace() { loserSound(); on(1, 1); on(1, 2); on(2, 1); on(2, 2); on(7, 1); on(7, 2); on(8, 1); on(8, 2); on(1, 1); on(1, 2); on(4, 4); on(4, 5); on(5, 4); on(5, 5); on(2, 8); on(7, 8); on(3, 7); on(4, 7); on(5, 7); on(6, 7); delay(5000); } 81 APENDICE B – IMAGENS DO PROCESSO DE MONTAGEM A seguir serão mostrados todos os passos necessários para a construção do projeto. Foi desmontada uma impressora multifuncional da HP (Figura 1) para o reaproveitamento de algumas peças. Figura 1 – Impressora Multifuncional da HP. O carro onde são encaixados os cartuchos de tinta, as engrenagens e peças de fixação do mecanismo de impressão, exibidos na figura 2, foram removidos. Figura 2 – Impressora aberta e engrenagens do mecanismo de impressão. 82 O motor, responsável pela movimentação da cabeça de impressão, e o trilho que o sustenta também foram retirados da impressora, conforme exibido na figura 3. O motor foi testado no Arduino para verificar o seu funcionamento em conjunto com a Shield de controle com o chip L298n. Figura 3 – Motor e barras de sustentação do mecanismo de impressão. Com o motor funcionando, foram feitos diversos furos na caixa que abrigaria o jogo, apresentada na figura 4. Figura 4 – Caixa que abriga o jogo. 83 Todos os furos foram feitos levando em consideração a posição necessária para o funcionamento correto dos mecanismos que seriam colocados dentro dela. As figuras 5 e 6, exibem o lado da CPU e a forma como foram afixadas o motor, uma peça de metal e as roldanas. Todas removidas da impressora. Figura 5 – Motor e roldana afixados na caixa. Figura 6 – Disposição das penas da impressora na caixa. 84 As barras de ferro, que sustentavam o mecanismo de impressão, foram serradas as meio e inseridas na caixa através de furos, conforme demonstrado na figura 7. Figura 7 – Furações necessárias para a afixação das peças. No lado da CPU, um potenciômetro foi fixado na caixa com o uso de uma peça de metal retirada da impressora e moldada para esta finalidade, conforme mostra a figura 8. Figura 8 – Potenciômetro fixado à uma peça de metal retirada da impressora. 85 No lado do jogador também foi fixado um potenciômetro à caixa, porém usando uma peça retirada de um drive de CD-ROM, conforme mostra a figura 9. Figura 9 – Potenciômetro fixado à uma peça de metal retirada da impressora. Em ambos os lados, foi afixada uma engrenagem ao potenciômetro possibilitando a rotação deste por outra peça. Também foi adaptada uma peça do carro de impressão para que esta movesse o potenciômetro através de um conjunto de roldanas e engrenagens. Na figura 10, é exibida a peça final resultante da colagem de um pedaço da gaveta de um drive de CD-ROM à uma parte do mecanismo de impressão. Figura 10 – Pedaço da gaveta de um drive de CD-ROM colada à uma peça do mecanismo de impressão. 86 A peça, retirada do drive de CD-ROM e da impressora, adaptada foi colocada em seu respectivo suporte, no lado do jogador, conforme mostrado na figura 11. Figura 11 – Peça adaptada de um drive de CD-ROM e de uma impressora afixada ao suporte. O lado da CPU também foi montado e afixado ao suporte feito com as barras de ferro do mecanismo de impressão, conforme mostrado na figura 12. Figura 12 – Peças do lado da CPU afixadas ao suporte. 87 Depois de afixar todas as partes mecânicas à caixa, foi colocada a parte eletrônica, montada em uma protoboard e ligada à uma Shield e ao Arduino, conforme mostra a figura 12. Figura 12 – Visão do lado do jogador. Também foram ligados os potenciômetros à protoboard, deixando os carros de ambos os lados, CPU e jogador, ligados ao sistema. Peças de Lego foram utilizadas para representar as raquetes do jogo, conforme mostra a figura 13. Figura 13 – Peças de Lego usadas para representar as raquetes do jogo. 88 Na figura 14, é possível visualizar o mecanismo de controle construído para o lado da CPU a partir de peças removidas de uma impressora multifuncional. Figura 14 – Visão do mecanismo de jogo do lado da CPU. Na figura 15, é exibido o mecanismo de controle do lado do jogador, construído a partir de peças removidas de uma impressora multifuncional e de um drive de CD-ROM. Figura 15 – Visão do mecanismo de jogo do lado do jogador. 89 Com todas as partes, mecânica e eletrônica, posicionadas dentro da caixa, conforme exibido na figura 16, o projeto sofreu testes e uma série de ajustes para o melhor funcionamento. Todo o conjunto foi alimentado utilizando uma fonte genérica com possibilidade de alteração de voltagem, ligada em 9 volts. Figura 16 – Projeto em sua versão final. 90 APENDICE C – COMPARAÇÃO ENTRE MODELOS