Страница 5 из 15

Arduino. Изучаем вместе

Добавлено: 04 фев 2018, 15:37
KimIV
Назначение выводов платы Arduino Uno

Описывая основную плату ардуино, я как-то упустил из виду назначение выводов и прочей периферии. Надо это исправить. Хотя на самой плате все выводы подписаны, но тем не менее.

Arduino. Изучаем вместе - 08_1.png
Arduino. Изучаем вместе - 08_2.jpg


Разъём внешнего питания
Представляет собой обычный разъём под круглый Jack диаметром 5,5 мм, внешний вывод которого - минус, а внутренний - плюс питания. На этот разъём можно подавать от 6 до 20 В, рекомендуется от 7 до 12 В. А в комплекте идёт батарея типа "Крона" на 9 В.

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

Кнопка Reset
Используется для перезапуска скетча, когда возникает в этом потребность. Позволяет реже перетыкать разъёмы питания и/или USB.

Выводы питания
- IOREF - Это информационный вывод и он напрямую, то есть электрически связан с выводом 7 контроллера ATmega. Используется для передачи платам расширения сообщения о том, каким напряжением запитывается контроллер ATmega. Я измерил напряжение на этот выводе при питании платы от кроны 9В и от USB-PowerBank 5 В. На IOREF всегда 5 В. Немного позже методом прозвонки обнаружил, что именно на плате Arduino Uno этот вывод электрически соединён с выводом 5V.

Arduino. Изучаем вместе - 08_3.jpg
Arduino. Изучаем вместе - 08_4.jpg
Arduino. Изучаем вместе - 08_5.jpg


- RESET - Это управляющий вход/выход и электрически связан с одним из выводов кнопки Reset. В исходном состоянии на этом выводе 5 В. Следовательно, сброс выполняется замыканием этого вывода на землю GND (общий вывод, минус питания). Причем, можно как нажатием на кнопку Reset на плате Arduino Uno передавать на платы расширения сигнал сброса, так и от плат расширения получать сигнал сброса.

Arduino. Изучаем вместе - 08_6.jpg


- 3.3V - Стабилизированное напряжение 3,3 В. Используется обычно для питания дисплейных модулей.

Arduino. Изучаем вместе - 08_7.jpg
Arduino. Изучаем вместе - 08_8.jpg
Arduino. Изучаем вместе - 08_9.jpg


- 5V - Электрически связан с выводом 4 стабилизатора питания.

Arduino. Изучаем вместе - 08_10.jpg
Arduino. Изучаем вместе - 08_11.jpg
Arduino. Изучаем вместе - 08_12.jpg


- GND - Общий вывод, земля, минус питания.
- Vin - Вывод питания платы Ардуино. Электрически связан с выводом 3 стабилизатора питания. Этот вывод можно использовать как для запитывания плат расширения нестабилизированным напряжением напрямую от внешнего источника питания, так и для питания платы ардуино.

Arduino. Изучаем вместе - 08_13.jpg
Arduino. Изучаем вместе - 08_14.jpg
Arduino. Изучаем вместе - 08_15.jpg


Аналоговые входы
Их 6 (шесть) штук и каждый из них может использоваться не только как аналоговый вход, но и как цифровой выход. Но отличие от цифровых выводов аналоговые не нуждаются в установке режима работы, как входы или как выходы. Этот режим целиком и полностью определяется используемыми функциями:
- analogRead() - Измеряет напряжение на аналоговом входе с помощью 10-битного АЦП (аналого-цифровой преобразователь) и пропорционально преобразует его в целое число от 0 до 1024. Частота считывания около 0,1 мс.
- analogWrite() - Устанавливает либо низкий уровень на выходе, либо высокий.

Цифровые выводы
Их 14 (четырнадцать) штук и каждый из них может использоваться как вход или выход. Режим работы конкретного вывода устанавливается функцией pinMode(). Кроме того, 6 (шесть) выводов могут использоваться, как ШИМ (широтно-импульсная модуляция) выходы и их можно использовать например, для управления яркостью свечения светодиода или частоты вращения двигателя.

Arduino. Изучаем вместе

Добавлено: 05 фев 2018, 10:21
DOC
вот может интересно кому будет,Игорь в начало может поставишь :)
ардуино

Arduino. Изучаем вместе

Добавлено: 07 фев 2018, 07:22
Next
Я вот тоже Игорь думал раньше, когда MQL4 осваивал, с чем я его потом есть буду, когда надоест..Вот и пригодились знания. Давно собирался заказать этот комплекс.

Arduino. Изучаем вместе

Добавлено: 08 фев 2018, 15:40
KimIV
Аналоговые выводы, как цифровые выходы

Изучение аналоговых выводов - это мои первые грабли, на которые я наступил, что есть дури :crazy: А впрочем, давайте разбираться вместе и по порядку... ;)

Я хоть и имею корейские гены от деда, но по воспитанию русский до мозга костей что называется, поэтому инструкции читаю либо по диагонали, либо в самом конце, когда что-нибудь не получится или сломается :crazy: Именно поэтому я самостоятельно провёл параллель между цифровыми и аналоговыми выводами. А именно наделил аналоговые выводы способностью работать как выходы. Когда я наступил на эти грабли, я потом читал несколько разных источников. Везде аналоговые выводы упоминаются как входы, способные только принимать сигналы и работать как 10-ти битные АЦП (аналого-цифровой преобразователь). Но это было потом, а сначала я почему-то решил, что аналоговые выводы могут работать, как ШИМ-выходы и управлять яркостью свечения светодиода или скоростью вращения двигателя. Для экспериментов собрал на макетке вот такую схему.

Arduino. Изучаем вместе - 09_1.jpg
Arduino. Изучаем вместе - 09_2.jpg
Arduino. Изучаем вместе - 09_3.jpg
Arduino. Изучаем вместе - 09_4.png


И написал вот такой скетч.

Код: Выделить всё

int ledPin = A0;    // Номер аналогового вывода

void setup() {
}

void loop() {
  for (int i = 0; i <= 255; i++) {
    analogWrite(ledPin, i);
    delay(2);
  }

  for (int i = 255; i >= 0; i--) {
    analogWrite(ledPin, i);
    delay(2);
  }
}


Программа работает следующим образом. В целочисленную переменную ledPin помещается значение константы A0. Какое это именно значение, то есть какое это число, мы выясним позже, когда будем изучать средства отладки скетчей. А сейчас пока пользуемся константами вслепую. Инициализирующая функция setup() нам не нужна, поэтому оставляем её пустой. В основной функции loop() у нас два цикла. Первый увеличивает значение счётчика i от 0 до 255 с шагом 1, а второй уменьшает значение счётчика i от 255 до 0 и тоже с шагом 1. В телах обоих циклов две одинаковые команды. Первая прописывает аналоговое значение, задаваемое счётчиком i, на вывод, номер которого указан в переменной ledPin. Вторая выполняет паузу 2 мс. Таким образом, первый цикл увеличивает значение от 0 до 255, выводимое на аналоговый вывод, а второй цикл - уменьшает от 255 до 0. Предполагалось, что светодиод (зелёный), подключенный к аналоговому выводу А0, будет постепенно набирать яркость и постепенно гаснуть, то есть плавно так мигать. Но реальность оказалась немного другой - светодиод мигал так, как-будто был подключен к цифровому выходу. Увеличение паузы до 10 мс ни к чему не привело. Светодиод всё так же резко вспыхивал и резко выключался.

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

Код: Выделить всё

int ledPin = A0;    // Номер аналогового вывода

void setup() {
}

void loop() {
  analogWrite(ledPin, HIGH);
  delay(200);

  analogWrite(ledPin, LOW);
  delay(200);
}


Светодиод погас и больше не вспыхивал. Значения HIGH и LOW заменил на 255 и 0. Светодиод замигал. Теперь установил значения 128 и 127. Светодиод продолжил мигать. Вообщем, экспериментально я выяснил следующее

Аналоговые выводы работают как цифровые выходы, причём функция analogWrite() устанавливает на выходе сигнал низкого уровня при использовании значения параметра от 0 до 127 и сигнал высокого уровня при значении параметра от 128 до 32767.

Значение 32767 - это 2 в степени 15 минус единица. Я выяснил, что начиная от 2 в степени 15 (32768) и до 2 в степени 18, и наверняка и выше функция analogWrite() при использовании такого параметра на аналоговом выходе устанавливает сигнал низкого уровня.

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

Код: Выделить всё

int ledPin = A5;    // Номер аналогового вывода

void setup() {
}

void loop() {
  digitalWrite(ledPin, HIGH);
  delay(200);

  digitalWrite(ledPin, LOW);
  delay(200);
}


Светодиод стал мигать еле-еле. Яркость свечения намного меньше, чем "в полнакала". Забавный фифект, подумал я, увеличил паузу и полез мультиметром. 1,75 В на выводе... А при ярком свечении светодиода, устанавливаемого функцией analogWrite(ledPin, 128), напряжение на выводе 4,5 В. Для демонстрации фифекта и записи видео написал скетч с использованием функций digitalWrite() для аналогового вывода А5 и analogWrite() для вывода А0.

Код: Выделить всё

void setup() {
}

void loop() {
  digitalWrite(A5, HIGH);
  delay(200);
  digitalWrite(A5, LOW);

  analogWrite(A0, 128);
  delay(200);
  analogWrite(A0, 127);
}


Ну а теперь световой эффект "Переползание" на аналоговых выходах.

Код: Выделить всё

int High=255;
int Low=0;

void setup() {
}

void loop() {
  analogWrite(A0, High);
  delay(200);
  analogWrite(A1, High);
  delay(200);
  analogWrite(A2, High);
  delay(200);
  analogWrite(A3, High);
  delay(200);
  analogWrite(A4, High);
  delay(200);
  analogWrite(A5, High);
  delay(200);
  analogWrite(A0, Low);
  delay(200);
  analogWrite(A1, Low);
  delay(200);
  analogWrite(A2, Low);
  delay(200);
  analogWrite(A3, Low);
  delay(200);
  analogWrite(A4, Low);
  delay(200);
  analogWrite(A5, Low);
}


https://youtu.be/18cw2DAF_Zc

Arduino. Изучаем вместе

Добавлено: 08 фев 2018, 16:08
ROW
KimIV писал(а):Источник цитаты
Вообщем, экспериментально я выяснил следующее

Аналоговые выводы работают как цифровые выходы, причём функция analogWrite() устанавливает на выходе сигнал низкого уровня при использовании значения параметра от 0 до 127 и сигнал высокого уровня при значении параметра от 128 до 32767.
дурик,ты зачем усы отрастил? ардуину поломал?! Это ж получается недокументированая функция да?

Arduino. Изучаем вместе

Добавлено: 08 фев 2018, 16:29
KimIV
ROW писал(а):Источник цитаты дурик,ты зачем усы отрастил? ардуину поломал?!

Нам с тобой, Рома, давно пора поделить сферы влияния! Вот давай тут на берегу и договоримся. Ты ломаешь форум, я тебе не мешаю. А я ломаю ардуину и ты мне не мешаешь :D :D :D

ROW писал(а):Источник цитаты Это ж получается недокументированая функция да?

Похоже, что так... я по аналоговым портам ещё кое-что выяснил... но это чуть позже. Сначала надо про средства отладки скетчей рассказать ;)

Arduino. Изучаем вместе

Добавлено: 08 фев 2018, 17:20
ROW
Сообщение не по теме
KimIV писал(а):Источник цитаты Ты ломаешь форум, я тебе не мешаю. А я ломаю ардуину и ты мне не мешаешь
:shock: а чё, так можно делать?! :? ну давай попробуем..боюсь ардуиной тебе некогда будет заниматся..а так я согласен :D
Свернуть

KimIV писал(а):Источник цитаты Похоже, что так... я по аналоговым портам ещё кое-что выяснил...

какой ток и как длительно они смогут отдавать его?

Arduino. Изучаем вместе

Добавлено: 09 фев 2018, 10:57
KimIV
Отладка скетчей

Как-только я встретил в кодах скетчей такие константы, как HIGH, LOW, OUTPUT, мне сразу же стало любопытно, а что в них? Понятно, что это скорее всего какие-то числа, но какие именно? И чтобы ответить на этот вопрос, стал искать средства отладки скетчей и в первую очередь средства просмотра значений переменных и констант. И ведь нашёл :yahoo: Оказывается, в самой среде Arduino IDE есть средство взаимодействия с исполняемой контроллером прошивкой. Называется это средство "Монитор порта" и вызывается либо из Меню - Инструменты, либо кликом по кнопке на панели инструментов.

Arduino. Изучаем вместе - 10_1.png
Arduino. Изучаем вместе - 10_2.png
Arduino. Изучаем вместе - 10_3.png


Взаимодействие с портом, который можно мониторить из среды Arduino, выполняется посредством объекта Serial. Отправка сообщения в порт выполняется функциями:

Код: Выделить всё

Serial.print(<Параметры>); // Без переноса строки
Serial.println(<Параметры>); // С переносом строки


Про параметры функции Serial.print() подробнее почитать можно там.

А чтение из порта выполняется функцией:

Код: Выделить всё

Serial.read();


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

Вывод десятичных значений констант HIGH, LOW, INPUT и OUTPUT

Код: Выделить всё

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

  Serial.print("HIGH=");
  Serial.println(HIGH, DEC);

  Serial.print("LOW=");
  Serial.println(LOW, DEC);

  Serial.print("INPUT=");
  Serial.println(INPUT, DEC);

  Serial.print("OUTPUT=");
  Serial.println(OUTPUT, DEC);
}

void loop() {
}


Arduino. Изучаем вместе - 10_4.png


Теперь посмотрим десятичные значений констант, используемых в качестве второго параметра функции Serial.println().

Код: Выделить всё

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

  Serial.print("BIN=");
  Serial.println(BIN, DEC);

  Serial.print("OCT=");
  Serial.println(OCT, DEC);

  Serial.print("DEC=");
  Serial.println(DEC, DEC);

  Serial.print("HEX=");
  Serial.println(HEX, DEC);
}

void loop() {
}


Arduino. Изучаем вместе - 10_5.png


Десятичные значения констант, в которых содержатся номера аналоговых выводов.

Код: Выделить всё

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

  Serial.print("A0=");
  Serial.println(A0, DEC);

  Serial.print("A1=");
  Serial.println(A1, DEC);

  Serial.print("A2=");
  Serial.println(A2, DEC);

  Serial.print("A3=");
  Serial.println(A3, DEC);

  Serial.print("A4=");
  Serial.println(A4, DEC);

  Serial.print("A5=");
  Serial.println(A5, DEC);
}

void loop() {
}


Arduino. Изучаем вместе - 10_6.png


А вот это уже очень интересно. Цифровые выводы имеют номера с 0 до 13, а аналоговые с 14 до 19. Таким образом, мы имеем единое адресное пространство для всех выводов платы Arduino Uno. Что нам это даёт? Это даёт нам возможность упрощать код скетча. И когда, например, нам в каком-либо проекте не хватит цифровых выходов, которые обрабатываются в едином цикле, то мы без проблем в этот же единый цикл можем добавить аналоговые входы и использовать их как цифровые выходы. Для подтверждения этой мысли я собрал схемку, в которой задействовал цифровые выходы с 10 по 13 и аналоговые с А0 по А5 (их номера с 14 по 19) и написал скетч для реализации светового эффекта "Бегущий огонь".

Arduino. Изучаем вместе - 10_7.jpg
Arduino. Изучаем вместе - 10_8.jpg


Код: Выделить всё

int High=255;
int Low=0;

void setup() {
}

void loop() {
  for(int i=10; i<=19; i++) {
    analogWrite(i, High);
    delay(200);
    analogWrite(i, Low);
  }
}


https://youtu.be/s7-SA8h-_rA

Arduino. Изучаем вместе

Добавлено: 09 фев 2018, 11:03
KimIV
ROW писал(а):Источник цитаты какой ток и как длительно они смогут отдавать его?

Не знаю, но предполагаю, что как и цифровые 40 мА. А по факту они у меня мигали минут 15, а то и больше. Ток в импульсном режиме держали такой 4,5 В /220 Ом = 0,02 А или 20 мА.

Arduino. Изучаем вместе

Добавлено: 09 фев 2018, 11:45
ROW
KimIV писал(а):Источник цитаты Ток в импульсном режиме держали такой 4,5 В /220 Ом = 0,02 А или 20 мА.
:shock: обычно диод на постоянку подключеный такой ток потребляет а тут в импульсе..что там за СД? 0,5Вт на видюшке вроде "обычные" "желудем"