Используйте Raspberry Pi для управления восьмисегментной цифровой трубкой, чтобы реализовать обратный отсчет

JavaScript Интернет вещей

предыдущая статьяМы сказали, что когда порт 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, вы можете получить его вместе со мной. Если у вас есть какие-либо вопросы, добро пожаловать на обсуждение в области обсуждения ниже.