i9BOX Dev Center

Please login or register.

Login with username, password and session length
Advanced search  

News:

Bem Vindo

Author Topic: MikroTik + Arduino  (Read 4534 times)

admin

  • Administrator
  • Newbie
  • *****
  • Posts: 3
    • View Profile
MikroTik + Arduino
« on: May 06, 2013, 08:32:30 PM »

Estes dias estive uns tempitos a estudar a nova RouterBoard Mikrotik RB951G 2HnD para ver o que tem de novidades em termos de Hardware, nomeadamente da porta USB. Isto porque o meu velhinho RB750 não tem USB nativa.
Já permite ligar Pens 3G e depois fazer a partilha quer pela rede cablada ou pela Wireless de uma forma muito fácil. No entanto pensei cá para mim que mais poderia ligar nesta porta USB e ver o que mais esta RouterBoard nos oferecer. Para os olhares mais atentos existe um módulo LCD adicional que não vem com a RouterBoard por defeito, existem muitos mais módulos adicionais que não fazem parte da instalação por defeito e se o utilizador os desejar testar basta ir ao site oficial e fazer o download do zip clicando em All Packages na secção de Downloads do modelo que tem.
Para a minha RouterBoard RB951G 2HnD o link é:
http://download2.mikrotik.com/routeros/5.25/all_packages-mipsbe-5.25.zip
No final do download descompacte o zip e copie os módulos que quer testar para dentro do Mikrotik, podem usar o Winbox arrastando para lá na secção Files ou então usar qualquer cliente de FTP e transferir para lá. Para esta demonstração apenas necessita de lá colocar o módulo LCD e depois reiniciar a RouterBoard para que a instalação do módulo seja feita automaticamente.
Agora vamos ao que interessa. Basicamente a minha ideia foi ligar um conversor USB-Serial (FTDI232RL) à porta USB do Mikrotik e assim poder usar o módulo LCD para passar informação para fora do Mikrotik. Ele dispõe de imensas informações que podem ser vistas no LCD. Neste tutorial apenas vou demonstrar como retirar o System Identity e mostrar no LCD que se encontra conectado no Arduíno. Visto o Mikrotik usar Linux kernel versão 2.6.35, ele automaticamente instala o conversor FTDI e após estar conectado passa a aparecer uma nova porta Serial onde antes apenas listava Paralel que é uma porta Paralela que existe na própria PCB ao lado da JTAG da RouterBoard.

A configuração que tem de ser feita no módulo LCD no Winbox será como na imagem e o type tem de ser ax89063. A minha escolha para usar este é simples, como eu não fazia a mínima ideia de como a RouterBoard envia os Bytes fiz uso de um Logic Analizer da Saleae para “escutar” a comunicação e de todos os tipos listados este é sem dúvida o mais simples de usar. Basicamente a RouterBoard envia uma string dizendo:
 System Identity:                                                          HelloWorld

Como uma imagem vale mais que mil palavras

Nesta captura podemos observar a RouterBoard a enviar a trama de dados a cada 1 segundo que é personalizável dentro do Winbox na opção LCD, alterando na mensagem que querem enviar para o LCD.
Agora vamos ao programa.

Code: [Select]
#include <SoftwareSerial.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x20,20,4);  // set the LCD address to 0x20 for a 16 chars and 2 line display

SoftwareSerial mikrotik(10, 11); // RX, TX

bool validDataFound = false;
char buffer[100];

void setup() 
{
  Serial.begin(9600);
  mikrotik.begin(9600);
  lcd.init();
  lcd.backlight();
  writeLcd("Reading Mikrotik");
}

void loop()
{
  storeData();
  writeLcd(buffer);
}

void writeLcd(char * name)
{
  lcd.clear();
  lcd.setCursor(1,0);//Collum 1, Row 0
  lcd.print("Arduino + Mikrotik");
  lcd.setCursor(3,1);//Collum 3, Row 1
  lcd.print("Mikrotik name:");
  lcd.setCursor(3,2);//Collum 3, Row 2 
  lcd.print(name);
 
}

void findMarker()
{
  byte tester;
  while(1)
  {
   if(mikrotik.available()>0)
      {
        tester = mikrotik.read();
        Serial.write(tester);
      }
   if(tester == 0x3A)break; //Means de marker : has been found   
  }
}
 
void storeData()
{
 uint8_t i =0;
 byte temp;
 buffer[0] = '\0';
 findMarker(); 
 while(1)
 {
   if(mikrotik.available()>0)
   {
     temp = mikrotik.read();
     if(temp != 0x20 )
      {
       //Insert the byte on the char array
       validDataFound = true;
       buffer[i++] = temp;
       buffer[i] = '\0';
      }
     if(validDataFound == true && temp == 0x20)
      { 
       validDataFound = false;
       break;   
      }     
    }     
  }
Serial.println(buffer);
}

No meu caso fiz uso de um interface I2C para ligar o LCD de modo a simplificar o numero de fios necessários na breadboard.No entanto qualquer outro LCD pode ser usado bastando apenas remover a lib I2C e implementar no código usando o modelo que  desejar.
Esquema de ligação:




Para verem o funcionamento final podem ver aqui:
http://www.youtube.com/watch?v=OasP8sf4y6A
« Last Edit: December 25, 2013, 11:07:31 AM by admin »
Logged