roboforum.ru

Технический форум по робототехнике.

DuinOS

DuinOS

Sirocco » 20 фев 2011, 19:04

Привет всем! Кто-нибудь пользовался библиотекой DuinOS для ардуино? Как я понял, эта библиотека позволяет выполнять несколько действий одновременно, не дожидаясь, пока выполнится одно, чтоб перейти к выполнению следующего. Да, есть варианты, как выполнение по событию на пине, или путём таймеров, Но!, Я использую ардуино как модуль входов\выходов по сути, а мозгом является компьютер, а в этом варианте невозможно пользоваться событием пина. А по таймеру не даёт ничего... Всё также приходится ждать.
Объясню конкретно: Программа на компе отправляет на ардуино сигналы, кучу сигналов, например - включение освещения, шесть отдельно (шим) управляемых светильников, чайник, включающийся по будильнику с утра, нагревающийся до указанной температуры, соответственно датчики температуры (6шт), и счётчики воды. И всё это работает хреново, если можно сказать, что работает. Дело в том, что на безошибочное считывание температуры требуется 1.5 сек, а в это время может прийти импульс со счетчика воды... и он не будет учтён, так как ардуина занята считыванием температуры, также невозможно одновременно плавно прибавлять яркость на одном светильнике, в тоже время плавно гася другой, только поочерёдно. Я, когда покупал свою FreeDuino Mega+ v1.22, даже и не предполоагал, что могу столкнуться с такой проблемой, нафига тогда у нёё столько выходов\входов? При таком функионале вполне достаточно ардуино нано.
Проблема в том, что не могу заставить работать библиотеку, вылетает ошибка при кампиляции.
DuinOS
Помогите разобраться.
Вложения
11.png

Re: DuinOS

Grem » 20 фев 2011, 19:29

А если сначала научиться читать?

Re: DuinOS

Sirocco » 20 фев 2011, 19:48

Grem писал(а):А если сначала научиться читать?

Читать умею, но не всё так просто. Пробовал версии от arduino-0017 до 0022, пробовал менять код... Много чего пробовал, не получилось. Если Вы видите мою ошибку, и у Вас получилось работать с этой библиотекой, будьте добры, скажите мне что у меня не так.

Re: DuinOS

Grem » 20 фев 2011, 20:06


Re: DuinOS

Sirocco » 20 фев 2011, 20:24

Grem писал(а):Тут читать.

Да ёё.. Читал конечно. Устанавливал как описано, пробовал для разных версий ардуино иде как просто скопировав библиотеку в папку libraries, так и способом указанным на сайте. Результат один - не работает. И знаю ещё пару человек, озадаченных этим вопросом. Вы пробовали, у Вас работает, или просто советы даёте, не разобравшись в ситуации?

Re: DuinOS

Grem » 20 фев 2011, 21:00

Смотря что вы понимаете под "не работает". Специально, чтоб проверить ваш скил чтения - поставил себе, этот пример собирается без ошибок.

Re: DuinOS

Sirocco » 22 фев 2011, 01:00

Есть код, для получения температуры, в случае если пользуешься DuinOS:
Код: Выделить всёРазвернуть
#include <OneWire.h> 
  // Получаем температуру от датчиков серии DS18x20
  // Поддерживаемые датчики
#define DS18S20_ID 0x10
#define DS18B20_ID 0x28
OneWire  ds(12);    // Линия 1-Wire будет на pin 12
void setup(void)
  {
  Serial.begin(115200);
  }
 
void loop(void)
  {
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];
 
  if (!ds.search(addr))
    {
    ds.reset_search();
    return;
    }
 
  if (OneWire::crc8( addr, 7) != addr[7])
    {
     Serial.print("CRC is not valid!\n");
     return;
    }
 
  if (addr[0] != DS18S20_ID && addr[0] != DS18B20_ID)
    {
    Serial.print("Device is not a DS18x20 family device.\n");
    return;
    }
  ds.reset();
  ds.select(addr);
 
  // Запускаем конвертацию
  ds.write(0x44, 1);
 
  // Подождем...
  delay(400);
 
  present = ds.reset();
  ds.select(addr);

  // Считываем ОЗУ датчика 
  ds.write(0xBE);

  // Обрабатываем 9 байт
  for ( i = 0; i < 9; i++)
    {
    data[i] = ds.read();
    }
 
  // Высчитываем температуру :)
  int HighByte, LowByte, TReading, Tc_100, SignBit, Whole, Fract;
  LowByte = data[0];
  HighByte = data[1];

  TReading = (HighByte << 8) + LowByte;
   
  // Проверяем дубак там или нет
  SignBit = TReading & 0x8000;
   
  // Если на улице дубак :)
   if (SignBit)
     {
      TReading = (TReading ^ 0xffff) + 1;
     }
   
   // Умножаем на (100 * 0.0625) или 6.25
   Tc_100 = (6 * TReading) + TReading / 4;

   // Отделяем целые от дробных чисел
   Whole = Tc_100 / 100;
   Fract = Tc_100 % 100;

   Serial.print("t1 ");

   // Если на улице дубак напишем минус перед цифрами :)
   if (SignBit)
     {
      Serial.print("-");
     }     
     else
     {
       Serial.print("+");
     } 
     
   Serial.print(Whole);
   Serial.print(".");
   
   if (Fract < 10)
     {
      Serial.print("0");
     }
   
   Serial.print(Fract);
   Serial.println("  ,");
   
   
   
}

В этом коде температура выводится поочерёдно со всех датчиков. Как сделать так, чтоб перед выводом температуры какого либо датчика ставился идентификатор, например:
t1 "температура"
t2 "температура"
t3 "температура" ... и т.д.
----------------------------------
Вот в этом способе я понял как это сделать, но этот код неработает с использованием DuinOS.
Код: Выделить всёРазвернуть
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 12
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
float(t1);
float(t2);
float(t3);
void setup(void)
  {
    Serial.begin(115200);
    sensors.begin();
  }
void loop(void)
  {
  sensors.requestTemperatures();
  delay(15);
//=========  1 ===================
  t1 = sensors.getTempCByIndex(0);
  Serial.print("t1 ");
    if (t1 > 0)
     {
     Serial.print("+");
     }
  Serial.print(t1);
  Serial.println(" ");
  delay(40);
//==========  2  =================
  t2 = sensors.getTempCByIndex(1);
  Serial.print("t2 ");
  if (t2 > 0)
     {
     Serial.print("+");
     }
  Serial.print(t2);
  Serial.println(" ");
  delay(40);
//==========  3  =================
  t3 = sensors.getTempCByIndex(2);
  Serial.print("t3 ");
  if (t3 > 0)
     {
     Serial.print("+");
     }
  Serial.print(t3);
  Serial.println(" ");
  }

Re: DuinOS

RootAdmin » 11 авг 2011, 01:05

Не сочтите некропостером...
Столкнулся с той же проблемой, решение заняло минут 15.
Код: Выделить всёРазвернуть
#include <OneWire.h>

/*
* Получаем температуру от датчиков серии DS18x20
*/


// Поддерживаемые датчики
#define DS18S20_ID 0x10
#define DS18B20_ID 0x28


// Линия 1-Wire будет на pin 2
OneWire  ds(2);

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


void loop(void) {
  byte scountmax = 4;
  byte scount;
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[scountmax][8];
 
  Serial.print("\n Start \n");
 
  //почистим массив
  for( scount = 0; scount < scountmax; scount++) {
      for( i = 0; i < 8; i++) {
        addr[scount][i]=0;
      }
  }
 
 
  for( scount = 0; scount < scountmax; scount++) {
  Serial.print("Search namber ");
  Serial.print(scount, DEC);
  Serial.print("--");
      if (!ds.search(addr[scount])) {
          //ds.reset_search();
          Serial.print("Search no result");
          //return;
      }
      else {
          if (OneWire::crc8( addr[scount], 7) != addr[scount][7]) {
              Serial.print("CRC is not valid!");
              //return;
          }
         
          Serial.print("R=");
          for( i = 0; i < 8; i++) {
            Serial.print(addr[scount][i], HEX);
            Serial.print(" ");
          }
                   
          if (addr[scount][0] != DS18S20_ID && addr[scount][0] != DS18B20_ID) {
              Serial.print("Device is not a DS18x20 family device.\n");
              //return;
          }
      }
  Serial.print("\n");
  }
  ds.reset_search();
 
 
for( scount = 0; scount < scountmax; scount++) {
  ds.reset();
  ds.select(addr[scount]);
 
  // Запускаем конвертацию
  ds.write(0x44, 1);
 
  // Подождем...
  delay(1000);
 
  present = ds.reset();
  ds.select(addr[scount]);

  // Считываем ОЗУ датчика 
  ds.write(0xBE);



  Serial.print("P=");
  Serial.print(present,HEX);
  Serial.print(" ");
   // Обрабатываем 9 байт
  for ( i = 0; i < 9; i++) {
    data[i] = ds.read();
        Serial.print(data[i], HEX);
        Serial.print(" ");
  }
 
  Serial.print(" CRC=");
  Serial.print( OneWire::crc8( data, 8), HEX);
  Serial.println();

 
  // Высчитываем температуру :)
  int HighByte, LowByte, TReading, Tc_100, SignBit, Whole, Fract;
  LowByte = data[0];
  HighByte = data[1];

   TReading = (HighByte << 8) + LowByte;
   
   // Проверяем дубак там или нет
   SignBit = TReading & 0x8000;
   
   // Если на улице дубак :)
   if (SignBit) {
       TReading = (TReading ^ 0xffff) + 1;
   }
   
   // Умножаем на (100 * 0.0625) или 6.25
   Tc_100 = (6 * TReading) + TReading / 4;

   // Отделяем целые от дробных чисел
   Whole = Tc_100 / 100;
   Fract = Tc_100 % 100;


   Serial.print(scount,DEC);
   Serial.print(" Temperature: ");

   // Если на улице дубак напишем минус перед цифрами :)
   if (SignBit) {
      Serial.print("-");
   }
   else
   {
     Serial.print("+");
   } 
   Serial.print(Whole);
   Serial.print(".");
   
   if (Fract < 10) {
      Serial.print("0");
   }
   
   Serial.print(Fract);
//      Serial.print(" ");
//      Serial.print(Tc_100);
   Serial.print("\n");
}   
}



В строке byte scountmax = 4; задаем максимальное количество устройств. С десятком датчиков работает устойчиво - больше не пробовал.
Вывод типа:
Start
Search namber 0--R=28 F4 50 ED 2 0 0 BE
Search namber 1--R=28 7B 3E ED 2 0 0 C3
Search namber 2--Search no result
Search namber 3--Search no result
P=1 B5 1 4B 46 7F FF B 10 A3 CRC=A3

0 Temperature: +27.31
P=1 B1 1 4B 46 7F FF F 10 8D CRC=8D

1 Temperature: +27.06
P=1 FF FF FF FF FF FF FF FF FF CRC=C9

2 Temperature: -0.06
P=1 FF FF FF FF FF FF FF FF FF CRC=C9

3 Temperature: -0.06

И зачем многозадачность?


Rambler\'s Top100 Mail.ru counter