Arduino:Примеры/AnalogInOutSerial: различия между версиями

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Нет описания правки
Нет описания правки
 
(не показано 7 промежуточных версий этого же участника)
Строка 3: Строка 3:
{{Myagkij-редактор}}
{{Myagkij-редактор}}


==«Сырые» данные на входе, преобразованные на выходе, вывод результата на Serial Monitor <ref>[http://www.arduino.cc/en/Tutorial/AnalogInOutSerial Arduino - AnalogInOutSerial]</ref>==
=«Сырые» данные на входе, преобразованные на выходе, вывод результата на Serial Monitor <ref>[http://www.arduino.cc/en/Tutorial/AnalogInOutSerial Arduino - AnalogInOutSerial]</ref>=


Данный пример показывает, как считывать данные на входном аналоговом контакте, преобразовывать их в численный диапазон от 0 до 225, а получившийся результат использовать для создания широтно-импульсной модуляции (ШИМ) на выходном контакте – чтобы управлять яркостью светодиода.
Данный пример показывает, как считывать данные на входном аналоговом контакте, преобразовывать их в численный диапазон от 0 до 225, а получившийся результат использовать для создания [[широтно-импульсной модуляции]] ([[ШИМ]]) на выходном контакте – чтобы управлять яркостью [[светодиод]]а.


==Необходимое оборудование==
==Необходимое оборудование==


* Плата '''Arduino''';
* Плата [[Arduino]] - 1 шт.
* Потенциометр;
* [[Потенциометр]] - 1 шт.
* Светодиод;
* [[Светодиод]] - 1шт.
* 220-омовый резистор;
* [[Резистор]] на [[220 Ом]] - 1шт.


== Цепь ==
== Цепь ==


[[File:analoginoutserial1_bb.png]]
[[File:analoginoutserial1_bb.png|frame|center|'''Рис. 1.''' Подключение [[светодиод]]а и [[потенциометр]]а к плате [[Arduino]]|alt=Рис. 1. Подключение светодиода и потенциометра к плате Arduino]]


Подсоедините один контакт потенциометра к 5-вольтовому напряжению на Arduino, центральный – к 0-ому аналоговому контакту, а оставшийся – к «земле» (GND). Теперь подсоедините 220-омовый (токоограничивающий) резистор к 9-ому цифровому контакту. Затем подсоедините к резистору длинную ногу светодиода (ногу с положительным зарядом, т.е. анод) – таким образом, светодиод будет подключен через резистор к выходному контакту. Вторую ногу светодиода (ногу с отрицательным зарядом, т.е. катод) подсоедините к «земле».
Подсоедините один контакт потенциометра к 5-вольтовому напряжению на [[Arduino]], центральный – к 0-ому аналоговому контакту, а оставшийся – к «земле» (GND). Теперь подсоедините 220-омовый (токоограничивающий) [[резистор]] к 9-ому цифровому контакту. Затем подсоедините к [[резистор]]у длинную ногу [[светодиод]]а (ногу с положительным зарядом, т.е. [[анод]]) – таким образом, [[светодиод]] будет подключен через [[резистор]] к выходному контакту. Вторую ногу [[светодиод]]а (ногу с отрицательным зарядом, т.е. [[катод]]) подсоедините к «земле».


== Схема ==
== Схема ==


[[File:analoginoutserial_sch.png]]
[[File:analoginoutserial_sch.png|frame|center|'''Рис. 2.''' Схема подключения [[светодиод]]а и [[потенциометр]]а к плате [[Arduino]].|alt=Рис. 2. Схема подключения светодиода и потенциометра к плате Arduino]]


== Код ==
== Код ==


Для начала зададим, какие контакты за что отвечают – 0-ой аналоговый для потенциометра, а 9-ый цифровой для светодиода. Затем задаем две переменные – sensorValue и outputValue. После того в функции setup() остается прописать лишь последовательную передачу данных.
Для начала зададим, какие контакты за что отвечают – 0-ой аналоговый для [[потенциометр]]а, а 9-ый цифровой для [[светодиод]]а. Затем задаем две переменные – sensorValue и outputValue. После того в функции [[Arduino:Справочник языка Arduino/setup()|setup()]] остается прописать лишь последовательную передачу данных.
Далее переходим к главному циклу, а переменную sensorValue начинаем использовать в качестве «отсека» для хранения «сырых» (т.е. исходных) аналоговых данных, полученных от потенциометра. Но числа, считываемые при помощи функции analogRead(), имеют диапазон от 0 до 1023, а диапазон данных у функции analogWrite() составляет от 0 до 255. Поэтому эти числовые диапазоны нужно будет подогнать друг к другу. Для этого воспользуемся функцией map().  


<syntaxhighlight lang="c" enclose="div">
Далее переходим к главному циклу, а переменную sensorValue начинаем использовать в качестве «отсека» для хранения «сырых» (т.е. исходных) аналоговых данных, полученных от потенциометра. Но числа, считываемые при помощи функции [[Arduino:Справочник языка Arduino/Функции/Аналоговый ввод/вывод/analogRead()|analogRead()]], имеют диапазон от 0 до 1023, а диапазон данных у функции [[Arduino:Справочник языка Arduino/Функции/Аналоговый ввод/вывод/analogWrite()|analogWrite()]] составляет от 0 до 255. Поэтому эти числовые диапазоны нужно будет подогнать друг к другу. Для этого воспользуемся функцией [[Arduino:Справочник языка Arduino/Функции/Математические функции/map()|map()]].
 
<syntaxhighlight lang="c">
outputValue = map(sensorValue, 0, 1023, 0, 255);
outputValue = map(sensorValue, 0, 1023, 0, 255);
</syntaxhighlight>
</syntaxhighlight>


То есть в переменной outputValue будут данные, полученные от потенциометра, но преобразованные при помощи функции map(). Это преобразование осуществляется путем «скармливания» функции map() пяти аргументов – переменной, которую нужно преобразовать (sensorValue), нижнего (0) и верхнего (1023) пределов исходных данных, а также нижнего (0) и верхнего (255) пределов итоговых данных. Таким образом, в данном примере численный диапазон от 0 до 1023 как бы «масштабируется» для соответствия численному диапазону от 0 до 255.  
То есть в переменной outputValue будут данные, полученные от потенциометра, но преобразованные при помощи функции [[Arduino:Справочник языка Arduino/Функции/Математические функции/map()|map()]]. Это преобразование осуществляется путем «скармливания» функции [[Arduino:Справочник языка Arduino/Функции/Математические функции/map()|map()]] пяти аргументов – переменной, которую нужно преобразовать (sensorValue), нижнего (0) и верхнего (1023) пределов исходных данных, а также нижнего (0) и верхнего (255) пределов итоговых данных. Таким образом, в данном примере численный диапазон от 0 до 1023 как бы «масштабируется» для соответствия численному диапазону от 0 до 255.  
После этого преобразованные («масштабированные») данные передаются на контакт analogOutPin, благодаря чему светодиод и будет менять свою яркость  при кручении ручки потенциометра. И, наконец, в финале выводим исходные и итоговые данные на окно Serial Monitor в виде постоянного потока числовой информации.
 
После этого преобразованные («масштабированные») данные передаются на контакт analogOutPin, благодаря чему [[светодиод]] и будет менять свою яркость  при кручении ручки [[потенциометр]]а. И, наконец, в финале выводим исходные и итоговые данные на окно Serial Monitor в виде постоянного потока числовой информации.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
/*
/*
«Сырые» данные на входе, преобразованные на выходе, вывод результата на Serial Monitor
«Сырые» данные на входе, преобразованные на выходе, вывод результата на Serial Monitor
Строка 87: Строка 89:
</syntaxhighlight>
</syntaxhighlight>


==См.также==
=См.также=


# [[Arduino:Справочник языка Arduino/Функции/Математические функции/map()|map()]]
# [[Arduino:Справочник языка Arduino/Функции/Математические функции/map()|map()]]
Строка 97: Строка 99:
# [[Arduino:Примеры/Fade|Fade]]
# [[Arduino:Примеры/Fade|Fade]]
# [[Arduino:Примеры/Calibration|Calibration]]
# [[Arduino:Примеры/Calibration|Calibration]]
# [[Электроника:Постоянный ток/Закон Ома/Резисторы|Резисторы]]


==Внешние ссылки==
=Внешние ссылки=


<references />
<references />
{{Навигационная таблица/Справочник языка Arduino}}
 
{{Навигационная таблица/Arduino библиотеки}}
{{Навигационная таблица/Портал/Arduino}}
{{Навигационная таблица/Телепорт}}
 
[[Категория:Пример]]
[[Категория:Пример]]
[[Категория:Примеры]]
[[Категория:Примеры]]
[[Категория:Пример программирования Arduino]]
[[Категория:Пример программирования Arduino]]
[[Категория:Примеры программирования Arduino]]
[[Категория:Примеры программирования Arduino]]

Текущая версия от 09:22, 24 февраля 2023

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


«Сырые» данные на входе, преобразованные на выходе, вывод результата на Serial Monitor [1]

Данный пример показывает, как считывать данные на входном аналоговом контакте, преобразовывать их в численный диапазон от 0 до 225, а получившийся результат использовать для создания широтно-импульсной модуляции (ШИМ) на выходном контакте – чтобы управлять яркостью светодиода.

Необходимое оборудование

Цепь

Рис. 1. Подключение светодиода и потенциометра к плате Arduino
Рис. 1. Подключение светодиода и потенциометра к плате Arduino

Подсоедините один контакт потенциометра к 5-вольтовому напряжению на Arduino, центральный – к 0-ому аналоговому контакту, а оставшийся – к «земле» (GND). Теперь подсоедините 220-омовый (токоограничивающий) резистор к 9-ому цифровому контакту. Затем подсоедините к резистору длинную ногу светодиода (ногу с положительным зарядом, т.е. анод) – таким образом, светодиод будет подключен через резистор к выходному контакту. Вторую ногу светодиода (ногу с отрицательным зарядом, т.е. катод) подсоедините к «земле».

Схема

Рис. 2. Схема подключения светодиода и потенциометра к плате Arduino
Рис. 2. Схема подключения светодиода и потенциометра к плате Arduino.

Код

Для начала зададим, какие контакты за что отвечают – 0-ой аналоговый для потенциометра, а 9-ый цифровой для светодиода. Затем задаем две переменные – sensorValue и outputValue. После того в функции setup() остается прописать лишь последовательную передачу данных.

Далее переходим к главному циклу, а переменную sensorValue начинаем использовать в качестве «отсека» для хранения «сырых» (т.е. исходных) аналоговых данных, полученных от потенциометра. Но числа, считываемые при помощи функции analogRead(), имеют диапазон от 0 до 1023, а диапазон данных у функции analogWrite() составляет от 0 до 255. Поэтому эти числовые диапазоны нужно будет подогнать друг к другу. Для этого воспользуемся функцией map().

outputValue = map(sensorValue, 0, 1023, 0, 255);

То есть в переменной outputValue будут данные, полученные от потенциометра, но преобразованные при помощи функции map(). Это преобразование осуществляется путем «скармливания» функции map() пяти аргументов – переменной, которую нужно преобразовать (sensorValue), нижнего (0) и верхнего (1023) пределов исходных данных, а также нижнего (0) и верхнего (255) пределов итоговых данных. Таким образом, в данном примере численный диапазон от 0 до 1023 как бы «масштабируется» для соответствия численному диапазону от 0 до 255.

После этого преобразованные («масштабированные») данные передаются на контакт analogOutPin, благодаря чему светодиод и будет менять свою яркость при кручении ручки потенциометра. И, наконец, в финале выводим исходные и итоговые данные на окно Serial Monitor в виде постоянного потока числовой информации.

/*
«Сырые» данные на входе, преобразованные на выходе, вывод результата на Serial Monitor

Считывает данные на входном аналоговом контакте, преобразовывает их в числовой диапазон от 0 до 255, а затем использует этот результат для создания широтно-импульсной модуляции (ШИМ) на выходном контакте. Также выводит результат на Serial Monitor.
Цепь:
 * центральный контакт потенциометра подсоединен к 0-ому аналоговому контакту, два крайних – к 5 вольтам и «земле»
 * Светодиод подсоединен к 9-ому цифровому контакту и «земле»
 
 Создан 29 декабря 2008,
 модифицирован 9 апреля 2012 Томом Иго (Tom Igoe)
 
 Этот код не защищен авторским правом.
 
 */

// Это константы – значения, которые не меняются.
// Воспользуемся ими, чтобы задать имена для контактов:
const int analogInPin = A0;  // входной аналоговый контакт, к которому подсоединен потенциометр
const int analogOutPin = 9; // выходной аналоговый контакт, к которому подсоединен светодиод 

int sensorValue = 0;        // данные, считанные от потенциометра
int outputValue = 0;        // ШИМ-данные, идущие на выходной контакт

void setup() {
  // инициализируем последовательную передачу данных со скоростью 9600 бит в секунду:
  Serial.begin(9600);
}

void loop() {
  // считываем данные на входном аналоговом контакте:
  sensorValue = analogRead(analogInPin);            
  // преобразовываем эти данные в нужный диапазон
  // для передачи на выходной аналоговой контакт:
  outputValue = map(sensorValue, 0, 1023, 0, 255);  
  // меняем значение, передаваемое на выходной контакт:
  analogWrite(analogOutPin, outputValue);           

  // выводим результаты на Serial Monitor:
  Serial.print("sensor = " );                       
  Serial.print(sensorValue);      
  Serial.print("\t output = ");      
  Serial.println(outputValue);   

  // ждем 2 миллисекунды перед следующим заходом,
  // чтобы аналоговой-цифровой преобразователь «успокоился»
  // после последнего считывания:
  delay(2);                     
}

См.также

  1. map()
  2. analogRead()
  3. analogWrite()
  4. Serial
  5. AnalogReadSerial
  6. AnalogInput
  7. Fade
  8. Calibration
  9. Резисторы

Внешние ссылки