1. В сообществе нашего форума Вконтакте создан раздел по продаже электронных компонентов.
    Каждый может продать в нем свои залежавшиеся детали. Подробности здесь.

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

Тема в разделе "Учебник Arduino", создана пользователем radioengineer, 27 авг 2013.

  1. radioengineer

    radioengineer Администратор Команда форума

    Сообщения:
    3.489
    Симпатии:
    345
    Адрес:
    Алматы
    Теперь поговорим про программирование все этого чуда под названием Arduino UNO. Для программирования используется Arduino IDE, которую можно скачать на официальном сайте. Вот так выглядит окно программы:

    [​IMG]

    Программируется Arduino на языке Wiring, который есть просто надстройка над С/С++, которая абстрагирует разработчика от нужды настраивать все вручную, изучать даташиты на МК и т.п., т.е. разработчик уделяет больше внимания алгоритмам и самой задаче.
    Например, начать работу с последовательным портом на скорости 9600 бит в секунду, можно всего одной строчкой:
    Код:
    Serial.begin(9600);
    Загрузив любой тестовый скетч Вы сразу увидите, что там обязательно присутствуют 2 функции: setup() и loop().

    [​IMG]

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

    Функция loop() в бесконечном цикле последовательно раз за разом исполняет команды, которые описаны в ее теле. Т.е. после завершения функции снова произойдет ее вызов.

    Разберем простой пример:
    Код:
    void setup()          // начальные установки
    {
      beginSerial(9600);  // установка скорости работы серийного порта на 9600 бит/сек
      pinMode(3, INPUT);  // установка 3-его порта на ввод данных
    }
    
    // Программа проверяет 3-ий порт на наличие на нём сигнала и посылает ответ в
    // виде текстового сообщения на последовательный порт компьютера
    void loop()                    // тело программы
    {
      if (digitalRead(3) == HIGH)  // условие на опрос 3го порта
        serialWrite('H');          // отправка сообщения в виде буквы «Н» на COM-порт
      else
        serialWrite('L');          // отправка сообщения в виде буквы «L» на COM-порт
      delay(1000);                // задержка 1 сек.
    }
    Константы – предопределенные значения. Они используются, чтобы делать программы более легкими для чтения.

    При чтении или записи к цифровому порту применимо только два возможных значения – порт может быть установлен как HIGH (высокий уровень) или LOW (низкий уровень).

    Уровень HIGH соответствует 5 вольтам на выходе. При чтении значения на цифровом порте, начиная с 3 вольт и выше (до напряжения питания), микропроцессор воспримет это напряжение как HIGH. Эта константа представлена целым числом 1.

    Уровень LOW соответствует 0 вольтам на выходе порта. При чтении значения на цифровом порте, начиная с 2 вольт и меньше (до 0V), микропроцессор воспримет это напряжение как LOW. Эта константа представлена целым числом 0.

    Таким образом, оба следующих вызова будут эквивалентны:
    Код:
    digitalWrite(13, HIGH);  // можно так,
    digitalWrite(13, 1);        // а можно и так
    
    Настройка цифровых портов на ввод (INPUT) и вывод (OUTPUT) сигналов

    Цифровые порты могут использоваться на ввод или вывод сигналов. Изменение порта с ввода на вывод производится при помощи функции pinMode().
    Пример:
    Код:
    pinMode(13, OUTPUT);  // 13й вывод будет выходом
    pinMode(12, INPUT);  // а 12й – входом
    
    sterswift нравится это.
  2. radioengineer

    radioengineer Администратор Команда форума

    Сообщения:
    3.489
    Симпатии:
    345
    Адрес:
    Алматы
    Рассмотрим как можно записать в цифровой порт значение 1 или 0:
    Код:
    digitalWrite(порт, значение); 
    Описание:
    Устанавливает высокий (HIGH) или низкий (LOW) уровень напряжения на указанном порте.

    Параметры:
    порт: номер порта

    Значение: HIGH или LOW

    Пример:
    Код:
    digitalWrite(4, HIGH);  // выставляем 4й вывод в «высокое» состояние

    Теперь посмотрим как считать текущее значение с цифрового порта:

    Код:
    value = digitalRead (порт);
    Как видно здесь нам уже нужна переменная value, которая объявляется заранее и будет хранить значение считываемое с порта.
    Описание:
    Считывает значение на указанном порту

    Параметры:
    порт: номер опрашиваемого порта

    Возвращаемое значение: возвращает текущее значение на порту (HIGH или LOW) типа int

    Пример:
    Код:
    int value;
    value = digitalRead(4);  // опрашиваем 4й вывод
    Примечание:
    Если к считываемому порту ничего не подключено, то функция digitalRead () может беспорядочно возвращать значения HIGH или LOW.
  3. radioengineer

    radioengineer Администратор Команда форума

    Сообщения:
    3.489
    Симпатии:
    345
    Адрес:
    Алматы
    Аналоговый ввод/вывод сигнала
    Код:
    value = analogRead(порт);
    Считывает значение с указанного аналогового порта. Arduino/Freeduino содержит 6 каналов аналого-цифрового преобразователя на 10 битов каждый. Это означает, что входное напряжения от 0 до 5В преобразовывается в целочисленное значение от 0 до 1023. Разрешающая способность считывания составляет: 5V/1024 значений = 0,004883 В/значение (4,883 мВ). Требуется приблизительно 100 нсек (0.0001 сек), чтобы считать значение аналогового ввода, так что максимальная скорость считывания — приблизительно 10000 раз в секунду.

    Возвращаемое значение: возвращает число типа int в диапазоне от 0 до 1023, считанное с указанного порта.
    Пример:
    Код:
     int value;
      value = analogRead(0);  // считываем значение на 0м аналоговом входе
    Аналоговые порты по умолчанию определенны на ввод сигнала и в отличие от цифровых портов их не требуется конфигурировать с помощью вызова функции pinMode.
    Код:
    analogWrite(порт, значение); 
    Выводит на порт аналоговое значение. Эта функция работает на: 3, 5, 6, 9, 10, и 11 цифровых портах Arduino.
    Может применяться для изменения яркости светодиода, для управления двигателем и т.д. После вызова функции analogWrite, соответствующий порт начинает работать в режиме ШИМ (Широтно-Импульсная Модуляция) напряжения до тех пор, пока не будет следующего вызова функции analogWrite (или функций digitalRead / digitalWrite на том же самом порте).

    Значение: целочисленное между 0 и 255. Значение 0 генерирует 0 В на указанном порте; значение 255 генерирует +5В на указанном порте. Для значений между 0 и 255, порт начинает быстро чередовать уровень напряжения 0 и +5 В — чем выше значение, тем, более часто порт генерирует уровень HIGH (5 В).
    Пример:
    Код:
    analogWrite(9, 128);  // устанавливаем на 9 контакте значение эквивалентное 2,5В
  4. radioengineer

    radioengineer Администратор Команда форума

    Сообщения:
    3.489
    Симпатии:
    345
    Адрес:
    Алматы
  5. Сергий

    Сергий Живет здесь

    Сообщения:
    57
    Симпатии:
    7
    не понял, написано:
    Это означает, что входное напряжения от 0 до 5В преобразовывается в целочисленное значение от 0 до 1023.

    А затем пишется:
    Значение: целочисленное между 0 и 255.

    Т.е. остальные числа 256, 257,.. 1023 роли не играют? Ибо уже с 255 начинается подаваться 5В.
  6. koteika

    koteika В доску свой

    Сообщения:
    783
    Симпатии:
    120
    Род занятий:
    программирование
    Тут написано про шим...

    А тут про АЦП

    ;)
  7. Сергий

    Сергий Живет здесь

    Сообщения:
    57
    Симпатии:
    7
    ШИМ - это типо расширения? Дополнительная плата (планка)?

    а

    АЦП - это те входа, которые на самой плате Arduino?

    Правильно понял?
  8. koteika

    koteika В доску свой

    Сообщения:
    783
    Симпатии:
    120
    Род занятий:
    программирование
    АЦП - аналогово цифровой преобразователь.. То есть аналоговый сигнал от 0 до 5В преобразует в цифровой, то есть понятный микроконтроллеру..

    Шим - Широтно импульсная модуляция- это генерация сигнала. То есть можно заставить выдать пин микроконтроллера любое напряжение от 0 до 5В.
  9. koteika

    koteika В доску свой

    Сообщения:
    783
    Симпатии:
    120
    Род занятий:
    программирование
    Вот про АЦП

    Ссылка на мою статью http://blog.radiotech.kz/blog/50.html .... правда по стм32..
  10. koteika

    koteika В доску свой

    Сообщения:
    783
    Симпатии:
    120
    Род занятий:
    программирование
    ШИМ и АЦП это перефирия микроконтроллера, то есть то что заложено в нем. Иногда отсутствует. Например в attiny2313 нету АЦП...
  11. radioengineer

    radioengineer Администратор Команда форума

    Сообщения:
    3.489
    Симпатии:
    345
    Адрес:
    Алматы
  12. monitorrr

    monitorrr В доску свой

    Сообщения:
    331
    Симпатии:
    94
    Род занятий:
    инженер сервиса
    Адрес:
    Алматы
    Вопрос к знатокам по АЦП в Ардуино:
    1) Какие по умолчанию стоят настройки АЦП?
    1.1) То что используется в качестве опорного напряжения - напряжения питания я понял. (если нет поправьте)
    (Биты 7:6 – REFS1:REFS0 регистра ADMUX выставлены соответственно 0 и 1?)
    1.2) Как выставлен бит ADLAR?
    1.3) Как сконфигурирован регистр ADCSR?
    Если можно с примером кода дать ответ)))
  13. Alex

    Alex В доску свой

    Сообщения:
    191
    Симпатии:
    13
    Файл "wiring_analog.c" даст ответы на все ваши вопросы.
  14. monitorrr

    monitorrr В доску свой

    Сообщения:
    331
    Симпатии:
    94
    Род занятий:
    инженер сервиса
    Адрес:
    Алматы
    Alex, раздел учебник Ардуино, тема программирование Ардуино, вы бы меня сразу в Гугл послали и все...
  15. Alex

    Alex В доску свой

    Сообщения:
    191
    Симпатии:
    13
    Так уверенно описывали регистры контроллера, что я решил что как минимум даташит Вы читали, а возможно и в AVRstudio работали.
    Проблема, что не можете найти где это настраивается в ардуино. Все находиться в самой среде ардуино. В файле "wiring_analog.c" как раз библиотека для ADC. Там весь код.
    c:\Arduino\arduino-1.6.7\hardware\arduino\avr\cores\arduino\
  16. Alex

    Alex В доску свой

    Сообщения:
    191
    Симпатии:
    13

Поделиться этой страницей