среда, 3 апреля 2013 г.

Урок 3: iBoard - работа с датчиком температуры и подготовка к работе с "нагрузкой"

На этом уроке мы начнем осваивать возможности платы iBoard.

Напомним ее основные составляющие, важные для нашего проекта:

  • ATmega328
  • LAN-интерфейс (Wiznet W5100)
  • Интерфейс для подключения nRF24L01+
  • семь 3-x пиновых входов/выходов
Помимо этого есть еще слот для карты microSD и интерфейс для модулей xBee (обе эти составляющие в нашем проекте не используются, вы можете самостоятельно придумать, как их использовать).

Для программирования iBoard потребуется программатор Foca V2.2:
В принципе, это не является строго необходимым - можно обойтись программатором ArduinoISP (потребуется любая ардуинка). Как это сделать описано в соответствующем мануале, но с программатором это сделать несколько проще.

Результатом нашего сегодняшнего урока должен стать модуль, который снимает данные о температуре с датчика DS18B20.

Работа с этим температурным датчиком очень проста - используется библиотека OneWire и для подключения датчика требуется задействовать всего один пин (естественно, потребуется еще подключить питание и "общий").

У самого элемента DS18B20 три вывода: 
  1. "Общий" (земля)
  2. Сигнальный
  3. Питание
Для подключения датчика потребуется еще один резистор номиналом 4.7кОм (подключается между сигнальным и питающим выводом датчика).

Когда DS18B20 продается не как компонент, а как датчик, часто необходимый резистор уже имеется в схеме и такой датчик подключается без каких либо дополнительных элементов.

У меня DS18B20 был только в виде электронного компонента (без какого либо "обвеса"), поэтому мне пришлось сделать из него датчик самостоятельно.

Для этого потребовался трехжильный кабель (земля, сигнальный, питание), трех-контактный разъем (уже не помню от какого компонента), резистор на 4.7кОм и небольшой кусочек термоусадки).

Разъем нужен для того, чтобы было удобно подключать к соответствующему разъему на плате iBoard. 

В процессе создания "датчика" я не фотографировал, поскольку все предельно просто и запутаться негде. Результат представлен ниже:

  • Коричневый провод - земля,
  • Красный - питание,
  • Желтый - сигнальный.
Датчик с такой распиновкой можно напрямую подключать к iBoard (естественно, согласно надписей на плате). 

Особенность работы этого датчика с iBoard в том, что во всех примерах описывается подключение его к цифровым пинам, а на iBoard все цифровые пины задействованы под другую периферию, а на разъем выведены только аналоговые (A0-A7).

Но это не является проблемой - пины A0-A5 можно использовать и как обычные цифровые. Пины A6 и A7 можно использовать только как аналоговые входы.

Подключим наш датчик на пин A5.

Соответственно, наш скетч для работы с датчиком температуры будет следующим:


#include <OneWire.h>
  byte data[12];
  byte addr[8];
  float celsius;
  
OneWire  ds(A5);  // on pin A5

void setup(void) {
  Serial.begin(9600);
  ds.search(addr);
  ds.reset();
  ds.select(addr);
}

void loop(void) {
  byte i;
  
  ds.search(addr);
  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);  
  
  delay(1000);     

  ds.reset();
  ds.select(addr);    
  ds.write(0xBE);  // Read Scratchpad

  for ( i = 0; i < 9; i++) data[i] = ds.read(); // we need 9 bytes

  unsigned int raw = (data[1] << 8) | data[0];
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw << 3;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
  celsius = (float)raw / 16.0;

  Serial.println(celsius);
}
Если вы все сделали правильно, то в мониторе порта появятся данные о текущей температуре:

Для теста я погрел датчик пальцами и потом отпустил: на скриншоте видно, как падает измеряемая температура (датчик охлаждается до комнатной температуры).

Теперь перейдем к той части, где готовимся к управлению "нагрузкой". 

В качестве нагрузки мы будем использовать обычные светодиоды (красный и зеленый - просто чтобы визуально можно было отличать). Для подключения воспользуемся имеющимися разъемами - будем использовать аналоговые пины в роли цифровых. Задействуем A0 (красный) и A1 (зеленый). 

Как известно, напрямую светодиоды не стоит подключать к выходам микроконтроллера - есть риск "спалить" соответствующий пин из-за слишком большого тока. Поэтому настоятельно рекомендуется ставить токоограничительные резисторы (номинал их может быть выбран достаточно произвольно, лишь бы результирующий ток не превысил допустимых 40мА на пин). Я использовал резисторы номиналом 330Ом.

Чтобы все было "красиво" использовал трех-контактнтые разъемы (задействованы только 2 пина - сигнальный и общий). Подключил светодиод и резистор последовательно. Всю конструкцию спрятал под термоусадкой. Получились вот такие "модули":


Для проверки работоспособности воспользуемся модифицированным скетчем blink:
#define greenLed A0
#define redLed A1

void setup() {                
  pinMode(greenLed, OUTPUT);     
  pinMode(redLed, OUTPUT);     
}

void loop() {
  digitalWrite(greenLed, HIGH);   
  digitalWrite(redLed, LOW);   
  delay(1000);               
  digitalWrite(greenLed, LOW);    
  digitalWrite(redLed, HIGH);    
  delay(1000);               
}
Если все сделано правильно - светодиоды будут "перемигиваться".

Теперь в вашем арсенале есть светодиодные модули (которые мы в дальнейшем будем использовать как "нагрузку") и датчик температуры.

Скетчи и необходимая для работы температурного датчика библиотека (OneWire) находятся в архиве по ссылке.

1 комментарий:

  1. Очень полезный "курс". Когда ждать продолжения?

    ОтветитьУдалить