Szukaj na tym blogu

sobota, 30 marca 2013

Pierwsza produkcyjna implementacja - instalacja na Linuksie

Uruchomienie platformy arduino na Linuksie

Na moim serwerze w domu chodzi akurat Ubuntu w wersji 12.04. Poniższy opis będzie się odnosił właśnie do tej platformy.

Na początek zainstalowałem menadżerem programów (synaptic) pakiet arduino, menadżer pakietów wskazał dodatkowe pakiety potrzebne do zainstalowania:
  • arduino - AVR development board IDE and built-in libraries
    • arduino-core - Code, examples, and libraries for the Arduino platform
    • avr-libc - Standardowa biblioteka C do programowania kontrolerów Amtel AVR
    • avrdude - Oprogramowanie do programowania mikrokontrolerów AVR firmy Atmel
    • binutils-avr - Binary utilities supporting Atmel's AVR targets
    • extra-xdg-menus - Extra menu categories for applications under GNOME and KDE
    • gcc-avr - Kompilator GNU C (kompilator krzyżowy do avr)
    • libftdi1 - Library to control and program the FTDI USB controller
    • libjna-java - Dynamic access of native libraries from Java without JNI
    • librxtx-java - Full Java CommAPI implementation
Sprawdziłem, że potrzebne byłyby jeszcze następujące pakiety, ale miałem je już zainstalowane:
  • default-jre
  • java6-runtime
  •  policykit-1
Dodatkowo zainstalowałem sobie:
  • fritzing - Easy-to-use electronic design software
    • fritzing-data - Easy-to-use electronic design software (data files)
  • rrdtool - time-series data storage and display system (programs)
  • drraw - A simple web based presentation front-end for RRDtool
Fritzinga do projektowania prototypów i płytek, rrdtool żeby wykresy robić i przy okazji drraw żeby zobaczyć co to jest, może łatwiej będzie się wykresy robić dzięki niemu.

Po  zainstalowaniu tego wszystkiego podpiąłem zestaw kablem USB zestaw do komputera, uruchomiłem Arduino IDE, poleceniem arduino ;), w Tools/Serial Port wybrałem /dev/ttyACM0 (pojawiło się to urządzenie po podpięciu arduino do komputera), uruchomiłem Serial Monitor i ...
Działające środowisko arduino na Linuksie

działa :)
Próba skompilowania i załadowania innego programu także się powiodła :)

czwartek, 28 marca 2013

Pierwsza produkcyjna implementacja - plan działania

Wstęp

Po zrobieniu działającego prototypu monitora temperatury opisanego w RRDTool i wykresy, którego efekty działania można obejrzeć na obrazkach poniżej
Wszystkie temperatury

Temperatura na zewnątrz
nadszedł czas na wykonanie tego projektu produkcyjnie czyli:
  1. całość działa całkowicie bezobsługowo, wystarczy załączyć zasilanie i już,
  2. wyniki działania dostępne są przez przeglądarkę (także z internetu),
  3. nie jest użyte arduino, ono posłuży do kolejnych prototypów.

Oszczędzanie energii - część II

Witam,

Tak mi się jakoś wierzyć nie chciało, że nie da się oszczędzać energii w arduino (patrz wpis Oszczędzanie energii).

I okazało się, że oczywiście się da :)
Trzeba skorzystać z biblioteki avr\sleep.h
Dla mojego arduino są tam zdefiniowane takie tryby oszczędzania energii jak:
  • SLEEP_MODE_IDLE
  • SLEEP_MODE_ADC
  • SLEEP_MODE_PWR_DOWN
  • SLEEP_MODE_PWR_SAVE
  • SLEEP_MODE_STANDBY
  • SLEEP_MODE_EXT_STANDBY
Nie wiem jeszcze czym dokładnie się różnią i które np da się przerwaniem zegarowym przerwać, a które tylko hardwerowo, ale wstępne pomiary amperomierzem pokazują, że tryby te rzeczywiście oszczędzają energię :)

niedziela, 24 marca 2013

RRDTool i wykresy


Dzisiaj napiszę kilka słów o wykresach.
Kupiłem cztery czujniki temperatury d18b20. Przykład ich podłączenia jest np tu. W sumie w sieci jest wiele takich przykładów.

Teraz chcę napisać nie jak zmierzyć temperaturę tylko jak narysować wykres tej temperatury. Najpierw napisałem programik, o taki:
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2
#define TEMPERATURE_PRECISION 12

#define MAX_NUM_OF_DEVICES 8


// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

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

int numberOfDevices; // Number of temperature devices found

DeviceAddress arrTempDeviceAddress [MAX_NUM_OF_DEVICES];


// odstęp między pomiarami
#define ODSTEP_MIEDZY_POMIARAMI 60000


unsigned long ostatniCzasPomiaru = 0;


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

  // Start up the library
  sensors.begin();
  
  // Grab a count of devices on the wire
  numberOfDevices = sensors.getDeviceCount();
  if (numberOfDevices > MAX_NUM_OF_DEVICES)
    numberOfDevices = MAX_NUM_OF_DEVICES;
  
  for (int i = 0; i < numberOfDevices; i++)
  {
    // Search the wire for address
    if (sensors.getAddress(arrTempDeviceAddress [i], i))
    {
      sensors.setResolution(arrTempDeviceAddress [i], TEMPERATURE_PRECISION);
    }
  }
}


void loop(void)
{ 
  unsigned long czasPomiaru = millis();

  // 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(czasPomiaru);
  Serial.print(";");

  // Loop through each device, print out temperature data
  for(int i = 0; i < numberOfDevices; i++)
  {
    float tempC = sensors.getTempC(arrTempDeviceAddress [i]);
    if (tempC > -127.0) // -127.0 to brak odczytu z sensora
      Serial.print(tempC);
    Serial.print(";");
  }
  
  Serial.println();
  
  
  // obliczenie ile czasu czekać do następnego pomiaru
  
  long waitTime = ODSTEP_MIEDZY_POMIARAMI - (millis() - ostatniCzasPomiaru);

 
  ostatniCzasPomiaru += ODSTEP_MIEDZY_POMIARAMI;
  
  if (waitTime > 0) 
    delay (waitTime);
  
}
Program raz na minutę wysyła na RS232 informację o czasie od uruchomienia w milisekundach i wartości pomiarów z czterech czujników, coś takiego konkretnie:
492;-7.75;21.69;19.37;39.44;
60000;-7.88;21.69;19.37;38.94;
120000;-7.81;21.62;19.37;38.50;
...
Przechwytuję te wartości przy pomocy programu CoolTerm i zapisuję do pliku.
Można je następnie wkleić do np LibreOffice Calc i uzyskać taki wykres
Wykres z LibreOffice Calc
Wykres całkiem ładny jednak trzeba się trochę narobić aby go zrobić. Może i niedużo ale jednak. A ja chciałbym aby taki wykres sam się robił i jeszcze publikował gdzieś gdzie będzie dla mnie dostępny online.

I tu z pomocą przyszło mi narzędzie RRDTool. Bardzo (ale to bardzo) ogólnie mówiąc jest to narzędzie, które potrafi zbierać dane i tworzyć raporty (także w postaci wykresów).

Po napisaniu kilku prostych skryptów (windowsowe cmd + gawk) otrzymałem taki efekt:


Pełny zbiór kodów dostępny jest tutaj.

W dalszej części zajmę się publikowaniem tych wykresów w sieci oraz jakimś sposobem aby dane pomiarowe lądowały od razu w sposób automatyczny w bazie RRDTool i były publikowane na serwerze www.

Jeżeli Was to interesuje i chcielibyście wiedzieć coś więcej proszę o pytania.

sobota, 23 marca 2013

Podłączanie wyświetlacza led

Zrobiłem sobie monitor temperatury w domu, cztery czujniki ds18b20 podłączone przez skrętkę monitorują temperaturę w mieszkaniu i na zewnątrz - ale to temat na osobny artykuł.

Teraz chciałem się podzielić pewnym doświadczeniem, kupiłem tani wyświetlacz led ldd055bg. Podłączyłem zaledwie jedną cyfrę do rejestru przesuwnego i ... zużyłem większość kabelków z zestawu startowego, a całość wygląda tak:

Chciałem jeszcze podłączyć drugą cyfrę przez ten drugi scalak z zestawu startowego, ale chyba sobie już dzisiaj odpuszczę i zajmę się tematem pobierania danych z rs232 i publikowania ich automatycznie w postaci wykresów. Jak będzie sukces to się podzielę.

Oszczędzanie energii

Jestem po pierwszych zabawach z arduino czyli czujnikami temperatury, diodami, odbiornikiem podczerwieni itp postanowiłem opisać swoje pierwsze rozważania na temat poboru energii przez układ.

Budując układ do pomiaru temperatury (patrz Jak mierzyć temperaturę z Arduino) napisałem prosty program
#define TEMP_PIN 2

void setup()
{
  Serial.begin(57600);
}


void loop()
{
  float wart = analogRead(TEMP_PIN);
  float temp = ((wart * 5.0 / 1024.0) - 0.5) / 0.01;

  Serial.print(temp);
} 
i zauważyłem, że kolejne pomiary potrafią się czasem sporo różnić mimo, że temperatura czujnika tak naprawdę się nie zmienia. No cóż, pewnie napięcie na usb niezbyt stabilne jest więc stąd te niedokładności. Aby je usunąć zrobiłem małą zmianę w programie, a mianowicie:

#define TEMP_PIN 2
#define INTERVAL 60000

unsigned long lastTime = 0;
unsigned long count = 0;
unsigned long value_sum = 0;


void setup()
{
  Serial.begin(57600);
}


void loop()
{
  int value = analogRead(TEMP_PIN);
  value_sum += value;
  
  count ++;
  
  unsigned long time = millis();
  
  if (time - lastTime > INTERVAL)
  {
    float temp = (((value_sum) * 5.0 / 1024.0 / count) - 0.5) / 0.01;

    Serial.print(temp);
    Serial.print(";");
    Serial.print(count);

    Serial.println();

    lastTime = time;
    count = 0;
    value_sum = 0;
  }
}

zmianę, która jak łatwo zauważyć przez minutę liczy średnią, a następnie wypisuje ją oraz liczbę pomiarów.W ciągu minuty na moim arduino liczba pomiarów w ciągu minuty to prawie 500 tys. Zaczęło mnie zastanawiać czy tak duża liczba pomiarów jest potrzebna. Intuicja mi bowiem podpowiadała, że każdy taki pomiar zużywa energię, a arduino z baterii potrafi być zasilane więc dobrze aby na niej długo działało.
Po nieco trudnej ale ciekawej lekturze dwóch artykułów:
wyszło mi, że wystarczy ich o wiele mniej. Powiedzmy 10 tys. aby uzyskać dokładność na poziomie 0,01 stopnia - mam na myśli wyeliminowanie wahań odczytów.

Pytanie jednak brzmi czy zmniejszenie liczby pomiarów poprzez wstawienie instrukcji 'delay' na końcu metody loop zmniejszy pobór energii. Arduino podłączone do 9V baterii wykonując powyższy program pobiera 47,1 mA. Po dodaniu na końcu instrukcji
  delay (6); 
liczba pomiarów spada do 9800, a pobór prądu ... rośnie do 47,8 mA.

No i to by było na tyle w temacie oszczędzania energii. Szczerze mówiąc zawiedziony jestem, taki fajny algorytm dynamicznego dostosowywania liczby pomiarów do aktualnych warunków w głowie miałem.

Do tematu jednak zamierzam wrócić bo to się wierzyć nie chce, że nie da się postawić układu w stan zawieszenia kiedy zapotrzebowanie na energię jest minimalne

wtorek, 19 marca 2013

Wstęp do tego wszystkiego

Witam Was

od dłuższego czasu nosiło mnie żeby rozpocząć zabawę z elektroniką, a konkretnie z mikro-kontrolerami.

Ostatnio kupiłem zestaw startowy Arduino i ... zabawa się zaczęła.

Tu zamierzam opisywać moje doświadczenia. Ale to za chwilę jak tylko przestanę się bawić ;)


pozdrawiam
Jacek

ps
tak w ogóle to mój pierwszy blog więc proszę o wyrozumiałość