Academia.eduAcademia.edu

Revista PROGRAMAR 17

electrónica Não se torna necessário, como foi referido anteriormente, possuir elevados conhecimentos de electrónica, já que o único requisito realmente relevante é a vontade de aprender. Introdução ao Arduino Observemos então pormenorizadamente a seguinte figura: Introdução É objectivo deste artigo dar a conhecer o Arduino. Esta “ferramenta” com enormes potencialidades, que pode ser utilizada por todos, tenham ou não conhecimentos de electrónica devido à sua enorme simplicidade de utilização. O Arduino tem ainda muita margem de desenvolvimento, começando como um pequeno projecto educacional evoluindo até aos dias de hoje. Dentro das suas vantagens pode-se encontrar o facto de ser open-source, correndo em ambiente Linux, Macintosh e Windows tendo ainda o aliciante de ser bastante económico comparativamente com “ferramentas” de iguais funcionalidades disponíveis no mercado. Para apresentar este tema com maior simplicidade, o que não significa menor rigor, torna-se necessário dividi-lo em duas partes distintas: hardware e software e fazer a sua ligação. É importante referir que o Arduino abre imensas portas, devendo haver por parte do leitor interesse em procurar, conhecer e aprender. Hardware O Arduino pode ter várias apresentações sendo a base deste artigo o Arduino Diecimilia (baseado num microprocessador Atmega168 da Atmel). Convém dar especial atenção a este capítulo sobre hardware, pois é sobre ele que toda a programação se vai apoiar. Pela análise da figura atrás apresentada, que representa uma placa - Arduino Diecimilia, podemos constatar o seguinte “pin out”: - 3 pinos de GND (Ground); - 1 pino de alimentação de 3.3V (3V3) e um de 5V; - Possui um pino denominado Vin, que possibilita o uso da tensão colocada à entrada (Pwr), antes de passar pelo controlador de tensão, sendo esta funcionalidade programável por software. - Um pino de reset, que à semelhança do botão presente no Arduino, e como o próprio nome indica faz o reinício do Arduino, ou seja, executa o programa a partir do inicio novamente, através da aplicação de um sinal de entrada. Voltando a executar o bloco de instruções da função setup, como referido mais à frente no artigo. - 14 portas digitais (0 ao 13) configuráveis como input ou output. Com a possibilidade de em seis destas (5,6,9,10,11) usar PWM – Pulse Width Modulation. Esta potencialidade é muito importante, pois através da variação da largura do impulso pode-se “simular” tensões entre 0 e 5V. Os pinos digitais 0 e 1 possibilitam, ainda, quando configurados, o envio de informação em série. Permitindo outra interface, dependendo do fim pretendido. - 6 Portas analógicas, possuindo um conversor analógico digital de 10 bits. E fazendo as contas: 2¹° = 1024 Como a tensão máxima de referência, por definição, se encontra nos 5v correspondendo ao valor 1023, obtemos a seguinte resolução: <39> 5 ÷ 1024 = 0,00488 V = 5 mV electrónica O que significa que só se conseguirá “detectar” variações superiores a 5 mV. Ou seja, o valor lido pelo Arduino só se altera a cada 5 mV de variação do sinal analógico de entrada. Em caso de aplicação de sensores, como por exemplo de sensores de temperatura do tipo termo-pares, que podem ter variadíssimas apresentações e que funcionam na casa dos mV, correspondendo 5 mV em certos casos a subidas de temperatura da ordem dos 80 ºC. Torna-se essencial encontrar uma solução, sem recorrer a electrónica externa. Assim, para tal existe uma porta de entrada denominado AREF, que significa “Analog Reference”. Este pino permite mudar a referência analógica do standard 5V para o valor introduzido. Ficando todas as entradas analógicas com a referência introduzida. A linguagem usada nesta aplicação é uma versão simplificada de C, possuindo o mesmo tipo de regras e funções básicas. Simplificando, se se introduzir no pino AREF a tensão de 2V obtém-se a seguinte resolução: 2 ÷ 1024 = 1.953 mV = 2 mV É importante ter em conta que todas as portas ficam com esta referência, sendo necessária também a sua configuração por Software. É igualmente de referir que após configurar o Arduino para o uso do pino AREF, ele deixa de ter disponíveis os pinos de 3.3V e 5V. E que estando estes desligados, será então necessário recorrer a alimentação externa. O Arduino possui capacidade de operar alimentado, quer pela porta USB ou por uma entrada Pwr. Sendo recomendada a sua utilização entre os 7 e os 12V, que possibilita uma operação do tipo “Standalone”. Poderíamos referir aspectos de funcionamento do próprio microprocessador, o que não se torna relevante para o aproveitamento das capacidades do Arduino. O que não significa que não seja objecto de interesse. Devendo o leitor, caso queira, aprofundar os seus conhecimentos nesta matéria fazendo uma pequena pesquisa. Havendo para isso muita documentação disponível online, sendo uma paragem obrigatória o site oficial do Arduino http://www.arduino.cc/. Software O ambiente de desenvolvimento pode ser obtido através do site oficial do Arduino, correspondendo a última versão ao Arduino 0012. Na figura acima apresentada, é possível visualizar o ambiente de desenvolvimento do Arduino, muito intuitivo e fácil de usar. Para carregar um programa é simplesmente necessário, elaborá-lo e com um simples click no botão Upload to I/O Board, o programa é compilado e enviado para o Arduino. Isto é possível ser feito sem recorrer a Hardware externo, pois o Arduino possui um Bootloader de origem. Ferramenta esta que quando ligada, possibilita que o Arduino receba os comandos enviados pela porta USB. No entanto, se não chegarem dados, o último programa carregado é executado. E no caso de ser a primeira utilização do Arduino, o único programa em memória será ele mesmo. Sendo a sua distribuição completamente livre (sendo “Open-Source”, como já foi referido anteriormente). <40> electrónica Sendo comum definirem-se valores diferentes dos apresentados, para comunicar com outros dispositivos. Constituição do Código O código é constituído por dois blocos de funções distintas As taxas de transmissão atrás referidas são as suportadas pelo Software padrão do Arduino. Função setup void setup() { Instruções 1; } Função loop void loop() { Instruções 2; } Função Setup A função Setup é executada quando o programa começa, sendo este bloco de instruções apenas executado uma vez. É executado quando o Arduino é ligado ou quando se efectua o reset. É usada normalmente como a função responsável por inicializar variáveis, definir os pinos (I/O), definição de bibliotecas entre outros. Exemplo 1: Ao utilizar esta funcionalidade (comunicação pela porta série), que permite ler facilmente valores, p.ex. de sensores, é também possível, através de qualquer Software que faça leituras da porta série, tratar e guardar esses dados, bem como apresentá-los sobre a forma de gráficos ou tabelas, conforme o pretendido. Um exemplo de um programa muito comum, que possibilita a leitura pela porta série é o Matlab. Este permite o armazenamento e tratamento de dados, como referido anteriormente. int buttonPin = 5; void setup() { Serial.begin(9600); pinMode(buttonPin, INPUT); } Exemplo 3: Dentro do bloco de instruções está a ser configurado o modo de comportamento do pino 5, definido como buttonPin (linha 1). No exemplo apresentado, está definido que o pino 5 está configurado como INPUT. Contudo é bastante fácil configurá-lo como OUTPUT, ficando: Exemplo 2: pinMode(buttonPin, OUTPUT); A função Serial.begin(int taxa_bps), é usada para definir a taxa de transmissão em série. Tipicamente para comunicar com o computador, temos taxas de 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600 ou 115200 bps. s = serial('COM7', 'BaudRate',19200); fopen(s) fprintf(s, 'hello arduino!'); end fclose(s) Definido o número da porta série, neste caso COM7, e o BaudRate como 19200 bps, na situação apresentada (linha 1). É de seguida enviada a seguinte mensagem ‘hello arduino!’ (linha 3). Terminando com um fecho da ligação fclose(s) (linha 5). Sendo o Matlab apenas um exemplo de muitos softwares que existem disponíveis e que possibilitam Rx/Tx através da porta série (p.ex. HyperTerminal). É ainda possível obter mais informações sobre este tema na página oficial Arduino. <41> electrónica Função Loop Após a execução da função Setup, a função Loop é iniciada. E como o próprio nome indica, faz um loop sucessivo e permite que o programa faça acções pré-estabelecidas. Um exemplo deste tipo de acções pré-estabelecidas é a leitura de botões ou sensores, apenas possível através desta característica da função loop. Exemplo 4: void loop() { if (digitalRead(buttonPin) == HIGH) Serial.println('H'); else Serial.println('L'); delay(1000); } delay(1000); digitaWrite(ledPin, LOW); delay(1000); } Analisando o exemplo 5: Na linha 1, foi efectuado a declaração da variável ledpin, sendo esta declarada como sendo do tipo integer. O exemplo acima está a fazer a leitura de um buttonPin (linha 1), quando este apresenta um valor lógico 1 (HIGH) é enviado pela porta série o valor ‘H’ (linha 2). Caso essa condição não se verifique é enviado pela porta série o valor ‘L’. (linha 4) Comportando-se o ciclo if apresentado no exemplo 4, como um ciclo if de programação usado p.ex: na linguagem C. Para executar as instruções Serial.println(data) na função Loop, é necessário efectuar a declaração na função Setup da função Serial.begin(int taxa_bps). Definindo o bit rate (bps) desejado para a comunicação. As variáveis podem ser do tipo: • char • byte • int • unsigned int • long • unsigned long • float • double Char - Ocupa um byte de memória a guardar um caracter. Byte- Bytes guardam um número de 8 bits, vão do 0 ao 255. Não guardam números negativos. Hardware vs Software Int - Guardam um valor de 2 byte, inteiro. Torna-se necessário, à semelhança do 1º programa que se faz em C, o famoso “Hello World”, efectuar também um programa inicial. Programa esse que não vai apresentar no ecrã a string “Hello World”, fazendo, no seu lugar, um simples led piscar. O programa para o efectuar é o seguinte: Exemplo 5: int ledpin = 13; void setup() { pinMode(ledPin, OUTPUT); } Void loop() { digitalWrite(ledPin, HIGH); Unsigned int - Continua a ter um tamanho de 2 bytes, sendo um int, não contendo parte negativa. Long - Permite guardar um número inteiro de 4 bytes. (32 bits) Unsigned long - Semelhante ao long, não possuindo valores negativos. Aumentando assim o intervalo de valores positivo. Float - Usada para designar números com componente decimal, são guardados em 4 bytes. (32 bits) <42> electrónica De seguida é inicializada a função Setup (linha 2), que permite definir o pino 13 como OUTPUT (linha 3). Após a declaração das portas como INPUT/OUTPUT, tendo em conta a montagem desejada, inicia-se o ciclo Loop, que vai conter a base do nosso programa. No caso apresentado, recorrendo à função digitalWrite (pino,valor), é possível atribuir o valor lógico 1 (HIGH) ou 0 (LOW) a uma saída definida. O programa apresentado contém ainda a função delay (ms), que faz uma pausa no programa pelo tempo definido. Continuando depois com as instruções procedentes à instrução delay (ms). O exemplo apresentado permite fazer com que um led pisque de 2 em 2 segundos. Led esse que está ligado ao pino 13 como configurado. O pino 13 possui uma resistência ligada em paralelo, não havendo qualquer implicação da ligação do led directamente a esta porta. O que não acontece nos restantes pinos de saída, sendo este exemplo apenas indicado para o uso da porta 13. Através da variação da entrada analógica, é possível fazer variar, no caso apresentado, o delay (ms) da montagem. Sendo os exemplos 5 e 6 bastantes acessíveis à compreensão, é imperativo focar um ponto muito importante que possibilita responder à questão: Como enviar dados através da porta série para o meu Arduino? Exemplo 7: De seguida, vamos ver outro exemplo, que possibilita a leitura de valores analógicos, p. ex. de um LDR, um acelerómetro analógico, entre outros. Exemplo 6: int val=0; void setup() { pinMode(13, OUTPUT); } Void loop(){ Val = analogRead(0); digitalwrite(13, HIGH); delay(val); digitaWrite(13,LOW); delay(val); } Analisando o exemplo 6: Neste exemplo, vai-se proceder apenas à explicação do bloco de instruções da função Loop, pois a função Setup é em tudo semelhante à do exemplo 5. A função analogRead(pino), lê o valor analógico e guarda-o, neste caso, na variável val. Este valor está compreendido entre 0 e 1023, sendo esta a resolução do conversor analógico digital (10 bits). A operação de conversão leva cerca de 0.0001s, pelo que a taxa máxima de leitura é de 10000 amostras por segundo. <43> int val=0; int ledPin=9; void setup() { pinMode(ledPin,OUTPUT); Serial.begin(9600); } void loop() { if (Serial.available() > 0) { val = Serial.read(); Serial.print("Eu recebi:"); Serial.println(val,BYTE); analogWrite(ledPin,val); } } electrónica Analisando o exemplo 7 O ciclo if apresentado permite utilizando a função Serial.available() (linha 10), detectar se existem dados a serem enviados para o Arduino acima de um determinado valor. Em caso afirmativo executa o bloco de instruções (linha 11 à 16). O valor lido através da função Serial.read() (linha 12) é guardado, neste caso, na variável val (linha 12). Sendo depois enviada através da função Serial.println(data) (linha 14) pela porta série e apresentada e/ou guardada por algum programa que possibilite leituras da porta série. Como é o caso do Software Arduino que possibilita essas mesmas leituras, mas não o seu armazenamento. Através da função AnalogWrite (pino,valor) é possível utilizar a funcionalidade das saídas digitais PWM (Pulse Width Modulation). O parâmetro de entrada, valor da função analogWrite, varia entre 0 e 255, pelo que ao 0 corresponderá 0V e ao valor 255, respectivamente, 5V. Por exemplo se o valor for 128, o valor de saída será 5V durante metade do tempo e 0V durante a outra metade. Originando um valor eficaz de aproximadamente 2.5V. Conclusões Este artigo tem como objectivo dar a conhecer uma “ferramenta” que como o leitor já deve ter reparado, possui enormes potencialidades. O trabalho aqui exposto constitui uma ínfima parte do que existe para conhecer e aprender sobre o tema, sendo este documento uma tentativa para despertar o interesse e busca de conhecimento, que tantas vezes faltam nos dias de hoje. Sendo a melhor solução adquirir um exemplar, caso tenha o leitor manifesto interesse em descobrir mais sobre esta “ferramenta”. Quanto a pormenores das funções utilizadas pelo software oficial Arduino, deve o leitor recorrer ao site oficial Arduino (http://www.arduino.cc ) ou a tutoriais disponíveis online. Pois o saber não ocupa espaço de memória. Nuno Pessanha Santos é um apaixonado pela área da electrónica e das telecomunicações, estando actualmente a frequentar na Escola Naval o primeiro ano do mestrado integrado no ramo de Armas e Electrónica na classe de Engenheiros Navais. [email protected] Nuno Santos <44>