eMag

marți, 25 ianuarie 2011

Arduino + 2xDS18B20 + un adaptor RS232-TTL + o camera de supraveghere MOBOTIX M10 + un server linux

 Va spuneam in postul anterior, cel in care am vorbit despre DS18B20, ca am sa va povestesc ce am facut in combinatia Arduino + 2xDS18B20 + un adaptor RS232-TTL + o camera de supraveghere
MOBOTIX M10 + un server linux.
 Camera Mobotix M10D Secure este o camera de supraveghere profesionala cu 2 ocbiective,
kernel linux si ce ne intereseaza pe noi, are un port serial RS232.
 Pe undeva prin paginile de configurare ale camerei se gaseste un terminal pt portul serial, web-based.
 Ce ma intriga pe mine era faptul ca acest la port serial (si probabil ceva scripturi din camera)
se poate conecta o statie meteo (de fapt sunt 3 modele compatibile), pretul acestor statii este oarecum
prohibit pt mine, cea mai ieftina costand mai bine de 400 euro.
 Am zis eu ca nu este imposibil sa fac eu o "statie meteo" care sa comunice cu camera folosind un protocol
comun, nu ceva complicat, vroiam doar sa primesc pe terminal-ul camerei informatia bruta de genul
18C 15m/s SE.
 Era mult mai simplu daca aveam acces SSH la camera, dar cei de la MOBOTIX au avut grija sa limiteze
aceasta posibilitate.
 De ce am vrut neaparat sa intervina camera in toata aceasta poveste ? pai este simplu..... camera este afara
undeva, conectata la internet sau la o retea locala, alimentata POE, si eu vreau sa vad care este temperatura
din locul monitorizat.
 Pe Arduino am pus un Sketch care foloseste OneWire.h si DalassTemperadure.h, librarii despre care
am vorbit in posturile anterioare.

#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into pin 2 on the Arduino
#define ONE_WIRE_BUS 6
int incomingByte;
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

void setup()
{
  // start serial port
  Serial.begin(9600);

  // Start up the library
  sensors.begin();
  
}


void loop(){
 if (Serial.available() > 0) {
  incomingByte = Serial.read();
  if (incomingByte==84nd) {
  // call sensors.requestTemperatures() to issue a global temperature
  // request to all devices on the bus
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.print("RAW");
  Serial.print(" Indoor: ");
  Serial.print(sensors.getTempCByIndex(0)); // Why "byIndex"? You can have more than one IC on the same bus. 0 refers to the first IC on the wire
  Serial.print(" Outdoor: ");
  Serial.println(sensors.getTempCByIndex(1));
  } 
}
 
}

Reteaua 1wire este conectata la pinul 6.
Arduino asteapta pe serial caracterul "T" (asci 84), daca primeste acest caracter interogheaza senzorii
(sunt mai multi ) si trimite raspunsurile pe serial folisind ByIndex (interesanta si utila implementare) pentru a
diferentia fiecare senzor.

 RX-ul si TX-ul lui Arduino sunt legate la portul serial al camerei Mobotix bineinteles folosind un convertor
 TTL la RS232 cu MAX232, 5 condensatori, realizat pe o placa de test,gasiti aici o schema testata,
deja montata ca shield la Arduino (nu am poze dar revin asupra subiectului). arduino se alimenteaza cu 5V
de la POE-ul camerei.
 Dar cine trimite caracterul T pe terminalul camerei ?
 Un server linux pe care am pus o serie de scripturi:
Primul dintre ele!

#!/bin/sh

python /home/cristian/pachube_mobo/read_serial.py&

curl -s -d "send=T&buttonSubmit=submit" http://user:pass@192.168.2.244/admin/rs232term?Update=fulltext | grep nooutput

curl -s http://user:pass@192.168.2.244/admin/rs232term?Update=fulltext | grep RAW  > /home/cristian/pachube_mobo/temp.txt

curl -s http://user:pass@192.168.2.244/admin/rs232term?delbuffer | grep nooutput

Scriptul de .py are legadura cu pachube.com, el pune datele pe feed-urile respective,
mai multe detalii legate de libraria eeml gasiti aici.

Din prima linie se vede ca ea trimite caracterul "T" pe treminalul camerei, implicit catre Arduino
A doua linie descarca bufferul camerei cauta secventa "RAW" si scrie informatia in vifierul temp.txt
A treia linie sterge bufferul serial al camerei.

Scriptul asta este lansat la fiecare 5 minute de catre o aplicatie linux care face grafice se numeste CACTI
este pe baze RRD. De fapt CACTI nu lanseaza direct scriptul ci face un snmpwalk si OID-ul corespunzator
lanseaza scriptul.
E destul de "inbarligata" treaba.
In final am 2 grafice, unul pe serverul de linux si unul pe pachube.com

Continuare..................

Un comentariu: