quarta-feira, 7 de março de 2012

Curso Arduino - Aula 13 Portas Analógicas & Servo Motores por Renato Aloi

quinta-feira, 2 de fevereiro de 2012

Imprimir Valor de Porta Analógica Através da Serial


Este exemplo mostra como você pode ler uma porta digital usando um potenciômetro. Um potenciômetro é um dispositivo mecânico simples, que permite variar a resistência quando o êmbolo é girado. Ao passar voltagem através do potenciômetro e através de uma porta analógica do seu Arduino, é possível medir a quantidade de resistência produzida pelo potenciômetro, como um valor análogo. Neste exemplo você monitorará o estado do seu potenciômetro após estabelecer comunicação Serial entre o Arduino e o PC.



Material Necessário

  • Placa do Arduino
  • Potenciômetro de 10K ohms

Circuito

Conecte os três fios do potenciômetro na sua placa do Arduino. O primeiro fio vai no GND (0V), o pino central na porta analógica zero (A0) e o terceiro pino do potenciômetro vai no VCC (5V).


Ao girar o êmbolo do potenciômetro, você altera a quantidade de resistência em um ou outro lado da trilha na qual o pino central está montado. Isto muda a voltagem no pino central. Quando a resistência entre o pino central e o lado conectado no 5V está perto de zero (e a resistência do outro lado está perto de 10k ohms), a voltagem no pino central fica perto dos 5V. Quando o cenário é invertido, a voltagem no pino central se aproxima dos 0 volts, ou GND. Esta voltagem é a voltagem analógica que você está lendo como entrada.
O Arduino possui um circuito interno chamado conversor analógico-digital que efetua a leitura da variação de voltagem e a converte em um número entre 0 e 1023. Quando o êmbolo é girado em um sentido, teremos 0 volts entrando na porta analógica e o valor convertido é 0. Quando o êmbolo é girado completamente para o outro lado, teremos 5 volts entrando na porta e o valor convertido é 1023. Entre esses valores, a função analogRead() retorna um número entre 0 e 1023 que é a quantidade proporcional de voltagem sendo aplicada a porta.


Esquema Elétrico




Código

No programa abaixo, a única coisa que você precisa configurar na função setup() é a comunicação Serial, na velocidade de 9600 bauds (bits de dados por segundo), entre o Arduino e o PC, utilizando o comando abaixo:

Serial.begin(9600);

No laço principal do seu programa, na função loop() do seu código, você precisa estabelecer uma variável para armazenar o valor convertido da resistência do seu potenciômetro (que deve ser entre 0 e 1023, perfeito para o tipo int de variável).

int sensorValue = analogRead(A0);

Finalmente, você precisa imprimir essa informação para seu console Serial, convertido em decimal (DEC). Você pode fazer isso com o comando Serial.println() na sua última linha de código:

Serial.println(sensorValue, DEC)

Agora, quando você abrir o Monitor da Serial, no ambiente de desenvolvimento do Arduino (clicando no ícone exatamente ao lado do botão “Upload”, na barra de ferramentas), você deverá ver um fluxo constante de números entre 0-1023, correlacionados com a posição do êmbolo do potenciômetro. Ao girar o potenciômetro, esses números deverão refletir o valor convertido quase que instantaneamente.

/*
  AnalogReadSerial
 Reads an analog input on pin 0, prints the result to the serial monitor

 This example code is in the public domain.
 */


void setup() {
  Serial.begin(9600);
}

void loop() {
  int sensorValue = analogRead(A0);
  Serial.println(sensorValue);
}



segunda-feira, 16 de janeiro de 2012

Material de Apoio das Aulas do Curso Arduino 2011

Download do Material de Apoio

Abaixo, link para download das apresentações que utilizei durante as aulas do Curso Arduino, durante o ano de 2011.

http://www.seriallink.com.br/util/Curso_Arduino.zip

Os arquivos das Apresentações estão no formato "Curso Arduino - Aula XX.odp", onde XX representa o número da aula. A extensão ".odp" pode ser aberta com o BrOffice.

Abraços,
Renato Aloi

quinta-feira, 22 de dezembro de 2011

Laços While & For do Arduino

comando for

Descrição

O comando “for” é utilizado para repetir blocos de comandos inseridos entre chaves. Um contador incremental é normalmente utilizado para incrementar e finalizar o laço. O comando “for” é útil em qualquer tarefa repetitiva, e largamente utilizado em combinação com arrays para processar coleções de dados/portas.
O laço “for” é constituído de 3 partes:
for (iniciação; condição; incremento) {
//comando(s);
}
A iniciação (declaração da variável contadora) acontece primeiro e exatamente uma única vez. Cada vez que o laço “roda”, a condição é testada; se é verdadeira, o bloco de comandos e seu incremento é executado, então a condição é verificada novamente. Quando a condição se torna falsa, o laço termina.

Exemplo

// Esvanece um LED usando uma porta PWM
int PWMpin = 10; // LED em série com resistor 470 ohm na porta 10

void setup()
{
  // nada a ser feito no setup
}

void loop()
{
   for (int i=0; i <= 255; i++){
      analogWrite(PWMpin, i);
      delay(10);
   } 
}



Dicas de Codificação

O laço “for” do C é muito mais flexível que outros laços encontrados em outras linguagens de programação, incluindo BASIC. Qualquer uma das 3 partes (ou todas elas) podem ser omitidas, embora os pontos e vírgulas são obrigatórios. Tanto que os comandos de iniciação, condição e incremento podem ser qualquer comando válido em C, mesmo que as variáveis não tenham relação entre si. E é permitido o uso de qualquer tipo de variável, mesmo float. Estes tipos não usuais para comandos “for” devem fornecer soluções para alguns problemas raros de programação.
Por exemplo, utilizando multiplicação na parte incremental gerará uma progressão logarítimica:

for(int x = 2; x < 100; x = x * 1.5){
println(x);
}
Resultado: 2,3,4,6,9,13,19,28,42,63,94
Outro exemplo, esvanece um LED ao ligar e desligar com esse laço “for”

void loop()
{
   int x = 1;
   for (int i = 0; i > -1; i = i + x){
      analogWrite(PWMpin, i);
      if (i == 255) x = -1;             // muda a direção no pico
      delay(10);
   } 
}

laço while

Descrição

Laços “while” vão executar sequencialmente e para sempre, até que a expressão dentro dos parênteses () se torne falsa. Algum evento deve mudar o estado da variável testada, ou então o laço “while” não terminará nunca. Este evento pode estar em seu código, como uma variável incremental, ou uma condição externa, como um sensor de teste, um botão etc.

Sintaxe

while(expressão){
  // comando(s)
}

Parametros

expressão - um (boolean) comando C que retorne verdadeiro ou falso (true ou false)

Exemplo

var = 0;
while(var < 200){
  // faça alguma coisa repetitiva por 200 vezes
  var++;
}

Traduzido do Original em Inglês por Renato Aloi

domingo, 11 de dezembro de 2011

Strings no Arduino


Descrição

Strings de texto podem ser representadas de duas formas. Você pode utilizar o tipo de variável “String”, que é parte do Arduino desde a versão 0019, ou você pode fazer uma string a partir de um array de variáveis do tipo “char” e adicionar a terminação nula.
Este artigo descreve o último método. Para maiores detalhes sobre o objeto String, que permite maiores funcionalidades (e também maior custo de memória), veja o artigo mais abaixo.

Exemplos

Todas as formas abaixo são declarações válidas de strings.
char Str1[15];
  char Str2[8]  = {'a','r','d','u','i','n','o'};
  char Str3[8]  = {'a','r','d','u','i','n','o','\0'};
  char Str4[ ]  = "arduino";
  char Str5[8]  = "arduino";
  char Str6[15] = "arduino";


Possibilidades para declaração de strings
  • Declare um array de caracteres (char) sem iniciá-lo, como feito em Str1
  • Declare um array de caracteres (char), com um caractere adicional, e o próprio compilador acrescentará o caractere de terminação nula, como feito em Str2
  • Adicionar explicitamente o caractere nulo, como em Str3
  • Inicie com uma constante de texto, contida entre aspas; o compilador vai definir o tamanho do array de caracteres automaticamente, calculando o tamanho da string mais o terminador nulo, conforme Str4
  • Inicie um array com o tamanho declarado explicitamente e uma constante de texto entre aspas, vide: Str5
  • Inicie um array, deixando espaço extra para strings com tamanhos maiores, conforme Str6


Terminação Nula
Geralmente, strings são terminadas com um caractere nulo, (código ASCII zero [0]). Isto permite que funções (como a Serial.print()) conhecerem onde termina o texto da string. Caso contrário, essas funções continuariam a ler bytes da memória que não fazem parte da string.
Isso significa que sua string precisa ter espaço suficiente para um ou mais caracteres além do texto que você deseja armazenar. É por isso que a variável Str2 e Str5 (acima) precisam de 8 caracteres, mesmo tendo a palavra “arduino” apenas 7 letras – a última posição é preenchida automaticamente com o caractere nulo. Str4 será automaticamente redimensionada para o tamanho de 8 caracteres, sendo uma posição para o nulo. Na variável Str3, nós declaramos explicitamente o tamanho e adicionamos o caractere nulo ('\0') por nossa conta.
Veja que é possível ter uma string sem o caractere final nulo (por exemplo, declarando a variável Str2 com 7 ao invés de 8 caracteres). Isso falhará na maioria das funções que esperam uma string para funcionar, portanto não faça isso intencionalmente! Se você perceber um comportamento diferente, como adição de caracteres estranhos na sua string, este pode ser o problema.


Aspas Simples ou Duplas?
Strings sempre são definidas escrevendo-se um texto contido entre aspas duplas (exemplo: "Abc"), e caracteres sempre são definidos escrevendo-se uma única letra (ou dígito, ou algum caractere da tabela ASCII), contido dentre aspas simples, ou apóstrofes (exemplo: 'A').
Quebrando strings longas
Você pode quebrar strings assim:
char myString[] = "Um texto que começa aqui"
" e termina logo"
" ali";
Array de Strings
Quando trabalhamos com uma grande quantidade de texto, em um projeto com display LCD, por exemplo, é muito comum fazer uso de um array de strings. Como as strings por si só são arrays de caracteres, um array de string nada mais é senão um array bi-dimensional de caracteres.
No código abaixo, o asterisco após o tipo de variável (“char*”), indica que esta variável é um array de ponteiros. Todos os arrays na realidade são ponteiros de memória, então este é o requisito para fazer arrays de arrays. O estudo de ponteiros é uma das partes mais difíceis para um iniciante, mas é necessário entender ponteiros em detalhes, para usá-los de forma efetiva aqui.

Exemplo

char* myStrings[]={"This is string 1", "This is string 2", "This is string 3",
"This is string 4", "This is string 5","This is string 6"};

void setup(){
Serial.begin(9600);
}

void loop(){
for (int i = 0; i < 6; i++){
   Serial.println(myStrings[i]);
   delay(500);
   }
}

Objeto String

Descrição

A classe String, parte do Arduino desde a versão 0019, nos permite utilizar e manipular strings de texto de uma maneira mais completa aos arrays de caracteres. Você pode concatenar textos, adicionar trechos de texto, pesquisar expressões no texto e substituir trechos, e muito mais. Consome mais memória que um simples array de caracteres, mas é muito mais útil.
Para referência, arrays de caracteres são declarados como “string” com o “s” minúsculo, e instâncias da classe String são declaradas como “String”, com a letra “S” maiúscula. Repare também que strings constantes, especificadas por aspas duplas, são tratadas como arrays de caracteres, e não como instâncias da classe String.


Funções

Operadores

Exemplos

Tradução por Renato Aloi
Original em Inglês -- http://www.arduino.cc/en/Reference/String

sábado, 3 de dezembro de 2011

Material de Apoio do Curso Arduino (Aulas 7-8)


Pessoal,

Segue esquema elétrico da solução apresentada nas aulas 7 e 8 do Curso Arduino:



Abaixo temos o código da montagem feita na aula 8, para acionamento de um motor, a partir de um botão:

byte BOTAO = 0;
byte MOTOR = 0;

byte PORTA_B = 10;
byte PORTA_M = 8;

void setup()
{
pinMode(PORTA_B, INPUT);
digitalWrite(PORTA_B, 1); // Liga PullUp!

pinMode(PORTA_M, OUTPUT);
digitalWrite(PORTA_M, 0); // Motor Deslig.
}

void loop()
{
BOTAO = digitalRead(PORTA_B);
if (BOTAO == 0)
{
MOTOR = !MOTOR;
digitalWrite(PORTA_M, MOTOR);
delay(500);
}
delay(1000);
}

Abraços,
Renato Aloi