Эксперимент 3 светильник с управляемой яркостью ответы

Эксперимент 3 светильник с управляемой яркостью ответы

В этом эксперименте мы меняем яркость светодиода, вращая ручку переменного резистора.

    Список деталей для эксперимента

  • 1 плата Arduino Uno (или подобная)
  • 1 беспаечная макетная плата
  • 1 светодиод.
  • 1 резистор номиналом 220 Ом
  • 6 проводов «папа-папа»
  • 1 потенциометр
    • Для дополнительного задания

    • 1 еще 1 светодиод
    • 1 еще 1 резистор номиналом 220 Ом
    • 1 еще 2 провода

      Обратите внимание
  • Мы подключили «землю» светодиода и переменного резистора (потенциометра) к длинной рельсе «-» макетной платы, и уже ее соединили с входом GND микроконтроллера. Таким образом мы использовали меньше входов и от макетки к контроллеру тянется меньше проводов.
  • Подписи «+» и «-» на макетке не обязывают вас использовать их строго для питания, просто чаще всего они используются именно так и маркировка нам помогает
  • Не важно, какая из крайних ножек потенциометра будет подключена к 5 В, а какая к GND, поменяется только направление, в котором нужно крутить ручку для увеличения напряжения. Запомните, что сигнал мы считываем со средней ножки
  • Для считывания аналогового сигнала, принимающего широкий спектр значений, а не просто 0 или 1, как цифровой, подходят только порты, помеченные на плате как «ANALOG IN» и пронумерованные с префиксом A. Для Arduino Uno — это A0-A5.
  • Скетч

    // даём разумные имена для пинов со светодиодом
    // и потенциометром (англ potentiometer или просто «pot»)
    #define LED_PIN 9
    #define POT_PIN A0

    void setup()
    <

    // пин со светодиодом — выход, как и раньше.
    pinMode(LED_PIN, OUTPUT);

    // . а вот пин с потенциометром должен быть входом
    // (англ. «input»): мы хотим считывать напряжение,
    // выдаваемое им
    pinMode(POT_PIN, INPUT);
    >

    void loop()
    <

    // заявляем, что далее мы будем использовать 2 переменные с
    // именами rotation и brightness, и что хранить в них будем
    // целые числа (англ. «integer», сокращённо просто «int»)
    int rotation, brightness;

    // считываем в rotation напряжение с потенциометра:
    // микроконтроллер выдаст число от 0 до 1023
    // пропорциональное углу поворота ручки
    rotation = analogRead(POT_PIN);

    // в brightness записываем полученное ранее значение rotation
    // делённое на 4. Поскольку в переменных мы пожелали хранить
    // целые значения, дробная часть от деления будет отброшена.
    // В итоге мы получим целое число от 0 до 255
    brightness = rotation / 4;

    // выдаём результат на светодиод
    analogWrite(LED_PIN, brightness);
    >

  • С помощью директивы #define мы сказали компилятору заменять идентификатор POT_PIN на A0 — номер аналогового входа. Вы можете встретить код, где обращение к аналоговому порту будет по номеру без индекса A. Такой код будет работать, но во избежание путаницы с цифровыми портами используйте индекс.
  • Переменным принято давать названия, начинающиеся со строчной буквы.
  • Чтобы использовать переменную, необходимо ее объявить, что мы и делаем инструкцией:
    • Для объявления переменной необходимо указать ее тип, здесь — int (от англ. integer) — целочисленное значение в диапазоне
      от -32 768 до 32 767, с другими типами мы познакомимся позднее
    • Переменные одного типа можно объявить в одной инструкции, перечислив их через запятую, что мы и сделали
    • Функция analogRead(pinA) возвращает целочисленное значение в диапазоне от 0 до 1023, пропорциональное напряжению, поданному на аналоговый вход, номер которого мы передаем функции в качестве параметра pinA
    • Обратите внимание, как мы получили значение, возвращенное функцией analogRead(): мы просто поместили его в переменную rotation с помощью оператора присваивания =, который записывает то, что находится справа от него в ту переменную, которая стоит слева
      Вопросы для проверки себя
    1. Можем ли мы при сборке схемы подключить светодиод и потенциометр напрямую к разным входам GND микроконтроллера?
    2. В какую сторону нужно крутить переменный резистор для увеличения яркости светодиода?
    3. Что будет, если стереть из программы строчку pinMode(LED_PIN, OUTPUT)? строчку pinMode(POT_PIN, INPUT)?
    4. Зачем мы делим значение, полученное с аналогового входа перед тем, как задать яркость светодиода? что будет, если этого не сделать?
      Задания для самостоятельного решения
    1. Отключите питание платы, подключите к порту 5 еще один светодиод. Измените код таким образом, чтобы второй светодиод светился на 1/8 от яркости первого

    Источник

    Эксперимент 3 светильник с управляемой яркостью ответы

    ОБРАТИТЕ ВНИМАНИЕ

    • Мы подключили «землю» светодиода и переменного резистора (потенциометра) к длинной рельсе «» макетной платы, и уже ее соединили с входом GND микроконтроллера. Таким образом мы использовали меньше входов и от макетки к контроллеру тянется меньше проводов;
    • Подписи «+» и «-» на макетке не обязывают вас использовать их строго для питания, просто чаще всего они используются именно так и маркировка нам помогает;
    • Не важно, какая из крайних ножек потенциометра будет подключена к 5 В, а какая к GND, поменяется только направление, в котором нужно крутить ручку для увеличения напряжения. Запомните, что сигнал мы считываем со средней ножки;
    • Для считывания аналогового сигнала, принимающего широкий спектр значений, а не просто 0 или 1, как цифровой, подходят только порты, помеченные на плате как «ANALOG IN» и пронумерованные с префиксом A . Для Arduino Uno — это A0-A5.

    СКЕТЧ

    ПОЯСНЕНИЯ К КОДУ

    • С помощью директивы #define мы сказали компилятору заменять идентификатор POT_PIN на A0 — номер аналогового входа. Вы можете встретить код, где обращение к аналоговому порту будет по номеру без индекса A . Такой код будет работать, но во избежание путаницы с цифровыми портами используйте индекс;
    • Переменным принято давать названия, начинающиеся со строчной буквы;
    • Чтобы использовать переменную, необходимо ее объявить, что мы и делаем инструкцией:
    • Для объявления переменной необходимо указать ее тип, здесь — int (от англ. integer) — целочисленное значение в диапазоне от -32 768 до 32 767, с другими типами мы познакомимся позднее;
    • Переменные одного типа можно объявить в одной инструкции, перечислив их через запятую, что мы и сделали;
    • Функция analogRead(pinA) возвращает целочисленное значение в диапазоне от 0 до 1023, пропорциональное напряжению, поданному на аналоговый вход, номер которого мы передаем функции в качестве параметра pinA;
    • Обратите внимание, как мы получили значение, возвращенное функцией analogRead() : мы просто поместили его в переменную rotation с помощью оператора присваивания = , который записывает то, что находится справа от него в ту переменную, которая стоит слева;

    Источник

    Эксперимент 3. Светильник с управляемой яркостью

    Рис. 4 – Схема сборки
    Рис. 5 – Принципиальная схема

    Для работы данной схемы, напишем код, представленный в листинге 3.

    // даём разумные имена для пинов со светодиодом // и потенциометром (англ potentiometer или просто «pot») #define LED_PIN 9 #define POT_PIN A0 void setup() < // пин со светодиодом — выход, как и раньше. pinMode(LED_PIN, OUTPUT); // . а вот пин с потенциометром должен быть входом // (англ. «input»): мы хотим считывать напряжение, // выдаваемое им pinMode(POT_PIN, INPUT); >void loop() < // заявляем, что далее мы будем использовать 2 переменные с // именами rotation и brightness, и что хранить в них будем // целые числа (англ. «integer», сокращённо просто «int») int rotation, brightness; // считываем в rotation напряжение с потенциометра: // микроконтроллер выдаст число от 0 до 1023 // пропорциональное углу поворота ручки rotation = analogRead(POT_PIN); // в brightness записываем полученное ранее значение rotation // делённое на 4. Поскольку в переменных мы пожелали хранить // целые значения, дробная часть от деления будет отброшена. // В итоге мы получим целое число от 0 до 255 brightness = rotation / 4; // выдаём результат на светодиод analogWrite(LED_PIN, brightness); >
    Листинг 3

    Не нашли, что искали? Воспользуйтесь поиском:

    Источник

    Эксперимент 3 светильник с управляемой яркостью ответы

    Arduino это просто запись закреплена

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

    Обратите внимание:
    Показать полностью.
    — Защитный диод нам нужен для того, чтобы ток обратного направления, который начнет создавать двигатель, вращаясь по инерции, не вывел из строя транзистор.
    — Не перепутайте полярность диода, иначе, открыв транзистор, вы устроите короткое замыкание!
    — Причину отсутствия подтягивающих/стягивающих резисторов в схеме вы поймете, ознакомившись с программой.
    — Мы подключили питание схемы к выходу Vin платы микроконтроллера, потому что, в отличие выхода 5V, отсюда можно получить напряжение, подключенное к плате, без изменений и без ограничений по величине тока.

    #define MOTOR_PIN 9
    #define FIRST_BUTTON_PIN 5
    #define BUTTON_COUNT 3

    // имена можно давать не только числам, но и целым выражениям.
    // Мы определяем с каким шагом (англ. step) нужно менять
    // скорость (англ. speed) мотора при нажатии очередной кнопки
    #define SPEED_STEP (255 / (BUTTON_COUNT — 1))

    void setup()
    <
    pinMode(MOTOR_PIN, OUTPUT);
    // на самом деле, в каждом пине уже есть подтягивающий
    // резистор. Для его включения необходимо явно настроить пин
    // как вход с подтяжкой (англ. input with pull up)

    Arduino это просто запись закреплена

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

    Обратите внимание:
    Показать полностью.
    — Ножки тактовой кнопки, расположенные с одной стороны, разомкнуты, когда кнопка не нажата. Ножки, расположенные друг напротив друга на противоположных сторонах макетки находятся на одной «рельсе». Воспользовавшись этим, мы можем расположить резистор с одной стороны макетки, а провод, подключаемый к порту Arduino, с другой стороны.
    — В данном эксперименте мы подключаем кнопки по схеме с подтягивающим резистором.
    — Для того, чтобы данный вариант программы работал, важно, чтобы кнопки были подключены к портам, находящимся рядом друг с другом, т.е. имеющим соседние номера.

    #define BUZZER_PIN 13 // пин с пищалкой (англ. «buzzer»)
    #define FIRST_KEY_PIN 7 // первый пин с клавишей (англ. «key»)
    #define KEY_COUNT 3 // общее количество клавиш

    void setup()
    <
    pinMode(BUZZER_PIN, OUTPUT);
    >

    void loop()
    <
    // в цикле бежим по всем номерам кнопок от 0-го по 2-й

    Arduino это просто запись закреплена

    В этом эксперименте мы заставляем огонёк бежать по светодиодной шкале.

    Обратите внимание:
    Показать полностью.
    — Обратите внимание, что в данном эксперименте резисторы установлены между катодами и землей в отличие от эксперимента пульсар.
    — Мы подключаем светодиоды к цифровым портам, начиная с порта 2. Мы можем использовать порты 0 и 1, но они являются каналами передачи данных последовательного порта и для каждой перепрошивки платы придется отключать устройства, подключенные к ним.

    // светодиодная шкала подключена к группе пинов расположенных
    // подряд. Даём понятные имена первому и последнему пинам

    #define FIRST_LED_PIN 2
    #define LAST_LED_PIN 11

    void setup()
    <
    // в шкале 10 светодиодов. Мы бы могли написать pinMode 10
    // раз: для каждого из пинов, но это бы раздуло код и
    // сделало его изменение более проблематичным.
    // Поэтому лучше воспользоваться циклом. Мы выполняем
    // pinMode для (англ. for) каждого пина (переменная pin)
    // от первого (= FIRST_LED_PIN) до последнего включительно
    // ( 0; i = i — 1). В этом случае:
    o Переменной i присваивается значение 10
    o Это значение удовлетворяет условию i > 0
    o Поэтому блок кода, помещенный в цикл, выполняется первый раз
    o Значение i уменьшается на единицу, согласно заданному правилу, и принимает значение 9
    o Блок кода выполняется второй раз.
    o Всё повторяется снова и снова вплоть до значения i равного 0
    o Когда i станет равна 0, условие i > 0 не выполнится, и выполнение цикла закончится
    o Контроллер перейдет к коду, следующему за циклом for
    — Помещайте код, который нужно зациклить, между парой фигурных скобок <>, если в нем больше одной инструкции.
    — Переменная-счетчик, объявляемая в операторе for, может использоваться внутри цикла. Например, в данном эксперименте pin последовательно принимает значения от 2 до 11 и, будучи переданной вpinMode, позволяет настроить 10 портов одной строкой, помещенной в цикл.
    — Переменные-счетчики видны только внутри цикла. Т.е. если обратиться к pin до или после цикла, компилятор выдаст ошибку о необъявленной переменной.
    — Конструкция i = i — 1 в пояснении выше не является уравнением! Мы используем оператор присваивания = для того, чтобы в переменную i поместить значение, равное текущему значению i, уменьшенному на 1.
    — Выражение ++pin — это т.н. оператор инкремента, примененный к переменной pin. Эта инструкция даст тот же результат, что pin = pin + 1
    — Аналогично инкременту работает оператор декремента —, уменьшающий значение на единицу. Подробнее об этом в статье про арифметические операции.
    — Тип данных unsigned int используют для хранения целых чисел без знака, т.е. тольконеотрицательных. За счет лишнего бита, который теперь не используется для хранения знака, мы можем хранить в переменной такого типа значения до 65 535.
    — Функция millis возвращает количество миллисекунд, прошедших с момента включения или перезагрузки микроконтроллера. Здесь мы используем ее для отсчета времени между переключениями светодиодов.
    — С помощью выражения (ms / 120) % 10 мы определяем, который из 10 светодиодов должен гореть сейчас. Перефразируя, мы определяем какой отрезок длиной в 120 мс идет сейчас и каков его номер внутри текущего десятка. Мы добавляем порядковый номер отрезка к номеру того порта, который в текущем наборе выступает первым.
    То, что мы гасим светодиод с помощью digitalWrite(pin, LOW) всего через 10 мс после включения не заметно глазу, т.к. очень скоро будет вновь вычислено, какой из светодиодов включать, и он будет включен — только что погашенный или следующий.

    Arduino это просто запись закреплена

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

    Обратите внимание:
    Показать полностью.
    — Светодиодная шкала — это несколько светодиодов в одном корпусе. Нам нужно чтобы питание шло к их анодам, а катоды направлялись к земле. Скорее всего на вашей шкале аноды находятся со стороны маркировки. Если шкала не светится, когда должна, попробуйте перевернуть ее.
    — База биполярного транзистора — это его средняя ножка. Если повернуть транзистор плоской стороной к себе, ножками вниз, то левая ножка это коллектор, а правая — эмиттер.
    — Если эту схему собрать без резистора между базой транзистора и портом Arduino, мы практически устроим короткое замыкание порта на землю. Рано или поздно это выведет из строя транзистор или ножку микроконтроллера.
    — Зачем здесь вообще транзистор? Без него такое количество светодиодов будет потреблять больше тока, чем 40 мА, которые может себе позволить цифровой пин платы. Поэтому мы берем питание из порта 5V, рассчитанного на ток до 500 мА, а на цифровой порт ставим транзистор, чтобы с помощью малого тока управлять большим.
    — В данном случае мы включили 10 светодиодов параллельно, каждый через отдельный резистор. Включать их через один резистор неправильно: даже светодиоды из одной партии имеют минимальный разброс вольт-амперных характеристик, вследствие чего они:
    o Светились бы с различной яркостью
    o Из-за минимальной разницы во времени включения, больший ток, прошедший через первый включившийся светодиод, мог бы вывести его из строя. И так по цепочке.

    // переменные верхнего уровня, т.е. объявленные вне функций,
    // называют глобальными. Их значения сохраняются всё время,
    // пока работает микроконтроллер
    int brightness = 0;

    void setup()
    <
    pinMode(CONTROL_PIN, OUTPUT);
    >

    void loop()
    <
    // увеличиваем значение яркости на единицу, чтобы нарастить
    // яркость. Однако яркость не должна быть более 255, поэтому
    // используем операцию остатка от деления, чтобы при
    // достижении значения 255, следующим значением снова стал 0
    // Y % X — это остаток от деления Y на X;
    // плюс, минус, делить, умножить, скобки — как в алгебре.

    brightness = (brightness + 1) % 256;

    // подаём вычисленный ШИМ-сигнал яркости на пин с базой
    // управляющего транзистора

    // ждём 10 мс перед следующим наращиванием яркости. Таким
    // образом, полный накал будет происходить в течение
    // 256×10 = 2560 мс

    Пояснения к коду:
    — Как мы уже знаем, analogWrite(pin, value) в качестве value принимает значения от 0 до 255. Если передать значение из-за пределов этого диапазона, функция сработает, но в общем случае вы получите неожиданный результат.
    — Оператор X % Y дает остаток от деления X на Y. Если X меньше Y, т.е. целая часть результата деления равна 0, оператор % будет возвращать X. Таким образом:
    o Пока brightness + 1 меньше 256, в brightness записывается значение brightness + 1
    o Как только brightness + 1 принимает значение 256, результатом (brightness + 1) % 256становится 0 и на следующей итерации loop() всё начинается сначала.
    — Оператор % работает только с целыми операндами.
    — В выражении (brightness + 1) % 256 скобки используются для назначения порядка действий. Операция % имеет больший приоритет, чем +, а сложение нам нужно выполнять раньше. С операциями умножения и деления оператор взятия остатка имеет одинаковый приоритет.

    Arduino это просто запись закреплена

    В этом эксперименте мы имитируем действие музыкального инструмента терменвокс: изменяем высоту звучания бесконтактным путем, больше или меньше закрывая от света фоторезистор.
    Оригинальный инструмент был изобретён ещё в 1920 году, Львом Сергеевичем Терменом, человеком с непростой и насыщенной судьбой. А сейчас мы имеем возможность воспроизвести изобретение с помощью нехитрой электроники.
    Показать полностью.

    Обратите внимание:
    — В данной схеме мы используем резистор нового номинала, посмотрите таблицу маркировки, чтобы найти резистор на 10 кОм или воспользуйтесь мультиметром
    — Полярность фоторезистора, как и обычного резистора, не играет роли. Его можно устанавливать любой стороной
    — В данном упражнении мы собираем простой вариант схемы включения пьезодинамика
    — Полярность пьезопищалки роли не играет: вы можете подключать любую из ее ножек к земле, любую к порту микроконтроллера
    — На Arduino Uno использование функции tone мешает использованию ШИМ на 3-м и 11-м портах. Зато можно подключить ее к одному из них
    — Вспомните как устроен делитель напряжения: фоторезистор помещается в позицию R2 — между аналоговым входом и землей. Так мы получаем резистивный фотосенсор.
    Скетч:

    // даём имена для пинов с пьезопищалкой (англ. buzzer) и фото-
    // резистором (англ. Light Dependent Resistor или просто LDR)
    #define BUZZER_PIN 3
    #define LDR_PIN A0

    void setup()
    <
    // пин с пьезопищалкой — выход.
    pinMode(BUZZER_PIN, OUTPUT);

    // . а все остальные пины являются входами изначально,
    // всякий раз при подаче питания или сбросе микроконтроллера.
    // Поэтому, на самом деле, нам совершенно необязательно
    // настраивать LDR_PIN в режим входа: он и так им является
    >

    void loop()
    <
    int val, frequency;

    // считываем уровень освещённости так же, как для
    // потенциометра: в виде значения от 0 до 1023.

    // рассчитываем частоту звучания пищалки в герцах (ноту),
    // используя функцию проекции (англ. map). Она отображает
    // значение из одного диапазона на другой, строя пропорцию.
    // В нашем случае [0; 1023] -> [3500; 4500]. Так мы получим
    // частоту от 3,5 до 4,5 кГц.

    frequency = map(val, 0, 1023, 3500, 4500);

    // заставляем пин с пищалкой «вибрировать», т.е. звучать
    // (англ. tone) на заданной частоте 20 миллисекунд. При
    // cледующих проходах loop, tone будет вызван снова и снова,
    // и на деле мы услышим непрерывный звук тональностью, которая
    // зависит от количества света, попадающего на фоторезистор

    tone(BUZZER_PIN, frequency, 20);
    >

    Пояснения к коду:
    — Функция map(value, fromLow, fromHigh, toLow, toHigh) возвращает целочисленное значение из интервала [toLow, toHigh], которое является пропорциональным отображением содержимого valueиз интервала [fromLow, fromHigh]
    — Верхние границы map не обязательно должны быть больше нижних и могут быть отрицательными. К примеру, значение из интервала [1, 10] можно отобразить в интервал [10,-5]
    — Если при вычислении значения map образуется дробное значение, оно будет отброшено, а не округлено
    — Функция mapне будет отбрасывать значения за пределами указанных диапазонов, а также масштабирует их по заданному правилу.
    — Если вам нужно ограничить множество допустимых значений, используйте функцию constrain(value, from, to), которая вернет:
    o value, если это значение попадает в диапазон [from, to]
    o from, если value меньше него
    o to, если value больше него
    — Функция tone(pin, frequency, duration) заставляет пьезопищалку, подключенную к порту pin, издавать звук высотой frequency герц на протяжении duration миллисекунд
    — Параметр duration не является обязательным. Если его не передать, звук включится навсегда. Чтобы его выключить, вам понадобится функция noTone(pin). Ей нужно передать номер порта с пищалкой, которую нужно выключить
    — Одновременно можно управлять только одной пищалкой. Если во время звучания вызвать tone для другого порта, ничего не произойдет.
    — Вызов tone для уже звучащего порта обновит частоту и длительность звучания

    Arduino это просто запись закреплена

    -— « Светильник с управляемой яркостью » —-

    Обратите внимание
    — Мы подключили «землю» светодиода и переменного резистора (потенциометра) к длинной рельсе «-» макетной платы, и уже ее соединили с входом GND микроконтроллера. Таким образом мы использовали меньше входов и от макетке к контроллеру тянется меньше проводов.
    — Подписи «+» и «-» на макетке не обязывают вас использовать их строго для питания, просто чаще всего они используются именно так и маркировка нам помогает
    Показать полностью.
    — Не важно, какая из крайних ножек потенциометра будет подключена к 5 В, а какая к GND, поменяется только направление, в котором нужно крутить ручку для увеличения напряжения. Запомните, что сигнал мы считываем со средней ножки
    — Для считывания аналогового сигнала, принимающего широкий спектр значений, а не просто 0 или 1, как цифровой, подходят только порты, помеченные на плате как «ANALOG IN» и пронумерованные с префиксом A. Для Arduino Uno — это A0-A5.

    // даём разумные имена для пинов со светодиодом
    // и потенциометром (англ potentiometer или просто «pot»)
    #define LED_PIN 9
    #define POT_PIN A0

    void setup()
    <
    // пин со светодиодом — выход, как и раньше.
    pinMode(LED_PIN, OUTPUT);

    // . а вот пин с потенциометром должен быть входом
    // (англ. «input»): мы хотим считывать напряжение,
    // выдаваемое им
    pinMode(POT_PIN, INPUT);
    >

    void loop()
    <
    // заявляем, что далее мы будем использовать 2 переменные с
    // именами rotation и brightness, и что хранить в них будем
    // целые числа (англ. «integer», сокращённо просто «int»)
    int rotation, brightness;

    // считываем в rotation напряжение с потенциометра:
    // микроконтроллер выдаст число от 0 до 1023
    // пропорциональное углу поворота ручки
    rotation = analogRead(POT_PIN);

    // в brightness записываем полученное ранее значение rotation
    // делённое на 4. Поскольку в переменных мы пожелали хранить
    // целые значения, дробная часть от деления будет отброшена.
    // В итоге мы получим целое число от 0 до 255
    brightness = rotation / 4;

    // выдаём результат на светодиод
    analogWrite(LED_PIN, brightness);
    >

    Пояснения к коду:
    — С помощью директивы #define мы сказали компилятору заменять идентификатор POT_PIN на A0 — номер аналогового входа. Вы можете встретить код, где обращение к аналоговому порту будет по номеру без индекса A. Такой код будет работать, но во избежание путаницы с цифровыми портами используйте индекс.
    — Переменным принято давать названия, начинающиеся со строчной буквы.
    — Чтобы использовать переменную, необходимо ее объявить, что мы и делаем инструкцией:
    int rotation, brightness;
    — Для объявления переменной необходимо указать ее тип, здесь — int (от англ. integer) — целочисленное значение в диапазоне от -32 768 до 32 767, с другими типами мы познакомимся позднее
    — Переменные одного типа можно объявить в одной инструкции, перечислив их через запятую, что мы и сделали
    — Функция analogRead(pinA) возвращает целочисленное значение в диапазоне от 0 до 1023, пропорциональное напряжению, поданному на аналоговый вход, номер которого мы передаем функции в качестве параметра pinA
    — Обратите внимание, как мы получили значение, возвращенное функцией analogRead(): мы просто поместили его в переменную rotation с помощью оператора присваивания =, который записывает то, что находится справа от него в ту переменную, которая стоит слева

    Arduino это просто запись закреплена

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

    Библиотека SPI
    Данная библиотека позволяет Ардуино взаимодействовать с различными SPI-устройствами, выступая при этом в роли ведущего устройства.
    Краткое введение в интерфейс SPI (Serial Peripheral Interface)
    Показать полностью.
    Последовательный периферийный интерфейс (SPI) — это синхронный протокол последовательной передачи данных, используемый для связи микроконтроллера с одним или несколькими периферийными устройствами. Интерфейс SPI отличается относительно высокой скоростью и предназначен для связи близко расположенных устройств. Он также может использоваться для взаимодействия двух микроконтроллеров.
    Согласно протоколу SPI, одно из взаимодействующих устройств (обычно микроконтроллер) всегда является ведущим и контролирует ведомые периферийные устройства. Как правило, все взаимодействющие устройства объединены тремя общими линиями:
    • MISO (Master In Slave Out) — линия для передачи данных от ведомого устройства (Slave) к ведущему (Master),
    • MOSI (Master Out Slave In) — линия для передачи данных от ведущего устройства (Master) к ведомым (Slave),
    • SCK (Serial Clock) — тактовые импульсы, генерируемые ведущим устройством (Master) для синхронизации процесса передачи данных.
    Помимо перечисленных, на каждое устройство отводится отдельная линия:
    • SS (Slave Select) — вывод, присутствующий на каждом ведомом устройстве. Он предназначен для активизации Мастером того или иного периферийного устройства.
    Периферийное устройство (Slave) взаимодействует с ведущим (Master) тогда, когда на выводе SS присутствует низкий уровень сигнала. В противном случае данные от Master-устройства будут игнорироваться. Такая архитектура позволяет взаимодействовать с несколькими SPI-устройствами, подключенными к одной и той же шине: MISO, MOSI и SCK.
    Перед тем, как отправлять данные новому SPI-устройству, необходимо выяснить о нем несколько основных моментов:
    • Сдвиг данных должен осуществляться, начиная со старшего бита (MSB) или с младшего бита (LSB)? Порядок следования данных контролируется функциейSPI.setBitOrder().
    • При отсутствии тактовых импульсов линия SCK должна находиться в высоком или низком уровне? Считывание данных происходит по фронту или по спаду тактового импульса? Эти режимы работы контролируются функциейSPI.setDataMode().
    • Какова должна быть скорость передачи данных по SPI? Этот параметр контролируется функцией SPI.setClockDivider().
    Поскольку стандарт SPI является открытым, его реализация в разных устройствах может немного отличаться. Поэтому при написании программ, особое внимание необходимо уделять даташиту того или иного устройства.
    Грубо говоря, существует четыре режима передачи данных, отличающиеся условием сдвига данных (по фронту или по спаду синхро-импульсов — так называемая фаза), а также уровнем сигнала, в котором должна находится линия SCK при отсутствии синхро-импульсов (полярность). Различные комбинации фазы и полярности, формирующие четыре режима передачи данных, сведены в таблицу:

    Режим Полярность (CPOL) Фаза (CPHA)
    SPI_MODE0 0 0
    SPI_MODE1 0 1
    SPI_MODE2 1 0
    SPI_MODE3 1 1

    Для изменения режима передачи данных служит функция SPI.setDataMode().
    Каждое SPI-устройство налагает определенные ограничения на максимальную скорость SPI-шины. Для корректной работы периферийных устройств в библиотеке предусмотрена функция SPI.setClockDivider(), позволяющая изменять тактовую частоту шины (по умолчанию 4 МГц).
    После правильной настройки всех параметров SPI, останется только выяснить, какие регистры периферийного устройства отвечают за те или иные его функции. Как правило, это описано в даташите устройства.
    Для получения дополнительной информации об интерфейсе SPI, см. страницу Википедии.
    Соединения
    Ниже в таблице приведены номера выводов, использующиеся шиной SPI в тех или иных моделях Ардуино:
    Плата Arduino MOSI MISO SCK SS (slave) SS (master)
    Uno или Duemilanove 11 или ICSP-4 12 или ICSP-1 13 или ICSP-3 10 —
    Mega1280 или Mega2560 51 или ICSP-4 50 или ICSP-1 52 или ICSP-3 53 —
    Leonardo ICSP-4 ICSP-1 ICSP-3 — —
    Due ICSP-4 ICSP-1 ICSP-3 — 4, 10, 52
    Обратите внимание, что на всех платах выводы MISO, MOSI и SCK соединены с одними и теми же контактами разъема ICSP. Такое расположение может быть удобно при создании универсальных плат расширения, работающих на всех моделях Ардуино.

    Особенности работы вывода SS в Ардуино на базе AVR

    У всех моделей Ардуино на основе микроконтроллеров AVR есть вывод SS, который используется в режиме работы Slave (например, при управлении Ардуино внешним ведущим устройством). Однако, в библиотеке реализован только режим работы Master, поэтому в этом режиме вывод SS должен быть сконфигурирован как выход. В противном случае SPI может аппаратно переключиться в режим Slave, что приведет к неработоспособности функций библиотеки.
    Для управления выводом SS периферийных устройств можно использовать любой из доступных выводов. Например, на плате расширения Arduino Ethernet для взаимодействия со встроенной SD-картой и контроллером Ethernet по SPI используются выводы 4 и 10 соответственно.

    Расширенные возможности SPI на Arduino Due

    Существуют некоторые особенности работы с интерфейсом SPI на платах Arduino Due. Помимо основных функций и методов, применимых ко всем платам Ардуино, в библиотеке SPI предусмотрено несколько дополнительных методов. Эти методы реализовывают аппаратные возможности микроконтроллеров SAM3X и предоставляют разработчику расширенные возможности:
    • автоматический управление процессом выбора ведомого устройства;
    • автоматическое управление конфигурациями интерфейса SPI для различных устройств (тактовая частота, режим передачи данных и т.д.). Благодаря этому каждое из ведомых устройств может иметь собственный набор настроек, автоматически применяемых в начале передачи.
    В Arduino Due есть три отдельных вывода (4, 10 и 52) для управления линиями SS периферийных устройств.

    Источник

    Читайте так же:  Приложение qcyber для настройки подсветки
    Оцените статью
    Охраны в доме нет
    Adblock
    detector