Arduino uno в качестве генератора прямоугольных импульсов с регулируемой частотой и рабочим циклом

Step 1: Simplest Signal Generator

For the simplest Signal Generator, you just solder the AD9833 module onto the back of the Arduino Nano. No PCB is needed.

The connections between the modules are:

  • grounds connected together
  • D2 = FSync
  • D3 = Clk
  • D4 = Data
  • D6 = Vcc of AD9833

The AD9833 is powered from data pin D6 of the Arduino — the Arduino can supply sufficient current. I’ve added a 100n decoupling capacitor because I thought I «ought» to but I couldn’t see any difference — there is already a decoupling capacitor on the AD9833 module board.

If you were being fancy, you might worry about «analogue ground» vs «digital ground» but if you were being fancy, you’d be spending more than £4.

The simplest Signal Generator is controlled and powered over a USB lead from a PC. The USB emulates a serial port running at 115200bps (8-bits, no parity). The commands are:

  • ‘0’..’9′: shift digit into «min» frequency array
  • ‘S’: set AD9833 frequency and produce sine wave
  • ‘T’: set frequency and produce triangle wave
  • ‘Q’: set frequency and produce square wave
  • ‘R’: reset the AD9833
  • ‘M’: copy «min» frequency array into «max» array
  • ‘G’: sweep from «min» to «max» over 1 second
  • ‘H’: sweep from «min» to «max» over 5 seconds
  • ‘I’: sweep from «min» to «max» over 20 seconds

The Arduino program contains two 6-character arrays «min» and «max. If you transmit a digit then it is shifted into the «min» array. If you send an ‘S’ then the «min» array characters are converted into a longint frequency and sent to the AD9833. So sending the string

002500S

will set the AD9833 output to a 2500Hz sine wave. You must always send all 6 digits. The minimum frequency is 000001 and the maximum frequency is 999999.

If you send an ‘M’ then the «min» array is copied into the «max» array. If you send an ‘H’ then the AD9833 repeatedly outputs a gradually increasing frequency over 5 seconds. It starts at «min» frequency and 5 seconds later is at «max» frequency. So

020000M000100SH

sweeps from 100Hz to 20kHz. The frequency change is logarithmic so after 1 second the frequency will be 288Hz, after 2 seconds 833Hz then 2402, 6931 and 20000. The frequency is changed every milliSecond.

The loop stops when the Arduino receives another character so be careful not to send the command followed by carriage-return or line-feed. That extra character would terminate the loop. If you’re using the Serial Monitor, there’s a box at the bottom right that might say for instance «Both NL & CR» which (I think) sends characters after your command. Set it to «No line ending».

You can download the Windows EXE program below which will send the required commands or you could write your own. The Arduino INO file is also here.

Генератор белого шума.

возможно ли как-нибудь просто сделать генератор белого шума?

Нужно что бы в динамике было что-то типа ШШШШШШШШШШШШШШ.

ТР ТР ТР не подходит.

Ну еще и громкость надо немного регулировать. Иметь возможность сделать 100%, 50% и 25% громкости.

Как я понимаю, если я буду делать

то получится чушь. Там частота кватования слижком маленькая.

Цель: Ночник детям. Качество не требуется. Через 3 дня будет разобрано.

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

Нужно что бы в динамике было что-то типа ШШШШШШШШШШШШШШ.

ТР ТР ТР не подходит.

Ну еще и громкость надо немного регулировать. Иметь возможность сделать 100%, 50% и 25% громкости.

Как я понимаю, если я буду делать

то получится чушь. Там частота кватования слижком маленькая.

Level==xx надо заменить на Level Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Запишите отсюда http://simplynoise.com/ звуковой семпл, залейте в плеер — нафига ардуино туд?

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

Запишите отсюда http://simplynoise.com/ звуковой семпл, залейте в плеер — нафига ардуино туд?

Спасибо большое за ссылку. Семпл обязательно запишу, по крайней мере в телефон.

Идея с плеером хорошая, но не подходит из финансовых соображений. 10 евро стоит плеер + 2..3 часа работы. На макетке ведь не будешь собирать. А еще блок питания, кренка , корпус .

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

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

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

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

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

Спасибо за идею. Поднял мне настроение!. Если серьездно, то проще пойти по ссылки, сгенерить вав с 10 секундами красивого звука, переконвертировать их в asm и воспроизводить по кругу. В твоем аналоговом варианте все равно придется R-2R матирицу покупать, что бы громкость звука регулировать. И так же шум волн моделировать.

Источник

Схема проекта

Схема генератора сигналов на основе платы Arduino и DDS модуле AD9833 представлена на следующем рисунке.

Управляет работой всей схемы плата Arduino. Для отображения информации используется OLED дисплей 128х64. Для изменения частоты формируемого сигнала мы используем три переключателя: первый устанавливает частоту в Гц, второй – в кГц, а третий – в МГц. Также мы используем кнопку для включения или отключения выхода схемы. И, наконец, в схеме используется инкрементальный энкодер (rotary encoder) вместе с подключенными к нему подтягивающими резисторами (чтобы правильно работали переключатели). Инкрементальный энкодер используется для изменения частоты, а тактильный переключатель внутри него используется для выбора формы сигнала.

Библиотеки для работы с i2c LCD дисплеем

Для взаимодействие Arduino c LCD 1602 по шине I2C вам потребуются как минимум две библиотеки:

  • Библиотека Wire.h для работы с I2C уже имеется в стандартной программе Arduino IDE.
  • Библиотека LiquidCrystal_I2C.h, которая включает в себя большое разнообразие команд для управления монитором по шине I2C и позволяет сделать скетч проще и короче. Нужно дополнительно установить библиотеку После подключения дисплея нужно дополнительно установить библиотеку LiquidCrystal_I2C.h

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

#include <Wire.h> 
#include <LiquidCrystal_I2C.h> // Подключение библиотеки
//#include <LiquidCrystal_PCF8574.h> // Подключение альтернативной библиотеки

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.setCursor(0,1);              // Установка курсора в начало второй строки
  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?

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

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

Имеет ценность в качестве учебного пособия для неофитов, и в качестве инструмента реализации проекта для любителей, и как инструмент прототипирования для профессионалов.

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

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

Тестирование работы генератора сигналов

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

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

Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.

Работа схемы

Схема генератора сигналов на основе платы Arduino представлена на следующем рисунке.

Схема запитывается от USB кабеля Arduino. Необходимые соединения в схеме представлены в следующей таблице.

Контакт платы Arduino Куда подключен
D14 контакт RS ЖК дисплея
D15 контакт RN ЖК дисплея
D4 контакт D4 ЖК дисплея
D3 контакт D5 ЖК дисплея
D6 контакт D6 ЖК дисплея
D7 контакт D7 ЖК дисплея
D10 to Rotary Encoder 2
D11 to Rotary Encoder 3
D12 to Rotary Encoder 4
D9 выход прямоугольного сигнала
D2 контакт D9 платы Arduino
D5 выход SPWM сигнала

В схеме мы будем формировать прямоугольную волну (сигнал прямоугольной формы) на контакте D9 платы Arduino. Его частоту мы будем регулировать с помощью углового кодера. Для формирования синусоидального сигнала мы будем формировать SPWM сигнал (синусоидальный ШИМ (широтно-импульсной модуляции) сигнал) на контакте D5, его частота будет зависеть от частоты сигнала прямоугольной формы, которая будет подаваться на контакт D2 и будет действовать как прерывание и затем мы с помощью процедуры обработки (обслуживания) прерывания будем управлять частотой синусоидального сигнала.

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

Что нужно знать прежде, чем начинать работать с Ардуино?

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

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

Что нужно еще помнить? Светодиоды не загораются, если установлены с неправильной полярностью. Установленные диоды в обратном направлении могут привести к короткому замыканию. Статическое электричество рук может повредить или уничтожить интегральные схемы и транзисторы.

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

Проверка работы

В первом случае после конструирования должен получиться стандартный мотор-редуктор Ардуино синусоидальных и прямоугольных волновых сигналов, диапазон которых регулируется от до 40 МГц.

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

Во втором случае итоговое решение будет выглядеть так:

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

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

Кухонный таймер Ардуино с энкодером

Сейчас рассмотрим, как сделать таймер на Ардуино своими руками с энкодером и LCD. Принцип управления, подобен предыдущему варианту. Поворотом ручки энкодера можно задать необходимый временной интервал, а нажатием на ручку можно запускать и останавливать обратный отсчет времени. Далее размещена схема сборки проекта на Arduino Nano, этот проект можно собрать и на плате Arduino Uno.

Скетч таймера обратного отсчета времени

#include <Wire.h>                              // библиотека для протокола I2C
#include <LiquidCrystal_I2C.h>        // библиотека для LCD 1602 
LiquidCrystal_I2C LCD(0x27, 20, 2);  // присваиваем имя дисплею

#include <RotaryEncoder.h>                // библиотека для энкодера
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; // запоминаем состояние кнопки
  }
}

Пояснения к коду:

  1. частоту звукового сигнала можно изменить через команду tone();
  2. для скетча потребуется установить библиотеку RotaryEncoder.

Что такое генератор

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

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

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

Такой прибор, как генератор сигналов на Ардуино, легко сделать в домашних условиях. Основа конструкции – микроконтроллер Arduino.

Общие принципы работы проекта

В данном проекте рассматривается генератор перестраиваемой частоты (variable-frequency oscillator, VFO), пригодный для использования в «домашних» (Do It Yourself , DIY) условиях. Этот генератор может пригодиться в синтезаторах частоты, супергетеродинных радиоприемниках, SDR-приемопередатчиках и т.д. Генератор имеет шкальный индикатор (Bargraph indicator) для отображения мощности сигнала (S-Meter) и 20 заранее установленных диапазонов частот.

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

  • рабочий диапазон от 10 кГц до 225 МГц;
  • шаг настройки: 1 Гц, 10 Гц, 1 кГц, 5 кГц, 10 кГц и 1 МГц;
  • регулируемое смещение (+ или -) промежуточной частоты (ПЧ);
  • 20 заранее установленных диапазонов частот (с быстрым доступом) в полосах частот АМ-вещания (BCB) и радиолюбительских диапазонах (HAM frequencies);
  • режим генерации сигналов (функциональный генератор);
  • для использования в качестве местного генератора на самодельных супергетеродинных радиоприемниках или радиоприемниках с прямым преобразованием;
  • для использования в качестве генератора переменной частоты для радиолюбителей;
  • для использования в качестве простого тактового генератора для калибровки или генерации тактовых импульсов;
  • шкальный индикатор для отображения мощности сигнала через вход АЦП (аналого-цифрового преобразователя);
  • возможность работы с платами Arduino Uno, Nano и Pro Mini;
  • использует стандартный дисплей 128×64 I2C OLED SSD1306 и модуль Si5351;
  • передача данных по интерфейсу I2C, необходимо всего 2 провода для подключения дисплея и модуля Si5351 к плате Arduino;
  • высокая стабильность и точность генерации частоты;
  • хорошая эффективность, невысокая стоимость, можно собрать в домашних условиях.

Как подключить к Arduino LCD без I2C

Текстовый экран 16×2 используется для вывода информации с датчиков, отображения меню или подсказок. На экране выводятся черные символы размером 5×8 пикселей. Встроенная подсветка включается подачей питания на пины модуля. Текстовый дисплей 16×2 без модуля IIC подключается к микроконтроллеру через 16 контактов. Распиновка экрана с примером подключения размещена ниже.

Для этого занятия нам потребуется:

  • плата Arduino Uno / Arduino Nano / Arduino Mega;
  • LCD монитор 1602 i2c;
  • провода «папа-мама».

Схема подключения текстового экрана 16×2 к Ардуино

LCD 1602 i2c Arduino Uno Arduino Nano Arduino Mega
GND GND GND GND
VCC 5V 5V 5V
SDA A4 A4 20
SCL A5 A5 21

Жидкокристаллический дисплей имеет 2 ряда по 16 символов, отсюда и его название LCD 1602. В память устройства встроено 192 знака, еще 8 знаков может определить сам пользователь. При подключении дисплея без IIC модуля потребуется использовать 6 портов общего назначения у микроконтроллера Arduino, не считая питания. Соберите схему, как на картинке выше и загрузите следующую программу в плату.

Скетч. Ардуино и LCD 1602 без I2C модуля

// подключаем библиотеку для работы с экраном
#include <LiquidCrystal.h>

// объявляем объект, для управления дисплеем указываем пины
LiquidCrystal LCD(13, 12, 11, 10, 9, 8);
 
void setup() {
   LCD.begin(16, 2);      // указываем количество строк и столбцов

   LCD.setCursor(1, 0);     // ставим курсор на 1 символ первой строки
   LCD.print("I LOVE");     // печатаем сообщение на первой строке
  
   LCD.setCursor(8, 1);        // ставим курсор на 1 символ второй строки
   LCD.print("ARDUINO");  // печатаем сообщение на второй строке
}
 
void loop() {

}

Пояснения к коду:

  1. для данного примера используется стандартная библиотека LiquidCrystal.h для QAPASS, которая не поддерживает кириллицу;
  2. чтобы упростить схему и не использовать большое количество пинов микроконтроллера, следует использовать дисплей с модулем I2C.

Как вывести свой символ на LCD 1602

Вывести свой символ или кириллическую букву на дисплей поможет таблица знакогенератора (CGROM). Такой вид памяти в Ардуино, как CGRAM, может хранить собственные символы, но размер памяти ограничен и может вместить лишь 8 собственных символов. Один из нестандартных символов, который пригодится для создания домашней метеостанции — знак градуса. Давайте нарисуем символ.

Создаем свой символ для LCD дисплея 1602

Для начала возьмите листок бумаги и нарисуйте на нем таблицу, где будет 5 столбцов и 8 строчек. Далее заштрихуйте в таблице клеточки (смотри фото выше), которые должны высвечиваться на дисплее. Дело в том, что каждый символ на дисплее состоит из пикселей (5 пикселей в ширину и 8 пикселей в высоту). Далее представим наш символ в виде массива данных, состоящего из восьми элементов — восьми строк.

Исходный код программы

Чтобы в программе подключить ЖК дисплей к ARDUINO UNO, необходимо сделать следующие несколько вещей:

Arduino

#include <LiquidCrystal.h>
lcd.begin(16, 2);
LiquidCrystal lcd(0, 1, 8, 9, 10, 11);
lcd.print(«hello, world!»);

1
2
3
4

#include <LiquidCrystal.h>

lcd.begin(16,2);

LiquidCrystallcd(,1,8,9,10,11);

lcd.print(«hello, world!»);

В первую очередь мы должны подключить заголовочный файл (‘#include <LiquidCrystal.h>’), в котором находятся все необходимые инструкции для взаимодействия с ЖК дисплеем, что значительно упростит взаимодействие с ним в 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.

Arduino

#include <LiquidCrystal.h> // инициализируем библиотеку для взаимодействия с ЖК дисплеем
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);// устанавливаем курсор в нулевой столбец первой строки
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

#include <LiquidCrystal.h> // инициализируем библиотеку для взаимодействия с ЖК дисплеем

LiquidCrystallcd(,1,8,9,10,11);/// сообщаем Arduino номера контактов, к которым подключен ЖК дисплей — REGISTER SELECT PIN,ENABLE PIN,D4 PIN,D5 PIN, D6 PIN, D7 PIN

voidsetup()

{

// устанавливаем число столбцов и строк для ЖК дисплея  

lcd.begin(16,2);

}

voidloop()

{

// устанавливаем курсор в нулевой столбец первой строки  

lcd.print(»   CIRCUIT DIGEST»);//печатаем строку

lcd.setCursor(,1);// устанавливаем курсор в нулевой столбец второй строки  

lcd.print(«http://www.circuitdigest.com/»);//печатаем строку

delay(750);//задержка на 0.75 сек

lcd.scrollDisplayLeft();// переключаем данные на ЖК дисплее

lcd.setCursor(,);// устанавливаем курсор в нулевой столбец первой строки  

}

Общие принципы работы проекта

Генератор состоит из небольшого числа компонентов: платы Arduino Nano, ЖК дисплея, 3-х подтягивающих резисторов и 3-х кнопок.

В генераторе можно изменять период (частоту) повторения импульсов с помощью кнопок, подключенных к контактам 6 и 7 платы Arduino

С помощью кнопки, подключенной к контакту 13, можно изменять скважность импульсов. Длительность импульсов и скважность будут отображаться в первой строке ЖК дисплея, а частота – во второй строке ЖК дисплея

Минимальный шаг для настройки периода повторения импульсов составляет 1 мкс, поэтому частота импульсов будет изменяться также дискретно, например, периоду 1 мкс будет соответствовать частота 1 МГц, периоду 2 мкс – частота 500 кГц, периоду 3 мкс – частота 333.333 Гц и т.д. То есть по мере уменьшения частоты увеличивается плавность ее настройки. Конечно, это не очень практично для высоких частот, но это вынужденная плата за простоту устройства. Более продвинутый генератор можно собрать на основе использования DDS модуля, но это уже будет значительно более сложное устройство.

Для проверки работы генератора автор проекта использовал простой одноканальный осциллограф (который также можно собрать на основе платы Arduino). Для удобства работы с генератором он был помещен в небольшой корпус.