Серия «Arduino»

Вольтамперметр для источника питания на INA226

Вольтамперметр для источника питания на INA226 Электроника, Arduino, Самоделки, Длиннопост

Микросхема INA226 (модуль) предназначена для высокоточного измерения напряжения, тока и потребляемой мощности. В модуле установлен шунт на 0,1 Ом, при этом модуль может измерять ток до 800 мА, но если заменить шунт например на 0,01 Ом, то диапазон измерения тока может быть расширен до 8 А.

Основные характеристики модуля на INA226:

  • Диапазон измеряемого напряжения 0–36 вольт

  • Максимальный ток 800 миллиампер (2 шага усиления, на 400 и 800 мА)

  • Напряжение питания 3 – 5,5 вольт

  • Потребляемая мощность (определяется самостоятельно):

    • Непрерывный режим: 0,35 мА

    • Режим пониженного энергопотребления: 2,3 мкА

  • Режимы измерения: непрерывный или по требованию

  • Количество выборок, которое собирается и усредняется 1, 4, 64, 128, 256, 512 или 1024

  • Время преобразования для измерения напряжения на восьми уровнях: от 0,14 до 8,2 мс

  • Связь через I2C, 4 настраиваемых адреса (модуль):

    • 0x40: A0, A1 не замкнут с VCC

    • 0x41: A0 = VCC, A1 не замкнут с VCC

    • 0x44: A0 не замкнут с VCC, A1 = VCC

    • 0x45: A0, A1 = VCC

На платформе Arduino (плата LGT8F328P-LQFP32 MiniEVB) используя модуль INA226 можно сделать простой, но высокоточный вольтамперметр для регулируемого источника питания, вся информация будет выводится на дисплей LCD1602 c модулем I2C. Дополнительно модуль производит измерение мощности, а измеряя потребляемый ток и время на дисплей можно выводить ампер-часы, что удобно при зарядке аккумуляторов. Так как будет измеряться ампер-часы, то будет добавлена кнопка для обнуления результата измерения.

Вольтамперметр для источника питания на INA226 Электроника, Arduino, Самоделки, Длиннопост
Вольтамперметр для источника питания на INA226 Электроника, Arduino, Самоделки, Длиннопост

Как использовать плату в Arduino IDE написано в статье — http://rcl-radio.ru/?p=129966

Настройки платы LGT8F328P-LQFP32 MiniEVB в Arduino IDE

Вольтамперметр для источника питания на INA226 Электроника, Arduino, Самоделки, Длиннопост

Помимо платы LGT8F328P-LQFP32 MiniEVB можно использовать плату Arduino Nano изменив значение регистра OCR1A на 15624.

Вывод монитора порта:

Вольтамперметр для источника питания на INA226 Электроника, Arduino, Самоделки, Длиннопост
Вольтамперметр для источника питания на INA226 Электроника, Arduino, Самоделки, Длиннопост

Скетч - http://rcl-radio.ru/?p=130346

Показать полностью 5

Источник питания 0-25В / 0-2А с токовой стабилизацией и цифровым управлением

На этой странице показан пример создания источника питания с регулируемым выходным напряжением от 0 до 25 В и током нагрузки от 0 до 2 А. В источнике питания предусмотрена токовая стабилизация от 0,2 до 2 А. Регулирование напряжения и тока стабилизации цифровое, выполнено на микроконтроллере LGT8F328 (LGT8F328P-LQFP32 MiniEVB).

Источник питания состоит из двух основных блоков:

  • Силовая часть, содержит несколько транзисторов и ОУ, а так же шунт для измерения тока.

  • Цифровая часть состоит из микроконтроллера LGT8F328, дисплея 0.96′ I2C 128X64 OLED (SSD1306) и органов управления в виде энкодера и одной кнопки.

Схема источника питания

Источник питания 0-25В / 0-2А с токовой стабилизацией и цифровым управлением Электроника, Arduino, Самоделки, Длиннопост
Источник питания 0-25В / 0-2А с токовой стабилизацией и цифровым управлением Электроника, Arduino, Самоделки, Длиннопост

Параметры дисплея SSD1306:

  • Технология дисплея: OLED

  • Разрешение дисплея: 128 на 64 точки

  • Диагональ дисплея: 0,96 дюйма

  • Угол обзора: 160°

  • Напряжение питания: 2.8 В ~ 5.5 В

  • Мощность: 0,08 Вт

  • Габариты: 27.3 мм х 27.8 мм х 3.7 мм

Энкодер KY-040

Источник питания 0-25В / 0-2А с токовой стабилизацией и цифровым управлением Электроника, Arduino, Самоделки, Длиннопост

Регулировка тока стабилизации и выходного напряжения

Источник питания 0-25В / 0-2А с токовой стабилизацией и цифровым управлением Электроника, Arduino, Самоделки, Длиннопост

На дисплей в верхней строке выводятся показания установленного напряжения (1), а так же измеренное напряжение на выходе (3). В нижней строке выводятся показания установленного тока стабилизации (2) и измеренный ток (4). Заначек «*»(5) показывает активный для регулировки параметр. Переключение регулировки тока/напряжения производится нажатием кнопки энкодера. Для включения/отключения выхода необходимо нажать кнопку OUT_ON_OFF.

Измерение напряжения и выходного тока производится с разрешением 12 бит. Все установленные параметры сохраняются в энергонезависимой памяти. Индикатор тока нагрузки начинает работать при токе выше 0,05 А.

Источник питания 0-25В / 0-2А с токовой стабилизацией и цифровым управлением Электроника, Arduino, Самоделки, Длиннопост

Для прошивки платы LGT8F328P-LQFP32 MiniEVB используется платформа Arduino. Как добавить плату LGT8F328P-LQFP32 MiniEVB в Arduino IDE написано в LGT8F328P-LQFP32 MiniEVB в Arduino IDE.

Источник питания 0-25В / 0-2А с токовой стабилизацией и цифровым управлением Электроника, Arduino, Самоделки, Длиннопост

Источник питания нуждается в регулировке, регулировка содержит 4 параметра (коэффициента):

#define U_OUT_K 508
#define I_OUT_K 1970
#define I_STAB_K 1210
#define U_OUT_IND 157

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

Настройка выходного напряжения

  • К выходу источника питания подключите вольтметр, установите при помощи энкодера выходное напряжение на дисплее (не на выходе ИП) 18 В.

Источник питания 0-25В / 0-2А с токовой стабилизацией и цифровым управлением Электроника, Arduino, Самоделки, Длиннопост
  • Подберите коэффициент U_OUT_K таким образом чтобы на выходе источника питания было 18,0 В.

Настройка измерителя напряжения

  • Установите при помощи энкодера выходное напряжение на дисплее 18 В.

Источник питания 0-25В / 0-2А с токовой стабилизацией и цифровым управлением Электроника, Arduino, Самоделки, Длиннопост
  • Подберите коэффициент U_OUT_IND таким образом чтобы на дисплее было 18,0 В.

Настройка измерителя тока

  • Установите при помощи энкодера выходное напряжение на выходе источника питания 18 В.

  • Подключите нагрузку 5-10 Ом, так чтобы выходной ток быть больше 1 А.

  • Измерьте амперметром полученный ток нагрузки.

Источник питания 0-25В / 0-2А с токовой стабилизацией и цифровым управлением Электроника, Arduino, Самоделки, Длиннопост
  • Подберите коэффициент I_OUT_K таким образом чтобы на показания тока на дисплее и измеренное амперметром были равны.

Настройка токовой стабилизации

  • Установите при помощи энкодера выходное напряжение на выходе источника питания 18 В.

  • Подключите нагрузку 5-10 Ом, так чтобы выходной ток быть больше 1 А.

Источник питания 0-25В / 0-2А с токовой стабилизацией и цифровым управлением Электроника, Arduino, Самоделки, Длиннопост
  • Установите значение тока стабилизации на 10-50% меньше тока нагрузки, например если выходной ток 1,45 А, то установите ток стабилизации на 1,00 А

  • Если ток нагрузки выше тока стабилизации, то источник питания перейдет в режим стабилизации тока и будет выводить значение выходной тока в режиме стабилизации тока, подберите коэффициент I_STAB_K таким образом, чтобы указанный ток стабилизации и выходной ток стали равными.

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

Скетч - http://rcl-radio.ru/?p=130243

Версия №2

Замена дисплея на LCD1602 I2C

Источник питания 0-25В / 0-2А с токовой стабилизацией и цифровым управлением Электроника, Arduino, Самоделки, Длиннопост
Источник питания 0-25В / 0-2А с токовой стабилизацией и цифровым управлением Электроника, Arduino, Самоделки, Длиннопост

Скетч — http://forum.rcl-radio.ru/viewtopic.php?pid=7520#p7520

Показать полностью 12

LGT8F328 ADC (Arduino IDE)

Микроконтроллер LGT8F328p и является клоном популярной AVR ATmega328p (Arduino NANO). Микроконтроллер LGT8F328p практически полностью совместим с микроконтроллером ATmega328p и обладает рядом дополнительных функций и возможностей превышающих ATmega328p.

LGT8F328 ADC (Arduino IDE) Arduino, Электроника, Самоделки, Программирование, Длиннопост
LGT8F328 ADC (Arduino IDE) Arduino, Электроника, Самоделки, Программирование, Длиннопост

Основные характеристики LGT8F328P

  • FLASH (ПЗУ): 32 Кбайт

  • SRAM (ОЗУ): 2 Кбайт

  • E2PROM (EEPROM): 0K / 1K / 2K / 4K / 8K (эмуляция)

  • PWM (ШИМ): 8

  • Частота: 32 МГц

  • АЦП: 9 пинов, 12 бит

  • ЦАП: 1 пин, 8 бит

  • Силовые пины: 4 (до 80 мА)

  • Таймеры 2x 8bit, 2x 16bit

  • UART: 1

  • SPI: 1

  • I2C: 1

  • PLL: 1

  • Опорное напряжение: 1.024В / 2.048В / 4.09В ± 0,5%

  • Логический уровень: 5В

Особенность АЦП в LGT8F328P является наличие нескольких опорных напряжений (1,024 В,  2,048 B, 4,096 B, VCC), несколько множителей входного сигнала (1, 8, 16 , 32) и увеличенная по сравнению Atmega328 разрядность АЦП до 12 бит. Так же имеется возможность использования дифференциального входа.

В статье будет показано несколько примеров использования ЦАП в LGT8F328P.

Стандартный код для измерения напряжения в Arduino IDE

void setup(){  

Serial.begin(9600);  

pinMode(A0,INPUT);  

analogReadResolution(12);// АЦП 12 БИТ  

analogReference(DEFAULT);// DEFAULT(Uп)

}

void loop(){  

Serial.println(analogRead(A0));  

delay(1000);  

}

На вход А0 подается напряжение 3,3 В (с платы LGT8F328P-LQFP32 MiniEVB) и измеренное напряжение выводится в монитор порта:

LGT8F328 ADC (Arduino IDE) Arduino, Электроника, Самоделки, Программирование, Длиннопост

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

void setup() {  

Serial.begin(9600);  

ADMUX |= 1 << REFS0 | 0b000;  

/*  REFS2 REFS1 REFS0  0 0 0 AREF  0 0 1 AVCC  0 1 0 2.048V  0 1 1 1.024V  1 0 0 4.096V  Бит REFS2 относится к регистру ADCSRD  */  

ADCSRA |= 1 << ADEN | 1 << ADSC | 1 << ADATE | 0b111;

}

void loop() {  

while((ADCSRA & (1 << ADIF)) == 0); 

int u_data = (ADCL|ADCH << 8);  

Serial.println(5.00/4096*u_data,2);  

delay(1000);

}

Вывод монитора порта:

LGT8F328 ADC (Arduino IDE) Arduino, Электроника, Самоделки, Программирование, Длиннопост

Рассмотрим подробнее выше показанный код:

ADMUX — регистр управления мультиплексора АЦП, позволяет выбрать источник опорного напряжения, выбрать источник входного сигнала и осуществить выравнивание по левому или по правому краю результата измерения.

LGT8F328 ADC (Arduino IDE) Arduino, Электроника, Самоделки, Программирование, Длиннопост

Выбор источника опорного напряжения:

LGT8F328 ADC (Arduino IDE) Arduino, Электроника, Самоделки, Программирование, Длиннопост

Обратите внимание, что бит REFS2 относится к регистру ADCSRD.

Выбор источника входного сигнала

LGT8F328 ADC (Arduino IDE) Arduino, Электроника, Самоделки, Программирование, Длиннопост

Как видно из кода:

ADMUX |= 1 << REFS0 | 0b0000;

выбрано опорно напряжение VCC (напряжение питания микроконтроллера), активен вход PC0 (A0).

ADCSRA — регистр A управления и состояния АЦП

LGT8F328 ADC (Arduino IDE) Arduino, Электроника, Самоделки, Программирование, Длиннопост

ADEN — бит управления включением АЦП. Если бит ADEN установлен на 1,то АЦП включен.

ADSC — бит начала преобразование АЦП. Если бит ADSC установлен на 1, то активно непрерывное преобразование.

ADATE — бит запуска включением автоматически управления АЦП. Если бит ADATE установлен на 1, активируется функция автоматического запуска.

ADPS — бит выбора коэффициент деления предделителя ADC.

LGT8F328 ADC (Arduino IDE) Arduino, Электроника, Самоделки, Программирование, Длиннопост

В коде выбраны все выше описанные биты регистра ADCSRA:

ADCSRA |= 1 << ADEN | 1 << ADSC | 1 << ADATE | 0b111;

После настройки конфигурации АЦП следует чтение регистров данных ADCH и ADCL. Следует отметить что первым необходимо считывать младший регистр данных ADCL.

Считывание данных возможно только после окончания преобразования, то есть как бит (флаг) ADIF станет равным 1.

while((ADCSRA & (1 << ADIF)) == 0);

После считываем данные:

int u_data = (ADCL|ADCH << 8);

и выводим результат в вольтах в монитор порта:

Serial.println(5.00/4096*u_data,2);

где:

5.00 — напряжение питания микроконтроллера, оно же и опорное

4096 — числовое значение равное максимальному числу 12 бит

Так как производится измерение напряжения 3,3 В, то целесообразней перейти на опорное напряжение 4,096 В для увеличения точности напряжения:

void setup() {  

Serial.begin(9600);

ADMUX = 0b000; ADCSRD |= 1 << REFS2;  

/*  REFS2 REFS1 REFS0  0 0 0 AREF  0 0 1 AVCC  0 1 0 2.048V  0 1 1 1.024V  1 0 0 4.096V  Бит REFS2 относится к регистру ADCSRD  */  

ADCSRA |= 1 << ADEN | 1 << ADSC | 1 << ADATE | 0b111;

}

void loop() {  

while((ADCSRA & (1 << ADIF)) == 0); 

int u_data = (ADCL|ADCH << 8);  

Serial.println(u_data/1000.00,2);  

delay(1000);

}

Монитор порта:

LGT8F328 ADC (Arduino IDE) Arduino, Электроника, Самоделки, Программирование, Длиннопост

Как видно по показаниям монитора порта, при использовании разных опорных напряжений результат меняется, но даже при опорном напряжении 4,096 В имеется погрешность.

В LGT8F328 имеется регистры калибровки VCAL1, VCAL2, VCAL3 для напряжения 1,024, 2,048 и 4,096. Регистр VCAL используется как общий для всех калибровочных значений. При включении по умолчанию выбрано опорное напряжение 1,024 В, калибровочное значение хранится в регистре VCAL1, которое записывается в регистр VCAL. Если выбрать например опорное напряжение 4,096 В , то значение регистра VCAL3 так же будет записано в регистр VCAL. Как видно по показаниям, значение VCAL3 не обеспечивает большую точность измерения. Для более точного изменения необходимо подобрать более точный коэффициент и записать его в регистр VCAL.

Для просмотра калибровочного коэффициента установленного производителем микроконтроллера можно воспользоваться командой:

Serial.println(VCAL3);  // 4,096 V

void setup() {  

Serial.begin(9600);

ADMUX = 0b000; ADCSRD |= 1 << REFS2;  

/*  REFS2 REFS1 REFS0  0 0 0 AREF  0 0 1 AVCC  0 1 0 2.048V  0 1 1 1.024V  1 0 0 4.096V  Бит REFS2 относится к регистру ADCSRD  */  

ADCSRA |= 1 << ADEN | 1 << ADSC | 1 << ADATE | 0b111;  

VCAL = 30;

}

void loop() {  

while((ADCSRA & (1 << ADIF)) == 0); 

int u_data = (ADCL|ADCH << 8);  

Serial.println(u_data/1000.00,2);  

delay(1000);

}

Монитор порта:

LGT8F328 ADC (Arduino IDE) Arduino, Электроника, Самоделки, Программирование, Длиннопост

Подобрав калибровочный коэффициент VCAL = 30, удалось значительно увеличить точность измерения.

Дифференциальный режим работы АЦП

Микроконтроллер LGT8F328 поддерживает дифференциальный режим работы аналогового входа. При этом на два аналоговых входа подается напряжение любой полярности не превышающее напряжение питания микроконтроллера.

Основные настройки дифференциального входа находятся в регистре DAPCR.

LGT8F328 ADC (Arduino IDE) Arduino, Электроника, Самоделки, Программирование, Длиннопост

Бит DAPEN разрешает работу дифференциального усилителя

Биты DNS[4:2] активируют работу инвертирующего входа дифференциальный усилителя

Биты DPS[1:0] активируют работу неинвертирующего входа дифференциальный усилителя

LGT8F328 ADC (Arduino IDE) Arduino, Электроника, Самоделки, Программирование, Длиннопост

Измерение напряжения поданного на дифференциальный вход происходит в два этапа. Сначала делаем первый вход как дифференциальный, а второй как аналоговая земля, проводим измерение, далее входы меняем местами, то есть первый вход делаем как аналоговая земля, а второй вход делаем дифференциальным. Далее снова проводим измерения. В итоге получается два измерения, для получения конечного результата надо из результата одного измерения вычесть результат второго измерения.

Перед измерением в регистре ADMUX указывает активный вход и при необходимости делаем выбор опорного напряжения.

Пример кода:

void setup() {

Serial.begin(9600);

ADCSRD |= 1 << REFS2;// REF 4.096

VCAL = 30;

ADCSRA |= 1 << ADEN | 1 << ADSC | 1 << ADATE | 0b111;

}

void loop() {

ADMUX = 0b11;

DAPCR = 0;

DAPCR |= 1 << DAPEN | 0b11001;

while((ADCSRA & (1 << ADIF)) == 0);

int u_data0 = (ADCL|ADCH << 8);

// Serial.println(u_data0);

delay(500);

ADMUX = 0b00;

DAPCR = 0;

DAPCR |= 1 << DAPEN | 0b00111;

while((ADCSRA & (1 << ADIF)) == 0);

int u_data1 = (ADCL|ADCH << 8);

// Serial.println(u_data1);

Serial.println(float(u_data0-u_data1)/1000);

delay(500);

}

LGT8F328 ADC (Arduino IDE) Arduino, Электроника, Самоделки, Программирование, Длиннопост

Для примера были выбраны входы А0 и А3 (ADC3 и ADC0), на них с элемента питания подается напряжение 1,5 В. Выбран внутренний опорный источник 4,096 В.

Как видно на скриншоте дифференциальный вход при смене полярности вполне корректно измерил напряжение элемента питания.

При выборе входа один должен быть инвертирующий, другой неинвертирующим. Так же измеряемое напряжение не должно иметь общего провода с GND микроконтроллера.

http://rcl-radio.ru/?p=130272

Показать полностью 13

Кодовый замок (Arduino)

Кодовый замок построен на базе Arduino, содержит минимальный набор элементов, выполнен в основном из модулей, прост в сборке.

Кодовый замок выполнен из следующих компонентов:

  • Плата LGT8F328p (можно применить Arduino Nano)

  • Гибкая матричная клавиатура 4 на 3 кнопки

  • Модуль реле 5 В

  • Модуль активного зуммера для Arduino

  • Электромагнитный замок 12 В

  • 6-и разрядный семисегментный дисплей на базе драйвера TM1637

Кодовый замок (Arduino) Arduino, Электроника, Самоделки, Длиннопост
Кодовый замок (Arduino) Arduino, Электроника, Самоделки, Длиннопост
Кодовый замок (Arduino) Arduino, Электроника, Самоделки, Длиннопост

Схема кодового замка

Кодовый замок (Arduino) Arduino, Электроника, Самоделки, Длиннопост

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

Вводимый код отображается на дисплее, код может состоять от 1 до 6 цифр.

Режим ожидания

Кодовый замок (Arduino) Arduino, Электроника, Самоделки, Длиннопост

Ввод кода

Кодовый замок (Arduino) Arduino, Электроника, Самоделки, Длиннопост

После введения кода необходимо нажать кнопку:

Кодовый замок (Arduino) Arduino, Электроника, Самоделки, Длиннопост

Кнопка # позволяет сбросить код на ноль.

Код введен не верно

Кодовый замок (Arduino) Arduino, Электроника, Самоделки, Длиннопост

Код введен верно, срабатывание запирающего механизма (электромагнитный замок 12 В)

Кодовый замок (Arduino) Arduino, Электроника, Самоделки, Длиннопост

Срабатывание запирающего механизма будет активно в течении 3 секунд, после реле управляющее запирающим механизмом будет неактивно.

Скетч содержит MASTER код, этот код можно изменить только через повторную прошивку платы микроконтроллера. Этот код позволяет собственного говоря задать код открытия двери.

#define MASTER 345623 // (необходимо изменить на свой код перед прошивкой микроконтроллера)

При вводе этого кода на дисплее появится следующая надпись:

Кодовый замок (Arduino) Arduino, Электроника, Самоделки, Длиннопост

Далее вводим код который Вы в дальнейшем будете использовать для открытия двери. Нажимаем * , происходит открывание запирающего механизма и занесение этого кода в EEPROM.

Скетч - http://rcl-radio.ru/?p=130919

Показать полностью 10

SX1509 — 16-канальный GPIO-интерфейс (Arduino)

SX1509 — 16-канальный GPIO-интерфейс (Arduino) Arduino, Программирование, Самоделки, Длиннопост

Модуль SX1509 — это 16-канальный GPIO-интерфейс с расширенными функциями, выпущенный компанией Semtech. Модуль имеет двухстороннюю связь с микроконтроллером, что обеспечивает высокую скорость передачи данных, а также позволяет использовать функции микроконтроллера для управления I/O-модулем.

Кроме 16 доступных для подключения каналов, модуль имеет встроенный светодиодный драйвер и поддерживает подключение клавиатуры (до 64 ключей).

Модуль SX1509 имеет широкий диапазон напряжений питания от 1,2 В до 3,6 В, что позволяет использовать его с большинством микроконтроллеров и устройств. Встроенные функции программирования позволяют настраивать каждый канал, чтобы он мог выполнять различные действия, такие как включение/выключение светодиодов, установка ШИМ на выходах, чтение состояний входных сигналов и так далее.

Управление модулем осуществляется при помощи шины I2C. Установить необходимый адрес I2C можно при помощи перемычек расположенный на обратной стороне платы модуля.

SX1509 — 16-канальный GPIO-интерфейс (Arduino) Arduino, Программирование, Самоделки, Длиннопост

По умолчанию используется I2C адрес 0x3E.

При выборе режима работы не все GPIO поддерживаю выбранный режим работы, используйте таблицу для выбора необходимого GPIO I/O.

SX1509 — 16-канальный GPIO-интерфейс (Arduino) Arduino, Программирование, Самоделки, Длиннопост

Модуль SX1509 может использоваться в различных приложениях, например, для управления светодиодами, датчиками, переключателями и другими устройствами. Он имеет простой и удобный интерфейс для программирования, что делает его привлекательным для начинающих разработчиков.

Read/Write GPIO

Ниже показан демонстрационный скетч, который демонстрирует работу чтения и записи GPIO входа/выхода. Для демонстрации работы скетча Вам необходимо подключить светодиод к выходу 15 (через сопротивление 100 Ом) и кнопку (нажатие — замыкание на GND) ко входу 0.

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

#include <Wire.h> 

#include <SparkFunSX1509.h> // http://librarymanager/All#SparkFun_SX1509 const byte SX1509_ADDRESS = 0x3E; //  

I2C address SX1509 io; 

const byte SX1509_LED_PIN = 15; // LED pin 15

const byte SX1509_BUTT // Button pin 0

bool ledState = false;

void setup(){  

Serial.begin(9600);

Wire.begin();  

pinMode(13, OUTPUT);

digitalWrite(13, LOW);  

if (io.begin(SX1509_ADDRESS) == false){

Serial.println("I2C ERROR");  

digitalWrite(13, HIGH);

while(1);}  

io.pinMode(SX1509_LED_PIN, OUTPUT);

io.pinMode(SX1509_BUTTON_PIN, INPUT_PULLUP);

}

void loop(){  

if (io.digitalRead(SX1509_BUTTON_PIN) == LOW){ 

Serial.print("BUTTON_PIN status: "); 

Serial.println(io.digitalRead(SX1509_BUTTON_PIN)); 

ledState = !ledState; 

io.digitalWrite(SX1509_LED_PIN, ledState); 

Serial.print("LED_PIN status: "); 

Serial.println(ledState); 

Serial.print("Waiting for button to release..."); 

while (io.digitalRead(SX1509_BUTTON_PIN) == LOW); 

Serial.println("Button released!"); 

delay(200);  }

}

PWM GPIO

Каждый выход GPIO может работать как PWM выход с разрешением 8 бит. Следующий скетч демонстрирует работу PWM. К выходу 15 GPIO подключен светодиод (через сопротивление 100 Ом), после загрузки скетча он будет плавно загораться и гаснуть.

#include <Wire.h> 

#include <SparkFunSX1509.h> // http://librarymanager/All#SparkFun_SX1509

const byte SX1509_ADDRESS = 0x3E; //  I2C address

SX1509 io; 

const byte SX1509_LED_PIN = 15; // LED pin 15

bool ledState = false;

void setup(){  

Serial.begin(9600);  

Wire.begin();  

pinMode(13, OUTPUT);  

digitalWrite(13, LOW);  

if (io.begin(SX1509_ADDRESS) == false){

Serial.println("I2C ERROR");  

digitalWrite(13, HIGH);

while(1);}  

io.pinMode(SX1509_LED_PIN, ANALOG_OUTPUT);

}

void loop(){

for (int brightness = 0; brightness < 256; brightness++){ 

io.analogWrite(SX1509_LED_PIN, brightness); 

delay(2);  

}  

delay(500);  

for (int brightness = 255; brightness >= 0; brightness--){ 

io.analogWrite(SX1509_LED_PIN, brightness); 

delay(2);  

}  

delay(500);

}

OSC OUTPUT

SX1509 имеет внутренний генератор с частотой 2 МГц, за счет деления этой частоты на выходе OSC можно получить меандр, частота которой рассчитывается по формуле:

Fpin_osc = Fosc/2^(outputFreq-1)

Следует отметить то, что внутренний генератор SX1509 имеет весьма большую погрешность.

#include <Wire.h> 

#include <SparkFunSX1509.h> // http://librarymanager/All#SparkFun_SX1509

const byte SX1509_ADDRESS = 0x3E; //  I2C address

SX1509 io;  // PIN OSC OUTPUT

bool ledState = false;

void setup(){  

Serial.begin(9600);  

Wire.begin();  

pinMode(13, OUTPUT);  

digitalWrite(13, LOW);  

if (io.begin(SX1509_ADDRESS) == false){

Serial.println("I2C ERROR");  

digitalWrite(13, HIGH);

while(1);

byte outputFreq = 4;  

io.clock(INTERNAL_CLOCK_2MHZ, 2, OUTPUT, outputFreq);  //Fpin_osc = Fosc/2^(outputFreq-1)  //Fpin_osc = 2 000 000 / 2^3 = 2 000 000 / 8 = 250 000 Hz

}

void loop(){}

digitalReadInterrupt

В модуле SX1509 имеется выход Interrupt (INT) для вывода сигнала прерывания. В данном примере при нажатии кнопку которая подключена ко входу GPIO 0, происходит прерывание, на выходе INT появляется сигнал прерывания.

io.enableInterrupt(SX1509_BUTTON_PIN, FALLING);

Сигнал прерывания подается на вход D2 платы Arduino. Arduino так же настроено на работу с прерыванием.

attachInterrupt(digitalPinToInterrupt(ARDUINO_INT_PIN),button, FALLING);

attachInterrupt задает функцию обработки внешнего прерывания, то есть функция, которая будет вызвана по внешнему прерыванию.

При появлении сигнала прерывания на D2, происходит прерывание, исполняется функция button() которая устанавливает флаг прерывания buttonPressed в true.

Так как флаг buttonPressed true, в цикле loop() исполняется код который выводит состояние флага buttonPressed и меняет его на false, что блокирует повторное исполнение кода до следующего нажатии кнопки.

#include <Wire.h> 

#include <SparkFunSX1509.h> // http://librarymanager/All#SparkFun_SX1509

const byte SX1509_ADDRESS = 0x3E; //  I2C address

SX1509 io; 

const byte SX1509_BUTTON_PIN = 0; // IO 0 connected to button // Arduino Pins (not SX1509!)

const byte ARDUINO_INT_PIN = 2; // SX1509 int output to D2

bool buttonPressed = false; // Track button press in ISR

void setup(){  

Serial.begin(9600);  

Wire.begin();  

pinMode(13, OUTPUT);  

digitalWrite(13, LOW);  

if (io.begin(SX1509_ADDRESS) == false){

Serial.println("I2C ERROR");  

digitalWrite(13, HIGH);

while(1);

io.pinMode(SX1509_BUTTON_PIN, INPUT_PULLUP); 

io.enableInterrupt(SX1509_BUTTON_PIN, FALLING);  //  0, 1, 2, 4, 8, 16, 32, or 64 ms.

io.debounceTime(32);  

io.debouncePin(SX1509_BUTTON_PIN);  

pinMode(ARDUINO_INT_PIN, INPUT_PULLUP);

attachInterrupt(digitalPinToInterrupt(ARDUINO_INT_PIN),button, FALLING);

}

void loop(){  

if (buttonPressed){ 

unsigned int intStatus = io.interruptSource(); 

Serial.println("intStatus = " + String(intStatus, BIN)); 

if (intStatus & (1 << SX1509_BUTTON_PIN)){ 

Serial.println("Button pressed!"); 

buttonPressed = false;  

}

}

void button(){

buttonPressed = true;

}

Дополнительно в скетче используется функции io.debounceTime() и io.debouncePin() позволяющие устранить дребезг нажатия кнопки. В io.debounceTime() указывается время задержки после нажатия кнопки, а io.debouncePin() указывается номер GPIO который используется для кнопки.

SX1509 — 16-канальный GPIO-интерфейс (Arduino) Arduino, Программирование, Самоделки, Длиннопост

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

http://rcl-radio.ru/?p=130487

Показать полностью 3

MCP23017 — расширитель портов GPIO (Arduino)

MCP23017 —  расширитель портов GPIO, который позволяет управлять до 16 цифровыми устройствами через один интерфейс I2C. Он имеет два порта по 8 GPIO каждый, что позволяет контролировать 16 цифровых сигналов с помощью всего двух выводов микросхемы.

Основные параметры MCP23017:

— Напряжение питания: 1,8 В — 5,5 В
— Количество портов ввода-вывода: 16 (2 порта по 8 GPIO)
— Интерфейс связи: I2C
— Максимальный ток, выдаваемый на каждый порт: 25 мА
— Возможность программной настройки каждого GPIO на вход или выход, а также на подтягивание к питанию или земле.

MCP23017 может использоваться во многих приложениях, включая управление светодиодами, кнопками, дисплеями, реле, сенсорами и т.д.

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

MCP23017 имеет два регистра конфигурации (IODIRA и IODIRB), которые позволяют настроить каждый порт на вход или выход. Кроме того, есть два регистра подтягивающих резисторов (GPPUA и GPPUB), которые позволяют подключить подтягивающие резисторы к каждому порту, что может быть полезно, например, при использовании кнопок.

MCP23017 также имеет регистры для чтения и записи состояния каждого порта (GPIOA и GPIOB), а также регистры для управления состоянием портов (OLATA и OLATB), что позволяет микроконтроллеру устанавливать или считывать состояние портов с помощью I2C интерфейса.

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

Возможности MCP23017 можно расширить, используя несколько микросхем вместе. Например, можно подключить несколько MCP23017 к одному интерфейсу I2C и управлять до 128 GPIO (8 микросхем по 16 GPIO). При этом каждая микросхема должна иметь уникальный адрес, который можно настроить с помощью специальных пинов на микросхеме.

MCP23017 может иметь до 8 уникальных адресов, которые можно настроить с помощью пинов A0, A1 и A2 на микросхеме. В таблице приведены возможные адреса для MCP23017:

A2 A1 A0  Адрес
0  0  0  0x20
0  0  1  0x21
0  1  0  0x22
0  1  1  0x23
1  0  0  0x24
1  0  1  0x25
1  1  0  0x26
1  1  1  0x27

В целом, MCP23017 является удобным и мощным расширителем портов, который может быть использован во многих различных проектах для управления цифровыми устройствами.

Расширитель портов MCP23017 можно приобрести в виде готового модуля cjmcu-2317:

MCP23017 — расширитель портов GPIO (Arduino) Программирование, Arduino, Длиннопост

Для тестирования модуля необходимо замкнуть контакты А0 А1 А2 на VCC или GND для получения нужного Вам I2C адреса.

При замыкании контактов А0 А1 А2 на GND и загрузив сканер I2C портов (скетч можно найти в примерах Arduino IDE), в мониторе можно увидеть установленный I2C адрес:

MCP23017 — расширитель портов GPIO (Arduino) Программирование, Arduino, Длиннопост

Для удобства использования расширителя портов можно воспользоваться библиотекой — Adafruit-MCP23017-Arduino-Library-master, дополнительно Вам может понадобится библиотека — Adafruit_BusIO-master.

При обращении к пинам расширителя портов в Arduino IDE используйте таблицу:

MCP23017 — расширитель портов GPIO (Arduino) Программирование, Arduino, Длиннопост

Примеры использования

  • Blink (Мигание светодиодом)

Подключите светодиод в пину А0 (через резистор 100 Ом). После загрузки скетча светодиод начнет мигать с периодом 1 секунда.

#define LED_PIN  0 // LED PIN A0

#include <Adafruit_MCP23X17.h>

Adafruit_MCP23X17 mcp;

void setup() {  

Serial.begin(9600);  

mcp.begin_I2C(0x20);  

mcp.pinMode(LED_PIN, OUTPUT);

}

void loop() {  

mcp.digitalWrite(LED_PIN, HIGH);  

delay(500);  

mcp.digitalWrite(LED_PIN, LOW);  

delay(500);

}

  • Read/Write GPIO

Ниже показан демонстрационный скетч, который демонстрирует работу чтения и записи GPIO входа/выхода. Для демонстрации работы скетча Вам необходимо подключить светодиод к выходу А0 (через сопротивление 100 Ом) и кнопку (нажатие — замыкание на GND) ко входу А1.

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

#define LED_PIN  0 // LED PIN A0

#define BUTTON_PIN 1 // BUTTON PIN A1

#include <Adafruit_MCP23X17.h>

Adafruit_MCP23X17 mcp;

bool ledState = false;

void setup() {

Serial.begin(9600);  

mcp.begin_I2C(0x20);  

mcp.pinMode(LED_PIN, OUTPUT);  

mcp.pinMode(BUTTON_PIN, INPUT_PULLUP);

}

void loop() {

if (mcp.digitalRead(BUTTON_PIN) == LOW){ 

ledState = !ledState;  mcp.digitalWrite(LED_PIN, ledState);  

while (mcp.digitalRead(BUTTON_PIN) == LOW);  delay(200);

} }

  • Interrupt

В ИМС MCP23017 имеются 2 выхода Interrupt (INTA/INTB), отдельно для каждого порта А и В для вывода сигнала прерывания. В данном примере при нажатии кнопку которая подключена ко входу А4, происходит прерывание, на выходе INTА появляется сигнал прерывания. Вывод INTА подключен ко входу D7 платы Arduino для считывания сигнала прерывания.

При нажатии на кнопку происходит прерывание, сигнал прерывания поступает на вход D7 и в мониторе порта появляется сообщение о прерывании с определением номера пина источника прерывания.

Определение номера пина источника прерывания происходит при помощи функции mcp.getLastInterruptPin().

MCP23017 — расширитель портов GPIO (Arduino) Программирование, Arduino, Длиннопост

#define INT_PIN  7 // вывод микроконтроллера, подключенный к INTA/B

#define BUTTON_PIN 4 // BUTTON PIN A4

#include <Adafruit_MCP23X17.h>

Adafruit_MCP23X17 mcp;

bool ledState = false;

void setup() {  

Serial.begin(9600);  

mcp.begin_I2C(0x20);  

pinMode(INT_PIN, INPUT);  

mcp.setupInterrupts(true, false, LOW);  

// INTA/B будет НИЗКИМ при наступлении прерывания  

// MCP23XXX поддерживает следующие режимы прерывания:  

//  * CHANGE - прерывание происходит, если вывод переходит в противоположное состояние  

//  * НИЗКИЙ - прерывание происходит, когда состояние вывода LOW  

//  * HIGH - прерывание происходит, когда состояние вывода HIGH  

mcp.pinMode(BUTTON_PIN, INPUT_PULLUP);  

mcp.setupInterruptPin(BUTTON_PIN, LOW);  // разрешить прерывание на button_pin

}

void loop() {

if (!digitalRead(INT_PIN)) { 

Serial.print("Interrupt detected on pin: "); 

Serial.println(mcp.getLastInterruptPin()); 

delay(250); 

mcp.clearInterrupts();  // clear

} }

http://rcl-radio.ru/?p=130545

Показать полностью 4

LCD1602 8-и битный режим работы (Arduino)

LCD1602 — это электронный дисплей, используемый в различных электронных устройствах с микроконтроллерным управлением. Он состоит из 16 символов в 2 линии и имеет подсветку, что позволяет использовать его в условиях недостаточного освещения.

LCD1602 8-и битный режим работы (Arduino) Arduino, Электроника, Самоделки, Длиннопост

Описание подключения:

Дисплей LCD1602 подключается к микроконтроллеру с помощью 16-ти контактного шлейфа.

Описание контактов:

1. VSS — земля
2. VDD — питание (обычно 5 В)
3. V0 — контрастность
4. RS — выбор режима: 0 — команда, 1 — данные
5. RW — выбор направления передачи данных: 0 — запись, 1 — чтение
6. E — сигнал строба (синхронизации)
7-14. D0-D7 — 8-битная шина данных
15. A — подсветка (+)
16. K — подсветка (-)

Обратите внимание, что в некоторых дисплеях выводы VSS и VDD могут быть поменяны местами.

Описание работы:

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

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

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

Таким образом, при подаче напряжения на определенные электроды, жидкие кристаллы в определенных ячейках меняют свою ориентацию и создают изображение на экране. В дисплее LCD1602 каждая ячейка представляет собой один символ, который можно отобразить на экране.

Для управления дисплеем LCD1602 используется контроллер HD44780, который управляет подачей напряжения на электроды и контролирует отображение символов на экране. Контроллер принимает команды и данные через шину данных и выбранные контакты, и использует их для управления отображением информации на экране.

Контроллер HD44780 имеет два режима работы: командный и режим передачи данных. В командном режиме контроллер принимает команды для управления экраном, такие как выбор режима отображения (символьный или графический), выбор строки и столбца, настройка контрастности и т.д. В режиме передачи данных контроллер принимает данные для отображения на экране.

Дисплей LCD1602 может отображать символы, цифры, знаки препинания и специальные символы и т.д. Он также может отображать символы созданные пользователем.

В целом, дисплей LCD1602 — это удобный и недорогой способ отображения информации в электронных устройствах. Он легко подключается и управляется, и может использоваться для различных задач, от отображения текста до отображения графики.

Дисплей LCD1602 может работать в двух режимах передачи данных: 4-х и 8-и битном. Режим передачи данных определяет количество бит, передаваемых на шину данных за один раз.

LCD1602 8-и битный режим работы (Arduino) Arduino, Электроника, Самоделки, Длиннопост

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

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

Для выбора режима передачи данных на дисплее LCD1602 используется команда функции. В команде функции можно выбрать 4-х или 8-и битный режим передачи данных, а также установить другие параметры, такие как количество строк и размер символа.

В этой статье будет рассмотрен 8-и битный режим работы дисплея, сравнение скорости работы в 8-битной и 4-битном подключении.

При 8-и битном подключении соберите схему показанную на рисунке:

LCD1602 8-и битный режим работы (Arduino) Arduino, Электроника, Самоделки, Длиннопост

Далее загрузите скетч:

#include <LiquidCrystal.h>  

LiquidCrystal lcd(12, 11, 2, 3, 4, 5, 6, 7, 8, 9); // RS E D0 D1 D2 D3 D4 D5 D6 D7

int i;

unsigned long times;

void setup(){  

Serial.begin(9600);  

lcd.begin(16, 2); 

lcd.clear(); 

}

void loop(){  

times=millis();  

for(int i1=0;i1<10000;i1++){  

lcd.setCursor(0, 0); 

lcd.print("LCD1602"); 

lcd.setCursor(0, 1); 

lcd.print(i++);  

lcd.clear(); 

i=0;  

Serial.print("8-bit ");

Serial.println(millis()-times);

delay(1000);

}

LCD1602 8-и битный режим работы (Arduino) Arduino, Электроника, Самоделки, Длиннопост

Скетч в цикле выводит надпись «LCD1602» в первой строчке дисплея, и число от 0 до 10000 во второй строчке. Далее по завершению работы цикла выводится время выполнения цикла.

LCD1602 8-и битный режим работы (Arduino) Arduino, Электроника, Самоделки, Длиннопост

В итоге 10000 обновлений информации на экране дисплея занимает 25948 мс при 8-и битном подключении.

Для сравнения скорости работы соберем схему с 4-х битным подключением:

LCD1602 8-и битный режим работы (Arduino) Arduino, Электроника, Самоделки, Длиннопост

Далее загрузите скетч:

#include <LiquidCrystal.h>  

LiquidCrystal lcd(12, 11, 6, 7, 8, 9); // RS E D4 D5 D6 D7

int i;

unsigned long times;

void setup(){  

Serial.begin(9600);  

lcd.begin(16, 2); 

lcd.clear(); 

}

void loop(){  

times=millis();  

for(int i1=0;i1<10000;i1++){  

lcd.setCursor(0, 0); 

lcd.print("LCD1602"); 

lcd.setCursor(0, 1); 

lcd.print(i++);  

lcd.clear(); 

i=0; 

Serial.print("4-bit ");

Serial.println(millis()-times); 

delay(1000);

}

LCD1602 8-и битный режим работы (Arduino) Arduino, Электроника, Самоделки, Длиннопост

В итоге 10000 обновлений информации на экране дисплея занимает 41429 мс при 4-х битном подключении.

Как видно 8-и битном режиме подключения скорость работы дисплея выросла на 62 %.

Использование библиотеки  LiquidCrystal заметно упрощает использование дисплея на платформе Arduino, но все же было бы интересно измерить скорость работы дисплея без использования библиотеки.

Для тестирования дисплея без использования библиотеки загрузите скетч:

// Подключаем пины Arduino к пинам LCD1602

const int rs = 12, en = 11, d0 = 2, d1 = 3, d2 = 4, d3 = 5, d4 = 6, d5 = 7, d6 = 8, d7 = 9;

int int_out;

unsigned long times;

void setup() { 

Serial.begin(9600);  

// Устанавливаем пины в режим вывода  

pinMode(rs, OUTPUT);  

pinMode(en, OUTPUT);  

pinMode(d0, OUTPUT);  

pinMode(d1, OUTPUT);  

pinMode(d2, OUTPUT);  

pinMode(d3, OUTPUT);  

pinMode(d4, OUTPUT);  

pinMode(d5, OUTPUT);  

pinMode(d6, OUTPUT);  

pinMode(d7, OUTPUT);  

// Инициализируем экран  

lcd_init();

}

void loop() {  

times=millis();  

for(int i1=0;i1<10000;i1++){  

lcd_command(0x80);  

lcd_print("LCD1602");  

lcd_command(0xC0);  

lcd_print(String(int_out++));  

lcd_command(0x01); 

int_out=0; 

Serial.print("8-bit ");

Serial.println(millis()-times); 

delay(1000);

}

void lcd_init() {  

// Инициализация экрана  

delay(100);  

lcd_command(0x03);

delayMicroseconds(4500);  

lcd_command(0x03);

delayMicroseconds(4500);  

lcd_command(0x03);

delayMicroseconds(200);  

lcd_command(0x02);  

lcd_command(0x38);  

lcd_command(0x0C);  

lcd_command(0x01);

}

void lcd_command(byte cmd) {  

// Отправляем команду на экран  

digitalWrite(rs, LOW);

delayMicroseconds(100);  

lcd_write(cmd);

}

void lcd_print(String str) {  

// Выводим строку на экран  

digitalWrite(rs, HIGH);  

for (int i = 0; i < str.length(); i++) { 

lcd_write(str[i]);  

}

}

void lcd_write(byte data) {  

// Отправляем данные на экран  

digitalWrite(d7, (data >> 7) & 0x01);  

digitalWrite(d6, (data >> 6) & 0x01);  

digitalWrite(d5, (data >> 5) & 0x01);  

digitalWrite(d4, (data >> 4) & 0x01);  

digitalWrite(d3, (data >> 3) & 0x01);  

digitalWrite(d2, (data >> 2) & 0x01);  

digitalWrite(d1, (data >> 1) & 0x01);  

digitalWrite(d0, (data >> 0) & 0x01);  

digitalWrite(en, HIGH);  

delayMicroseconds(1);  

digitalWrite(en, LOW);  

delayMicroseconds(50);

}

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

LCD1602 8-и битный режим работы (Arduino) Arduino, Электроника, Самоделки, Длиннопост

Как видно при 8-и битном режиме подключения скорость работы дисплея выросла более чем в два раза по сравнению с 4-х битным подключении при использовании библиотеки LiquidCrystal.

В целом, использование 4-х или 8-и зависит от конкретных требований и ограничений проекта. Если в проекте необходимо передавать большой объем данных на дисплей, то 8-и битный режим может быть более эффективным выбором, поскольку он позволяет передавать больше информации за один раз. Однако, если количество доступных контактов ограничено или нужно минимизировать занимаемое пространство, то 4-х битный режим может быть предпочтительнее.

Также следует учитывать, что использование 8-и битного режима требует более мощного контроллера, чем 4-х битный режим, поэтому для некоторых проектов 4-х битный режим может быть более оптимальным выбором.

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

http://rcl-radio.ru/?p=130468

Показать полностью 7

Часы на дисплее 0.54 14-segment LED HT16K33 и GPS модуле (Arduino IDE)

GPS (Global Positioning System) — это глобальная спутниковая система навигации, разработанная и поддерживаемая правительством США. Она позволяет определять координаты и время в любой точке Земли с помощью спутников, которые находятся на орбите вокруг Земли.

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

GPS широко используется в навигации, геодезии, геоинформационных системах, мониторинге транспорта и других областях. Он позволяет точно определять местоположение и перемещение объектов на Земле, что делает его важным инструментом для различных приложений.

Часы на дисплее 0.54 14-segment LED HT16K33 и GPS модуле (Arduino IDE) Электроника, Arduino, Самоделки, Длиннопост

Модуль NEO-6M GPS — это компактное устройство, которое используется для определения координат и времени с помощью спутниковой системы GPS. Модуль NEO-6M GPS включает в себя высокочувствительный приемник GPS-сигналов, а также микроконтроллер для обработки полученных данных.

Основными характеристиками модуля NEO-6M GPS являются:

— Высокая точность определения координат и времени

— Широкий диапазон рабочих температур (-40…+85°C)

— Поддержка нескольких систем спутниковой навигации (GPS, GLONASS, Galileo, BeiDou)

— Низкое энергопотребление (в режиме ожидания — менее 20 мА)

— Интерфейс UART для передачи данных

Для работы с модулем NEO-6M GPS необходимо подключить его к микроконтроллеру или компьютеру через интерфейс UART и настроить его на прием данных от спутников. Модуль можно использовать в различных проектах, связанных с навигацией, геолокацией и мониторингом объектов.

Модуль NEO-6M GPS способен отслеживать до 22 спутников на 50 каналах с большим уровнем чувствительности -161 дБ. Рабочее напряжение модуля 3,3 В (или 5 В при наличии стабилизатора на плате модуля). В модуле установлена микросхема HK24C32 (EEPROM) с объемом памяти 4 КБ, в EEPROM хранятся данные часов, последние данные о местоположении (данные об орбите) и конфигурацию модуля. Батарейка автоматически заряжается при включении модуля и сохраняет данные до двух недель. В модуле установлен светодиод который сигнализирует о состоянии определения местоположения, если светодиод горит но не мигает, значит идет поиск спутников, если светодиод мигает, значит спутники найдены и идет определение местоположения.

Так как модуль NEO-6M GPS позволяет принимать время UTC, то его можно использовать для установки коррекции времени в часах.

UTC (Coordinated Universal Time) — это мировое координированное время, которое используется в качестве стандарта для согласования времени в разных частях мира. Оно основано на атомных часах и корректируется для согласования со сменой года и сезонов. UTC имеет постоянную длительность суток, которая составляет 24 часа.

UTC используется во всем мире в качестве стандарта времени для многих приложений, таких как навигация, телекоммуникации, астрономия и т.д. Он является основой для определения временных зон и синхронизации времени в компьютерных сетях и других системах.

UTC отличается от GMT (Greenwich Mean Time) тем, что он не зависит от времени в Гринвиче и использует атомные часы вместо звездного времени.

Время UTC не имеет временного сдвига относительно времени в Гринвиче (GMT), так как оно является мировым стандартом времени, который используется во всем мире. Однако, время UTC может отличаться от местного времени в зависимости от того, в какой части мира находится конкретное местоположение.

Для согласования времени в разных частях мира используются различные временные зоны, которые отличаются от UTC на определенное количество часов. Например, время в Нью-Йорке отличается от UTC на 5 часов в зимнее время и на 4 часа в летнее время из-за перехода на летнее время.

Поэтому, чтобы узнать время UTC в определенный момент времени, необходимо знать разницу между местным временем и временной зоной, в которой находится это местоположение.

Часы на NEO-6M GPS достаточно простые, дополнительно в часах используется цифровой датчик температуры для вывода температуры в помещении. Дополнительно в часах установлен датчик освещенности в виде фоторезистора, который позволяет менять яркость свечения дисплея в зависимости от освещенности.

Часы на дисплее 0.54 14-segment LED HT16K33 и GPS модуле (Arduino IDE) Электроника, Arduino, Самоделки, Длиннопост

Как прошить микроконтроллер LGT8F328P в статье — LGT8F328P-LQFP32 MiniEVB в Arduino IDE. Более подробная информация о модуле NEO-6M описана в NEO-6M GPS (Arduino), про дисплей описано в Дисплей 0.54″ 14-segment LED HT16K33 Backpact (Arduino библиотека).

Схема часов

Часы на дисплее 0.54 14-segment LED HT16K33 и GPS модуле (Arduino IDE) Электроника, Arduino, Самоделки, Длиннопост

Показания времени выводятся на дисплей 0.54″ 14-segment LED HT16K33 Backpact, который представляет собой четырех разрядный 14 сегментный (15 сегмент  — запятая на каждом разряде) индикатор которым управляет светодиодный драйвер HT16K33.

ИМС HT16K33 – матричный драйвер светодиодов, также рассчитан на подключение и считывание матричной клавиатуры. Напряжение питания светодиодного драйвера от 4.5 до 5.5 В, ток потребления в активном режиме до 2 мА, а режиме ожидания до 10 мкА. Уровни интерфейса связи с микроконтроллером – 5 В, не совместимы с 3.3 В. Управление осуществляется посредством интерфейса I2C на скорости до 400 кГц, к одной шине I2C можно подключить до 8-и устройств (начальный адрес 0х70).

Часы на дисплее 0.54 14-segment LED HT16K33 и GPS модуле (Arduino IDE) Электроника, Arduino, Самоделки, Длиннопост

Скетч часов нуждается в корректировке двух параметров:

  • #define time_offset  21600  // смещение от UTC 1 час = 3600

  • #define KORR_T  —4.5  // DS18B20 коррекция температуры

Первый параметр это сдвиг в секундах от времени UTC, второй параметр это корректировка показаний температуры датчика.

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

После включения часов модуль NEO-6M GPS начнет искать спутники, на это может потребоваться определенное время, при этом на дисплей будет выводится надпись SCAN.

Часы на дисплее 0.54 14-segment LED HT16K33 и GPS модуле (Arduino IDE) Электроника, Arduino, Самоделки, Длиннопост

После определения времени, часы с 0 по 50 секунду выводят время, далее с 50 по 55 секунду температуру, а с 55 по 59 секунду день недели и дату.

Часы на дисплее 0.54 14-segment LED HT16K33 и GPS модуле (Arduino IDE) Электроника, Arduino, Самоделки, Длиннопост

Скетч - http://rcl-radio.ru/?p=130611

Показать полностью 6
Отличная работа, все прочитано!