Módulo GPS Skylab SKM53

GPS_Skylab_SKM53_IMG_1166_640_automalabs.com.br

Este módulo opera com 5V e assim que é energizado começa a transmitir coordenadas no pino TXD (mas só serão válidas após o tempo de fix) , repetindo a cada 1s. A baudrate é 9600bps. O pino RXD só tem utilidade se você quiser reconfigurar o módulo, por isso você pode deixá-lo desconectado.

Teste básico

(não requer que o GPS esteja vendo satélites)

No Arduino Mega

Atenção: qualquer exemplo que você pegar na internet que use a biblioteca Newsoftserial poderá não funcionar no Mega. Nesse modelo de arduino, use as portas seriais reais.

Ligue o TXD do GPS no pino RX1 do Mega

Rode o sketch (não é preciso mudar nada) Examples -> Communication -> MultiserialMega

Algo assim deve aparecer no Serial Monitor (repete-se a cada 1s):

No Arduino UNO

Instale a biblioteca NewSoftSerial

Ligue o TXD do GPS no pino 2 do Arduino.

Rode o seguinte sketch, ligeiramente adaptado do exemplo TwoPortReceive

#include <SoftwareSerial.h>
SoftwareSerial portOne(2,3);

void setup()
{
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
// Start each software serial port
portOne.begin(9600);
}

void loop()
{
// By default, the last intialized port is listening.
// when you want to listen on a port, explicitly select it:
portOne.listen();
Serial.println("Recebido do GPS:");
// while there is data coming in, read it
// and send to the hardware serial port:
while (portOne.available() &gt; 0) {
char inByte = portOne.read();
Serial.write(inByte);
}

delay(1000);
Serial.println("");
Serial.println("");
}

Algo assim deve aparecer no Serial Monitor (repete-se a cada 1s):


Teste completo

Não faça este teste se sua instalação não tiver passado ainda no teste básico.

Neste teste o GPS precisa ver os satélites. Para isso você precisa estar num local que tenha visão direta para o céu e o lado da antena do GPS precisa estar voltado para cima.

Em um Arduino UNO

Instale a biblioteca TinyGPS (documentação e download da v13). Requer NewsoftSerial.

Conecte o TXD do GPS ao pino 4 do UNO.

Carregue o exemplo Examples -> TinyGPS -> test_with_gps_device

Mude a linha

ss.begin(4800);

para

ss.begin(9600);

Faça o upload do sketch.

Em um Arduino Mega

Instale a biblioteca TinyGPS (documentação e download da v13).

Conecte o TXD do GPS a RX1 do Mega.

Atenção: Os exemplos do TinyGPS usam a biblioteca Newsoftserial, que tem certos problemas para funcionar no Mega. Por isso eu fiz ligeiras modificações no exemplo para usar uma porta serial real do Mega.

Faça o upload do seguinte sketch:


#include <TinyGPS.h>

/* Exemplo test_with_gps_device modificado para usar a porta serial 1
do Arduino Mega.
Jefferson Ryan - Automalabs - 13/10/2013
*/

TinyGPS gps;

static void smartdelay(unsigned long ms);
static void print_float(float val, float invalid, int len, int prec);
static void print_int(unsigned long val, unsigned long invalid, int len);
static void print_date(TinyGPS &gps);
static void print_str(const char *str, int len);

void setup()
{
Serial.begin(115200);
Serial1.begin(9600);

Serial.print("Testing TinyGPS library v. ");
Serial.println(TinyGPS::library_version());
Serial.println("by Mikal Hart");
Serial.println();
Serial.println("Sats HDOP Latitude  Longitude  Fix  Date       Time     Date Alt    Course Speed Card  Distance Course Card  Chars Sentences Checksum");
Serial.println("          (deg)     (deg)      Age                      Age  (m)    --- from GPS ----  ---- to London  ----  RX    RX        Fail");
Serial.println("-------------------------------------------------------------------------------------------------------------------------------------");

}

void loop()
{
float flat, flon;
unsigned long age, date, time, chars = 0;
unsigned short sentences = 0, failed = 0;
static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;

print_int(gps.satellites(), TinyGPS::GPS_INVALID_SATELLITES, 5);
print_int(gps.hdop(), TinyGPS::GPS_INVALID_HDOP, 5);
gps.f_get_position(&flat, &flon, &age);
print_float(flat, TinyGPS::GPS_INVALID_F_ANGLE, 10, 6);
print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 11, 6);
print_int(age, TinyGPS::GPS_INVALID_AGE, 5);
print_date(gps);
print_float(gps.f_altitude(), TinyGPS::GPS_INVALID_F_ALTITUDE, 7, 2);
print_float(gps.f_course(), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);
print_float(gps.f_speed_kmph(), TinyGPS::GPS_INVALID_F_SPEED, 6, 2);
print_str(gps.f_course() == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(gps.f_course()), 6);
print_int(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0xFFFFFFFF : (unsigned long)TinyGPS::distance_between(flat, flon, LONDON_LAT, LONDON_LON) / 1000, 0xFFFFFFFF, 9);
print_float(flat == TinyGPS::GPS_INVALID_F_ANGLE ? TinyGPS::GPS_INVALID_F_ANGLE : TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);
print_str(flat == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON)), 6);

gps.stats(&chars, &sentences, &failed);
print_int(chars, 0xFFFFFFFF, 6);
print_int(sentences, 0xFFFFFFFF, 10);
print_int(failed, 0xFFFFFFFF, 9);
Serial.println();

smartdelay(1000);
}

static void smartdelay(unsigned long ms)
{
unsigned long start = millis();
do
{
while (Serial1.available())
gps.encode(Serial1.read());
} while (millis() - start < ms);
}

static void print_float(float val, float invalid, int len, int prec)
{
if (val == invalid)
{
while (len-- > 1)
Serial.print('*');
Serial.print(' ');
}
else
{
Serial.print(val, prec);
int vi = abs((int)val);
int flen = prec + (val < 0.0 ? 2 : 1); // . and -
flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
for (int i=flen; i<len; ++i)
Serial.print(' ');
}
smartdelay(0);
}

static void print_int(unsigned long val, unsigned long invalid, int len)
{
char sz[32];
if (val == invalid)
strcpy(sz, "*******");
else
sprintf(sz, "%ld", val);
sz[len] = 0;
for (int i=strlen(sz); i<len; ++i)
sz[i] = ' ';
if (len > 0)
sz[len-1] = ' ';
Serial.print(sz);
smartdelay(0);
}

static void print_date(TinyGPS &gps)
{
int year;
byte month, day, hour, minute, second, hundredths;
unsigned long age;
gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
if (age == TinyGPS::GPS_INVALID_AGE)
Serial.print("********** ******** ");
else
{
char sz[32];
sprintf(sz, "%02d/%02d/%02d %02d:%02d:%02d ",
month, day, year, hour, minute, second);
Serial.print(sz);
}
print_int(age, TinyGPS::GPS_INVALID_AGE, 5);
smartdelay(0);
}

static void print_str(const char *str, int len)
{
int slen = strlen(str);
for (int i=0; i<len; ++i)
Serial.print(i<slen ? str[i] : ' ');
smartdelay(0);
}

Se seu GPS estiver enxergando os satélites, a saída será parecida com isto (eu dividi em duas partes porque não cabia na tela e alterei as coordenadas por privacidade):

Se seu GPS não estiver enxergando os satélites, a saída de TinyGPS será parecida com isto (eu dividi em duas partes porque não cabia na tela):

Note que o valor de Chars RX está incrementando em passos fixos (no caso, 136). Isso siginifica que a biblioteca está recebendo dados do GPS, mas não há coordenadas válidas nesses dados. Se Chars RX não estiver incrementando verfique todas as conexões.

Se você realmente precisar reconfigurar esse GPS, o documento MTK NMEA Packet User Manual (link para download no fim do texto) pode ser o que você precisa. Eu não testei, não aconselho seu uso e não dou garantias. Se você mexer nas configurações considere minha garantia finalizada. Estou fornecendo o arquivo apenas para sua conveniência.

Datasheet do Módulo GPS Skylabs SKM53
Datasheet do Módulo GPS Skylabs SKM53
SkyNav_SKM53_Datasheet.pdf
392.3 KiB
955 Downloads
Detalhes...
MTK NMEA Packet User Manual
MTK NMEA Packet User Manual
PMTK_Protocol.pdf
77.4 KiB
612 Downloads
Detalhes...

Mensagem “Verification error, content mismatch” ao tentar gravar um sketch

Se isso acontecer com você, experimente gravar novamente o bootloader. Eu testei e o problema foi resolvido imediatamente.

Diferenças entre as diversas versões do Arduino

Em poder de processamento um Arduino UNO e um Mega2560 não são muito diferentes. Ambos rodam com o mesmo clock de 16Mhz. Porém além da quantidade de I/O existem duas diferenças significativas:

  • O Mega tem uma flash muito maior, que fará diferença se seus sketches forem grandes. Porém esse é um problema menor porque a limitada quantidade de I/O do UNO difiilmente vai permitir que seu sketch cresça até um ponto que exceda os 32kB do UNO;
  • O Mega tem 4x a quantidade de RAM, o que faz diferença mesmo em projetos muito pequenos, dependendo do que você precisa fazer. Por exemplo, em um projeto que envolva criar um webserver os 2k de RAM do UNO podem atrapalhar bastante a sua criatividade. E um projeto que envolva emular os sinais de um controle remoto de TV você pode ficar impedido de ter todos os botões armazenados em variáveis ao mesmo tempo. Por exemplo, digamos que cada botão requeira uma matriz de 32 bytes (isso é normal). Um único remoto com 20 botões iria requerer 640 bytes da preciosa RAM. Você ainda pode usar um UNO em um projeto desse tipo, mas deve evitar querer controlar todas as funções de todos os aparelhos do seu rack a menos que encontre um meio que use menos RAM.

Esta tabela de de arduino-tutorials ajuda muito como referência das diferenças físicas entre as placas.

arduino-board-comparison-chart

Do ponto de vista educacional existe ainda algumas diferença que considero significativas:

  • um UNO por usar um uC DIP soquetado pode ser consertado com muito mais facilidade e mais barato que um Mega. Então se existe a possibilidade de que erros catastróficos sejam cometidos, como por exemplo ligar 12V em um dos pinos de I/O, um UNO representa uma melhor escolha que um Mega;
  • A maioria esmagadora dos exemplos que você encontra na Internet são feitos para o Uno mas existem ligeiras diferenças entre Uno e Mega que podem fazer muitos desses exemplos não funcionarem no Mega sem algumas modificações. Por exemplo, temos os problemas com a biblioteca NewsoftSerial e a diferença na localização dos pinos de i2C.

Dicas sobre o acesso ao Arduino pela internet

Isto não é um tutorial. Meu objetivo aqui é apenas listar algumas coisas que você tem que ter em mente antes de quebrar a cabeça tentando acessar seu projeto pela internet.

  • O endereço IP de acesso ao seu projeto quando você se conecta de fora da sua casa não é o mesmo que você usa para conexão dentro de sua casa. Você precisa encontrar meios de saber seu IP externo. E esse IP muda a cada vez que seu modem for reiniciado a não ser que você tenha pago ao provedor por IP fixo (geralmente, só em empresas);
  • Testar o acesso externo de dentro de sua própria rede geralmente não funciona. Mesmo usando o IP externo, você não consegue acesso. Você pode até testar de dentro do mesmo recinto, mas tem que usar outra conexão completamente distinta (um acesso 3G, por exemplo). Alternativamente peça a um amigo que mora em outra casa (e que nao compartilha internet com você) para fazer o teste;
  • Você precisa se familiarizar com o conceito de “portas de rede” e “encaminhamento de portas” (port forwarding). Sem entender o que é isso você pode até conseguir fazer seguindo cegamente algum tutorial, mas se qualquer coisa der errado você não vai saber resolver;
  • Você precisa encaminhar as portas de que precisa em todos os roteadores no caminho até o arduino. Isso vale para o modem ADSL, se for roteado (para modem bridge não é necessário);
  • O procedimento de encaminhamento é diferente em cada modem e roteador existente, por isso não faz sentido eu tentar explicar aqui. O que você deve fazer é anotar os modelos de cada um de seus roteadores e pesquisar na internet (se não estiver no manual) como se faz o encaminhamento neles.
  • Internet compartilhada é dor de cabeça. Se você divide internet com alguém e não tem acesso livre ao modem, vai ter dificuldade para fazer esse encaminhamento;
  • Internet via rádio é internet compartilhada. E nessa só quem tem acesso ao modem é o provedor. Sem a colaboração dele seu projeto não vai funcionar. Mas dependendo do indivíduo, você pode conseguir com ele o encaminhamento de uma série de portas para você. Existem mais de 65 mil portas disponíveis em um conexão e qualquer provedor pode perfeitamente reservar umas 10 para cada cliente. Muitos pode reservar 100. Não é uma situação ideal, porque se isso não fizer parte do pacote de serviços padrão desse provedor qualquer mudança que ele faça na rede dele pode fazer o encaminhamento deixar de funcionar e você terá que ligar para o suporte pedindo a reconfiguração. O provedor também pode não ser capaz de reservar para você exatamente as portas que você quer. Aproveite o fato de que na maioria dos casos é possível escolher com facilidade a porta no sketch.
  • A porta aberta para a internet não precisa necessariamente ser a mesma que o seu projeto usa, mas isso depende do roteador que você tem, pois em muitos a porta externa precisa ser igual à interna. Aproveite o fato de que você sempre pode definir a porta em seu projeto

Módulo Display LCD alfanumérico 2004 / 20×4 (20 caracteres, quatro linhas)

Para maiores detalhes, veja a página sobre o display 16×2. O funcionamento é o mesmo.

Módulo Display LCD alfanumérico 1602 / 16×2 (16 caracteres, duas linhas)

Modulo_LCD_1602_aceso_85

Na foto abaixo existe uma película plástica de proteção na frente do display.

Modulo_LCD_1602_IMG_0893_640_85 Modulo_LCD_1602_IMG_0895_640_85

Compatível com padrão Hitachi HD44780 (o padrão mais usado no mundo).

Os 16 pinos são distribuídos mais ou menos assim:

  • 2 para alimentação geral;
  • 2 para alimentação do backlight;
  • 1 para contraste;
  • 11 para comunicação (8 bits + 3 de controle).

Usando o display no modo de 4 bits, “apenas” 7 pinos são necessários. O arduino tem um microcontrolador suficientemente rápido para que você possa e deva usar o modo de 4 bits.

Mas fique atento: se estiver usando um Arduino UNO só o uso desse display já comprometerá boa parte do I/O do arduino. Se você precisar de algo que consuma menos i/O, confira meus itens i2C. Com eles você “gasta” no máximo dois pinos do arduino.

Este display precisa ser inicializado para funcionar. Se você só estiver vendo um monte de quadrados brancos na primeira linha e nada na segunda, o display está alimentado mas não foi corretamente incializado ainda. Verifique seu programa e as conexões.

O backlight do display precisa estar aceso. É ele que dá a cor branca dos caracteres. Você precisa ligar o Backlight a +5V através de um resistor. Pode ser um de 380R. Não ligue o backlight sem o resistor.

Este display requer a conexão de um potenciômetro ou trimpot externo para ajuste do contraste ou o controle através de PWM.

Potenciômetros, trimpots e resistores são itens vendidos separadamente.

Roteador wi-fi portátil com modo cliente.

roteador_wifi_cliente_IMG_1660_automalabs.com.br

Com este roteador você pode transformar qualquer dispositivo que tenha uma conexão de rede por cabo em um aparelho Wi-Fi. Seja o arduino, uma TV, um Media Player… qualquer coisa.

Shields Wi-Fi para o arduino sofrem, na minha opinião, dos seguintes problemas:

  • São caríssimos;
  • Exigem programação específica. Você não pode pegar o seu projeto que já opera em rede e simplesmente transformar em Wi-Fi
  • Você programa às cegas. Não existe uma GUI onde você possa localizar redes disponíveis e fazer diagnóstico;

Tendo isso em mente eu saí procurando alternativas e essa é a melhor que encontrei. Eu vendo o kit roteador + shield ethernet mais barato do que você normalmente encontra por aí o shield Wi-Fi e você ainda tem mais vantagens:

  • Você não precisa mexer em nada no seu projeto. Basta configurar o roteador usando um computador e um browser e depois plugar no conector de rede;
  • O diagnóstico fica mais simples. Deixou de funcionar? Você pode desplugar o roteador e testar o seu projeto com fio;
  • Se algo der defeito, é mais barata a reposição. Ou você trocará o shield ethernet ou o roteador;
  • O roteador (que é também a antena) pode ficar até 100m do seu projeto, via cabo de rede. Você pode posicioná-lo exatamente onde houver melhor sinal. Você até pode, usando un shield, esticar o cabo da antena. Mas isso gera perdas que muitas vezes não compensam o reposicionamento da antena. Como regra geral, quanto mais curto o cabo da antena, melhor;

 

roteador_wifi_cliente_IMG_1661_automalabs.com.br

roteador_wifi_cliente_IMG_1663_automalabs.com.br

roteador_wifi_cliente_IMG_1664_automalabs.com.br

roteador_wifi_cliente_IMG_1666_automalabs.com.br

roteador_wifi_cliente_IMG_1670_automalabs.com.br

Clip bateria 9V.

O plug é o mesmo usado no Arduino.

Clip_Bateria_9V_IMG_0994_automalabs.com.br

Kit Pan Tilt 9g.

Este kit usa dois micro servo motores 9g. É capaz de movimentar objetos leves, como pequenas câmeras.

Kit_Pan_Tilt_9g_IMG_0978_automalabs.com.br

Braço robótico

Este kit é composto de três servo motores, uma garra, duas peças de alumínio, parafusos e um micro rolamento.

Um dos motores abre e fecha a garra. Os outros dois fazem a movimentação.

Braco_Robotico_DSC00647_automalabs.com.br

Braco_Robotico_DSC00648B_automalabs.com.br