Последнее обновление:
August 9, 2018

Есть мысль... Жми, напиши!
Что имеем: Постов : 178 Авторов: 1 Категорий: 38

Конвертер картинок для Arduino LCD OLED 128×64 I2C дисплея

Пришёл вот такой дисплейчик:

Но вот нигде не нашёл для него генератора, что бы модно было конвертировать jpg/png/bmp картинку в код. 
Неспешно накалякал, выбираете любой jpg/bmp файл и получаете на выходе код:

Тестовый скетч:

#include <OLED_I2C.h>  

OLED  myOLED(A4, A5, A4); 

extern uint8_t SmallFont[];

//--PASTE GENERATED CODE HERE

void setup()
{
    myOLED.begin();
    myOLED.setFont(SmallFont);    
}

void loop() 
{
    myOLED.clrScr(); 
    myOLED.drawBitmap(0, 0, icon1, 21, 21); //-- X, Y, IMG, Width, Height 
    myOLED.update();
    delay(150);
}

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

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

Библиотека OLED_I2C.

 

Views :

1229

Arduino прошивка загрузчика (bootloader) на новый чип Atmega 328P-PU / 168 через Bit-Bang на самой плате Arduino в Ubuntu 14 c помощью avrdude версии 6.1

Доигрался я со своей Ардуинкой, и сжёг несколько пинов у чипа =))

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

Благо на Ардуинке присутствует микросхема от ftdi (ft232rl) благодаря которой Ардуинку можно подключать через usb, а в системе появляется виртуальный com-порт,

но у неё есть ещё один режим работы так называемый Bit-Bang т.е. можно напрямую дёргать её ножки. Этим мы и воспользуемся.

Чип Atmega 328 а так же 168 и большинство других прошиваются через протокол SPI, на самой ардуинке присутствует разъём для этого под названием SPI или ICSP

так же выведен разьём микросхемы ft232rl (под названием x3 или как то так с четырьмя ножками)

Всё, что нам нужно для заливки прошивки, это их соединить по схеме:

 

Prog_Bit-Bang_scheme

 

Если чип прошивается на самой плате, то подключать питающую линию не нужно.  (да, можно прошивать чип ардуинки  с другой ардуинки)

Выглядит примерно так:

Prog_Bit-Bang

 

Фото честно спёрты с robocraft.ru =)

Вот впринципе и всё =)

Дальше устанавливаем avrdude командой:

sudo apt-get install avrdude

Потом открываем консольку и переходим в каталог установленной Arduino IDE:

cd /opt/Arduino/hardware/arduino/avr/bootloaders/atmega

Узнаем как там чип:

sudo avrdude -c arduino-ft232r -p m328p -P ft0 -U hfuse:r:-:h -B 4800

Если вывод показывает что всё прошло успешно, то заливаем прошивку:

sudo avrdude -q -C /etc/avrdude.conf -p m328p -c arduino-ft232r -P ft0 -B 4800 -e -U flash:w:ATmegaBOOT_168_atmega328.hex

Ну и на последок прошиваем фьюзы:

sudo avrdude -C /etc/avrdude.conf -p m328p -c arduino-ft232r -B 4800 -u -U lock:w:0x3f:m -U efuse:w:0x05:m -U hfuse:w:0xDA:m -U lfuse:w:0xFF:m

Вот и всё =) Отсоединяем провода, перетыкаем usb и можно залить простенький скетч.

За что какие параметры отвечают можно прочитать вызвав «avrdude -?»

Для чипа Atmega168 прошивка будет ATmegaBOOT_168_diecimila.hex
фьюзы:-Uefuse:w:0x00:m -Uhfuse:w:0xdd:m -Ulfuse:w:0xff:m -Ulock:w:0x0F:m
чип: m168

Для Atmega8 прошивка будет в папке atmega8 файл ATmegaBOOT.hex
фьюзы: -Ulfuse:w:0xdf:m -Uhfuse:w:0xCA:m
чип: m8
В Arduino IDE выбираете плату Arduino NG or older и чип Atmega8

 

Views :

1972

Arduino использование 7 или 8 сегментных 4х разрядных индикаторов.

Восьмисегментный индикатор GNQ-5641AS-21

Восьмисегментный индикатор GNQ-5641AS-21

ОБНОВЛЕНО 26.07.2015.  Исправил известные баги. Выложил на Гитхаб.

Понадобилось тут на индикатор GNQ-5641AS и выводить значения.

У него 4 разряда по 8 сегментов (7 — цифра и 1 — точка)
Для того что бы отобразить на нём значение необходимо на катод нужного разряда подать «-» а на необходимые сегменты «+» что бы получилась цифра.
Так как каждый сегмент разряда завязан на одну линию (посмотрите в даташите, станет понятнее), то что бы вывести разные числа в разные разряды,
необходимо зажигать разряды по очереди с соответствующими сегментами.
Т.е. сначала подали «-» на катод первого разряда и выставили нужные сегменты (при этом сегменты остальных разрядов гореть не будут, т.к. у их катодов в это время должен быть «+»)
потом аналогично второго и т.д. Для иллюстрации процесса в примере delay(5); замените на delay(500);
При быстрой смене моргание не заметно, поэтому и получается число целиком.

После поиска готовых библиотек приуныл.
Все готовые либы использовали тормознутый digitalWrite да ещё и в циклах, кроме того слишком было намудрено с выводом плавающей точки.

Представляю свой вариант библиотеки для работы с таким индикатором и ему подобными.
Выводит только целочисленные значения со знаком.
Для отображения плавающей точки необходимо явно задать её положение.
Нет жёстких ограничений на кол-во разрядов, сегментов и символов.
Кастомные символы (например букву C можно прописать в массиве масок символов digits)
Вся работа по выводу идёт напрямую через порты и битовые маски.
Под себя либу можете подкорректировать, я же стараюсь на слабых чипах не прибегать к плавающей точке, вся арифметика — целочисленная.

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

Комменты в коде , надеюсь не переборщил и не слишком тупо 😉
Установка проста — папку из архива разархивировать в папку libraries к папке установки Arduino IDE (Для Ubuntu /usr/share/arduino/libraries Для Винды уже не помню)

СКАЧАТЬ

В Arduino IDE в менюшке примеров появится SegmentsIndicator там этот же пример использования:

#include <SegmentsIndicator.h>

/*
* Первым параметром - количество разрядов + количество сегментов. 
* Если используется стандартный индикатор, то должно стоять 12
* Дальше через запятую пины разрядов в порядке 4, 3, 2, 1
* и пины сегментов  A, B, C, D, E, F, G, DP
* кстати, A3,A5,A2 - значит аналоговое пины
*/
SegmentsIndicator segmentsIndicator(12,   13, 12 , 11, 10, 1, A5, A3, 3, 2, A2, A4, 4);

void setup() 
{
  segmentsIndicator.displayVal(-22, 1); //-- Подготавливаем значение первый параметр - значение, второй - положение точки
}

void loop() 
{
  segmentsIndicator.displayRefresh(); //-- Отображаем значение на индикаторе.
  delay(5); //-- Дадим время разгорется сегментам индикатора
}

У меня этот индикатор с общим катодом, для индикаторов с общим анодом потребуется в либе инвертировать маски символов (digits) а так же поменять значения c HIGH на LOW при конфигурации пинов,
а так же убрать инвертирование разрядов. В общем, читайте комменты в коде, там написано =)

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

Подходит для чипов ATmega168 и ATmega328, для остальных необходимо будем изменить порты и правильно указать диапазоны (в коде в комментах есть пояснение).

В общем как-то так =)  Надеюсь кому-нибудь пригодится =)

Views :

8903