Шрифт:
Интервал:
Закладка:
Простейшая пробная программа для работы с функциями serial выглядит так:
Функция Serial.write() отличается от Serial.print() тем, что первая посылает данные, как числа, а вторая позволяет организовать вывод в различных строковых форматах (см. описание функции в [23]). Мы здесь употребляем вариант второй функции под названием serial.println, который дополнительно присоединяет к выводу символы перевода строки. Многочисленные примеры употребления этих операторов в разных вариантах вы встретите далее.
* * *
Подробности
Коммуникационные функции Arduino в случае приема нескольких байтов всегда требуют тщательной отладки на макете. На них (функциях) сказываются недостатки Arduino, заключающиеся в общей замедленности работы платформы. Отслеживание данных, приходящих через последовательный порт через непредсказуемые промежутки времени, представляет собой непростую задачу даже при использовании профессионального инструментария. Тем не менее и в простейшем виде, предлагаемом стандартными возможностями Aduino IDE, с этой задачей можно справиться.
Для лучшего понимания, как это делается, стоит учесть, что с последовательным портом в Arduino связан буфер размером 64 байта (не путать с аппаратным буфером самого UART). Чтобы действительно ничего не упустить, следует вызывать функцию Serial.available о с задержкой — тогда, когда в этом буфере уже что-то имеется, иначе считается только первый пришедший байт, а остальные могут пропасть. Потому мы без зазрения совести ставим в программе временные задержки (функция delay ()) при приеме нескольких байтов из компьютера или другого устройства — операция, которая в случае отсутствия такого буфера, наоборот, только привела бы к гарантированной потере данных. При формировании задержек следует ориентироваться на то, что передача одного байта на скорости 9600 занимает примерно 1 миллисекунду. Так что при приеме в пределах десятка байтов будут разумными величины задержек порядка 10 миллисекунд или несколько более на весь цикл приема. Именно такой прием мы применим при установке часов из компьютера в главе 22, где и познакомимся с приемом последовательности нескольких байтов.
* * *
Да, а как принять посланные байты в компьютере? Для этого годится абсолютно любая программа-монитор, позволяющая устанавливать номер порта и скорость приема. В том числе такая программа входит и в Arduino IDE (Сервис | Монитор порта). Она заслуженно вызывает многочисленные нарекания своей примитивностью, но для каких-нибудь простых тестовых целей вполне годится — главное, что в ней не надо ничего устанавливать, связь с устройством доступна немедленно после загрузки программы. Для более «продвинутых» читателей я рекомендую свою программу-монитор под названием Соm2000 (ее можно скачать с сайта автора по адресу http://revich.lib.ru/comcom.zip) — она отличается тем, что позволяет организовать обмен в любом удобном формате (численном в десятичной или шестнадцатеричной форме, а также в текстовом). Входит подобная программа, как составная часть, и в утилиту X–CTU для настройки радиомодулей по протоколу ХЬее, которыми мы будем заниматься в следующей главе.
Столь простое обращение с последовательным портом позволяет дополнить программы Arduino простейшим средством отладки. Такие средства напрочь отсутствуют в среде Arduino, а без них очень трудно отлаживать более-менее сложные программы, — ту же настройку часов из компьютера (глава 22) без контроля за тем, что принимается в программе и в каком виде, создать было бы просто нереально. Для этого в нужных местах программы вы расставляете операторы Serial.print() или Seriai.write(), посылающие в компьютер переменные, значения которых необходимо контролировать, и отслеживаете их состояние через монитор порта.
Другие подробности работы с последовательным портом мы узнаем по ходу дела, а сейчас займемся задачей вывода значений на индикаторы. Это отдельная задача, и не слишком простая — имеющиеся в продаже дисплеи весьма разнообразны по типу и довольно капризны в обращении.
Работа с текстом на графическом дисплее MT-12864JДисплеи для вывода цифр, текста и графики, как мы уже знаем из главы 7, встречаются нескольких разновидностей. Здесь мы остановимся на небольших матричных дисплеях, в которых изображение составляется из точек, что позволяет формировать произвольные символы и элементарные изображения. Матричные дисплеи бывают графические и строчные, отличающиеся способом управления: у них разные контроллеры, ориентированные в одном случае на адресацию каждой точки в отдельности, во втором — на вывод символов по их коду, подобно тому, как это делается в программах для компьютеров. Разумеется, эта преимущественная ориентация не исключает вывод текста на графические дисплеи или вывод примитивных изображений на строчные. Именно задачей вывода текста на графический дисплей мы сейчас и займемся, а в следующей главе познакомимся со строчными разновидностями.
Для каждого из этих типов дисплеев имеется стандартный контроллер, по образцу которого строится управление любой аналогичной матрицей. Для символьных строчных экранов стандартный контроллер называется HD44780, а для графических ту же роль играет ks0108 — с ним совместимы все графические экраны небольшого размера. Мы воспользуемся популярным отечественным графическим ЖК-модулем MT-12864J фирмы МЭЛТ. На сайте «Амперки» в разделе Вики легко разыскать статью «Работа с ЖК-матрицей 128x64», рассказывающую о подключении этого модуля в стандартном графическом режиме с помощью библиотеки GLCD.
Здесь мы подробнее остановимся на некоторых нюансах практического применения ЖК-матриц на основе контроллера ks0108, а также рассмотрим вывод текста с помощью готовых шрифтов из библиотеки GLCD и вопросы их модернизации для вывода кириллических символов.
Подключение MT-12864JК сожалению, контроллер ks0108 имеет параллельный восьмибитовый интерфейс, и с учетом управляющих выводов нам придется занять аж 13 функциональных контактов платы Arduino Uno. Число соединений можно сократить, если подключить ЖК-модуль через сдвиговый регистр или, что еще проще, дешифратор двоичного кода. В первом случае число линий данных сократится с восьми до одной плюс линия импульсов сдвига, во втором — до трех. Но в обоих случаях о стандартной библиотеке придется забыть, создавать свои схемы подключения и писать свои процедуры вывода.
Поэтому мы прибегнем к стандартному способу, но внесем в него некоторые изменения. Использовать именно те выводы Arduino, что предусмотрены библиотекой GLCD по умолчанию[43], при таком их количестве не только неудобно, но часто просто невозможно. Не забудем, что ведь мы еще подключаем к контроллеру всякие другие устройства по стандартным коммуникационным портам, и стоит постараться не занимать их выводы по максимуму.
Модернизированная с учетом этого обстоятельства схема подключения MT-12864J к Arduino Uno приведена на рис. 21.4.
Рис. 21.4. Схема подключения MT-12864J к Arduino Uno
Как видите, у нас оставлены, свободными контакты D1 и D2 (RX и ТХ последовательного порта) и контакты А4-А5, которые, как мы еще узнаем, участвуют в обмене через порт 12С. Одновременная работа со стандартным подключением SD-карты, требующим выводов интерфейса SPI (11, 12, 13 и, с некоторыми оговорками, 10) здесь уже оказывается невозможной. Этот дефицит выводов станет одной из причин, по которым в проекте метеостанции, рассматриваемом в следующей главе, мы выберем другой тип дисплея. Но и ЖК-дисплей может оказаться полезным во многих случаях, особенно при проектировании малопотребляющих приборов, работающих на батарейках.
Обратим также внимание на резисторы R1 и R2, о которых почему-то авторы статей о графических матрицах часто забывают упомянуть. Переменный или подстроечный резистор R1 служит для регулировки контрастности индикатора. На схеме он подключен так, как рекомендуется в документации фирмы МЭЛТ, однако может подключаться и по схеме потенциометра: одним концом к «земле», другим к питанию 5 В, а средним выводом к контакту Vo индикатора. Номинал его выбирается в пределах 10–20 кОм, и в конечном продукте R1 можно заменить на постоянный резистор подобранного номинала.
Резистор R2 — токоограничивающий для LED-подсветки. Его можно не устанавливать вовсе (и в документации он не упоминается), поэтому на схеме он обозначен пунктиром. Согласно документации МЭЛТ, ток подсветки тогда составит около 64 мА. Установить токоограничивающий резистор R2 следует в двух случаях: если вы хотите уменьшить ток (и, соответственно, пожертвовать яркостью подсветки), или если подсветка питается от отдельного источника с повышенным напряжением. Последний вариант обычно реализуется при смешанном питании, когда подсветка подключается к нестабилизированному напряжению на выходе сетевого адаптера, а при переключении на батарейку отключается вовсе. Потребление контроллера модуля при выключенной подсветке тогда составит всего 4 мА (на подробностях реализации этого способа мы здесь останавливаться не будем). При обычном напряжении на выходе адаптера (7–9 В) резистор R2 должен погасить лишние 2–4 В, соответственно, его номинал должен составлять от 39 до 62 Ом.
- Электроника в вопросах и ответах - И. Хабловски - Радиотехника
- Путеводитель в мир электроники. Книга 2 - Борис Семенов - Радиотехника
- Радиоэлектроника-с компьютером и паяльником - Генрих Кардашев - Радиотехника
- Зворыкин - Василий Борисов - Радиотехника