Régóta szeretnék már Arduino-val Mikrotik API-t piszkálni, de sajnos még nem találtam rá megoldást. Láttam 1-2 videót, ahol bizonyos adatokat olvasnak ki Mikrotikből, de sajnos nulla vagy közel nulla dokumentáció van hozzájuk. A leghasznosabb forrást itt találtam, de ez közel sem volt elég a művelethez: http://forum.arduino.cc/index.php?topic=165567.0 .
Ami szükséges a mókához (a Routerboardot kivéve minden párszáz Forintért megvehető eBay-en):
- USB (vagy sima soros) portros Routerboard (vagy PC-re telepített Mikrotik)
- FTDI FD232 USB->soros átalakító
- 2×16-os I2C buszos LCD kijelző
- Arduino Uno (vagy hasonló)
…vagy egy Arduino Nano, amire a soros chip integrálva van, így egy kütyüvel kevesebb. Abból épp nincs itthon.
Előkészületek a Mikrotikben:
- „System”/”Packages” -ben hozzá kell adni az LCD csomagot, ami letölthető a Mikrotik.com oldalról, „extra packages” néven.
- Csatlakoztassuk az FTDI modult az USB porthoz
- A „System”/”Ports” alatt ellenőrizzük, hogy megjelent-e a modul (az alapértelmezett beállítások jók):
- „System”/”LCD” -ben nyissuk meg az „LCD Settings”-t és válasszuk a „ax93304” típust az USB porton és engedélyezzük
- Az „LCD Pages” ablakban engedélyezzük a minket érdeklő infók kijelzését
Arduino előkészületek:
- I2C LCD plugin https://github.com/marcoschwartz/LiquidCrystal_I2C
Vezetékelés:
FTDI232 USB <-> Routerboard USB
FTDI232 TX <-> Arduino Uno D10
FTDI232 RX <-> Arduino Uno D11
FTDI232 GND <-> Arduino Uno GND
LCD VCC <-> Arduino Uno 5V
LCD GND <-> Arduino Uno GND
LCD SCA <-> Arduino Uno A4
LCD SCL <-> Arduino Uno A5
Arduino kód ( .ino ):
Ez még kissé szedett-vetett, mert sok próbálkozás van már benne, vannak benne felesleges részek bőven és nélkülözi a szakértelmet 🙂 Az eredeti kód megtalálható itt: http://forum.arduino.cc/index.php?topic=165567.0
/*
Modified code by:
Jozsef Takacs
25-07-2016
Original source from:
Hugo Santos
04-05-2012
hugo.santos@i9box.net
http://forum.arduino.cc/index.php?topic=165567.0
*/
#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27,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(0,0);//Collum 3, Row 1
lcd.print(name);
}
void findMarker()
{
byte tester;
while(1)
{
if(mikrotik.available()>0)
{
tester = mikrotik.read();
}
if(tester != 0xfe)break; //Means de marker : has been found
if(tester != 0x02)break; //Means de marker : has been found
if(tester != 0x04)break; //Means de marker : has been found
}
}
void storeData()
{
uint8_t i =0;
uint8_t j =0;
byte temp;
buffer[0] = '\0';
findMarker();
while(1)
{
if(mikrotik.available()>0)
{
temp = mikrotik.read();
if ( j >= 0) {
if ( temp == 0x02 ) {
Serial.println( "New page" );
}
else if (j > 61) {
//Serial.print( " " );
}
else {
buffer[i++] = temp;
buffer[i] = '\0';
}
}
j++;
if ( j >= 63 ) {
break;
}
}
}
Serial.println(buffer);
lcd.print(buffer);
}
A kész projekt:
Az eredeti videó, ami alapján készült a projekt: