предыдущая статьяМы сказали, что когда порт GPIO (ввод и вывод общего назначения) Raspberry Pi установлен в состояние OUTPUT, программа может управлять им для вывода логики 0 и 1. Raspberry Pi Model B+ имеет в общей сложности 26 интерфейсов GPIO, сегодня мы используем 12 из них для управления группой из 4Восьмисегментная цифровая трубка.
Прежде чем объяснять конкретную реализацию, давайте взглянем на готовый продукт:
Здесь мы используем набор из 4 восьмисегментных ламп для реализации таймера обратного отсчета, запускаем его с помощью командной строки node.js, передаем цифровой параметр от 1 до 999 для представления количества секунд, а затем Трубка отображает соответствующее число и начинает обратный отсчет, время с точностью до 0,1 секунды.
Чтобы реализовать эту функцию, давайте сначала разберемся, что такое восьмисегментная цифровая трубка и принцип отображения многоразрядной восьмисегментной цифровой трубки.
Восьмисегментная цифровая трубка
Восьмисегментная цифровая трубка состоит из 8 светодиодов, 7 из которых используются для формирования чисел и 1 для отображения десятичной точки. Номер каждого корня показан в правом верхнем углу рисунка ниже (A-G, DP).
Восьмисегментная цифровая трубка делится на два типа: общий анод и общий катод.Если 8 светодиодов имеют общий положительный полюс и подключены к VCC, 8 входных контактов загорятся, когда входной сигнал низкий, что называется общим анодная цифровая трубка. И наоборот, если 8 светодиодов имеют общий отрицательный полюс, подключитесь к GND, а 8 входных контактов подключены к свету, когда входной сигнал находится на высоком уровне, что называется цифровой лампой с общим катодом. Модель цифровой трубки, используемая в этой статье,F3461BH, это обычная цифровая трубка Ян.
Из приведенного выше анализа видно, что восьмисегментная цифровая трубка имеет 8 входов, один общий положительный/отрицательный, поэтому один бит равен 9 контактам. Итак, нужно ли 4-разрядной цифровой трубке целых 36 контактов?
На самом деле нет, потому что 4-битная цифровая трубка также может использовать 8 входных контактов, а затем выводить общий положительный/отрицательный каскад соответственно, так что всего 8 + 4 = 12 контактов, а затем использовать управление общим положительным. /отрицательный режим вывода отображается по очереди. Из-за стойкости человеческого зрения и эффекта послесвечения светоизлучающих диодов, хотя цифровые трубки на самом деле не загораются одновременно, пока скорость сканирования достаточно высока, создается впечатление, что набор стабильных данных дисплея будет отображаться без мерцания. , эффект динамического отображения такой же, как и у статического отображения, что может сэкономить много портов ввода-вывода и потреблять меньше энергии.Фактически, этот метод также широко используется в электронных схемах, таких как прогрессивная развертка точечно-матричных экранов, в которой также используется тот же принцип.
Из приведенной выше принципиальной схемы цифровой лампы F3461BH видно, что среди ее 12 контактов 6-й, 8-й, 9-й и 12-й контакты являются общими положительными полюсами 4-х цифровых ламп, а 1-й, 2-й, 3-й, 4-й , 5-й, 7-й, контакты 10 и 11 являются 8-сегментными входными контактами.
Ограничение напряжения и тока
Поняв принцип восьмисегментной цифровой трубки, вы в основном знаете, как ее подключить, но нам также необходимо обратить внимание на параметры электронных компонентов.Общее напряжение цифровой трубки составляет 2 В, а ток 10–20 мА. , в то время как Raspberry Pi GPIO высокой мощности Напряжение плоского выхода составляет около 3,3 В, поэтому необходимо подключить токоограничивающий резистор Диапазон сопротивления резистора:
- Rmax(3,3 - 2) / 0,02 = 130 Ом
- Rmin(3,3 - 2) / 0,01 = 65 Ом
Итак, мы подключаем резистор 100 Ом к каждому положительному полюсу, так что всего 4 резистора.
схема подключения
Приведенный выше анализ показывает, что нам нужно использовать 4 контакта для подключения 4 общих анодов, чтобы выбрать, какая цифровая трубка будет светиться, и использовать 8 контактов для подключения 8-сегментного входа цифровой трубки, чтобы определить, какое число отображать. Это занимает в общей сложности портов GPIO 12. Мой выбор:
- Порт выбора трубки Nixie: 11, 13, 15, 23
- Выходные порты цифровой лампы: 29, 31, 33, 35, 37, 36, 38, 40
Окончательная схема цепи выглядит следующим образом:
реализовать программу
Согласно схеме, программе необходимо управлять двумя группами контактов GPIO для управления цифровым дисплеем и переключением цифровой трубки соответственно. Сначала мы можем отлаживать по частям, сначала взглянем на цифровой дисплей.
показать номера
Согласно приведенной выше принципиальной схеме, мы сначала подключаем нижние 8 выходных контактов и сначала оставляем верхние 4 неподключенными, сначала подключаем конец контакта P11 (GPIO Pin 17) непосредственно к положительному полюсу V3.3+, а затем написать тестовую программу:
"use strict";
const Gpio = require("rpio2").Gpio;
const NUMS = [
0b11010111, //0
0b00010001, //1
0b11001011, //2
0b01011011, //3
0b00011101, //4
0b01011110, //5
0b11011110, //6
0b00010011, //7
0b11011111, //8
0b01011111, //9
];
const DP = 0b00100000; //.
var digitGroup = Gpio.group([29,31,33,35,37,36,38,40], true);
digitGroup.open(Gpio.OUTPUT, Gpio.LOW);
digitGroup.value = NUMS[5]; //显示数字 5
//5 秒后换成显示带小数点的数字 3.
setTimeout(function(){
digitGroup.value = NUMS[3] | DP;
}, 5000);
//10 秒后关闭
setTimeout(function(){
digitGroup.close();
}, 10000);
rpio2GpioGroup поддерживается после версии V0.4+, доступ к которой можно получить черезGpio.group(pins[, activeLow])
Быстро создайте набор входов GPIO. Здесь мы создаем группу, отвечающую за отображение 8-сегментных чисел, и вводим непосредственно в нее 8-битное двоичное число для управления отображаемым содержимым.
Поскольку это лампа с общим анодом, входной сигнал имеет низкий уровень, когда она горит.Здесь для удобства мы можем передать второй параметр групповому методу и установить для activeLow значение true, чтобы 1 можно было использовать для представляют низкий уровень, 0 означает высокий уровень.
Затем проверьте 8 входных контактов, соответствующих тому, какая секция цифровой трубки горит, а затем введите соответственно 0–9.Согласно нашему методу подключения к линии, мы можем получить указанную выше постоянную карту:
const NUMS = [
0b11010111, //0
0b00010001, //1
0b11001011, //2
0b01011011, //3
0b00011101, //4
0b01011110, //5
0b11011110, //6
0b00010011, //7
0b11011111, //8
0b01011111, //9
];
const DP = 0b00100000; //.
Различные соединения линий или другой порядок расположения выводов первого параметра группы приведут к различным постоянным комбинациям, но основной принцип остается тем же.
Таким образом, мы можем просто пройти:
digitGroup.value = NUMS[n];
для отображения числа n. Если вы хотите показать десятичную точку, вы можете:
digitGroup.value = NUMS[n] | DP;
переключатель цифровой трубки
Далее мы решаем часть переключения 4 цифровых ламп, а также используем группу для достижения:
var portGroup = new Gpio.group([11,13,15,16]);
const wait = require("wait-promise");
//轮流点亮数码管
wait.every(1).and(function(port){
var p = 1 << (port++%4);
digitGroup.value = 0; //将前一个点亮的数码管关闭
portGroup.value = p; //将当前数码管点亮
});
Объединив эту часть кода с предыдущим кодом, мы увидим, что одновременно горят 4 лампочки. Здесь я использовалwait-promistбиблиотека, которую можно легко использовать для реализации опроса.
Объединить и время два
Следующее, что мы хотим сделать, это время, и объединить значение отображения времени с опросом:
const startTime = Date.now();
const duration = process.argv[2] * 1000;
if(duration <= 0 || duration > 999000){
console.error("Duration must between 1 and 999!");
process.exit(1);
}
wait.every(1).and(function(port){
var time = duration - (Date.now() - startTime);
var p = 1 << (port++%4);
digitGroup.value = 0; //将前一个点亮的数码管关闭
portGroup.value = p; //将当前数码管点亮
if(time <= 0){
//倒计时结束显示 000.0
digitGroup.value = NUMS[0] | (p & 0b100 ? DP : 0);
return;
}
if(p & 0b1000){
//十分位
digitGroup.value = NUMS[Math.floor(time / 100) % 10];
}else if(p & 0b100){
//个位,要显示一个小数点
digitGroup.value = NUMS[Math.floor(time / 1000) % 10] | DP;
}else if(p & 0b10){
//十位
digitGroup.value = NUMS[Math.floor(time / 10000) % 10];
}else if(p & 0b1){
//百位
digitGroup.value = NUMS[Math.floor(time / 100000) % 10];
}
}).forward();
сбить
И, наконец, полный код:
"use strict";
const Gpio = require("rpio2").Gpio;
const wait = require("wait-promise");
const NUMS = [
0b11010111, //0
0b00010001, //1
0b11001011, //2
0b01011011, //3
0b00011101, //4
0b01011110, //5
0b11011110, //6
0b00010011, //7
0b11011111, //8
0b01011111, //9
];
const DP = 0b00100000; //.
var digitGroup = Gpio.group([29,31,33,35,37,36,38,40], true);
var portGroup = Gpio.group([11,13,15,16]);
digitGroup.open(Gpio.OUTPUT, Gpio.LOW);
portGroup.open(Gpio.OUTPUT, Gpio.LOW);
const startTime = Date.now();
const duration = process.argv[2] * 1000;
if(duration <= 0 || duration > 999000){
console.error("Duration must between 1 and 999!");
process.exit(1);
}
wait.every(1).and(function(port){
var time = duration - (Date.now() - startTime);
var p = 1 << (port++%4);
digitGroup.value = 0; //将前一个点亮的数码管关闭
portGroup.value = p; //将当前数码管点亮
if(time <= 0){
//倒计时结束显示 000.0
digitGroup.value = NUMS[0] | (p & 0b100 ? DP : 0);
return;
}
if(p & 0b1000){
//十分位
digitGroup.value = NUMS[Math.floor(time / 100) % 10];
}else if(p & 0b100){
//个位,要显示一个小数点
digitGroup.value = NUMS[Math.floor(time / 1000) % 10] | DP;
}else if(p & 0b10){
//十位
digitGroup.value = NUMS[Math.floor(time / 10000) % 10];
}else if(p & 0b1){
//百位
digitGroup.value = NUMS[Math.floor(time / 100000) % 10];
}
}).forward();
process.on("SIGINT", function(){
digitGroup.close();
portGroup.close();
console.log("shutdown!");
process.exit(0);
});
Таким образом, мы можем использовать командную строку Node.js для управления восьмисегментной цифровой трубкой, чтобы реализовать обратный отсчет:
node index.js 100 #倒计时 100 秒
Суммировать
Выше мы использовали менее 100 кодов для управления обратным отсчетом восьмисегментного цифрового дисплея с помощью Raspberry Pi. При разработке комбинации аппаратного и программного обеспечения необходимо учитывать не только логику программного обеспечения, но и аппаратные параметры и схемы, поэтому требуемая комплексная способность выше, а разработка более интересна.
В следующих статьях я продолжу делиться с вами темой разработки аппаратного управления программой Node.js для Raspberry Pi, а мы можем заняться еще кое-чем интересным. Если у вас есть Raspberry Pi, вы можете получить его вместе со мной. Если у вас есть какие-либо вопросы, добро пожаловать на обсуждение в области обсуждения ниже.