Преобразование кода ESP32 SPI в Arduino для платы драйвера MAX6921 IV-18
Я купил модуль драйвера трубки VFD IV-18, который шел вместе с некоторым примером кода для платы ESP32. Модуль драйвера имеет 20 выходных последовательных микросхем MAX6921 для привода вакуумной трубки. Я хочу использовать этот модуль драйвера с Arduino Uno, а затем, в конечном счете, с Raspberry Pi.
Я думаю , что у меня есть очень приблизительное понимание электроники и демонстрационного кода, но, похоже, я не могу заставить свои SPI-вызовы работать. Вместо того чтобы пытаться перевести демонстрационный код целиком, моя первая цель-просто заставить засветиться один сегмент.
Краткая предыстория
Трубка IV18 имеет 9 решеток. Первая сетка имеет только точку и тире, но остальные 8 сетки имеют 7 сегментов и десятичную точку.
Чтобы зажечь сегмент, вы подаете питание на контакты сегмента / десятичную точку и на сетку для этого сегмента. Чтобы отобразить несколько чисел, вы должны быстро циклически освещать каждую из позиций сетки и соответствующие сегменты для этой позиции. Если вы пройдете этот цикл достаточно быстро, человеческий глаз увидит всю сетку с числами (постоянство зрения).
То, что я пробовал
До сих пор я подключал Arduino Uno к плате драйвера
Driver GND - Uno GND
Driver 5V - Uno +5V
Driver Din - Uno digital pin 11 / MOSI
Driver CLK - Uno digital pin 13 / SCK
Driver LOAD - Uno digital pin 2
Driver BLANK - Uno digital pin 3
Driver Dout - Not connected
Пример кода содержит шестнадцатеричные коды, которые, как я полагаю, затем переводятся в 24-битный буфер (хотя требуется только 17 бит) для отправки через SPI для установки ВЫСОКИХ или НИЗКИХ выходов MAX6921.
Я думаю, что необходимые биты следующие:
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
G7 | G6 | G5 | G4 | G3 | G2 | G1 | G0 | SEG_G | SEG_F | SEG_E | SEG_D | SEG_C | SEG_B | СЕГ_А | ЗНАК | ДП |
Поэтому, чтобы осветить число 8 в самой правой сетке, я предположил, что мне понадобится 8-й бит high (сетка) и биты 9,10,11,12,13,14 и 15 для 7 семен для "8".
В своей функции настройки я вызываю SPI.begin
, а затем SPI.transfer
с тем, что, как я предполагал, было соответствующими двоичными данными (справа налево, я думаю, из-за порядка битов LSB/MSB?):
SPI.transfer(0b000000000111111110000000);
Этот свет первой сетке (то что после диплома и знака "минус"), но не чего я хочу, - я вижу, что некоторые сегменты левая решетка (полной сетки, не таблицы с точкой и минус), но эти легкие в разной фактуры каждый раз (изменяется каждый раз, когда я сбросить и повторно загрузить что я думаю, что вполне ожидаемо, когда я нажимаю данные в MAX6921 каждый раз).
Пока что это мой код
#include "SPI.h"
#define DISP_CLK 13 // White - SPI SCK
#define DISP_DATA 11 // Yellow - SPI MOSI
#define DISP_LOAD 2 // Blue
#define DISP_BLANK 3 // Green
void setup() {
Serial.begin(9600);
Serial.println("IV18 Test");
SPI.begin();
pinMode(DISP_BLANK, OUTPUT);
digitalWrite(DISP_BLANK, LOW);
pinMode(DISP_LOAD, OUTPUT);
digitalWrite(DISP_LOAD, HIGH);
SPI.transfer(0b000000000111111110000000);
}
void loop() {
}
Я почти уверен, что две фундаментальные вещи, которые я неправильно здесь, - это биты данных для отправки, а затем правильное использование SPI.
Может ли кто-нибудь помочь мне правильно понять код ESP32 и в идеале помочь мне получить правильные данные для отправки через SPI, чтобы я мог осветить сегменты и позиции сетки, которые я ожидаю.
1 ответ
Так что, оказывается, я кое в чем ошибся.
ОБНОВЛЕНИЕ: Рабочий код теперь на моем GitHub, если кто-то заинтересован.
Во-первых, я неправильно понял пример кода и перепутал биты для отправки на MAX6921. Чтобы выработать правильное отображение, я пошел и исследовал каждый вывод IV-18 и отметил соединение с выводами / выходами MAX6921, которое дало мне эту таблицу:
БИТ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
IV-18 | G9 | G8 | G7 | G6 | G5 | G4 | G3 | G2 | G1 | А | Б | В | D | E | F | Г | ДП | |||||||
МАКС 6921 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
Обратите внимание что значение MAX6921 это ВЫХОДНОЙ номер а не КОНТАКТ
Затем это дало мне правильный порядок отправки каждого бита, как указано в верхней строке таблицы.
Следующей ошибкой была попытка отправить все 24 бита за один раз. Вместо этого я разбил каждый байт на отдельный вызов SPI.transfer ()
, который, наконец, позволил мне отобразить сегменты в том положении сетки, которое я ожидал.
Например, чтобы отобразить "ПРИВЕТ", моя функция цикла имеет следующее значение:
void loop() {
// XXXXXXXDP GFEDCBA1 23456789
SPI.transfer(0b00000000); SPI.transfer(0b11101100); SPI.transfer(0b10000000); delay(1);
SPI.transfer(0b00000000); SPI.transfer(0b11110010); SPI.transfer(0b01000000); delay(1);
SPI.transfer(0b00000000); SPI.transfer(0b01110000); SPI.transfer(0b00100000); delay(1);
SPI.transfer(0b00000000); SPI.transfer(0b01110000); SPI.transfer(0b00010000); delay(1);
SPI.transfer(0b00000001); SPI.transfer(0b01111110); SPI.transfer(0b00001000); delay(1);
}
У меня есть настройка TIMER1 для использования вместо кода цикла/задержки, так что, надеюсь, я смогу закончить преобразование остальной части примера кода в Arduino.
- Как использовать SPI на Arduino?
- OVF в последовательном мониторе вместо данных
- Как отправить строку с подчиненного устройства Arduino с помощью SPI?
- Проблема совместного использования MISO с несколькими RFID-считывателями RC522
- Программирование ведомого SPI для Arduino
- Последовательная связь между несколькими устройствами (или ардуино)
- Максимальная скорость SPI для ведомого Uno/clone?
- Чтение данных из Google Таблиц с помощью Nodemcu
SPI.transfer()
служит только для часов и записи/чтения MOSI/MISO. Это не приносит CS низкий уровень для выбора ведомого SPI., @Sim Son