Модуль acs712 измеряет токи до 30 а может быть отправлен вам всего за $1
Содержание:
- 4Описание датчика тока,напряжения и мощности INA219
- Как подключить датчик воды к Ардуино
- Плата для преобразования тока 4..20 мА в напряжение
- Interface
- About Acs712
- 4Описание датчика тока,напряжения и мощности INA219
- Трансформаторный датчик
- working of acs712 current sensor
- Изготовление печатной платы для проекта
- Классификация и схемы подключения
- Схемы подключения датчика давления воздуха
- Acs712 Dc current measurement formula
- Arduino acs712 current sensor
- Описание конструкции самодельных токовых клещей
- Принцип работы тензодатчика
- 3Чтение показаний датчика тока ACS712с помощью Arduino
- 3Библиотека «Wire» для работы с IIC
- KY-008, модуль лазерного светодиода
4Описание датчика тока,напряжения и мощности INA219
Датчик INA219 – цифровой датчик тока, напряжения и мощности. Он позволяет измерять напряжения от 0 до 26 вольт и ток от 0 до 3,2 ампер. Питается датчик напряжением от 3 до 5,5 В. Существуют модули, полностью готовые к подключению к Arduino. Один из таких модулей GY-219:
Модуль GY-219 с датчиком тока INA219: назначение выводов и частей
Датчик INA219 выполняется в двух разновидностях: A и B. Последняя отличается повышенной точностью и меньшей погрешностью. На фото ниже как раз модификация INA219B.
Модуль GY-219 с датчиком тока INA219
Датчик INA219 имеет 12-разрядный АЦП, соответственно при максимуме измерений ±3,2 А получается разрешающая способность 0,8 мА. Однако можно настроить датчик таким образом, чтобы уменьшить диапазон измеряемой силы тока до ±400 мА; при этом разрешающая способность датчика увеличится до 0,1 мА. При этом можно откалибровать датчик, записав калибровачные данные в специальный регистр. Измеренные данные силы тока, напряжения и можности хранятся в трёх соответствующих регистрах. Кстати, датчик INA219 позволяет осуществлять аппаратную фильтрацию по 128 отсчётам, если измеряемый ток имеет сильные наводки.
Для конфигурирования датчика INA219 и для считывания показаний с него используется последовательный интерфейс I2C. Причём адрес на шине можно задать с помощью перемычек A0 и A1 на модуле. Допустимые адреса:
- 0x40 (без перемычек);
- 0x41 (с перемычкой A0);
- 0x44 (с перемычкой A1);
- 0x45 (установлены обе перемычки).
Соответственно, на одной шине IIC можно иметь до 4-х таких датчиков, подключённых одновременно.
Как подключить датчик воды к Ардуино
Для этого занятия нам потребуется:
- плата Arduino Uno / Arduino Nano / Arduino Mega;
- макетная плата;
- датчик воды;
- 1 светодиод и резистор 220 Ом;
- провода «папа-папа» и «папа-мама».
Схема подключения датчика воды к Ардуино
Перед тем как, подключить датчик протечки воды к плате Ардуино, следует написать скетч. Откройте программу Arduino IDE и вы увидите скетч, где уже прописаны процедуры и . Для начала зададим переменную с помощью оператора . Переменную мы будем использовать для хранения данных в памяти и присваивания ей значения, получаемого с датчика воды.
Перейдите в Панель меню — Инструменты — Монитор порта
В процедуре void setup() мы прописываем режим работы аналогового порта, как вход — команда и подключаем монитор порта с помощью . Далее в процедуре void loop() получаем значение с аналогового порта с помощью команды и передаем значение на монитор порта Arduino IDE и ставим паузу для нашего удобства.
Скетч для датчика воды (water sensor)
int water; // присваиваем имя для значений с аналогового входа A0 void setup() { pinMode(A0, INPUT); // к входу A0 подключим датчик (англ. «intput») Serial.begin(9600); // подключаем монитор порта } void loop() { water = analogRead(A0); // переменная "water" находится в интервале от 0 до 1023 Serial.println(water); // выводим значение датчика на монитор delay(1000); // задержка в одну секунду }
Пояснения к коду:
- в первой строчке мы присвоили переменной int имя для хранения значений c входа A0, значения могут принимать только целое число.
После загрузки скетча вы сможете получить данные с датчика на мониторе порта. Для этого перейдите в Arduino IDE в Панель меню — Инструменты — Монитор порта. Или используйте для открытия сочетание клавиш Ctrl + Shift + M. После того, как мы узнали показания датчика при его увлажнении, мы можем добавить в скетч функцию автоматического включения светодиода при превышении какого-либо значения.
Скетч для датчика воды и светодиода Ардуино
int water; // присваиваем имя для значений с аналогового входа A0 void setup() // процедура setup { pinMode(12, OUTPUT); // пин 12 со светодиодом будет выходом (англ. «output») pinMode(A0, INPUT); // к входу A0 подключим датчик (англ. «intput») Serial.begin(9600); // подключаем монитор порта } void loop() // процедура loop { water = analogRead(A0); // переменная "water" находится в интервале от 0 до 1023 if (water > 100) { digitalWrite(12, HIGH); } // включаем светодиод if (water < 100) { digitalWrite(12, LOW); } // выключаем светодиод Serial.println(water); // выводим значение датчика на монитор delay(1000); // задержка в одну секунду }
Пояснения к коду:
- условный оператор if позволяет определить действие при истинном условии;
- в процедуре void loop с помощью оператора if включаем светодиод при значении и выключаем светодиод при значении .
Плата для преобразования тока 4..20 мА в напряжение
После продолжительных поисков мне удалось найти на Aliexpress модуль, реализующий преобразование ток 4..20 мА в напряжение и достаточно защищенный от разных напастей. Приобретал у этого продавца.
Напряжение питания модуля 7-36V. Если выставлен диапазон выходного напряжения 10 V, то напряжение питания должно быть не меньше 12 V.
Преобразователь тока 4..20 мА в напряжение для подключения к АЦП микроконтроллера
На плате распаяно:
- Прецизионный резистор на котором замеряется падение напряжения.
- Защита входа от ошибки с полярностью.
- Защита от превышения напряжения >5 V.
- Усилитель, обеспечивающий напряжение на выходе в определенных диапазонах, заданных джамперами.
Настройка платы на нужный диапазон выходного напряжения производится джамперами.
- ON: jumper cap buckles on the two jumper pins — джампер закорочен
- OFF: two jumper pins without the jumper cap — джампер снят
Range, Volt | J1, перемычка 1-2 | J1, перемычка 3-4 |
0 — 2.5 | ON | ON |
0 — 3.3 | OFF | OFF |
0 — 5.0 | ON??? | ON |
0 — 10.0 | ON | OFF |
Для точной настройки преобразователя тока 4..20 мА в напряжение нужно подобрать значения двух потенциометров: ZERO и SPAN, соответствующие нулевому и максимальному значению тока на входе. Потенциометры претензионные с широким шагом.
- При минимальном токе на входе (0 mA или 4 mA), вращая потенциометр ZERO, настроить нужное напряжение на выходе, соответствующее заданному току нуля. Вращение по часовой стрелке увеличивает напряжение на выходе.
- Я не рекомендую выставлять 0 Вольт при минимальном токе 4 мА, поскольку в этом случае микроконтроллер не сможет определить оборван ли кабель к датчику или он действительно показывает минимальные значения.
- При максимальном токе в 20 мА, вращая переменное сопротивление SPAN, подбирается максимальное значение в выствленном джамперами диапазоне. Вращение по часовой стрелке увеличивает напряжение на выходе.
Interface
Base
- ACS712(uint8_t analogPin, float volts = 5.0, uint16_t maxADC = 1023, uint8_t mVperA = 100) constructor. It defaults a 20 A type sensor, which is defined by the default value of mVperA. See below.
-
int mA_AC(float freq = 50) blocks ~21 ms (depending on the freq) to sample a whole 50 or 60 Hz period.
Since version 0.2.2 frequencies other integer values than 50 and 60 are supported, the lower the frequency, the longer the blocking period.
Since version 0.2.3 floating point frequencies are supported to tune optimally. - int mA_DC() blocks < 1 ms as it just needs one analogRead().
type sensor | mVperA | LSB 5V-10bit |
---|---|---|
5 A | 185 | ~25 mA |
20 A | 100 | ~50 mA |
30 A | 66 | ~75 mA |
Midpoint
- void setMidPoint(uint16_t mp) sets midpoint for the ADC conversion.
-
void autoMidPoint(float freq = 50) Auto midPoint, assuming zero DC current or any AC current. Note it will block for 2 periods. Since version 0.2.2 frequencies other than 50 and 60 are supported.
By setting the frequency to e.g 1, the code will sample for 2 seconds, possibly getting a better average. - uint16_t getMidPoint() read the value set / determined.
- void incMidPoint() manual increase midpoint, e.g. useful to manually adjust the midPoint in an interactive application.
- void decMidPoint() manual decrease midpoint.
Formfactor
Also known as crest factor; affects AC signals only.
- void setFormFactor(float ff = ACS712_FF_SINUS) manually sets form factor, must be between 0.0 and 1.0
- float getFormFactor() returns current form factor.
The library has a number of predefined form factors
definition | value | approx | notes |
---|---|---|---|
ACS712_FF_SQUARE | 1.0 | 1.000 | |
ACS712_FF_SINUS | 1.0 / sqrt(2) | 0.707 | default |
ACS712_FF_TRIANGLE | 1.0 / sqrt(3) | 0.577 | |
It is important to measure the current with a calibrated multimeter
and determine / verify the form factor of the signal. This can help
to improve the quality of your measurements.
Noise
Default = 21 mV.
- void setNoisemV(uint8_t noisemV = 21) set noise level, is used to determine zero level e.g. in AC measurements.
- uint8_t getNoisemV() returns the set value.
mV per Ampere
Both for AC and DC. Is defined in the constructor and depends on
- void setmVperAmp(uint8_t mva) sets the milliVolt per Ampere measured.
- uint8_t getmVperAmp() returns the set value.
Typical values see constructor above.
About Acs712
ACS712 is a Hall Effect-Based Linear Current Sensor it can measure both DC(Direct Current) and AC(Alternating Current). The sensor chip is made by Allegro www.allegromicro.com. Pin out and Pin description of the chip is below.
IP+ & IP-Connect the sensor in series to the system whose current you want to measure. Cut the circuit wire and connect one end of wire to IP+ and other to IP-. Recall the high school lectures, current can be measured only in series. So don’t connect the sensor in parallel You may damage it by connecting it in parallel. VIoutViout is the voltage out pin. ACS712 outputs an analog signal in correspond to any variation across the IP+ and IP- pins or in other words it outputs analog voltage on VIOUT pin if their is any variation in the current.
Quiescent output voltage (VIOUT(Q)). The output of the device when the primary current is zero. For a uni-polar supply voltage,it nominally remains at VCC ⁄ 2. Thus, VCC = 5 V translates into VIOUT(Q) = 2.5 V. Variation in VIOUT(Q) can be attributed to the resolution of the Acs712. If the Acs712 is working on 5v(Vcc=5v) and their is no current flowing from input the Viout will be 2.5v. 2.5v is the base voltage at input of 5v, now any change in the input current will bring change in the output voltage. Viout decreases when current start flowing through the acs712 pins.
Acs712 is available in market in three ratings.
- ACS712ELCTR-05B-T
- ACS712ELCTR-20A-T
- ACS712ELCTR-30A-T
- ACS712ELCTR-05B-T can measure 5 to -5 Ampere current. Where 185mV change in Output voltage from initial state represents 1-Ampere change in Input current.
- ACS712ELCTR-20A-T can measure 20 to -20 Ampere current. Where 100mV change in Output voltage from initial state represents 1-Ampere change in Input current.
- ACS712ELCTR-30A-T can measure 30 to -30 Ampere current. Where 66mV change in Output voltage from initial state represents 1-Ampere change in Input current.
4Описание датчика тока,напряжения и мощности INA219
Датчик INA219 – цифровой датчик тока, напряжения и мощности. Он позволяет измерять напряжения от 0 до 26 вольт и ток от 0 до 3,2 ампер. Питается датчик напряжением от 3 до 5,5 В. Существуют модули, полностью готовые к подключению к Arduino. Один из таких модулей GY-219:
Модуль GY-219 с датчиком тока INA219: назначение выводов и частей
Датчик INA219 выполняется в двух разновидностях: A и B. Последняя отличается повышенной точностью и меньшей погрешностью. На фото ниже как раз модификация INA219B.
Модуль GY-219 с датчиком тока INA219
Датчик INA219 имеет 12-разрядный АЦП, соответственно при максимуме измерений ±3,2 А получается разрешающая способность 0,8 мА. Однако можно настроить датчик таким образом, чтобы уменьшить диапазон измеряемой силы тока до ±400 мА; при этом разрешающая способность датчика увеличится до 0,1 мА. При этом можно откалибровать датчик, записав калибровачные данные в специальный регистр. Измеренные данные силы тока, напряжения и можности хранятся в трёх соответствующих регистрах. Кстати, датчик INA219 позволяет осуществлять аппаратную фильтрацию по 128 отсчётам, если измеряемый ток имеет сильные наводки.
Для конфигурирования датчика INA219 и для считывания показаний с него используется последовательный интерфейс I2C. Причём адрес на шине можно задать с помощью перемычек A0 и A1 на модуле. Допустимые адреса:
- 0x40 (без перемычек);
- 0x41 (с перемычкой A0);
- 0x44 (с перемычкой A1);
- 0x45 (установлены обе перемычки).
Соответственно, на одной шине IIC можно иметь до 4-х таких датчиков, подключённых одновременно.
Трансформаторный датчик
Большая советская энциклопедия. — М.: Советская энциклопедия . 1969—1978 .
Смотреть что такое «Трансформаторный датчик» в других словарях:
ТРАНСФОРМАТОРНЫЙ ДАТЧИК — измерительный преобразователь в виде трансформатора, вторичное напряжение которого изменяется в результате изменения воздушного зазора в сердечнике (или взаимного перемещения обмоток) пропорционально измеряемой величине (перемещению, усилию) … Большой Энциклопедический словарь
трансформаторный датчик — измерительный преобразователь в виде трансформатора, вторичное напряжение которого изменяется в результате изменения воздушного зазора в сердечнике (или взаимного перемещения обмоток) пропорционально измеряемой величине (перемещению, усилию). * * … Энциклопедический словарь
working of acs712 current sensor
This acs712 sensor consists of a linear hall effect circuit along with copper conduction path. Copper conduction path is located around the surface of the die. When ac or dc current passes through a copper conduction path, it produces magnetic field. This electromagnetic field interacts with hall effect sensor. Hall effect circuit converts this electromagnetic filed into proportional voltage either ac or dc depending on input current type. This output voltage is measured with the help of arduino or any microcontroller. After measuring this voltage, we convert it back into current using sensitivity equations which I will explain later on.
Pin diagram of acs712 hall effect current sensor
Pin out of acs712 current sensor is given below. Pin number 1 , 2 and 3 ,4 are used for current sampling. In other words. you will connect these pins in series with the load of which current you want to measure. Pin number is ground connection of 5 volt power supply and pin number 6 is used to connect filter capacitor. One terminal of filter capacitor should be connected with pin number 6 and other terminal should be connected with ground. Similarly pin number 8 vcc is a power supply pin and you should connect dc 5 volt with it. Pin number 7 is the output pin of acs712 current sensor. From output pin, we will measure voltage with the help of arduino and we will see later on how to do it. Make sure to not connect your load in parallel with IP+ and IP+ it will damage your device and can also harm you if you are dealing with AC power supply or AC load.
Types of acs712 current sensors
There are three types of acs712 sensors available according to current rating of sensors. Below tables provides the rating and all the details of three types of acs712 hall effect sensors.
- ACS712ELCTR-05B: It sensor can measure current in the range of plus minus 5 Ampere and output sensitivity is 185mv/A . It mean the output voltage which will appear at the output pin of current sensor is 185 mili volt for every ampere passes through hall effect sensor. Similarly for other sensors but sensitivity is different for them.
- ACS712ELCTR-20A-T : It can measure 20 and -20 ampere current very easily and output sensitivity is 100mv/A.
- ACS712ELCTR-30A-T : It can measure 30 and -30 ampere current very easily and output sensitivity is 66mv/A.
How to measure current from output voltage of acs712 sensor?
To calculate current from output voltage of acs712 current sensor, you should make calculations according to following points:
- When there is no current flowing through the sensor, output voltage will be Vcc / 2. Where Vcc is power supply voltage given to acs712 to current sensor.
- if the Vcc = 5 volt, then the output voltage of current sensor will be equal to 2.5 when there is no current passing through a sensor.
- 2.5 volt is the offset voltage or base voltage of the sensor which should be subtracted from the measured voltage.
- The output voltage decreases when current starts passing through the sensor.
- So we can calculate dc current by using following commands:
Adcvalue = analogRead(A0);
Voltage = (adcvalue 1024.0) * 5000;
current = ((Voltage – voltage_offset) mVperAmp);
We can measure current by using above three lines of Arduino code. So let’s see what these lines are about and how these three lines of code measure dc current. In the first line, we are using Arduino built in library analogRead function to measure output voltage of hall effect current sensor. `The measured digital value is stored in variable ‘Adcvalue’. In second line, we are converting digital value of voltage back into analog voltage in mili ampere by multiplying it with resolution factor and divided by 1000 to convert it into mili ampere voltage. In third line, measured voltage is subtracted from offset voltage and divided by sensitivity factor to get current from measured voltage. I hope this explanation helps to understand how this code works and how you can measure dc current with acs712 hall effect current sensor.
Изготовление печатной платы для проекта
Спроектированная нами печатная плата для рассматриваемого в данной статье проекта регулируемой электронной нагрузки на основе платы Arduino показана на следующем рисунке.
Заказать печатную плату можно, к примеру, на сервисе allpcb.com, или у любого другого изготовителя печатных плат. Процессы заказа и оплаты изготовления печатной платы на сервисе allpcb.com показаны на следующих рисунках.
После изготовления печатная плата пришла авторам проекта вот в такой вот коробке:
Внешний вид пришедшей печатной платы показан на следующем рисунке. Качество изготовления, как видите, хорошее.
После сборки проекта на основе этой печатной платы получился следующий окончательный вид конструкции нашего проекта:
Классификация и схемы подключения
Датчики тока предназначаются для оценки параметров постоянного и/или переменного тока. Сравнение выполняется двумя методами. В первом случае используется закон Ома. При установке шунтирующего резистора в соответствии с нагрузкой системы на нём создаётся напряжение, пропорциональное нагрузке системы. Напряжение на шунте может быть измерено дифференциальными усилителями, например, токовыми шунтирующими, операционными или разностными. Такие устройства используются для нагрузок, которые не превышают 100 А.
Измерение переменного тока выполняется в соответствии с законами Ампера и Фарадея. При установке петли вокруг проводника с током там индуцируется напряжение. Этот метод измерения используется для нагрузок от 100 А до 1000 А.
Схема описанных измерений представлена на рисунке:
Слева — измерение малых токов; справа — измерение больших токов
Измерение обычно производится при низком входном значении синфазного напряжения. При помощи чувствительного резистора датчик тока соединяется между нагрузкой и землей. Это необходимо, поскольку синфазное напряжение всегда учитывает наличие операционных усилителей. Нагрузка обеспечивает питание прибора, а выходное сопротивление заземляется. Недостатками данного способа считаются наличие помех, связанных с потенциалом нагрузки системы на землю, а также невозможность обнаружения коротких замыканий.
Для слежения работой мощных систем детектор присоединяют к усилителю между источником питания и нагрузкой. В результате непосредственно контролируются значения параметров, подаваемых источником питания. Это позволяет идентифицировать возможные короткие замыкания. Особенность подключения заключается в том, что диапазон синфазного напряжения на входе усилителя должен соответствовать напряжению питания нагрузки. Перед измерением выходного сигнала контролируемого устройства нагрузка заземляется.
Схемы подключения датчика давления воздуха
Следующая конструкция построена на сенсоре-анероиде BMP180. Экран, в нее входящий, будет отображать текущее давление атмосферного воздуха и температуру окружающей среды. Для изготовления понадобятся:
Элемент | Наименование/характеристика | Количество |
---|---|---|
Микроконтроллер | Arduino UNO/Nano | 1 |
Датчик | BMP180 | 1 |
Экран | HD447080LCD-1602 | 1 |
Резистор | 100 Ом | 1 |
Регулируемый резистор | До 10 кОм | 1 |
Ну и конечно провода для связки всего названого в единую систему.
Библиотека, управляющая сенсором берется тут: https://github.com/adafruit/Adafruit-BMP085-Library
Принципиальная схема
Фотография итогового устройства:
Плата-шилд самодельная, для желающих повторить, она вблизи:
Датчик питается от 3.3V, соответственно и подключаются его контакты получения энергии (VCC и GND) к плате Arduino. Для передачи данных используются входы A5 (SCL) и A4(SDA). Дисплей с микроконтроллером соединяется согласно следующей таблицы:
Arduino | Экран |
---|---|
D6 | E и D4 вместе |
D4 | D5 |
D3 | D6 |
D2 | D7 |
GND | GND |
D7 | RS |
Скетч
Приведенная программа — всего лишь базис операций. Ее можно модифицировать по собственному разумению, добавляя функции отслеживания давления или температуры. Можно даже использовать конечное устройство, после необходимой модификации кода, в качестве своеобразного барометра, предупреждающего об идущей буре. Показания давления, в названом случае сильно упадут.
Acs712 Dc current measurement formula
- AcsOffset is normal voltage output at Viout pin when no current is flowing through the circuit.
- Arduino measured analog reading is the analog signal value read and converted to actual voltage from the analog channel to which acs712 output is connected.
- Sensitivity is Acs712 change in current representing 1 Ampere. For all the acs712 versions it is given in the above picture.
Arduino acs712 current sensor
Reassembled acs712 current sensor boards are available in market. They are easy to install in circuit and connections are pretty straight forward. They have three pins. Two are power pins vcc and gnd. The third one is output pin. A 2 pole connector is also present to insert the wire of device whose current is needed to be measured. A typical arduino acs712 current circuit board looks like the one given below.
Now i am going to interface the arduino acs712 current sensor with arduino uno. I will interface all the different current rated boards one by one with arduino uno.
Описание конструкции самодельных токовых клещей
Для сборки устройства понадобится чувствительный датчик Холла, к примеру, UGN3503. На рисунке 1 изображено устройство самодельной клещи. Необходим, как уже сказано, датчик Холла, а так же, кольцо ферритовое диаметром от 20 до 25 мм и крупный «крокодил», к примеру, подобный как на проводах для запуска (прикуривания) автомобиля.
Ферритовое кольцо необходимо точно и аккуратно распилить либо разломить на 2-е половинки. Для этого ферритовое кольцо необходимо сначала подпилить алмазным надфилем или пилкой для ампул. Далее, поверхности разлома ошкурить мелкой шкуркой.
С одной стороны на первую половинку ферритового кольца приклеить прокладку из чертежного ватман. С другой стороны на другую половинку кольца наклеить датчик Холла. Приклеивать лучше всего эпоксидным клеем, только нужно проследить, чтобы датчик Холла хорошо прилегал к зоне разлома кольца.
Следующий шаг – соединяем обе половинки кольца и обхватываем его «крокодилом» и приклеиваем. Теперь при нажатии на ручки «крокодила» ферритовое кольцо будет расходиться.
Принцип работы тензодатчика
Вообще, на рынке присутствуют три варианта тензодатчиков. Емкостные, на основе пьезоэлементов, и использующие упругие резисторы Уитстона. У последних фамилия указывает не марку модели, а имя изобретателя.
В любом случае, работа сенсора построена на изменении характеристик элемента при деформации. В емкостных, соответственно, повышается или уменьшается энергетическая вместимость детали, для пъезо- кристаллических варьируется проходящий ток, а резистивные — регулируют сопротивление участка цепи. Так как наиболее доступны последние из списка, они и будут рассмотрены в теле статьи.
Сенсоры настоящего типа присутствуют на рынке в полу- и мостовом варианте исполнения. Главное отличие, что первые можно применять раздельно на одной линии. А если конкретно — включение 4 полу мостовых датчиков в конструкцию единых весов дадут большую точность, чем двух полноформатных.
С виду — тензодатчик Ардуино выглядит как своеобразный алюминиевый брусок, с крепежными отверстиями. На его гранях видно размещенные там тонкопленочные резисторы, на которые собственно и помещается платформа с грузом. Количество выходов — 3 в случае полу мостовых и 4 у полных. Две линии используются для питания, остальные с целью передачи аналоговой информации на исполняющее устройство.
На одной из граней обычно указан максимально допустимый вес нагрузки.
3Чтение показаний датчика тока ACS712с помощью Arduino
В скетче будем постоянно читать значение с порта A0 и выводить в монитор последовательных данных. Напомню, АЦП у разных плат Arduino имеет различную разрядность, обычно 10 или 12 бит. Подробнее здесь. Это означает, что с аналогового порта могут приходить значения от 0 до 210 = 1024 для 10-разрядного АЦП. Будем считать, что у нас датчик тока, диапазон измерений которого от -5 А до +5 А, а чувствительность 185 мВ/А.
Если на 1 А приходится 185 мВ, это соответствует примерно 38 единицам измерения АЦП: 185·1024/5000 = 37.888, (1) где 5000 – это максимальное значение напряжения, которое способен измерить АЦП Arduino, в милливольтах.
На выходе OUT датчика ACS712 при отсутствии измеряемого тока должна быть половина напряжения питания, т.е. 2.5 В. Так как вся шкала АЦП лежит в диапазоне от 0 до 1024, то при отсутствии измеряемого тока мы должны считывать с аналогового порта Arduino число 512. Это начало шкалы отсчёта. Обозначим его value_zero. Отклонение тока value_adc от нулевого уровня в большую или меньшую сторону и будет показывать силу тока. Следовательно, чтобы посчитать в амперах значение тока с датчика ACS712, необходимо разницу
нулевого уровня и измеренного значения с аналогового порта A0 поделить на 38. А чтобы получить ток в миллиамперах, следует умножить это значение на 1000: I(mA) = (value_zero − value_adc) / 38·1000 (2)
Пояснение принципа вычисления силы тока На практике значение на аналоговом выводе A0 не будет равняться точно 512. Поэтому, чтобы определить начало отсчёта, добавим в скетч примитивную калибровку. Калибровка будет заключаться в том, что некоторое количество раз прочитаем значение с аналогового порта A0 при отсутствии тока на датчике ACS712, и усредним его. Естественно, нагрузка на время калибровки должна быть выключена, чтобы ток не протекал через датчик.Скетч для измерения постоянного тока датчиком ACS712 (разворачивается) const int acs712_pin = A0; int zero; // уровень нуля, относительно которого измеряется ток, обычно VCC/2 void setup() { Serial.begin(9600); calibrate(); } // определим нуль шкалы (до включения нагрузки)void calibrate(){ zero = 0; int repeats = 10; for (int i=0; iint getCurrent(int adc) { int delta = zero — adc; // отклонение от нуля шкалы float scale = 37.888; // сколько единиц АЦП приходится на 1 ампер, по формуле (1) int current = (int)delta*1000/scale; // считаем ток в мА и округляем до целых, по формуле (2) return current; }
Загрузим скетч и плавно начнём поднимать напряжение и ток на нагрузке. Какое-то время подождём, а затем начнём уменьшать ток. В результате получим примерно такую картинку:
Вывод тока датчика ACS712 в монитор последовательного порта и его график
Как видно, аналоговый сигнал постоянно «прыгает». Чтобы этого избежать, следует добавить в скетч сглаживание. Для этого будем проводить подряд несколько измерений, а затем брать среднее арифметическое от них в качестве действительного значения. Заодно совместим начальную калибровку, т.к. она выполняется точно так же. Вот как изменится в результате скетч:Скетч для измерения постоянного тока датчиком ACS712 со сглаживанием const int acs712_pin = A0; int zero; // уровень нуля, относительно которого измеряется ток, обычно VCC/2 void setup() { Serial.begin(9600); zero = getSmoothedValue(); // определим нуль шкалы (до включения нагрузки) Serial.print(«Zero=»); Serial.println(zero); } // получает сглаженное значение с АЦП Arduinoint getSmoothedValue(){ int value; int repeats = 10; for (int i=0; ivoid loop() { int sensorValue = getSmoothedValue(); // читаем значение с АЦП и выводим в монитор Serial.print(sensorValue); Serial.print(» = «); int c = getCurrent(sensorValue); // преобразуем в значение тока и выводим в монитор Serial.print(c); Serial.println(» mA»); delay(100); } // рассчитывает ток в мА по значению с АЦПint getCurrent(int adc) { int delta = zero — adc; // отклонение от нуля шкалы float scale = 37.888; // сколько единиц АЦП приходится на 1 ампер int current = (int)delta*1000/scale; // считаем ток в мА return current; }
Кстати, желательно вынести чувствительность датичка ACS712 в константу в начале скетча, чтобы можно было быстро изменить скетч для модификации датчика с другим диапазоном измерений.
В результате выполнения данного скетча картинка получается гораздо более приятная:
Сглаженный график тока, измеренного датчиком ACS712
Тот же самый принцип заложен в библиотеки для Arduino, которые оперируют с датчиком тока ACS712. Например, вот эта библиотека Troyka Current.
По результату эксперимента получается, что датчик ACS712 очень простой, но при этом довольно не точный. Гораздо точнее датчик тока, который мы рассмотрим в следующем разделе.
3Библиотека «Wire» для работы с IIC
Для облегчения обмена данными с устройствами по шине I2C для Arduino написана стандартная библиотека Wire. Она имеет следующие функции:
Функция | Назначение |
---|---|
begin(address) | инициализация библиотеки и подключение к шине I2C; если не указан адрес, то присоединённое устройство считается ведущим; используется 7-битная адресация; |
requestFrom() | используется ведущим устройством для запроса определённого количества байтов от ведомого; |
beginTransmission(address) | начало передачи данных к ведомому устройству по определённому адресу; |
endTransmission() | прекращение передачи данных ведомому; |
write() | запись данных от ведомого в ответ на запрос; |
available() | возвращает количество байт информации, доступных для приёма от ведомого; |
read() | чтение байта, переданного от ведомого ведущему или от ведущего ведомому; |
onReceive() | указывает на функцию, которая должна быть вызвана, когда ведомое устройство получит передачу от ведущего; |
onRequest() | указывает на функцию, которая должна быть вызвана, когда ведущее устройство получит передачу от ведомого. |
KY-008, модуль лазерного светодиода
Модуль лазерного диода |
Можно заменить на лазерный диод за 20 р и последовательно поставить токоограничивающий резистор, на Али удовольствие стоит от 50 р |
Модуль аналогичен KY-005, только в роли излучающего элемента выступает 3 мВт лазерный светодиод. Можно использовать для передачи данных на дальние расстояния (лазер все таки, имеет довольно узкий луч, который имеет больший световой поток при одинаковой мощности инфракрасных и лазерных диодов), если использовать зеркала то можно построить довольно объемную охранную сигнализацию помещения. Единственный недостаток в ней будет заключаться в юстировке зеркал. |