Arduino
66 постов
66 постов
Модуль SX1509 — это 16-канальный GPIO-интерфейс с расширенными функциями, выпущенный компанией Semtech. Модуль имеет двухстороннюю связь с микроконтроллером, что обеспечивает высокую скорость передачи данных, а также позволяет использовать функции микроконтроллера для управления I/O-модулем.
Кроме 16 доступных для подключения каналов, модуль имеет встроенный светодиодный драйвер и поддерживает подключение клавиатуры (до 64 ключей).
Модуль SX1509 имеет широкий диапазон напряжений питания от 1,2 В до 3,6 В, что позволяет использовать его с большинством микроконтроллеров и устройств. Встроенные функции программирования позволяют настраивать каждый канал, чтобы он мог выполнять различные действия, такие как включение/выключение светодиодов, установка ШИМ на выходах, чтение состояний входных сигналов и так далее.
Управление модулем осуществляется при помощи шины I2C. Установить необходимый адрес I2C можно при помощи перемычек расположенный на обратной стороне платы модуля.
По умолчанию используется I2C адрес 0x3E.
При выборе режима работы не все GPIO поддерживаю выбранный режим работы, используйте таблицу для выбора необходимого GPIO I/O.
Модуль 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, в библиотеке SparkFun_SX1509_Arduino_Library имеется много различных примеров полностью раскрывающие возможности модуля SX1509.
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:
Для тестирования модуля необходимо замкнуть контакты А0 А1 А2 на VCC или GND для получения нужного Вам I2C адреса.
При замыкании контактов А0 А1 А2 на GND и загрузив сканер I2C портов (скетч можно найти в примерах Arduino IDE), в мониторе можно увидеть установленный I2C адрес:
Для удобства использования расширителя портов можно воспользоваться библиотекой — Adafruit-MCP23017-Arduino-Library-master, дополнительно Вам может понадобится библиотека — Adafruit_BusIO-master.
При обращении к пинам расширителя портов в Arduino IDE используйте таблицу:
Примеры использования
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().
#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
} }
LCD1602 — это электронный дисплей, используемый в различных электронных устройствах с микроконтроллерным управлением. Он состоит из 16 символов в 2 линии и имеет подсветку, что позволяет использовать его в условиях недостаточного освещения.
Описание подключения:
Дисплей 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-и битном. Режим передачи данных определяет количество бит, передаваемых на шину данных за один раз.
В 8-и битном режиме передачи данных контроллер HD44780 отправляет на дисплей 8 бит информации за один раз. Это позволяет передавать данные быстрее, чем в 4-х битном режиме, но требует большего количества контактов для подключения дисплея.
В 4-х битном режиме передачи данных контроллер HD44780 отправляет на дисплей только половину данных — 4 бита — за один раз. Это требует меньшего количества контактов для подключения дисплея, но передача данных занимает больше времени.
Для выбора режима передачи данных на дисплее LCD1602 используется команда функции. В команде функции можно выбрать 4-х или 8-и битный режим передачи данных, а также установить другие параметры, такие как количество строк и размер символа.
В этой статье будет рассмотрен 8-и битный режим работы дисплея, сравнение скорости работы в 8-битной и 4-битном подключении.
При 8-и битном подключении соберите схему показанную на рисунке:
Далее загрузите скетч:
#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» в первой строчке дисплея, и число от 0 до 10000 во второй строчке. Далее по завершению работы цикла выводится время выполнения цикла.
В итоге 10000 обновлений информации на экране дисплея занимает 25948 мс при 8-и битном подключении.
Для сравнения скорости работы соберем схему с 4-х битным подключением:
Далее загрузите скетч:
#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);
}
В итоге 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);
}
Скетч показанные выше выводит информацию на дисплей аналогично предыдущим скетчам, при этом время работы цикла значительно меньше:
Как видно при 8-и битном режиме подключения скорость работы дисплея выросла более чем в два раза по сравнению с 4-х битным подключении при использовании библиотеки LiquidCrystal.
В целом, использование 4-х или 8-и зависит от конкретных требований и ограничений проекта. Если в проекте необходимо передавать большой объем данных на дисплей, то 8-и битный режим может быть более эффективным выбором, поскольку он позволяет передавать больше информации за один раз. Однако, если количество доступных контактов ограничено или нужно минимизировать занимаемое пространство, то 4-х битный режим может быть предпочтительнее.
Также следует учитывать, что использование 8-и битного режима требует более мощного контроллера, чем 4-х битный режим, поэтому для некоторых проектов 4-х битный режим может быть более оптимальным выбором.
В любом случае, выбор режима передачи данных должен основываться на требованиях проекта и возможностях доступных компонентов и контроллеров.
GPS (Global Positioning System) — это глобальная спутниковая система навигации, разработанная и поддерживаемая правительством США. Она позволяет определять координаты и время в любой точке Земли с помощью спутников, которые находятся на орбите вокруг Земли.
GPS состоит из сети спутников, которые передают сигналы, и приемников, которые принимают эти сигналы и обрабатывают их, чтобы определить свое местоположение. Каждый спутник GPS посылает информацию о своем местоположении и времени синхронизации с наземными станциями, которые обрабатывают эти данные и передают их пользователям.
GPS широко используется в навигации, геодезии, геоинформационных системах, мониторинге транспорта и других областях. Он позволяет точно определять местоположение и перемещение объектов на Земле, что делает его важным инструментом для различных приложений.
Модуль 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 достаточно простые, дополнительно в часах используется цифровой датчик температуры для вывода температуры в помещении. Дополнительно в часах установлен датчик освещенности в виде фоторезистора, который позволяет менять яркость свечения дисплея в зависимости от освещенности.
Как прошить микроконтроллер 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 Backpact, который представляет собой четырех разрядный 14 сегментный (15 сегмент — запятая на каждом разряде) индикатор которым управляет светодиодный драйвер HT16K33.
ИМС HT16K33 – матричный драйвер светодиодов, также рассчитан на подключение и считывание матричной клавиатуры. Напряжение питания светодиодного драйвера от 4.5 до 5.5 В, ток потребления в активном режиме до 2 мА, а режиме ожидания до 10 мкА. Уровни интерфейса связи с микроконтроллером – 5 В, не совместимы с 3.3 В. Управление осуществляется посредством интерфейса I2C на скорости до 400 кГц, к одной шине I2C можно подключить до 8-и устройств (начальный адрес 0х70).
Скетч часов нуждается в корректировке двух параметров:
#define time_offset 21600 // смещение от UTC 1 час = 3600
#define KORR_T —4.5 // DS18B20 коррекция температуры
Первый параметр это сдвиг в секундах от времени UTC, второй параметр это корректировка показаний температуры датчика.
Рекомендуется устанавливать датчик температуры DS18B20 вне корпуса часов, при установке в корпусе возможен дополнительный нагрев датчика от других элементов схемы.
После включения часов модуль NEO-6M GPS начнет искать спутники, на это может потребоваться определенное время, при этом на дисплей будет выводится надпись SCAN.
После определения времени, часы с 0 по 50 секунду выводят время, далее с 50 по 55 секунду температуру, а с 55 по 59 секунду день недели и дату.
Скетч - http://rcl-radio.ru/?p=130611
0,91″ I2C 128×32 OLED — это компактный дисплей, который использует технологию OLED (Organic Light Emitting Diode) для отображения изображений. Дисплей имеет интерфейс I2C, который обеспечивает простое подключение к микроконтроллерам и другим устройствам.
Основные характеристики дисплея:
— Разрешение 128×32 пикселей.
— Размер дисплея 0,91 дюйма (около 2,3 см).
— Яркость до 150 кд/м².
— Контрастность 2000:1.
— Угол обзора 160 градусов.
— Поддержка интерфейса I2C с адресом 0x3C.
Дисплей 0,91″ I2C 128×32 OLED обеспечивает четкое и яркое отображение информации, которое может быть использовано в широком спектре приложений. Он легко подключается к различным устройствам, таким как Arduino, Raspberry Pi и другим микроконтроллерам.
Дополнительно, OLED-дисплей имеет низкое энергопотребление, что позволяет использовать его в батарейных устройствах. Он также обладает быстрым временем отклика и высокой контрастностью, что делает его идеальным для использования в приложениях, где требуется быстрое и точное отображение информации.
В целом, дисплей 0,91″ I2C 128×32 OLED является отличным выбором для тех, кто ищет компактный и яркий OLED-дисплей с простым подключением по интерфейсу I2C.
В индикаторе уровня сигнала используется плата разработчика LGT8F328P-LQFP32 MiniEVB, как использовать плату в среде программирования Arduino IDE рассказано в — http://rcl-radio.ru/?p=129966
LGT8F328P-LQFP32 MiniEVB — это плата разработки, основанная на микроконтроллере LGT8F328P с 32 выводами в корпусе LQFP32. Это мощный микроконтроллер, который обеспечивает высокую производительность и широкие возможности для разработки.
Основные характеристики платы LGT8F328P-LQFP32 MiniEVB:
— Микроконтроллер LGT8F328P с тактовой частотой до 32 МГц и 32 Кбайт памяти Flash.
— Поддержка интерфейсов SPI, I2C, UART, ADC и PWM.
— Встроенный USB-интерфейс для программирования и отладки.
— Низкое энергопотребление и поддержка режима сна.
— Поддержка работы от внешнего источника питания 5 В или от USB-порта.
LGT8F328P-LQFP32 MiniEVB — это отличная плата разработки для начинающих и опытных разработчиков, которые хотят создавать проекты на основе микроконтроллера LGT8F328P. Она обеспечивает легкую разработку и отладку приложений, поддерживает широкий спектр интерфейсов и имеет удобный USB-интерфейс для программирования и отладки.
Кроме того, плата LGT8F328P-LQFP32 MiniEVB имеет компактный размер и низкое энергопотребление, что позволяет использовать ее в различных приложениях, включая портативные устройства и системы автоматизации.
Схема индикатора уровня сигналов
Скетч - http://rcl-radio.ru/?p=130681
SH1106 OLED 1.3″ — OLED-дисплей с контроллером SH1106. Этот дисплей имеет разрешение 128×64 пикселей и может отображать монохромную графику и текст. Он может использоваться для различных проектов, где нужно отобразить информацию компактным и энергосберегающим способом. Дисплей легко подключается к микроконтроллерам и одноплатным компьютерам, таким как Arduino или Raspberry Pi, используя интерфейс SPI или I2C.
На OLED дисплее можно сделать простой анализатор спектра аудио сигнала.
Анализатор спектра выполнен на базе микроконтроллера LGT8F328P. Используется плата разработчика LGT8F328P-LQFP32 MiniEVB.
Плата LGT8F328P-LQFP32 MiniEVB
LGT8F328P-LQFP32 MiniEVB — это миниатюрная платформа разработки с микроконтроллером LGT8F328P в корпусе LQFP32. Этот микроконтроллер совместим с ATmega328P, имеет тактовую частоту до 32 МГц и 32 Кб флэш-памяти. MiniEVB оснащена USB-интерфейсом, который позволяет программировать и отлаживать микроконтроллер, а также подключить его к компьютеру. Кроме того, на плате есть разъемы для питания, монтажа дополнительных периферийных устройств и раздельного доступа к пинам микроконтроллера. Эта платформа разработки может быть использована для создания различных электронных проектов, начиная от простых LED-мигалок до сложных устройств на базе микроконтроллера.
Как добавить поддержку LGT8F328P (плата) в Arduino IDE и прошить микроконтроллер написано в LGT8F328P-LQFP32 MiniEVB в Arduino IDE.
Скетч - http://rcl-radio.ru/?p=130528
Светодиодная шкала SHB10R — это, по сути, 10 независимых светодиодов в одном корпусе, выложенных в форме шкалы. У индикатора 20 ножек: анод и катод для каждого светодиодах.
На основе ATtmega8535 используя светодиодную шкалу SHB10R можно сделать простой 12-и полосный анализатор спектра по 10 диодов (по 1 модуля SHB10R) на одну полосу. В итоге используется 12 светодиодных модулей (120 светодиодов).
ATmega8535 — это микроконтроллер производства компании Atmel, который относится к семейству AVR. Вот основные характеристики ATmega8535:
— Архитектура: AVR
— Количество выводов: 44
— Рабочая частота: 0 — 16 МГц
— Количество программной памяти: 8 Кбайт флэш-памяти
— Количество оперативной памяти: 512 байт
— Количество EEPROM: 512 байт
— Количество аналоговых входов: 8
— Количество цифровых входов/выходов: 32
— Интерфейсы: USART, SPI, I2C, 8-битный таймер/счетчик, 16-битный таймер/счетчик, внешнее прерывание
ATmega8535 — это достаточно старый микроконтроллер, который уже не производится компанией Atmel. Однако он все еще может использоваться в некоторых проектах, особенно если требуется небольшое количество памяти и не очень высокая частота работы.
Как ранее отмечалось анализатор спектра звукового сигнала содержит 12 полос, но может быть расширен и до 16 с небольшой правкой скетча.
Так как светодиодная шкала SHB10R это 10 независимых светодиодов в одном корпусе, то для данного проекта все катоды шкалы необходимо соединить вместе. Общим катодом каждой шкалы будет управлять транзистор BC337. Все одноименные аноды всех шкал необходимо соединить вместе, так как для управления шкалами используется динамическая индикация.
Схема анализатора спектра
Так как прошиваться микроконтроллер будет через Arduino IDE, то на схеме все выводы слева это выводы микросхемы. А выводы справа на схеме это выводы принятые в платформе Arduino (см.ниже обозначение выводов).
Как прошить микроконтроллер ATtmega8535 в Arduino IDE написано в ATmega8535 + Arduino IDE.
Скетч - http://rcl-radio.ru/?p=130572
SH1106 OLED 1.3″ — компактный дисплей используемый в электронных устройствах для отображения информации. Он имеет разрешение 128×64 пикселей и диагональ 1,3 дюйма. Экран использует технологию OLED (Organic Light Emitting Diode), которая позволяет получить яркие и контрастные изображения при низком энергопотреблении.
Основные параметры SH1106 OLED 1.3″:
Размер: 1,3 дюйма
Разрешение: 128×64 пикселей
Технология: OLED
Драйвер: SH1106
Цветность: одноцветный
Интерфейс: SPI или I2C
Угол обзора: более 160 градусов
Напряжение питания: 3,3 В или 5 В
Рабочая температура: от -40 до +85 градусов Цельсия
SH1106 OLED 1.3″ имеет высокую яркость и контрастность, что делает его удобным для использования даже в ярких условиях освещения. Кроме того, благодаря технологии OLED, он потребляет меньше энергии, чем традиционные ЖК-экраны, что позволяет увеличить время работы устройства от батарей.
Дисплей выпускается в двух интерфейса — SPI или I2C, что позволяет подключать его к различным устройствам с разными типами интерфейсов. Большинство микроконтроллеров и микрокомпьютеров имеют поддержку этих интерфейсов, поэтому экран легко подключается к таким устройствам.
SH1106 OLED 1.3″ также имеет широкий угол обзора более 160 градусов, что делает его удобным для использования в различных углах обзора. Рабочая температура от -40 до +85 градусов Цельсия позволяет использовать экран в широком диапазоне условий эксплуатации.
SH1106 драйвер OLED-дисплеев разработан компанией Solomon Systech Limited и является усовершенствованным вариантом предыдущего драйвера SH1101A.
Основные характеристики драйвера SH1106:
Интерфейсы: 8-битный параллельный, 4-битный параллельный, I2C и SPI
Разрешение: от 128×32 до 132×64 пикселей
Поддержка режимов отображения: текст, графика, анимация
Встроенный контроллер памяти: 256 байт
SH1106 обеспечивает высокую яркость и контрастность изображения, а также широкий угол обзора, что делает его удобным для использования в различных устройствах, таких как мобильные телефоны, MP3-плееры, часы, приборы измерения и т.д. Благодаря поддержке различных интерфейсов, SH1106 может легко интегрироваться с различными микроконтроллерами и микрокомпьютерами.
Кроме того, SH1106 имеет встроенный контроллер памяти, который позволяет хранить до 8 страниц информации на дисплее. Это дает возможность создавать различные режимы отображения, такие как текст, графика и анимация, что делает его удобным для использования в различных приложениях.
На базе недорого контроллера LGT8F328P и дисплея SH1106 OLED 1.3″ можно собрать простой простой индикатор уровня звукового сигнала.
На рисунке показана схема простого индикатора уровня звукового сигнала (VU meter) имитирующего работу стрелочного индикатора. На входы А0 подается звуковой сигнал через резисторы номиналом 4,7 кОм. Индикатор уровня имеет 90 ступеней, содержит шкалу в дБ и %.
Как добавить поддержку LGT8F328P (плата) в Arduino IDE и прошить микроконтроллер написано в LGT8F328P-LQFP32 MiniEVB в Arduino IDE.
LGT8F328P-LQFP32 MiniEVB — это миниатюрная платформа для разработки на основе микроконтроллера LGT8F328P. Он имеет форм-фактор LQFP32, позволяющий подключать его к различным периферийным устройствам и компонентам. На плате есть все необходимые элементы для разработки, включая микроконтроллер, кварцевый резонатор, регулятор напряжения и др.
LGT8F328P-LQFP32 MiniEVB может быть использован для разных проектов, включая автоматизацию дома, робототехнику, медицинское оборудование, и многие другие. Плата поддерживает программирование через USB интерфейс, что делает ее легким в использовании и доступной для начинающих разработчиков.
Эта платформа оснащена множеством периферийных устройств, включая UART, I2C, SPI, а также цифровые и аналоговые порты ввода-вывода, что позволяет подключать к ней множество датчиков и устройств. Кроме того, на плате есть кнопка и светодиоды для отладки и контроля состояния устройства.
Для прошивке платы используйте следующие настройки:
Скетч содержит ряд настроек которые можно изменить:
#define GAIN 100 — уровень усиления
#define STEP 3 — плавность хода стрелки (от 1 до 10, чем больше число тем выше скорость стрелки)
#define LOW_SOUND 100 — уровень нуля сигнала (устранение ложного срабатывания стрелки при отсутствии аудиосигнала)
#define MAX_SOUND 600 — уровень максимального сигнала (при максимальном уровне сигнала стрелка должна доходить до +3 дБ)
Последние три параметра можно не менять, достаточно установить уровень усиления сигнала.
Скетч - http://rcl-radio.ru/?p=130508