25.12.2012

IR-приемник на Arduino

Когда ваше устройство на основе Arduino переходит из фазы прототипизации в реальную жизнь, часто возникают вопросы типа "надо делать корпус" - и все из-за того, что отлично работающие под уютной настольной лампой, от лабораторного источника питания устройства могут не пережить и одной попытки использования в руках ребенка или "отчаянной" домохозяйки. Да я уж и не говорю о рассеянных авторах! ;)

Один из таких аспектов - дистанционный пульт для исполнительного устройства на основе Arduino. Изготавливать его самостоятельно может оказаться довольно муторным делом - во времена первых советских бытовых компьютеров, например, можно было изготовить самостоятельно пленочную клавиатуру или разобрать калькулятор с шикарными герконовыми клавишами. Но теперь, стоит нам оглянуться по сторонам - и на глаза обязательно должен попасться ИК-пульт от какой-то бытовой техники (телевизора, музыкального центра, кондиционера). Если управляемое устройство находится в прямой видимости управляющего - это определенно возможность схалявить наш вариант:


Как грамотно построить схему ИК-приемника? Начнем с краткой справки по структуре сигнала: обычно, это серия световых импульсов определенной частоты - что-то около 38 кГц. Импульсы по специальным правилам образуют посылки, в которых кодируются команды (проще говоря - каждой кнопке соответствует свой код). Для передачи используется инфракрасный светодиод, для получения - инфракрасный приемник.


В основе приемника обязательно лежит фотодиод: полупроводниковое устройство, реагирующее на свет небольшой ЭДС. Для использования получаемый сигнал надо немного усилить, очистить от помех и демодулировать. Стоит ли говорить, что намного практичнее использовать готовую схему - фотоприемник, который уже включает в себя перечисленные узлы:




Стоит запомнить, пожалуй, единственный принципиальный момент - от того, насколько соответствуют частоты пульта и приемника, зависит дальность приема. Иными словами, если излучение модулировано частотой 38 кГц, а фотоприемник по спецификации рассчитан на 36 кГц - все равно будет работать, только придется ближе подходить ;) Выглядят подобные устройства, например, так:



Подключить фотоприемник к Arduino можно с минимальным комплектом деталей:



Резистор R1 и емкость C1 нужны для стабилизации питания, подтягивающий резистор опционален (хотя, как вы понимаете, подтягивающий резистор уже есть в Arduino и использовать можно его).

В качестве библиотеки можно взять вариант от Ken Shirriff,  который не только поддерживает форматы NEC, SIRC, RC5, RC6, но и может принимать вообще "сырые" посылки, ни к одному известному коду не относящиеся (и умеет еще много другого, конечно же ;)

Первым делом надо загрузить в Arduino тестовый скетч IRecvDemo и решительно испытать на нем все необходимые кнопки вашего ИК-пульта, просматривая результат в окне Serial Monitor-а:

/*
 * IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv
 * An IR detector/demodulator must be connected to the input RECV_PIN.
 * Version 0.1 July, 2009
 * Copyright 2009 Ken Shirriff
 * http://arcfn.com
 */

#include <IRremote.h>

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }
}


В результате вы получите некоторую таблицу значений, которую можно использовать уже в скетче исполнительного устройства.

И, кстати, вызов decode  неблокирующийся. После его вызова управление сразу же возвращается и, таким образом, скетч может работать и "заниматься своими делами", принимая команды от пульта в фоновом режиме.

Не забудьте также посмотреть самое лучшее в инете описание IR-кодов на страницах SB Projects.

21.12.2012

ArduinoIDE 1.0.3

Вышла очередная версия ArduinoIDE 1.0.3. Самым значимым в списке изменений идет новая плата - Arduino Esplora (Leonardo-совместимая, на основе ATmega32u4):


В отличие от предыдущих плат, на этой есть сенсоры: фоторезистор, акселерометр, датчик температуры. Также есть четыре кнопки, аналоговый джойстик, пьезоизлучатель, трехцветный светодиод и линейный потенциометр. Разъемы для стыковки с LCD и несколько входов / выходов тоже присутствуют: 

Рулить всем этим многообразием помогает Esplora Library. Вообще, конечно же - это просто мечта для гаджетоманов-ардуинокопателей, которым не жалко потратить 65 USD. Но перед покупкой все-таки рекомендую пробежаться по Getting Started With Esplora.

Но вернемся к новой версии ArduinoIDE: нас ожидает пара незначительных фиксов, связанных с Leonardo-совместимыми платами. Один касается бутлоадера, другой - массива digital_pin_to_timer_PGM, описанного в variant-файле. 

Первый фикс реализует запуска скетча сразу после подачи питания (точнее, теперь-то это наконец работает). Что до variant-файла, то там банально восстановили кусок массива, пропавший где-то между версиями 1.0.1 и 1.0.2 - потенциально это могло вызывать фатальные неприятности при попытке включить аппаратный ШИМ на тех пинах, которые такой возможности не имели.


Исправления хоть и мелкие, но вполне разумные, поэтому рекомендую владельцам Freeduino 32u4 а) провести обновление поддержки своей платы в ArduinoIDE с помощью нового variant-файла и б) при наличии программатора, прошить новый бутлоадер. Со старым бутлоадером Caterina, естественно, тоже будет работать, но начиная с этого момента во все Leonardo-совместимые контроллеры в нашем магазине по умолчанию будет прошит новый вариант. Так что смело качайте и распаковывайте этот файл в каталог с установленной ArduinoIDE 1.0.3 (не забудьте ее перезапустить, чтобы изменения актуализировались).

В новостях также сообщается и про обновление кода для бутлоадера ATmega8, а также про поддержку скорости 600 бод библиотекой SoftwareSerial.

Словом, типичный релиз под новую плату, в который число случайно вошли несколько изменений.

И, судя по всему, число клонов Leonardo будет расти. Взять, например, новую "женскую" плату от Seeedstudio:



Если присмотреться, то видно несколько моментов:
  • есть колодки пинов и вилка программирования, так что скорее всего предполагается стыковка с шилд-платами;
  • присутствует холдер с батарейкой и переключателем питания - следовательно, возможна автономная работа и трехвольтовое питание платы/схемы;
  • на плате - ATmega328P и FT232RL (авторы утверждают, что в продажу пойдет плата  именно с ATmega32u4);
  • присутствует пара SMD-светодиодов ;)
Плата все еще не имеет названия, и если на языке вертится что-то подходящее - напишите им немедленно! ;)

15.12.2012

Температура и Влажность

Из серии статей про измерения температуры незаслуженно выпал сенсор DHT11, представляющий собой недорогой цифровой датчик температуры и влажности в одном корпусе:



В принципе -  одновременно измерять температуру и относительную влажность выглядит логично, поскольку второе напрямую зависит от первого. Стоит только начать работать батареям центрального отопления, как температура в квартире повышается, а вот количество влаги в воздухе - нет, оттого и говорят, что, мол, "батареи сушат воздух". Правильнее - "нагревают" и, таким образом, понижают относительную влажность.

Насколько важна влажность в помещении? Считается, что оптимум лежит около 50% - именно при такой влажности растения, люди и животные будут чувствовать себя комфортно. В частности - люди меньше болеют вирусными заболеваниями, а растения не рискуют превратиться в экибану.

Вот так устроен этот датчик внутри (а ведь он заменяет собой целый психрометр):


С одной стороны микроплатки - аналоговый сенсор, с другой - микросхема, оцифровывающая измерения и реализующая интерфейс с MCU. 

Протокол обмена - однопроводный, по структуре сильно похож на DS18B20, но с важными оговорками:
  • DHT11 не умеет работать в "паразитном" режиме (питание по линии данных);
  • каждый DS18B20 имеет персональный идентификатор, что дает возможность подключения нескольких таких датчиков к одному пину Arduino - у DHT11 такой возможности нет - один датчик будет использовать строго один цифровой пин.
DHT11 медленнее конвертирует измеренные значения - считывать их можно не чаще, чем раз в секунду. Погрешность у него тоже больше:

ПоказательDS18B20DHT11
Допустимый диапазон t,°C-55..+1250..+50
Погрешность измерения t, min±0.5°C@-10..+85°C±2°C@0..+50°C
Погрешность измерения t, max±2°C±2°C
Разрешение шкалы t,°C0.5/0.25/0.125,/0.06251
Допустимый диапазон RH, %-20..95
Погрешность измерения RH, min-±4% +25°C
Погрешность измерения RH, max-±5%
Разрешение шкалы RH, %-1

(для тех, кто склонен путать разрешающую способность и точность: хотя DS18B20 можно настроить таким образом, чтобы он отдавал 12-битные значения с разрешением 0,0625 градуса, его точность не станет лучше 0.5С. Но можно сделать "более живой" дисплей с отображением двух знаков после запятой ;)

Из характеристик видно невооруженным глазом, что DHT11 практически идеально подходит для жилых помещений и комнатных температур. Если датчик попадает в условия, выходящие за допустимые пределы, он начинает врать (попутно ускорится процесс старения аналогового сенсора), после чего требуется несложный процесс восстановления. Более подробно про это можно прочесть в описании: DHT11.pdf.

Как подключить DHT11 к Arduino? Начнем с расположения его пинов:


(третий пин не надо никуда подключать)

Рекомендуемая схема подключения содержит обязательный для однопроводных линий резистор-подтяжку к VCC и, в качестве опции, рекомендуется конденсатор (фильтр по питанию между VCC и GND):


На макетке это выглядит так (сенсор подключен к цифровому пину D8 платы Freeduino Nano):



Кстати, если вам в руки попал DHT11 на небольшой платке, можно подключать его напрямую к Arduino - скорее всего, резистор и конденсатор там уже и так есть:


Разберемся, как происходит обмен DHT11 с Arduino. Логически, это представляется такой последовательностью:
  1. Arduino запускает считывание показаний, переводя свой пин в режим выхода - как минимум на 18 миллисекунд переводит его в LOW, затем на 40 мкс в HIGH - и, после этого, переключает его в режим входа;
  2. Через 20..40 мкс DHT11 отвечает подтверждением, также сначала переводя шину в LOW на 80 мкс, а затем в HIGH на 80 мкс;
  3. DHT11 начинает побитную передачу информации, каждый бит начинается с уровня LOW в течение 50 мкс, и затем HIGH разной продолжительности: если 26-28 мкс, то это ноль, если же 70 мкс - единица;
  4. По окончании передачи 40 бит информации DHT11 "на прощание" еще раз переводит шину в LOW на 50 мкс и освобождает ее.
Полученная от DHT11 пачка из 40 бит представляется в виде последовательности из 5 байт следующего содержания:
  1. Целая часть значения влажности;
  2. Дробная часть значения влажности;
  3. Целая часть значения температуры;
  4. Дробная часть значения температуры;
  5. Контрольная сумма.
Как всегда, можно воспользоваться готовой библиотекой, которая считывает показания и вычисляет контрольную сумму для проверки. Что характерно, байты с дробной частью приходят всегда нулевые - пусть вас это не смущает, так и задумано ;)

Примеры использования DHT11 с Arduino: во-первых, данные можно выводить в последовательный порт и наблюдать на Serial Monitor:

#include <dht11.h>

dht11 sensor;

#define DHT11PIN 8

void setup()
{
  Serial.begin(115200);
  Serial.println("DHT11 TEST PROGRAM ");
  Serial.print("LIBRARY VERSION: ");
  Serial.println(DHT11LIB_VERSION);
  Serial.println();
}

void loop()
{
  Serial.println("\n");

  int chk = sensor.read(DHT11PIN);

  Serial.print("Read sensor: ");
  switch (chk)
  {
    case DHTLIB_OK: 
         Serial.println("OK"); 
         break;
    case DHTLIB_ERROR_CHECKSUM: 
         Serial.println("Checksum error"); 
         break;
    case DHTLIB_ERROR_TIMEOUT: 
         Serial.println("Time out error"); 
         break;
    default: 
         Serial.println("Unknown error"); 
         break;
  }

  Serial.print("Humidity (%): ");
  Serial.println(sensor.humidity);

  Serial.print("Temperature (oC): ");
  Serial.println(sensor.temperature);
  
  delay(2000);
}



Во-вторых, немного усложнив схему, можно выводить данные на LCD-дисплей:





#include <LiquidCrystalRus.h>
#include <dht11.h>

LiquidCrystalRus lcd(12, 11, 5, 4, 3, 2);
dht11 sensor;

#define DHT11PIN 8

void setup() {
  lcd.begin(16, 2);
  lcd.clear();
}

void loop() {
  switch (sensor.read(DHT11PIN)) {
    case DHTLIB_OK: 
                break;
    case DHTLIB_ERROR_CHECKSUM: 
                lcd.print("Checksum error");
                delay(2000);
                return;
    case DHTLIB_ERROR_TIMEOUT: 
                lcd.print("Time out error"); 
                delay(2000);
                return;
    default: 
                lcd.print("Unknown error"); 
                delay(2000);
                return;
  }
  lcd.setCursor(0, 0);
  lcd.print("Влажность,%:");
  lcd.print(sensor.humidity);
  lcd.setCursor(0, 1);
  lcd.print("Температура,C:");
  lcd.print(sensor.temperature);
  delay(2000);
  
}


Куда двигаться дальше? 

Если стремиться к увеличению точности, можно найти достаточное количество датчиков, наиболее близкие по исполнению - DHT21/22. Они же, соответственно, и более дороги.

Купить DHT11 можно, например, здесь.

Ссылки по теме:

12.12.2012

Ёлкадуино R2

Опять наступает декабрь, и снова хочется чего-то новогоднего. Если уважаемый читатель еще не забыл - в прошлом году был представлен проект новогоднего Arduino-совместимого дерева HNYduino. Практически сразу появились замечания и дополнения, и через год родилась версия R2:


Из предыдущей версии были унаследованы две 74HC595, к которым подключены по 8 зеленых и красных светодиодов (более подробно об увеличении числа пинов Arduino этим способом я уже писал). 

Но кое-что, конечно же, было изменено.


Первым делом ATmega328P была заменена на ATmega32u4, так что можно было бы сразу гордо писать Leonardo-compatible. Это сразу же добавило возможность и питать, и программировать ёлку напрямую от miniUSB (никаких дополнительных переходников USB-TTL не требуется). Возможность батарейного питания по-прежнему сохранена, переключение выполняется при помощи механического переключателя.


Расположенные в прежней версии по центру светодиоды убраны, а их место занял трехцветный пятимиллиметровый светодиод, подключенный к выводам, поддерживающим аппаратный ШИМ - таким образом можно подбирать практически любое сочетание цветов, плавно управляя яркостью через analogWrite().


Ближе к вершине располагается электретный микрофон, играющий роль датчика звука (чувствительность настраивается с помощью потенциометра, расположенного с противоположной стороны).


Выход датчика, кстати, подключен к аналоговому входу A0

Количество выводов, которые выведены на подставку сокращено до четырех - оставлены два аналоговых и два цифровых. Кроме них в вашем распоряжении вилка программирования ISP6 и отдельно выведенный UART.



Ну что, скажете "опять ерунда какая-то"? ;) 

Возможно, да. Но при помощи смекалки и навыков программирования Arduino с ее помощью можно сделать что-то забавное, красивое и даже полезное. Важно, в чьих руках она окажется ;)

Чертежи, схема, библиотека и примеры появятся в самое ближайшее время здесь и в wiki, купить готовый экземпляр можно здесь.



01.12.2012

ArduinoIDE 1.0.2

В конце октября - начале ноября произошло сразу несколько событий: была официально выпущена в продажу и почти сразу же распродана Arduino Due, вышла ArduinoIDE 1.5 специально для поддержки этой самой Due, затем вышла ArduinoIDE 1.0.2 - не поддерживающая Due, но содержащая много полезных фиксов для платы Leonardo.