Мы же сейчас в нашем эксперименте будем использовать другую микросхему, которую называют «выходной сдвиговый регистр», маркировка ее 74HC595, и в ее data sheet, ее описании, я предлагают разобраться самым стойким, а по умолчанию, мы снова будем рассматривать ее как черный ящик, потому что это не самая простая микросхема, но очень полезная. Ее основное предназначение — это расширение портов. С помощью нее мы можем использовать всего 3 пина Arduino и получать 8 выходов. То есть как это происходит? Мы последовательно, через 1 пин передаем в микросхему 8 бит информации. То есть там, 0, 0, 0, 1 1, 0, 1, в общем, нужные комбинации. Еще один пин служит для того, чтобы синхронизировать эту передачу данных. И третий пин позволяет подать команду на одновременный вывод этих 8 бит на 8 ножках микросхемы. Сейчас я вам покажу схему, по которой я собирал эксперимент, и вы, пожалуйста, очень внимательно ее изучите. За основу схемы я взял один из iii экспериментов. Спасибо ребятам, что когда-то эту сложную схему отрисовали. Я убрал из него кнопку, потому что она будет нам не нужна. Давайте посмотрим что здесь осталось: собственно сам сдвиговый регистр, с улыбкой слева семисегменник, в том виде как он был у нас установлен на макетку, только теперь его ножки подключены не напрямую к Arduino, а к выходам в сдвиговый регистр. Теперь через него он будет получать команды на включение тех или иных сегментов. А сам сдвиговый регистр получает данные и команды через вот эти 3 провода. То есть 8 бит данных в него загружаются, а потом по команде отправляются на выходы, то есть на семисегменник в нашем случае. Также обратите внимание на то, что некоторые из ножек микросхемы, помимо основной земли и питания, также могут быть подключены к земле или питанию, это обусловлено логикой ее работы. Теперь давайте посмотрим на эту страшную схему в сборе и будем рассматривать скетч. Выглядит действительно устрашающе, даже хуже чем на схеме, потому что на схеме, для большей читаемости, некоторые пути сигнала были удлинены, например, 6-ой вывод семисегменника идет через резистор, сначала вот сюда, а потом сюда, и потом только к сдвиговому регистру. Я же этот путь сократил, то есть провод после резистора сразу идет в микросхему. Теперь будем разбираться с программой. В начале, как всегда, определены пины Arduino. В данном случае это пины, управляющие сдвиговым регистром: DATA_PIN 13-й, к нему передаются данные, LATCH_PIN, это так называемый STROKE, который будет давать команду регистру отправить вовне, то есть далее, все 8 бит. И CLOCK_PIN, который служит для синхронизации отправки данных. Затем заведены целых 10 переменных типа byte. Переменные — типа byte, соответственно, можем хранить 1 байт информации, 8 бит, и как раз нам это будет удобно? потому что мы можем сохранить кодировки символов, то есть цифр, которые будем выводить в виде байт. Что я имею ввиду? Для того чтобы отобразить какую-либо цифру, нам нужно включить те или иные сегменты индикатора, а какие-то, соответственно, оставить выключенными. Поскольку сегментов всего 8, считая точку, это можно закодировать в виде 8-ми бит информации, в виде 8-ми нолей и единиц. Для этого эти 10 переменных и созданы. В каждую из них записана комбинация 0 и 1 такие, что при выводе их с выходов сдвигового регистра будут зажигаться ровно те сегменты индикатора, которые составляют данную цифру. То есть d0 отправляет вот такие вот сегменты, которые составят 0, например. d1 включит только 2 сегмента, которые представляют собой 1. И так далее. Для того чтобы записать данные в виде последовательности бит, используется вот такой вот, вот эти вот 2 символа 0b, и далее 8 бит, которые составляют тот самый байт. Давайте смотреть, что происходит далее. В setup я настраиваю все 3 выхода, работающие с микросхемой на выходах, на которые мы будем направлять данные. И устанавливаю соединение с компьютером. Раньше мы уже научились отправлять данные на компьютер, а в данном примере очень удачный случай научиться их получать с компьютера. Именно этим мы далее и занимаемся. Что происходит когда Arduino получает с компьютера какие-то данные? Они сохраняются в специальном буфере, длиной до 64 символов. И с помощью метода available, который определен тоже в стандартной библиотеке и относится к объекту Serial, мы можем посмотреть есть ли в буфере какие-то данные. Соответственно, мы делаем сравнение. Если количество информации в буфере, то есть количество байт > 0, то есть там что-то есть, мы начинаем разбирать что же туда пришло. Здесь мы создаем переменную digit еще одного нового для нас типа char, то есть «символ». Поскольку по последовательному порту Arduino и компьютер обмениваются символами, мы будем сохранять 1 символ. Чтобы его прочитать из буфера, мы используем опять же стандартный метод read, относящийся к объекту Serial. То есть, если у нас в буфере что-то есть, то есть данных > 0, мы сохраняем это в переменную char. А дальше занимаемся тем, что разбираем что же именно пришло. В данном случае нас интересует всего 10 возможных вариантов, 10 цифр. [ПАУЗА] Я пишу: если переменная digit, то есть то, что мы только что прочитали из буфера = 0, мы начинаем работать с микросхемой. Для начала записи данных в нее нужно вот этот вот LATCH_PIN поставить в положение LOW. После чего я использую стандартную функцию, предоставляемую Arduino, shiftOut. Она как раз предназначена для последовательного вывода с каких-то битов информации на определенный пин. То есть, я ей сообщаю на какой пин отправлять данные, сообщаю какой пин является пином для синхронизации. Затем, вот этот вот параметр LSBFIRST говорит о том, с какого бита, со старшего или с младшего, начинать отправку данных. В нашем случае используем такой вариант. А затем, собственно, сообщаю те данные, которые нужно отправить. Если мы прочитали в буфере 0, то мы оправляем переменную в d0, в которой хранится комбинация 0 и 1, которая включает сегменты, составляющие 0. После чего, работа с микросхемой кончается отправкой HIGH на вот этот вот LATCH_PIN. В этот момент микросхема на свои 8 выходов подаст соответствующие сигналы, которые к ней пришли. И дальше мы обнаруживаем еще одну новость, касающуюся использования оператора if. Помните, ранее мы могли использовать его в совсем короткой форме и сделать какие-то действия, только если условие выполнено. if «что-то истинно, сделать то-то». Затем добавилось альтернативное действие, которое нужно предпринять, если условие не выполнено. Мы использовали оператор, ключевое слово else. На самом деле, их можно скомбинировать, построить вот такую конструкцию else if, то есть «иначе если». Как это выглядит в целом? Если выполнено условие 1, то нужно выполнить вот этот набор действий. Иначе, мы хотим проверить другое какое-то условие. То есть, условие № 2, в данном случае, пришла ли к нам 1, символ 1. Если да, будем выполнять вот этот фрагмент. Иначе, если это было не 0 и не 1, мы проверим третий вариант и выполним третий набор действий. Обратите внимание на то, что они все отличаются в единственном месте, где мы передаем данные на микросхему, вот эти вот переменные: d0, d1, d2; просто передаем разные наборы данных. На самом деле это все можно сделать гораздо изящней, но пока что я не стану вас перегружать дополнительной информацией, и мы сделаем вот таким вот, прямолинейным способом. [ПАУЗА] Таким же образом у нас все происходит вплоть до получения 9, в случае которого мы будем передавать на микросхему содержимое переменной d9. Ну а теперь давайте загрузим в наш новый громоздкий скетч нашу новую громоздкую схему и посмотрим как это все вместе работает. Сейчас я запущу монитор порта. Обращаю ваше внимание на то, что у меня здесь выбрано «9600» бод, так же как я указал в скетче. А здесь указано «Новая строка», то есть, чтобы отправку закончить, нужно передать символ новой строки. Вот здесь вот находится строка для отправки данных в последовательный порт, и сейчас я буду отправлять различные цифры. Отправим 1. Семисегменник показал единичку. 5, 4, 0, 9 — все отлично работает. Отдельно хочу обратить ваше внимание на то, как мы сравниваем переменную digit, которая у нас типа char, то есть символ, с цифрами. Цифры у нас заключены в одинарные кавычки, а это значит, с точки зрения компилятора, что мы сравниваем digit не с цифрой 9, а с кодом цифры 9 и с таблицей символов. Если вы раньше никогда не сталкивались с кодировкой букв, символов и так далее, посмотрите в дополнительных материалах, это очень важный момент, и... Дело в том, что код символа 9 в таблице символов это не 9, а какое-то другое число. Мы даже сейчас можем его не знать, просто, мы с компьютера отправляем 9, оно кодируется определенным образом, а потом мы сравниваем с символом 9, то есть тот ли код, смотрим тот ли код пришел, который обозначает цифру 9. Уже к данному моменту недели вы получили гигантское количество новой информации: о том, как считывается аналогово-цифровой сигнал на входах к Arduino, о том, как обмениваться данными с компьютером, отправлять их и получать. Научились делать более сложные ветвления алгоритма с помощью else if, попробовали новые устройства индикации, в том числе и звукового, а также познакомились с микросхемами, который очень часто выступают полезными посредниками на пути электрического сигнала. Теперь вы можете находить их документацию, по ней понимать для чего, какая ножка нужна, и использовать для дела, применять их в схему. Впереди у нас основной проект, а также еще и несколько приятных мелочей.