Что не так с этим кодом?..
Я хочу сделать светодиодную матрицу 8*8. Я нашел этот код в Интернете:
int latchPin = 12; //Вывод, подключенный к ST_CP 1-го 74595
int clockPin = 13; //Вывод, подключенный к SH_CP 1-го 74595
int dataPin = 11; //Вывод, подключенный к DS 1-го 74595
int latchPin2 = 6; //Вывод, подключенный к ST_CP 2-го 74595
int clockPin2 = 7; //Вывод, подключенный к SH_CP 2-го 74595
int dataPin2 = 5; //Вывод, подключенный к DS 2-го 74595
void setup() {
//установите контакты для вывода, чтобы вы могли управлять сдвиговым регистром
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(latchPin2, OUTPUT);
pinMode(clockPin2, OUTPUT);
pinMode(dataPin2, OUTPUT);
}
void loop() {
/************** Send HIGH to first Anode pin (16th pin) and LOW to all
other anode pins (15, 11, 3, 10, 5, 6, 13) of LED matrix *************/
// возьмите защелку низко, чтобы светодиоды не менялись, пока вы посылаете биты:
digitalWrite(latchPin, LOW);
//Отправить 0 0 0 0 0 0 0 1 (1) к Q7 Q6 Q5 Q4 Q3 Q2 Q1 Q0 1-го 74595
shiftOut(dataPin, clockPin, MSBFIRST, 1);
// сдвиг битов:
digitalWrite(latchPin, HIGH);
/**************** Send LOW to the first cathode pin (4th pin) and HIGH to all
other cathode pins (7, 2, 8, 12, 1, 14 and 9) of LED matrix *****************/
// возьмите защелку низко, чтобы светодиоды не менялись во время отправки битов:
digitalWrite(latchPin2, LOW);
// Отправить 1 1 1 1 1 1 1 0 (254) к Q7 Q6 Q5 Q4 Q3 Q2 Q1 Q0 2-го 74595
shiftOut(dataPin2, clockPin2, MSBFIRST, 254);
// сдвиг битов:
digitalWrite(latchPin2, HIGH);
}
Я ожидал, что этот код включит первый светодиод, но когда я загрузил этот код, ничего не загорелось. Я проверил свои ряды и колум-соединения.
Кроме того, я хочу спросить, может ли 74hc595 выводить ток стока?
@VOID seekers, 👍0
Обсуждение1 ответ
Я не могу добавить комментарий к вашему вопросу, поэтому я публикую его в качестве ответа, хотя это не очень хороший ответ. Это всего лишь подсказка, чтобы решить вашу проблему.
светодиодная матрица 8x8 и 595s-довольно низкоуровневые вещи, поэтому я предполагаю, что у вас есть некоторые знания об электронике и программировании в целом.
Я думаю, что ваша проводка в порядке, но я также думаю, что вы неправильно понимаете, как работает 595.
Вот поток, взятый из библиотеки (ESP32) для светодиодной панели 64x64 RBG с использованием связки 595s:
uint8_t data[8]; // данные для одной строки
digitalWrite(OE_PIN, HIGH); // отключить выход, 595 выходов переходят в состояние высокого импеданса
for (int i=0; i<8; i++)
shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, data[i]); // dump data out
digitalWrite(LATCH_PIN, LOW); // pulse 1 clock
delayMicroseconds(1); // примечание 2*
digitalWrite(LATCH_PIN, HIGH); // защелка активна high
digitalWrite(OE_PIN, LOW); // Включить вывод
Я думаю, теперь вы знаете, как исправить свой код.
Примечание 1: Я нахожу, что эти имена SER, SRCLK, RCLK (в таблице данных TI) сбивают с толку. Я предпочитаю имена SERIAL DATA INPUT, SHIFT CLOCK, LATCH CLOCK (ONSEMI MC74HC595 datasheet) или better DATA, CLK, LATCH, OE, RESET.
Примечание 2: Проверьте данные 74HC595, чтобы увидеть ограничение ширины тактового импульса и ограничение скорости. И если вы используете UNO или MEGA (@16MHz), вы хороши, не растягивая часы (часы данных и часы защелки). Если вы используете более высокоскоростной MCU, например: ESP32@240MHz или STM32@72MHz, вы должны учитывать растяжение часов там, а также внутри функции shiftOut ().
Чтобы улучшить вашу схему, вы должны подключить оба OE 595s к цифровому контакту. Вы также можете соединить оба защелкивающихся штифта в один цифровой штифт. Каждый раз, когда вы защелкиваете защелку botch 595, и каждый раз, когда вы включаете вывод, оба включают вывод.
Поэтому в вашей конфигурации просто переключите данные обычно для 595 слева и инвертируйте данные для 595 справа, вот так
#define DATA_COL_PIN 11
#define DATA_ROW_PIN 5
#define CLOCK_COL_PIN 13
#define CLOCK_ROW_PIN 7
#define OE_PIN 4 //use digital pin 4 to enable output on both 595s
#define LATCH_PIN 6 // или 12, но вы должны соединить оба входа защелки обоих 595s вместе
uint8_t col = 0b00000001; // для левого 595
uint8_t row = 0b00000001; // для правого 595
digitalWrite(OE_PIN, HIGH);
shiftOut(DATA_COL_PIN, CLOCK_COL_PIN, MSBFIRST, col);
shiftOut(DATA_ROW_PIN, CLOCK_ROW_PIN, MSBFIRST, ~row); // ~row = 0b11111110 = invert_bits(row)
digitalWrite(LATCH_PIN, LOW);
digitalWrite(LATCH_PIN, HIGH);
digitalWrite(OE_PIN, LOW);
Приведенный выше код предназначен только для того, чтобы вы поняли, как он работает. Обычно они работают с буфером, таким как
uint8_t row[8]; // каждый байт-это одна строка
И они выполняют сканирование строк, включают по одной строке за раз и просто включают и выключают каждый столбец, следуя байтовым данным этой строки.
Я останавливаюсь здесь, так как это уходит от темы. Вы просто спрашиваете, что не так с вашим кодом, верно?
Кстати, 595 может поглощать/излучать 35 мА на каждом выводе (всего 70 мА). Поэтому, если вы хотите осветить одну строку за раз с помощью своей установки, вы должны тщательно выбирать каждый ограничитель тока, чтобы не превышать 70 мА в общей сложности.
70mA / 8xLED = 8.75 mA для каждого светодиода (предположим, красный светодиод)
(5v - 1v7) / 8.75 mA = 377R
Скорее всего, резисторы должны быть не менее 377 Ом или 470 Ом для безопасности.
Сри, я ничего не понял... Вы пытаетесь сказать вместо того, чтобы поместить 8-битное значение в десятичную дробь... Я должен сделать для этого массив..., @VOID seekers
Я, вероятно, забегаю вперед в том, как люди *пишут* графический драйвер для этих светодиодных панелей, отвечая таким образом. Не имеет значения, записано ли число в двоичном, десятичном или шестнадцатеричном формате. Я просто использую двоичный код, потому что он прямолинейно отражает каждый бит как один светодиод на матрице. Массив из восьми 8-битных чисел имеет 8x 8-bit = 64-bit, который представляет все 64 светодиода на вашей светодиодной панели 8x8. Таким образом, у вас есть 2 функции: одна для чтения этого массива и выплевывания данных в 595s, другая функция для изменения этого массива, чтобы у вас был визуальный эффект или анимация, или изменение статического изображения через некоторое время., @SimonVu14
- Использование аналогового входа для чтения кнопки
- Преобразование строки в массив символов
- Можно ли использовать цифровые контакты в качестве выхода ШИМ?
- Bluetooth-модуль HC-05 не принимает AT-команды
- Прочитать значение регистра в arduino
- Объединение кода для нескольких датчиков в одной программе
- Использование модуля JYETech 2.4 Inch LCD Display Screen Module с Arduino?
- Может ли Arduino UNO постоянно хранить код?
что такое первый светодиод? ... с чем это связано?, @jsotola
В обратном порядке, да около 20 мА или около того приемника и источника. Если вы посмотрите на технический паспорт, он даст вам ответ. Что касается первой части, просто соедините это с тем, и это должно исправить это. Это примерно так же полезно, как схема, а не причудливый рисунок, который вы включили. У вас есть как аппаратное, так и программное обеспечение, и для решения этой проблемы обычно требуется знание того и другого. Покажите все силовые и заземляющие соединения на схеме., @Gil
Вы подключили 5 В от схемы к внешнему источнику питания? Если да, то подключали ли вы GND источника питания к GND, показанному на схеме?, @Peter Paul Kiefer
Сделал ли сапрат источник питания необходимым для этого..., @VOID seekers