No Image

Mypractic ru уроки ардуино

СОДЕРЖАНИЕ
113 просмотров
12 декабря 2019

15.01.2019 конспект был обновлён: поправлено оформление и добавлена информация!

Добро пожаловать в цикл “Уроки Ардуино с нуля, для чайников и школьников”, это официальная страница проекта “Заметки Ардуинщика“. Цикл охватывает все стандартные операторы и функции Ардуино и построен таким образом, что от выпуска к выпуску у зрителя идёт плавное формирование “базы”, каждый последующий урок (видео урок) содержит в себе информацию из предыдущих, то есть уроки усложняются и становятся комплексными.

Урок #0 – что такое Arduino? Возможности

Урок #0.5 – первые шаги, подключение и настройка

Урок #1 – структура скетча и типы данных

Урок #1.1 – операции с переменными и константами

Урок #2 – работа с последовательным портом

Урок #3 – условный оператор и оператор выбора

Урок #4 – функции времени: задержки и таймеры

Урок #5 – цифровые порты и подключение кнопки

Урок #6 – флажки и расширенное управление кнопкой

Урок #7 – правильное подключение светодиодов

Урок #8 – подключение и управление реле

Урок #9 – подключение и управление мосфетом

Урок #10 – оцифровка аналогового сигнала

Урок #11 – ШИМ сигнал, плавное регулирование

Урок #12 – работа с циклами

Блог технической поддержки моих разработок

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

Введение.

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

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

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

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

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

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

    Читайте также:  Амперметр в зарядном устройстве схема

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

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

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

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

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

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

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

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

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

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

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

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

    Блог технической поддержки моих разработок

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

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

    Структура программы Ардуино.

    Структура программы Ардуино достаточно проста и в минимальном варианте состоит из двух частей setup() и loop().

    // код выполняется один раз при запуске программы

    // основной код, выполняется в цикле

    Функция setup() выполняется один раз, при включении питания или сбросе контроллера. Обычно в ней происходят начальные установки переменных, регистров. Функция должна присутствовать в программе, даже если в ней ничего нет.

    После завершения setup() управление переходит к функции loop(). Она в бесконечном цикле выполняет команды, записанные в ее теле (между фигурными скобками). Собственно эти команды и совершают все алгоритмические действия контроллера.

    Первоначальные правила синтаксиса языка C.

    ; точка с запятой Выражения могут содержать сколь угодно много пробелов, переносов строк. Признаком завершения выражения является символ ”точка с запятой ”.

    < >фигурные скобки определяют блок функции или выражений. Например, в функциях setup() и loop().

    /* … */ блок комментария, обязательно закрыть.

    /* это блок комментария */

    // однострочный комментарий, закрывать не надо, действует до конца строки.

    // это одна строка комментария

    Переменные и типы данных.

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

    Читайте также:  Груша кармен описание сорта фото отзывы
    Тип данных Разрядность, бит Диапазон чисел
    boolean 8 true, false
    char 8 -128 … 127
    unsigned char 8 0 … 255
    byte 8 0 … 255
    int 16 -32768 … 32767
    unsigned int 16 0 … 65535
    word 16 0 … 65535
    long 32 -2147483648 … 2147483647
    unsigned long 32 0 … 4294967295
    short 16 -32768 … 32767
    float 32 -3.4028235+38 … 3.4028235+38
    double 32 -3.4028235+38 … 3.4028235+38

    Типы данных выбираются исходя из требуемой точности вычислений, форматов данных и т.п. Не стоит, например, для счетчика, считающего до 100, выбирать тип long. Работать будет, но операция займет больше памяти данных и программ, потребует больше времени.

    Объявление переменных.

    Указывается тип данных, а затем имя переменной.

    int x; // объявление переменной с именем x типа int
    float widthBox; // объявление переменной с именем widthBox типа float

    Все переменные должны быть объявлены до того как будут использоваться.

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

    • Переменные, объявленные в начале программы, до функции void setup(), считаются глобальными и доступны в любом месте программы.
    • Локальные переменные объявляются внутри функций или таких блоков, как цикл for, и могут использоваться только в объявленных блоках. Возможны несколько переменных с одним именем, но разными областями видимости.

    int mode; // переменная доступна всем функциям

    void setup() <
    // пустой блок, начальные установки не требуются
    >

    long count; // переменная count доступна только в функции loop()

    При объявлении переменной можно задать ее начальное значение (проинициализировать).

    int x = 0; // объявляется переменная x с начальным значением 0
    char d = ‘a’; // объявляется переменная d с начальным значением равным коду символа ”a”

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

    int x; // переменная int
    char y; // переменная char
    int z; // переменная int

    z = x + (int) y; // переменная y явно преобразована в int

    Арифметические операции.

    = присваиваниее
    + сложение
    вычитание
    * произведение
    / деление
    % остаток от деления

    Операции отношения.

    == равно
    != не равно
    больше
    = больше или равно

    Логические операции.

    && логическое И
    || логическое ИЛИ
    ! логическое НЕ

    Операции над указателями.

    * косвенная адресация
    & получение адреса переменной

    Битовые операции.

    & И
    | ИЛИ
    ^ ИСКЛЮЧАЮЩЕЕ ИЛИ

    ИНВЕРСИЯ > СДВИГ ВПРАВО

    Операции смешанного присваивания.

    ++ + 1 к переменной
    — 1 к переменной
    += сложение
    -= вычитание
    *= умножение
    /= деление
    %= остаток от деления
    &= битовое И
    |= битовое ИЛИ

    Выбор вариантов, управление программой.

    Оператор IF проверяет условие в скобках и выполняет последующее выражение или блок в фигурных скобках, если условие истинно.

    if (x == 5) // если x=5, то выполняется z=0
    z=0;

    if (x > 5) // если x > 5, то выполняется блок z=0, y=8;

    IF … ELSE позволяет сделать выбор между двух вариантов.

    if (x > 5) // если x > 5, то выполняется блок z=0, y=8;
    <
    z=0;
    y=8;
    >
    else // в противном случае выполняется этот блок
    <
    z=0;
    y=0;
    >

    ELSE IF – позволяет сделать множественный выбор

    if (x > 5) // если x > 5, то выполняется блок z=0, y=8;
    <
    z=0;
    y=8;
    >

    else if (x > 20) // если x > 20, выполняется этот блок
    <
    >

    else // в противном случае выполняется этот блок
    <
    z=0;
    y=0;
    >

    SWITCH CASE — множественный выбор. Позволяет сравнить переменную (в примере это x) с несколькими константами (в примере 5 и 10) и выполнить блок, в котором переменная равна константе.

    case 5 :
    // код выполняется если x = 5
    break;

    Читайте также:  Samsung ue40f6330ak включается и выключается

    case 10 :
    // код выполняется если x = 10
    break;

    default :
    // код выполняется если не совпало ни одно предыдущее значение
    break;
    >

    Цикл FOR. Конструкция позволяет организовывать циклы с заданным количеством итераций. Синтаксис выглядит так:

    for ( действие до начала цикла;
    условие продолжения цикла;
    действие в конце каждой итерации ) <

    Пример цикла из 100 итераций.

    Цикл WHILE. Оператор позволяет организовывать циклы с конструкцией:

    while ( выражение )
    <
    // код тела цикла
    >

    Цикл выполняется до тех пор, пока выражение в скобках истинно. Пример цикла на 10 итераций.

    x = 0;
    while ( x
    <
    // код тела цикла
    x++;
    >

    DO WHILE – цикл с условием на выходе.

    do
    <
    // код тела цикла
    > while ( выражение );

    Цикл выполняется пока выражение истинно.
    BREAK – оператор выхода из цикла. Используется для того, чтобы прервать выполнение циклов for, while, do while.

    x = 0;
    while ( x
    <
    if ( z > 20 ) break; // если z > 20, то выйти из цикла
    // код тела цикла
    x++;
    >

    GOTO – оператор безусловного перехода.

    goto metka1; // переход на metka1
    ………………
    metka1:

    CONTINUE — пропуск операторов до конца тела цикла.

    x = 0;
    while ( x
    <
    // код тела цикла
    if ( z > 20 ) continue; // если z > 20, то вернуться на начало тела цикла
    // код тела цикла
    x++;
    >

    Массивы.

    Массив это область памяти, где последовательно хранятся несколько переменных.

    Объявляется массив так.

    int ages[10]; // массив из 10 переменных типа int

    float weight[100]; // массив из 100 переменных типа float

    При объявлении массивы можно инициализировать:

    Обращаются к переменным массивов так:

    x = ages[5]; // x присваивается значение из 5 элемента массива.
    ages[9] = 32; // 9 элементу массива задается значение 32

    Нумерация элементов массивов всегда с нуля.

    Функции.

    Функции позволяют выполнять одни и те же действия с разными данными. У функции есть:

    • имя, по которому ее вызывают;
    • аргументы – данные, которые функция использует для вычисления;
    • тип данных, возвращаемый функцией.

    Описывается пользовательская функция вне функций setup() и loop().

    void setup() <
    // код выполняется один раз при запуске программы
    >

    void loop() <
    // основной код, выполняется в цикле
    >

    // объявление пользовательской функции с именем functionName
    type functionName( type argument1, type argument1, … , type argument)
    <
    // тело функции
    return();
    >

    Пример функции, вычисляющей сумму квадратов двух аргументов.

    int sumQwadr (int x, int y)
    <
    return( x* x + y*y);
    >

    Вызов функции происходит так:

    d= 2; b= 3;
    z= sumQwadr(d, b); // в z будет сумма квадратов переменных d и b

    Функции бывают встроенные, пользовательские, подключаемые.

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

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

    Рекомендации по оформлению программ на языке C.

    Главная цель внешнего оформления программ это улучшить читаемость программ, уменьшить число формальных ошибок. Поэтому для достижения этой цели можно смело нарушать все рекомендации.

    Имена в языке C.

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

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

    Константы должны быть записаны в верхнем регистре. В качестве разделителя нижнее подчеркивание.

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

    Об остальных формальностях в следующих уроках, по мере необходимости.

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

    Комментировать
    113 просмотров
    Комментариев нет, будьте первым кто его оставит

    Это интересно
    Adblock detector