Объяснение программы для Arduino
Полный код программы и видео, демонстрирующее работу схемы, приведены в конце статьи, здесь же мы кратко рассмотрим основные фрагменты кода программы.
Первым делом в программе нам необходимо подключить библиотеки для использования возможностей протокола I2C и для работы с ЖК дисплеем.
Arduino
#include<Wire.h>
#include <LiquidCrystal.h>
1 |
#include<Wire.h> #include <LiquidCrystal.h> |
После этого определим (объявим) ряд макросов. В первом макросе будет записан адрес шины (адрес ведомого – в нашем случае это модуль PCF8591) для протокола I2C, а во втором – адрес первого входного контакта (AIN0) модуля PCF8591 (он подключен к потенциометру в схеме).
Arduino
#define PCF8591 (0x90 >> 1)
#define AIn0 0x00
1 |
#define PCF8591 (0x90 >> 1) #define AIn0 0x00 |
Далее сообщим плате Arduino, к каким ее контактам подключен ЖК дисплей и инициализируем переменную, в котором будем хранить значение, считываемое с аналогового контакта модуля PCF8591.
Arduino
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
int Value = 0;
1 |
constintrs=12,en=11,d4=5,d5=4,d6=3,d7=2; LiquidCrystallcd(rs,en,d4,d5,d6,d7); intValue=; |
В функции void setup() мы инициализируем связь по протоколу I2C и ЖК дисплей для работы в режиме 16х2.
Arduino
void setup()
{
Wire.begin();
lcd.begin(16,2);
}
1 |
voidsetup() { Wire.begin(); lcd.begin(16,2); } |
В функции void loop() мы начнем обмен данными с модулем PCF8591 с помощью команды Wire.beginTransmission. Далее мы дадим команду модулю PCF8591 на считывание аналоговых значений на своем входе AIN0 (вторая строка в коде). Затем мы завершим передачу с помощью функции Wire.endTransmission и запросим измеренное аналоговое значение (Wire.requestFrom) с модуля PCF8591.
Arduino
void loop()
{
Wire.beginTransmission(PCF8591);
Wire.write(AIn0);
Wire.endTransmission();
Wire.requestFrom(PCF8591, 1);
1 |
voidloop() { Wire.beginTransmission(PCF8591); Wire.write(AIn0); Wire.endTransmission(); Wire.requestFrom(PCF8591,1); |
Далее мы сохраним принятое с модуля PCF8591 значение в переменной Value и выведем это значение на экран ЖК дисплея.
Arduino
Value=Wire.read();
lcd.print(«ADC Value=»);
lcd.print(Value);
delay(500);
lcd.clear();}
1 |
Value=Wire.read(); lcd.print(«ADC Value=»); lcd.print(Value); delay(500); lcd.clear();} |
После подачи питания на схему и загрузки программы в плату Arduino вы сможете наблюдать считываемое аналоговое значение на экране ЖК дисплея. Изменять это значение можно с помощью ручки потенциометра.
Характеристики
Характеристики у обоих устройств KY-037 и KY-038 достаточно скромные, и отличающихся, как было сказано ранее, между собой только размером микрофона.
- питание — 3,5–5В;
- цифровой выход — есть, однобитный, работающий в режиме индикации наличия звука или тишины;
- аналоговый — присутствует, с градацией получаемого сигнала в 1024 уровня;
- вес — в среднем 12..13 грамм;
- предел чувствительности — до 5 метров;
Принципиальная схема и выводы устройства:
Сразу хочется заметить, что названые детекторы, регистрируют только достаточно громкие звуки и не очень чувствительны к их переходным состояниям, к примеру, используемым в словах или фразах. То есть, сделать выключатель или активатор реагирующий на хлопок и свист гораздо проще, чем запрограммировать систему распознавания голосовых команд с применением KY-037 или KY-038. Некоторые идеи по осуществлению требуемой функциональности будут представлены далее.
Обратите внимание на «регулятор чувствительности» отмеченный на фото платы. С его помощью можно варьировать значение характеристики, улучшая «слух» детектора, в установленных пределах
Что такое ULN2803?
El ULN2803 — это микросхема, интегральная схема с традиционной DIP-упаковкой, как и многие другие. То есть с двумя стопками булавок по бокам. Что ж, до сих пор это может показаться очень похожим на многие другие, но внутри у него нет обычных логических дверей, мультиплексоры, фильтры, модули датчиков тока, регистр сдвига, ни микроконтроллер…
Внутри ULN2803 вы найдете драйверы с серией транзисторов, некоторые устройства, о которых я уже говорил в других случаях, с разными типами, например: МОП-транзистор, BC547, 2N3055, 2N222, И т.д.
Что такое транзистор Дарлингтона или пара?
El Транзистор дарлингтона Это не транзистор как таковой, а пара из них, соединенных особым образом. Два соединенных биполярных транзистора образуют пару Дарлингтона, которая позволяет току, усиленному первым транзистором, входить в базу второго транзистора и снова усиливаться.
Этот тип усиления использовался с двумя отдельными транзисторами, но инженер из Bell Labs по имени Сидни Дарлингтон Он запатентовал эту комбинацию в 1952 году. Идея заключалась в том, чтобы разместить два или три транзистора на одном монолитном кристалле. Идея похожа на идею создания микросхемы или интегральной схемы, хотя это достижение не признано ему, как вы хорошо знаете …
Пара Дарлингтона ведет себя как один обычный транзистор, то есть после объединения двух транзисторов у нее все еще есть единая база, коллектор и эмиттер. Только то, что коэффициент усиления по току будет комбинированным и, следовательно, больше, чем при использовании только одного транзистора. В частности, считается, что коэффициент усиления Дарлингтона приблизительно является результатом произведения обоих коэффициентов усиления транзисторов, используемых по отдельности.
Лас- преимущество Понятно, что использовать эту пару Дарлингтона — получить большой выигрыш по току. Это позволяет управлять токами большей величины с небольшим током базы. Но у него также есть свои недостатки, такие как больший фазовый сдвиг на высоких частотах, чем при использовании одного транзистора, что делает их использование в цепях отрицательной обратной связи несколько нестабильным.
И это не единственный связанная проблема к паре Дарлингтона, поскольку падение напряжения между базой и эмиттером больше из-за существующего двойного перехода (эквивалентно сумме обоих падений обоих переходов).
La напряжение насыщения что у них есть еще одно ограничение. На практике это означает большую рассеиваемую мощность, то есть больше тепла. И, помимо недостатков, снижение скорости переключения является еще одним ограничивающим фактором, и его нельзя использовать в схемах, где требуется большая маневренность. Первый транзистор не может активно подавлять ток базы второго, замедляя отключение …
Эти транзисторы Дарлингтона можно найти как инкапсулированный отдельно, то есть просто парой, или в интегральных схемах с несколькими транзисторами Дарлингтона, как в случае с ULN2803.
Таблица данных и распиновка ULN2803
Управление ULN2803 очень простое, и его сборка также очень проста. Эта интегральная схема имеет набор 8 ворот заднего хода внутри реализован с помощью транзистора Дарлингтона, в данном случае с использованием транзисторов NPN. Это позволяет подключать к их контактам другие устройства, которые имеют большой спрос на ток, например шаговые двигатели посредством водитель, реле, И т.д.
Следовательно, ULN2803 — это cочень универсальная схема который можно увидеть во множестве проектов производителей как выход цифровой схемы для управления исполнительными механизмами, двигателями различных типов и другими компонентами. Все они могут работать с низким током, допускающим высокие токи потребления, такие как 500 мА или 0.5 А, что для электроники является очень высоким значением.
Поддерживает напряжения питания и цифровых выходов до 50в, для преобразования цифровых сигналов 5 В TTL в любое напряжение до 50 В. Эта практическая функция известна как драйвер, то есть он действует как тип элемента, который изолирует, как если бы это был электронный барьер, защищая цифровые логические схемы от других, требующих более высоких напряжений и интенсивностей.
Вы можете увидеть все функции и распиновка в даташите производитель. Например, вот два самых распространенных:
- TI или Texas Instruments ULN2803
- СТ Микроэлектроника ULN2803
Цена и где купить
Найти его не так уж сложно, если знать, где искать. Его цена дешевая, и вы даже можете купить в чипгруппах ULN2803 если вам нужно несколько. Например, один из самых дешевых — это Упаковка из 10 шт ULN2803A от Amazon которые вы можете купить здесь примерно за 1 евро.
Step 7:
Setting up the PCF8591 for differential ADC is a simple matter of changing the control byte. If you turn to page seven of the data sheet, then consider the different types of analogue input programming. Previously we used mode ’00’ for four inputs, however you can select the others which are clearly illustrated, for example the image.
So to set the control byte for two differential inputs, use binary 00110000 or 0x30. Then it’s a simple matter of requesting the bytes of data and working with them. As you can see there’s also combination single/differential and a complex three-differential input. However we’ll leave them for the time being.
Hopefully you found this of interest, whether adding a DAC to your experiments or learning a bit more about ADCs. Please consider ordering your PCF8591 from PMD Way.
This post brought to you by pmdway.com – everything for makers and electronics enthusiasts, with free delivery worldwide.
Схема подключения
На uln 2003 схема подключения до боли проста и не включает никаких компонентов. Главное, не перепутать вход с выходом и общий вывод, в остальном все и так ясно. Но все же для наглядности стоит повторить схему на примере с шаговым двигателем с питанием от 12 до 24 В. Общий провод от +24В подключается на 9 вывод и к центральному отводу обмоток двигателя, все остальные оп порядку согласно полюсам. Управление двигателем осуществляется по аналогичным линиям, только со входа МС.
При работе в таком режиме вероятность спалить выходной транзистор достаточно большая, потому что короткое замыкание в двигателе никто еще не отменял, точно также, как и клин ротора, из-за чего ток может существенно возрасти. Поэтому в каждую линию управления по выходу можно поставить шунт и обрисовать его схемой защиты от КЗ. Это зависит от конкретной задачи и типа устройства, в котором эта микросхема применяется.
Key features of PCF8574 I2C I/O expansion
- 8 bi-directional data lines
- Loop-thru feature allows expansion of up to 8 modules / 64 data lines
- I2C interface with jumper adjustable addresses
- Interrupt output capability
- 3.3V and 5V compatible.
A common requirement when working with MCUs is the need to add more digital I/O than the device supports natively. The PCF8574 is one of the more popular methods of adding lines as it uses the I2C bus that requires only 2 lines on the MCU. It provides 8 additional digital I/O lines, which are easily expandable up to 64.
I2C Interface
The module has an easy-to-use I2C interface that can be configured to use any one of eight different I2C addresses if you want to use multiple modules in the same system or if you run into an address conflict with another device.
There are three address jumps (A0-A2) that determine which I2C address to use. As shipped, these jumpers are all set to the ‘-‘ side, which is ground or LOW, as shown in the picture. The ‘+’ side is Vcc or HIGH.
I/O Functionality
The I/O is defined as quasi-bidirectional. A quasi-bidirectional I/O is either an input or output port without using a direction control register. When set as inputs, the pins act as normal inputs do. When set as outputs, the PCF8574 device drives the outputs LOW with up to 25mA sink capability, but when driving the outputs HIGH, they are just pulled up high with a weak internal pull-up. That enables an external device to overpower the pin and drive it LOW.
The device powers up with the 8 data lines all set as inputs.
When using the pins as inputs, the pins are set to HIGH by the MCU, which turns on a weak 100 uA internal pull-up to Vcc. They will read as HIGH if there is no input or if the pin is being driven HIGH by an external signal but can be driven LOW by an external signal that can easily override the weak pull-up.
If used as outputs, they can be driven LOW by the MCU by writing a LOW to that pin. A strong pull-down is turned on and stays on to keep the pin pulled LOW. If the pin is driven HIGH by the MCU, a strong pull-up is turned on for a short time to pull the pin HIGH quickly, and then the weak 100uA pull-up is turned back on to keep the pin HIGH.
If the pins are set to be outputs and are driven LOW, it is important that an external signal does not also try to drive it HIGH or excessive current may flow and damage the part.
Whenever the internal register is read, the value returned depends on the actual voltage or status of the pin.
The I/O ports are entirely independent of each other, but they are controlled by the same read or write data byte.
Interrupt Output
The interrupt open-drain output pin is active LOW. It is normally pulled HIGH using a pull-up resistor and is driven low by the PCF8574 when any of the inputs change state. This signals the MCU to poll the part to see what is going on. If connecting this pin, enable the internal pull-up resistor on the MCU or add an external pull-up of 10K or so.
If using interrupts with multiple modules, since they are open drain they can be tied together if a single interrupt back to the MCU is desired.
Module Connections
The connections to the module are straightforward.
- Supply 3.3 or 5V power and ground.
- Connect I2C SCL and SDA lines to the same on the MCU.
- If used, connect the INT line to an interrupt input on the MCU and use a pull-up resistor.
I write a library to use i2c pcf8574 IC with Arduino and esp8266.
So can read and write digital value with only 2 wires (perfect for ESP-01).
I try to simplify the use of this IC with a minimal set of operations.
How I2c Works
I2C works with its two wires, the SDA(data line) and SCL(clock line).
Both these lines are open-drain but are pulled up with resistors.
Usually, there is one master and one or multiple slaves on the line, although there can be multiple masters. We’ll talk about that later.
Both masters and slaves can transmit or receive data. Therefore, a device can be in one of these four states: master transmit, master receive, slave transmit, and slave received.
Аварийное электропитание PCF8563
Возвращаясь к схеме из datasheet на PCF8563 — обратите внимание на силовую часть:
Отмеченная часть схемы — это аварийное электропитание системы. В случае отсутствия питания Vdd ток будет течь от большого суперконденсатора (он помечен как 1F).
Или можно сделать так:
Примечание.Напряжение питания проходит через диод, чтобы предотвратить разряд конденсатора; Если вы используете обычный диод (например, 1n4148), напряжение Vdd, питающее PCF, упадет примерно на 0,6 — 0,7 В (диод будет «потреблять» его); для меньшего падения вы можете использовать, например, диод Шоттки.
Резистор R1 ограничивает ток, заряжающий конденсатор. Согласно закону Ома:
например, для источника питания R1 = 100 Ом, Vdd = 5 В и диода 1n4148 ток, протекающий на/от конденсатора, будет равен:
Это немного, но помните, что стабилизатор Arduino (то есть Vdd) также имеет ограниченную мощность.
Конденсатор должен иметь максимально допустимое напряжение (Vdd-0,6 В) — при условии, что падение на диоде составляет 0,6 В; ПРИМЕЧАНИЕ: для Arduino и Vdd = 5v это должен быть двойной суперконденсатор, например:
Чем меньше R1, тем больше зарядный ток, но больший ток будет взят из источника Vdd. Для упомянутого конденсатора R1 = 100 Ом и 1Ф постоянная времени будет:
Через 100 секунд конденсатор разрядится до 2/3, а полностью только через 8 минут. Я думаю, что в случае часов это разумное значение.
Конденсатор напрямую подключен к микросхеме. Это не проблема, учитывая, что RTC использует микроамперы (например, 800uA с включенным интерфейсом) или только наноамперы (например, 550nA с отключенным интерфейсом) — этого достаточно.
PCF8574 — I2C модуль для LCD на базе HD44780
Микросхема PCF8574/PCF8574T обеспечивает расширение портов ввода/вывода для контроллеров через интерфейс I2C и позволит легко решить проблему нехватки цифровых портов. При использовании модуля как расширитель портов ввода/вывода следует учитывать то, что вывод Р3 имеет инверсный выход с открытым коллектором.
Микросхема может использоваться для управления ЖК дисплеем под управлением контроллера HD44780, в 4-х битном режиме. Для этой цели на плате установлена микросхема PCF8574, которая является преобразователем шины I2C в параллельный 8 битный порт.
Плата модуля разведена таким образом, чтобы ее можно было сразу подключить к ЖКИ. На вход подается питание и линии I2C. На плате сразу установлены подтягивающие резисторы на линиях SCL и SDA, потенциометр для регулировки контрастности и питание самого дисплея. Джампер справа включает/отключает подсветку.
Step 5: Using the ADCs (analogue-to-digital Converters)
If you’ve used the analogRead() function on your Arduino (way back in Chapter One) then you’re already familiar with an ADC. With out PCF8591 we can read a voltage between zero and the Vref and it will return a value of between zero and 255 which is directly proportional to zero and the Vref.
For example, measuring 3.3V should return 168. The resolution (8-bit) of the ADC is lower than the onboard Arduino (10-bit) however the PCF8591 can do something the Arduino’s ADC cannot. But we’ll get to that in a moment. First, to simply read the values of each ADC pin we send a control byte to tell the PCF8591 which ADC we want to read. For ADCs zero to three the control byte is 0x00, 0x01, ox02 and 0x03 respectively.
Then we ask for two bytes of data back from the ADC, and store the second byte for use. Why two bytes? The PCF8591 returns the previously measured value first – then the current byte. (See Figure 8 in the data sheet). Finally, if you’re not using all the ADC pins, connect the unused ones to GND. The following example sketch simply retrieves values from each ADC pin one at a time, then displays them in the serial monitor:
#include "Wire.h" #define PCF8591 (0x90 >> 1) // I2C bus address #define ADC0 0x00 // control bytes for reading individual ADCs #define ADC1 0x01 #define ADC2 0x02 #define ADC3 0x03 byte value0, value1, value2, value3; void setup() { Wire.begin(); Serial.begin(9600); } void loop() { Wire.beginTransmission(PCF8591); // wake up PCF8591 Wire.write(ADC0); // control byte - read ADC0 Wire.endTransmission(); // end tranmission Wire.requestFrom(PCF8591, 2); value0=Wire.read(); value0=Wire.read(); Wire.beginTransmission(PCF8591); // wake up PCF8591 Wire.write(ADC1); // control byte - read ADC1 Wire.endTransmission(); // end tranmission Wire.requestFrom(PCF8591, 2); value1=Wire.read(); value1=Wire.read(); Wire.beginTransmission(PCF8591); // wake up PCF8591 Wire.write(ADC2); // control byte - read ADC2 Wire.endTransmission(); // end tranmission Wire.requestFrom(PCF8591, 2); value2=Wire.read(); value2=Wire.read(); Wire.beginTransmission(PCF8591); // wake up PCF8591 Wire.write(ADC3); // control byte - read ADC3 Wire.endTransmission(); // end tranmission Wire.requestFrom(PCF8591, 2); value3=Wire.read(); value3=Wire.read(); Serial.print(value0); Serial.print(" "); Serial.print(value1); Serial.print(" "); Serial.print(value2); Serial.print(" "); Serial.print(value3); Serial.print(" "); Serial.println(); }
Upon running the sketch you’ll be presented with the values of each ADC in the serial monitor. Although it was a simple demonstration to show you how to individually read each ADC, it is a cumbersome method of getting more than one byte at a time from a particular ADC.
Некоторые рекомендации
Определение лучше производить, выявив высоту тонов и длительность произношения в каждом конкретном случае, под индивидуальные характеристики голоса человека. Впоследствии, ввести в скетч усреднение полученных данных на аналоговом входе, алгоритмы которых легко можно найти через поисковые системы. Последнее действие нужно для случаев, когда оператор охрип, осип, устал или находится под действием еще каких-либо факторов, изменяющих вокальные характеристики.
Разбор последовательности звуков проводится не точным соответствием, а логическими условиями, по причине пропуска некоторых в разговорной речи. То есть, предположим, существует массив, содержащий последовательность значений гласных и шипящих, аналогичных используемым в самой команде. Тогда разбор голоса будет выглядеть следующим образом:
Для качественного распознавания речи используют различные более сложные алгоритмы. Например нейросетевой с предварительным разложением в ряд Фурье:
- Разделить фразу на отдельные слова, отслеживая промежутки тишины;
- Разложить запись каждого отдельного слово в ряд Фурье — таким образом определятся коэффициенты, соответствующие отдельным частотным составляющим;
- Пропустить вычисленные в п.2 коэффициенты через нейросеть, которая на выходе даст значение слов.
Для выполнения такого обучения на вход сети подают эталонное слово, а затем с помощью специальных алгоритмов (например, обратного распространения ошибки) подбирают значения структурных коэффициентов нейронной сети, при которых нейросеть выдаёт правильное значение на выход.
Схемотехника
Для наших экспериментов мы соберем относительно несложную конструкцию, состоящую из двух блоков: блока управления и блока приемника. Блок управления соберем на STM32F030, добавим к нему энкодер, дисплей OLED и восемь кнопок. От кнопок можно вовсе отказаться, но с ними управлять приемником намного удобнее. За клавиатуру будет отвечать PCF8574, очень удобная микросхема — расширитель портов с I2C-интерфейсом. Введение расширителя портов хоть и усложняет схему, но упрощает разводку платы и опрос кнопок. Питать все это дело удобно с помощью LiPO-аккумулятора, поэтому добавим туда еще контроллер заряда и DC/DC-преобразователь на RT9136 для питания контроллера. Использование активного преобразователя целесообразно в плане повышения КПД.
Схема приемника
Выходной мощности SI4735 недостаточно для раскачки стандартных 32-омных наушников, поэтому нужен аудиоусилитель, даже два, так как у нас стерео. В качестве усилителя использована микросхема TDA2822 (PDF) в стандартном включении. Это не лучший вариант по двум причинам: во‑первых, у нее слишком высок коэффициент усиления, а во‑вторых, на мой вкус, она слишком шумит. Лучше на эту роль подойдет LM4863 (PDF), но у меня ее не оказалось под рукой. Тем не менее TDA2822 недурно справляется со своей задачей.
В заводских решениях обычно используется УВЧ и магнитная антенна, мы же поступим проще: поставим на вход фильтр 5-го порядка с частотой среза и будем использовать полноразмерную антенну — все равно на штырь в квартире можно ловить только помехи, FM и пару китайских станций в хороший день. Что же касается FM-входа, то ему комфортно и без входных цепей. Кроме того, саму SI4734 вместе со входными цепями мы поместим в экран из жести (плата двухсторонняя, вторая сторона — сплошная медь), благо это совсем не сложно. Использование внешней полноразмерной антенны сильно снизит наводки от цифровой части и избавит от УВЧ.
Что касается этой самой цифровой части, то тут каких‑либо особенностей нет. Схема, платы и прочее лежат на GitHub. Вешать постоянно обновляющийся дисплей и клавиатуру на одну шину с SI4734 — не очень хорошая идея из‑за возможных помех, однако остановка контроллера и выключение дисплея на слух не вносит изменений. Отсюда можно сделать вывод, что в городе гораздо больший вклад в качество приема вносит зашумленность эфира.
Оформлено это в достаточно минималистичном стиле, впрочем, корпуса я делать никогда не любил. У меня получилось что‑то среднее между макетом и законченным устройством, но транспортировку и полевое использование приемник пережил не поморщившись.
info
Предвидя вопросы, скажу сразу, что управляющий блок можно собрать и на Blue Pill, и на ARDUINO, в последнем случае на Али можно купить уже собранную плату. Обойдется это примерно в 3000 рублей. А за дополнительные деньги к этому делу можно докупить корпус. Но это не наш метод, мы же собрались поковыряться с SI4734!
Простые схемы использования
Чтобы продемонстрировать работу датчиков звука с Arduino можно собрать простую схему:
Резистор используемый в ней, берется номиналом в 220 Ом. Основная функциональность выражается в зажигании светодиода при обнаружении громких звуков и гашения его в случае тишины. Скетч:
Изменяя время задержки, между включением и гашением светодиода, а также пробным путем выведя значения «тишины» SilenceMax и SilenceMin, можно добиться работы приведенной схемы в роли детектора движения по звуку. Конечно, качество определения у него будет низкое, но вполне позволяющее применять конструкцию в цепях управления освещением темных мест. Достаточно добавить фоторезистор для определения текущего уровня видимости, в роли которого можно использовать специальную плату Arduino или обычный радиоэлектронный компонент, подключаемый через делитель.
Как видно по схеме, в ней используются два резистора – R1 на 10 кОм и R2 220 Ом. Светодиод LED в финальном варианте можно заменить на релейную группу, для подачи питания на «взрослые» лампы 220В. Скетч, управляющий всем перечисленным хозяйством:
Задержка подбирается экспериментально, в зависимости от конкретной чувствительности KY-037 или KY-038, а также их настроек, производимых регулятором на плате устройства.
Увеличение количества цифровых GPIO входов/выходов
Плата увеличения количества GPIO портов.
Для увеличения количества цифровых входов можно воспользоваться добротной платой расширителя GPIO на 8 Входов/Выходов. Она хорошо документирована, исполнена на высоком техническом уровне. Хотя, ценник не Aliexpress-а. При изготовлении нескольких сотен устройств, себестоимость конечного устройства существенно вырастет.
Посмотрим, что есть на сей счет есть у китайских собратьев. А у них конечно-же что-то есть и недорого.
8-канальный расширитель GPIO на чипе PCF8574 с DIP переключателями для назначения I2C адреса
8-канальный расширитель GPIO на чипе PCF8574 с джамперами для назначения I2C адреса. Эту плату можно каскадировать.
Конструктивно синие модули удобно каскадировать, втыкая один в другой. Адрес устройств удобно задается либо DIP переключателями, либо джамперами. Возможно подключение внутренних pullup резисторов на +5V.
16-ти канальный расширитель GPIO на чипе PCF8575
Старший брат TI PCF8575 позволяет получить 16 GPIO портов за цену в два раза выше. Но реализация платы попроще. никаких DIP переключателей для выбора адреса I2C. Зато 16 каналов в компактном исполнении.
Аналогичный чип от компании Microchip на 16 входов для расширения количества GPIO портов, MCP23017. Есть вариант для шины I2C и более шустрый для SPI (MCP23S17). Китайские продавцы нередко указывают в описании товара чип MCP23S17, однако по фото платы видно, что чип MCP23017
Обращайте на это внимание! Аналогичный чип на 8 портов — MCP23008
MCP23017 плата увеличения GPIO для микроконтроллеров
Цена этого варианта модуля в районе 1,5 USD. Исполнение платы попроще обойдется почти в два раза дешевле. Чип позволяет обеспечить увеличение GPIO на 8+8=16. Как и чип от Texas Instruments помимо входов для подключения устройств есть два выхода прерываний на каждый блок из 8 устройств. Этот чип позволяет работать на частоте до 1,7 МГц и 10 MHz для версии под шину SPI, в отличие от чипа PCF8574 для которого верхний предел 400 кГц. Также возможно подключение внутренних pullup резисторов на +5V. Схема подключения платы к ESP8266 разобрано здесь.
SX1509 модуль для увеличения количества GPIO.
Ещё один 8+8=16-ти канальный расширитель количества GPIO с Aliexpress на чипе SX1509. Библиотека и описание от Sparkfun. Чип дороже, чем ранее представленные. По ТТХ чип очень похож на ранее рассмотренные варианты. Работает на частоте 400 кГц. Есть встроенная поддержка ШИМ (PWM) на выходах.
Чип «заточен» для работы с LED и клавиатурой. В части LED из-за наличия ШИМ позволяет управлять яркостью светодидов, выполнять затухание, моргание и пр. Есть в наличии выход INT для трансляции прерываний микроконтроллеру. Поддерживаются встроенные pull-up, pull-down резисторы на входах.
GPIO expander от Fairchild (ON Semiconductor) FXL6408UMX. Аналогично 8 портов управляемых по шине I2C. Datasheet.
Прошивка
В сети достаточно руководств по сборке приемников на SI4735, однако большинство авторов делают акцент на схемотехнику и сборку на макете, после чего туда заливают один из вариантов готовой прошивки. Мы же попробуем разобраться, как написать такую прошивку самостоятельно почти с нуля, поэтому все нижесказанное достаточно легко перенести на любой другой микроконтроллер, лишь бы у него хватало памяти для хранения патча.
Итак, что же за зверь SI4734 и с чем его едят? Этот чип управляется по шине I2C, и каждая посылка представляет собой адрес микросхемы (с битом переключения запись/чтение), 1 байт команды и до 7 байт аргументов. У каждой команды свое количество аргументов, впрочем, даташит говорит, что посылки можно сделать и фиксированной длины, если вместо неиспользуемых аргументов слать . Для наших целей понадобится не так много команд, поэтому мы можем позволить себе написать для каждой свою функцию. Результатом выполнения команды можно считать ответ, состоящий из байта статуса и до 7 байт собственно ответа, причем и здесь допускается унификация длины: можно читать по 8 байт, все неиспользуемые будут .
Но тут есть нюанс: команда выполняется не мгновенно, а с задержкой, до истечения которой микросхема будет отвечать только нулями. Поэтому, когда нам необходим ответ, мы с некоторой периодичностью будем его считывать, пока первый байт ответа не будет равен , что свидетельствует о завершении исполнения команды. Следом можно считать байты ответа и/или отправлять следующую команду.
Для отправки и чтения пакетов по I2C мы будем использовать уже известную нам команду библиотеки LibopenCM3 , где — используемая шина I2C (I2C1), а — семибитный адрес . О бите записи/чтения за нас позаботится библиотека. В итоге работа с микросхемой вкратце будет представлять собой следующую последовательность действий: инициализация, настройка режима работы, настройка на нужную частоту. Все описанное ниже опирается на содержание документов AN332 «Si47XX Programming Guide» и AN332SSB.
Инициализация
Прежде всего SI4734 нужно инициализировать. Сделать это можно в одном из трех режимов: AM, FM или SSB. Перед началом инициализации документация рекомендует выполнить сброс. Делается это тривиально: надо ненадолго подтянуть к земле REST-пин SI4734. Для задержки используется совершенно ленивая функция, благо точность тут не имеет особого значения.
Для инициализации используется команда , которая требует два параметра. Первый включает тактирование и определяет режим работы, а второй настраивает аудиовыходы. Мы используем часовой кварц и аналоговые выходы, поэтому для FМ применяются параметры , , а для АM — , . После отправки команды, опрашивая чип, дожидаемся ответа . Обычно на это уходит один‑два запроса.
В ответ на команду чип может выдать еще 8 байт, которые даташит рекомендует проверять, однако на это можно забить и даже их не считывать. На данном этапе уже можно проверить качество работы микросхемы: исправная вернет ответ и запустит кварцевый генератор, что проверяется осциллографом. Если команды отправлены верно, а генератор не запустился, то, вероятно, чип битый.
Заключение
В этой статье мы разобрались, как пользоваться аналоговым входом ардуино и выводить информацию от микроконтроллера через последовательный порт, кстати, так вы можете выводить любые значения и использовать это для взаимодействия с компьютером, например, если напишете программу, которая будет отображать какие-то параметры, полученные от датчика. Любители иногда используют это при построении домашних метеостанций, и просматривают данные о температурах и влажности на компьютере.
В следующей статье мы будем использовать полученные знания для регулировки электрических величин с помощью ШИМ. С потенциометра мы будем считывать значение (положение его рукояти), как было показано в этой статье, использовать их для установки скважности ШИМ. Также я расскажу, что такое ШИМ и как его можно использовать в управлении светодиодами и коллекторным двигателем (моторчиком от игрушек)
Предыдущая
ArduinoМастер-класс «Люстра-паук» своими руками
Следующая
ArduinoКак управлять шаговым двигателем через Arduino
Спасибо, помогло!Не помогло