Частотомір на Arduino
Ця стаття є другою у серії статей про вимірювання за допомогою Arduino параметрів різних компонентів та фізичних величин, що використовуються в радіоелектроніці. Розглянемо вимір частоти сигналу з допомогою Arduino.
Майже кожен радіоаматор повинен зіткнутися зі сценарієм, у якому необхідно виміряти частоту сигналу, генерованого тактовим генератором чи лічильником чи таймером. Для цього ми можемо використовувати осцилограф, але не всі з нас можуть його собі дозволити. Ми можемо купити обладнання для вимірювання частоти, але ці пристрої коштують дорого. Враховуючи це, ми збираємося розробити за допомогою Arduino та тригера Шмітта простий, але ефективний частотомір.
Частотомір на Arduino
Цей частотомір є економічно ефективним та може бути легко виготовлений. Для вимірювання частоти сигналу ми будемо використовувати Arduino Uno – серце проекту.
Щоб протестувати частотомір, ми збираємося створити найпростіший генератор сигналу. Цей найпростіший генератор сигналу буде виготовлений з використанням мікросхеми таймера 555. Схема на таймері генерує прямокутний сигнал, який для тестування подаватиметься на Arduino Uno.
В результаті у нас буде частотомір та генератор прямокутного сигналу.
Необхідні компоненти
- мікросхема таймера 555;
- мікросхема тригерів Шмітта 74LS14 або елементів НЕ;
- плата Arduino Uno;
- LCD екран 16x2;
- конденсатори 100 нФ (2 шт.) та 1000 мкФ (1 шт.);
- резистори 100 Ом (1 шт.), 220 Ом (1 шт.) та 1 кОм (1 шт.);
- потенціометр 47 кОм;
- макетна плата;
- перемички.
Принципова схема
Принципова схема частотоміра на Arduino показано нижче. Схема проста, LCD дисплей підключений Arduino для відображення виміряної частоти сигналу.Зі схеми генератора сигналів ми подаємо сигнал на Arduino через «сигнальний вхід». Тригер Шмітта (мікросхема 74LS14) використовується для забезпечення подачі Arduino тільки прямокутного сигналу. Для фільтрації шуму ми додали на шину живлення пару конденсаторів. Цей частотомір може вимірювати частоти до 1 МГц.
Принципова схема частотоміра на Arduino
Генератор сигналів на мікросхемі таймера 555
Насамперед, ми поговоримо про генератор прямокутного сигналу на мікросхемі 555, або, я б сказав, про нестабільний (астабільний, автоколивальний) мультивібратор на 555. Ця схема необхідна, тому що для перевірки частотоміра нам необхідний сигнал, частота якого відома. Без цього сигналу ми не зможемо розповісти про роботу частотоміра. Якщо у нас є прямокутний сигнал із відомою частотою, ми можемо використовувати його для перевірки частотоміра на Arduino та для підстроювання точності у разі будь-яких відхилень. Макет генератора сигналу на мікросхемі таймера 555 показаний нижче.
Макет генератора сигналів на мікросхемі таймера 555
Нижче показана типова схема таймера 555 в нестабільному режимі, з якої ми отримали наведену вище схему генератора сигналів.
Типова схема на таймері 555 в автоколебальному режимі
Частота вихідного сигналу залежить від резисторів RA та RB та конденсатора C. Формула буде наступною:
Тут RA та RB – значення опорів, а C – значення ємності. Підставляючи значення опорів та ємності у наведену вище формулу, ми отримуємо частоту вихідного прямокутного сигналу.
Можна побачити, що RB на схемі вище замінений нашою схемою генератора сигналів потенціометром; це зроблено для того, щоб для кращого тестування ми могли отримати прямокутний сигнал змінної частоти.Для простоти можна замінити цей потенціометр на простий резистор.
Тригер Шмітта
Ми знаємо, що не всі тестові сигнали прямокутні. У нас є сигнали трикутні, пилкоподібні, синусоїдальні і таке інше. Оскільки Arduino Uno може детектувати тільки прямокутні сигнали, нам необхідний пристрій, який міг би перетворювати будь-які сигнали прямокутні. Тому ми використовуємо тригер Шмітта. Тригер Шмітта є цифровий логічний елемент, призначений для арифметичних і логічних операцій.
Цей елемент забезпечує вихідний сигнал (OUTPUT) з урахуванням рівня напруги вхідного сигналу (INPUT). Тригер Шмітта має пороговий рівень напруги (THERSHOLD): коли рівень вхідного сигналу вище за пороговий рівень елемента, рівень сигналу на виході дорівнюватиме високому логічному рівню. Якщо рівень вхідного сигналу нижче за поріг, на виході буде низький логічний рівень. Зазвичай у нас немає окремого тригера Шмітта, за ним завжди слідує елемент НЕ.
Ми збираємося використовувати мікросхему 74LS14, яка містить 6 тригерів Шмітта. Ці шість елементів всередині підключені, як показано нижче.
Мікросхема 74LS14, що містить шість тригерів Шмітта. Розпинування
Таблиця істинності інвертованого тригера Шмітта показана нижче, відповідно до неї ми повинні запрограмувати Arduino Uno для інвертування позитивних та негативних періодів часу на її висновках.
Тепер, коли ми подамо сигнал будь-якого типу на елемент тригера Шмітта, у нас на виході буде прямокутний сигнал з інвертованими часовими періодами, і цей сигнал ми подамо на Arduino Uno.
Як Arduino вимірює частоту
Arduinio Uno має спеціальну функцію pulseIn, яка дозволяє нам визначати тривалість позитивного або негативного стану конкретного прямокутного сигналу:
Htime = pulseIn(8, HIGH); Ltime = pulseIn(8, LOW);
Ця функція вимірює час, протягом якого високий або низький логічний рівень присутня на 8 Arduino Uno. Таким чином, в одному періоді сигналу у нас будуть тривалості позитивного та негативного рівнів у мікросекундах. Функція pulseIn вимірює час у мікросекундах. У заданому сигналі маємо час високого логічного рівня = 10 мс та час низького логічного рівня = 30 мс (частота 25 Гц). Таким чином, в Ltime буде збережено ціле число 30000, а в Htime – 10000. Якщо ми складемо ці два значення, отримаємо тривалість періоду, а інвертувавши її, ми отримаємо частоту.
Код
#include LiquidCrystal lcd(2, 3, 4, 5, 6, 7); int Htime; // ціла змінна для зберігання часу високого логічного рівня int Ltime; // ціла змінна для зберігання часу низького логічного рівня float Ttime; // Змінна для зберігання загальної тривалості періоду float frequency; // змінна зберігання частоти void setup() < pinMode(8,INPUT); lcd.begin(16, 2); >void loop() < lcd.clear(); lcd.setCursor(0,0); lcd.print("Frequency of signal"); Htime=pulseIn(8,HIGH); // Прочитати час високого логічного рівня Ltime = pulseIn (8, LOW); // Прочитати час низького логічного рівня Ttime = Htime + Ltime; frequency=1000000/Ttime; // отримання частоти Ttime в мікросекундах lcd.setCursor(0,1); lcd.print(frequency); lcd.print("Hz"); delay(500); >
Відео
Робимо генератор частоти на базі ардуїно мікроконтролера
Як зробити частотний перетворювач своїми руками? Можна пройти весь Інтернет для того, щоб знайти найкращі джерела інформації по темі виробів і не знайти жодної конкретної відповіді на своє питання, оскільки кожен проект вимагає різних компонентів, але є загальний принцип проектування. Ось він стане вам у пригоді.
Почнемо з визначення того, що ви хочете за вашою схемою зробити. Розділіть завдання на найпростіші завдання по кожному електронному компоненту, які можна завершити. У ході дослідження ви зустрінете цілу низку конструкцій, це допоможе побачити переваги та недоліки кожної зі схем, яку ви вважаєте цікавою та пов'язаною з вашою проблемою.
Починати краще з двигунів і працювати у зворотному напрямку до створення процесора управління електродвигунами. Ви повинні вибрати двигун, виходячи з необхідного крутного моменту, швидкості, вимоги до живлення.
Це електротехнічна робота, яка потребує інтенсивного пізнання електрики. Багато в чому залежить від того, як глибоко ви хочете пізнати теорію. Зовсім мало знати компоненти. Проектування схеми у обчисленнях напруг і струмів, виборі необхідних деталей. Результатом проектування є складання специфікації обладнання та матеріалів. Знання про точні елементи специфікації, які вам необхідні, приходять лише з досвідом.
Вам потрібно буде аналізувати ланцюг для визначення необхідних компонентів вашої специфікації, включаючи хв./макс. розрахунків за допусками та температурою. З вихідних даних електродвигуна складається блок-схема і підбираються електронні компоненти. Як приклад подаємо перелік основних елементів саморобного електропривода5-200Гц (10-400Гц):
| п. п. |
Назва елементів |
Кількість, прим. |
| 1 |
Силовий модуль IRAMS10UP60B із вбудованим драйвером |
1 |
| 2 |
BB-102 Макетна плата для монтажу без паяння |
1 |
| 3 |
BBJ-65 Комплект кольорових монтажних перемичок MM для макетних плат без паяння |
1 |
| 4 |
Контролер ATmega48 |
1 |
| 5 |
Трансформатор 220/12 300 Вт |
1 |
Перегляньте для всіх елементів технічні характеристики, вказані виробником. Виконайте теплові розрахунки та продумайте охолодження та заходи тепловідведення за необхідності. Зрозуміло, що це вимагає багаторічного досвіду, щоб отримати хороший результат. Ви також можете скористатися порадами та рекомендаціями більш досвідчених електриків.
У результаті у вас вийде макет-тренажер.
Слід переконатися, що двигун надійно встановлений, щоб він не кинувся "гуляти". Тестування зібраного макету покаже, наскільки схема дозволить набрати швидкість електродвигуна, повернути все назад або зупинити систему. Ви можете використовувати перемикачі для цього тренажеру. Будьте готові до того, що доведеться переробляти систему. Тільки не варто винаходити колесо. Мудрість це правильно зуміти скористатися тим, що інші освоїли або навіть удосконалити чужий винахід.
Спробуйте різні компоненти ланцюга. Використовуйте мультиметр, щоб отримати результати. Через якийсь час ви зможете переконатись, чому ви використовуєте резистор 2 Вт замість 0,25 Вт.
Більшість напівпровідникових компаній продають оцінювальні плати разом зі своєю продукцією. Купуйте не одну, більше для навчання. Інженерна справа – це робити багато помилок, крім удару електричним струмом або пожежі.
Для кожного підетапу зробіть схему та отримайте результат. З'єднайте частини так, щоб вихідні параметри однієї схеми були вхідними даними для наступної. Далі робота для мистецького генія. До речі, це така сама процедура, як можна було б використовувати у написанні програми чи алгоритму.
Розроблений привід насправді відрізняється мінімальною собівартістю, наявністю необхідних захистів, ефективністю та гнучкістю конструкції. Хорошим підказником несправностей служить світлодіод. Він блимає в тих випадках, коли система знаходиться в налаштуванні, перевантажена і т. д. У програмі мікроконтролера враховані всілякі ситуації. Повна автоматизація технологічного процесу за економного електроспоживання.
Бібліотеки для роботи з i2c LCD дисплеєм
Для взаємодії Arduino c LCD 1602 по шині I2C вам знадобиться як мінімум дві бібліотеки:
- Бібліотека Wire.h для роботи з I2C вже є у стандартній програмі Arduino IDE.
- Бібліотека LiquidCrystal_I2C.h, яка включає велику різноманітність команд для управління монітором по шині I2C і дозволяє зробити скетч простіше і коротше. Потрібно додатково встановити бібліотеку Після підключення екрана потрібно додатково встановити бібліотеку LiquidCrystal_I2C.h
Після підключення до скетчу всіх необхідних бібліотек ми створюємо об'єкт і можемо використовувати його функції. Для тестування завантажимо наступний стандартний скетч з прикладу.
#include #include // Підключення бібліотеки //#include // Підключення альтернативної бібліотеки LiquidCrystal_I2C lcd(0x27,16,2); // Вказуємо I2C адресу (найпоширеніше значення), і навіть параметри екрана (у разі LCD 1602 - 2 рядки по 16 символів у кожному //LiquidCrystal_PCF8574 lcd(0x27); // Варіант для бібліотеки PCF8574 void setup() < lcd.init (); // Ініціалізація дисплея lcd.backlight(); // Підключення підсвічування lcd.setCursor(0,0); // Установка курсора на початок першого рядка lcd.print("Hello"); початок другого рядка lcd.print("ArduinoMaster"); // Набір тексту на другому рядку >void loop()
Опис функцій та методів бібліотеки LiquidCrystal_I2C:
- home() і clear() – перша функція дозволяє повернути курсор на початок екрана, друга теж, але при цьому видаляє все, що було на моніторі до цього.
- write(ch) – дозволяє вивести одиночний символ ch на екран.
- cursor() та noCursor() – показує/приховує курсор на екрані.
- blink() і noBlink() – курсор блимає/не блимає (якщо раніше було включено його відображення).
- display() та noDisplay() – дозволяє підключити/вимкнути дисплей.
- scrollDisplayLeft() та scrollDisplayRight() – прокручує екран на один знак ліворуч/праворуч.
- autoscroll() та noAutoscroll() – дозволяє увімкнути/вимкнути режим автопрокручування. У цьому режимі кожен новий символ записується в тому самому місці, витісняючи раніше написане на екрані.
- leftToRight() і rightToLeft() – Встановлення напряму виведеного тексту – зліва направо або праворуч наліво.
- createChar(ch, bitmap) – створює символ із кодом ch (0 – 7), використовуючи масив бітових масок bitmap для створення чорних та білих точок.
Альтернативна бібліотека для роботи з дисплеєм i2c
У деяких випадках при використанні зазначеної бібліотеки з пристроями, оснащеними контролерами PCF8574, можуть виникати помилки. У цьому випадку альтернативою можна запропонувати бібліотеку LiquidCrystal_PCF8574.h. Вона розширює LiquidCrystal_I2C, тому проблем із її використанням не повинно бути.
Завантажити бібліотеку можна на нашому сайті. Бібліотека також убудована в останні версії Arduino IDE.
Будівництво та випробування
Компонування друкованої плати (див. плата своїми руками) генератора частоти та розташування його компонентів показано на наступному малюнку:
Після складання схеми на друкованій платі завантажте вихідний код на плату Arduino. Від'єднайте плату від комп'ютера та підключіть її до джерела живлення через роз'єм CON1.
Ви можете переглянути згенероване значення частоти на РК-дисплеї, розімкнувши перемикач S1, або перевірити різні форми сигналів на послідовному плотері, замкнувши S1.
Тестер транзисторів / ESR-метр / генератор
Багатофункціональний прилад для перевірки транзисторів, діодів, тиристорів.
Важливі сторінки
- Каталог посилань на дешеві Ардуїни, датчики, модулі та інші залізки з AliExpress у перевірених продавців
- Добірка бібліотек для Arduino, найцікавіших і найкорисніших, офіційних і не дуже
- Повна документація з мови Ардуїно, всі вбудовані функції та макро, всі доступні типи даних
- Збірник корисних алгоритмів для написання скетчів: структура коду, таймери, фільтри, парсинг даних
- Відео уроки з програмування Arduino з каналу “Нотатки Ардуїнщика” – одні з найдокладніших у рунеті
- Підтримати автора за роботу над уроками
- Зворотній зв'язок – повідомити про помилку в уроці або запропонувати доповнення за текстом ([email protected])
Вихідний код програми
Щоб у програмі підключити РК-дисплей до ARDUINO UNO, необхідно зробити такі кілька речей:
#include
lcd.begin(16, 2);
LiquidCrystal lcd(0, 1, 8, 9, 10, 11);
lcd.print(«hello, world!»);
В першу чергу ми повинні підключити заголовний файл (#include ), в якому знаходяться всі необхідні інструкції для взаємодії з РК дисплеєм, що значно спростить взаємодію з ним в 4 бітному режимі. Використовуючи цей файл заголовка нам не потрібно буде передавати в РК дисплей біт за бітом і нам не потрібно буде самим програмувати будь-які функції для взаємодії з РК дисплеєм.
У другому рядку ми повинні сказати платі ARDUINO UNO який тип РК дисплея ми збираємося використовувати, оскільки існує досить велика кількість типів подібних дисплеїв, наприклад, 20х4, 16х2, 16х1 і т.д.У нашому проекті ми збираємось підключати до ARDUINO UNO ЖК дисплей 16х2, тому ми повинні записати команду ‘lcd.begin(16, 2);’. А якщо ми підключали ЖК дисплей 16х1, то в цьому випадку змінилася б і команда відповідним чином - 'lcd.begin(16, 1);'.
У наступній інструкції ми повідомляємо платі ARDUINO UNO, до яких контактів ми приєднали РК-дисплей. У нашому випадку ми використовували контакти РК дисплея “RS, En, D4, D5, D6, D7”, які приєднані до контактів «0, 1, 8, 9, 10, 11» ARDUINO UNO, тому і наведена команда виглядає наступним чином. "LiquidCrystal lcd(0, 1, 8, 9, 10, 11);".
Для того, щоб надрукувати рядок символів на екрані дисплея, ми використовували команду lcd.print(«hello, world!»), яка виводить на екран дисплея рядок ‘hello, world!’.
Як ми бачимо з представленого коду, нам не потрібно дбати більше про жодні аспекти взаємодії з РК дисплеєм, нам потрібно просто ініціалізувати РК дисплей у програмі і тоді плата ARDUINO UNO буде готова до відображення інформації на екрані дисплея.
Далі представлений вихідний код програми (з коментарями) для взаємодії плати ARDUINO UNO із РК дисплеєм 16х2.
#include // ініціалізуємо бібліотеку для взаємодії з РК-дисплеєм
LiquidCrystal lcd(0, 1, 8, 9, 10, 11); /// повідомляємо Arduino номери контактів, до яких підключений РК-дисплей - REGISTER SELECT PIN, ENABLE PIN, D4 PIN, D5 PIN, D6 PIN, D7 PIN
void setup()
// встановлюємо кількість стовпців та рядків для РК дисплея
lcd.begin(16, 2);
>
void loop()
// встановлюємо курсор у нульовий стовпець першого рядка
lcd.print("CIRCUIT DIGEST"); //друкуємо рядок
lcd.setCursor(0, 1); // встановлюємо курсор у нульовий стовпець другого рядка
lcd.print(«http://www.circuitdigest.com/»);//друкуємо рядок
delay(750); //Затримка на 0.75 с
lcd.scrollDisplayLeft();// перемикаємо дані на РК дисплеї
lcd.setCursor(0, 0);// встановлюємо курсор у нульовий стовпець першого рядка
>
#include // ініціалізуємо бібліотеку для взаємодії з РК-дисплеєм
LiquidCrystallcd(,1,8,9,10,11);/// повідомляємо Arduino номери контактів, до яких підключений РК дисплей - REGISTER SELECT PIN, ENABLE PIN, D4 PIN, D5 PIN, D6 PIN, D7 PIN
// встановлюємо кількість стовпців та рядків для РК дисплея
// встановлюємо курсор у нульовий стовпець першого рядка
lcd.print("CIRCUIT DIGEST");//друкуємо рядок
lcd.setCursor(,1);// встановлюємо курсор у нульовий стовпець другого рядка
delay (750); // Затримка на 0.75 сек
lcd.scrollDisplayLeft();// перемикаємо дані на РК дисплеї
lcd.setCursor(,);// встановлюємо курсор у нульовий стовпець першого рядка
Кухонний таймер Ардуїно з енкодером
Зараз розглянемо, як зробити таймер на Ардуїно своїми руками з енкодером та LCD. Принцип управління, подібний до попереднього варіанту. Поворотом ручки енкодера можна задати необхідний часовий інтервал, а натисканням на ручку можна запускати та зупиняти зворотний відлік часу. Далі розміщено схему складання проекту на Arduino Nano, цей проект можна зібрати і на платі Arduino Uno.
Скетч таймера зворотного відліку часу
#include // бібліотека для протоколу I2C #include // бібліотека для LCD 1602 LiquidCrystal_I2C LCD(0x27, 20, 2); // присвоюємо ім'я дисплею #include // бібліотека для енкодера RotaryEncoder encoder(4, 2); // піни підключення енкодера (DT, CLK) // задаємо крок енкодера, максимальне та мінімальне значення #define STEPS 1 #define POSMIN 0 #define POSMAX 30 int lastPos, newPos; boolean buttonWasUp = true; byte w = 0; int SEC = 0; int MIN = 0; unsigned long timer; void setup() < pinMode(6, INPUT_PULLUP); // пін для кнопки енкодера encoder.setPosition(0 / STEPS); pinMode(10, OUTPUT); // Підключаємо світлодіод та зумер pinMode(12, OUTPUT); digitalWrite(10, HIGH); LCD.init(); // ініціалізація дисплея LCD. backlight (); // Увімкнення підсвічування LCD.setCursor(2, 0); LCD.print("TIMER STOP"); LCD.setCursor(5, 1); LCD.print(MIN); LCD.print(":"); LCD.print(SEC); >void loop() < // перевіряємо положення ручки енкодера encoder.tick(); newPos = encoder.getPosition() * STEPS; if (newPos < POSMIN) < encoder.setPosition(POSMIN / STEPS); newPos = POSMIN; >else if (newPos > POSMAX) < encoder.setPosition(POSMAX / STEPS); newPos = POSMAX; >// якщо становище змінилося - змінюємо змінну MIN і виводимо дисплей if (lastPos != newPos) < MIN = newPos; lastPos = newPos; LCD.clear(); LCD.setCursor(2, 0); LCD.print("TIMER STOP"); LCD.setCursor(5, 1); LCD.print(MIN); LCD.print(":"); LCD.print(SEC); >// якщо було натиснуто кнопку энкодера запускаємо відлік часу boolean buttonIsUp = digitalRead(6); if (buttonWasUp && !buttonIsUp && MIN > 0) < delay(10); buttonIsUp = digitalRead(6); if (!buttonIsUp) < if (SEC == 0) < SEC = 60; MIN = MIN – 1; >if (MIN < 0) < MIN = 0; >digitalWrite(10, LOW); w = 1; > > buttonWasUp = buttonIsUp; // запам'ятовуємо стан кнопки while (w == 1 ) < // якщо пройшло 995 мс - віднімаємо одну секунду від змінної SEC if (millis() - timer>993) <timer = millis(); SEC = SEC – 1; // якщо відлік закінчився - обнулюємося, включаємо сигнал і виходимо з циклу if (SEC == 0 && MIN == 0) < lastPos = 0; NewPos = 0; MIN = 0; SEC = 0; LCD.clear(); LCD.setCursor(2, 0); LCD.print("TIMER STOP"); LCD.setCursor(5, 1); LCD.print(MIN); LCD.print(":"); LCD.print(SEC); digitalWrite(10, HIGH); tone(12, 100); delay(500); noTone(12); w = 0; >// якщо секунди сягнули нуля - віднімаємо одну хвилину if (SEC == 0 && w==1) < SEC = 59; MIN = MIN – 1; if (MIN < 0) < MIN = 0; >> // якщо циклу while ще вийшли - виводимо інформацію на дисплей if (w == 1) < LCD.clear(); LCD.setCursor(2, 0); LCD.print("TIMER START"); LCD.setCursor(5, 1); LCD.print(MIN); LCD.print(":"); LCD.print(SEC); >> // якщо була натиснута кнопка - обнулюємо змінні та виходимо з циклу buttonIsUp = digitalRead(6); if (buttonWasUp && !buttonIsUp) < delay(10); buttonIsUp = digitalRead(6); if (!buttonIsUp) < lastPos = 0; NewPos = 0; MIN = 0; SEC = 0; LCD.clear(); LCD.setCursor(2, 0); LCD.print("TIMER STOP"); LCD.setCursor(5, 1); LCD.print(MIN); LCD.print(":"); LCD.print(SEC); digitalWrite(10, HIGH); w = 0; >> buttonWasUp = buttonIsUp; // запам'ятовуємо стан кнопки > >
Пояснення до коду:
- частоту звукового сигналу можна змінити за допомогою команди tone();
- Для скетчу потрібно встановити бібліотеку RotaryEncoder.
РК дисплей Arduino LCD 1602
Короткий опис пінів LCD 1602
Давайте подивимося на висновки LCD1602 уважніше:
Кожен із висновків має своє призначення:
- Земля GND;
- Харчування 5;
- Встановлення контрастності монітора;
- Команда, дані;
- Записування та читання даних;
- Enable;
Технічні характеристики дисплея:
- Символьний тип відображення є можливість завантаження символів;
- Світлодіодне підсвічування;
- Контролер HD44780;
- Напруга живлення 5В;
- Формат 16х2 символів;
- Діапазон робочих температур від -20°С до +70°С, діапазон температур зберігання від -30°С до +80°С;
- Кут огляду 180 градусів.
Схема підключення LCD до плати Ардуїно без i2C
Стандартна схема приєднання монітора безпосередньо до мікроконтролера Ардуїно без I2C виглядає так.
Через велику кількість контактів, що підключаються, може не вистачити місця для приєднання потрібних елементів. Використання I2C зменшує кількість дротів до 4, а зайнятих пінів до 2.
Опис
Класичний LCD дисплей, раніше такі стояли у касових апаратах та офісній техніці.
- Бувають різного розміру, найпопулярніший – 1602 (16 стовпців 2 рядки), є ще 2004, 0802 та інші. У наборі йде 1602.
- Забезпечений світлодіодним підсвічуванням, що відключається. Існує кілька варіантів, наприклад, синій фон білі літери, зелений фон чорні літери, чорний фон білі літери та ін. У наборі йде із зеленим фоном та чорними літерами.
- Сам по собі вимагає для підключення шести цифрових пінів, але китайці випускають перехідник на шину I2C на базі PCF8574, що сильно спрощує підключення і економить піни. У наборі йде дисплей із припаяним перехідником.
- На перехіднику також розпаяний потенціометр налаштування контрастності (синій паралелепіпед з крутилкою під хрестову викрутку). Залежно від напруги живлення потрібно вручну настроїти контрастність. Наприклад, при живленні плати від USB на пін 5V приходить ~4.7V, а при зовнішньому живленні від адаптера – 5.0V. Контрастність символів на дисплеї буде різною!
- Перехідник може мати різну адресу для вказівки в програмі: або про це нижче.
Принципова схема функціонального генератора
Схема містить плату Ardunio Uno (Board1), РК-дисплей 1602 (LCD1), два потенціометри по 10 кОм (VR1, VR2) та кілька додаткових компонентів.
Потенціометр VR1, підключений до контакту 3 LCD1, використовується управління контрастністю LCD1. Потенціометр VR2, підключений до виводу аналогового A0 входу плати Arduino Uno, використовується для налаштування періоду часу вихідних сигналів (частоти).
Як виходи використані контакти 3, 9 та 10 плати Arduino:
- контакт 3 - для прямокутної хвилі
- контакт 9 - для синусоїдальної хвилі
- контакт 10 - для пилкоподібної хвилі
Сигнали з висновків 9 і 10 фактично є широтно-імпульсними модульованими (ШІМ) сигналами, що несуть аналогові сигнали. Необхідна форма сигналу виходить за допомогою простої схеми резистивно-конденсаторного фільтра. Прямокутний сигнал на 3 виводі знімається без фільтра.
Ці форми сигналів синтезуються з використанням функцій управління перериванням Timer0 та Compare-Match мікроконтролера Arduino (ATmega328). Таймер 1 ATmega328 запрограмований на частоту 10 кГц для генерації вихідних сигналів ШІМ.
Перемикач S2, підключений до контакту 8 плат Board1, використовується для зміни частотного діапазону. У програмі передбачено два частотні діапазони: від 30 до 250 Гц та від 250 до 2500 Гц для покриття середнього діапазону звукових частот. Ці сигнали від CON2 до CON4 можна переглянути на осцилографі.
Опис протоколу I2C
Перш ніж обговорювати підключення дисплея до ардуїно через i2c-перехідник, коротко поговоримо про сам протокол i2C.
I2C / IIC (Inter-Integrated Circuit) - це протокол, що спочатку створювався для зв'язку інтегральних мікросхем всередині електронного пристрою. Розробка належить фірмі Philips.В основі i2c протоколу є використання 8-бітної шини, яка потрібна для зв'язку блоків в електроніці, що управляє, і системі адресації, завдяки якій можна спілкуватися по одним і тим же проводам з декількома пристроями. Ми просто надаємо дані то одному, то іншому пристрою, додаючи до пакетів даних ідентифікатор потрібного елемента.
Найпростіша схема I2C може містити один провідний пристрій (найчастіше це мікроконтролер Ардуїно) та кілька ведених (наприклад, дисплей LCD). Кожен пристрій має адресу в діапазоні від 7 до 127. Двох пристроїв з однаковою адресою в одній схемі не повинно бути.
Плата Arduino підтримує i2c на апаратному рівні. Ви можете використовувати піни A4 та A5 для підключення пристроїв за цим протоколом.
У роботі I2C можна виділити кілька переваг:
- Для роботи потрібно лише 2 лінії – SDA (лінія даних) та SCL (лінія синхронізації).
- Підключення великої кількості провідних приладів.
- Зменшення часу розробки.
- Для керування всім набором пристроїв потрібен лише один мікроконтролер.
- Можливе число мікросхем, що підключаються, до однієї шини обмежується тільки граничною ємністю.
- Висока ступінь збереження даних через спеціальний фільтр пригнічує сплески, вбудованого в схеми.
- Проста процедура діагностики збоїв, що виникають, швидке налагодження несправностей.
- Шина вже інтегрована в саму Arduino, тому не потрібно додатково розробляти шинний інтерфейс.
- Існує ємнісне обмеження на лінії – 400 пФ.
- Важке програмування контролера I2C, якщо на шині є кілька різних пристроїв.
- При велику кількість пристроїв виникає труднощі локалізації збою, якщо один з них помилково встановлює стан низького рівня.
Генератор сигналів на Arduino та DDS модулі AD9833
Якщо ви вирішили всерйоз зайнятися радіоаматорством, то вам у вашій майстерні не обійтися без генератора сигналів (функціонального генератора, Function Generator). Промислові зразки подібних генераторів можуть коштувати досить дорого, власними силами генератор сигналів виготовити значно дешевше.
У цій статті ми розглянемо створення найпростішого генератора сигналів на основі плати Arduino та DDS модуля AD9833, за допомогою якого можна буде формувати синусоїдальний, прямокутний та трикутний сигнали із частотою до 12 МГц. Тестувати роботу нашого генератора сигналів ми будемо за допомогою осцилографа, який також можна зібрати на основі плати Arduino. Також на нашому сайті ви можете переглянути проект генератора сигналів синусоїдальної та прямокутної форми тільки на основі плати Arduino, без використання додаткових модулів.
Формування синусоїдальної хвилі (коливання) за допомогою Arduino
Ми знаємо, що мікроконтролери є цифровими пристроями, тому вони не можуть формувати синусоїдальну хвилю в чистому вигляді. Але є два способи формування синусоїдальної хвилі за допомогою мікроконтролера: перший полягає у використанні ЦАП (цифро-аналогового перетворювача), а другий - у використанні синусоїдального ШІМ сигналу (SPWM). На жаль, у платах Arduino (за винятком плати Arduino Due) немає вбудованого ЦАП для формування синусоїдальної хвилі. Звичайно, можна було б використовувати зовнішній ЦАП, але ми вирішили не ускладнювати таким чином схему проекту та використовувати метод формування синусоїдального ШІМ сигналу з подальшим перетворенням його на синусоїдальний сигнал (хвилю).
Що таке SPWM сигнал
SPWM розшифровується як Sinusoidal Pulse Width Modulation і перекладається як синусоїдальна широтно-імпульсна модуляція (синусоїдальна ШІМ). Цей сигнал певною мірою схожий на звичайний ШІМ сигнал, але в ньому коефіцієнт заповнення контролюється таким чином, щоб отримати середню напругу схожу на синусоїдальну хвилю
Наприклад, при коефіцієнті заповнення (шпаруватості) 100% середня вихідна напруга буде 5V, а при коефіцієнті заповнення 25% воно буде всього лише 1.25V, таким чином, керуючи шпаруватістю (коефіцієнтом заповнення) ми можемо отримати заздалегідь визначені значення середньої напруги, що змінюються, тобто синусоїдальну хвилю. Цей метод зазвичай використовується в інверторах
Принцип формування SPWM сигналу показано на малюнку.
Синім кольором на цьому малюнку показано SPWM сигнал
Зауважте, що його шпаруватість (коефіцієнт заповнення) змінюється від 0 до 100%, а потім знову повертається в 0%. Представлений графік побудований для діапазону зміни напруги від -1.0 до +1.0V, але в нашому випадку, оскільки ми використовуємо плату Arduino, масштаб подібного графіка буде від 0V до 5V.
Ми розглянемо як у програмі Arduino формувати SPWM сигнал далі у статті.
Перетворення SPWM сигналу на синусоїдальну хвилю
Перетворення SPWM сигналу в синусоїдальну хвилю зазвичай потребує використання схеми H-моста (H-bridge), яка складається щонайменше з 4-х перемикачів потужності (power switches). Подібні схеми зазвичай використовують у інверторах. Ми не будемо в статті докладно розглядати ці питання оскільки нам за допомогою нашої синусоїдальної хвилі не потрібно запитувати будь-який пристрій, нам лише потрібно її сформувати.До того ж за допомогою H-моста неможливо отримати чисту синусоїдальну хвилю – для цього необхідно використовувати фільтр нижніх частот (ФНЧ), що складається з конденсаторів та індуктивностей.
Робота схеми
Схема генератора сигналів з урахуванням плати Arduino представлена наступному малюнку.
Схема запитується від кабелю USB Arduino. Необхідні з'єднання у схемі представлені у наступній таблиці.
| Контакт плати Arduino |
Куди підключено |
| D14 |
контакт RS РК дисплея |
| D15 |
контакт RN РК дисплея |
| D4 |
контакт D4 РК дисплея |
| D3 |
контакт D5 РК дисплея |
| D6 |
контакт D6 РК дисплея |
| D7 |
контакт D7 РК дисплея |
| D10 |
до Rotary Encoder 2 |
| D11 |
до Rotary Encoder 3 |
| D12 |
до Rotary Encoder 4 |
| D9 |
вихід прямокутного сигналу |
| D2 |
контакт D9 плати Arduino |
| D5 |
вихід SPWM сигналу |
У схемі ми формуватимемо прямокутну хвилю (сигнал прямокутної форми) на контакті D9 плати Arduino. Його частоту ми регулюватимемо за допомогою кутового кодера. Для формування синусоїдального сигналу ми формуватимемо SPWM сигнал (синусоїдальний ШІМ (широтно-імпульсної модуляції) сигнал) на контакті D5, його частота залежатиме від частоти сигналу прямокутної форми, яка подаватиметься на контакт D2 і буде діяти як переривання і потім ми за допомогою процедури обробки (обслуговування) переривання керуватимемо частотою синусоїдального сигналу.
Ви можете зібрати схему проекту на макетній або навіть на друкованій платі, але ми вирішили спаяти її на перфорованій платі, в результаті у нас вийшла конструкція, яка показана на наступних малюнках:
Тригер Шмітта
Ми знаємо, що не всі тестові сигнали прямокутні. У нас є сигнали трикутні, пилкоподібні, синусоїдальні і таке інше.Оскільки Arduino Uno може детектувати тільки прямокутні сигнали, нам необхідний пристрій, який міг би перетворювати будь-які сигнали на прямокутні. Тому ми використовуємо тригер Шмітта.
Цей елемент забезпечує вихідний сигнал (OUTPUT) на основі рівня напруги вхідного сигналу (INPUT). Тригер Шмітта має пороговий рівень напруги (THERSHOLD). сигналу нижче за поріг, на виході буде низький логічний рівень. Зазвичай у нас немає окремого тригера Шмітта, за ним завжди слідує елемент НЕ.
Ми збираємося використовувати мікросхему 74LS14, яка містить 6 тригерів Шмітта. Ці шість елементів всередині підключені, як показано на малюнку нижче.
Мікросхема 74LS14, що містить шість тригерів Шмітта.
Таблиця істинності інвертованого тригера Шмітта показана нижче, відповідно до неї ми повинні запрограмувати Arduino Uno для інвертування позитивних та негативних періодів часу на її висновках.
Тепер, коли ми подамо сигнал будь-якого типу на елемент тригера Шмітта, у нас на виході буде прямокутний сигнал з інвертованими часовими періодами, і цей сигнал ми подамо на Arduino Uno.
Генерація символів користувача для LCD
Якщо ви знайдете символи на дисплеї невідповідними та нецікавими, ви можете створити свої власні символи (гліф) для свого РК-дисплея.
Як ми вже обговорювали раніше в цьому посібнику, символ на дисплеї формується в матриці 5×8 пікселів, тому вам потрібно визначити свій символ користувача в цій матриці Для визначення символу необхідно використовувати функцію createChar() бібліотеки LiquidCrystal.
Для використання createChar() спочатку необхідно призначити масив з 8 байт. включені, а якісь вимкнені.
Генератор символів LCD
Створення власного символу досі було непросто! Тому було створено невелику програму під назвою «Генератор символів користувача» для LCD.
Ви бачите синю сітку нижче? Ви можете натиснути на будь-який з 5 × 8 пікселів, щоб встановити/очистити цей конкретний піксель. .
Єдиним обмеженням є те, що бібліотека LiquidCrystal підтримує лише вісім символів користувача.
Наступний скріншот демонструє, як ви можете використовувати ці символи на дисплеї.
// Підключаємо бібліотеку LiquidCrystal: # include // Створюємо LCD об'єкт.Висновки: (rs, enable, d4, d5, d6, d7) LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // створимо кілька символів користувача byte Heart = < 0b00000, 0b01010, 0b11111, 0b11111, 0b01110, 0b00100, 0b00000, 0b00000 >; byte Bell = < 0b00100, 0b01110, 0b01110, 0b01110, 0b11111, 0b00000, 0b00100, 0b00000>; byte Alien = < 0b11111, 0b10101, 0b11111, 0b11111, 0b01110, 0b01010, 0b11011, 0b00000 >; byte Check = < 0b00000, 0b00001, 0b00011, 0b10110, 0b11100, 0b01000, 0b00000, 0b00000>; byte Speaker = < 0b00001, 0b00011, 0b01111, 0b01111, 0b01111, 0b00011, 0b00001, 0b00000>; byte Sound = < 0b00001, 0b00011, 0b00101, 0b01001, 0b01001, 0b01011, 0b11011, 0b11000>; byte Skull = < 0b00000, 0b01110, 0b10101, 0b11011, 0b01110, 0b01110, 0b00000, 0b00000>; byte Lock = < 0b01110, 0b10001, 0b10001, 0b11111, 0b11011, 0b11011, 0b11111, 0b00000>; void setup() < // ініціалізуємо LCD та встановлюємо кількість стовпців та рядків: lcd.begin(16, 2); // Створення нового символу lcd.createChar(0, Heart); // Створення нового символу lcd.createChar(1, Bell); // Створення нового символу lcd.createChar(2, Alien); // Створення нового символу lcd.createChar(3, Check); // Створення нового символу lcd.createChar(4, Speaker); // Створення нового символу lcd.createChar(5, Sound); // Створення нового символу lcd.createChar(6, Skull); // Створення нового символу lcd.createChar(7, Lock); // Очищаємо LCD дисплей lcd.clear(); // Друкуємо повідомлення на LCD. lcd.print("Custom Character"); >// Друкуємо всі символи користувача void loop()
Після включення бібліотеки нам потрібно ініціалізувати користувальницький масив із восьми байтів.
У налаштуваннях ми повинні створити символ користувача, використовуючи функцію createChar(). Ця функція приймає два параметри. Перший — це число від 0 до 7, щоб зарезервувати один з 8 символів, що підтримуються. Другий параметр це ім'я масиву байтів.
// Створення нового символу lcd.createChar(0, Heart);
Далі в циклі для відображення символу користувача ми використовуємо функцію write(), а як параметр ми використовуємо номер символу, який ми зарезервували.
// byte(0) покаже символ Heart (серце). lcd.write(byte(0));
Що таке генератор сигналів на основі прямого цифрового синтезу (DDS)
Як випливає із назви, генератор сигналів може формувати різні види сигналів заданої частоти. Абревіатура DDS (Direct Digital Synthesis) означає прямий цифровий синтез. При цьому способі будь-який сигнал можна сформувати в цифровому вигляді, а потім перетворити його на аналоговий вигляд за допомогою цифро-аналогового перетворювача (ЦАП). Найчастіше у сучасній електроніці цей метод використовується на формування синусоїдальних сигналів, але з його допомогою можна формувати і прямокутні, і трикутні сигнали, і взагалі сигнали будь-якої форми. Оскільки формування сигналів відбувається в цифровій формі в модулі DDS, то можна не тільки дуже швидко перемикатися між сигналами різної форми, але також дуже швидко змінювати їх частоту.
Русифікація LCD 1602 I2C дисплея
Перед завантаженням наступного скетчу необхідно встановити бібліотеку LCD_1602_RUS.h для русифікації дисплея 1602 Ардуїно. Архів з бібліотекою можна скачати на нашому сайті на сторінці - Бібліотеки для Ардуїно. Після встановлення бібліотеки з архіву завантажте в мікроконтролер невеликий приклад із кодом для LCD, який значно спростить для вас виведення кирилиці на дисплей.
Скетч із бібліотекою LCD_1602_UA.h
#include // бібліотека керування пристроями по I2C #include // підключаємо бібліотеку LCD_1602_RUS LCD_1602_RUS LCD(0x27,16,2); // надає ім'я LCD для дисплея void setup() < LCD.init(); // ініціалізація LCD дисплея LCD. backlight (); // увімкнення підсвічування дисплея LCD.setCursor(2,0); // ставимо курсор на 3 символ першого рядка LCD.print("РУСИФІКАЦІЯ!"); // Друкуємо символ на першому рядку > void loop ()