Ассистент

ARDUINO

Описание

ARDUINO

Тема: Хобби
Описание: Сообщество для кого это слово что-то значит.
Создана: 28.11.2016 22:59:37
Участников: 5
Тип группы: Это открытая группа. В неё может вступить любой желающий.
Это видимая группа. Ее наличие видно всем пользователям.
Живая лента
Виктор UA6EM ARDUINO
13 мая 2018 16:56
Сообщение Wiki
Декодер шины I-BUS

Декодер шины I-BUS



В проекте приведен скетч декодера шины I-BUS


#include <string.h>
#define IBUS_BUFFSIZE 32
#define IBUS_MAXCHANNELS 10

#define THROT_CHANNEL 2
#define RUDDER_CHANNEL 3
#define ARM_CHANNEL 4

#define LEFT_PWM_PIN 5
#define RIGHT_PWM_PIN 6
#define LEFT_DIR_PIN 7
#define RIGHT_DIR_PIN 8
#define MANUAL_LED_PIN 13

static uint8_t ibusIndex = 0;
static uint8_t ibus[IBUS_BUFFSIZE] ={0};
static uint16_t rcValue[IBUS_MAXCHANNELS];

boolean rxFrameDone;

int16_t ThrotLeft = 0;
int16_t ThrotRight = 0;
int16_t DirLeft = 1;
int16_t DirRight = 1;


void setup() {
Serial.begin(115200);

pinMode (MANUAL_LED_PIN, OUTPUT);
pinMode (LEFT_PWM_PIN, OUTPUT);
pinMode (RIGHT_PWM_PIN, OUTPUT);
pinMode (LEFT_DIR_PIN, OUTPUT);
pinMode (RIGHT_DIR_PIN, OUTPUT);

digitalWrite(MANUAL_LED_PIN, LOW);
Serial.println("Setup done!");

// Конец инициализации
}



void loop() {
  readRx();
  if(rxFrameDone)
  {
    if(rcValue[ARM_CHANNEL] == 2000)
    {
      digitalWrite(MANUAL_LED_PIN, HIGH);
      UpdateMotors();
          }
          else
          {
            // disarmed from rx
            digitalWrite(MANUAL_LED_PIN, LOW);

            //
            ThrotLeft = 0;
            ThrotRight = 0;
            analogWrite(LEFT_PWM_PIN, ThrotLeft);
            analogWrite(RIGHT_PWM_PIN, ThrotRight);
            DirLeft = 1;
            DirRight = 1;
          }
     }
}

void UpdateMotors()
{
  double tmpThrotRight = 0.00;
  double tmpThrotLeft = 0.00;

  double Throttle = (double)rcValue[THROT_CHANNEL];
  double Rudder = (double)rcValue[RUDDER_CHANNEL];

  tmpThrotLeft = ((((Throttle - 1000) + (Rudder - 1000))/2000)*510) - 255;
  tmpThrotRight = ((((Throttle - 1000) + (2000 - Rudder))/2000)*510) - 255;
  ThrotLeft = (int)tmpThrotLeft;
  ThrotRight = (int)tmpThrotRight;
  digitalWrite(LEFT_DIR_PIN, DetermineMotorDirection(ThrotLeft));
  digitalWrite(RIGHT_DIR_PIN, DetermineMotorDirection(ThrotRight));

  if(ThrotLeft < 0) ThrotLeft = ThrotLeft * -1;
  if(ThrotRight < 0) ThrotRight = ThrotRight * -1;
  analogWrite(LEFT_PWM_PIN, ThrotLeft);
  analogWrite(RIGHT_PWM_PIN, ThrotRight);
 }


int DetermineMotorDirection(int Throttle)
{
  if(Throttle > 0) return HIGH;
  return LOW;
}


void readRx()
{
  rxFrameDone - false;
  if(Serial.available())
  {
    uint8_t val = Serial.read();
    //Lock for 0x2040 as start of packet
    if(ibusIndex == 0 && val != 0x20)
    {
      ibusIndex = 0;
      return;
    }
    if(ibusIndex == 1 && val != 0x40)
    {
      ibusIndex = 0;
      return;
    }
    if (ibusIndex == IBUS_BUFFSIZE)
    {
      ibusIndex = 0;
      int high = 3;
      int low = 2;
      for(int i = 0; i < IBUS_MAXCHANNELS; i++)
      {
        //left shift away the first 8 bits of the first byte and add the whole value of the previous one
        rcValue[i] = (ibus[high] << 8) + ibus[low];
        Serial.print(rcValue[i]);
        Serial.print("     ");
        high += 2;
        low += 2;
      }
        Serial.println();
        rxFrameDone = true;
        return;
      }
      else
      {
        ibus[ibusIndex] = val;
        ibusIndex ++;
      }
     }
    }



 

Виктор UA6EM ARDUINO
13 мая 2018 16:53
Сообщение Wiki
Всё об АРДУИНО

    Уроки Эдуарда Калинина

  

  ПРОЕКТЫ НА АРДУИНО





   


Виктор UA6EM ARDUINO
2 февраля 2018 16:35
Сообщение Wiki
AVMeter


AVMeter

Вольтметр-амперметр на базе Arduino с записью на microSD-карту

НАЗНАЧЕНИЕ

Прибор предназначен для одновременного измере-ния постоянного напряжения и тока с записью результатов на карту памяти формата microSD. Пределы измерения напряжения (0…20V) и тока (‑5A…5A) выбраны исходя из того, что прибор используется в основном для наблюдения за процессами заряда-разряда 12-вольтовых свинцово-кислотных аккумуляторов небольшой емкости в источниках бесперебойного питания. Текущие значения напряжения и тока отображаются на дисплее, а запись результатов измерений в файл формата CSV (лог-файл) происходит через заданные интервалы времени, устанавливаемые в пределах от 1 до 30 минут.

УСТРОЙСТВО

Основой прибора является микроконтроллер Arduino Nano, к которому подключены следующие периферийные модули:

· модуль LCD дисплея 1602 с конвертером интерфейса I2C

· модуль АЦП на базе ADS1115

· модуль часов реального времени на базе DS1307

· модуль адаптера microSD карты

· модуль датчика тока на базе ACS712 (2 шт.)

Символьный LCD дисплей имеет 2 строки по 16 символов и используется для отображения результатов измерений, а также для вывода различной служебной информации в режиме настройки. Четырехканальный 16-разрядный АЦП ADS1115 служит для преобразования входных аналоговых сигналов в цифровую форму для дальнейшей обработки микроконтроллером. На один из его каналов через входной делитель поступает измеряемое напряжение, на два других – выходные сигналы от модулей ACS712, пропорциональные измеряемому току. Четвертый канал АЦП не используется. Часы реального времени необходимы для получения данных о текущей дате и времени, записываемых в лог-файл вместе с измеренными значениями тока и напряжения, они же используются для задания временных интервалов между записями. Адаптер карты памяти содержит соответствующее гнездо для установки карты формата microSD, а также микросхему преобразователя уровней входных и выходных сигналов, позволяющий привести 5-вольтовые логические сигналы Arduino к уровням 3.3 вольта, необходимым для работы карты памяти. Модули датчиков тока включены по дифференциальной схеме, при которой один и тот же измеряемый ток проходит через два датчика в противоположных направлениях, что позволяет резко снизить влияние температурного дрейфа датчиков, нестабильности источников питания и окружающих магнитных полей на точность измерений. Подробнее о преимуществах такого включения можно прочитать далее. Прибор подключается к измеряемым электрическим цепям при помощи двух пар гибких проводов, включаемых в соответствующие гнезда – одна пара гнезд служит для измерения напряжения и подключается параллельно к клеммам аккумулятора, процессы заряда или разряда которого необходимо наблюдать, другая пара включается последовательно с этим аккумулятором и служит для измерения силы тока его заряда/разряда. Цепь измерения тока не имеет гальванической связи с остальными цепями прибора, поэтому ток можно измерять как в положительном проводе, идущем к аккумулятору от плюса зарядного устройства и нагрузки, так и в отрицательном, идущем к аккумулятору от общего провода (массы). Все элементы электрической схемы прибора размещены в пластмассовом корпусе. На лицевой панели корпуса размещены дисплей и кнопки управления, а на боковых стенках корпуса – разъем для подключения внешнего источника питания, гнезда для подключения измеряемых цепей напряжения и тока, а также имеется прорезь для извлечения/установки карты памяти. Прибор питается от внешнего стабилизированного источника питания напряжением 9V. Потребляемый от источника ток около 70 мА. Выключателя питания прибор не имеет и включается при подаче питания от внешнего источника.

РЕЖИМЫ РАБОТЫ

Вольтметр-амперметр работает в трех режимах

MEASUREMENT (ИЗМЕРЕНИЕ)

Прибор измеряет значение напряжения и тока и отображает их на дисплее. Показания обновляются с интервалом примерно 0.8 секунды.

RECORDING (ЗАПИСЬ)

Прибор измеряет значение напряжения и тока, отображает их на дисплее и записывает в файл формата CSV вместе с текущим временем и датой. Показания на дисплее обновляются с интервалом примерно 0.8 секунды, а запись в файл происходит через равные интервалы времени, устанавливаемые в режиме SETUP в пределах от 1 до 30 минут.

SETUP (НАСТРОЙКА)

Измерение не производится. При помощи кнопок управления пользователь настраивает текущее время, дату и интервал времени для записи в файл.

При каждом включении прибора выполняется проверка наличия карты памяти и, если карта вставлена в соответствующее гнездо, прибор сразу переходит в режим MEASUREMENT. Если же карта microSD в адаптере отсутствует, на дисплей на 2-3 секунды выводится соответствующее предупреждение, а затем прибор переходит в режим MEASUREMENT, как обычно, однако перейти в режим RECORDING нажатием кнопки «START» в этом случае не получится. Для того чтобы выполнить запись результатов измерений в файл, нужно будет выключить питание прибора, вставить на место карту памяти, а затем снова включить прибор.

Таблица 1. Функции кнопок и примеры показаний на дисплее в каждом из режимов.

Режим

Назначение кнопок

Примеры показаний на дисплее

MEASUREMENT
(ИЗМЕРЕНИЕ)

SW1 (белая) – «SETUP» – переход в режим настройки
SW2 (зеленая) – «START» – создание нового лог-файла на карте памяти и переход в режим записи

SW3 (красная) – не задействована

RECORDING
(ЗАПИСЬ)

SW1 (белая) – не задействована
SW2 (зеленая) – не задействована

SW3 (красная) – «STOP» - завершение записи, закрытие лог-файла и возврат в режим измерения


символ “R” - мигает

SETUP
(НАСТРОЙКА)

SW1 (белая) – «NEXT» – переход к следующему настраиваемому параметру, после завершения настройки всех параметров – возврат в режим измерения.
SW2 (зеленая) – «UP» – увеличение настраиваемого параметра на 1

SW3 (красная) – «DOWN» – уменьшение настраиваемого параметра на 1




ФОРМАТ ЛОГ-ФАЙЛА

В режиме измерения при нажатии кнопки «START» создается новый лог-файл на карте памяти и начинается запись измеренных значений в этот файл. Имя файла присваивается автоматически при создании и имеет формат MMDDHHmm.csv, где MM – две цифры текущего месяца (01...12), DD – две цифры текущего дня (01...31), HH – две цифры часа (00...23) и mm – две цифры минуты (00...59). Например, файл, созданный 1-го февраля в 15:30 будет иметь имя 02011530.csv. Каждая строка файла содержит одну запись, включающую текущую дату, время и измеренные значения напряжения и тока, разделенные запятыми. Записи разделяются символами 0x0D и 0x0A (CR и LF) и добавляются в файл в течение всего времени, пока прибор находится в режиме RECORDING, через заданные интервалы времени. Например, если прибор находился в режиме записи в течение часа и был установлен интервал времени между записями 10 минут, то содержимое файла будет выглядеть следующим образом:
2017/11/13 15:12:02, 3.3742, -0.3058
2017/11/13 15:22:02, 3.3744, -0.3076
2017/11/13 15:32:02, 3.3745, -0.3023
2017/11/13 15:42:02, 3.3745, -0.3054
2017/11/13 15:52:02, 3.3745, -0.3030
2017/11/13 16:02:02, 3.3745, -0.3035


При нажатии кнопки «STOP» запись прекращается, файл закрывается, после чего карту памяти можно извлечь из прибора и перенести в компьютер, где данные из файла могут быть импортированы в Microsoft Excel или в другую программу для дальнейшей обработки.

ЭЛЕКТРИЧЕСКАЯ СХЕМА

Принципиальная электрическая схема прибора показана на рисунке:

Измеряемое напряжение поступает на вход VOLTAGE INPUT и через делитель R1, R2, понижающий напряжение в 5 раз, поступает на вход A0 модуля АЦП U3. Благодаря делителю на вход прибора можно подавать напряжения в диапазоне 0…20 V. Диод D1 защищает вход АЦП от случайной подачи напряжения отрицательной полярности, которое может вывести микросхему АЦП из строя. Измеряемый ток со входа CURRENT INPUT поступает на входы IN0 и IN1 микросхем ACS712 модулей U5 и U6. Эти микросхемы содержат датчики Холла, преобразующие магнитное поле, возникающее в проводнике от протекания по нему измеряемого тока, в пропорциональное ему выходное напряжение. Главным достоинством микросхем ACS712 является полная изоляция цепи измеряемого тока от остальных цепей микросхемы и, соответственно, от всей электрической схемы прибора, что дает возможность подключать вход CURRENT INPUT в любую точку схемы исследуемого устройства, например, как в положительный, так и в отрицательный провод аккумулятора, не опасаясь короткого замыкания с цепью измеряемого напряжения. Этим модули на базе ACS712 выгодно отличаются от более распространенных датчиков тока, измеряющих падение напряжения на шунте, включенном в измеряемую цепь. Еще одним полезным свойством микросхем ACS712 является возможность измерения тока любой полярности, что очень удобно при исследовании процессов в аккумуляторах, у которых, как известно, ток при зарядке течет в одну сторону, а при разрядке – в другую. К сожалению, кроме отмеченных достоинств, микросхемы ACS712 имеют и некоторые недостатки, заключающиеся в значительном дрейфе выходного напряжения от окружающей температуры, от напряжения источника питания и, особенно, от силы и направления окружающих магнитных полей, включая магнитное поле Земли. Это затрудняет измерение малых токов на уровне единиц или даже десятков миллиампер. Для устранения этого недостатка в схеме использованы два одинаковых модуля, выходные сигналы которых подаются на входы A1 и A2 модуля АЦП U3, где преобразуются в цифровую форму, а затем программно вычитаются друг из друга микроконтроллером. При этом все погрешности, имеющие у двух модулей одинаковый знак и близкую величину, значительно уменьшаются (в идеале, вообще, становятся равными нулю), а полезный сигнал, наоборот, удваивается из-за встречного включения датчиков тока. Обратите внимание, что входы IN0 и IN1 двух модулей соединены таким образом, что измеряемый ток протекает через них в противоположных направлениях. Такое включение датчиков и дальнейшее вычитание их выходных напряжений образует дифференциальную схему, позволяющую значительно повысить точность измерений, что особенно заметно при малых величинах измеряемых токов. Еще одним недостатком модулей на базе ACS712 является высокий уровень собственных шумов на выходах, который достигает десятков милливольт, что также отрицательно сказывается на точности измерений малых токов. Для подавления этих шумов выходы модулей U5 и U6 соединены со входами A1 и A2 модуля АЦП U3 через простейшие RC-фильтры нижних частот R3C1 и R4C2. Модули часов реального времени, АЦП и дисплея подключаются к микроконтроллеру по шине I2C, таким образом, для обмена данными с этими модулями задействовано всего 2 входа-выхода Arduino (A4, A5), а microSD карта подключается при помощи интерфейса SPI (входы-выходы D10, D11, D12, D13). Кроме того, в приборе имеются три кнопки управления, подключенные ко входам D2, D3 и D4 микроконтроллера и необходимые для переключения режимов работы и настройки параметров. Питающее напряжение 9V поступает на микроконтроллер U1 от внешнего источника питания, а все остальные модули питаются напряжением 5V от встроенного стабилизатора напряжения Arduino Nano (цепь VCC).

КОМПОНЕНТЫ

Основные компоненты, необходимые для сборки прибора, показаны на рисунке:

Цифрами обозначены:

1. Микроконтроллер Arduino Nano, вернее, его аналог, изготовленный безымянным китайским производителем, но работающий при этом не хуже настоящего.

2. Комбинированная плата Data Logging Board фирмы Deek-Robot, объединяющая в себе модуль часов реального времени и модуль адаптера карты microSD.

3. Модуль АЦП на базе 4-канальной 16-разрядной микросхемы ADS1115 фирмы Texas Instruments

4. Модуль датчика тока на базе микросхемы ACS712 фирмы Allegro (таких модулей нужно 2 штуки). Максимальный измеряемый модулем ток 5А.

5. Три кнопки без фиксации 12x12 мм с цветными колпачками

6. Модуль символьного LCD дисплея 1602 (16 символов, 2 строки) с припаянным к нему конвертером интерфейса I2C

7. Разъем для подключения внешнего источника питания 9V

Кроме перечисленных компонентов понадобятся также несколько резисторов и конденсаторов, монтажные провода, две пары гнезд для подключения проводов от измеряемых цепей и небольшой пластмассовый корпус. Для поддержания хода часов реального времени при выключенном питании прибора необходима литиевая 3-вольтовая батарейка формата CR1220.

КОНСТРУКЦИЯ И МОНТАЖ

Прибор смонтирован в пластмассовом корпусе размерами 112х82х40 мм. Корпус состоит из двух половинок, соединяемых по углам саморезами. В верхней половине размещен дисплейный модуль и кнопки управления, в нижней половине – все остальные модули и разъемы.

Для того чтобы половинки корпуса можно было при необходимости разъединить, соединения между ними сделаны с помощью двух 4-контактных разъемов – один для подключения дисплея, другой для подключения кнопок управления. В связи с простотой схемы и малым количеством соединений между модулями печатная плата не разрабатывалась. Модули и дискретные элементы размещены на куске перфорированной односторонней макетной платы, их выводы соединены на нижней стороне платы навесными проводниками. На другом куске той же макетной платы смонтированы кнопки управления. Модули датчиков тока U5 и U6 должны размещаться параллельно друг другу, и, желательно, как можно ближе, при этом внешние магнитные поля будут одинаково влиять на их выходные сигналы, что позволит полностью скомпенсировать их в программе. В конструкции, показанной на фото, модули U5 и U6 размещены «этажеркой», то есть один под другим. Рекомендуется перед установкой этих модулей в прибор выпаять находящиеся на них SMD-светодиоды. Эти светодиоды индицируют подачу напряжения питания на модули, что не имеет большого смысла, когда они расположены в корпусе прибора и не видны снаружи, однако, они довольно сильно нагреваются в процессе работы и нагревают находящуюся рядом микросхему ACS712, вызывая заметный дрейф нуля прибора в первые минуты после его включения.

ВОЗМОЖНОСТИ МОДЕРНИЗАЦИИ ПРИБОРА И ЗАМЕНЫ КОМПОНЕНТОВ

При желании диапазон измеряемого напряжения можно расширить, изменив сопротивления резисторов входного делителя, а диапазон измеряемого тока – заменив 5-амперные модули датчиков тока на аналогичные 20-амперные или 30-амперные. При этом нужно будет внести соответствующие поправки в расчетные формулы, использованные в программном коде. Микроконтроллер Arduino Nano, использованный в приборе, можно заменить другими микроконтроллерами того же семейства c 5-вольтовыми логическими сигналами и тактовой частотой 16 MHz, например, Arduino Uno или Arduino Pro Mini, однако при этом надо учитывать, что Arduino Uno стоит дороже и имеет большие габариты, что потребует увеличения размеров корпуса прибора, а Arduino Pro Mini не имеет USB интерфейса и в этом случае для загрузки управляющей программы потребуется внешний программатор (USB to TTL конвертер). При отсутствии 4-х канального АЦП ADS1115 его можно вообще исключить из схемы, а сигналы со входного делителя напряжения и с модулей датчиков тока подавать непосредственно на любые свободные аналоговые входы Arduino, при этом для преобразования этих сигналов в цифровую форму нужно будет использовать встроенные АЦП микроконтроллера. Надо только иметь в виду, что в этом случае точность измерений значительно снизится, поскольку АЦП Arduino имеет разрядность всего 10 (диапазон 0…5 V разбивается на 1024 ступеньки) против разрядности 16 у ADS1115 (65536 ступенек). Объединенные на одной плате модули часов реального времени и адаптера карты памяти можно без изменения электрической схемы заменить двумя отдельными модулями. При этом, если модуль часов реального времени будет выполнен на базе той же микросхемы DS1307, то и в программный код не придется вносить никаких изменений, а если микросхема окажется другой, например, DS1302 или DS1337, то нужно будет использовать в программе соответствующую библиотеку и внести некоторые изменения в код. Четвертый канал АЦП ADS1115, не используемый в приборе, можно при желании использовать для чего-нибудь полезного, например, подключить его к батарейке часов реального времени, что позволит контролировать ее напряжение и вовремя заменить в случае разрядки. Можно также добавить еще один входной делитель напряжения, аналогичный уже имеющемуся и подключить его к этому свободному входу, что позволит измерять и записывать в лог-файл величину напряжения не в одной точке цепи, как сейчас, а сразу в двух. Еще одной интересной возможностью использования четвертого входа АЦП является подключение к нему датчика температуры, расположенного внутри корпуса прибора и соответствующая коррекция в программе результатов измерений с тем, чтобы скомпенсировать температурный дрейф датчиков тока и АЦП. Это значительно повысит точность измерений, особенно, если прибор предполагается использовать вне помещения.

ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ

Полный исходный текст программы микроконтроллера может быть загружен по ссылке – http://intranet.intsoft.spb.ru/AV-meter/AV-meter.zip. В программе используются следующие библиотеки, необходимые для взаимодействия микроконтроллера с периферийными модулями: · Wire (встроенная библиотека Arduino IDE) – работа с интерфейсом I2C для обмена данными между микроконтроллером и периферийными модулями · Adafruit_ADS1015 (v.1.1) – работа с АЦП на базе ADS1015/ADS1115 · LiquidCrystal_I2C – работа с LCD дисплеем · RTClib – работа с модулем часов реального времени на базе DS1307 · SPI (встроенная библиотека Arduino IDE) – работа с интерфейсом SPI для взаимодействия с адаптером карты памяти microSD · SD – работа с файловой системой FAT16/FAT32 для записи лог-файла на карту памяти Непосредственно измерением и записью результатов в лог-файл занимаются всего две функции – measureSingleEnded и measure. Весь остальной объем текста программы составляют процедуры взаимодействия с пользователем – отображение на дисплее результатов измерений (в режимах MEASUREMENT и RECORDING) и различных сообщений (в режиме SETUP), обработка нажатий на кнопки управления. Исходный текст подробно прокомментирован и в основном не требует дополнительных пояснений.

НАСТРОЙКА ПРИБОРА

При исправных компонентах и правильно выполненном монтаже электрическая часть прибора настройки не требует. После загрузки кода программы в микроконтроллер и включения прибора достаточно убедиться, что показания на дисплее и функционирование кнопок соответствуют Таблице 1 в разделе РЕЖИМЫ РАБОТЫ. Возможно, потребуется лишь установить контрастность изображения на дисплее при помощи переменного резистора, находящегося на плате конвертера интерфейса I2C. Далее можно приступать к калибровке показаний прибора, которая выполняется путем подбора значений нескольких констант в коде программы и состоит из двух этапов.

Этап 1 – установка нуля

При первом включении весьма вероятно, что прибор будет показывать ненулевые значения напряжения и тока, несмотря на то, что его входы не подключены к измеряемой цепи. Причина появления таких ненулевых показаний различна для каналов напряжения и тока. В канале измерения напряжения смещение нуля возникает от протекания входного тока АЦП ADS1115 через резисторы входного делителя напряжения. В результате на входе АЦП возникает некоторое небольшое (в пределах 10-15mV) начальное смещение. Для того чтобы это смещение скомпенсировать, необходимо подобрать значение константы voltageZeroCorrection находящейся в самом начале исходного текста, сразу после объявления используемых в программе библиотек. Размерность константы соответствует напряжению в вольтах, т.е. если, например, показания на дисплее при отсутствии входного напряжения будут равны 0.003 V, то текущее значение константы надо уменьшить на эту величину, если -0.003 V, то на столько же увеличить.

ВАЖНО! Перед тем как подбирать константу voltageZeroCorrection необходимо:

1. Замкнуть перемычкой входные гнезда VOLTAGE INPUT.

2. Дать прибору прогреться во включенном состоянии не менее 15-20 минут для того, чтобы в его корпусе установился тепловой режим.

В канале измерения тока начальное смещение нуля возникает из-за разброса параметров микросхем датчиков тока. Хотя в документации микросхем ACS712 указано, что их выходное напряжение при отсутствии измеряемого тока равно половине напряжения питания, на практике микросхемы имеют определенный разброс параметров. В результате этого при вычитании их выходных напряжений в программе не всегда получается нулевое значение. Для компенсации этой разницы нулевых точек необходимо подобрать значение константы currentZeroCorrection. При этом замыкать перемычкой входные гнезда CURRENT INPUT не нужно, а вот прогреть прибор в течение 15-20 минут очень рекомендуется. К сожалению, даже при самом тщательном подборе константы currentZeroCorrection добиться стабильных нулевых значений в канале измерения тока скорее всего не удастся – показания на дисплее при неизменной температуре воздуха будут плавать в пределах 2-3мА вверх и вниз от нуля, а при изменении температуры могут уползти и до 10-15мА, однако, следует иметь в виду, что эти колебания составляют всего лишь десятые доли процента от верхнего предела измерений прибора. Вряд ли стоит ожидать от несложной конструкции, собранной из весьма дешевых комплектующих, точности измерений, сопоставимой с профессиональным лабораторным оборудованием, поэтому в большинстве случаев можно считать такие незначительные отклонения допустимыми. Тем не менее, если даже небольшие колебания нулевой точки нежелательны, то в программе предусмотрена возможность избавиться от них, включив шумоподавление. Для этого нужно убрать символы комментария в начале следующей строки: //#define NOISE_SUPPRESSOR 1 Если константа NOISE_SUPPRESSOR определена, то все результаты измерений менее 3mV в канале измерения напряжения и менее 3mA в канале измерения тока будут показываться на дисплее как 0. При этом независимо от того, определена эта константа или нет, в лог-файл всегда будут записываться исходные значения без шумоподавления.

Этап 2 – калибровка чувствительности

После успешной установки нулей в каналах напряжения и тока можно приступать к калибровке чувствительности. Для этого понадобится следующее оборудование:

· Регулируемый источник питания, способный вырабатывать постоянное напряжение до 20V при токе до 5 ампер

· Мощный резистор сопротивлением несколько ом, используемый в качестве нагрузки

· Лабораторный цифровой амперметр с пределом измерений до 5А максимально возможного класса точности

· Лабораторный цифровой вольтметр с пределом измерений до 20V максимально возможного класса точности

От качества эталонных лабораторных приборов, применяемых для калибровки чувствительности, зависит точность, которую удастся достигнуть. Не следует в качестве эталонных приборов использовать недорогие мультиметры, приобретенные в соседнем хозяйственном магазине, их точность совершенно недостаточна для успешной калибровки. Процесс калибровки состоит в подборе значений константы voltageSensitivity для канала измерения напряжения и константы currentSensitivity для канала измерения тока. Для этого нужно собрать цепь из регулируемого источника питания и резистора нагрузки, подключить последовательно с нагрузкой вход CURRENT INPUT прибора и эталонный амперметр, а параллельно нагрузке – вход VOLTAGE INPUT прибора и эталонный вольтметр. Далее показания эталонных приборов нужно сравнить с результатами на дисплее и подобрать значения констант так, чтобы результаты измерений совпали.

ССЫЛКИ НА ИНТЕРНЕТ-РЕСУРСЫ

Электронные компоненты, используемые в проекте:

· Микроконтроллер Arduino Nano - https://store.arduino.cc/arduino-nano (англ.)

· Плата Data Logging Board фирмы Deek-Robot - http://draeger-it.blog/arduino-lektion-27-datenloggen-mit-dem-logging-shield/ (нем.) (Сайт производителя платы на дату написания статьи находится в нерабочем состоянии, поэтому приведена ссылка на сторонний ресурс).
Документация микросхемы часов реального времени DS1307 фирмы Dallas Semiconductor - https://www.sparkfun.com/datasheets/Components/DS1307.pdf (англ.).

· Модуль АЦП ADS1115 - https://learn.adafruit.com/adafruit-4-channel-adc-breakouts/ (англ.).

Документация микросхемы ADS1115 - http://www.ti.com/lit/ds/symlink/ads1115.pdf (англ.).

· Модуль датчика тока на базе микросхемы ACS712 - https://www.elecrow.com/wiki/index.php?title=ACS712_Current_Sensor-_5A (англ.).

Описание принципа работы микросхемы ACS712 - http://embedded-lab.com/blog/a-brief-overview-of-allegro-acs712-current-sensor-part-1/ (англ.).

Документация микросхемы ACS712 - https://www.allegromicro.com/~/media/Files/Datasheets/ACS712-Datasheet.ashx (англ.).

· LCD дисплей - http://www.winstar.com.tw/products/character-lcd-display-module/16x2-lcd.html (англ.), модуль интерфейса I2C для дисплея - http://modtronix.com/mod-lcdi2c-bb1.html (англ.)

Все электронные компоненты приобретены на интернет-аукционах eBay и AliExpress, где их легко найти, воспользовавшись поиском. Ссылки на конкретные предложения о продаже этих компонентов часто меняются, поэтому здесь не приводятся.

Библиотеки, используемые в проекте:

· Wire (встроенная библиотека Arduino IDE) - https://www.arduino.cc/en/Reference/Wire

· Adafruit_ADS1015 - https://github.com/adafruit/Adafruit_ADS1X15

· LiquidCrystal_I2C - https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library

· RTCLib - https://github.com/adafruit/RTClib

· SPI (встроенная библиотека Arduino IDE) - https://www.arduino.cc/en/Reference/SPI

· SD - https://github.com/arduino-libraries/SD

Автор будет рад всем конструктивным замечаниям и предложениям, которые помогут улучшить это описание и сам прибор.

Текст публикуется в соответствии с условиями лицензии CREATIVE COMMONS Attribution-NonCommercial-ShareAlike 3.0

©2018 Александр Бутовский

г. Санкт-Петербург

11 января 2018

butovsky@nm.ru

Виктор UA6EM ARDUINO
15 марта 2017 16:09
Сообщение Wiki
Урок 3. Установка программного обеспечения Arduino IDE, подключение платы к компьютеру.

Урок 3. Установка программного обеспечения Arduino IDE, подключение платы к компьютеру.

В уроке рассказывается, как установить программное обеспечение для работы с системой Ардуино под Windows 7, как подключить плату к компьютеру и загрузить первую программу. Оригинал статьи опубликован на сайте автора

Для установки программного обеспечения и подключения контроллера Arduino UNO R3 к компьютеру необходимы:

  • плата контроллера;
  • USB кабель (обычно дается в комплекте);
  • персональный компьютер с ОС Windows, подключенный к интернету.

Плата может получать питание от USB порта компьютера, поэтому внешний блок питания не требуется.



Установка интегрированной среды разработки  Arduino IDE.

Прежде всего, необходимо загрузить последнюю версию программы. Загрузить ZIP архив можно с официального сайта поддержки систем Ардуино по этой ссылке. Необходимо выбрать строку с нужной операционной системой – Windows ZIP file...

Создать папку, например Arduino, и распаковать в нее zip файл.


Подключение платы Ардуино.

С помощью USB кабеля подключите плату к компьютеру. Должен загореться светодиод (с маркировкой ON), показывающий, что на плату поступает питание.

Установка драйвера.

Мне известны платы Arduino UNO R3 использующие в качестве моста USB-UART

  • микросхему ATmega16U2  (оригинальный вариант)
  • микросхему CH340G (китайский клон).

Процессы установки драйверов для этих вариантов отличаются.


Установка драйвера для ARDUINO UNO с преобразователем интерфейсов ATmega16U2.

После подключения платы к компьютеру Windows сама начнет процесс установки драйвера. Через некоторое время появится сообщение о неудачной попытке.

Драйвер надо устанавливать вручную.  Для этого переходим  Пуск –> Панель управления –> Система –> Диспетчер устройств.

В разделе Порты (COM и LPT) должно быть устройство  Arduino UNO с предупреждающим желтым значком.

Щелкаем правой кнопкой мыши по значку.

Выбираем Обновить драйвер.

Дальше Выполнить поиск драйверов на этом компьютере.

Вручную указать место размещения драйвера. Файл ArduinoUNO.inf находится в каталоге Drivers папки, куда распакован архив.

В разделе Порты (COM и LPT) появляется новый, виртуальный COM. Его номер надо запомнить.


Установка драйвера для ARDUINO UNO с преобразователем интерфейсов CH340G (китайский клон). После подключения платы к компьютеру, Windows сама начнет процесс установки драйвера
Через некоторое время появится сообщение о неудачной попытке.

Драйвер надо устанавливать вручную.  Для этого переходим  Пуск –> Панель управления –> Система –> Диспетчер устройств.

Появилось новое устройство USB2.0-Serial с желтым предупреждающим значком.

Запускаем установочный файл ch341ser.exe.

Выбираем INSTALL.

Ждем сообщение об успешной установке.В диспетчере устройств появляется новое устройство USB-SERIAL CH340.

Необходимо запомнить номер COM порта.

Запуск интегрированной среды разработки Arduino IDE.

Запускаем файл arduino.exe.

Выбираем тип платы Ардуино:  Инструменты -> Плата -> Arduino UNO.

Необходимо указать номер COM порта: Инструменты -> Порт.

Для проверки работы системы можно запустить первый скетч – мигающий светодиод. Для этого: Файл -> Примеры -> 01.Basics -> Blink.

Нажимаем кнопку Загрузка.

Ждем пока программа загрузится и светодиод  на плате, обозначенный букой L, начинает мигать примерно раз в секунду. Значит все сделали правильно.

В следующем уроке получим минимальные знания о языке программирования для Ардуино - языке C++.


Виктор UA6EM ARDUINO
15 марта 2017 16:07
Сообщение Wiki
Урок 2. Плата Arduino UNO R3. Описание, характеристики.

Урок 2. Плата Arduino UNO R3. Описание, характеристики.



В статье рассказывается о контроллере Arduino UNO R3, выбранном для демонстрации программ уроков. Сейчас не обязательно внимательно изучать эту информацию. Рекомендую бегло просмотреть, чтобы иметь понятие об аппаратной части системы. В дальнейшем эту статью можно использовать как справочную информацию.
В качестве контроллера для программ уроков я выбрал плату Arduino UNO R3. Но ничего не мешает использовать и другие платы. Просто UNO R3 самый распространенный вариант контроллеров Ардуино.


Общая информация о контроллере.

Arduino UNO R3 выполнен на микроконтроллере  ATmega328. У него:

  • 14 цифровых портов входа-выхода ( 6 из них поддерживают режим ШИМ модуляции);
  • 6 аналоговых входов;
  • частота тактирования 16 МГц;
  • USB порт;
  • разъем питания;
  • разъем внутрисхемного программирования;
  • кнопка сброса.

У платы есть все необходимые компоненты для обеспечения работы микроконтроллера. Достаточно подключить USB кабель к компьютеру и подать питание. Микроконтроллер установлен на колодке, что позволяет легко заменить его в случае выхода из строя.

Технические характеристики.
Тип микроконтроллера ATmega328P
Напряжение питания микроконтроллера 5 В
Рекомендуемое напряжение питания платы 7 – 12 В
Предельно допустимое напряжение питания платы 6 – 20 В
Цифровые входы-выходы 14 (из них 6 поддерживают ШИМ)
Выходы ШИМ модуляции 6
Аналоговые входы 6
Допустимый ток цифровых выходов 20 мА
Допустимый ток выхода 3,3 В 50 мА
Объем флэш памяти (FLASH) 32 кБ (из которых 0,5 кБ используется загрузчиком)
Объем оперативной памяти (SRAM) 2 кБ
Объем энергонезависимой памяти (EEPROM) 1 кБ
Частота тактирования 16 мГц
Длина платы 68,6 мм
Ширина платы 53,4 мм
Вес 25 г


Программирование.

Контроллер программируется из интегрированной среды программного обеспечения Ардуино (IDE). Программирование происходит под управлением резидентного загрузчика по протоколу STK500. Аппаратный программатор при этом не требуется.

Микроконтроллер можно запрограммировать через разъем для внутрисхемного программатора ICSP, не используя, загрузчик. Исходный код программы-загрузчика  находится в свободном доступе.


Отличие от других контроллеров Ардуино.

Arduino UNO R3, в отличие от предыдущих версий, не использует для подключения к компьютеру мост USB-UART FTDI. Эту функцию в нем выполняет микроконтроллер ATmega16U2.

Система питания.

Плата UNO может получать питание от USB порта или от внешнего источника. Источник питания выбирается автоматически. В качестве внешнего источника питания может использоваться сетевой адаптер или батарея. Адаптер подключается через разъем диаметром 2,1 мм (центральный контакт – положительный). Батарея подключается к контактам GND и Vin разъема POWER.

Напряжение внешнего источника питания может быть в диапазоне 6 – 20 В. Но рекомендуется не допускать снижение напряжения ниже 7 В из-за нестабильной работы устройства. Также не желательно повышать напряжение питания более 12 В, т.к. может перегреется стабилизатор и выйти из строя. Т.е. рекомендуемый диапазон напряжения питания 7 – 12 В.

Для подключения питания могут быть использованы следующие выводы.


Vin Питание платы от внешнего источника питания. Не связано с питанием 5 В от USB или выходами других стабилизаторов. Через этот контакт можно получать питание для своего устройства, если плата питается от адаптера.
5 V Выход стабилизатора напряжения платы. На нем напряжение 5 В при любом способе питания. Питать плату через этот вывод не рекомендуется, т.к. не используется стабилизатор, что может привести к выходу микроконтроллера из строя.
3 V 3 Напряжение 3,3 В от стабилизатора напряжения на плате. Предельно допустимый ток потребления от этого вывода 50 мА.
GND Общий провод.
IOREF На выводе информация о рабочем напряжении платы. Плата расширения может считать значение сигнала и переключиться на режим питания 5 В или 3,3 В.
Память.

У микроконтроллера три типа памяти:

  • 32 кБ флэш  (FLASH);
  • 2 кБ оперативной памяти (SRAM);
  • 1 кБ энергонезависимой памяти (EEPROM).
Входы и выходы.

Каждый из 14 цифровых выводов может быть использован в качестве выхода или входа. Уровень напряжения на выводах 5 В. Рекомендовано вытекающий и втекающий ток каждого вывода ограничивать на уровне 20 мА. Предельно допустимое значение этого параметра составляет 40 мА. Каждый вывод имеет внутренний подтягивающий резистор сопротивлением 20-50 кОм. Резистор может быть отключен программно.

Некоторые выводы могут выполнять дополнительные функции.

Последовательный интерфейс: выводы 0 (Rx) и 1 (Tx). Используются для приема (Rx) и передачи (Tx) последовательных данных логических уровней TTL. Эти выводы подключены к выводам передачи данных микросхемы ATmega16U2, используемой в качестве моста USB-UART.

Внешние прерывания: выводы 2 и 3. Эти выводы могут быть использованы как входы внешних прерываний. Программно могут быть установлены на прерывание по низкому уровню, положительному или отрицательному фронту, или на изменение уровня сигнала.

ШИМ: выводы 3, 5, 6, 9, 10, 11. Могут работать в режиме ШИМ модуляции с разрешением 8 разрядов.

Последовательный интерфейс SPI: выводы 10(SS), 11(MOSI), 12(MISO), 13(SCK).

Светодиод: вывод 13. Светодиод, подключенный к выводу 13. Светится при высоком уровне сигнала на выводе.

Интерфейс TWI: вывод A4 или SDA и A5 или SCL. Коммуникационный интерфейс TWI.

У платы Arduino UNO есть 6 аналоговых входов, обозначенных A0-A5. Разрешающая способность аналогового цифрового преобразования 10 разрядов. По умолчанию, входное напряжение измеряется относительно земли в диапазоне 0-5 В, но может быть изменено с помощью вывода AREF и программных установок.

Еще 2 вывода платы имеют функции:

AREF. Опорное напряжение АЦП микроконтроллера.

RESET. Низкий уровень на этом выводе вызывает сброс микроконтроллера.

Коммуникационные интерфейсы.

Модуль Arduino UNO имеет средства для связи с компьютером, с другой платой UNO или с другими микроконтроллерами. Для этого на плате существует интерфейс UART с логическими уровнями TTL (5 В), связанный с выводами 0 (RX) и 1(TX). Микросхема ATmega16U2 на плате связывает UART интерфейс с USB портом компьютера. При подключении к порту компьютера, появляется виртуальный COM порт, через который программы компьютера работают с  Ардуино. Прошивка ATmega16U2 использует стандартные драйверы USB-COM и установка дополнительных драйверов не требуется. Для операционной системы Windows необходим соответствующий .inf файл. В интегрированную среду программного обеспечения Ардуино (IDE) включен монитор обмена по последовательному интерфейсу, который позволяет посылать и получать с платы простые текстовые данные. На плате есть светодиоды RX и TX, которые индицируют состояние соответствующих сигналов для связи через USB (но не для последовательного интерфейса на выводах 0 и 1).

Микроконтроллер ATmega328 также поддерживает коммуникационные интерфейсы I2C (TWI) и SPI.


Автоматический (программный)  сброс.

Для того, чтобы не приходилось каждый раз перед загрузкой программы нажимать кнопку сброс, на плате UNO реализована аппаратная функция сброса, инициируемая с подключенного компьютера. Один из сигналов управления потоком данных (DTR) микросхемы ATmega16U2 подключен к выводу сброса микроконтроллера ATmega328 через конденсатор емкостью 0,1 мкФ.  Когда сигнал DTR переходит в низкое состояние, формируется импульс сброса микроконтроллера. Это решение позволяет загружать программу одним нажатием кнопки из интегрированной среды программирования Андроид (IDE).

Но такая функция может приводить к отрицательным последствиям. При подключении платы UNO к компьютеру с операционной системой Mac Os X или Linux, микроконтроллер будет сбрасываться при каждом соединении программы с платой. В течение половины секунды на плате UNO будет запущен загрузчик. Несмотря на то, что программа загрузчика игнорирует посторонние данные, она может принять несколько байтов из пакета сразу после установки соединения. Если в программе на плате Ардуино предусмотрено получение каких-либо данных при первом запуске, необходимо отправлять данные с задержкой примерно на 1 секунду после соединения.

На модуле UNO существует дорожка, которую можно перерезать для отключения функции автоматического сброса. Дорожка маркирована надписью ”RESET-EN”. Автоматический сброс также можно запретить, подключив резистор сопротивлением 110 Ом между линией питания 5 В и выводом RESET.

Защита USB порта от перегрузок.

В плате Arduino UNO линия питания от интерфейса  USB защищена восстанавливаемым предохранителем. При превышении тока свыше 500 мА, предохранитель разрывает цепь до устранения короткого замыкания.


Оригинал статьи опубликован на сайте автора


Схема контроллера Arduino UNO.





Виктор UA6EM ARDUINO
15 марта 2017 13:01
Сообщение Wiki
Урок 1. Введение. Общие сведения об Ардуино

Урок 1. Введение. Общие сведения об Ардуино.



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

Введение.

В интернете существует большое число уроков по программированию в системе Ардуино. Большинство из них сводятся к примитивным программам, выполняющим последовательные действия из чужих функций.

Сразу бросается в глаза, что программы написаны крайне непрофессионально.

  • Не достаточно хорошо обрабатываются сигналы аппаратных устройств, подключаемых к контроллеру. Например, простейшие элементы – кнопки. Существует дребезг кнопок, они могут быть подключены длинными проводами, чувствительными к помехам. В надежной системе обязательно применение цифровой фильтрации сигналов с кнопок или датчиков сухого контакта. Как правило, в примерах уроков просто считывается состояние сигналов кнопок.
  • Надежные программы микроконтроллеров требуют циклической переустановки переменных, контроля целостности данных.
  • Хороший стиль программирования микроконтроллеров подразумевает структурное программирование. Это не формальные слова. Как известно можно писать красивые, структурные программы на ассемблере, а можно и на C++ такого нагородить.
  • Наверное, самое главное это многозадачность. Почти во всех уроках – последовательные действия программы. Посмотрели состояние кнопки, затем зажгли светодиод, вызвали какую-то непонятную функцию… Результат достигается просто, но и результат какой-то ущербный.

Если взять, к примеру, мою программу контроллера для холодильника на элементе Пельтье. Как ее сделать по такому принципу? Как с помощью простых последовательных операций выполнить все необходимые действия?   Эта программа написана на ассемблере PIC контроллера. Она выполняет множество параллельных операций:

  • С периодом 10 мс опрашивает три кнопки, обеспечивает цифровую фильтрацию сигналов кнопок, устранения дребезга.
  • Каждые 2 мс регенерирует данные светодиодных семисегментных индикаторов и светодиодов.
  • Формирует сигналы управления и считывает данные с двух датчиков температуры DS18B20 с интерфейсом 1-wire. Необходимо каждые 100 мкс формировать новый бит чтения или записи для каждого датчика.
  • Каждые 100 мкс считывает аналоговые значения выходного тока, выходного напряжения, напряжения питания.
  • Усредняет значения выходных тока и напряжения за 10 мс, вычисляет мощность на элементе Пельтье.
  • Постоянно работает сложная система регуляторов:
    • стабилизация тока, напряжения, мощности на элементе Пельтье;
    • ПИД (пропорционально интегрально дифференциальный) регулятор температуры.
  • Обрабатываются защитные функции, проверка целостности данных.
  • Обеспечивает чтение и запись внутреннего EEPROM.
  • Ну и, конечно, общее управление системой, логика работы.

Все эти операции надо выполнять циклически с разными периодами циклов. И ничего нельзя пропускать или приостанавливать. Такую программу невозможно реализовать простой последовательностью действий.

Так вот, я в своих уроках программирования Ардуино собираюсь уделить внимание вышеуказанным проблемам, собираюсь научить практическому программированию. Программированию контроллеров  Ардуино, которые работают с реальными объектами.

В то же время я ориентирую уроки на не профессиональных программистов, на людей, которые хотят научится программировать контроллеры.

Несмотря на пугающие выражения – цифровая фильтрация, многозадачность, это намного проще, чем кажется. Просто необходимо строго обрабатывать все возможные ситуации, не закрывать на  них глаза.

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

В каждом уроке я буду стремиться к созданию завершенного модуля, который можно использовать в будущих проектах. Идеальный вариант это создание подобия операционной системы, в которой используются драйверы (функции) всех внешних аппаратных средств. Мне удалось создать такую систему на PIC контроллерах для управления сложным фасовочным оборудованием. Она включает в себя среду для выполнения параллельных задач и драйверы для работы с шаговыми двигателями, датчиками, кнопками, дисплеем и т.п. Надеюсь получится и на Ардуино.


Общие сведения об Ардуино.

Ардуино (Arduino) это название аппаратно-программных средств  для создания простых электронных систем автоматики и робототехники. Система имеет полностью открытую архитектуру и ориентирована на непрофессиональных пользователей.

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

Аппаратная часть представляет собой электронные платы с микроконтроллером, сопутствующими элементами (стабилизатор питания, кварцевый резонатор, блокировочные конденсаторы и т.п.), портом для связи с персональным компьютером, разъемами для сигналов ввода-вывода и т.п.

Благодаря простоте разработке устройств система Ардуино получила крайне широкое распространение. В одном Яндексе до 150 тысяч запросов ”Ардуино” в месяц. Несмотря на простоту разработки проектов, используя Ардуино, могут быть созданы достаточно сложные системы, особенно после появления высокопроизводительных вариантов контроллеров.

В платах Ардуино используются микроконтроллеры Atmel  AVR с прошитым в них загрузчиком. С помощью загрузчика записывается программа в микроконтроллер из персонального компьютера без применения аппаратных программаторов.

Для программировании Ардуино используется язык C/C++, с некоторыми особенностями.

Существует громадное число клонов аппаратной части Ардуино. Большинство из низ являются полными аналогами фирменных Ардуино, часто не уступающими по качеству.


Оригинал статьи опубликован на сайте автора




Управление
Модераторы
Нет руководства