Oled i2c не работает
Привет! Будучи любителем - энтузиастом электроники, я уверен, что всё что мы делаем – радиоэлектронные игрушки – самоделки, или большие проекты, все это от любопытства и лени. Любопытство стремится понять и постичь необъятное, не познанное, разобраться, как оно там работает, чего делает, как двигается. А лень изобретает, чтобы такого придумать, чтобы не вставать, не подходить, не поднимать, не запачкаться или еще чего ни будь важное.
Для тех, у кого тоже возникло подобное желание, - вот краткое руководство по подключению и проверке маленьких и не дорогих дисплеев OLED.
Далее речь пойдет об одной из широко доступных для радиолюбителей моделях OLED дисплеев, управляемых чипом SSD1306, с размером экрана 0,96-дюймов и разрешением 128*64 или 128*32 точки. Эти дисплеи идеально подходят для не больших радиолюбительских конструкций и самоделок.
Шаг 1: Основные понятия
- OLED это Organic Light-Emitting Diode, т.е., полупроводниковый прибор из органических соединений, который начинает излучать свет при прохождении через него электрического тока.
- ARDUINO - это платформа для обучения и построения систем автоматики и робототехники.
- ArduinoIDE - среда разработки. Это бесплатная программа для программирования Arduino.
- I2C – Inter-Integrated Circuits, межмикросхемная линия связи.
- Скетч, он же, код, он же программа - терминология Arduino.
Шаг 2: Комплектующие
- 1. Сам OLED дисплей 0,96” (можно купить на Aliexpress или Ebay, - долго, но дешево!).
- 2. Arduino UNO / Nano (там же где дисплей).
- 3. Соединительные провода (там же).
- 4. Компьютер или ноутбук с установленной ArduinoIDE.
Вообще покупка деталей для различных проектов на Aliexpress и Ebay очень прикольная штука, пока занимаешься одним проектом, детали к другому уже на подходе. Главное не забыть сделать заказ.
Шаг 3: Подключение дисплея
Управление дисплеем осуществляет чип SSD1306, который поддерживает пять протоколов связи и один из которых I2C. Данные по этому протоколу передаются всего по двум проводам, а чем меньше проводов в корпусе, тем лучше, так что нам он вполне подходит. Но! Встречаются модули с протоколом SPI и даже с переключением протоколов, так что будьте внимательны при покупке данного модуля.
Используемые выводы:
OLED дисплей - SCL/SCK (clock) и SDA (data), «Плюс» питания (VCC) и «Минус» питания (GND).
- Vcc - 5V
- GND - GND
- SDA - A4
- SCL - A5
Шаг 4: Сканер I2C
Каждое устройство на шине I2C имеет шестнадцатеричный адрес, поменять нельзя, он вшит намертво, каждый ответственный производитель должен где-то на корпусе или в инструкции указать его. Бывают модули с переключателями и перемычками, которыми можно изменить адрес, но… если устройства дешевые, до безобразия, то производитель может и не удосужиться заниматься такой мелочью, поэтому его придется определять самостоятельно.
Всего на шине может использоваться до 127 адресов - 119 для устройств и 8 адресов служебных. Общение ведется по этим адресам. Есть главный, он же Master, а есть ведомый, он же Slave, - Мастера запрашивают, ведомые отвечают, все просто.
Поскольку на нашем OLED-дисплей используется протокол связи I2C, а адрес может быть и не указан, мы сами попробуем узнать этот самый адрес.
Это можно сделать, загрузив коротенький скетч на свою плату Arduino с подключенным OLED. НО!
Не торопитесь сразу заливать скетч в Arduino! Давайте для начала загрузим «драйвера», т.е. подключим библиотеки, а для этого сразу перейдем к «Шагу №5», а затем вернемся и продолжим.
Шаг 4: Продолжение:
Шаг 5: Загрузка и подключение библиотек
- 1. В ArduinoIDE идем в меню Скетч / Sketch.
- 2. Выбираем «Включить библиотеки» / Include Libraries.
- 3.Выбираем «Управление библиотеками» / Managed Libraries.
- 4. Находим ADAFRUIT GFX и устанавливаем их.
- 5. Находим ADAFRUIT SSD1306 и устанавливаем их.
Шаг 6: Тестирование дисплея
Чтобы проверить, работает ли все так, как ожидалось, запустите пример для проверки из ArduinoIDE.
Для этого:
Перейти ФАЙЛ> ПРИМЕРЫ> SSD 1306> Выбрать 128x64 i2c
Если вы получите «Ошибку», попробуйте выбрать SSD 1306> 128x32 i2c.
Если снова «Ошибка» попробуйте изменит адрес I2C в строке 61, демонстрационного кода, и замените его адресом вашего дисплея, который вы определили на шаге №4.
Если снова ошибка, можно попробовать отредактировать файл Adafruit_SSD1306.h, он находится в папке с библиотеками Arduino.
Откройте файл Adafruit_SSD1306.h в текстовом редакторе и найдите строки:
Должно получиться так:
Если снова ошибка – необходимо проверить правильность соединений.
После окончания загрузки вы увидите тестовую анимацию на экране, это означает, что вы успешно настроили свой OLED дисплей.
Когда вы вдоволь насладитесь сей анимацией, можете переходить к следующему шагу.
Затем пишем протокол сброса:
В VOID SETUP указываем шестнадцатеричный адрес нашего дисплея 0x3C, который мы узнали на «Шаге №4».
Затем, инициализируем дисплей и очищаем его:
Выкладываю проект (см. ATmega48P + SSD1306.zip), сделан Atmel Studio 7 + схема Proteus 8.7
Для начала, почему он не хочет работать даже в Протеусе?
Подходящая ли протеуская модель?
Правильно ли подключены выводы в модели экрана, особенно к шине?
Если надо выложить дополнительно скрины пишите, выложу.
судя по фотке он по TWI работает. Какой еще ногодрыг?JLCPCB, всего $2 за прототип печатной платы! Цвет - любой!
Схема из Протеуса (на осциллографе самое начало передачи на экран ):
Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет
ну, разбирайся в этом ногодрыге сам. Я бы подключил его по TWI и не парился быПриглашаем 30 ноября всех желающих посетить вебинар о литиевых источниках тока Fanso (EVE). Вы узнаете об особенностях использования литиевых источников питания и о том, как на них влияют режим работы и условия эксплуатации. Мы расскажем, какие параметры важно учитывать при выборе литиевого ХИТ, рассмотрим «подводные камни», с которыми можно столкнуться при неправильном выборе, разберем, как правильно проводить тесты, чтобы убедиться в надежности конечного решения. Вы сможете задать вопросы представителям производителя, которые будут участвовать в вебинаре.
Мне показалось, что так будет проще.
А есть примеры подключения такого экрана по TWI на C/C++ в Atmel Studio?
Приглашаем всех желающих 25/11/2021 г. принять участие в вебинаре, посвященном антеннам Molex. Готовые к использованию антенны Molex являются компактными, высокопроизводительными и доступны в различных форм-факторах для всех стандартных антенных протоколов и частот. На вебинаре будет проведен обзор готовых решений и перспектив развития продуктовой линейки. Разработчики смогут получить рекомендации по выбору антенны, работе с документацией и поддержкой, заказу образцов.
А какая разница между ногодрыгом и TWI ? )) В код лезть всем лениво. )) Полезно знать как работать с устройством обоими способами, на случай если у вас много I2C устройств а шина одна,и они между собой начинают глючить или адреса одинаковые, тогда некоторые можно повесить на другие выводы микроконтроллера.
Заработало с адресом 0b01111000 но глючно см. скрин (Глючный кот.jpg)
Выкладываю подправленный проект с которого сделан скрин (ATmega48P + SSD1306 (2).zip)
Каждый раз полоски в другом месте, один раз кот нарисовался нормально, почему так?
Цифры не выводятся вообще, почему?
Снижение частоты ,например, до 8мГц и 4мГц глюки не убирает.
Откуда на линии стробирования SCL берётся такая неравномерность битов
(промежутки плавно сокращаются в каждом байте, см. осциллограф на скрине)
это нормально ?
В на плате OLED экрана стоит стабилизатор на 3,3v и линии SCL SDA подтянуты к 3,3v резисторами по 10к.
Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно.
Вам необходимо обновить браузер или попробовать использовать другой.
Vlad_os
Проблема заключается в том, что через некоторое время после загрузки новой прошивки в арду, на дисплее появляется какая-то полоска непонятно откуда взявшаяся. Как её убрать? Я чёт не вдупляюVlad_os
Пробовал, не помогает. Та же самая полоска и пустой экран.
Старик Похабыч
Надо вытащить дисплей и замерить сопротивление между SDA и + , а так же между SCL и +. Должно быть 4.7кОм + -
Vlad_os
Там и близко такого нет. Замерил, получилось около 2 мом
Старик Похабыч
Ну вот видимо нет подтяжки к +5 вольтам, а для Wite это надо. Попробуйте поставить 2 резистора на 4.7к от соотв. пинов к +5.
VICLER
Эта полоска у края экрана? Если да, то похоже, что выбран не правильный контроллер. Попробуйте выбрать SSD1306 вместо SH1106
Vlad_os
Эта полоска у края экрана? Если да, то похоже, что выбран не правильный контроллер. Попробуйте выбрать SSD1306 вместо SH1106
А, да точно. Вот я тупанул) Поменял мк, теперь её нет. Хотя резисторы тоже помогли эту полоску убрать. Но основная проблема была в неправильно выбранном мк. Спасибо!
О сайте
- Официальное сообщество YouTube-канала AlexGyver. Здесь обсуждаются проекты автора и остальных участников форума, а также рождаются новые крутые идеи. У нас можно получить ответы на вопросы по техническим темам в разделе помощи, найти себе исполнителя или заказчика на разработку электроники и совместно заказать плату для проекта. Приятного общения!
Новые темы
- Автор: Zari4
- Вчера в 23:15
- Ответы: 1
- Автор: scripto
- Вчера в 21:23
- Ответы: 0
Статистика форума
На данном сайте используются файлы cookie, чтобы персонализировать контент и сохранить Ваш вход в систему, если Вы зарегистрируетесь.
Продолжая использовать этот сайт, Вы соглашаетесь на использование наших файлов cookie.
Многие, наверное, знают о таких маленьких дешёвых (меньше $3) OLED дисплеях, которые можно найти в огромном ассортименте на ebay или aliexpress. В интернете существует множество различных статей о том, как подключать эти дисплеи к Arduino и другим МК, но для STM32f10x затруднительно найти даже библиотеку. Поэтому я решил написать эту статью.
Данный дисплей имеет разрешение 128х64 пиксела и контроллер SSD1306 и подклчается к микроконтроллеру по интерфейсу I2C.
Для STM32 была найдена библиотека для этого дисплея, но она была для серии f4xx — необходимо было модифицировать для f10x.
Исходные файлы модифицированной мной библиотеки можно взять тут.
ssd1306_i2c.c ssd1306_i2c.h | Интерфейс для работы с I2C |
ssd1306.c ssd1306.h | Библиотека для работы с дисплеем. Представляет методы для рисования на дисплее, вывода текста, и вывода всего на oled. |
fonts.c fonts.h | Шрифты для вывода текста на экран. Там есть три шрифта, но можно создать любой свой при помощи этой программы или аналогов |
Vcc | +3.3V. Допустимое напряжение — от 3.3В до 5В |
GND | GND |
SCL | PB6 |
SDA | PB7 |
Для работы с библиотекой нужно подключить заголовочный файл:
И перед использованием инициализировать:
Теперь можно что-нибудь нарисовать:
Всё, что мы нарисовали сейчас находится в буффере в оперативной памяти МК, чтобы вывести всё на дисплей необходимо вызвать:
После этого наш дисплей обновится и будет выводить надпись и кружок. После вызова SSD1306_UpdateScreen() буффер в МК не сбрасывается сам, поэтому новые рисунки будут поверх предыдущих, для сброса можно заполнить всё чёрным цветом:
Все функции библиотеки:
Доступные шрифты, но вы так же можете добавить свои, в том числе и русские:
- Font_7x10
- Font_11x18
- Font_16x26
Использовал CooCox IDE. Готовый проект можно скачать тут: Яндекс.Диск.
P.S. с момента написания статьи и до её публикации из песочницы прошло довольно много времени(6 месяцев), за которое я успел несколько раз изменить библиотеку.
Более новую версию библиотеки с поддержкой DMA и тестовый проект для Keil и cubeMx можно взять здесь. Самую последнюю версию библиотеки вы найдёте тут.
Читайте также: