Что не так с этим кодом?..

Я хочу сделать светодиодную матрицу 8*8. Я нашел этот код в Интернете:

i

    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 выводить ток стока?

, 👍0

Обсуждение

что такое первый светодиод? ... с чем это связано?, @jsotola

В обратном порядке, да около 20 мА или около того приемника и источника. Если вы посмотрите на технический паспорт, он даст вам ответ. Что касается первой части, просто соедините это с тем, и это должно исправить это. Это примерно так же полезно, как схема, а не причудливый рисунок, который вы включили. У вас есть как аппаратное, так и программное обеспечение, и для решения этой проблемы обычно требуется знание того и другого. Покажите все силовые и заземляющие соединения на схеме., @Gil

Вы подключили 5 В от схемы к внешнему источнику питания? Если да, то подключали ли вы GND источника питания к GND, показанному на схеме?, @Peter Paul Kiefer

Сделал ли сапрат источник питания необходимым для этого..., @VOID seekers


1 ответ


3

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

светодиодная матрица 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