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..................

vineri, 7 ianuarie 2011

Arduino 1wire si DS18B20

   Asa cum spuneam in postul anterior, ne vom ocupa de o retea de senzori de temperatura Dallas DS18B20.
   Care este avantajul utilizarii acestui tip de senzori ?
- Utilizeaza numai doi conectori pentru alimentare si DATA.
- Adresabila in retea pe baza unui identificator.
- Precalibrati
- range -55 +125 °C
- acuratete  ±0.5 °C

   De ce sa facem o retea de senzori de temperatura ? nu ajunge unul ?

   Pentru unele aplicatii este posibil sa fie suficient un singur senzor, in anumite situatii mai multi sunt mai buni... :)
   Daca dorim sa urmarim temperatura de afara, temperadura din casa si temperatura din camera unde avem cazanul centralei termice....
   Daca avem 2 rack-uri cu echipamente trebuie sa le monitorizam ....

   Va spuneam ca daca vrem alimentare parizita nu trebuie sa lasam in aer, mai jos variantele corecte pentru conectare.

 Conectarea in mod nonparazit
 Conectarea parazita a unui singur DS18B20
 Retea cu alimentare parazita

  Asadar folosind un singur pin digital al Arduino putem conecta mai multi senzori!!!
  Personal utilizez libraria OneWire si Dallas Temperature Control Library dar exista mai multe implementari al protocolului.
Un exemplu de cod:
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into pin 2 on the Arduino
#define ONE_WIRE_BUS 2

// 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(void)
{
  // start serial port
  Serial.begin(9600);
  Serial.println("Dallas Temperature IC Control Library Demo");

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


void loop(void)
{ 
  // call sensors.requestTemperatures() to issue a global temperature 
  // request to all devices on the bus
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.println("DONE");
  
  Serial.print("Temperature for Device 1 is: ");
  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
  
}


Daca punem doi senzori trebuie sa adaugam

Serial.print(sensors.getTempCByIndex(1)) si trebuiesc facute toate modificarile pentru "print"-ul textului preambul....

"Temperature for Device 2 is: " .... bla.... bla.


Cam asta este, faceti cateva experimente.

Puteti face o sumedenie de proiecte .... in posturile urmatoare am sa va spun ce am facut eu cu Arduino + 2xDS18B20 + un adaptor RS232-TTL + o camera de supraveghere MOBOTIX M10 + un server linux (cam multe dar proiectul a iesit bine)

luni, 3 ianuarie 2011

Arduino, comunicatii Serial si 1wire

Introducere: Protocoale de comunicatii Atmega328

   Vom lua ca exemplu Arduino Duemilanove, "dotat" cu Atmega 328.
   Hardware suporta urmatoarele protocoale de comunicatii: Serial ( TX, RX),  SPI (SS, MOSI, MISO, SCK), I2C (SDA, SCL) ..... Toate cele enumerate mai sus sunt comunicatii seriale, adica, transferul informatiei are loc bit cu bit.
   Portul serial este folosit si de USB asa ca atunci cand aveti ceva conectat la pinii TX, RX, este posibil sa primiti erori in timpul uplodarii unui sketch (program).

Protocolul 1wire

   Exista o implementare software a protocolului 1wire, protocol pe care eu il consider "the best".
   Device-urile ce folosesc acest protocol sunt facute aproape 100% de Dallas. Acestea au un identificator unic dupa care se pot accesa in "retea". O retea 1wire este ca un raft cu haine, hainele reprezentand device-urile retelei, atunci cand cautam o bluza sa spunem ne uitam in raft dupa culoarea si modelui ei. cam asa functioneaza si identificatorul 1wire. (asta a fost o explicatie empirica scoasa pe moment)
   Marele avantaj este ca folosind acest protocol avem nevoie de numai 2 fire ( conductori) atat pentru alimentarea retelei cat si pentru date.
   De fapt alimentarea poate face in 2 moduri nonparazit si parazit. La nonparazit se folosesc 3 fire +5V GND si    DIGITAL in modul parazit alimentarea +5V vine pe acelasi conductor cu Digital.
   Am vazut multe tutoriale pe web in care la alimentarea parazita pinul Vcc al device-ului 1wire era lasat in aer, va spun din experienta ca apar probleme asa ca cel mai bine este sa-l conectati la GND.
   Exista scrisa o librarie OneWire Library  , utilizarea este foarte simpla, aveti si exemple in link-ul anterior.

1wire  Dallas Semiconductor

   Dallas Semiconductor ( Maxim-ic ) sunt cei care au dezvoltat aceasta tehnologie. Device-urile 1wire sunt de la senzori de temperatura pana la memorii ROM, EPROM.
  Cele mai intalnite in utilizarea langa Arduino sunt RTC-urile (Real Time Clock) si senzorii de temperatura.
  Aveti aici un link catre un tabel comparativ al senzorilor de temperatura oferiti de Maxim-ic, in principiu diferentele sunt legate de  rezolutie si precizie.
  Cei de la Maxim au dezvoltat si ceea ce se numeste iButton, sunt device-uri 1wire impachetate frumos in niste pastilute de metal asemanatoare unor nasturi, si au diverse utilizari.
  In postul urmator vom vedea cum facem o retea 1wire cu senzori de temperatura DS18B20