Текстовая анимация с помощью arduino arduino+

#15 Дисплей SSD1306 подключаем к Arduino. Выводим текст, рисуем фигуры.

В этом уроке расскажу, как работать с 0,96-дюймовый SSD1306 OLED-дисплем в среде Arduino IDE . Покажу как вывести текст и нарисовать фигуры . Как выводить текст на русском языке покажу в следующем уроке.

OLED-дисплей, который я буду использовать в этом уроке, – это модель SSD1306: 0,96-дюймовый с разрешением 128×64 пикселя, как показано на фото ниже.

OLED-дисплей не требует подсветки, что приводит к хорошему контрасту в темный период времени. Кроме того, его пиксели потребляют энергию только тогда, когда они включены, поэтому OLED-дисплей потребляет меньше энергии, по сравнению с другими дисплеями.

Дисплей поможет вам автоматизировать ваше производства, а полиэтиленовый рукав поковать вашу продукцию. Где полиэтиленовый рукав купить ? На сайте МТ-ПАК ТОРГ.

Модель, которую я использую, имеет четыре контакта и взаимодействует с любым микроконтроллером, используя протокол связи I2C. Есть, которые используют протокола связи SPI. Есть модели, которые поставляются с дополнительным выводом сброса.

Технические параметры дисплея SSD1306:

  • Технология дисплея: OLED
  • Разрешение дисплея: 128 на 64 точки
  • Диагональ дисплея: 0,96 дюйма
  • Угол обзора: 160°
  • Напряжение питания: 2.8 В

5.5 В

  • Мощность: 0,08 Вт
  • Габариты: 27.3 мм х 27.8 мм х 3.7 мм
  • Дисплей OLED SSD1306 Описание подключения.
    Поскольку OLED-дисплей использует протокол связи I2C, подключение очень простое. Как подключить к Arduino UNO или Arduino NANO смотрите в таблице ниже.

    Pin

    Arduino UNO или Arduino NANO

    Схема подключения SSD1306 к Arduino UNO

    Установка библиотеки SSD1306 OLED

    Существует несколько библиотек, доступных для управления OLED-дисплеем. В этом уроке я буду использовать две библиотеки Adafruit: библиотеку Adafruit_SSD1306 и библиотеку Adafruit_GFX .

    Для установки этих библиотек выполните следующие действия.
    1. Откройте Arduino IDE и перейдите в раздел Скетч > Подключить библиотеку > управление библиотеками.

    Должен открыться менеджер библиотеки.

    2. Укажите “ SSD1306” в поле поиска, выберете из списка и установите библиотеку от Adafruit SSD1306

    3. Аналогично установите вторую библиотеку, для этого в поле поиска укажите “ GFX

    4. После установки библиотеки перезагрузите среду разработки Arduino.

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

    В вашей среде разработки Arduino, выберите Файл > Примеры > Adafruit SSD1306 и выберете тип вашего дисплея. В моем случае это 128х64_i2c.

    Вот код примера для моего дисплея SSD1306

    Если ваш OLED дисплей не имеет pin сброса, вы должны установить переменную OLED_RESET в значение -1, как показано ниже.

    Не забудьте выбрать нужную плату и COM порт в меню Инструменты.

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

    Если ваш OLED-дисплей ничего не показывает:
    Убедитесь, что OLED-дисплей правильно подключен к Ардуино.
    Также вы должны изменить OLED-адрес в следующей строке, например на 0x3D, если это необходимо. В моем случае адрес 0x3C.

    Вывод текста на дисплей

    Библиотека Adafruit для OLED-дисплея поставляется с несколькими функциями для вывода текста. В этом разделе вы узнаете, как писать и прокручивать текст с помощью функций библиотеки.
    “Hello, world!” OLED-дисплей
    Следующий код отображает Hello, world! сообщение на дисплее.

    После загрузки кода вот, что вы получите в вашем дисплее.

    Рассмотрим скетч подробнее.

    Импорт библиотек
    Во-первых, вам нужно импортировать необходимые библиотеки. Библиотека для использования I2C и библиотеки Adafruit для вывода информации на дисплей: Adafruit_GFX и Adafruit_SSD1306

    Инициализация OLED-дисплея
    Затем, вы определяете свою ширину и высоту дисплея. В этом примере я использую OLED-дисплей 128×64. Если вы используете другие размеры, вы можете изменить это в переменных SCREEN_WIDTH и SCREEN_HEIGHT

    Затем инициализируйте экранный объект, с шириной и высотой, определенными ранее с помощью протокола связи I2C (&Wire).

    Параметр (-1) означает, что ваш OLED-дисплей не имеет pin сброса. Если ваш OLED-дисплей имеет пин сброса, то он должен быть подключен к GPIO. В этом случае вы должны передать номер GPIO.
    В setup () инициализируйте последовательный монитор на скорости передачи данных 9600 бод для отладки.

    Serial.begin(9600);

    Инициализируйте OLED-дисплей с помощью метода begin() следующим образом

    Этот фрагмент выводит сообщение на последовательный монитор, если вы не можете подключиться к дисплею.

    Так же, вам может потребоваться изменить адрес OLED. В моем случае адрес 0x3C.

    Рассказывал об этом выше.

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

    Очистить дисплей, установить размер шрифта, цвет и написать текст.

    После инициализации дисплея очистите буфер дисплея с помощью метода clearDisplay().

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

    Установите размер шрифта с помощью метода setTextSize().

    Установите цвет шрифта с помощью метода setTextColor().

    WHITE устанавливает белый шрифт и черный фон.

    Определите позицию, с которой начинается текст, используя метод setCursor(x, y). В этом случае, вы устанавливаете текст, чтобы начать с координат (0,10).

    Наконец, можно отправить текст на дисплей с помощью метода println (), как показано ниже.

    Затем, вам нужно вызвать метод display (), чтобы фактически отобразить текст на экране.

    Библиотека Adafruit OLED предоставляет полезные методы для легкой прокрутки текста.

    startscrollright(0x00, 0x0F): прокрутка текста слева направо
    startscrollleft(0x00, 0x0F): прокрутка текста справа налево

    Следующий скетч реализует методы прокрутки текста:

    Нарисуйте фигуры на OLED-дисплее

    Библиотека Adafruit OLED предоставляет полезные методы для рисования пикселей, линий и фигур. Давайте рассмотрим эти методы.

    Чтобы нарисовать пиксель на OLED-дисплее, можно использовать метод drawPixel(x, y, color), который принимает в качестве аргументов координаты x и y, где появляется пиксель, и цвет. Например

    Нарисовать линию

    Используйте метод drawLine(x1, y1, x2, y2, color) для создания линии. Координаты (x1, y1) указывают начало линии, а координаты (x2, y2) указывают, где заканчивается линия.

    Нарисуйте прямоугольник

    DrawRect (x, y, width, height, color) обеспечивает простой способ рисования прямоугольника. Координаты (x, y) указывают на верхний левый угол прямоугольника. Затем вам нужно указать ширину, высоту и цвет.

    Вы можете использовать fillRect(x, y, width, height, color) для рисования заполненного прямоугольника. Этот метод принимает те же аргументы, что и drawRect.

    Библиотека также предоставляет методы для отображения прямоугольников с закругленными углами : drawRoundRect () и fillRoundRect (). Эти методы принимают те же аргументы, что и предыдущие методы, плюс радиус угла. Например

    Или заполненный со скругленными углами прямоугольник:

    Чтобы нарисовать круг, используйте метод drawCircle(x, y, radius, color). Координаты (x, y) указывают на центр окружности. Вы также должны передать радиус в качестве аргумента. Например

    Таким же образом, чтобы построить заполненный круг, используйте метод fillCircle() с теми же аргументами:

    Нарисуйте треугольник

    Используйте метод drawTriangle(x1, y1, x2, y2, x3, y3, color) для построения треугольника. Этот метод принимает в качестве аргументов координаты каждого угла и цвет.

    Используйте метод fillTriangle (), чтобы нарисовать заполненный треугольник:

    Инвертирование

    Библиотека предоставляет дополнительный метод, который можно использовать с фигурами или текстом: метод invertDisplay (). Передайте true в качестве аргумента, чтобы инвертировать цвета экрана, или false, чтобы вернуться к исходным цветам.

    Если вы вызываете следующую команду после определения треугольника

    Вы получите черный треугольник, а фон будет подсвечен.

    Код для рисование всех фигур
    Загрузите следующий скетч в Arduino, который реализует каждый фрагмент кода, который я рассмотрел ранее, и выведет все фигуры.

    Планировал добавить вывод русского текста на дисплей SSD1306, но урок получился и так большой. Поэтому вывод русского текст будет в следующем уроке.

    Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

    Всем Пока-Пока. И до встречи в следующем уроке.

    Понравилась статья? Поделитесь ею с друзьями:

    Сообщества › Arduino для автомобиля › Блог › Полезные ссылки для ознакомления с Ардуино.

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

    1. Это собственно самая логичная ссылка (но некоторые, почему то, не догадываются) arduino.ru.

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

    2. База знаний на сайте магазина Амперка.

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

    Хотя его несложно найти на сайте магазина Амперка, я вынес его отдельным пунктом, так как по моему мнению, это действительно одно из-самых простых, понятных, и полезных средств для освоения основ работы с Arduino. Поверьте, боле 80% вопросов, задаваемых в данном сообществе, исчезают после просмотра 3 — 4 серий данного видео курса.

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

    Хотя это не совсем Arduino но очень рядом, и как выяснилось, для многих проблему составляют именно основы языка Си, который используется для написания скетчей под Arduino. Данная книга по праву считается лучшим учебником по Си.

    По сути справочник подключений к Arduino (на английском языке), начиная от кнопок, заканчивая различными сложными схемами. Спасибо yolkipalki . Его сокращенная версия, доступна в блоге нашего сообщества.

    7. FLProg

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

    Текстовая анимация с помощью Arduino

    Использование функции пользовательских символов для анимации с помощью Ардуино (Arduino) – не стандартный метод подключения панели ЖК-дисплея.

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

    Шаг 1. Нам понадобится

    Что вам понадобится для этого:

    • Arduino Uno
    • HD44780-совместимый ЖК-дисплей
    • Макет-прототип
    • Один резистор 10 кОм
    • Один потенциометр 10 кОм
    • Паяльники и паяльные материалы

    Дополнительно, если вы припаяете ЖК-дисплей к отдельной плате:

    • Еще одна небольшая макетная плата с, по меньшей мере, двумя рядами и шестнадцатью отверстиями в ряду (по желанию)
    • 16-контактный разъем типа «мама» или что-то подобное (например, разъемы для чипа)

    Даже если вы не припаяете ЖК-дисплей к отдельной плате, вам, вероятно, понадобится 16-штырьковый ряд штекерных разъемов типа «папа-папа», чтобы вы могли прикрепить свой ЖК-дисплей непосредственно к макету без пайки.

    Зачем это небольшое хакерство нужно вообще? Конечно, здесь нет большой полезности, если делать таким образом для общих целей анимации. Для этого нужен настоящий ЖК-дисплей, а не основной текстовый дисплей. Тем не менее, общий метод может быть интересен тем, у кого есть ограниченный компонент отображения, и необходим какой-то анимированный индикатор прогресса или уровня.

    Шаг 2. Подключите ЖК-дисплей к макету

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

    Мне посчастливилось найти ЖК-монитор, подключенный к макету, который кто-то использовал. Это была небольшая штуковина с двумя рядами по семь ножек на одном конце, а провода на «RA» и «RK» на другом конце.

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

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

    Я аккуратно согнул провода и вставил голые контакты в макет. Сначала я проделал со всеми нечетными проводами, вставив их все в свои отверстия и припаяв контакты 1 и 13 только для того, чтобы все было на месте. Затем я вставил все провода с четными номерами и спаял 2 и 14. После стало проще и можно было уже припаять каждый по очереди.

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

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

    После этого я проверил каждую пару, чтобы убедиться, что я не сделал никаких ошибок.

    Шаг 3. Подключение цепей

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

    Выполняйте все эти подключения перед подключением питания к Arduino! И проверьте, и перепроверьте, и трижды проверьте провода, которые идут на Vcc и Ground, чтобы убедиться, что вы соединили их в правильном порядке.

    Короткое замыкание и обратная проводка могут сжечь вашу ЖК-панель, плюс сжечь контакты и повредить Arduino. В этой цепи нет резисторов и диодов, чтобы предотвратить негативные последствия. Поэтому, пожалуйста, будьте осторожны! Я не могу нести ответственность, если вы подключите неправильно, или вы используете неправильную панель ЖК-дисплея для этого.

    Типичная схема 44780 соединяет выводы в этом порядке:

    1. LCD 1 (ЖК-дисплей 1) = Земля
    2. LCD 2 = Vcc (+ 5V)
    3. LCD 3 = контракт – подключается к среднему выступу потенциометра; Соедините одну сторону с землей, а другой через резистор 10 кОм к Vcc.
    4. LCD 4 = Сброс (reset) = Arduino 7
    5. LCD 5 = Чтение / запись = связь с землей, так как записываем, не читаем
    6. LCD 6 = Включить (Enable) = Arduino 8
    7. LCD 7 через 14 = линии данных DB0..DB7, соответственно. Меня интересуют только последние четыре бита, поэтому connect
    8. LCD 11 – Arduino 9
    9. LCD 12 – Arduino 10
    10. LCD 13 – Arduino 11
    11. LCD 14 – Arduino 12

    Из-за этих настроек код эскиза (скетча) должен инициализировать объект LiquidCrystal:

    (в моем прикрепленном изображении вы могли заметить, что я неправильно подключил потенциометр! Я исправил это после того, как сделал снимок!)

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

    Шаг 4. Нарисуйте то, что вы анимируете

    Чип HD44780 позволяет вам создавать и использовать до восьми пользовательских символов, а библиотека LiquidCrystal позволяет вам «создать» персонаж. Но функция createChar (index, byteArray) фактически заменяет биты определения символа, и если у вас есть какой-либо рисунок на экране, биты обновляются немедленно, поэтому это больше похоже на вызов defineChar или вызов createOrUpdateChar.

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

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

    Шаг 5. Строим биты танка в коде

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

    Кусок кода для этого есть здесь. Его легче читать шрифтом фиксированной ширины.

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

    Шаг 6. Смещение символов

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

    Я также просто возьму по модулю позицию x танка (tankx % 5), чтобы выяснить, как сдвинуть биты. Если бы модуль был равен нулю, я рисовал бы символы и определял бы биты символов. Но если бы модуль был ненулевым, это означало, что символы уже на экране, и я могу просто переопределить биты. Я также отрисовал бы ведущее пространство, чтобы исключить любой предшествующий рисунок пользовательского символа 0 (самый левый), когда бы я «двигал» фигуру.

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

    Затем, внутри loop(), я бы сделал разделение и модуль, чтобы выяснить, что рисовать и как рисовать. (Остерегайтесь того, как работает модуль с отрицательными числами.)

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

    Это часть кода loop(), которая выводит на экран пользовательские символы. В лучшем исполнении этого кода, я превратил функции рисования в функцию safeDrawCharAt, которая выполняет проверку позиции. Но здесь вы видите более раннюю версию, где я выполнял проверку позиции. Так как в любое время символы могут быть за кадром, мне нужно было выполнить проверку позиции перед вызовами setCursor() или write().

    Шаг 7. Двигаем биты танка

    Теперь, когда символы на экране, вы можете изменять их биты. В конечном счете, вам нужно вызвать функцию createChar(index, byteArray), чтобы получить биты на ЖК-дисплее, а это означает, что для каждого символа требуется массив из восьми байтов. Я использую четыре настраиваемых символа, поэтому я использовал четыре массива байт.

    Внутри loop() я взял побитовое деление по модулю, чтобы получить смещение. Здесь эффективность длинных целых вступает в игру. Во-первых, я бы скопировал long int из статического танка в локальную переменную. Тогда я бы переложил всю long int обратно на количество бит, которое мне понадобится.

    Наконец, когда все байтовые массивы были вычислены, я направил их на LCD.

    Если вы вычисляете это путем смещения байтов, вам придется убедиться, что вы «переносите» последний бит в следующий байт по горизонтали, но так как я остаюсь в пределах 32-битного long int с каждым раундом, процессор делает перенос бита для меня.

    В конце цикла я перемещаю танк, а затем перебираю цикл до начала после того, как танк ушел за пределы экрана.

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

    Шаг 8. Анимация гусениц танка

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

    Чертеж танка должен был использовать эту конфигурацию для начала, но на самом деле это означало, что я мог сначала включить все пиксели протектора (внутри длинного массива int), а затем отключить каждый третий пиксель. В зависимости от позиции tankx, по модулю 3, я бы выключил другой набор пикселей.

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

    Таким образом, я определил отдельное положение treadx (на самом деле не позиция x, скорее как счетчик, который будет содержать циклы 0, 1, 2, 0, 1, 2, . ), и на основе его значений я бы выяснил, какой бит протектора выключить. На моем рисунке это произойдет только в самых нижних четырех строках «y», которые соответствуют значениям 4, 5, 6 и 7 .

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

    Шаг 9. Смотрим как работает

    Конечным результатом является танк, который перемещается по экрану. Следует отметить, что разные ЖК-панели имеют разные физические схемы и характеристики. На этой плате имеется линия, ширина которой составляет пиксель между каждым символом, как по вертикали, так и по горизонтали. Дисплей имеет ширину 8 символов и высоту 2 символа. Я экспериментировал с различными настройками по модулю, позволяя компенсировать движение персонажа в каждом шестом сдвиге, а не в каждом пятом. Это то, с чем вам нужно играть, в зависимости от того, что вы пытаетесь сделать. Другая ЖК-панель, которую я получил от принтера HP, и она не имеет ширины одного пикселя, разделяющего ряды, но между каждым символом все еще есть расстояние.

    Другое, чего нужно остерегаться – время затухания и контраст. Потенциометр позволяет устанавливать различные контрастные параметры, что облегчает просмотр пикселей. Время затухания может варьироваться между панелями. Чем дольше вы затухаете, тем больше задержка вам нужна, иначе вы столкнетесь с размытой анимацией. Кто-то, вероятно, найдет способ воспользоваться этим угасанием. Мне кажется, что может быть умный способ генерировать «серые» уровни путем быстрого включения и выключения пикселей, но только в том случае, если время действительно точное.

    Наконец, с точки зрения кодирования, это может быть не самый эффективный способ что-то делать. Вместо этого вы можете предварительно визуализировать все биты башни и все комбинации бит протектора и даже предварительно сдвинуть их во все необходимые места. (Давайте посмотрим, это будет пять комбинаций для первых четырех линий, представляющих турель (башню), и трижды пять для смещенных по битам комбинаций протектора, умноженных на восемь длинных целых чисел, всего 5×8 + 3x5x8 = 4x5x8 = 160 long ints = 640 байт. Фактический код на шаге 10 (см.ниже).

    Простейшая игра на Arduino с дисплеем 1602 — Часть #1

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

    ЧАСТЬ #1 основы

    Я заказал себе arduino, «так себе игрушка» подумал я, комплект маленький (для пробы) о чем в последствии пожалел. Хотелось раскрыть потенциал, но из-за отсутствия дополнительных модулей этого не выходило, пришлось экспериментировать, подрубал arduino к системе безопасности и смотрел как датчики делают свою работу, потом решил сделать звуковую сигнализацию (используя пративную пищалку из комплекта), так сказать отучивал собак громко или неожиданно лаять 🙂 и тут мои руки дошли до дисплея 1602. «Хм… это же настоящий дисплей» подумал я, но тут же разочаровался узнав что он сжирает почти половину всех контактов на самой arduino. Покопавшись я нашел странную плату в комплекте «i2C» и очень подозрительно было ТО! Что количество дырдочек совпало с количеством пимпочек на дисплее. «Хм, не с проста. » подумал я, и решил их спаять. Чуть позже я понял что сделал верную штуку и теперь мой дисплей съедает всего два канала. Начал изучать, что же это за дисплей и что он умеет. Изучив достаточное количество материала я узнал, что дисплей чисто текстовый, но о чудо! Он может обработать 8 новых символов, габаритами 5х8 пикселей. Ну что же, давайте начнем писать игру! Первое, это надо придумать что за игра будет, решил сделать подобие динозаврика гуугл хром, но с парочкой фишек так сказать, для начала я думаю сойдет 🙂 но ведь надо еще чем-то управлять, причем многокнопочным, долго думать не пришлось. Взял ИК пульт из комплекта.

    «Вот и джойстик» подозрительно пробормотал я себе под нос, думая о задержке от пульта, четкости работы ИК датчика да и вообще об адекватности данной идеи, но делать было нечего, я мог бы обучить arduino работать с клавиатурой для компа, но было действительно лень это делать. Так что приступил я записывать коды пульта, что бы в дальнейшем с ними работать. Код для микроконтролера тут простейший:

    Выглядит код сигнала пульта так: «FF18E7» у вас коды будут конечно другие, но суть вы должны понять, а когда будете делать к этому коду обращение, в начале дописываем «0х» и у нас получится (0хFF18E7).

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

    Если мы смотрим на датчик, мы видим три ножки, левая (аналоговый сигнал), средняя (масса), правая (плюс 5V).

    Так как я еще мало представлял как это будет вообще работать, я начал эксперименты. Сначала делал код скетча шаговый, через (delay(time)) сначала я не подозревал что это плохая идея 🙂
    В чем главный косяк. Данный микроконтроллер не умеет делать мультизадачность. Он считает код сверху вниз, проходя по всем веткам и функциям и после завершения, он начинает заново. И вот, когда у нас этих «delay» в коде становиться очень много, мы начинаем замечать явные задержки. Кстати да, зачем нам много «delay» вообще нужно. Когда мы делаем игру, у нас начинает расти количество проверок и взаимодействий. Например к нам движется враг а я хочу его перепрыгнуть, я нажимаю «прыжок» а по плану, я должен зависнуть в воздухе к примеру на 0.8f секунд в воздухе, вот и вся игра и зависает на эти 0.8f секунды. «Косяк» подумал я и начал думать над решением. Решение было найдено быстро. Сам микроконтроллер умеет достаточно быстро читать код от начала до конца, (если ему не мешать) и еще он умеет считать время с начала его включения. Вот это то нам и надо. Теперь мы всего лишь создаем переменные которые будут хранить время на то или иное действие и переменную которая сверяет разницу от того сколько сейчас время и во сколько надо активировать код. Arduino за секунду, берет 1000 миллисекунд, достаточно удобно. Вот фрагмент когда что бы стало понятнее:

    Не трудно, правда?

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

    Главный герой будет у нас выглядеть так:

    Процесс вписывания нового символа, я произвожу двоичным кодом (мне так удобно)
    выглядеть он будет так:

    01110
    01110
    00100
    01110
    10101
    00100
    01110
    01010

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

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

    00000
    01110
    01110
    00100
    11111
    00100
    01110
    01010

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

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

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

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

    Источники:

    http://www.drive2.ru/c/2516247/

    http://arduinoplus.ru/tekst-animatsiya/

    http://habr.com/post/424859/

    http://arduinoplus.ru/top-10-kvadrokopterov-do-50-3000-rub-2017/

    Ссылка на основную публикацию