Arduino и Оpen Log

Open log е устройство, което записва върху microSD карта, данните които получава серийно. MicroSD картата може да е с размер от 64MB до 16GB и трябва да е форматирана с FAT16 или FAT32. Потребителите на Linux среда трябва да създадат DOS файлова система след форматиране на картата.

Устройството се захранва с напрежение от 3.3 до 12V на пин VCC. Входното напрежение на RXI пин-а не трябва да надвишава 6V, а изходното напрежение на пин TXО няма да надвиши 3.3V. По подразбине, скоростта на серийната комуникация е 9600bps (8-N-1), но може да се промени на 2400, 4800, 9600, 19200, 57600 и 115200.

След включване устройството работи в един от следните режими:

  1. New File Logging (default) - Това е режима по подразбиране. В него, logger-a създава нов файл, при всяко включване и записва в него данните. Файлът е с име LOG#####.txt, където ##### е номер, който се увеличава.
  2. Append File Logging - В този режим, устройството създава файл SEQLOG.txt и записва само в него.
  3. Command Prompt - Това е режимът, в който устройството не записва данни, а е в готовност за получаване на команди.

Ако е в един от първите два режима, устройството ще запише всичко, което получи серийно на пин RXI, 2 секунди след като се влкючи към захранване. Получени данни, logger-а запазва в буфер с размер 512 символа. При напълване на буфера или ако устройството не е заето за 5 секунди или повече, съдържанието на буфера се записва върху microSD картата.

В режим за получаване на команди се преминава по подразбиране чрез изпращане на три символа ASCII 26 (CTRL+Z). Някой от команди са следните:

  • new file - създава нов файл, с име file
  • append file - добавя получените данни към файла
  • rm file - изтрива файла

Списък с всички команди и повече информация ще намерите тук

Конфигуриране

Скоростта на серийната комуникация, начина за преминаване в команден режим и режима на работа при включване могат да се редактират на компютър от файла CONFIG.TXT.

9600 е скоростта на комуникацията,а 26 и 3 определят 3 символа ASCII 26 за преминаване в команден режим. 0 е за режим New File Logging при стартиране. За Append File Logging е 1, а за Command Prompt 2. При въвеждане на невалидни данни, например скорост различна от разрешените, устройството използва стойностите си по подразбиране (9600,26,3,0).

Пример

Програмата създава файл "test.log" на microSD карата и го изтрива преди това, ако е имало такъв на нея. Във файла се записва "This is a test !" и после се прочита от микроконтролера на Arduino. В Serial Monitor се извежда информация за хода на програмата.

В дадения по-долу пример е използвана библиотека за софтуерна серийна комуникация. Библиотеката може да изтеглите от тук. Разархивира се в libraries от "arduino-00xx" директорията.

Устройството се свързва към Arduino по следния начин:

VCC -> 5V
GND -> GND
RXI -> pin9
TXO -> pin8

Кодът, който трябва да се зареди на Arduino е следният:

/*

 Описание:
 * Създава файл на microSD картата в Open Log устройството
   и го изтрива преди това, ако е имало такъв
 * Записва текст във файла, прочита го и го извежда в Serial Monitor
 * Сигнализира края на програмата със светодиод

 Свързване:
 * VCC -> 5V
 * GND -> GND 
 * RXI -> pin9
 * TXO -> pin8

 * Tihomir Trifonov (11-2011)
 * email:tisho@inbox.com

 * с подкрепата на Robotev.com

*/

#include <NewSoftSerial.h> // библиотека за софтуерна серийна комуникация

#define RXPIN 8 // RXI е на пин 8
#define TXPIN 9 // TXO е на пин 9

NewSoftSerial logger(RXPIN,TXPIN);// създава обект за комуникация

int wait = 200;// 200ms закъснение

void setFile(char fname[40])
{
  Serial.print("Creating file: "); 
  Serial.println(fname);

  // влиза в команден режим
  logger.print(26, BYTE);
  logger.print(26, BYTE);
  logger.print(26, BYTE);
  delay(wait);// изчаква 200ms

  // създава нов файл
  logger.print("new ");// команда за нов файл
  logger.print(fname);// име на файла
  logger.print(13, BYTE);// enter
  delay(wait);// изчаква 200ms

  // добавя данните към него 
  logger.print("append ");//команда за избор на файл
  logger.print(fname);// име на файла
  logger.print(13, BYTE);// enter
  delay(wait);// изчаква 200ms
}

void delFile(char fname[40])
{
  Serial.print("Deleting file: ");
  Serial.println(fname);

  // влиза в команден режим
  logger.print(26, BYTE);
  logger.print(26, BYTE);
  logger.print(26, BYTE);
  delay(wait);// изчаква 200ms

  // изтрива задения файл
  logger.print("rm ");// команда за изтриване на файл
  logger.print(fname);// име на файла
  logger.print(13, BYTE);// enter
  delay(wait);// изчаква 200ms
}

void readFile(char fname[40], int start, int length)
{
  // влиза в команден режим
  logger.print(26, BYTE);
  logger.print(26, BYTE);
  logger.print(26, BYTE);
  delay(wait);// изчаква 200ms

  // изпраща команда за четене на файл
  logger.print("read ");// команда 
  logger.print(fname); // име на файла
  logger.print(" ");// итервал
  logger.print(start);// позиция от която започва да чете
  logger.print(" "); // интервал
  logger.print(length); // брой на символите за четене
  logger.flush(); // изчиства вдхония буфер
  logger.print(13, BYTE);//enter
  delay(wait);// изчаква 200ms
}

void setup() 
{
  pinMode(RXPIN, INPUT);// RXI е входен пин
  pinMode(TXPIN, OUTPUT);// TXO е изходен пин
  pinMode(13, OUTPUT); //пин 13 е изходeн

  Serial.begin(9600);// серийна коминикация с PC
  logger.begin(9600);// комуникация с усройството на пинове 8 и 9
  delay(3000);// изчаква 3 сек

  delFile("test.log"); // изтрива файла
  setFile("test.log"); // създава файл
  logger.print("This is a test !"); //пише във файла 
  readFile("test.log",0,16);// чете 16 символа от началотo

  char str[50];// масив от символи
  char i = 0;  // брояч

  while(logger.available()>0)// проверява има ли данни за получаване
  {
    str[i] = logger.read(); // прочита първия символ
    i++;// увеличава брояча
   }
  str[i]=0;// слага край на мисива
  Serial.print("Read file:");
  Serial.print(str);// извежда съдържанието в Serial Monitor
}

void loop()// безкраeн цикъл
{
  digitalWrite(13, HIGH);// светва светодиод на пин 13
  delay(1000); // изчаква 1 сек
  digitalWrite(13, LOW); // загася светодиода
  delay(1000);
}

След изпълнението на програмата, светодиодът, свързан на пин 13, започва на мига през 1 секунда.

Share