roboforum.ru

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

DuinOS

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

DuinOS

Сообщение Sirocco » 20 фев 2011, 19:04

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

Re: DuinOS

Сообщение Grem » 20 фев 2011, 19:29

А если сначала научиться читать?
"There is nothing better than sliding down snow and flying through the air" (с) Shane McConkey.
Lieber ein Brett am Fuß als eins vorm Kopf, aber lieber ein Brett vorm Kopf als zwei am Fuß.
Аватара пользователя
Grem
 
Сообщения: 1530
Зарегистрирован: 16 май 2009, 12:50
Откуда: Россия
прог. языки: Java, C

Re: DuinOS

Сообщение Sirocco » 20 фев 2011, 19:48

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

Читать умею, но не всё так просто. Пробовал версии от arduino-0017 до 0022, пробовал менять код... Много чего пробовал, не получилось. Если Вы видите мою ошибку, и у Вас получилось работать с этой библиотекой, будьте добры, скажите мне что у меня не так.
Sirocco
 
Сообщения: 56
Зарегистрирован: 18 фев 2011, 16:35

Re: DuinOS

Сообщение Grem » 20 фев 2011, 20:06

"There is nothing better than sliding down snow and flying through the air" (с) Shane McConkey.
Lieber ein Brett am Fuß als eins vorm Kopf, aber lieber ein Brett vorm Kopf als zwei am Fuß.
Аватара пользователя
Grem
 
Сообщения: 1530
Зарегистрирован: 16 май 2009, 12:50
Откуда: Россия
прог. языки: Java, C

Re: DuinOS

Сообщение Sirocco » 20 фев 2011, 20:24

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

Да ёё.. Читал конечно. Устанавливал как описано, пробовал для разных версий ардуино иде как просто скопировав библиотеку в папку libraries, так и способом указанным на сайте. Результат один - не работает. И знаю ещё пару человек, озадаченных этим вопросом. Вы пробовали, у Вас работает, или просто советы даёте, не разобравшись в ситуации?
Sirocco
 
Сообщения: 56
Зарегистрирован: 18 фев 2011, 16:35

Re: DuinOS

Сообщение Grem » 20 фев 2011, 21:00

Смотря что вы понимаете под "не работает". Специально, чтоб проверить ваш скил чтения - поставил себе, этот пример собирается без ошибок.
"There is nothing better than sliding down snow and flying through the air" (с) Shane McConkey.
Lieber ein Brett am Fuß als eins vorm Kopf, aber lieber ein Brett vorm Kopf als zwei am Fuß.
Аватара пользователя
Grem
 
Сообщения: 1530
Зарегистрирован: 16 май 2009, 12:50
Откуда: Россия
прог. языки: Java, C

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(" ");
  }
Sirocco
 
Сообщения: 56
Зарегистрирован: 18 фев 2011, 16:35

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

И зачем многозадачность?
Дым, идущий из всех устройств в помещении предвещает появление электрика.
RootAdmin
 
Сообщения: 1725
Зарегистрирован: 07 авг 2010, 21:29
Откуда: КМВ
прог. языки: C
ФИО: Андрей


Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14