Интересные глюки с Arduino UNO & sn74hc595n & матрицей 1588-BS 8x8DOT

Chip145F
Offline
Зарегистрирован: 12.03.2018

Всем доброго времени суток!Поработав некоторое время с AVR, решил поиграться с набором Arduino, да и быстро проверять алгоритмы и внезапные идеи .Собственно сам набор заказал в Китае, все пришло ок.Начал с простого, помигал светодиодом, потом RGB.Дошел до интересной для меня матричной сборки.Хоть китайцы и положили мне одну sn74hc595n, заказал у себя в местной конторе еще 5 микросхем регистров сдвига.За основу взял простую книгу Бокселла Дж.-Изучаем Ардуино.Вот схема (не привык что в литературе по arduino они такие неопрятные, ну да ладно)

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

// Проект 21 - Создание светодиодной матрицы
#define DATA 6
// к выводу 14 микросхемы 74HC595
#define LATCH 8 // к выводу 12 микросхемы 74HC595
#define CLOCK 10 // к выводу 11 микросхемы 74HC595
void setup()
{
pinMode(LATCH, OUTPUT);
pinMode(CLOCK, OUTPUT);
pinMode(DATA, OUTPUT);
}
void loop()
{
digitalWrite(LATCH, LOW);
shiftOut(DATA, CLOCK, MSBFIRST, ~B10101010); // столбцы
shiftOut(DATA, CLOCK, MSBFIRST, B10101010); // ряды
digitalWrite(LATCH, HIGH);
do {} while (1);
// ничего не делать
}

 

Так,  работает.Хорошо приступаю к следущему уроку.Автор говорит что должно быть: "В результате выполнения скетча на светодиодной матрице получается изображение подмигивающего смайлика"

// Проект 23 - Отображение образа на светодиодной матрице

#define DATA 6
// к выводу 14 микросхемы 74HC595
#define LATCH 8 // к выводу 12 микросхемы 74HC595
#define CLOCK 10 // к выводу 11 микросхемы 74HC595
byte smile[ ] = {B00000000, B00000110, B01000110, B00000000,
B00011000, B00000000, B11000011, B01111110};
int binary[ ] = {1, 2, 4, 8, 16, 32, 64, 128};
void setup()
{
pinMode(LATCH, OUTPUT);
pinMode(CLOCK, OUTPUT);
pinMode(DATA, OUTPUT);
}
void loop()
{
int i;

for ( i = 0 ; i < 8 ; i++ )
{
digitalWrite(LATCH, LOW);
shiftOut(DATA, CLOCK, MSBFIRST, ~smile[i]); // столбцы
shiftOut(DATA, CLOCK, LSBFIRST, binary[i]); // ряды
digitalWrite(LATCH, HIGH);
delay(1);
}
}

Залил скетч.И началась абракадабра на матрице.Все мельтешит и реагирует на то подношу я руку к схеме или нет.А самое интересное, что если заливать прошивку раз за разом то каждый раз получаю свечение индикатора в разных местах не поддающиеся логике(это по последней картинке).Пишу под Debian 9.Что тут посоветуете опытные корифеи? Проблемма в аппаратной части или же автор книги что-то упустил? Буду очень признателен дельным советам.Все попробую и отпишу.

bwn
Offline
Зарегистрирован: 25.08.2014

Сперва проверить все контакты, на макетке они очень поханые. Симптомы похожие.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

а он за 1 миллисекунду сможет разглядеть, чо там и как на матрице меняеца? 

Chip145F
Offline
Зарегистрирован: 12.03.2018

Я менял от 1 мс до 50-70 мс.Мельтешит.А если больше длительность поставить, то видно как то, что должно быть изображением(смайликом) медленно проплывает построчно, но цельного изображения не видно.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

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

Chip145F
Offline
Зарегистрирован: 12.03.2018

Ок, сделаю отпишусь!

Chip145F
Offline
Зарегистрирован: 12.03.2018

А вот вопрос,  как прокрутить изображение частично и остановить его кнопкой.Можно хотя бы пример кода где-нибудь глянуть? Потому что это не так просто.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

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

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

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

Chip145F
Offline
Зарегистрирован: 12.03.2018

Я не программист.Я больше по железу.Давным давно писал на ассемблере под AVR не сложные вещи типа частотомера.А здесь я спросил Вас дать хотя бы кусок кода.Ибо с ардуино и языком С я знаком совсем чуть-чуть.

sadman41
Offline
Зарегистрирован: 19.10.2016
pinMode(2, INPUT_PULLUP);

...

// что-то делаем

//Ждем замыкания D2 на GND
while (LOW != digitalRead(2));

// еще что-то делаем

 

Chip145F
Offline
Зарегистрирован: 12.03.2018

Спасибо!Буду пробовать.

Chip145F
Offline
Зарегистрирован: 12.03.2018

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

Далее убедившись в корректной схеме и общей работе программы решил копать далее в железе.Первое что обнаружил это то, что моя матрица была дефектной и засвечивала 3 и 4 столбец по 2 светодиода .Отпишу товарищу китайцу про это.После купил новую матрицу собрал заново, запустил, опять муар.Стал искать по информационным проводам, дошел до контакта 11 микросхемы сдвиг.регистра SH_CP - к D10(Arduino).Переткнув пин в другой соседний в ряду контакт добился четкой картинки-это и было еще одной решенной проблемой в комплексе багов.

 

Chip145F
Offline
Зарегистрирован: 12.03.2018

Теперь у меня вопрос. Как мне при текущей схеме вывести бегущей строкой хотя  бы "HELLO WORLD".Что нужно поменять в коде?Объясните пожалуйста, если не сложно.