4х разрядный 7-сегментный индикатор нужен драйвер
- Войдите на сайт для отправки комментариев
Вс, 22/06/2014 - 18:55
Здравствуйте, уважаемые. ПОдскажите, пожалуйста. есть такой (извиняюсь за ссылку ) индикатор 7 сегментов на 4 разряда. Хочу подключить его к ардуине для того, чтобы выводить на него скорость. (бортовой компьютер).
Я так понимаю, мне нужен драйвер, потому что если без него - очень много портов будет занято....подскажите, как лучше его подключить? Что для этого нужно использовать? Если можно, то дайте конкретные маркировки микросхем....может у кого есть схема подключения или примеры управления...буду очень благодарен.
P.S.: я не прошу сделать за меня. Хочу разобраться сам, ищу в Интернете уже долго, ничего не пойму пока....
Приношу извинения...пришлось отходить от компьютера. Благодарю за обширный ответ.
Нет, я не студент медунивера =) кардиостимулятор делать не буду) курсовую не пишу.
Вот семисегментник, который я заказывал у китайцев (ибэй.ком)
дело в том, что здесь показано как подсоединить напрямую к ардуине. Для этого я задействую 12 портов....А если использовать микросхему для сдвига регистров, то я потрачу 2-3 цифровых порта.
Значит все же рекомендуете подключать напрямую к ардуине, без драйверов?
А вот есть элемент....только я так понял, он только для одного разряда? Для моего 4х разрядного не пойдет?
http://amperka.ru/product/cd4026-segment-driver
Нет, Ваза у меня нет) Ауди 100 С3. Под нее и делается. Покупать не вариант. Ардуину, думаю, осилим!) И индикатор победим!) Импульсы буду брать с цифрового одометра. Уже приобрел у китайцев. Он прикручивается на коробку передач вместо троса спидометра. На нем 3 контакта: +, - и сигнальный.
Хорошо, начнем с поиска транзисторов и подключения напрямую. Думаю скоро новые вопросы появятся))) Благодарю за ответы)
код какой-то есть
#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 км/час....интересно, насколько быстро будет "накручиваться" значение? Или я буду наблюдать этот процес? Интересно, а зимой, когда индикатор замерзнет....скорость не упадет? Это ж не слд-дисплей...
понятно значит схемы ВАЗ-2170 вам в помошь
Чем она мне может помочь? Я что-то не пойму...
Хорошо. Спасибо за советы. Тему не закрывайте. Соберу детали, попробую подключить, а там отпишусь....чтобы продолжить.
я не пойму, зачем мне схема от ВАЗ-2170? Ведь у меня есть схема от ауди 100....Или я Вас просто не понял? Объясните, пожалуйста.
На ибее есть уже смонтированные сборки с драйвером MAX7219, подключаются по SPI, поддерживают каскадное включение и есть отличные библиотеки к ним...
ищущий да обрящет
На ибее есть уже смонтированные сборки с драйвером MAX7219, подключаются по SPI, поддерживают каскадное включение и есть отличные библиотеки к ним...
К сожалению уже купил этот. Ничего, победим и такой вариант. На днях попаду на радиорынок, закуплю деталек и приступлю.
Так-с, сегодня приехали диоды, с ними и сдвиг-регистр (но он пока будет ждать своего череда). Хочу подключить напрямую...сейчас буду пытаться это сделать.
А где делись первые ответы???? Там же так подробно было все расписано.... =( Арт100, Вы удалили свои ответы???
Помогите подключить 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 регистра (все сегменты)
дубль
Для начала попробуйте со стандартной библиотекой SPI...если ничего не получится, надо будет понять по какой именно схеме собрана ваша плата, и тогда уже думать
С платой и сдвиговыми регистрами (СР) понятно, они подключены таким образом:
а) первый СР задействован только на 4 ноги индикатора
если смотреть с "фронта" ноги такие:
4 * * 3 2 *
* * * * * 1
б) второй СР задействован полностью
* 1 6 * * 2
5 4 8 3 7 *
Не понятно какую комбинацию уровней подавать для вывода чего нибудь определённого уже на самом этом 12 ногом индикаторе. Ничего толкового кроме абракатабры не получается.
_______________________-
Добавлено чуть позже:
Ага спасибо всем сочувствующим. Разобрался.
shiftOut(dataPin, clockPin, MSBFIRST, B01111001); shiftOut(dataPin, clockPin, MSBFIRST, B0001);Первая строка - "нули" активируют сегменты. Вторая "еденицы" активируют разряды.
Для многорозрядных чисел - строки повторить последовательно изменяя адрес разряда во второй строке.
Привет, 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); }Как сделать чтобы индикатор всегда был включён?
Привет 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), наверняка они и притормаживают индикацию.
Выбирайте схему сразу правильно - все выбирают матричные и динамические схемы - у вас что нет денег на регистры? Купите на каждую цифру по регистру и не парьтесь - процедура вывода будет предельно проста.
Спасибо, как только избавился от delay сразу всё заработало))) спасибо)