Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/AnalogInOutSerial

Материал из Онлайн справочника
Перейти к: навигация, поиск

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

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


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

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

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

  • Плата Arduino;
  • Потенциометр;
  • Светодиод;
  • 220-омовый резистор;

Цепь

Analoginoutserial1 bb.png

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

Схема

Analoginoutserial sch.png

Код

Для начала зададим, какие контакты за что отвечают – 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 в виде постоянного потока числовой информации.

  1. /*
  2. «Сырые» данные на входе, преобразованные на выходе, вывод результата на Serial Monitor
  3.  
  4. Считывает данные на входном аналоговом контакте, преобразовывает их в числовой диапазон от 0 до 255, а затем использует этот результат для создания широтно-импульсной модуляции (ШИМ) на выходном контакте. Также выводит результат на Serial Monitor.
  5. Цепь:
  6.  * центральный контакт потенциометра подсоединен к 0-ому аналоговому контакту, два крайних – к 5 вольтам и «земле»
  7.  * Светодиод подсоединен к 9-ому цифровому контакту и «земле»
  8.  
  9.  Создан 29 декабря 2008,
  10.  модифицирован 9 апреля 2012 Томом Иго (Tom Igoe)
  11.  
  12.  Этот код не защищен авторским правом.
  13.  
  14.  */
  15.  
  16. // Это константы – значения, которые не меняются.
  17. // Воспользуемся ими, чтобы задать имена для контактов:
  18. const int analogInPin = A0;  // входной аналоговый контакт, к которому подсоединен потенциометр
  19. const int analogOutPin = 9; // выходной аналоговый контакт, к которому подсоединен светодиод
  20.  
  21. int sensorValue = 0;        // данные, считанные от потенциометра
  22. int outputValue = 0;        // ШИМ-данные, идущие на выходной контакт
  23.  
  24. void setup() {
  25.   // инициализируем последовательную передачу данных со скоростью 9600 бит в секунду:
  26.   Serial.begin(9600);
  27. }
  28.  
  29. void loop() {
  30.   // считываем данные на входном аналоговом контакте:
  31.   sensorValue = analogRead(analogInPin);            
  32.   // преобразовываем эти данные в нужный диапазон
  33.   // для передачи на выходной аналоговой контакт:
  34.   outputValue = map(sensorValue, 0, 1023, 0, 255);  
  35.   // меняем значение, передаваемое на выходной контакт:
  36.   analogWrite(analogOutPin, outputValue);          
  37.  
  38.   // выводим результаты на Serial Monitor:
  39.   Serial.print("sensor = " );                      
  40.   Serial.print(sensorValue);      
  41.   Serial.print("\t output = ");      
  42.   Serial.println(outputValue);  
  43.  
  44.   // ждем 2 миллисекунды перед следующим заходом,
  45.   // чтобы аналоговой-цифровой преобразователь «успокоился»
  46.   // после последнего считывания:
  47.   delay(2);                    
  48. }

См.также

  1. map()
  2. analogRead()
  3. analogWrite()
  4. Serial
  5. AnalogReadSerial
  6. AnalogInput
  7. Fade
  8. Calibration

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

  1. Arduino - AnalogInOutSerial