Архив рубрики: Статьи

Статьи на произвольные темы, переводы

Обзор микросхемы монитора тока/мощности с I2C интерфейсом INA219

Микросхема INA219 производства Texas Instruments представляет из себя монитор тока/мощности с интерфейсом I2C, позволяет измерять напряжение на нагрузке в диапазоне от 0 до 26 В с точностью 0,2…1%, рассчитывать мощность как произведение тока, проходящего через нагрузку, на напряжение, подведенное к нагрузке. С помощью внешних перемычек позволяет запрограммировать до 16 адресов для работы по I2C.

Технические параметры

  • Напряжение питания: от 3 до 5,5В
  • Измеряемое напряжение: от 0 до 26В
  • Сигма-дельта АЦП: 12Bits
  • Диапазон измерения тока (входного) напряжения
  • Поддерживаемый протокол: I2C
  • Ток потребления: менее 1мА

Общие сведения

Для измерения тока микросхеме необходим внешний шунтирующий резистор. В состав чипа INA219 входит 12-разрядный аналого-цифровой преобразователь (АЦП). Для питания микросхемы необходимо напряжение от 3 до 5.5 В. Потребляемый ток микросхемы не превышает 1мА.

Одна из наиболее частых проблем при измерении – это шумы. Для минимизации их воздействия в INA219 применён сигма-дельта аналого-цифровой преобразователь. АЦП данного типа имеют хорошее шумоподавление. Кроме того, в INA219 имеется возможность усреднения результатов измерений путем выполнения серии измерений (до 128) с последующим нахождением среднего значения. Данный режим может быть удобен при наличии шумов в измеряемом напряжении. При усреднении измерения будут отнимать больше времени, однако точность результата возрастет.

Схема INA219

Для измерения тока и напряжения в чипе используются входы VIN+ и VIN‑.

Входы программируемого усилителя (Programmable Gain Amplifier, PGA) с помощью коммутатора могут подключаться двумя разными способами:

  • оба входа подключаются к VIN+ и VIN‑;
  • один вход подключается к VIN‑, а другой — к земле GND

Первый способ нужен для измерения тока. Предполагается, что между VIN+ и VIN‑ включен шунт и через него идет измеряемый ток. Второй способ применяется для измерения напряжения.

Выход PGA подключен ко входу АЦП. Результаты измерений из АЦП записываются в регистры тока Current Register и напряжения Voltage Register. В регистр мощности Power Register микросхема INA219 автоматически записывает произведение измеренного тока и напряжения.

Для чтения регистров используется интерфейс I2C. При этом с помощью входов A0 и A1 можно изменять адрес устройства на шине I2C.

Меняя подключения A0 и A1 есть возможность изменить адрес чипа INA219 на шине I2C. В зависимости от подключения А0 и А1 можно задать следующие адреса:

A1A0Адрес (bin)Адрес (hex)
GNDGND10000000x40
GNDVS+10000010x41
GNDSDA10000100x42
GNDSCL10000110x43
VS+GND10001000x44
VS+VS+10001010x45
VS+SDA10001100x46
VS+SCL10001110x47
SDAGND10010000x48
SDAVS+10010010x49
SDASDA10010100x4A
SDASCL10010110s4B
SCLGND10011000x4C
SCLVS+10011010x4D
SCLSDA10011100x4E
SCLSCL10011110x4F

Таким образом к одной шине I2C можно подключить до 16 адресов микросхем INA219.

Преобразование шрифтов из TrueType в Adafruit GFX

Многие проекты Arduino и готовые устройства поставляются с дисплеем. И многие из них используют драйвер дисплея Adafruit GFX для отображения шрифтов переменной ширины. Некоторые шрифты поставляются вместе с драйвером, но наступает момент, когда требуется сложная процедура добавления ваших собственных шрифтов. Это включает в себя компиляцию инструментов и процесс проб и ошибок, чтобы выяснить, насколько большим будет шрифт на вашем дисплее, а также каким будет новый шрифт относительно других шрифтов.

Но, теперь вы можете пропустить все это и с легкостью преобразовать шрифты, необходимые вашему проекту Arduino. Нет необходимости в инструментах компиляции, нет необходимости определять размер шрифта методом проб и ошибок. Просто выберите бесплатный шрифт или загрузите любой шрифт TrueType, выберите размер, выгрузите прилагаемый файл и получите готовый шрифт, который можно использовать в своем проекте.

Автором Rop Gonggrijp на площадке GitHub предложен вариант простого и быстрого преобразования шрифта онлайн. Если вы просто хотите использовать конвертер truetype в gfx можно воспользоваться его ресурсом.

Сам инструмент – это онлайн решение, которое работает без установки. Он доступен для использования на сайте, не нужно ничего устанавливать, достаточно просто следовать рекомендациям разработчика. На этой веб-странице есть не только инструмент, но и вся информация, которая понадобится для его использования.

Расширенные возможности

Помимо готового решения на GitHub автор публикует решение для самостоятельного запуска подобного сценария на своем ресурсе.

В этом репозитории есть исходный код PHP / Javascript и документы о том, как его установить, если вы хотите запустить копию на своем собственном сервере или просто посмотреть, как это было сделано. Для этого потребуется скопировать файлы из репозитория в каталог на своем сервере, на котором включен PHP. Также понадобится поддержка gd и freetype, включенная при установке PHP. С помощью phpinfo(), можно узнать, есть ли они там. В этот каталог также необходимо добавить скомпилированную версию Adafruit font converter tool (смотрите здесь) и убедиться, что она является исполняемой для пользователя, который запускает ваш веб-сервер.

Убедитесь, что каталог fonts/user доступен для записи пользователем веб-сервера.

Перевод ресурса truetype2gfx – Converting fonts from TrueType to AdafruitGFX

Обзор часов реального времени DS3231 (RTC)

Модуль DS3231 (RTC, ZS-042) — представляет собой недорогую плату с чрезвычайно точными часами реального времени (RTC), с температурной компенсацией кварцевого генератора и кристалла. Модуль включает в себя литиевую батарею, которая поддерживает бесперебойную работу, даже при отключении источник питания. Интегрированный генератор улучшить точность устройства и позволил уменьшить количество компонентов.

Технические параметры

  • Напряжение питания: 3.3В и 5В
  • Чип памяти: AT24C32 (32 Кб)
  • Точность: ± 0.432 сек в день
  • Частота кварца:32.768 кГц
  • Поддерживаемый протокол: I2C
  • Габариты: 38мм x 22мм x 15мм

Общие сведения

Большинство микросхем, таких как DS1307 используют внешний кварцевый генератор частотой 32кГц, но в них есть существенный недостаток, при изменении температуры меняется частота кварца, что приводит к погрешности в подсчете времени. Эта проблема устранена в чипе DS3231, внутрь которого установили кварцевый генератор и датчик температуры, который компенсирует изменения температуры, так что время остается точным (при необходимости, данные температуры можно считать). Так же чип DS3231 поддерживает секунды, минуты, часы, день недели, дата, месяц и год информацию, а так же следит за количеством дней в месяце и делает поправку на високосный год. Поддерживает работу часов в двух форматов 24 и 12, а так-же возможно запрограммировать два будильника. Модуль работает по двух проводной шине I2C.

Теперь немного о самом модуле, построен он на микросхеме DS3231N. Резисторная сборка RP1 (4.7 кОм), необходима для подтяжки линий 32K, SQW, SCL и SDA (кстати, если используется несколько модулей с шиной I2C, необходимо выпаять подтягивающие резисторы на других модулях). Вторая сборка резисторов, необходима для подтяжки линий A0, A1 и A2, необходимы они для смены адресации микросхемы памяти AT24C32N. Резистор R5 и диод D1, служат для подзарядки батарее, в принципе их можно выпаять, так как обычной батарейки SR2032 хватает на годы. Так же установлена микросхема памяти AT24C32N, это как бы бонус, для работы часов RTC DS3231N в ней нет необходимости. Резистор R1 и светодиод Power, сигнализируют о включении модуля. Как и говорилось, модуль работает по шине I2C, для удобства эти шины были выведены на два разъема J1 и J2, назначение остальных контактов, можно посмотреть ниже.

Назначение J1:

  • 32K:   выход, частота 32 кГц
  • SQW: выход
  • SCL:   линия тактирования (Serial CLock)
  • SDA:  линия данных (Serial Data)
  • VCC:   «+» питание модуля
  • GND: «-» питание модуля  

Назначение J2

  • SCL:  линия тактирования (Serial CLock)
  • SDA:  линия данных (Serial Data)
  • VCC:  «+» питание модуля
  • GND: «-» питание модуля

Немного о микросхеме AT24C32N. Это микросхема с 32к памятью (EEPROM) от производителя Atmel, собранная в корпусе SOIC8, работающая по двухпроводной шине I2C. Адрес микросхемы 0x57, при необходимости легко меняется, с помощью перемычек A0, A1 и A2 (это позволяет увеличить количество подключенных микросхем AT24C32/64). Так как чип AT24C32N имеет, три адресных входа (A0, A1 и A2), которые могут находится в двух состояния, либо лог «1» или лог «0», микросхеме доступны восемь адресов. от 0x50 до 0x57

Подключение DS3231 к Arduino

Необходимые детали:

  • Arduino NANO x 1 шт.
  • Часы реального времени на DS3231, RTC, SPI, AT24C32 x 1 шт.

Подключение:

В данном примере буду использовать только модуль DS3231 и Arduino NANO, все данные будут передаваться в «Мониторинг порта». Схема не сложная, необходимо всего четыре провода, сначала подключаем шину I2C, SCL в A5 (Arduino NANO) и SDA в A4 (Arduino NANO), осталось подключить питание GND к GND и VCC к 5V (можно записать и от 3.3В), схема собрана, теперь надо подготовить программную часть.

Библиотеки работающий с DS3231 нет в среде разработке IDE Arduino, необходимо скачать «DS3231 » и добавить в среду разработки Arduino.

Установка времени DS3231

В сети есть библиотека microDS3231 от Gyver. Свежую версию всегда можно установить/обновить из встроенного менеджера библиотек Arduino по названию microDS3231. Краткая документация находится по ссылке, базовые примеры есть в самой библиотеке.

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


#include <microDS3231.h>
MicroDS3231 rtc;
void setup() {
  rtc.setTime(COMPILE_TIME);
}
void loop() {
}

Она установит дату и время, равное времени компиляции программы, то есть текущее. После этого можно работать с модулем, например выведем дату и время разными способами:


#include <microDS3231.h>
MicroDS3231 rtc;
void setup() {
  Serial.begin(9600);
}
void loop() {
  // получаем и выводим каждый элемент отдельно
  Serial.print(rtc.getHours());
  Serial.print(":");
  Serial.print(rtc.getMinutes());
  Serial.print(":");
  Serial.print(rtc.getSeconds());
  Serial.print(" ");
  Serial.print(rtc.getDay());
  Serial.print(" ");
  Serial.print(rtc.getDate());
  Serial.print("/");
  Serial.print(rtc.getMonth());
  Serial.print("/");
  Serial.println(rtc.getYear());
  
  // выводим температуру модуля
  Serial.println(rtc.getTemperatureFloat());  
  
  // выводим дату и время готовыми строками
  Serial.println(rtc.getTimeString());
  Serial.println(rtc.getDateString());
}