Introdução ao ArdUÍno Introdução ao ArduÍno Índice Sobre o Grupo Introdução A placa Protoboard Projeto 0: “Hello World” Estrutura de um Código Projeto 1: Piscar LED Projeto 2: Push-Button Sinais Analogicos (PWM) Projeto 3: PWM com Motor DC Projeto 4: Servomotores Entradas Analógicas e Sensores Projeto 5: Sensores Projeto 6: Mandando e recebendo Strings Extra: Orientação a Objeto Grupo de estudos em RobÓtica Introdução ao ArduÍno Sobre o Grupo Criado em 2009 dentro do Ramo Estudantil IEEE, o GER, Grupo de Estudos em Robótica, é uma equipe de robótica autônoma da Faculdade de Engenharia Mecânica da Unicamp. Atualmente o GER conta com 26 membros ativos, alunos da Engenharia de Controle e Automação, Engenharia Elétrica, Ciência e Engenharia da Computação. O principal objetivo do GER é promover o estudo e aprendizado entre seus membros, em aréas relacionadas à robótica, o grupo estuda assuntos como: aplicação de técnicas de controle, processamento de imagem, visão computacional, simulação, sistemas multi-agente, entre outros. O GER participa de competições de robótica e simulação, são elas: Competição Brasileira de Robótica: nas categorias IEEE VSSS (Very Small Soccer Size) e IEEE SEK (Standard Educational Kit) The Freescale Cup: competição de robôs seguidores de pista. Torneio Juvenil de Robótica: na categoria Sumô Robocode: competição de simulação de guerra de robôs. O GER foi campeão em 2014! Além das competições, existem também projetos paralelos, como o desenvolvimento de um Drone e outros projetos pequenos de robótica e automação. Grupo de estudos em RobÓtica Introdução ao ArduÍno Introdução O que é? Arduíno é uma plataforma open-source de desenvolvimento que consiste em uma placa com microcontrolador e uma IDE (Integrated Development Environment), o software que permite ao usuário desenvolver o código usado pela placa. O grande diferencial do Arduíno é permitir a programação de um micro controlador usando uma linguagem de alto nível, possibilitando que iniciantes e leigos em eletrônica e programação possam desenvolver projetos relativamente complexos. História O projeto iniciou-se na cidade de Ivrea, Itália, em 2005, mais especificamente no Interaction Design Institute Ivrea. A equipe de fundadores era composta por Hernando Barragan, Massimo Banzi, David Cuartielles, Dave Mellis, Gianluca Marino, e Nicholas Zambetti. Na época, os estudantes do instituto utilizavam sistemas de prototipagem considerados caros. Como alternativa a isso, surgiu o Arduíno. Tal nome veio de um bar em Ivrea, onde alguns dos fundadores do projeto se encontravam. Seu sucesso foi sinalizado com o recebimento de uma menção honrosa na categoria Comunidades Digitais em 2006, pela Prix Ars Electronica, além da marca de mais de 50.000 placas vendidas até outubro de 2008. Comunidade A comunidade que estuda e utiliza Arduíno é bem numerosa e acessível. É possível encontrar uma grande variedade de projetos e tutoriais através de sites, fóruns online e livros. No próprio site do Arduíno existem tutoriais que mostram diversas funcionalidades da placa e como desenvolver projetos com ela. (https://www.Arduíno.cc/en/Tutorial/HomePage) Além disso, com o Arduíno, também é possível utilizar vários tipos de sensores e shields (placas de expansão de hardware) de maneira rápida e simples. Esses dispositivos são extremamente úteis em diversas aplicações eletrônicas. Grupo de estudos em RobÓtica Introdução ao ArduÍno Exemplos Devido a sua grande comunidade o Arduíno se tornou extremamente popular nos circulos DIY (Do it yourself), vários exemplos de projetos podem ser encontrados na internet: Um exemplo clássico da robótica é o robô seguidor de linha, que utilizando sensores de luz consegue percorrer uma pista desenhada no chão. Um projeto desse tipo utilizando Arduíno pode ser visto em http://goo.gl/ePkyDJ. O Arduíno também pode ser utilizado em projetos mais complexos, como para transformar uma bateria utilizada em games (como Guitar Hero) em uma bateria eletrônica comum. (Veja o projeto em http://goo.gl/5kZAXK). Além disso, existem outros projetos interessantes como um braço robótico controlado via Bluetooth (http://goo.gl/jIhZCc) ou até um quadricóptero (http://goo.gl/zSHlyF). Assim, há uma grande variedade de projetos divertidos e úteis que podem de ser trabalhados com Arduíno. Cada um tem seu nível de complexidade e muitos não são tão fáceis de serem desenvolvidos. Mas o que não se pode negar é que o Arduíno é uma plataforma acessível e poderosa. Sites com tutoriais de projetos com Arduíno (em inglês): http://playground.Arduíno.cc/Projects/Ideas www.instructables.com/id/Arduíno-Projects http://duino4projects.com Grupo de estudos em RobÓtica Introdução ao ArduÍno A placa Existem diferentes modelos de placas que utilizam a plataforma Arduíno, para este curso utilizaremos o Arduíno Uno, modelo mais simples de básico. Especificações Microcontrolador: ATmega328 Tensão de operação: 5V Tensão de Entrada (recomendado): 7-12V Tensão de Entrada (limites): 6-20V Pinos digitais I/O: 14 (6 tem suporte a PWM) Entradas Analógicas: 6 Corrente nos pinos digitais: 40 mA Flash Memory: 32 KB (ATmega328) SRAM: 2 KB Clock: 16 MHz O que um iniciante precisa saber dessas informações? Que ele não deve conectar o arduino a uma fonte maior que 12V. Um computador já estabelece automaticamente uma tensão segura para a placa a partir do USB, mas cuidado ao conectá-la a uma bateria ou tomada pela entrada de energia, sempre cheque sua voltagem. Tensões maiores podem danificar a placa e o computador em que ela está conectada. Pinos analógicos trabalham com tensões que variam de 0V até 5V. Pinos digitais trabalham com o valor de 0V (desligado) ou 5V (ligado). Você aprenderá a programar a placa de modo que o pino escolhido exerça a tensão desejada para realizar uma tarefa (como os exercícios propostos a neste guia). Preste atenção na corrente, se você colocou 5V no pino, certifique-se que seu circuito tem uma resistência equivalente de pelo menos 125 ohm (comprove por ). Grupo de estudos em RobÓtica Introdução ao ArduÍno Portas Esteja atento a esta imagem para realizar os exercícios propostos. Perceba no canto esquerdo inferior os pinos analógicos (A0 até A5) e no canto direito os pinos digitais (1 até 12). Cada um tem um respectivo número, o qual você irá se referir em seu código para ativar aquele determinado pino. No canto esquerdo superior têm-se os pinos de tensão fixa (GND é o pino conectado ao terra, ou seja, 0V). Referências: https://www.arduino.cc/en/Main/arduinoBoardUno Entradas Analógicas e Sensores Grupo de estudos em RobÓtica Introdução ao ArduÍno Protoboard Antes de começar a programar a placa, é necessário aprender a usar uma ferramenta extremamente util na prototipagem de circuitos: a Protoboard. A protoboard é uma placa com vários furos para fazer conexões entre componentes de um circuito elétrico, sendo, normalmente, usada para fazer testes com circuitos pequenos devido à grande facilidade de manuseio. O modelo utilizado pode ser visualizado na imagem abaixo. A placa é espelhada e tem duas partes: a central, para conexões entre os componentes elétricos, e a periférica, geralmente usada para conectar a alimentação e a terra. Na parte central os furos das colunas são conectados entre si, mas não se conectam com outras linhas. Já na parte periférica os furos das linhas são conectados entre si e não se conectam com os furos das colunas. Como pode ser visto na imagem abaixo. Para conectar um resistor, por exemplo, basta colocar os seus dois terminais em colunas diferentes. Se uma ligação de dois resistores em série for necessária, basta conectar os terminais de um resistor em colunas diferentes e os terminais do outros resistor em uma das colunas já utilizadas e em outra livre. No caso de uma ligação em paralelo, é necessário ligar as pontas de cada resistor nas mesmas colunas. Uma imagem exemplificando as conexões pode ser vista a seguir. Grupo de estudos em RobÓtica Introdução ao ArduÍno Projeto 0: Hello World Façamos um pequeno projeto para exercitar o uso da Protoboard e se familiarizar com algumas das portas do Arduíno. Usaremos as portas de 5V e GND do Arduíno para acender um LED. Estas portas estão localizadas perto da região denominada Power. Temos as seguintes portas: 5V : Fornece um sinal constante de 5V 3.3V : Fornece um sinal constante de 3,3V GND : Fornece um sinal constante de 0V (sinal baixo) Vin : Usada para alimentar o Arduíno Reset : Usado para resetar o Arduíno de forma externa IORef : Fornece a tensão correspondente ao Input/Ouput digital da placa, no caso do Arduíno Uno 5V. Primeiramente, certifique-se que o Arduíno esteja desligado (desconectado do computador e com nenhum dos seus LEDs acessos), neste projeto especifico isto não fará muita diferença, mas é uma boa pratica (por motivos de segurança) sempre desligar o Arduíno quando for alterar o seu circuito. Agora, faça o circuito conforme a figura abaixo, e depois, ligue o Arduíno na porta USB do seu computador. Não esqueça de colocar o resistor, caso contrário o LED pode queimar. Grupo de estudos em RobÓtica Introdução ao ArduÍno Caso o LED não acenda, certifique-se ele esta corretamente conectado. O LED, Light Emitting Diode, como o próprio nome já diz, é um diodo, ou seja, possui uma polaridade correta. Você deve conectar a alimentação do seu circuito (5V) ao ânodo do LED (caracterizado pela perna maior) e o terra do circuito (GND) ao catódo do LED. Desafio Adicional: Usando apenas duas portas do Arduíno (5V e GND), conecte dois LEDs em série, em paralelo com outros dois LEDs em série. Tente fazer este desafio com apenas dois resistores e três jumpers. Grupo de estudos em RobÓtica Introdução ao ArduÍno Estrutura básica de um código Uma das facilidades propostas pelo Arduíno é uma IDE simples e fácil de usar. Ela possui vários exemplos prontos de código, um monitor serial e uma ferramenta que simplifica a adição de novas bibliotecas. Antes de começarmos a programar é necessário que nos certifiquemos que a IDE esta devidamente configurada para a nossa placa e para a entrada USB que estamos utilizando. Para isso vá em: Tools > Board e se certifique de que a opção Arduino Uno esteja selecionada. Depois vá em Tools > Serial Port e se certifique de que a porta correta está selecionada (depende do seu computador). Agora podemos começar a programar. Provavelmente o maior atrativo do Arduíno é que ele permite a programação de um micro-controlador com linguagem de alto nível. Neste caso, utilizaremos C++ com uma série de bibliotecas prontas oferecidas. Mais adiante, iremos abordar um pouco a questão de Orientação a Objeto em um projeto do Arduíno. Grupo de estudos em RobÓtica Introdução ao ArduÍno Um código usado no Arduíno possui uma estrutura básica que sempre deve ser seguida. Basicamente, todo código deve possuir duas funções: void setup() : Esta função é chamada apenas uma vez, no inicio da execução do código, ela deve ser usada para setar qualquer componente ou váriavel do código, analogamente à um método construtor de uma classe. Obs: A função pode ser chamada pelo usuário posteriormente porém isto não é uma boa prática, por convenção a função setup() só deve ser usada para inicialização. void loop() : Após a função setup(), o código irá chamar esta função loop ad infinitum. É interessante frisar que projetos de eletrônica e robótica normalmente funcionam em cima de um loop infinito como é o caso do Arduíno. Esta função é analóga a função main() de um código em C. Temos aqui um exemplo de código, no proximo projeto explicaremos o que cada uma dessas funções aqui usadas faz. Este código especifico é um dos exemplos que podem ser acessados na IDE em File > Examples. Grupo de estudos em RobÓtica Introdução ao ArduÍno Projeto 1: Piscar LED Iremos escrever um código básico para fazer com que dois LEDs pisquem alternadamente, ou seja, quando um liga o outro desliga. O circuito para este projeto está na imagem a seguir: Utilizamos os pinos digitais 10 e 6. O Arduíno Uno possui 14 pinos que podem ser usados como saídas digitais, eles podem ser usados para emitir um sinal de 5V (HIGH) ou de aproximadamente 0V (LOW). Perceba que alguns pinos possuem um ~ ao lado do número, isto será abordado mais tarde. Além disso os pinos 0 e 1 possuem ao seu lado as palavras RXD e TXD, isto é utilizado para comunicações com o protocolo serial, isto não será abordado neste curso porém tente não utilizar estas portas. Grupo de estudos em RobÓtica Introdução ao ArduÍno Este é o código utilizado: Neste código utilizamos três funções importantes, são elas: pinMode(ledPin, OUTPUT) : Define o pino ledPin, no caso do exemplo os pinos 6 e 10, como OUTPUT (saida) digitalWrite(ledPin, HIGH/LOW) : Manda um valor alto ou baixo para uma saída digital. delay(1000) : Pausa a execução do código, nesse caso a pausa dura 1000ms Desafio Adicional: Escreva um código que faça um LED piscar com diferentes frequências de forma iterativa, ou seja, o LED começa a piscar lentamente, aumenta a frequência gradualmente (até que o usuário não consiga perceber que está piscando) e diminua a frequência até a frequência inicial. Desafio Adicional++: Escreva um código que faça dois LEDs piscarem com diferentes frequências de forma iterativa e alternada, ou seja, um Led começa a piscar lentamente, aumenta a frequência gradualmente (até que o usuário não consiga perceber que está piscando) e diminua a frequência até o estado inicial, o outro LED faz o contrário, começa a piscar de forma rápida e diminui a frequência até ficar constantemente ligado, depois volta a aumentar até a frequência inicial. Grupo de estudos em RobÓtica Introdução ao ArduÍno Projeto 2: Push-Button No projeto anterior usamos as portas digitais para emitir um sinal para o nosso circuito, agora iremos emitir um sinal do nosso circuito para o Arduíno. Para que possamos observar o uso de entradas digitais, iremos usar um push-button. Este componente possui um funcionamento bem simples, quando apertado ele fecha uma chave, criando um curto entre dois circuitos isolados, possibilitando que o nosso circuito interaja diretamente com o usuário. Neste projeto iremos usar um pushbutton para ligar um LED quando apertado uma vez, e desliga-lo quando apertado mais uma vez. Este é o circuito do projeto, perceba que para se utilizar o push-button devemos usar um resistor, isto se deve ao fato de que o botão possui uma pequena resistência interna (bem menor que a do resistor), logo quando apertarmos o botão um curto será criado e a corrente irá deixar de ir para o nosso Arduíno. Grupo de estudos em RobÓtica Introdução ao ArduÍno Este é o código do projeto: Desafio Adicional: Inicialmente faça o LED piscar como nos ultimos projetos, depois faça com que cada vez que o usuário apertar o botão a frequência fique mais rápida, quando ela atingir seu valor máximo, faça com que cada “aperto” do botão diminua a frequência. Não esqueça que a frequencia só deve mudar após o usuário ter soltado o botão. Grupo de estudos em RobÓtica Introdução ao ArduÍno Sinais Analógicos: PWM Até agora, todos os projetos lidaram somente com valores digitais, 0V (falso) e 5V (verdadeiro), porém em várias aplicações precisamos trabalhar com um intervalo maior de possiveis valores, para isso precisamos trabalhar com Sinais Analógicos, a imagem abaixo mostra a diferença entre os sinais. Observe que o sinal digital (azul) só admite dois valores, enquanto o sinal analógico (vermelho) permite um número muito maior de valores. O quão preciso são os valores do sinal analógico depende do seu hardware e software. No caso do Arduíno as saídas possuem uma precisão de 8 bits [0,255], enquanto as entradas posuem uma precisão de 10 bits [0,1023]. Porém o Arduíno não possui como emitir sinais verdadeiramente analógicos, porém seus componentes permitem o uso de PWM para sanar este problema. Pulse Width Modulation consiste em mandar vários sinais digitais, com diferentes larguras de banda em uma frequencia relativamente alta, de forma que o valor médio do sinal em um dado instante se assemelha a um sinal analógico. A imagem abaixo ilustra o PWM. Grupo de estudos em RobÓtica Introdução ao ArduÍno Projeto 3: PWM com Motor DC Iremos demonstrar o funcionamento de mais um simples, porém muito útil, componente, o Motor DC. Com apenas dois terminais, o motor permite uma integração de um sistema elétrico com um sistema mecânico. Neste projeto, iremos alterar a intensidade de rotação do motor de forma iterativa. Os motores utilizados neste curso possuem uma tensão muito baixa, logo não há nenhum risco para o Arduíno, porém lembre-se sempre: Todo motor é também um gerador, portanto é recomendado que se coloque um diodo em série com o motor, pois depois que ele for desligado, devido a inércia, ele continuará girando, criando assim uma tensão que pode danificar o seu Arduíno. Este é o circuito do projeto, observe que diferente do LED, o motor não possui uma polaridade correta, porém caso troquemos as portas de seus terminais podemos observar que o sentido de rotação do motor irá se inverter. Também observe que o motor esta ligado em uma porta com o símbolo „~‟ escrito ao lado de seu número, isto denota que a porta é capaz de emitir um sinal PWM, o Arduíno Uno possui 6 portas com esta capacidade (3,5,6,9,10,11). Grupo de estudos em RobÓtica Introdução ao ArduÍno O código do projeto não apresenta grandes complicações, porém existe uma função nova que ainda não utilizamos. analogWrite(motorPin, i) : Envia um valor „i' para uma saída digital com suporte a PWM. O valor está contido no intervalo [0,255]. Desafio Adicional: Use um push button para alterar a intensidade de rotação do motor, quanto mais tempo se aperta o botão mais rápido o motor gira. Ao soltar o botão a potência do motor cai gradativamente. Grupo de estudos em RobÓtica Introdução ao ArduÍno Projeto 4: Servomotores Como discutido anteriormente, o Arduíno possui uma série de bibliotecas prontas que facilitam o uso de certos componentes que normalmente necessitam de um grande volume de código. Isto aliado à Programação Orientada a Objeto facilita bastante o desenvolvimento de projetos com poucas linhas de código. Isto é ilustrado com o uso de um Servomotor. Um componente que também faz a ponte entre um sistema elétrico e um sistema mecânico, porém com uma maior precisão. Enquanto o motor DC permite que mudemos a intensidade de rotação, o servomotor permite que giremos um ângulo já definido. Neste projeto iremos alterar o ângulo de rotação de um servo de maneira iterativa. Segue o circuito do projeto, note que o servo possui três fios, são eles: VCC: Fio vermelho, usado para alimentar o servo. GND: Fio preto ou marrom, é o terra do servo Signal: Fio normalmente amarelo, é o que iremos usar para mandar o sinal para o servo, note que o sinal deve ser mandado por uma porta com suporte a PWM. Grupo de estudos em RobÓtica Introdução ao ArduÍno Segue adiante o código utilizado no projeto. Existe uma série de diferenças deste código com o código anterior: Primeiramente, note que utilizamos uma outra biblioteca: Servo.h, ela é uma das bibliotecas já inclusas por default na IDE, ela facilita o uso de servosmotores devido a classe Servo. Instanciamos um objeto desta classe e utilizamos métodos que diminuem consideravelmente o volume de código, os métodos são: servo.attach() : método inicializador do Servo servo.write(int a) : rotaciona o servo em um ângulo "a", contido no intervalo [0,180] Desafio Adicional: Use o push button para girar um ângulo fixo do servo (15º) de maneira suave. Quando ele chegar no seu limite (180}), ele deve girar no sentido oposto, ou seja, -15º a cada aperto do botão. Grupo de estudos em RobÓtica Introdução ao ArduÍno Entradas Analógicas e Sensores Já aprendemos a mandar um sinal analógico para nosso circuito, veremos agora que o inverso é tão simples quanto. O Arduíno possui 6 entradas analógicas, na parte da placa denotada por Analog In. Como já citado anteriormente, a entrada analógica tem uma precisão de 10 bits, ou seja, assume valores no intervalo [0,1023]. Para que possamos estudar as entradas analógicas iremos usar sensores, componentes que permitem que recolhamos informação do meio que o nosso sistema está inserido e transformar estas informações em dados. Para os nossos proximos projetos iremos usar três componentes diferentes: Potênciometro: Não é um sensor propriamente dito, e sim um resistor com resistência variavél. LDR: Um resistor cuja resistência se altera dependendo da luminosidade Sonar: Sensor que detecta barreiras fisicas na sua frente, não iremos usar uma entrada analógica. Grupo de estudos em RobÓtica Introdução ao ArduÍno Projeto 5: Sensores Para este projeto iremos utilizar o LDR e o Potenciômetro, para alterar a intensidade da luz de um LED, caso queira troque o LED pelo motor DC. Segue o circuito usado no projeto. Observe que tanto o LDR quanto o Potenciômetro, estão ligados a uma fonte de 5V, isto se dá porque ambos são sensores resistivos que não deixam de ser divisores de tensão, a tensão lida pelas portas do Arduíno é alterada dependendo da resistência de cada componente. O diagrama a seguir ilustra de forma melhor o funcionamento dessa configuração de sensores e resistores: Grupo de estudos em RobÓtica Introdução ao ArduÍno O código deste projeto não é complexo: A única função nova que estamos usando é: analogRead(int a): Retorna o valor lido pela porta analógica, este valor está contido no intervalo [0,1023]. Observe que ao passar o valor lido pelo sensor para os LEDs, devemos dividir o valor por 4 para “converter” o para 8 bits, perdemos um pouco de precisão mas para fins didáticos isto não causa nenhum tipo de problema ao projeto. Grupo de estudos em RobÓtica Introdução ao ArduÍno Projeto 6: Mandando e Recebendo Strings O Arduíno permite o uso de comunicação serial pela sua porta USB. Além disso, métodos de classe da linguagem e o monitor serial da internet facilitam o processo de mandar e receber dados do Arduíno para outros sistemas, como por exemplo um computador. Neste projeto iremos usar comunicação Serial para “ligar” um sonar e ler quantos centimetros estão sendo lidos pelo sensor. O circuito é extremamente simples, note que o sensor possui 4 terminais, são eles: VCC : Alimentação GND : Terra Echo : Sinal que iremos mandar para o sensor Trig : Sinal que iremos ler do sensor O código do projeto é relativamente diferente do que fizemos anteriormente, porém ainda é relativamente simples. Para facilitar o projeto iremos usar uma nova biblioteca Ultrasonic.h, ela deve estar junto com o arquivo desta apostila, caso contrário você pode baixa-la neste link. Para adicionar a biblioteca vá ,na IDE, em Sketch > Import Library > Add Library..., selecione o arquivo .zip. Depois vá em Sketch > Import Library > Ultrasonic. Grupo de estudos em RobÓtica Introdução ao ArduÍno Com a biblioteca adicionada, podemos escrever o nosso código: Este código apresenta uma série de conceitos novos, são eles: ultrasonic(11,10) : Assim como instanciamos, agora iremos instanciar um objeto da classe Ultrasonic. Serial.begin(9600) : Metódo de classe, da classe estática Serial, tal classe possibilita o uso do monitor serial da IDE, este método inicializa a comunicação com um baud-rate de 9600 String input = “” : Criamos um objeto da classe string para facilitar a leitura de caractéres Serial.available() : Retorna true se o buffer do serial possuir um caractér esperando para ser lido. Grupo de estudos em RobÓtica Introdução ao ArduÍno Serial.read() : Lê um caractér do serial, note que precisamos fazer um type casting para char, pois o método retorna um byte. Serial.print : Manda uma cadeia de caractéres para ser impressa no nosso terminal. Desafio Adicional: Note que eventualmente o sensor nos dá um valor absurdo (algo em torno dos 3000cm), modfique o código para impedir que isso aconteça e que possamos fazer uma leitura mais precisa. Desafio Adicional++: Use tudo que aprendeu até agora no curso para controlar três atuadores diferentes (LED, motor DC, servomotor) com três diferentes sensores (LDR, potenciometro, sonar). Porém o usuário deve escolher qual sensor controla cada atuador na execução do código, isto deve ser digitado pelo usuário no teclado, por exemplo: Caso o usuário digite: Servo > LDR. O Servomotor deve girar baseado na leitura do LDR. Extra: Orientação a Objeto Como já discutido anteriormente, o Arduíno permite que usemos Orientação a Objeto para facilitar o desenvolvimento de projetos. A sintaxe para a definição de classes é semelhante à do C++, observe a definição da classe Led: Note que podemos alterar qualquer atributo fisico do LED por meio desta classe, diminuindo o volume de código caso tenhamos, por exemplo, vários LEDs no nosso projeto. Desafio Adicional: Refaça algum dos projetos anteriores criando uma classe para o componente usado. Grupo de estudos em RobÓtica