Данная статья является продолжением предыдущей статьи, где был рассмотрен пользовательский конвертер USART-I/O для управления светодиодами с помощью ПК и программы Терминала. Здесь мы будем использовать ту же самую схему, за исключением того, что вместо светодиодов будет подключен датчик HTU21D с интерфейсом I2C, а вместо Терминала будет использоваться специализированная программа. Хотя один светодиод опционально оставлен, он будет показывать режим ожидания и измерения показаний, а второй светодиод нужен для питания датчиков 3-3,3 Вольт, на нем собрана схема питания. На одном светодиоде как раз падает около 1,8 В, что вполне достаточно для работы датчиков от питания 5 Вольт с ПК, без дополнительных стабилизаторов.
Датчик HTU21D
представляет собой цифровой датчик температуры и относительной влажности с всторенными АЦП и интерфейсом I2C. Для подключения датчика к компьютеру нужно создать для них интерфейс, так чтоб они друг друга понимали и могли общаться. USART-I/O из предыдущей статьи в данном случае и будет неким посредником, соединяющим датчик по I2C интерфейсу с ПК, программная реализация I2C при этом будет выполнятся полностью на стороне хоста, т.е. ПК, а физическая реализация будет выполняться USART-I/O на микроконтроллере ATmega8, задача которого только управлять уровнями на своих пинах. Кроме того, как и в прошлом опыте, будет еще использоваться USB-USART адаптер, но он будет управлятся на уровне драйвера операционной системы, и выходит за рамки данной статьи.
I2C интерфейс
имеет три линии SDA (данные), SCL (синхронизация) и Gnd (общий). Подключаем датчик согласно схеме. В принципе можно использовать любые свободные порты микроконтроллера, но они обязательно должны соответсвовать портам, к которым в свою очередь будет обращаться программа на компьютере.
Как же общаться с датчиком? Ведь нужно не только отправлять на него данные, но и принимать их с него. Конечно, можно общаться с ним и через программу Терминала как в прошлой статье, но это не будет эффективно, так как общение с датчиком идет пакетами байт. Поэтому вместо Терминала лучше использовать специальную программу, которая будет отправлять и принимать данные с датчика на компьютер, и выдавать данные с датчика в легко читаемом виде.
Датчик здесь является подчиненным устройством, то есть сам он не будет ничего читать и отправлять на компьютер. Микроконтроллер будет служить здесь в качестве моста между интерфейсами I2C датчика и COM (USART) хоста. То есть датчик будет "думать", что он сидит на линии I2C, в то время как весь протокол I2C будет осуществлятся на хосте в программе-клиенте, отправляющей данные на USART-I/O конвертер, поэтому перепрошивка микроконтроллера с предыдущего опыта не понадобится, ведь его задача здесь только устанавливать на своих выводах цифровые сигналы 0 и 1, через подтягивающий резистор.
Дружим датчик с компьютером
Порты микроконтроллера должны соответствовать портам которые опрашивает программа-клиент на ПК. Как уже было упомянуто в предыдущей статье:
данные отправляются на порты микроконтроллера через COM (USART) по 8 бит (1 Байт).
старшие два бита это - выбор порта МК для записи (PB, PC или PD), либо чтение портов, если равно 0.
младшие 6 бит это - выводы порта МК
т.е. "01хххххх" соответствует порту PB, "10хххххх" соответствует PC, "11хххххх" соответствует PD. Например, передача "01000001" будет подавать логический 1 на PB0 (SDA датчика) и логический 0 на PB1 (SCL датчика). Передача "00000000" будет подавать команду на чтение портов МК, в ответ на которую МК отправит 3 байта данных с портов PB, PC, PD.
Аппаратная часть - ATmega8
Схема похожа на использованную в предыдущей статье, где производилось управление светодиодами. Датчик подключен в виде отдельного модуля с уже установленными подтягивающими резисторами. PB0 используется как линия SDA, PB1 используется как линия SCL. Датчик питается через светодиод D2, от линии 5 Вольт с USB-USART адаптера, с учетом падения напряжения на светодиоде рабочее напряжение на датчике состовляет около 3,2 Вольт (максимальное напряжение датчика не более 3,8 В). D1 используется в качестве индикатора режима: измерение/ готовность. Подключение к ПК производится через USB-USART адаптер на базе специализированной микросхемы CH340G (на схеме не показана).
Сборка произведена беспаячным способом на макетной плате.
Программная часть - приложение на ПК
Полностью рассматривать программу-клиент в статье не будем, так как она содержит сотни строк кода. Остановимся на важных деталях. Для подробностей смотри исходный код по ссылке в конце статьи.
Программа-клиент представляет собой приложение WinForms, написанное на Си-шарп: Программа позволяет выбрать COM-порт и тип датчика, кнопка для начала измерения служит для обращения к датчику.
Передача данных по протоколу I2C производится пакетами по 9 бит, начиная со старшего, где первые 8 бит данные и последний бит ответа (подтверждение приема/ передачи). Вначале передается адрес устройства, с битом записи или чтения, затем передаются данные. В общем виде передача данных по I2C можно представить так: когда линия свободна (SCL=SDA=1), передается сигнал старт "S", передача адреса с битом записи, ответ ведомого (ACKS), передача команды, ответ ведомого (ACKS), повторный старт (Restart), передача адреса с битом чтения, ответ ведомого (ACKS), прием одного или нескольких байт данных, ответ мастера (ACKM), после последнего переданного байта мастер не отвечает (NACKM), передается сигнал остановки "Р", линия при этом освобождается (SCL=SDA=1), и готова к следующему обмену данными.
В самой программе-клиенте эти сигналы SDA и SCL генерируются посредством процедур WriteSDA() и WriteSCL(). Для начала передачи данных по шине нужно при свободной линии SDA=SCL=1 установить линию SDA=0, а затем SCL=0:
public static void Start()//начало обмена данных
{
WriteSDA(0);
WriteSCL(0);
}
что означает: SDA=0 (начало передачи данных), SCL=0 (ожидание записи/ чтения первого бита на линии SDA). При этом выводы микроконтроллера PB0 и PB1 устанавливается в "логический 0".
Данные SDA на шине I2C можно изменять только при SCL=0, то есть при SCL=0 данные записываются на линию SDA, а при SCL=1 данные читаются с линии SDA. Функции WriteSDA() и WriteSCL() принимают значения 0 или 1 и записывают их на COM порт с помощью COM_Write(int). Старшие 2 бита определяют порт I/O микроконтроллера ATmega8, младшие 2 бита соответственно выводы порта к которым подключен датчик:
private static void WriteSDA(int a)//передача SDA на датчик
{
SDA = a;
COM_Write(0x40 | SCL << 1 | SDA);
}
private static void WriteSCL(int a)//передача SCL на датчик
{
SCL = a;
COM_Write(0x40 | SCL << 1 | SDA);
}
Следующая процедура COM_Write(int data) передает 1 байт данных в порт COM (USART). При этом на сам датчик передается только 1 бит, содержащийся в SDA! Байт предается с помощью ".NET" функции Write(,,) объекта SerialPort:
public static void COM_Write(int data)//запись даннных в порт
{
try
{
if (Form1.serialPort.IsOpen == false) return;
byte[] bufWrite = new byte[] { (byte)data };
Form1.serialPort.Write(bufWrite, 0, 1);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
То есть, чтоб передать на датчик 1 байт по I2C, нужно отправить 9 байт через COM порт
По завершении передачи, переводим шину в состояние "Стоп":
public static void Stop()//конец обмена данных
{
WriteSCL(1);
WriteSDA(1);
}
В общем виде порядок общения с датчиком HTU21D в программе-клиенте выглядит так:
1.1.Старт передачи.
1.2.Передача адреса датчика с битом записи.
1.3.Передача команды измерения температуры или влажности.
1.4.Стоп передачи.
2.Ожидание измерения.
3.1.Старт передачи
3.2.Передача адреса датчика с битом чтения.
3.3.Чтение данных с датчика.
3.4.Стоп передачи.
3.5.Проверка CRC считанных данных (если имеется).
4. Конвертация "сырых" считанных данных по формулам из даташита и вывод их в окно программы.
Пример работы с программой для чтения датчиков можно посмотреть ниже.
Для более подробной информации по датчику HTU21D смотрите даташит на него.
Представленная ниже программа уже рассчитана для работы с датчиком HTU21D и некоторыми другими. Хотя поидее с помощью данной схемы можно подключить к ПК практически любое I2C устройство! (для каждого отдельного устройства потребуется своя программа-клиент, так как у разных устройств могут быть свои собственные адреса и команды)
Скачать прошивку для МК ATmega8:
Скачать Программу-клиент для чтения метеоданных с датчика:
Системные ребования: Windows, Framework 2+, клавиатура и/ или мыша.
Порядок установки: распаковать, запустить ЕХЕ.
Программа тестировалась на: core2Duo и 4 ГБ ОЗУ, хотя поидее должна пойти и на калькуляторе (но это не точено).
Все права сохранены. Допускается копирование материала с указанием автора и/ или ссылки на оригинальный материал. Все представленные в статье материалы предоставляются как есть, никаких гарантий не предполагается.