Как прочитать функцию shiftOut с помощью Arduino
(Извините за мой плохой английский, но я сделаю все возможное)
У меня есть китайский MUC, который уже запрограммирован. Он взаимодействует с микросхемой драйвера светодиодов по трем проводам (STB, CLK, DIN).
(драйвер светодиода управляет 16-разрядным 7-сегментным дисплеем)
После некоторых исследований я обнаружил, что с драйвером светодиода можно общаться, используя функцию сдвига.
Сейчас основная задача состоит в том, чтобы соединить эти 3 контакта (STB, clk, din) к Arduino и читать входящие данные и преобразовывать данные в числа.
Чтобы проверить, работает ли эта идея,
Я пришел с двумя arduino (uno для отправки функции сдвига и mega для ее чтения) после подключения контакта 2 uno к контакту 2 mega и того же 3 к 3, 4 к 4, а также Gnd uno к Gnd mega.
Я написал эти коды:
сторона arduino UNO (для отправки функции shiftOut)
# определить приставку 4 #define часыПин 5 #define dataPin 6 недействительная установка () { Серийный.начать(9600); pinMode(STB, ВЫХОД); pinMode(clockPin, ВЫХОД); pinMode(dataPin, ВЫХОД); } недействительный цикл () { цифровая запись (STB, НИЗКИЙ); shiftOut(dataPin, clockPin, LSBFIRST, 0b10101010 ); // 1-я цифра цифровая запись (STB, ВЫСОКИЙ); }
arduino mega side (для чтения функции shiftOut)
# определить приставку 4 #define часыПин 5 #define dataPin 6 интервал R_STB[8]; интервал R_clockPin ; интервал R_dataPin ; недействительная установка () { Серийный.начать(115200); pinMode(STB, ВХОД); pinMode(clockPin, INPUT); pinMode(dataPin, INPUT); } недействительный цикл () { R_STB = цифровое чтение (STB); R_clockPin = цифровое чтение (clockPin); R_dataPin = digitalRead (dataPin); for(int i=0 ; i<8i++){ Serial.print(R_STB[i]-2); Серийный.принт(" "); Serial.print(R_clockPin[i]); Серийный.принт(" "); Serial.print(R_dataPin[i]+2); Серийный.println(" "); } }
Но цифровое чтение на стороне arduino mega не может прочитать все данные из-за быстрого переключения между операторами High LOW, может быть? и я застрял здесь.
Пожалуйста, у кого-нибудь есть идеи?
@hatore, 👍0
Обсуждение1 ответ
Вы правы, что не можете достаточно быстро считывать данные с помощью вашего метода. Что вам действительно нужно, так это противоположность «shiftOut», которая называется «shiftIn». Вы используете его так же, как shiftOut, но вместо того, чтобы отправлять ему значение для отправки, он вместо этого возвращает значение, которое он читает.
Вы запускаете его с помощью контакта "STB":
if (digitalRead(STB) == LOW) {
uint8_t val = shiftIn(dataPin, clockPin, LSBFIRST);
Serial.println(val, HEX);
}
Но описанный вами протокол — это просто SPI. В Arduino есть аппаратное обеспечение, которое справится с этим за вас. С ним немного сложнее работать, но он способен работать на гораздо более высоких скоростях и, скорее всего, сможет достаточно быстро считывать входящие данные.
Ресурсы:
- https://www.arduino.cc/en/reference/SPI
- http://www.gammon.com.au/spi
К последним относится настройка подчиненного SPI, который используется для получения данных, отправляемых откуда-то еще.
Маженко спасибо разнится сильно. Я прочитал о SPI и пришел к решению, один вопрос, пожалуйста, что если у меня будет только два контакта (DIN, CLK) вместо трех (STB, CLK, DIN), как или что мне использовать? заранее спасибо., @hatore
Для SPI должен быть третий пин. Он может иметь маркировку CS или SS вместо STB. Или это может быть не SPI и иметь контакт «Защелка» (в этом случае это регистр сдвига). Если нет ничего, кроме CLK и DIN, то должен быть какой-то другой нестандартный способ индикации начала коммуникационного блока., @Majenko
Спасибо за ваш быстрый ответ, Новый светодиодный драйвер (TM1640), в нем написано «Двухлинейный последовательный интерфейс (CLK, DIN)». техническое описание ==>> https://datasheetspdf.com/pdf-file/838954/TitanMicro/TM1640/1, @hatore
Он использует нестандартную систему: «Начальное условие ввода данных: когда CLK высокий, DIN становится низким с высокого; конечное условие: когда CLK высокий, DIN становится высоким из низкого., @Majenko
Не могли бы вы предложить какие-либо мысли, которые, прочитав это, я могу обрабатывать данные, которые поступают от контактов (MUC) через (CLK, DIN) с помощью arduino? пожалуйста, @hatore
Вы уже знаете, как получать данные, и я выделил ту часть таблицы, которая описывает условие запуска. Там даже есть картинка, чтобы было понятнее., @Majenko
- Основная связь Arduino ModBus RTU с проблемой измерителя мощности
- Отправка значения с одного Arduino на другой
- Связь Arduino master/slave с использованием RS485
- Клиент MQTT на Arduino + SIM900
- Ошибка инициализации GPS DFRobot [Arduino Uno, SIM808]
- Реализовать связь Visible Light с помощью Arduino
- Как автоматически сбросить nrf24l01+ с кодом?
- Многоканальная связь с Arduino и передатчиком HC-12
Добро пожаловать в Arduino StackExchange. Какой китайский MUC у вас есть, предоставьте нам некоторые таблицы данных, @abu-ahmed al-khatiri