eMag

duminică, 17 aprilie 2011

Arduino DIY - 10 USD

   Am "construit" un ARDUINO si sunt extrem de multumit de rezultat!!!
   Constructia este extrem de simpla si merita tot efortul, pretul final cred ca este sub 15 USD, in functie de cat de  multe sau cat de mult va place sa utilizati componente recuperate (eu sunt fan).
   
  Proiectul este cel de aici Arduino Single-Sided Serial Board (version 3) este destul de explicita prezentarea cu cateva exceptii,
1. in schema veti gasi o anume bobina L1 cu val 100uH, nu va chinuiti sa o cautati prin magazine pentru ca multi nici macar nu au auzit de asa ceva, in locul ei merge JUMPER (sarma).
2. in scema veti gasi un anume C9 cu valoare 10uF, este important, Condensator electrolitic NEPOLARIZAT, aceeasi problema, nu veti putea sa-l gasiti prea usor, asa ca aveti 2 variante.
      a. puneti un electrolitic polarizat cu + la GND adica invers fata de cum este normal, asta ii va scurta viata dar o sa mearga.
      b. asa cum am procedat si eu, 2 electrolitici de 22uF legati - la - si plusurile devin terminalele "condensatorului nepolarizat" eu am pus 2 SMD-uri si este OK.
3. nu stiu daca am gresit eu cand am printat pentru Toner Transfer (desi nu prea cred) dar conectorul DB9 este oarecum invers si a terbuit sa fac un "adaptor" in care sa inversez niste pini.
este posibil sa fie de la cablul meu serial, nu stiu daca e null-modem sau drept..... in fine. 

Am facut frumos cablajul.







   Am "plantat" componentele, care sunt putine si usor de identificat....
   Si a iesit...........





   Eu am pus un Atmega328 cumparat de la SparkFun cu 4,3 USD fara BootLoader,
   Pentru a pune BootLoaderul procedati astfel (asta daca aveti un Arduino sau o clona functionala)

Pe Arduino-ul functional uploadati ArduinoISP pe care il gasiti in Exemple
Legati Arduino-ul construit la placa existenta astfel:

    Acum din Tools => Board selectati modelul construit ( in functie de ce atmega aveti 168 sau 328), ATENTIE NU modelul Arduino-ului functional !!!
    Verificati ca portul sa fie OK setat si apoi tot din Tools dati Burn Bootloader => Arduino as AVRISP

    Asteptati cateva momente si gataaaa, aveti un Arduino serial RS232.
Sunt nenumarate metode de a pune bootloaderul pe atmega, mai multe informatii gasiti aici .

   Pe viitor vreau sa fac si un Boarduino.

Spor la treaba. :)
    

duminică, 13 martie 2011

De unde Arduino ? - Surse de achizitie

  Cautand pe web un Atmega328 sau 168 am inteles (confirmat) ca in Romania preturile sunt exagerate!!
  Personal nu cred ca este just sa vinzi un board opensource cumparat din alta parte cu un adaos de 30%, asta este comert. Cumpar din America sau China si vand la pasionatii din RO cu 30% peste....... dar ce am facut eu pentru 30%? Am dezvoltat ceva, am imbunatatit ceva ? NU...... daca nu am facut nimic atunci ma compar cu Farnell, TME, Adelaida (comert) si nu mai sustin ca aduc suport unei comunitati de pasionati.

  Cei care sustin comunitatea Arduino tot prin China si America ii gasim, acolo sistemul este altul.... Ei dezvolta, imbunatatesc, consiliaza.... promotii, cadouri, etc.
  Tot ce am cumparat pana acum legat de Arduino provine din CH. Calitatea este exceptionala (in CH calitatea incepe de la -100% pana la 100% :) trebuie sa ai mare bagare de seama), preturile nu mai zic, transportul, nu acceptabil ci incredibil ( intre 4-9 usd la ordere sub 50usd si 0 la ordere >50usd).

  Sursa mea este SeeedStudio, va garantez calitatea, si promtitudinea serviciilor lor sunt profesionisti adevarati.
  Am cumparat Arduino de la ei cu 13,7 USD

Seeeduino V2.2 (Atmega 328P)$13.75

  Au o categorie de Final Sale Zone in care periodic baga produse EOL la preturi incepand cu -30% fata de lista. Trimit tichete cadou in colete.... Sunt tari.
  Pot sa spun ca am ceva experienta in trading-ul cu CH si HK am mai cumparat si din alte parti, trebuie testat inainte de a cumpara, cauti un pik pe forumuri, comanzi un sample ceva, vezi cum decurg lucrurile si apoi decizi.
  Cand ajunge produsul in RO ajunge in vama (posta vamala) (in aprox 14 zile), la vama:
     - valoarea este sub 120USD se plateste numai TVA (chinezul o sa scrie pe colet GIFT, vamesul spune ca asa face toata lumea si cere un document, voi spuneti ca ati avut cupoane de discount si nu ati platit cu bani, oricum va puteti intelege cu cei de la vama)
      - valoare este peste 120 USD se pateste TVA + VAMA conform codului TARIC
  Eu folosesc pentru plata PayPal consider ca este cea mai sigura modalitate de a plati pe internet.
  Mai avem si:
           Sure Electronics - preturi bune si ei
           SparkFun - mai bine decat in RO (astia au o faza ca la inchiderea orderului alegi ce val sa-ti treca :))  )

Asa... si va spuneam de Atmega328
In RO este 28 RON
La SparkFun 13 RON
La SeeedStudio, nu il au, am dat mail sa-mi faca rost, Va spun asta pentru ca, chinezul face orice pentru clientul sau... cauta el pentru tine si ti face pe plac. Deci astept Pret..

Sa spunem ca luam 5 bucati
RO 28x5 + 10 (sa spunem in cel mai bun caz Transport) =  150
US 13x5+30RON (transport) =95 (fara vama pt ca va avea val pe order sub 10usd)
Deci avem o economie de 55 RON substantial raportat la valoare zic eu.


A fost doar un exemplu!
Pe viitor poate facem liste de precomenzi si comandam la 2-3 saptamani in comenzi cumulate.

sâmbătă, 12 martie 2011

Arduino + 2xDS18B20 + pachube - continuare

   Dupa un timp de "inactivitate" iata ca reusesc sa mai scriu ceva,
   Daca nu am scris nu inseamna ca nu am facut nimic....., am facut si inca multe. ;)
   Pentru inceput am modificat sistemul de monitorizare al temperaturii din casa si din fata geamului. :).

   Treaba cu serverul ala de linux nu prea se merita dpdv energetic, pentru un script de py care rula acolo il tineam pornit 24/24, cei drept nu consuma mult dar consuma. A trebuit sa pun in aplicare planul B.

   PLANUL B.

   "Super" ROUTERUL meu cu DD-WRT (Asus WL-500P), el poate sa "tina" scripturile, dar deja tinea cam multe si nu prea vroiam sa-l transform chiar in server pt orice.
   Mai incercasem ceva pe el dar dadusem de o problema in python2.5 care compilat pt el are ceva "hibe", am reusit sa rezolv problemele si sa am python2.5 full functional cu modulele si librariile necesare: setuptools, python-eeml, python-xml.

Cu riscul de a ma repeta am sa recapitulez schema si scripturile implicate.

   Pe Arduino avem:

   Hardware: 2 senzori DS18B20
   Un Lm7805 + led.. bla bla pentru alimentarea de la POE-ul camerei
Toate astea pe un shield
Shield alimentare_conectori


   Cele 2 perechi de cabluri subtiri merg catre senzorii DS18B20, cel ALB mai gros merge la un convertor TTL-RS232 ai apoi in portul serial al camerei.
RS232-TTL
 Sketch:

Folosesc :

<OneWire.h>
<DallasTemperature.h>
Doua librarii de mare utilitate, despre care am scris in postul alterior.

Avem:

#define ONE_WIRE_BUS 6
senzorii la pinul 6
---------------------------------------------------------
if (Serial.available() > 0) {
  incomingByte = Serial.read();
  if (incomingByte==84)
asteapta pe serial caracterul T (ASCII 84)
--------------------------------------------------------
Daca aceasta conditie este indeplinita face request-uri "ByIndex" catre senzori si printeaza pe serial ceva de genul:
RAW Indoor: 24.94 Outdoor: 8.63


#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));
  } 
}
 
}

--------------------------------------------------------
   Pana aici am terminat cu Arduino, ca si concluzie Arduino raspunde cu citirile senzorilor daca cineva-i transmite T pe serial.

   Pe sistemul linux (routerul Asus WL-500) avem:

1. python2.5 pentru a pune feed-ul pe pachube
2. curl

Scriptul 1.


>#!/bin/sh
>python2.5 /mnt/pachube_mobo/read_serial.py
>
>curl -s -d "send=T&buttonSubmit=submit" http://user:pass@server/admin/rs232term?Update=fulltext | grep nooutput
>curl -s http://user:pass@server/admin/rs232term?Update=fulltext | grep RAW  > /mnt/pachube_mobo/temp.txt
>curl -s http://user:pass@server/admin/rs232term?delbuffer | grep nooutput
>

Sunt 3 comenzi curl.
Prima trimite caracterul "T" (ASCII 84) catre terminalul serial al camerei, conectat prin adaptorul RS232-TTL la Arduino
A doua comanda "partseaza" raspunsul si il pune in fisierul temp.txt
A treia comanda "rade" bufferul serial al camerei pentru a-l lasa curat asteptand o noua interogare deci un nou raspuns de la Arduino.

Prima linie, adica :
>python2.5 /mnt/pachube_mobo/read_serial.py

Lanseaza un script de py care va trimite informatia pe pachube.

Scriptul 2.

>import eeml
>import linecache
>
>##################################
>
>temphum = linecache.getline("/mnt/pachube_mobo/temp.txt", 1)
># parameters
>API_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
>API_URL = '/api/xxxxxxxx.xml'
>
>readings = temphum.split(' ') # the readings are separated by spaces
>pac = eeml.Pachube(API_URL, API_KEY)
>pac.update([eeml.Data(0, readings[3], unit=eeml.Celsius()), eeml.Data(1, readings[5], unit=eeml.Celsius())])
>pac.put()

Si aici treaba e simpla,
Avem o variabila "temphum" care citeste fisierul temp.txt si "splitueste" valorile
in continuare intervine libraria eeml care pune valorile citite in xml si le trimite pe pachube.

Scripturile sunt rulate de CRON

Cam asta este.
Vreau sa pun si un display 20x4 caractere conectat tot pe ethernet care sa-mi arate temperatura si altele.

Ansamblu
Ansamblu1

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