16 dezembro 2014

Como utilizar o módulo I2C com display LCD

Quem precisa conectar um display LCD 16x2 ou 20x4 ao Arduino sabe que vai precisar de pelo menos 6 fios para conexão. Em placas com um número menor de  portas, como o Arduino Uno, isso significa sacrificar algumas portas que poderiam ser utilizadas para ligação de outros componentes, como sensores ou motores.

Um módulo que pode ser utilizado para contornar esse problema é o módulo I2C para display LCD com CI PCF8574 (datasheet) :


Módulo I2C display LCD Arduino

Com esse módulo, você consegue controlar um display LCD, seja ele 16x2 ou 20x4,  utilizando apenas dois pinos do Arduino : o pino analógico 4 (SDA) e o pino analógico 5  (SCL), que formam a interface de comunicação I2C.

08 dezembro 2014

Controle de acesso com módulo RFID RC522

RFID (Radio Frequency IDentification ou Identificação por  radiofrequência) é uma tecnologia que utiliza sinais de rádio e uma etiqueta (tag) RFID para leitura e gravação de dados. 

A forma mais comum de utilização do RFID é na identificação de produtos, onde uma tag pode conter informações como código do produto, procedência, data de validade, fabricante, etc. Mas a sua utilização não se restringe a isso. Podemos usar etiquetas RFID em animais para fins de rastreamento, em veículos no conhecido sistema Sem Parar, em passaportes, rastreamento de cargas, controle de acesso e em várias outras aplicações.

Módulo RFID RC522 Arduino

O módulo RFID RC522 para Arduino é capaz de ler tags que operam na frequência de 13,56 Mhz, e suporta cartões do tipo Mifare1 S50, Mifare1 S70  Mifare Ultralight, Mifare Pro e Mifare DESFire.

Ligação do módulo RFID ao Arduino

O módulo RFID RC522 utiliza a interface SPI para comunicação com o Arduino por meio dos pinos digitais de 10 à 13, além do pino 9 ligado ao RST do  módulo. Veja na imagem abaixo a disposição dos pinos e a ligação ao Arduino, com os pinos suportados pela biblioteca MFRC522, que utilizaremos no nosso programa de controle de acesso :

pinagem modulo rfid rc522 arduino


Atenção à alimentação do módulo, que é feita por meio do pino 3.3V do  Arduino.

Controle de acesso com RFID

Vamos testar o módulo RFID montando um controle de acesso utilizando o Arduino Uno e que verifica o  número da tag e libera (ou não), a passagem por uma cancela controlada  por um servo motor (microservo 9G) :

Projeto cancela com RFID
Esse controle de acesso utiliza o circuito abaixo, lembrando mais uma vez que a alimentação do módulo RFID é feita por meio do pino 3.3V, e o servo motor é alimentado por 5V, por isso atenção na montagem para não inverter as ligações :

Circuito Arduino Uno módulo RFID RC522

Reconhecendo as tags e controlando o servo motor

No programa utilizamos a biblioteca Servo, já presente na IDE do Arduino, e  também a biblioteca MFRC522, que você encontra nesse link.

Adicionamos dois leds para mostrar se o acesso foi liberado (led verde, ligado à porta 5), ou  negado (led vermelho piscante, ligado à porta 6).

Para adaptar o programa à sua tag, verifique no serial monitor o número  (UID) da tag lida pelo sensor, e então coloque esse número nessa linha, no lugar do "D8 4B 12 22" :

if (conteudo.substring(1) == "D8 4B 12 22")

Como temos dois cartões, adicionamos duas entradas idênticas e mudamos  apenas o número do UID em cada uma delas, com um dos cartões com acesso liberado e que aciona o servo motor, movimentando o mesmo em 90 graus, e outro com acesso negado, que pisca o led vermelho.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
// Programa : RFID - Controle de acesso / cancela
// Autor : Arduino e Cia

#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h> 
 
Servo microservo9g;

#define SS_PIN 10
#define RST_PIN 9
// Definicoes pino modulo RC522
MFRC522 mfrc522(SS_PIN, RST_PIN); 

// Leds indicadores acesso liberado ou negado
int led_liberado = 5;
int led_negado = 6;

char st[20];

void setup() 
{
  pinMode(led_liberado, OUTPUT);
  pinMode(led_negado, OUTPUT);
  // Define que o servo esta ligado a porta digital 3
  microservo9g.attach(3);
  // Move o servo para a posicao inicial (cancela fechada)
  microservo9g.write(90);
  // Inicia a serial
  Serial.begin(9600);
  // Inicia  SPI bus
  SPI.begin();
  // Inicia MFRC522
  mfrc522.PCD_Init(); 
  // Mensagens iniciais no serial monitor
  Serial.println("Aproxime o seu cartao do leitor...");
  Serial.println();
}

void loop() 
{
  // Aguarda a aproximacao do cartao
  if ( ! mfrc522.PICC_IsNewCardPresent()) 
  {
    return;
  }
  // Seleciona um dos cartoes
  if ( ! mfrc522.PICC_ReadCardSerial()) 
  {
    return;
  }
  // Mostra UID na serial
  Serial.print("UID da tag :");
  String conteudo= "";
  byte letra;
  for (byte i = 0; i < mfrc522.uid.size; i++) 
  {
     Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
     Serial.print(mfrc522.uid.uidByte[i], HEX);
     conteudo.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
     conteudo.concat(String(mfrc522.uid.uidByte[i], HEX));
  }
  Serial.println();
  Serial.print("Mensagem : ");
  conteudo.toUpperCase();
  
  // Testa se o cartao1 foi lido
  if (conteudo.substring(1) == "D8 4B 12 22")
  {
    // Levanta a cancela e acende o led verde
    microservo9g.write(-90);
    digitalWrite(led_liberado, HIGH);
    Serial.println("Cartao1 - Acesso liberado !");
    Serial.println();
    delay(3000);
    microservo9g.write(90);
    digitalWrite(led_liberado, LOW);
    }
    
  // Testa se o cartao2 foi lido
  if (conteudo.substring(1) == "87 4B DC 8A")
  {
    Serial.println("Cartao2 - Acesso negado !!");
    Serial.println();
    // Pisca o led vermelho
    for (int i= 1; i<5 ; i++)
    {
      digitalWrite(led_negado, HIGH);
      delay(200);
      digitalWrite(led_negado, LOW);
      delay(200);
    }
  }
  delay(1000);
}

Abaixo, o serial monitor mostrando os dados referentes às tags que foram liberadas ou negadas :
 
Serial monitor RFID

Esse projeto pode ser melhorado adicionando-se um sensor infravermelho para detectar a passagem de veículos/pessoas/objetos pela cancela, ou um display para contagem de acessos. Abaixo, circuito em funcionamento :



26 novembro 2014

Raspberry Pi : Instale o Raspbian e crie seu primeiro programa em Python

Raspberry Pi B+


Depois de falar sobre o que é o Raspberry e mostrar as diferenças entre o Raspberry B e o B+, chegou a hora de botar a mão na massa. Hoje vamos ver como ligar o Raspberry Pi B+ aos periféricos, e como instalar o Raspbian, o sistema operacional do Raspberry.

18 novembro 2014

Data e hora no Arduino com o módulo RTC DS1302

Neste artigo vamos ver como extrair as informações de data e hora do módulo RTC DS1302, um módulo que funciona da mesma forma que o DS1307, mas possui algumas diferenças principalmente na parte de comunicação com o Arduino, já que o DS1307 usa I2C e o DS1302 usa comunicação com 3 fios.

Módulo RTC DS1302


O módulo é controlado pelo DS1302 ,um chip do tipo RTC (Real Time Clock, ou Relógio de Tempo Real), com funções de data, hora e calendário. Ele é capaz de fornecer as informações de horas, minutos, segundos, dia da semana, data, mês e ano, e ajusta automaticamente os dados referentes aos meses com menos de 31 dias e também anos bissextos.

Pinagem DS1302

Na imagem abaixo temos a pinagem do CI DS1302 (datasheet) e a função de cada pino :


CI RTC DS1302 - Pinagem

E abaixo a disposição do CI DS1302 no módulo, que na verdade não possui muitos componentes adicionais, apenas o cristal de 32.768 kHz e a bateria (CR2032) para manter a alimentação do chip em caso de falta de energia :


Módulo RTC DS1302 - Pinagem


O CI aceita alimentação de 2 à 5.5V, logo podemos ligar o módulo utilizando os pinos 3.3V ou 5V do Arduino.

Ligação módulo DS1302 ao Arduino

São utilizados três pinos para conexão ao Arduino : RST (Reset ou CE - Chip Enable), DATA (I/O) e CLK (ou SCLK / Serial Clock). Para testes vou alimentar o módulo com os 5V do Arduino :


Circuito Arduino Uno - DS1302


Como pinos de dados usamos os pinos 6, 7 e 8 do Arduino. Você pode escolher outros pinos do Arduino e mudar essa configuração nas linhas iniciais do programa.

Mostrando as informações de data e hora do DS1302

Existe um artigo no site oficial do Arduino, mostrando em detalhes como ler as informações do DS1302. Para quem gosta de entender como essa comunicação é feita, byte a byte, vale a pena dar uma olhada nessa página: http://playground.arduino.cc/Main/DS1302.

Para a maioria das aplicações esse código é bem extenso e não muito simples de entender, por isso o pessoal da Virtuabotix adaptou esse código e criou uma biblioteca chamada virtuabotixRTC (clique aqui para efetuar o download da biblioteca). Com ela fica muito fácil de extrair as informações do DS1302 e utilizá-las junto com outras funções do Arduino.

Note que no início do programa temos essa linha, que serve para determinar a data e hora atuais :

myRTC.setDS1302Time(<segundos>, <minutos>, <hora>, <dia da semana>, <dia do mês>, <mês>, <ano>)

Uma vez setada a data e a hora, a linha acima deve ser comentada e o programa novamente carregado no Arduino. 

Criei o programa abaixo baseado nos exemplos da biblioteca, e acrescentei a rotina que mostra o dia da semana por extenso :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
// Programa : Data e hora com modulo RTC DS1302
// Alteracoes e adaptacoes : Arduino e Cia
//
// Baseado no programa original de Krodal e na biblioteca virtuabotixRTC

// Carrega a biblioteca virtuabotixRTC
#include <virtuabotixRTC.h>           

// Determina os pinos ligados ao modulo
// myRTC(clock, data, rst)
virtuabotixRTC myRTC(6, 7, 8);

void setup()  
{      
  Serial.begin(9600);
  // Informacoes iniciais de data e hora
  // Apos setar as informacoes, comente a linha abaixo
  // (segundos, minutos, hora, dia da semana, dia do mes, mes, ano)
  myRTC.setDS1302Time(00, 58, 23, 2, 17, 11, 2014);
}

void loop()  
{
  // Le as informacoes do CI
  myRTC.updateTime(); 

  // Imprime as informacoes no serial monitor
  Serial.print("Data : ");
  // Chama a rotina que imprime o dia da semana
  imprime_dia_da_semana(myRTC.dayofweek);
  Serial.print(", ");
  Serial.print(myRTC.dayofmonth);
  Serial.print("/");
  Serial.print(myRTC.month);
  Serial.print("/");
  Serial.print(myRTC.year);
  Serial.print("  ");
  Serial.print("Hora : ");
  // Adiciona um 0 caso o valor da hora seja <10
  if (myRTC.hours < 10)
  {
    Serial.print("0");
  }
  Serial.print(myRTC.hours);
  Serial.print(":");
  // Adiciona um 0 caso o valor dos minutos seja <10
  if (myRTC.minutes < 10)
  {
    Serial.print("0");
  }
  Serial.print(myRTC.minutes);
  Serial.print(":");
  // Adiciona um 0 caso o valor dos segundos seja <10
  if (myRTC.seconds < 10)
  {
    Serial.print("0");
  }
  Serial.println(myRTC.seconds);

  delay( 1000);
}

void imprime_dia_da_semana(int dia)
{
  switch (dia)
  {
    case 1:
    Serial.print("Domingo");
    break;
    case 2:
    Serial.print("Segunda");
    break;
    case 3:
    Serial.print("Terca");
    break;
    case 4:
    Serial.print("Quarta");
    break;
    case 5:
    Serial.print("Quinta");
    break;
    case 6:
    Serial.print("Sexta");
    break;
    case 7:
    Serial.print("Sabado");
    break;
  }
}

Esse programa envia as informações de data e hora para o serial monitor :

Data e hora DS1302 - Serial Monitor

Em um próximo artigo sobre o DS1302, vou utilizar esse módulo para montar um relógio utilizando display 7 segmentos. Até lá !


11 novembro 2014

Gravando dados do Arduino no cartão SD

Trabalhando com sensores, muitas vezes temos a necessidade de armazenar os dados para consulta posterior, em situações onde não podemos monitorar o circuito todo o tempo. Pode ser quando desejamos consultar a variação de temperatura de um ambiente ou então verificar quando um determinado alarme foi acionado.

Para casos assim podemos gravar os dados do Arduino em um cartão, utilizando o módulo cartão SD :

gravando dados no cartão SD Arduino

Antes de mais nada não se assuste com a quantidade de pinos. São 16, mas usamos apenas 6 para conexão ao Arduino. Olhando o módulo de frente, você pode  usar tanto os pinos da direita como os da esquerda, pois eles tem a mesma  função. Observe a imagem abaixo :


Módulo SD - Pinos

Com relação aos cartões SD, eu testei 3  modelos de cartão no módulo. Sem citar nomes, o cartão de "marca" não funcionou de jeito nenhum, enquanto os cartões genéricos funcionaram perfeitamente. Todos  foram formatados da mesma maneira, e testados com FAT e FAT32. O módulo funcionou com cartões pequenos, de 512 Mb, e também com cartões de maior capacidade, como os de 8 Gb.

Conectando o módulo cartão SD ao Arduino

O módulo SD se conecta ao Arduino utilizando a interface SPI (arduino.cc/en/Reference/SPI), utilizando no nosso exemplo os pinos 4, 11, 12 e 13. A alimentação do módulo é feita por meio do pino 5V  do Arduino.

Atenção com os pinos de sinal, pois eles trabalham com nível de sinal de 3.3V, de  maneira semelhante aos módulos bluetooth que eu já mostrei aqui no site. Utilize  a calculadora desse link  para calcular o valor dos resistores que você  vai utilizar para montar o divisor de tensão. Eu usei resistores de 220 e 330 ohms, que forneceram um  nível de sinal de aproximadamente 3V, suficiente para os testes :

SD Arduino



Gravando dados no cartão SD

No circuito acima eu liguei um push-button à porta digital 3 para demonstrar como os dados são gravados no cartão SD. A cada toque no botão, um contador é incrementado e esse valor é gravado no cartão com o seguinte formato :

Contador : <valor>

O programa utiliza a biblioteca SD, que já está embutida na IDE do Arduino. No inicio do programa é feito um pequeno teste para verificar se as conexões estão corretas e se o cartão SD está sendo reconhecido. Caso esteja tudo ok, um loop verifica se o botão foi pressionado e em caso afirmativo, grava esse dado no cartão SD junto com o valor atual do contador :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
// Programa : Teste escrita cartao SD
// Autor : Arduino e Cia
// Baseado no arquivo exemplo da biblioteca SD

// Carrega a biblioteca SD
#include <SD.h>

Sd2Card SDcard;
SdVolume volume;

// Pino do Arduino conectado ao pino CS do modulo
const int chipSelect = 4;  
// Pino do Arduino conectado ao push-button
int pinobotao = 3;
int contador = 0;

void setup()
{
  // Define o pino do push-button como entrada
  pinMode(pinobotao, INPUT);
  Serial.begin(9600);
  //Inicia a comunicacao com o modulo SD
  if (!SD.begin(chipSelect)) 
  {
    Serial.println("Falha ao acessar o cartao !");
    Serial.println("Verifique o cartao/conexoes e reinicie o Arduino...");
    return;
  }
  Serial.println("Cartao iniciado corretamente !");
  Serial.println("Aguardando acionamento do push-button...");
  Serial.println();
}

void loop() 
{
  int valor = digitalRead(pinobotao);
  // Verifica se o push-button foi acionado
  if (valor == 1)
  {
    // Delay caso o botão continue pressionado
    while(digitalRead(pinobotao) == 1)
    {
      delay(100);
    }
    // Incrementa o contador e envia os dados para o
    // Serial monitor
    contador=contador++;
    Serial.print("Botao pressionado. Contador : ");
    Serial.println(contador);
  
    // Abre o arquivo arquivo.txt do cartao SD
    File dataFile = SD.open("arquivo.txt", FILE_WRITE);
    // Grava os dados no arquivo
    if (dataFile) 
    {
      dataFile.print("Contador : ");
      dataFile.println(contador);
      dataFile.close();
    }  
    else 
    {
      // Mensagem de erro caso ocorra algum problema
      // na abertura do arquivo
      Serial.println("Erro ao abrir arquivo.txt !");
    } 
  }
}

Após pressionar o push-button algumas vezes, coloque o cartão SD no seu computador, e abra o arquivo ARQUIVO.TXT. Você terá um arquivo nesse formato :

Arquivo cartão SD

07 novembro 2014

Livro Arduino - Primeiros Passos com Sensores

Gosta de livros ? E livros de Arduino ? E livros de Arduino com desconto ? Melhor ainda, né ? :-)

A Novatec acaba de lançar um livro para o público que curte Arduino e Raspberry. É o Primeiros Passos com Sensores , dos autores Kimmo Karvinen e Tero Karvinen.

Eu já estou com o meu e posso afirmar que tem muita coisa interessante, tanto para quem está começando agora, como para quem já tem um pouco mais de experiência com sensores.

Primeiros Passos com Sensores - Novatec
 
Mas antes de falar do livro, vou falar do desconto : entre no site da Novatec, clique em COMPRAR e utilize esse código da promoção :

 ARDUINOCIA 

Aproveite, o desconto é de 20%. :-)

Falando agora do principal, o livro. Ele aborda vários tipos de sensores como sensores de luz, interruptores, sensores de efeito hall, infravermelho, temporizadores, sensor de proximidade, pressão, temperatura, ultrassom, etc.

Tudo bem explicado, com exemplos divididos em 4 capítulos e 20 projetos, com a descrição, detalhes de funcionamento e material necessário, além de apêndices sobre Arduino e Raspberry.

06 novembro 2014

Cooler com Arduino e pastilha termoelétrica TEC1-12706

Vamos montar um pequeno cooler para manter a água gelada utilizando Arduino ? Isso é possível com o uso da pastilha termoelétrica TEC1-12706, que vamos utilizar nesse artigo :

Pastilha Termoelétrica TEC1-12706

Essa pastilha usa o Efeito Peltier para gerar temperaturas muito baixas (muitas vezes abaixo de 0), em um lado da pastilha, e temperaturas muito altas do outro lado. Essa pastilha é usada frequentemente em bebedouros , mini coolers ou então pode ser utilizada para refrigeração de CPU´s, ideal para quem gosta de um overclock. ;-)

A imagem abaixo ilustra o funcionamento da pastilha, com os seus pares de elementos semicondutores tipo P e N. Na pastilha TEC1-12706 temos 127 pares de elementos, responsáveis por gerar a diferença de temperatura entre os dois lados do componente :

Efeito Peltier
Imagem : Wikipedia

Uma das características dessa pastilha é esquentar de maneira muito rápida. Em poucos segundos um dos lados fica bem quente, e nesse lado é necessário um dissipador de calor para que as temperaturas não entrem em equilíbrio e anulem o efeito da pastilha. A ausência do dissipador pode até mesmo danificá-la.

Nos meus testes eu utilizei um dissipador de calor retirado de uma CPU, e uma fonte de computador para alimentação, já que a pastilha apresentou melhores resultados quando alimentada com 12v.

Não recomendo ligar a pastilha diretamente no Arduino, pois ele não vai fornecer a corrente necessária para esquentar/esfriar a pastilha. Verifique o datasheet da TEC1-12706 para se certificar dos níveis de tensão e corrente suportados. Nos meus testes a pastilha começou a esfriar à partir de 1A  (mais um motivo para não utilizar diretamente os 5v do Arduino). Opte por uma fonte de alimentação externa, de no mínimo 12V e 2 A.

Ok, e o que podemos fazer se a pastilha não funciona diretamente com o Arduino ?

Podemos utilizar o Arduino como um auxiliar para ligar e desligar a alimentação da pastilha, adaptando um sensor de temperatura que vai acionar a pastilha quando a temperatura chegar à um valor X, e desligar a alimentação quando a temperatura diminuir e chegar à um valor Y, formando assim um "cooler".

Para isso, eu utilizei um circuito composto pelo Arduino Uno, um sensor de temperatura LM35 e um relé de 2 canais (utilizando apenas um dos relés) :


Circuito Arduino - Pastilha termoelétrica



Fixei o LM35 em um recipiente com água e montei o meu cooler conforme a imagem abaixo. Não gostei muito do resultado com o LM35, já que o tipo de encapsulamento do sensor não ajuda na hora de monitorar a temperatura, Talvez o circuito fique melhor com um DS18B20, o DHT11 ou algum outro sensor de temperatura.

Estrutura cooler com pastilha termoelétrica

O programa abaixo monitora a temperatura do sensor (porta analógica A0) e aciona o Relé 1 (ligado à porta digital 4) caso a temperatura esteja abaixo daquela determinada na variável TEMP_MAX. Caso a temperatura chegue ao mesmo valor da variável TEMP_MIN, o relé é desligado. Os resultados também são enviados para o serial monitor, mostrando a temperatura atual, e o estado do relé :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// Programa : Cooler com pastilha termoeletrica TEC1-12706
// Autor : Arduino e Cia

int pin = A0; // Pino analogico para ligacao do LM35
int pinorele = 4; //Pino digital ligado ao rele (IN1)

int TEMP_MAX = 20; // Temperatura maxima - liga a pastilha
int TEMP_MIN = 10; // Temperatura minima - desliga a pastilha

String estadopastilha;

// Variavel que armazenam a temperatura em Celsius
int tempc = 0; 
int samples[8]; // Array para precisão na medição

int i;

void setup()
{
  Serial.begin(9600);     
  pinMode(pinorele, OUTPUT);
}

void loop()
{
  // Loop que faz a leitura da temperatura 8 vezes
  for(i = 0;i<=7;i++)
  { 
    samples[i] = ( 5.0 * analogRead(pin) * 100.0) / 1024.0;
    // A cada leitura, incrementa o valor da variavel tempc
    tempc = tempc + samples[i]; 
    delay(100);
  }
  // Divide a variavel tempc por 8, para obter precisão na medição
  tempc = tempc/8.0; 
  
  // Se a temperatura estiver acima de TEMP_MAX, aciona a pastilha
  if(tempc >= TEMP_MAX) 
  {
    digitalWrite(pinorele, LOW);
    estadopastilha = "Acionada";
  }

  // Se a temperatura estiver abaixo de TEMP_MIN, desliga a pastilha
  if(tempc <= TEMP_MIN) 
  {
    digitalWrite(pinorele, HIGH);
    estadopastilha = "Desligada";
  }
  Serial.print("Temperatura : ");
  Serial.print(tempc,DEC);
  Serial.print(" Cels. - Pastilha : ");
  Serial.println(estadopastilha);

  tempc = 0;
  delay(1000); // Aguarda 1 segundo e reinicia o processo
}

Obviamente esse circuito não pode ser considerado um cooler "profissional", ainda precisa de muitos ajustes e algumas adaptações (um potenciômetro para regular a faixa de temperatura seria uma boa idéia), mas pode servir como base para o seu projeto utilizando a pastilha termoelétrica.

30 outubro 2014

Qual a diferença entre o Raspberry Pi modelo B e B+ ?

Antes de falar sobre a instalação do sistema operacional Raspbian no Raspberry, gostaria de analisar as diferenças entre o Raspberry Pi modelo B e o B+, que são os modelos mais comuns atualmente.

Esse é o Raspberry Pi modelo B, lançado em 2012 :

Raspberry Pi B

E esse o Raspberry Pi modelo B+ , lançado em 2014 :

Raspberry Pi B+
 
Olhando as imagens já notamos as diferenças no layout das placas. No Raspberry modelo B, temos o conector GPIO de 26 pinos no lado superior esquerdo, ao lado da saída de vídeo composto e da saída de áudio. Essa placa também tem 2 portas USB no lado direito, junto com o conector ethernet (rede). Na parte inferior da placa, temos o conector HDMI e no lado esquerdo o conector micro-usb para alimentação do Raspberry. Na parte posterior da placa, temos o slot para cartão SD :

Raspberry B - Conectores
Já no Raspberry modelo B+, o conector GPIO continua na parte superior mas tem agora 40 pinos. No lado direito, o número de portas USB subiu para 4, o que permite que você use o  teclado, o mouse e algum outro periférico ligado ao Raspberry sem ter que recorrer à um hub USB. A porta ethernet também mudou, mas não muito. Ela agora tem as luzes indicadoras, que no modelo B ficavam na própria placa. A velocidade da porta ethernet não foi alterada e continua em 100 Mb.

Raspberry B+ Conectores

Na parte inferior da placa, os antigos conectores de vídeo composto e áudio viraram um só (conector de 4 pólos - imagem abaixo), e estão ao lado da porta HDMI e do conector micro-usb. O slot na parte posterior da placa agora é para um cartão microSD, muito mais prático do que na versão anterior.

Raspberry B+ Conector Audio e Video


Existe diferença de performance entre as duas placas ?


Não. Até para manter o baixo custo, não se mexeu na arquitetura da placa. O processador das duas placas é o mesmo, o BCM2835,  assim como a GPU (processador de vídeo) e a memória de 512 Mb. Isso tudo garante uma importante compatibilidade entre as placas modelos A, B e B+.

Não existe diferença de performance e também não existe diferença na operação e instalação dos programas.  Você pode utilizar os mesmos programas e os mesmos procedimentos de instalação do sistema operacional no Raspberry Pi modelo B ou B+.

Uma outra questão importante é sobre a alimentação das placas. Enquanto o modelo B precisa de uma fonte de 5v e 1A para funcionar, o modelo B+ precisa de uma fonte de 5v e 2A pelo menos, principalmente se houver a necessidade de utilizar as 4 portas USB ao mesmo tempo.

Vantagens do Raspberry modelo B+ e comparação com Arduino


A principal vantagem do modelo B+ é sem dúvida uma GPIO com mais portas. As 4 portas USB também fazem diferença, mas no restante, continua tudo praticamente igual. As principais mudanças estão no layout da placa.

Mesmo assim, o modelo B continua tendo grande aceitação, já que muitos projetos exploram a capacidade de processamento da placa e o baixo custo, utilizando-a como um servidor web ou uma central multimídia. Na imagem abaixo, temos 4 placas modelo B funcionando em Cluster como um servidor Web :

Raspberry B - Cluster Web
Imagem : http://raspberrywebserver.com


O Raspberry Pi veio para acabar com o Arduino ? No meu ponto de vista não, pois são placas com propostas bem diferentes.

Arduino + Raspberry

O Arduino é uma plataforma de prototipação com um microcontrolador Atmel , várias portas de entrada e saída, além de um esquema de programação muito simplificado, no qual você consegue começar a programar a placa em poucos minutos. O que você precisa para começar a criar algo no Arduino é um computador com a IDE (ambiente de programação) e um cabo USB.

Já o Raspberry se propõe a ser um computador completo, de baixo custo. Você precisa apenas conectar à ele um monitor, um teclado e um mouse (recomendável). Começar a criar algo no Raspberry é um pouco mais demorado, já que você precisa baixar a imagem do sistema operacional, copiar essa imagem para o cartão SD, instalar o Raspbian, configurar o sistema operacional (que é baseado em Linux), e aí sim começar a usar a GPIO para os seus projetos. Dá um certo trabalho, mas o resultado final compensa. 

Raspberry e Arduino podem inclusive funcionar em conjunto. Veremos isso mais adiante.

No próximo artigo sobre o Raspberry vou tratar da instalação do Raspbian no Raspberry Pi B+ e também do uso do Python para utilizar a GPIO. Até lá !

Atualizado :  Tutorial sobre instalação do Raspbian no artigo Raspberry Pi : Instale o Raspbian e crie seu primeiro programa em Python

28 outubro 2014

Visita à Mostra Nacional de Robótica - São Carlos - SP

Semana passada estive em São Carlos (SP), e tive a oportunidade de visitar a  Mostra Nacional de Robótica, que foi realizada em conjunto com a Competição Brasileira de Robótica (CBR), e as finais da Olimpíada Brasileira de Robótica (OBR) na USP de São Carlos.


Mostra Nacional de Robótica - Competições

Além de muita conversa sobre Arduino, PIC, Raspberry, Lego Mindstorms e outras tecnologias para construção de robôs, fui ver o que o pessoal dos colégios participantes estava (literalmente) inventando na parte de Robótica.

Equipe Colégio Maria Montessori
Arthur Falabretti, Prof. Alfredo Ferreira, Rodrigo Teixeira
O pessoal do Colégio Maria Montessori (Maceió - AL), criou um Tricóptero feito com Arduino e material de sucata. A idéia inicial era utilizar motores de HD (disco rigido) para movimentar as hélices, mas para a mostra acabaram optando por motores brushless, controlados por um Arduino Uno e um acelerômetro MMA7361. Terminada a mostra, voltarão ao laboratório para continuar testando o uso dos motores de HD no projeto.



Equipe Colégio João XXIII
Fabrício Toledo, João Pedro e a Prof. Simone Gonçalves.
Os alunos do Colégio João XXIII (Volta Redonda -RJ) criaram um pequeno robô que desenha formas geométricas à partir de comandos no Arduino. Fabrício Toledo e João Pedro utilizaram um Arduino Uno, um kit de chassi 2 rodas e um shield para controle dos motores. Adaptaram no chassi um "braço" que segura uma caneta para quadro branco  e escreve conforme o robô se movimenta. Os meninos prometeram desenvolver ainda mais o robô, adicionando novos recursos.




Equipe EEEFM Clovis Borges Miguel
ROB, Gabriel Nascimento e Gabriel Tótola
Por último, um projeto pra lá de especial, já que envolve ajudar o próximo. Mais especificamente, crianças com câncer. O Gabriel Nascimento e o Gabriel Tótola , da EEEFM Clóvis Borges Miguel (Serra - ES) criaram o ROB, um robô que tem a intenção de auxiliar no tratamento por meio da interação com as crianças, seja conversando, contando histórias, incentivando ou propondo desafios e vibrando a cada conquista. Segundo os alunos, "...o robô seria mais do que um robô, mais que um brinquedo, ele desempenharia o papel de um terapeuta, porém sem a barreira da idade e da formalidade muitas vezes presentes nas relações médico-paciente". O projeto a princípio usa um RoboSapien com kit MP3 e microfone, mas em breve receberá um kit com Arduino e funções de comando de voz.

Esses foram apenas alguns exemplos. Tem muita coisa boa sendo inventada por aí e cabe a nós incentivar cada projeto, do mais simples ao mais elaborado. Valeu !

24 outubro 2014

Tutorial comunicação Arduino usando Xbee 802.15.4 Serie 1

Quem já montou uma rede wireless utilizando módulos Xbee sabe que o processo às vezes não é muito simples. Existem dezenas de parâmetros para serem configurados, além das particularidades de cada tipo de módulo, já que os da Serie 1 e Serie 2 não conversam entre si.

Nesse post eu vou mostrar como configurar dois Módulos Xbee Serie 1 1mW, ligar um deles no computador e outro ao Arduino, e enviar um texto para que seja mostrado em um display LCD 16x2. No final do post, há um vídeo mostrando o circuito em funcionamento.

Modulo Xbee Serie 1 802.15.4

Com esse módulo é muito simples montar uma rede ponto-a-ponto  ou mesmo uma rede com vários módulos se comunicando ao mesmo tempo. A comunicação é feita na frequência de 2.4 Ghz e o alcance do módulo pode chegar a 100 metros em campo aberto. Um modo "sleep" permite uma grande economia de energia quando o módulo não está sendo utilizado, e é ideal para configurações que usem algum tipo de bateria para alimentação do circuito.

Material Utilizado

Nesse tutorial vamos utilizar :
  • 2 módulos Xbee Serie 1 1mW
  • Xbee Explorer USB : Esta placa é ligada ao computador via cabo mini USB e serve tanto para programar os módulos Xbee S1 como também para testar a comunicação entre eles
  • Xbee Shield - Shield que será conectado ao Arduino e receberá os comandos enviados pelo Xbee conectado ao computador
  • Display LCD 16x2 - Ligado ao Arduino, mostra os caracteres recebidos pelo módulo Xbee
  • Fonte de alimentação para o Arduino

Instalação do Xbee Explorer USB

Xbee Explorer USB é a placa conectada ao computador via cabo mini USB, que vamos utilizar para configurar os módulos Xbee. Simplesmente encaixamos o módulo na placa, e ligamos o cabo no computador :
 
Xbee USB Explorer Adapter

No Windows 7 (64 bits) o adaptador foi reconhecido automaticamente, e foram adicionados dois dispositivos. O USB Serial Converter, e o USB Serial Port, que no nosso caso, foi alocado na porta serial COM20:

Xbee Explorer USB - Drivers


Instalação do XCTU

XCTU é o software da Digi utilizado para fazer a programação dos módulos Xbee conectados ao computador. Além da programação, é possível atualizar o firmware dos módulos, enviar comandos de um módulo Xbee para o outro e até mesmo recuperar módulos com problema. Faça o download do XCTU acessando esse link, e depois acessando Diagnostics, Utilities anda MIBS :

XCTU - Download


Na tela seguinte, clique em XCTU Next Gen Installer, Windows x32/x64, se você estiver utilizando Windows.

XCTU - Download Windows
Após o download, execute o instalador. Na tela inicial, clique em NEXT :

XCTU Instalacao - Tela Inicial

Na tela seguinte, leia TODO o contrato de licença e caso concorde com o contrato, clique em I AGREE :

XCTU Instalacao - Licença

Na tela seguinte, há uma advertência de que o usuário deve ter direitos de administrador no Windows 7 e Windows Vista, para evitar problemas na hora de copiar os arquivos. Clique em NEXT :

XCTU Instalacao - Path

Escolha uma pasta para instalação do programa e clique em NEXT :

XCTU Instalacao - Pasta destino

Na tela de confirmação de instalação, revise os itens que serão instalados e também a pasta de instalação do programa, e clique em Install para iniciar a cópia de arquivos :

XCTU Instalacao - Revisao

Aguarde o final do processo e o XCTU estará instalado no seu computador :

XCTU Instalacao

Configurando o módulo Xbee Serie 1 utilizando XCTU

Com o módulo Xbee encaixado no Xbee Explorer USB, entre no XCTU e clique em Discover Devices, conforme destacado na imagem. Esse comando vai fazer com que o XCTU efetue uma varredura no computador procurando por módulos Xbee :

XCTU - Tela inicial


Na próxima tela, selecionamos a porta serial que foi detectada na instalação do Xbee Explorer USB. No caso, a COM20 :

XCTU - Selecionando porta serial

Na próxima tela, mantenha os valores padrão para a serial e clique em Finish para iniciar a varredura :

XCTU - Parametros da porta serial

 Aguarde o módulo Xbee aparecer na lista de dispositivos detectados e clique em Add Selected Devices :

XCTU - Modulo Xbee identificado

Após o dispositivo ser adicionado ao XCTU, ele irá aparecer no lado esquerdo da tela do programa. Clique sobre o dispositivo para que os parâmetros de configuração sejam lidos e apareçam no lado direito da tela :

XCTU - Modulo Xbee Parâmetros


No lado direito você encontra as informações de firmware do módulo Xbee e na seção Networking & Security os parâmetros que vamos utilizar para configurar a rede Xbee.

Parâmetros de configuração Xbee

Rolando a tela, podemos ver que existem muitas possibilidades de configuração dos módulos Xbee. Mas em uma configuração básica, para comunicação ponto-a-ponto, vamos modificar apenas quatro deles :

ID PAN ID - É o número de identificação da rede Xbee ao qual o módulo irá se conectar. PAN significa Personal Area Network. Para juntar dois ou mais módulos Xbee à mesma rede, basta que estejam com o mesmo PAN ID.
MY 16-bit Source Address - É um número único que identifica o módulo Xbee na rede.
DH Destination Address High - Determina a parte "alta" (32 bits), do endereço de 64 bits que podemos atribuir aos módulos Xbee. Como estamos utilizando apenas dois módulos, vamos setar esse valor para 0 e utilizar apenas a parte baixa do endereço, especificada no próximo comando.
DL Destination Address Low - Aqui vamos colocar o endereço do módulo de destino. Como setamos 0 para o parâmetro DH, vamos utilizar o endereço de 16 bits especificado em MY 16-bit Source Address.

Essa questão dos endereços parece um pouco complicada, mas na prática fica mais fácil de entender. Vamos configurar o primeiro módulo com os parâmetros abaixo :

Parâmetros do primeiro módulo Xbee
Figura 1 : Parâmetros do primeiro módulo Xbee

E o segundo módulo vamos configurar assim :

Parâmetros do segundo módulo Xbee
Figura 2 : Parâmetros do segundo módulo Xbee

Dessa maneira, estamos determinando que os dois módulos pertencem à mesma rede (PAN ID 1234), que o primeiro módulo tem endereço 1 e vai se comunicar com o módulo que tem endereço  2 e o segundo módulo tem endereço 2 e vai se comunicar com o módulo que tem endereço 1. Compliquei ? :-)

Para gravar esses parâmetros nos módulos, primeiro coloque o Xbee que vai ser o número 1 no Xbee Explorer USB, faça a varredura conforme eu expliquei anteriormente e em seguida configure os valores conforme a Figura 1 acima. Não se esqueça de clicar no botão Write Radio Settings (abaixo), para que os valores que você alterou sejam gravados no módulo:

Xbee Write Radio Settings

Faça a mesma coisa com o segundo módulo, utilizando os parâmetros mostrados na Figura 2.

Programando o Arduino e conectando o Xbee

Agora que já temos os módulos configurados, vamos carregar o seguinte programa no Arduino, ANTES de colocarmos o Xbee Shield. Assim evitamos conflitos de serial, já que tanto a IDE como o Xbee utilizam a serial para se comunicar com o Arduino :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// Programa : Envio de texto utilizando Xbee S1
// Autor : Arduino e Cia

// Carrega a biblioteca LiquidCrystal
#include <LiquidCrystal.h>   
   
// Define os pinos que serão utilizados para ligação ao display  
LiquidCrystal lcd(A0, A1, A2, A3, A4, A5);

int incomingByte = 0;
char buf[20];     //Tamanho da mensagem - 20 caracteres
int num = 0;
String dados;

void setup()
{
  // Inicializacao do display e mensagem inicial
  lcd.begin(16, 2); 
  lcd.print("Aguardando...");
  // Inicializacao da serial e mensagem inicial
  Serial.begin(9600);
  Serial.println("Aguardando envio de texto...");
  Serial.println();
}

void loop()
{
  while(Serial.available() > 0)
  {
    // Armazena os caracteres no buffer
    buf[num] = Serial.read();
    // Verifica se foi recebido o caracter de nova linha
    if (buf[num] == '\n') 
    {
      lcd.clear();
      String dados = buf;
      dados.trim();
      int tamanho_string = dados.length();
      
      // Imprime o texto recebido na serial
      Serial.print("Dados recebidos : ");
      Serial.println(dados);
      
      // Mostra no display o texto recebido
      lcd.print(dados);

      // Apaga o buffer para receber novo texto
      for (int ca =0; ca<20; ca++)
      {
        buf[ca]=0;
      }
      num=0;
      break;
    }
    num++;
  }
}

Agora encaixe o segundo módulo Xbee no Xbee Shield, encaixe o shield no Arduino,  e ligue o display LCD 16x2 ao conjunto conforme a imagem abaixo. Vamos utilizar as portas analógicas de A0 a A5 para controle do display, e um potenciômetro de 10 K (podem ser usados outros valores) para ajuste do contraste :

Circuito Arduino Xbee Shield LCD


Utilize uma fonte externa (7 à 12 volts) para alimentação do Arduino.

Testando a comunicação Xbee

Mantenha o primeiro módulo Xbee conectado ao computador usando o Xbee Explorer USB. O que vamos fazer agora é usar o próprio serial monitor da IDE do Arduino para enviar textos ao segundo módulo Xbee. Na IDE do Arduino, selecione Ferramentas -> Porta Serial e escolha a porta relacionada ao Xbee Explorer (relembrando que no nosso caso é a porta COM20).

Certifique-se que o caracter de NOVA LINHA esteja selecionado conforme destacado na imagem abaixo, pois o programa aguarda esse caracter ( \n ) para determinar o tamanho da string e também para saber quando ela acabou de ser enviada.

Comunicação Xbee

Digite o texto na parte superior do serial monitor, conforme mostrado acima, e pressione ENVIAR ou aperte a tecla ENTER para que o texto seja enviado do computador para o Arduino e reproduzido no display LCD. Todo esse processo você pode conferir nesse vídeo :