No momento eu só ofereço os modelos de 700 e 830 pontos/furos.
Dimensões:
- 700 pontos: 17,5 x 4,5cm
- 830 pontos: 16,5 x 5,4cm
A finalidade deste módulo é conectar um dispositivo TTL qualquer (como o arduino) a dispositivos RS485 (EIA/TIA485).
Se você já sabe como estabelecer comunicação com outros dispositivos pela porta serial do Arduino, então já sabe quase tudo o que é preciso para estabalecer uma comunicação RS485, porque é quase a mesma coisa. Só há um detalhe que você precisa ter em mente: Você não pode receber ao mesmo tempo que transmite, por isso se seu programa requer as duas coisas precisará modificá-lo para acomodar isso.
Você pode usar dois módulos desse para estabelecer comunicação RS485 entre dois arduinos, se quiser.
Para transmitir, coloque +5V nos terminais DE e RE do transmissor e GND nos terminais RE e DE do receptor. Aí está o problema: se um dos dispositivos vai sempre transmitir e outro sempre receber, o funcionamento é simples e transparente. Mas se você precisa inverter os papéis de vez em quando, precisará seguir um protocolo para evitar colisões (dois trasmitindo ao mesmo tempo).
A primeira e mais simples providência é deixar sempre ambos no modo RX e só colocar em modo TX durante o tempo estritamente necessário para transmitir. Se um dos dispositivos sempre inicia e o outro sempre responde, também é fácil implementar. Problema mesmo é quando ambos podem iniciar a transmissão a qualquer momento. Em redes grandes, geralmente um dispositivo chamado de master fica com a tarefa de organizar a comunicação entre os outros, chamados de slaves. O master consulta um por um os slaves perguntando se eles tem algo a dizer.
Outras providências serão necessárias dependendo da complexidade da “conversa” entre os dispositivos.
Sobre RS485
RS485 tem caracterísitcas importantes com relação à bem mais conhecida RS232:
Tanto a RS422 quanto a RS485 são especificações DE HARDWARE. Nada se fala sobre software ou protocolos de qualquer tipo nessas especificações. É o projetista quem tem que determinar como os nós irão trocar informações. O endereçamento dos nós é feito por software (ou firmware, no caso dos uCs), por isso numa rede multiponto RS485 o software empregado precisa prever isto. Mas como não existe nenhum protocolo “especial” na RS485, qualquer programa que já funcione com RS232 pode funcionar em RS485 com alterações mínimas.
Note que mesmo quando falamos que a ligação é a dois fios ou a quatro fios, pode existir um terceiro e um quinto fios: o terra. Ele pode ser dispensado, mas seu uso garante que a tensão de modo comum no receptor fique dentro de uma faixa segura e isso aumenta a estabilidade e imunidade a ruídos da interface.
Quando a ligação é a dois fios, dependendo de como seja implementada, o nó transmissor pode ou não receber um eco de sua própria transmissão. Leve isso em conta. A recepção do eco pode ser usada para verificar se está havendo Line Contention no Bus (ou mesmo que ele está em curto).
A forma correta de implementar RS485 “desconecta” os transmissores inativos do barramento. Isso é conseguido com drivers dotados de saída tri-state. Os chips compatíveis com RS485, como o 75176, tem um pino de “Enable” que é comumente ligado à linha RTS da porta RS232 no PC. O sinal RTS é então usado como LIGA/DESLIGA da transmissão. Em um nó com microcontrolador, é claro, um substituto do sinal RTS deve ser implementado, já que mesmo em um uC com UART embutida apenas existem os sinais TX e RX.
Só que “gastar” uma saída do uC somente para habilitar a transmissão nem sempre é aceitável. Além disso, em algumas aplicações, RS485 é usada apenas para estender o alcance de uma RS232 e o software já existente nem sempre manipula o sinal RTS da forma correta. Muitos softwares levantam o sinal RTS assim que abrem a porta e só o desativam quando a fecham, mas para ser usado para controlar uma interface RS485 o sinal RTS deve levantar imediatamente com o primeiro bit transmitido e cair pouco depois do último bit. Para piorar as coisas, se o sofware estiver rodando sob Windows pode não ser possível levantar e baixar a linha RTS com o sincronismo necessário. Isso cria um problema.
Problema que frequentemente é contornado implementando um circuito que monitore a linha TX da interface e ative o sinal de enable da RS485 assim que a transmissão iniciar e que o derrube uma fração de segundo após a linha TX estabilizar. Essa forma de implementar poupa uma linha do uC e, do lado do PC, usa apenas RX, TX e GND.
Definitivamente não é recomendável criar um sistema com múltiplos masters. Sempre que possível, delegue a missão de Master a apenas um nó do sistema (geralmente será o PC).
O 75176 é obsoleto. Você pode usar os mais modernos LTC485 e MAX485 no lugar. São compatíveis pino a pino já que o 75176 se tornou um “industry standard”. E os chips mais modernos são também mais resistentes, como você pode ver no artigo da Circuit Cellar (links).
—————————
Links Úteis
Este produto está disponível nos modelos com fio e sem fio. Ambos acompanham adaptador wiichuck.
O Wii nunchuck é um dispositivo I2C que responde no endereço 0x52 e possui um joystick, dois botões e um acelerômetro cujas posições você pode “ler” usando rotinas adequadas no arduino. Apenas quatro fios são necessários: VCC, GND, SCL e SDA.
Teoricamente ele é um dispositivo de 3V, mas a prática mostrou que você pode alimentá-lo com 5V no arduino sem problemas.
Existem dois tipos de nunchuck no mercado: o original (ou “OEM”) e o genérico. Embora os dois funcionem no Wii aparentemente sem diferença, quando tentamos usar no Arduino três diferenças são percebidas:
A terceira diferença é a mais importante, pois o nunchuck que não suporta criptografia precisa ser usado de maneira diferente. O Wii se encarrega de fazer isso de forma transparente, mas uma grande quantidade de exemplos de uso do nunchuck no arduino que você encontra na internet prevê o uso de um original e por isso pode não funcionar com muitos genéricos. É preciso procurar por exemplos que tenham sido feitos para genéricos.
Este sketch de teste funciona com originais e genéricos, usando ou não o adaptador Wiichuck:
/*
* NunchuckPrint
*
* 2007 Tod E. Kurt, http://todbot.com/blog/
*
* The Wii Nunchuck reading code is taken from Windmeadow Labs
* http://www.windmeadow.com/node/42
*/
#include <Wire.h>
void setup()
{
Serial.begin(19200);
nunchuck_setpowerpins(); // use analog pins 2&3 as fake gnd & pwr
nunchuck_init(); // send the initilization handshake
Serial.print ("Finished setup\n");
}
void loop()
{
nunchuck_get_data();
nunchuck_print_data();
delay(100);
}
//
// Nunchuck functions
//
static uint8_t nunchuck_buf[6]; // array to store nunchuck data,
// Uses port C (analog in) pins as power & ground for Nunchuck
static void nunchuck_setpowerpins()
{
#define pwrpin PORTC3
#define gndpin PORTC2
DDRC |= _BV(pwrpin) | _BV(gndpin);
PORTC &=~ _BV(gndpin);
PORTC |= _BV(pwrpin);
delay(100); // wait for things to stabilize
}
// initialize the I2C system, join the I2C bus,
// and tell the nunchuck we're talking to it
void nunchuck_init()
{
Wire.begin(); // join i2c bus as master
Wire.beginTransmission(0x52); // transmit to device 0x52
//Só funciona com o original
// Wire.send(0x40); // sends memory address
// Wire.send(0x00); // sends sent a zero.
//Funciona com a versão xing-ling
#if (ARDUINO >= 100)
Wire.write(0xF0);
Wire.write(0x55);
#else
Wire.send(0xF0);
Wire.send(0x55);
#endif
Wire.endTransmission();
delay(1);
Wire.beginTransmission(0x52);
#if (ARDUINO >= 100)
Wire.write(0xFB);
Wire.write(0x00);
#else
Wire.send(0xFB);
Wire.send(0x00);
#endif
Wire.endTransmission();
}
// Send a request for data to the nunchuck
// was "send_zero()"
void nunchuck_send_request()
{
Wire.beginTransmission(0x52); // transmit to device 0x52
#if (ARDUINO >= 100)
Wire.write(0x00);
#else
Wire.send(0x00);
#endif
Wire.endTransmission(); // stop transmitting
}
// Receive data back from the nunchuck,
int nunchuck_get_data()
{
int cnt=0;
Wire.requestFrom (0x52, 6); // request data from nunchuck
while (Wire.available ()) {
// receive byte as an integer
#if (ARDUINO >= 100)
nunchuck_buf[cnt] = nunchuk_decode_byte(Wire.read());
#else
nunchuck_buf[cnt] = nunchuk_decode_byte(Wire.receive());
#endif
cnt++;
}
nunchuck_send_request(); // send request for next data payload
// If we recieved the 6 bytes, then go print them
if (cnt >= 5) {
return 1; // success
}
return 0; //failure
}
// Print the input data we have recieved
// accel data is 10 bits long
// so we read 8 bits, then we have to add
// on the last 2 bits. That is why I
// multiply them by 2 * 2
void nunchuck_print_data()
{
static int i=0;
int joy_x_axis = nunchuck_buf[0];
int joy_y_axis = nunchuck_buf[1];
int accel_x_axis = nunchuck_buf[2]; // * 2 * 2;
int accel_y_axis = nunchuck_buf[3]; // * 2 * 2;
int accel_z_axis = nunchuck_buf[4]; // * 2 * 2;
int z_button = 0;
int c_button = 0;
// byte nunchuck_buf[5] contains bits for z and c buttons
// it also contains the least significant bits for the accelerometer data
// so we have to check each bit of byte outbuf[5]
if ((nunchuck_buf[5] >> 0) & 1)
z_button = 1;
if ((nunchuck_buf[5] >> 1) & 1)
c_button = 1;
if ((nunchuck_buf[5] >> 2) & 1)
accel_x_axis += 2;
if ((nunchuck_buf[5] >> 3) & 1)
accel_x_axis += 1;
if ((nunchuck_buf[5] >> 4) & 1)
accel_y_axis += 2;
if ((nunchuck_buf[5] >> 5) & 1)
accel_y_axis += 1;
if ((nunchuck_buf[5] >> 6) & 1)
accel_z_axis += 2;
if ((nunchuck_buf[5] >> 7) & 1)
accel_z_axis += 1;
// Numera sequencialmente as linhas do log
// Serial.print(i,DEC);
// Serial.print("\t");
Serial.print(" joystick: ");
Serial.print(joy_x_axis,DEC);
Serial.print(",");
Serial.print(joy_y_axis, DEC);
Serial.print(" \t");
Serial.print("\t acc x:");
Serial.print(accel_x_axis, DEC);
Serial.print("\t\t y:");
Serial.print(accel_y_axis, DEC);
Serial.print("\t\t z:");
Serial.print(accel_z_axis, DEC);
Serial.print("\t");
Serial.print(" but:");
Serial.print(z_button, DEC);
Serial.print(",");
Serial.print(c_button, DEC);
Serial.print("\r\n"); // newline
i++;
}
// Encode data to format that most wiimote drivers except
// only needed if you use one of the regular wiimote drivers
char nunchuk_decode_byte (char x)
{
// x = (x ^ 0x17) + 0x17;
return x;
}
As diferenças são pequenas e estão em dois pontos do código: inicialização e leitura.
Inicialização
Original
Wire.beginTransmission(0x52);// transmit to device 0x52 Wire.write(0x40);// sends memory address Wire.write(0x00);// sends sent a zero. Wire.endTransmission();// stop transmitting
Genérico
Wire.beginTransmission(0x52); // endereço do nunchuck Wire.write(0xF0); // registro de incialização 1 Wire.write(0x55); //dado Wire.endTransmission(); //faz a transmissão delay(1); Wire.beginTransmission(0x52); Wire.write(0xFB); // registro de incialização 2 Wire.write(0x00); //dado Wire.endTransmission(); //faz a transmissão
Procure a função que faz a decodificação (geralmente procurar por “0x17” o levará direto a ela
uint8_t _nunchuk_decode_byte (uint8_t x)
{
x = (x ^ 0x17) + 0x17;
return x;
}
e desative a decodificação
uint8_t _nunchuk_decode_byte (uint8_t x)
{
//x = (x ^ 0x17) + 0x17;
return x;
}
Se você não desativar a decodificação o nunchuck parecerá funcionar, mas você encontrará dois problemas:
A finalidade do adaptador wiichuck é meramente evitar que você precise cortar o conector original do nunchuck. Isso acelera bastante os testes com diferentes modelos de nunchuck (inclusive o que você conseguir emprestado), sem precisar danificá-lo.
Cuidado: conecte o nunchuck ao adaptador com o chanfro para cima, como mostrado na foto. Conectá-lo ao contrário vai inverter positivo e negativo da alimentação possivelmente destruindo o seu nunchuck. Eu estou inclinado a acreditar que o nunchuck tenha proteção contra inversão de polaridade, porque é muito raro encontrar um alerta sobre isso. Porém nem todo nunchuck é igual (principalmente os genéricos) então é melhor prestar atenção à polaridade.
O wiichuck não funciona diretamente no arduino Mega. Para usá-lo no mega, faça as seguintes conexões com jumpers entre o wiichuck e o mega:
1: GND
2: 5V
3: SDA (pino 20)
4: SCL (pino 21)
Segurando o adaptador com a palavra “wiichuck” de pé, o pino 1 é o da esquerda.
Mas mesmo no Arduino UNO/Duemilanove o wiichuck depende um “truque” de programação para funcionar. Esse truque transforma as entradas analógicas A2 e A3 em pinos de alimentação. O código que faz isso se parece com este:
static void nunchuck_setpowerpins()
{
#define pwrpin PORTC3 //entrada A3
#define gndpin PORTC2 //entrada A2
DDRC |= _BV(pwrpin) | _BV(gndpin);
PORTC &=~ _BV(gndpin);
PORTC |= _BV(pwrpin);
delay(100); // wait for things to stabilize
}
Se você não estiver usando esse recurso, desative-o, ou não conseguirá usar as entradas A2 e A3 para outras coisas.
Links Úteis
Wiibrew – Explica a questão da criptografia, endereçamento, registros, etc.
Aplicações
Como o conversor de alimentação do arduino é linear, quanto maior a tensão da fonte usada (as pessoas gerelmente usam 9V), maior o desperdicio de energia na forma de calor. Por exemplo, digamos que seu projeto consuma 800mA com uma fonte de 9V. O consumo fica, calculando de forma grosseira, assim distribuído:
Isso dá uma “eficiência” de 55%.
Como se pode ver, se a fonte fosse uma bateria poderia ter uma autonomia extra superior a 80% se não fosse o desperdício.
O arduino desperdiça muito menos energia quando alimentado diretamente com 5V (pela porta USB). Assim se torna interessante, quanto a alimentação é feita por baterias, usar conversores chaveados DC-DC, por eles terem uma eficiência muito superior às fontes lineares (depende do caso, mas pode chegar a 92%).
O objetivo desses módulos é obter 5V a partir de outras fontes de tensão contínua, mas existem diferenças de funcionamento importantes.
Módulo baseado em LM2596S
Com este módulo a tensão de entrada precisa ser maior que a tensão de saída, o que o faz indicado quando, por exemplo, seu projeto de 5V precisa ser alimentado por uma fonte/bateria de 12V.
OBS.: As especificações dizem que a tensão de saída pode ir até 35V mas isso evidentemente está errado porque o capacitor de saída é de exatamente 35V. Existe uma regra informal que determina que sempre usemos um capacitor que suporte o dobro da tensão máxima do circuito e então, com um capacitor de 35V na saída, a tensão de saída máxima recomendável para esse módulo é 18V. O mesmo pode ser dito da entrada, que também só pode ir até 25V.
Módulo baseado em LM2577S
A principal característica deste módulo é que a tensão de entrada deve ser menor que a tensão ajustada de saída, o que o faz indicado para operação por módulos de baterias de baixa tensão, como Li-Ion. Mas por esse mesmo motivo é preciso ter um cuidado especial com as baterias, porque o módulo vai “sugar” corrente delas até que estejam completamente exauridas e isso pode ser fatal para baterias desprotegidas que não conseguem se recuperar se descarregadas a partir de certo ponto.
OBS. 1: Se a tensão de entrada subir acima da tensão ajustada de saída, esta acompanhará o aumento. Este módulo não funciona nos dois sentidos. Ele não baixa a tensão.
OBS. 2: O outro módulo também pode estragar baterias se usado sem cuidados (até mesmo o conversor interno do arduino pode). Por exemplo, baterias chumbo-ácido de 12V não devem ser descarregadas a menos de 11V.
OBS3.: As especificações dizem que a tensão de saída pode ir até 35V mas isso evidentemente está errado porque o capacitor de saída é de exatamente 35V. Existe uma regra informal que determina que sempre usemos um capacitor que suporte o dobro da tensão máxima do circuito e então, com um capacitor de 35V na saída, a tensão de saída máxima recomendável para esse módulo é 18V. O mesmo pode ser dito da entrada, que também só pode ir até 18V.
O produto em estoque pode ser diferente do exibido abaixo (principalmente posição dos pinos), mas o funcionamento é o mesmo.
Teste básico
Você precisa conectar o acelerômetro como indicado abaixo.
Nota: A ligação de 3.3V a AREF só é necessária para o último exemplo, porque a biblioteca define AREF como EXTERNAL.
O seguinte sketch mostrará se o acelerômetro está funcionando:
void setup()
{
Serial.begin(9600);
}
void loop()
{
for (int analogPin = 0; analogPin < 3; analogPin++) {
int sensor = analogRead(analogPin);
Serial.print(" ");
Serial.print(sensor);
}
Serial.println(" ");
delay(100);
}
Usando uma biblioteca
Como você pode ver pelo sketch acima, não é realmente necessário usar uma biblioteca para usar o acelerômetro. Se tudo o que você precisa saber é a orientação, sem precisar saber valores precisos de ângulos e aceleração, basta uma interpretação simples dos valores das entradas analógicas. Mas se você precisar de algo um pouco mais compicado, uma biblioteca pode ajudar a manter o código organizado.
A melhor biblioteca que encontrei até agora foi a AcceleroMMA7361.
Em anexo, um software escrito por mim que facilita o teste do acelerômetro. Para usá-lo, o arduino precisa estar rodando o seguiuinte sketch, que é uma ligeira modificação do exemplo RawData da biblioteca:
#include <AcceleroMMA7361.h>
AcceleroMMA7361 accelero;
int x;
int y;
int z;
void setup()
{
Serial.begin(9600);
accelero.begin(13, 12, 11, 10, A0, A1, A2);
accelero.setARefVoltage(3.3); //sets the AREF voltage to 3.3V
accelero.setSensitivity(LOW); //sets the sensitivity to +/-6G
accelero.calibrate();
}
void loop()
{
x = accelero.getXRaw();
y = accelero.getYRaw();
z = accelero.getZRaw();
Serial.print("\nx: ");
Serial.print(x);
Serial.print("\ty: ");
Serial.print(y);
Serial.print("\tz: ");
Serial.print(z);
delay(100);
}
A finalidade deste shield é conectar o arduino (qualquer um, mas é preciso fazer uma pequena alteração para o Mega) à rede celular para enviar e receber mensagens (SMS) ou se conectar à internet (GPRS). Você teoricamente (isso eu nunca testei) também pode conectar um microfone e/ou alto falante aos respectivos conectores e “ligar” para o seu projeto e ouvir o que se passa ao redor.
Nota: é muito comum as pessoas (incluindo muitos vendedores) confundirem GPRS com GPS. São duas funcionalidades complementares mas completamente diferentes. Este shield não tem funcionalidade GPS e são raros os que tem, porque geralmente faz mais sentido comprar as duas coisas separadamente.
A documentação completa do shield é fornecida pela Elecfreaks. Na página você irá encontarar diagramas e diversas informações importantes, mas os exemplos não são muito bons. Use a biblioteca que eu sugiro mais adiante.
Este shield precisa de alimentação extra. Ele não vai funcionar direito, se chegar a funcionar, apenas com a alimentação recebida do computador pelo cabo USB. Use a fonte fornecida com o shield.
O SIM900 precisa ser “ligado” para funcionar. Neste shield isso é feito dando um pulso no pino D6 do Arduino. Mas você também pode fazer isso apertando o botão S_PWR no shield.
A princípio você pode achar isso incoveniente, mas tenha em mente que o consumo do módulo é elevado. Dessa forma você tem um controle e para poupar energia só precisará ligar o “celular” quando realmente for necessário. Se não quiser ter que ficar apertando o botão, simplesmente programe seu sketch para ativar D6.
Você não precisa do arduino para usar esse shield. Com alguns fios e um adaptador USB-TTL você pode conectar o shield diretamente a um computador e usar um terminal serial qualquer para enviar e receber comandos.
A melhor biblioteca que conheço para esse shield é a GSM Shield Library. Compatível com o IDE 1.x.
Para testar a comunicação com a internet, rode o exemplo GSMSHIELD->GSM_GPRSLibrary_AT. Esse exemplo traz o conteúdo da página em google.com.
Problemas com o Arduino Mega
Esta combinação funciona sem qualquer problema no Arduino UNO, mas para usar com o Arduino Mega é necessário mudar a porta usada para comunicação:
1)Escolha um pino livre qualquer no Mega. Neste exemplo eu vou usar o D53 (também funcionou com o D10);
2)Edite a linha em GSM.cpp, para que aponte para o novo pino:
#define _GSM_TXPIN_ 2
3) Remova o jumper que conecta S_TX ao pino D2 e, com um fio, conecte S_TX ao pino escolhido
A foto abaixo mostra o pino 22 sendo usado, só para facilitar o enquadramento:
O problema é que por default o shield se comunica com o arduino através de uma porta serial virtual criada pela biblioteca SoftwareSerial nos pinos D2 e D3, porém por alguma razão o shield não consegue usar o pino D2 do Mega para isso. Note que o shield tem previsão para usar a porta serial “real” em D0 e D1, mas isso conflitaria com a comunicação do Arduino com a porta USB. Só dá para usar a porta serial real em situações bem controladas.
Procedimento básico de teste
—————————-————————————————————-
GSM Shield testing.
status=READY
TEST
status=ATTACHED
189.119.98.144
Number of data received:
0
Data received:
HTTP/1.0 302 Found
Location: http://www.google.com.br/
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Set-Cookie: PREF=ID=88974c4a4ce7d358:FF=0:TM=1356638512:LM=1356638512:S=7ZrafKBfjFkjdNiU; expires=Sat, 27-Dec-2014 20:01:52 GMT; path=/; domain=.google.com
Set-Cookie: NID=67=M3yKlvZcLBDQf7zPokAkH8yuKfs6g3sugEclhXF3xOXadcRkBrcIwYXLk_9iCdHZys6DcFwP20NDYU3VMzoidFGJJyP3cfirxhaw63ly4wdRWOOdfLi4fBUcCRYe8Ec5; expires=Fri, 28-Jun-2013 20:01:52 GMT; path=/; domain=.google.com; HttpOnly
P3P: CP=”This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info.”
Date: Thu, 27 Dec 2012 20:01:52 GMT
Server: gws
Content-Length: 222
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
<HTML><HEAD><meta http-equiv=”content-type” content=”text/html;charset=utf-8″>
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF=”http://www.google.com.br/”>here</A>.
</BODY></HTML>
CLOSED
——————————————————————————–
Para enviar SMS
Cuidado! Certifique-se de usar um chip de uma operadora que cobre barato por SMS enviado, como o TIM Infinity. Durante os testes você pode acabar enviando, às vezes sem saber, muitas mensagens.
Rode o exemplo GSMSHIELD->GSM_GPRSLibrary_SMS. Nos meus testes só funcionou quando eu mudei a seguinte linha:
if (gsm.begin(2400)){
para
if (gsm.begin(4800)){
Por default, o sketch apenas vai listar as mensagens contidas no chip. Se você quiser enviar um SMS toda vez que o arduino for inicializado, descomente as seguintes linhas:
// if (sms.SendSMS(“34567890”, “Arduino SMS”))
// Serial.println(“\nSMS sent OK”);
Trocando 34567890 pelo número do telefone que vai receber o SMS.
Display
O módulo suporta o encaixa direto de módulos display Nokia 5110 (vendido separadamente) que tenham o seguinte pinout:
A ordem dos pinos de 3 a 7 (destacados em verde) não é realmente importante, porque em geral você pode escolher isso no sketch. Mas a posição dos pinos 1, 2 e 8 precisa ser como indicado.
Notar que, para economizar pinos, o pino 8 é permanentemente conectado a +VCC, por isso o sketch não poderá controlar o acendimento do backlight. Por um lado isso gera um problema de consumo, mas por outro, supostamente o display só deve ser conectado quando você estiver debugando o projeto.
Você pode usar, entre outras, a biblioteca LCD5110_Graph
Outras fontes de informação
As páginas seguintes tratam de shields diferentes, mas cada uma delas tem informação interessante, que não encontrei na página oficial, incluindo exemplos GPRS
Módulo slave
Módulo Master
Para entender o propósito e aplicação desses módulos, é preciso assimilar o seguinte:
* No mundo do PC, aprendemos a chamar isso pelo nome genérico de “RS232”, que não está inteiramente certo nesse caso. “UART” é um termo genérico mais apropriado quando descemos ao nível dos microcontroladores.
Funcionamento do módulo master
É preciso prestar atenção ao LED:
Uma vez que o master não tenha registro de já ter sido pareado com um slave, o pareamento ocorrerá automaticamente quando um slave for ligado no alcance dele. Ele sempre lembrará desse slave pelo seu endereço MAC e não pareará com nenhum outro que apareça, a não ser que se aperte o botão, que apagará o MAC gravado (você pensou que o botão servia para parear, né? Eu também!).
Funcionamento do módulo slave
Uso no PC
Você pode usar tanto o master quanto o slave no PC, desde que use um adaptador USB-serial (TTL) ou algo do gênero. A vantagem de usar esses módulos no PC é que o computador nem precisa saber o que é BT, livrando você de se envolver com configurações do stack, pareamento, etc. Nada de mexer com Bluesoleil ou com o stack padrão do Windows. Só é preciso instalar o driver do adaptador que você escolheu, que vai criar uma porta serial que você vai usar.
Leia também: Notas sobre a comunicação com o Android


Este sensor não requer arduino ou outro microcontrolador para ser usado. Por exemplo, ele pode ser conectado diretamente a qualquer uma das entradas dos módulos de relês que ofereço. Mas é claro que se algum condicionamento do sinal for necessário (um retardo, por exemplo), o arduino torna-se util.


Este sensor usa o mesmo elemento de detecção, MQ-2, do modelo analógico, mas opera de maneira diferente. Neste modelo o trimpot é multivoltas e se destina a ajustar o ponto de gatilho da saída digital, não tendo qualquer interferência sobre a saída analógica.
Atenção: Eu não me responsabilizo pela eficiência deste sensor nem pelo resultado de quaisquer testes malucos que alguém venha a fazer para comprová-la. Não brinque com gases inflamáveis sem a assistência de um especialista. Se você não entende 100% do que está escrito nos datasheets (eu não entendo) então você precisa de orientação profissional para colocar esse sensor em uma aplicação séria. Considere tudo o que eu escrevo aqui como dicas amadoras apenas.
Para ter uma idéia da dificuldade envolvida, notar que os datasheets mostram gráficos de sensibilidade relativos a uma concentração de 1000ppm de hidrogênio, mas na nossa atmosfera a concentração não passa de 1ppm.


Confira os datasheets do sensor MQ-2 aqui e aqui (são diferentes)
Segundo o datasheet, é capaz de detectar fumaça, GLP (gás de cozinha), butano, propano (são os dois gases presentes no GLP), metano, hidrogênio e alcool.
Este sensor depende do aquecimento de um elemento interno para operar. Isso precisa ser levado em conta nos testes e, principalmente, na utilização. Por exemplo, é necessário que o seu programa conte um tempo desde o início da execução, quando uma leitura elevada do sensor deverá ser ignorada. Em caso de falta de energia o sensor irá esfriar e quando a energia voltar haverá um falso alarme se isso não for levado em conta.
Testes básicos de funcionamento
Você nem precisa do arduino para testar este sensor. Um multímetro na escala de tensão é perfeitamente capaz de exibir as variações na saída analógica.
Sketch de teste
const int analogInPin = A0;
int sensorValue = 0;
int outputValue = 0;
void setup() {
Serial.begin(9600);
}
void loop() {
sensorValue = analogRead(analogInPin);
Serial.print("sensor em A0 = " );
Serial.println(sensorValue);
delay(500);
}
Alimente o sensor com +5V e a saída à entrada analógica A0. Monitore o valor usando o serial monitor.
Gire o trimpot inteiramente no sentido anti-horário para máxima sensibilidade.
Aguarde um minuto até que a leitura estabilize.
Você verá o valor presente na porta serial ir diminuindo.
Detecção de GLP
Coloque o sensor dentro de um copo.
Aponte um isqueiro para o fundo do copo e acione-o por uma fração de segundo (sem a chama – só queremos o gás). Você deverá ver a leitura dar um salto grande.Por exemplo, se estiver estabilizada em 300, a leitura vai saltar para mais de 700. Em seguida voltará ao normal vagarosamente.
Detecção de Alcool
Coloque a “cabeça” do sensor na boca de uma garrafa de alcool aberta. A leitura deverá saltar.
Comentários