Светодиодная матрица на расширителе портов MCP23017

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
forfrends
Вымогатель припоя
Сообщения: 546
Зарегистрирован: Вс дек 30, 2012 00:32:06
Откуда: Николаев / Украина
Контактная информация:

Светодиодная матрица на расширителе портов MCP23017

Сообщение forfrends »

Всем привет!
Решил я сделать светодиодную матрицу на MCP23017 и Arduino Pro Mini. Схема:
Изображение
Код (тестовый, написанный в Ардуино ИДЕ):
Спойлер

Код: Выделить всё

#include <Wire.h>
#include "Adafruit_MCP23017.h"

Adafruit_MCP23017 mcp;

int i = 0;
byte A = 0;
byte B = 0;
uint16_t Data;

const byte bitmap[] PROGMEM = {
    0x00,0x0E,0x06,0x0A,0x10,0x20,0x00,0x00                                        

};


void setup() {
    mcp.begin();      // use default address 0

    mcp.pinMode(0, OUTPUT);
    mcp.pinMode(1, OUTPUT);
    mcp.pinMode(2, OUTPUT);
    mcp.pinMode(3, OUTPUT);
    mcp.pinMode(4, OUTPUT);
    mcp.pinMode(5, OUTPUT);
    mcp.pinMode(6, OUTPUT);
    mcp.pinMode(7, OUTPUT);
    mcp.pinMode(8, OUTPUT);
    mcp.pinMode(9, OUTPUT);
    mcp.pinMode(10, OUTPUT);
    mcp.pinMode(11, OUTPUT);
    mcp.pinMode(12, OUTPUT);
    mcp.pinMode(13, OUTPUT);
    mcp.pinMode(14, OUTPUT);
    mcp.pinMode(15, OUTPUT);
}

void loop() {

    A = 1 << i;
    A=~A;
    B = pgm_read_byte(&bitmap[i]);

    Data = A << 8 | B;

    mcp.writeGPIOAB(Data);
    
    i++;
    if (i>7) i = 0;
    delay(1);
}
Что должно получиться:
Изображение
А что получилось:
Изображение Изображение Изображение
"Изображение" как-бы наплывает на пиксели, находящиеся справа. То есть в любом месте можно зажечь светодиод и справа от него так же будет светится еще один светодиод только на много тусклее. И чем выше частота обновления, тем выше яркость этих "двойников". Может кто знает с чем это может быть связано?

P.S. Может есть готовая библиотека для светодиодных матриц на MCP23017?

Добавлено after 18 minutes 50 seconds:
Я сделал предположение что обновление портов A и B MCP23017 делает не одновременно, а с небольшой задержкой. По этому решил сделать некоторое "обнуление" портов:

void loop() {
A = 1 << i;
A=~A;
B = pgm_read_byte(&bitmap);
Data = A << 8 | B;

mcp.writeGPIOAB(0b1111111100000000);
mcp.writeGPIOAB(Data);

i++;
if (i>7) i = 0;
delay(1);
}

Лишние светодиоды перестали гореть, но частота обновления понизилась и яркость упала. Может есть какое-то другое решение данной проблемы?
Сделать своими руками всегда интересней чем просто купить и пользоваться
Реклама
Аватара пользователя
korob
Друг Кота
Сообщения: 6643
Зарегистрирован: Чт авг 09, 2012 01:09:39
Откуда: Ливны

Re: Светодиодная матрица на расширителе портов MCP23017

Сообщение korob »

forfrends писал(а):И чем выше частота обновления, тем выше яркость этих "двойников". Может кто знает с чем это может быть связано?
Известная проблема динамической индикации. Для устранения этого эффекта вводятся защитные интервалы между переключениями строк или столбцов (зависит от реализации динамической индикации). Т.е. открываем строку ==> зажигаем нужные столбцы ==> гасим строку и все столбцы ==> небольшая пауза ==> и только после паузы открываем следующую строку. :)

UPD:

Пока набирал уже и сами догадались. :)
Большой опыт, порой, не даёт находить/видеть нам простые и очевидные решения. :(
Всегда с уважением, Александр.
Реклама
forfrends
Вымогатель припоя
Сообщения: 546
Зарегистрирован: Вс дек 30, 2012 00:32:06
Откуда: Николаев / Украина
Контактная информация:

Re: Светодиодная матрица на расширителе портов MCP23017

Сообщение forfrends »

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

Вернуться в «Разные вопросы по МК»