Электронный компонент:Rainbowduino с чипом ATmega328

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Rainbowduino с чипом ATmega328[1]


Плата Rainbowduino с чипом ATmega328 – это плата-контроллер, которая совместима с Arduino и оснащена компонентами для управления светодиодами. Она способна управлять матрицей светодиодов 8х8 (в режиме общего анода).

Функционал

  • Не требуются внешние устройства
  • 24 канала с постоянной силой тока (120 мА)
  • 8 каналов токоподающего драйвера (500 мА)
  • Диапазон выходного напряжения – от 6.5 до 12 вольт (постоянный ток)
  • Наличие GPIO-контактов и АЦП
  • Аппаратные UART и I2C
  • Возможность каскадного подключения
  • Легкий вес и маленький форм-фактор

Купить Rainbowduinoс чипом ATmega328 можно тут.

Автономный режим

Необходимое оборудование:

Это самый простой режим, который не требует подключения внешних устройств (за исключением TTL-адаптера для загрузки прошивки). Содержимое матрицы RGB-светодиодов будет генерироваться самой Rainbowduino.

Варианты использования:

  • Проигрывание простых анимаций в реальном времени, рассчитываемых Rainbowduino
  • Проигрывание заранее сохраненных анимаций (ограничено 32 Кб памяти ROM на Rainbowduino)

Режим UART

Необходимое оборудование:

В этом режиме компьютер отправляет данные (для матрицы светодиодов) на Rainbowduino. Поскольку у Rainbowduino нет USB-коннектора, но есть TTL-коннектор, вам также понадобится конвертер для преобразования UART в TTL (BusPirate, UartSBee, Arduino...).

Варианты использования:

Режим I2C

Необходимое оборудование:

В этом режиме ПК передает данные (для матрицы светодиодов) на несколько Rainbowduino. Стоить уточнить, что если вы используете Arduino с FTDI-адаптером, конвертирующим USB в Serial (Duemilanove, Diecimila и т.д.), то данные будут передаваться с задержкой примерно 16 мс. Если вы используете более новую Arduino Uno, то задержка будет меньше – примерно 4 мс.

Варианты использования:

Каскадное подключение через I2C

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

Во-первых, приготовьте Rainbowduino:

Во-вторых, подсоедините к ней вторую Rainbowduino, которая уже подключена к питанию:

Характеристики

  • МикропроцессорATmega328
  • Размер платы: 60 мм х 60 мм х 1,6 мм
  • Индикаторы – сброс, питание, 13-ый контакт
  • Питание – от 6.5 до 12 вольт (постоянный ток); рекомендуется 9 вольт (постоянный ток)
  • Коннекторы для питания – 2-контакные винтовые зажимы JST, 3,-миллиметровые DC-разъемы
  • Коннекторы для питания при каскадном подключении – винтовые зажимы
  • Программные интерфейсыUART и ISP
  • Сокеты для светодиодной матрицы – 32 шт.
  • Расширительные сокеты – два 2,54-миллиметровых согнутых гребешка (8-контактный и 3-контактный)
  • Протоколы коммуникацииI2C и UART
  • RHOS – да
  • Входящее напряжение – между 6.5 и 12 вольтами
  • Общее энергопотребление – между 600 и 2000 мА
  • Каналы с постоянной силой тока (катод) – 24 шт.
  • Сила тока на каждом канале с постоянной силой тока – между 20 и 120 мА
  • Сила тока на каналах токоподающего драйвера – 500 мА
  • Напряжение на каналах токоподающего драйвера – между 9 и 12 вольтами
  • Каналы токоподающего драйвера – 8 шт.
  • Максимальное количество светодиодов, которыми можно управлять – 192 шт.
  • Время отклика цепи – 10 нс
  • Цветовое разрешение на каждом RGB-светодиоде – 4096
  • Скорость передачи данных на UART – 115200 бод

Совместимость светодиодных матриц

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

Rainbowduino обладает двумя важными преимуществами. Во-первых, максимальное количество светодиодов, которыми она может управлять, составляет 192. Во-вторых, постоянная сила тока на ее каналах может достигать 120 мА. Благодаря этому плата способна управлять не только одной матрицей, но и более массивными системами светодиодов.

Сила выходного тока на каждом канале (Iвых) задается внешним резистором (Rвн). Отношение между Iвых и Rвн показано на схеме ниже. Более подробно смотрите в даташите MBI5168. Чтобы уменьшить силу выходного тока (по умолчанию нижняя граница составляет 20 мА), потенциометр (1 кОм) нужно крутить по часовой стрелке, а чтобы увеличить – против часовой. Обратите внимание, что диапазон поворота потенциометра составляет только один круг, поэтому использовать его нужно с осторожностью. Если приложить к регулировке чрезмерное усилие, потенциометр может сломаться, после чего он начнет прокручиваться без ограничений. В результате настройку силы выходного тока можно будет выполнить только с помощью мультиметра :)

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

Демонстрационный проект

Необходимое оборудование:

Подготовительные работы

Подключите матрицу RGB-светодиодов к Rainbowduino. «Контакт 1» должен быть подключен к красному блоку.

Примечание: Контакт 1 имеет квадратную точку пайки, а у других контактов она круглая.

Загрузка прошивки

Загрузить прошивку на Rainbowduino можно разными способами – при помощи Arduino, модуля UartSBee и программы BusPirate.

Загрузка прошивки с помощью Arduino

Чтобы использовать Arduino в качестве программатора (т.е. устройства для загрузки прошивки на Rainbowduino), нужно «очистить» Arduino. Для этого на Arduino нужно загрузить пустой скетч, который показан ниже:

void setup() {}

void loop() {}

Теперь откройте в IDE Arduino скетч, который хотите загрузить на Rainbowduino, а затем кликните в IDE Arduino на Инструменты > Плата > Arduino Duemilanove or Nano w/ ATmega328 (Tools > Board > Arduino Duemilanove or Nano w/ ATmega328). Далее загрузите прошивку на Rainbowduino.

Ниже показана схема подключения Rainbowduino, Arduino и источника питания (батареи):

В данном случае используется внешний источник питания, но вы можете воспользоваться и контактом 5V на Arduino.

Примечание: Если вы используете Rainbowduino V1, то в IDE Arduino в меню Инструменты > Плата (Tools > Board) нужно выбрать плату «Arduino Diecimila, Duemilanove, or Nano w/ ATmega168».

Arduino Rainbowduino
RESET DTR
GND GND
RX RX
TX TX

Загрузка прошивки с помощью UartSBee

Фотографии ниже показывают, как выполнить подключение Rainbowduino и UartSBee:


При подключении модуля UartSBee к шине USB он должен зарегистрировать новый последовательный порт. Теперь просто загрузите через него свою прошивку.

Загрузка прошивки/загрузчика с помощью BusPirate

В этом разделе будет рассказано о трех методах программирования при помощи BusPirate:

  • Через ISP
  • При помощи avrdude и ручного сброса (без патча)
  • При помощи avrdude (с маленьким патчем)

Внимание! Чтобы продолжить, отключите Rainbowduino от матрицы и питания.

Шаг 1.

Для использования BusPirate понадобится новая версия avrdude. Я использую версию 5.10, которая распознает программную версию «-c buspirate». Это можно проверить при помощи:

./avrdude -c buspirate -C ./avrdude.conf

Если эта команда пожалуется на программатор, тогда вам нужна более новая версия BusPirate.

Шаг 2.

Подключите BusPirate к ISP-коннектору Rainbowduino. Схему подключения смотрите в таблице ниже:

BusPirate ISP Номер контакта на ISP
GND GND 6
+5V Vcc 2
CS RESET 5
MOSI MOSI 4
MISO MISO 1
SCL/CLK SCK 3
Шаг 3.

Найдите подходящий загрузчик (я использую маленькую прошивку optiboot). Скопируйте этот файл в только что скомпилированную директорию «avrdude».

Шаг 4.

Загрузите прошивку на ATmega328P при помощи:

./avrdude -v -c buspirate -p m328p -C ./avrdude.conf -P /dev/ttyUSB0 -U flash:w:optiboot_atmega328.hex

Это займет очень много времени...

Я начал с того, что загрузил прошивку, вообще не используя загрузчик. Все прошло успешно – трюк в том, чтобы использовать HEX-файлы из IDE Arduino. В версии 0.22 для Linux они расположены не в папке скетчей, а в «/tmp/buildXXXXXXXXXXXX». Программатор подключать не нужно. Чтобы загрузить прошивку просто нажмите на кнопку «Загрузка». Если хотите, чтобы IDE Arduino показывала диагностическую информацию, нажимая на кнопку «Загрузка», также нажмите на клавишу  ⇧ Shift .

Далее я попробовал загрузить прошивку при помощи загрузчика. Для этого нужно воспользоваться «прозрачным» последовательным интерфейсом BusPirate (термин «прозрачный» означает, что при переходе через интерфейс данные не модифицируются и не дополняются, а передаются как есть). Задайте скорость передачи данных на 115200 бод, а затем введите макрос «(3)», чтобы активировать «прозрачный» режим. После этого BusPirate начнет вести себя как конвертер USB-Serial (впрочем, вместо BusPirate можно использовать любой другой FTDI-чип, умеющий конвертировать USB в Serial). Проблема с BusPirate в том, что у этого устройства нет линии DTR для того, чтобы выполнить сброс Arduino. Вам придется самостоятельно выверять время для сброса, а затем делать его вручную. Лучше всего нажать на кнопку сброса сразу после начала загрузки.

HiZ>m
1. HiZ
2. 1-WIRE
3. UART
4. I2C
5. SPI
6. JTAG
7. RAW2WIRE
8. RAW3WIRE
9. PC KEYBOARD
10. LCD
(1) >3
Mode selected
Set serial port speed: (bps)
1. 300
2. 1200
3. 2400
4. 4800
5. 9600
6. 19200
7. 38400
8. 57600
9. 115200
10. 31250 (MIDI)
(1) >9
Data bits and parity:
1. 8, NONE *default
2. 8, EVEN
3. 8, ODD
4. 9, NONE
(1) >
Stop bits:
1. 1 *default
2. 2
(1) >
Receive polarity:
1. Idle 1 *default
2. Idle 0
(1) >
Select output type:
1. Open drain (H=Hi-Z, L=GND)
2. Normal (H=3.3V, L=GND)
(1) >2
READY
UART>(3)
UART bridge. Space continues, anything else exits.
Reset to exit.

После этого Arduino можно программировать при помощи загрузчика:

./avrdude -v -c stk500v1 -p m328p -b 115200 -F -C ./avrdude.conf -P /dev/ttyUSB0 -U flash:w:Rainbow_Plasma.cpp.hex

Еще более продвинутый метод – пропатчить avrdude в файле «arduino.c». По умолчанию BusPirate отправляет сигнал «rts» с неправильной полярностью, но это можно исправить, поменяв «1» на «0», а «0» на «1».

После этого для программирования нужно будет использовать «arduino», а не «stk500v1».

static int arduino_open(PROGRAMMER * pgm, char * port)
{
    fprintf(stderr, "arduino_open...\n");
    strcpy(pgm->port, port);
    serial_open(port, pgm->baudrate? pgm->baudrate: 115200, &pgm->fd);

  /*  «очищаем» линии DTR и RTS (т.е. выставляем их на LOW),
   *  чтобы разгрузить конденсатор RESET (например, в Arduino)
   */
    serial_set_dtr_rts(&pgm->fd, 1);
    usleep(50*1000);
  /*  снова выставляем DTR и RTS на HIGH  */
    serial_set_dtr_rts(&pgm->fd, 0);
    usleep(50*1000);

  /*  «откачиваем» все входные внешние данные  */
    stk500_drain(pgm, 0);

    if (stk500_getsync(pgm) < 0)
    return -1;

    return 0;
}

Примечание: Чтобы изменить тип программатора, который использует IDE Arduino, отредактируйте файл «boards.txt».

Источники:

Прошивка Neorainbowduino

Загрузка прошивки на Rainbowduino осуществляется при помощи Neorainbowduino – это многосоставная прошивка, которая состоит из прошивки для Arduino, прошивки для Rainbowduino, а также библиотеки «neorainbowduino». В результате, используя программу на языке Processing, вы сможете отправлять данные на Arduino через последовательный интерфейс, а Arduino, в свою очередь, будет отправлять эти данные на Rainbowduino.

Более подробно о Neorainbowduino можно почитать тут.

Функционал

  • Поддержка I2C (т.е. возможность работать с несколькими Arduino)
  • Библиотека «neorainbowduino» (чтобы можно было управлять Rainbowduino через Processing)
  • Отправка полных кадров из Processing на Arduino
  • Отправка кадров из Processing на RGB-матрицу. Размер каждого кадра – 8х8, а разрешение – 12 бит (4096 цветов). Преобразование цветов управляется библиотекой
  • Библиотека «neorainbowduino» оптимизирована таким образом, что на Rainbowduino, если потребуется, можно будет отправлять только кадры (это позволяет сэкономить 50% трафика, но это, разумеется, зависит от «веса» кадров)
  • Исправлена проблема с двойной буферизацией (устраняет мерцание)
  • Добавлен сканер шины I2C (позволяет найти Rainbowduino, если вы забыли ее адрес)

Поскольку эта прошивка позволяет использовать Processing для управления Rainbowduino, очевидно, что вам понадобится скачать Processing. Сделать это можно по ссылке на этой странице.

Если вам не нравится Processing (JAVA), то у вас есть и другой вариант. Здесь описывается использование autoitscript для отправки данных на Arduino.

Установка патча для IDE Arduino

Поскольку прошивка neorainbowduino отправляет через шину I2C полные кадры (92 байта), нам нужно пропатчить размер I2C-буфера для Arduino (чтобы оптимизировать скорость передачи данных). Надеюсь, в ближайшем будущем в Arduino добавят поддержку буферов разного размера. Перед установкой патча убедитесь, что IDE Arduino закрыта.

Файл, который нужно пропатчить – «Java/libraries/Wire/utility/twi.h»

Цель – увеличить скорость шины I2C со 100 до 400 кГц; увеличить размер буфера с 32 до 98 байт

Как файл выглядит до патча:

#ifndef TWI_FREQ
#define TWI_FREQ 100000L
#endif

#ifndef TWI_BUFFER_LENGTH
#define TWI_BUFFER_LENGTH 32
#endif

Как файл должен выглядеть после патча:

#ifndef TWI_FREQ
#define TWI_FREQ **400000L**
#endif

#ifndef TWI_BUFFER_LENGTH
#define TWI_BUFFER_LENGTH **98**
#endif

Файл, который нужно пропатчить – «Java/libraries/Wire/Wire.h»

Задача – увеличить размер последовательного буфера с 32 до 98 байтов

Строчка до патча:

#define BUFFER_LENGTH 32

Строчка после патча:

#define BUFFER_LENGTH **98**

Загрузка прошивки на Rainbowduino

Файл прошивки, которую нужно загрузить – это «rainbowduinoFw/Rainbow_V2_71/Rainbow_V2_71.pde» (см. главу «Загрузка прошивки» выше).

Примечание: Прошивка коммуницирует при помощи протокола I2C, поэтому каждой Rainbowduino потребуется уникальный I2C-адрес. Этот адрес можно присвоить, отредактировав файл «Rainbowduino.h» (#define I2C_DEVICE_ADDRESS 0x06). Поэтому, если вы планируете загрузить эту прошивку на несколько Rainbowduino, не забудьте поменять этот адрес.

Загрузка прошивки на Arduino

Отключите линии RX/TX между Rainbowduino и Arduino. Загрузите на Arduino прошивку «arduinoFw/neoLed/neoLed.pde».

Взаимодействие с Rainbowduino

Во-первых, вам понадобится Arduino (она будет работать в качестве шлюза Serial-I2C) и Rainbowduino с I2C-адресом «0x06».

Rainbowduino и Arduino должны быть подключены друг к другу следующим образом:

На этой схеме используется внешний источник питания, но вы можете также воспользоваться контактом 5V на Arduino. Информацию о подключаемых контактах смотрите в таблице ниже:

Arduino Rainbowduino
RESET DTR
GND GND
Входной аналоговый контакт 4 SDA
Входной аналоговый контакт 5 SCL

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

После установки Processing вам также нужно установить библиотеку «neorainbowduino». Ее можно найти в папке «processingLib\src\distribution\neorainbowduino-x.y\download». Распакуйте ZIP-файл в домашнюю папку Processing (более подробные инструкции смотрите в файле «Readme.txt»).

Открыв Processing, импортируйте библиотеку «neorainbowduino»:

Демо-скетч

Ниже простой пример Processing-скетча, отправляющий на Rainbowduino прямоугольники случайного размера:

import processing.serial.*;
import com.neophob.lib.rainbowduino.test.*;
import com.neophob.lib.rainbowduino.*;

static final int SIZE = 400;
Rainbowduino r;

void setup() {
    frameRate(15);
    background(0);
    size(SIZE, SIZE);

    //  инициализируем Rainbowduino:
    List<Integer> list = new ArrayList<Integer>();
    list.add(6);  //  используем Rainbowduino с идентификатором «6»
    try {
        r = new Rainbowduino(this, list);
        System.out.println("ping: "+r.ping());
    } catch (Exception e) {
        println("FAILED to open serial port!!");  
            //  "Не удалось открыть последовательный порт!!"
        e.printStackTrace();
    }

    smooth();
    noStroke();
}

void draw() {
    //  «рисуем» простые фигуры:
    color c1 = color(128+(int)random(64), 128, (int)random(255));
    fill(c1);

    int size = 80+(int)random(80);
    int x = (int)random(SIZE);
    int y = (int)random(SIZE);
    rect(x, y, size, size);<br>
    //  отправляем PApplet в библиотеку «neorainbowduino», 
    //  а также ведущему устройству с идентификатором «6»:
    r.sendRgbFrame((byte)6, this);
}

Как работает изменение размера изображения

Размер изображения изменяется при помощи выравнивающего фильтра. Поэтому важно знать, что изображение должно быть правильно выровнено. Другими словами, результат будет выглядеть хорошо, если изображение можно будет поделить на «8».

Хорошее выравнивание:


Плохое выравнивание:


Прошивка mtXcontrol

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

Прошивка Rainbowduino

Это еще одна прошивка для управления Rainbowduino. Скачать ее можно отсюда. Она обладает следующим функционалом:

  • Двойная буферизация синхронизирована с частотой обновления
  • Четыре вспомогательных буфера
  • Использование высокоуровневых инструкций
  • Возможность управлять несколькими устройствами
  • Коммуникация через протокол I2C
  • Постоянное сохранение данных в EEPROM

RainbowduinoDashboard

Это сторонняя прошивка для Rainbowduino. Скачать ее можно отсюда. Она обладает следующим функционалом:

  • Понятная кодовая база, которую легко сопровождать (т.е. улучшать, оптимизировать, устранять дефекты и т.д.)
  • Совместимость со стандартной прошивкой
  • Поддержка режима UART (хост в виде Arduino не нужен – коммунницировать с Rainbowduino можно напрямую)
  • Графические операции, использующие двойную буферизацию
  • Программные часы реального времени
  • Анимация управляется самой Rainbowduino
  • Полный набор Windows-символов ANSI (CP1252)
  • Использование команд высокого уровня

Эту прошивку можно изменить таким образом, чтобы она начала использовать шину I2C. Для этого нужно отредактировать всего один файл – «RainbowDash.pde».

Как работает прошивка

Схема микропроцессора ATmega 168/ATmega 328:

PORTD PORTB PORTC
Контакт 02 / PD0 / RXD Контакт 14 / PB0 / INT0 Контакт 23 / PC0 / SDI
Контакт 03 / PD1 / TXD Контакт 15 / PB1 / INT1 Контакт 24 / PC1 / CLK
Контакт 04 / PD2 / INT0 Контакт 16 / PB2 / INT2 Контакт 25 / PC2 / LE
Контакт 05 / PD3 / INT19 Контакт 17 / PB3 / INT3 Контакт 26 / PC3 / OE
Контакт 06 / PD4 / INT20 Контакт 18 / PB4 / INT4 Контакт 27 / PC4 / SDA
Контакт 11 / PD5 / INT21 Контакт 19 / PB5 / INT5/SCK Контакт 28 / PC5 / SDL
Контакт 12 / PD6 / INT22
Контакт 13 / PD7 / INT23
  • PORTB. Эти биты привязаны к цифровым контактам 8-13 на Arduino. Два старших бита привязаны к контактам чипа, поэтому использовать их нельзя.
  • PORTC. Эти биты привязаны к аналоговым контактам 0-5 на Arduino. Контакты 6 и 7 доступны только на Arduino Mini.
  • PORTD. Эти биты привязаны к цифровым контактам 0-7 на Arduino.

Драйвер с постоянной силой тока

Этот драйвер использует 8-битный сдвиговый регистр MBI5168. Он конвертирует последовательные данные в параллельные данные. Все три MBI5168 имеют общие контакты LE, CLK и OE.

Название порта Описание
OE Порт с активным LOW. Открывает выходные драйверы для отбора тока. Если на OE подано LOW, это открывает выходные каналы, а если HIGH – закрывает (запирает).
LE Входной порт для строб-импульса (т.е. для тактового сигнала). Если на LE подано HIGH, последовательные данные передаются соответствующему регистру-защелке, а если LOW – данные «защелкиваются».
SDI Для ввода последовательных данных в сдвиговый регистр
SDO Для вывода последовательных данных на порт SDI следующего сдвигового регистра.
R-EXT Входной порт, который используется для подключения внешнего резистора, чтобы настроить силу выходного тока для всех выходных каналов.
CLK Входной порт для тактового сигнала. Сдвигает данные при переходе импульса в значение HIGH.

Токоподающий драйвер

Сдвиг данных

Чтобы показать на светодиодной матрице полный кадр, на Rainbowduino нужно 128 раз вызвать функцию прерывания. Rainbowduino приходится иметь дело с 8 рядами светодиодов и 16 уровнями яркости. Чтобы нарисовать кадр, используется функция displayNextLine(), которая придает светодиодами сначала 1-ый уровень яркости, потом 2-ой и т.д., делая это со всеми 8 рядами светодиодной матрицы. Если умножить 8 на 16, получается как раз 128 циклов (т.е. 128 прерываний), которые нужны для того, чтобы «нарисовать» на матрице полный кадр.

Ниже показана светодиодная матрица после 32, 64, 96 и 128 циклов. Как видите, что с увеличением циклов увеличивается и яркость светодиодов:

Поддержка более 4096 цветов (12 бит)

Фабричная прошивка (и большинство сторонних прошивок) поддерживает 12-битное цветовое разрешение, но его можно увеличить:

Цветовое разрешение Передаваемые данные Уровни яркости
12 бит (4 бита на цвет), 4096 цветов 96 байт (12 х 64 = 768 бит) 16
15 бит (5 бит на цвет), 32768 цветов 120 байт (15 х 64 = 960 бит) 32

Использование 4 бит на цвет очень удобно для хранения данных – вы можете «упаковать» в байт два таких значения, что упрощает считывание цветовых данных из буфера. Использование 5 бит на цвет требует больше вычислительных ресурсов или более объемного буфера (для хранения 3 цветовых значений понадобится 2 байта, и в результате 1 бит остается незадействованным).

Чтобы добиться 15-битного разрешения, в прошивку нужно внести два изменения:

  • Увеличить количество прерываний (потому что вместо 16 теперь 32 уровней яркости)
  • Изменить сдвиговую функцию

Полезные ссылки

См.также

Внешние ссылки