Как управлять 7-сегментным светодиодным модулем SPI MAX7219 с помощью удлинителя MCP23S17
Я использовал библиотеки Ника Гэммона (MAX7219) и (bitBangedSPI) для успешного управления 7-сегментными 8-разрядными светодиодными модулями SPI с Arduino Uno. Я хотел бы расширить количество вариантов выбора ведомого устройства (CS) с помощью чипа MCP23S17. Библиотеки Mcp23s17, которые можно использовать, могут быть https://github.com/dreamcat4/Mcp23s17 или https://github.com/MajenkoLibraries/MCP23S17. Я нашел полезную запись stackExchange Как использовать SPI на Arduino? и полезную запись http://www.ermicro.com/blog/?p=1050, но все примеры просто включают светодиоды, а не цифры 7-сегментных светодиодных модулей.
Я понимаю, что мне, возможно, придется модифицировать библиотеки MAX7219 и bitBangedSPI, где используется команда digitalWrite. Однако я не уверен, как модифицировать или управлять этими 7-сегментными модулями с использованием чипа MCP23S17.
Ниже показан скелетный скрипт для отображения PI, выбранного на выводе 6 на Uno и адресе 0x0 MCP23S17. Я хотел бы также выбрать, какую распиновку использовать, но не уверен, как это будет закодировано.
#include <SPI.h>
#include <bitBangedSPI.h>
#include <MAX7219.h>
// Библиотека Mcp23s17 доступна по адресу https://github.com/dreamcat4/Mcp23s17
#include <Mcp23s17.h>
// Подключите линии связи интерфейса SPI:
// #define SPI_MOSI 7 //arduino <-> SPI Master Out Slave In -> SI (контакт 13 на MCP23S17 DIP)
// #define SPI_MISO не используется 12 //arduino <-> SPI Master In Slave Out -> SO (контакт 14 на MCP23S17 DIP)
// #define SPI_CLOCK 8 //arduino <-> Вход ведомого тактового сигнала SPI -> SCK (контакт 12 на DIP-разъеме MCP23S17)
// Затем выберите любой другой свободный вывод в качестве выбора ведомого устройства (вывод 10, если он установлен по умолчанию, но это не обязательно)
#define MCP23S17_SLAVE_SELECT_PIN 6 //arduino <-> Выбор ведомого устройства SPI -> CS (контакт 11 на DIP-разъеме MCP23S17)
// НЕСКОЛЬКО УСТРОЙСТВ
// До 8 устройств MCP23S17 могут совместно использовать одну и ту же шину SPI и контакты выбора ведомого устройства.
// Назначить каждому чипу уникальный 3-битный адрес устройства (установив контакты A2,A1,A0)
// Далее, адрес устройства является необязательным вторым параметром конструктора fn...
// MCP23S17 Mcp23s17_0 = MCP23S17(MCP23S17_SLAVE_SELECT_PIN,0x0);
// ...
// MCP23S17 Mcp23s17_7 = MCP23S17(MCP23S17_SLAVE_SELECT_PIN,0x7);
// ОДНО УСТРОЙСТВО
// Создаем экземпляр одного объекта Mcp23s17
MCP23S17 Mcp23s17_0 = MCP23S17(MCP23S17_SLAVE_SELECT_PIN,0x0);
const byte chips = 1;
static char outputBuffer[20]; // outputBuffer[] скорее всего в 2 раза больше необходимого размера.
// 1 чип, бит-бэнг SPI на контактах 6, 7, 8
MAX7219 display(chips, 6, 7, 8); // Чипы / ЗАГРУЗКА / DIN / CLK
void setup()
{
// Установить все контакты как выходы (по умолчанию они все входы)
Mcp23s17_0.pinMode(OUTPUT);
display.begin();
display.setIntensity(1);
float pi = PI;
dtostrf(pi, 7, 7, outputBuffer);
display.sendString(outputBuffer);
} // конец настройки
void loop() { }
Пример 8-разрядного 7-сегментного дисплея. Они доступны на Amazon, Ebay, AliExpress и т. д. У этого модуля цифры 0,33 дюйма; у других модулей цифры 0,56 дюйма.
@GoEphs, 👍0
Обсуждение3 ответа
Лучший ответ:
Я не на 100% понимаю, что вы хотите сделать, но я использовал оба чипа, с которыми вы, похоже, хотите это сделать.
MAX7219 может управлять 8 7-сегментными дисплеями. Я не помню, чтобы это было устройство SPI, вы просто устанавливаете нужную вам схему в регистрах, и все готово. (Возможно, используется настолько высокоуровневая абстракция, что я не понял, что это SPI)
Чип IOX, о котором вы говорите, ведет себя очень похоже: вы настраиваете регистры и все готово.
На первый взгляд кажется, что вы можете делать все, что хотите, но я подозреваю, что вы столкнетесь с проблемами синхронизации, если только вы не хотите очень статичных дисплеев (возможно, < 1FPS). Время, которое вам потребуется для установки правильных настроек на чипах IOX, будет ограничивающим фактором.
Возможно, вам стоит обратить внимание на версию I2C IOX, для которой потребуется всего 2 контакта для подключения до 7 микросхем.
В качестве альтернативы можно использовать сеть микропроцессоров, каждый из которых будет управлять максимальным количеством MAX7219, которое он может, например Nanos, ESP8266-12/NodeMCU и т. д.
Микросхема MAX7219 предназначена для последовательного подключения — подключите Dout к Din следующего MAX7219 (см. раздел No-op Register в техническом описании). Я не уверен, есть ли ограничение на количество подключаемых последовательно микросхем.
На самом деле библиотека Ника Гэммона, похоже, поддерживает это. Параметр "chips" — это количество последовательно соединенных MAX7219.
MAX7219 не использует SPI. Насколько я понимаю, библиотеки SPI/bitBangedSPI используются как удобный способ отправки битов данных с синхронизированными часами.
Просто подключите последовательно MAX7219, как уже упоминалось. Я всегда использую SPI напрямую с чипом, он отлично работает с режимами по умолчанию - тактовая частота 4 МГц, режим 0, MSBFIRST. Многие библиотеки используют программный SPI для связи с ним, что, по моему мнению, является пустой тратой оборудования SPI в семействе чипов '328P.
- Путаница с проводкой SPI
- Как использовать SPI на Arduino?
- Как увеличить скорость записи на SD-карту в Ардуино
- Как считывать данные с помощью Arduino SPI
- Как передать более 1 байта сразу по шине SPI?
- OVF в последовательном мониторе вместо данных
- Как отправить строку с подчиненного устройства Arduino с помощью SPI?
- Проблема совместного использования MISO с несколькими RFID-считывателями RC522
Мне не совсем понятно, что вы хотите здесь сделать. Вы хотите просто использовать расширитель пинов для линий CS? Тогда вам просто нужно зайти в эти библиотеки и переписать так, чтобы вызывать любую функцию, которая записывает пины в высокий или низкий уровень на расширителе вместо того, что digitalWrite он сейчас вызывает. Если вы хотите попробовать bitbang полностью отдельной шины SPI из расширителя, то это будет немного сложнее. Почему вы bitbanging SPI вместо того, чтобы использовать оборудование изначально?, @Delta_G
Сначала отвечаю на ваш второй вопрос — я использовал все аппаратные выводы SPI для нескольких дисплеев, которые соединены последовательно. Bit-banging позволяет мне расшириться на дополнительные дисплеи, но занимает слишком много выводов, необходимых для других устройств. MCP23S17 кажется логичным выбором для расширения. Я пользователь библиотек управления светодиодами, а не автор библиотек., @GoEphs
Вы можете использовать три аппаратных контакта SPI для подключения к любому количеству дисплеев. Шина SPI предназначена для параллельного использования многими вещами., @Delta_G
Мне интересно, как определяется "столько дисплеев, сколько вам нужно". Мне нужно контролировать 18 8-разрядных дисплейных модулей. Последовательное подключение дешевых 8-разрядных модулей не работает больше четырех и уж точно не больше 18., @GoEphs
непонятно, какой
7-сегментный 8-разрядный светодиодный модуль
вы используете? .... это просто светодиодная матрица без каких-либо драйверов/декодеров?, @jsotolaЯ добавил изображение для ясности. Max7219 управляет 8 цифрами. Каждая цифра имеет 7 сегментов светодиодов., @GoEphs