roboforum.ru

Технический форум по робототехнике.
Текущее время: 02 дек 2024, 22:35

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: DuinOS
СообщениеДобавлено: 20 фев 2011, 19:04 
Не в сети

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


Вложения:
11.png
11.png [ 25.52 КиБ | Просмотров: 3159 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DuinOS
СообщениеДобавлено: 20 фев 2011, 19:29 
Не в сети
Аватара пользователя

Зарегистрирован: 16 май 2009, 12:50
Сообщения: 1530
Откуда: Россия
прог. языки: Java, C
А если сначала научиться читать?

_________________
"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ß.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DuinOS
СообщениеДобавлено: 20 фев 2011, 19:48 
Не в сети

Зарегистрирован: 18 фев 2011, 16:35
Сообщения: 56
Grem писал(а):
А если сначала научиться читать?

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DuinOS
СообщениеДобавлено: 20 фев 2011, 20:06 
Не в сети
Аватара пользователя

Зарегистрирован: 16 май 2009, 12:50
Сообщения: 1530
Откуда: Россия
прог. языки: Java, C
Тут читать.

_________________
"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ß.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DuinOS
СообщениеДобавлено: 20 фев 2011, 20:24 
Не в сети

Зарегистрирован: 18 фев 2011, 16:35
Сообщения: 56
Grem писал(а):

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DuinOS
СообщениеДобавлено: 20 фев 2011, 21:00 
Не в сети
Аватара пользователя

Зарегистрирован: 16 май 2009, 12:50
Сообщения: 1530
Откуда: Россия
прог. языки: Java, C
Смотря что вы понимаете под "не работает". Специально, чтоб проверить ваш скил чтения - поставил себе, этот пример собирается без ошибок.

_________________
"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ß.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DuinOS
СообщениеДобавлено: 22 фев 2011, 01:00 
Не в сети

Зарегистрирован: 18 фев 2011, 16:35
Сообщения: 56
Есть код, для получения температуры, в случае если пользуешься 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
СообщениеДобавлено: 11 авг 2011, 01:05 
Не в сети

Зарегистрирован: 07 авг 2010, 21:29
Сообщения: 1725
Откуда: КМВ
прог. языки: C
ФИО: Андрей
Не сочтите некропостером...
Столкнулся с той же проблемой, решение заняло минут 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

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

_________________
Дым, идущий из всех устройств в помещении предвещает появление электрика.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 4 часа


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

Сейчас этот форум просматривают: Google [Bot] и гости: 15


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO