4х разрядный 7-сегментный индикатор нужен драйвер

chiz
Offline
Зарегистрирован: 22.06.2014

Здравствуйте, уважаемые. ПОдскажите, пожалуйста. есть такой (извиняюсь за ссылкуиндикатор 7 сегментов на 4 разряда. Хочу подключить его к ардуине для того, чтобы выводить на него скорость. (бортовой компьютер).

Я так понимаю, мне нужен драйвер, потому что если без него - очень много портов будет занято....подскажите, как лучше его подключить? Что для этого нужно использовать? Если можно, то дайте конкретные маркировки микросхем....может у кого есть схема подключения или примеры управления...буду очень благодарен.

P.S.: я не прошу сделать за меня. Хочу разобраться сам, ищу в Интернете уже долго, ничего не пойму пока....

chiz
Offline
Зарегистрирован: 22.06.2014

Приношу извинения...пришлось отходить от компьютера. Благодарю за обширный ответ. 

Нет, я не студент медунивера =) кардиостимулятор делать не буду) курсовую не пишу.

Вот семисегментник, который я заказывал у китайцев (ибэй.ком)

дело в том, что здесь показано как подсоединить напрямую к ардуине. Для этого я задействую 12 портов....А если использовать микросхему для сдвига регистров, то я потрачу 2-3 цифровых порта.

chiz
Offline
Зарегистрирован: 22.06.2014

Значит все же рекомендуете подключать напрямую к ардуине, без драйверов?

А вот есть элемент....только я так понял, он только для одного разряда? Для моего 4х разрядного не пойдет?

http://amperka.ru/product/cd4026-segment-driver

chiz
Offline
Зарегистрирован: 22.06.2014

Нет, Ваза у меня нет) Ауди 100 С3. Под нее и делается. Покупать не вариант. Ардуину, думаю, осилим!) И индикатор победим!) Импульсы буду брать с цифрового одометра. Уже приобрел у китайцев. Он прикручивается на коробку передач вместо троса спидометра. На нем 3 контакта: +, - и сигнальный.

Хорошо, начнем с поиска транзисторов и подключения напрямую. Думаю скоро новые вопросы появятся))) Благодарю за ответы)

chiz
Offline
Зарегистрирован: 22.06.2014

art100 пишет:

код какой-то есть

#define CLOCK_PIN 2
#define RESET_PIN 3
 
/*
 * Функция resetNumber обнуляет текущее значение
 * на счётчике
 */
void resetNumber()
{
    // Для сброса на мгновение ставим контакт
    // reset в HIGH и возвращаем обратно в LOW
    digitalWrite(RESET_PIN, HIGH);
    digitalWrite(RESET_PIN, LOW);
}
 
/*
 * Функция showNumber устанавливает показания индикаторов
 * в заданное неотрицательное число `n` вне зависимости
 * от предыдущего значения
 */
void showNumber(int n)
{
    // Первым делом обнуляем текущее значение
    resetNumber();
 
    // Далее быстро «прокликиваем» счётчик до нужного
    // значения
    while (n--) {
        digitalWrite(CLOCK_PIN, HIGH);
        digitalWrite(CLOCK_PIN, LOW);
    }
}
 
void setup()
{
    pinMode(RESET_PIN, OUTPUT);
    pinMode(CLOCK_PIN, OUTPUT);
 
    // Обнуляем счётчик при старте, чтобы он не оказался
    // в случайном состоянии
    resetNumber();
}
 
void loop()
{
    // Получаем количество секунд в неполной минуте
    // с момента старта и выводим его на индикаторы
    showNumber((millis() / 1000) % 60);
    delay(1000);
}

вы его понимаете?

 

да. Только здесь немного странный способ отображения значений. Путем "накручивания" счетчиком от единицы до заданного числа. Если, допустим, у меня скорость 120 км/час....интересно, насколько быстро будет "накручиваться" значение? Или я буду наблюдать этот процес? Интересно, а зимой, когда индикатор замерзнет....скорость не упадет? Это ж не слд-дисплей...

chiz
Offline
Зарегистрирован: 22.06.2014

art100 пишет:

понятно значит схемы ВАЗ-2170 вам в помошь

Чем она мне может помочь? Я что-то не пойму...

chiz
Offline
Зарегистрирован: 22.06.2014

Хорошо. Спасибо за советы. Тему не закрывайте. Соберу детали, попробую подключить, а там отпишусь....чтобы продолжить. 

chiz
Offline
Зарегистрирован: 22.06.2014

я не пойму, зачем мне схема от ВАЗ-2170? Ведь у меня есть схема от ауди 100....Или я Вас просто не понял? Объясните, пожалуйста.

toly
Offline
Зарегистрирован: 17.05.2014

На ибее есть уже смонтированные сборки с драйвером MAX7219, подключаются по SPI, поддерживают каскадное включение и есть отличные библиотеки к ним...

art100
Offline
Зарегистрирован: 09.03.2014

ищущий да обрящет

chiz
Offline
Зарегистрирован: 22.06.2014

toly пишет:

На ибее есть уже смонтированные сборки с драйвером MAX7219, подключаются по SPI, поддерживают каскадное включение и есть отличные библиотеки к ним...

К сожалению уже купил этот. Ничего, победим и такой вариант. На днях попаду на радиорынок, закуплю деталек и приступлю.

chiz
Offline
Зарегистрирован: 22.06.2014

Так-с, сегодня приехали диоды, с ними и сдвиг-регистр (но он пока будет ждать своего череда). Хочу подключить напрямую...сейчас буду пытаться это сделать.

А где делись первые ответы???? Там же так подробно было все расписано.... =( Арт100, Вы удалили свои ответы???

denis64
Offline
Зарегистрирован: 07.10.2013

Помогите подключить 4 разрядный индикатор  управляемый через два сдвиговых регистра.

Они распаяны на его обратной стороне. Плата имеет 5 выводов: RSLK, SCLK, DIO, питание и земля. Индикатор который припаян к плате - 12 выводов.

Как я понял 4 из них отвечают за разряд, оставшиеся 8 - за сегменты (7+точка).

Подскажите как на него выводить данные?

Использование стандартного кода для сдвиговых регистров:

/*
 Программа поочередно включается все светодиоды, подключенные к двум
сдвиговым регистрам 74HC595 .Created 22 May 2009
 Modified 23 Mar 2010
 by Tom Igoe
 */

//Пин подключен к ST_CP входу 74HC595
const int latchPin = 2;
//Пин подключен к SH_CP входу 74HC595
const int clockPin = 3;
//Пин подключен к DS входу 74HC595
const int dataPin = 4;

char inputString[2];

void setup() {
   //устанавливаем режим OUTPUT
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);  
  pinMode(clockPin, OUTPUT);
  Serial.begin(9600);
  Serial.println("reset");
}

void loop() {
  // проходим циклом по всем 16 выходам двух регистров
  for (int thisLed = 0; thisLed < 16; thisLed++) {
    // записываем сигнал в регистр для очередного светодиода
    registerWrite(thisLed, HIGH);
    // если это не первый светодиод, то отключаем предыдущий
    if (thisLed > 0) {
      registerWrite(thisLed - 1, LOW);
    } 
    // если это первый светодиод, то отключаем последний
    else {
      registerWrite(15, LOW);
    } 
    // делаем паузу перед следующией итерацией
    delay(250);
  }

}

// этот метод отсылает бит на сдвиговый регистр

void registerWrite(int whichPin, int whichState) {
  // для хранения 16 битов используем unsigned int
  unsigned int bitsToSend = 0;    

  // выключаем светодиоды на время передачи битов
  digitalWrite(latchPin, LOW);

  // устанавливаем HIGH в соответствующий бит 
  bitWrite(bitsToSend, whichPin, whichState);

  // разбиваем наши 16 бит на два байта 
  // для записи в первый и второй регистр
  byte registerOne = highByte(bitsToSend);
  byte registerTwo = lowByte(bitsToSend);

  // "проталкиваем" байты в регистры
  shiftOut(dataPin, clockPin, MSBFIRST, registerTwo);
  shiftOut(dataPin, clockPin, MSBFIRST, registerOne);

  // "защелкиваем" регистр, чтобы биты появились на выходах регистра
  digitalWrite(latchPin, HIGH);
}

дает в результате попеременное зажигание 2 и 4 регистра (все сегменты)

denis64
Offline
Зарегистрирован: 07.10.2013

дубль

toly
Offline
Зарегистрирован: 17.05.2014

Для начала попробуйте со стандартной библиотекой SPI...если ничего не получится, надо будет понять по какой именно схеме собрана ваша плата, и тогда уже думать

denis64
Offline
Зарегистрирован: 07.10.2013

С платой и сдвиговыми регистрами (СР) понятно, они подключены таким образом:

а) первый СР задействован только на 4 ноги индикатора

если смотреть с "фронта" ноги такие:

4  *  *  3  2  *

*  *  *  *  *  1

б) второй СР задействован полностью

*  1  6  *  *  2

5  4  8  3  7  *

Не понятно какую комбинацию уровней подавать для вывода чего нибудь определённого уже на самом этом 12 ногом индикаторе. Ничего толкового кроме абракатабры не получается.

 

_______________________-

Добавлено чуть позже:

Ага спасибо всем сочувствующим. Разобрался.

    shiftOut(dataPin, clockPin, MSBFIRST, B01111001);  
    shiftOut(dataPin, clockPin, MSBFIRST, B0001);

Первая строка - "нули" активируют сегменты. Вторая "еденицы" активируют разряды.

Для многорозрядных чисел - строки повторить последовательно изменяя адрес разряда во второй строке.

gosha2393
Offline
Зарегистрирован: 08.12.2014

Привет, denis64!! Спасибо тебе огромное, что научил пользоваться индикатором!)) у меня такой же как и у тебя, и я думал что никогда не разберусь с ним. 

Но блин всё равно у меня проблемы. хотел сделать стробоскоп с индикацией частоты мегания. отдельно индикация и отдельно стробоскоп работает. А вместе не хочет нормально работать(

Система должна работать так так: включаешь питание горит индикатор с с показанием частоты, регулируешь частоту потенциометром, на индикотре меняются значения, нажимаешь кнопку и светодиод начинает моргать, ещё раз нажимаешь кнопку светодиод перестает моргать.

Система работает так: включаешь питание горит индикатор с с показанием частоты, регулируешь частоту потенциометром, на индикотре меняются значения, нажимаешь кнопку и светодиод начинает моргать а индикатор гаснет, ещё раз нажимаешь кнопку светодиод перестает моргать, а индикатор загорается. 

При детальном рассмотрении выяснил, что при включённом режиме моргания система ведет себя так: загорается светодиод, горит установленной время, выключается, в выключенном состоянии находиться заданное время, на долю секунды высвечивается показания на индикаторе (причем вродебы в пол яркости), и светодиод включается снова. далее цикл повторяется бесконечно.

Думаю что ошибка в коде, но незнаю какая...

/* стробоскоп с индикацией частоты на 4-х разрядный 7-ми сегментный индикатор*/
int x; // переменная для работы с кнопкой
int switchPin = 7; // кнопка
int ledPin = A1; // светодиод
int potPin = A0; // потенциометр
int latchPin = 8; // контакт RCLK на индикаторе
int clockPin = 12; // контакт SCLK на индикаторе
int dataPin = 11; // контакт DIO на индикаторе
boolean lastButton = LOW; // это для нормальной работы кнопки
boolean currentButton = LOW; // это для нормальной работы кнопки
boolean ledOn = false; // это для нормальной работы кнопки
const byte digit[10] =      //seven segment digits in bits
{   
B11000000, //0  
B11111001, //1   
B10100100, //2   
B10110000, //3   
B10011001, //4   
B10010010, //5   
B10000010, //6   
B11111000, //7   
B10000000, //8   
B10010000  //9
};



void setup() {
   //устанавливаем режимы для пинов
  pinMode(potPin, INPUT);
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);  
  pinMode(clockPin, OUTPUT);
  pinMode(switchPin, INPUT);
  pinMode(ledPin, OUTPUT);

}
// boolean тоже для нормальной работы кнопки
boolean debounce(boolean last)
{
  boolean current = digitalRead(switchPin);
  if (last != current)
  {
    delay(5);
    current = digitalRead(switchPin);
  }
  return current;
}


void loop() {
   int pot1 = analogRead(potPin); // считываем значения с потенциометра
  int time = map(pot1,0,1023,20,200); // переводим их во время горения светодиода
    if (x == 1)  // если после предыдущего цикла х остался 1 то он так и остается 1, а если нет то в 0
  {
    x = 1;
  }
  else
  {
    x = 0;
  }
    currentButton = debounce(lastButton);
  if (lastButton == LOW && currentButton == HIGH) // если нажимаем на кнопку
  {
  switch (x) 
  {
   case 0: //если х равен 0 то будет 1
  x = x + 1;
  break;
  case 1: //если х равен 1 то будет 0
  x = x - 1;
  break;
  }
  }
   lastButton = currentButton;

if ( x == 1) // если х равен 1 то включаем светодиод и выключаем его
{
  digitalWrite(ledPin, HIGH);
  delay(time);
  digitalWrite(ledPin, LOW);
  delay(time);
}
  
  int pot = map(time,20,200,20,202); // значения с потенциометра переводим в значения для индикатора и далее делем на разряды
  int x1;
  int x2;
  int x3;
  int x4;
  x4 = pot / 1000;
  x3 = pot /100;
  x2 = (pot / 10) % 10;
  x1 = pot % 10;
 
  // далее отдельно каждый разряд числа выводим на индикатор
  
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, digit[x1]);
  shiftOut(dataPin, clockPin, MSBFIRST, B0001);
  digitalWrite(latchPin, HIGH);
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, digit[x2]);
  shiftOut(dataPin, clockPin, MSBFIRST, B0010);
  digitalWrite(latchPin, HIGH);
    digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, digit[x3]);
  shiftOut(dataPin, clockPin, MSBFIRST, B0100);
  digitalWrite(latchPin, HIGH);
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, digit[x4]);
  shiftOut(dataPin, clockPin, MSBFIRST, B1000);
  digitalWrite(latchPin, HIGH);
}

Как сделать чтобы индикатор всегда был включён?

denis64
Offline
Зарегистрирован: 07.10.2013

Привет gosha2393! Феноменально! Я Забросил свои эксперименты с индикатором летом и вернулся к ним всего лишь 2 дня назад! Это судьба))) Сам вчера хотел задать похожий вопрос:

У меня была такая же почти проблемка. Я хочу сделать часы в автомобиль, такие что бы попеременно показывали время, дату, температуру за бортом, и напряжение питания бортовой сети.
И загвоздка в том что индикатору необходимо динамическое обновление с высокой частотой. И пока микроконтроллер отрисовывает числа на индикаторе - всё нормально, но как только он начинает заниматься ещё чем либо, например выяснением сколько времени, сколько напряжения на аналоговых пинах и прочими вещами.. то у него начинает не хватать времени на обновление индикатора. Вследствие этого некоторые разряды начинают светится тускло.

Я попробовал выполнять всё функции кроме индикации один раз в полсекунды использовав конструкцию типа:
timetemp1 = millis();

if (timetemp2 - timetemp1>500)

{

timetemp2=timetemp1;
// выполнять действия
}

А у тебя мне видится почти такая же причина, я досконально не изучал твой код но думаю что беда в том что ты используешь функцию delay в обработке мигания светодиода, вот в этом месте:
{
digitalWrite(ledPin, HIGH);
delay(time);
digitalWrite(ledPin, LOW);
delay(time);
}
попробуй избавится от всех delay в программе(используя пример на странице http://arduino.ru/tutorials/BlinkWithoutDelay), наверняка они и притормаживают индикацию.

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Выбирайте схему сразу правильно - все выбирают матричные и динамические схемы - у вас что нет денег на регистры? Купите на каждую цифру по регистру и не парьтесь -  процедура вывода будет предельно проста.

gosha2393
Offline
Зарегистрирован: 08.12.2014

Спасибо, как только избавился от delay сразу всё заработало))) спасибо)