Л.р.Ардуино. Общие сведения
Скачать 1.2 Mb.
|
| Общие сведения Arduino Uno контроллер построен на ATmega328 . Платформа имеет 14 цифровых вход/выходов (6 из которых могут использоваться как выходы ШИМ), 6 аналоговых входов, кварцевый генератор 12 МГц, разъем USB, силовой разъем, разъем ICSP и кнопку перезагрузки. Для работы необходимо подключить платформу к компьютеру посредством кабеля USB, либо подать питание при помощи адаптера AC/DC или батареи. "Uno" переводится как "один" с итальянского и разработчики тем самым намекают на грядущий выход Arduino 1.0. Новая плата стала флагманом линейки плат Ардуино. В процессор Arduino можно загрузить программу, которая будет управлять всеми этими устройствами по заданному алгоритму. Таким образом можно создать бесконечное количество уникальных классных гэджетов, сделанных своими руками и по собственной задумке. Характеристики
Питание Arduino Uno может получать питание через подключение USB или от внешнего источника питания. Источник питания выбирается автоматически. Внешнее питание (не USB) может подаваться через преобразователь напряжения AC/DC (блок питания) или аккумуляторной батареей. Преобразователь напряжения подключается посредством разъема 2.1 мм с центральным положительным полюсом. Провода от батареи подключаются к выводам Gnd и Vin разъема питания. Платформа может работать при внешнем питании от 6 В до 20 В. При напряжении питания ниже 7 В, вывод 5V может выдавать менее 5 В, при этом платформа может работать нестабильно. При использовании напряжения выше 12 В регулятор напряжения может перегреться и повредить плату. Рекомендуемый диапазон от 7 В до 12 В. Выводы питания: VIN— Вход используется для подачи питания от внешнего источника (в отсутствие 5 В от разъема USB или другого регулируемого источника питания). Подача напряжения питания происходит через данный вывод. 5V— Регулируемый источник напряжения, используемый для питания микроконтроллера и компонентов на плате. Питание может подаваться от вывода VIN через регулятор напряжения, или от разъема USB, или другого регулируемого источника напряжения 5 В. 3.3V— Напряжение на выводе 3.3 В генерируемое встроенным регулятором на плате. Максимальное потребление тока 50 мА. GND— Выводы заземления. Память Объем флеш-памяти ATmega328 составляет 32 КБ (из которых 0.5 КБ используются загрузчиком). Микроконтроллер также имеет 2 КБ памяти SRAM и 1 КБ EEPROM (из которой можно считывать или записывать информацию с помощью библиотеки EEPROM). Входы и Выходы Каждый из 14 цифровых выводов Uno может настроен как вход или выход, используя функции pinMode(), digitalWrite(), и digitalRead(). Выводы работают при напряжении 5 В. Каждый вывод имеет нагрузочный резистор (по умолчанию отключен) 20-50 кОм и может пропускать до 40 мА. Некоторые выводы имеют особые функции: Последовательная шина: 0 (RX) и 1 (TX). Выводы используются для получения (RX) и передачи (TX) данных TTL. Данные выводы подключены к соответствующим выводам микросхемы последовательной шины ATmega8U2 USB-to-TTL. Внешнее прерывание: 2 и 3. Данные выводы могут быть сконфигурированы на вызов прерывания либо на младшем значении, либо на переднем или заднем фронте, или при изменении значения. Подробная информация находится в описании функции attachInterrupt(). ШИМ: 3, 5, 6, 9, 10, и 11. Любой из выводов обеспечивает ШИМ с разрешением 8 бит при помощи функции analogWrite(). SPI: 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCLK). Последовательный синхронный стандарт передачи данных в режиме полного дуплекса, предназначенный для обеспечения простого и недорогого сопряжения микроконтроллеров и периферии., для чего используется библиотека SPI. CS или SS — выбор микросхемы, выбор ведомого (англ. Chip Select, Slave Select). MOSI — выход ведущего, вход ведомого (англ. Master Out Slave In). Служит для передачи данных от ведущего устройства ведомому. MISO — вход ведущего, выход ведомого (англ. Master In Slave Out). Служит для передачи данных от ведомого устройства ведущему. SCLK — последовательный тактовый сигнал (англ. Serial Clock). Служит для передачи тактового сигнала для ведомых устройств. LED: 13. Встроенный светодиод, подключенный к цифровому выводу 13. Если значение на выводе имеет высокий потенциал, то светодиод горит. На платформе Uno установлены 6 аналоговых входов (обозначенных как A0 .. A5), каждый разрешением 10 бит (т.е. может принимать 1024 различных значения). Стандартно выводы имеют диапазон измерения до 5 В относительно земли, тем не менее имеется возможность изменить верхний предел посредством вывода AREF и функции analogReference(). Некоторые выводы имеют дополнительные функции: I2C: 4 (SDA) и 5 (SCL). Посредством выводов осуществляется связь I2C (TWI) (интерфейс представляет собой две двунаправленные линии связи – SDA и SCL, по SDA передаются данные, по SCL тактовый сигнал), для создания которой используется библиотека Wire. Дополнительная пара выводов платформы: AREF. Опорное напряжение для аналоговых входов. Используется с функцией analogReference(). Reset. Низкий уровень сигнала на выводе перезагружает микроконтроллер. Обычно применяется для подключения кнопки перезагрузки на плате расширения, закрывающей доступ к кнопке на самой плате Arduino. Связь На платформе Arduino Uno установлено несколько устройств для осуществления связи с компьютером, другими устройствами Arduino или микроконтроллерами. ATmega328 поддерживают последовательный интерфейс UART TTL (5 В), осуществляемый выводами 0 (RX) и 1 (TX). Установленная на плате микросхема CH340G направляет данный интерфейс через USB, программы на стороне компьютера "общаются" с платой через виртуальный COM порт. Прошивка CH340G использует стандартные драйвера CH340G, что чаще всего требует установку стороних драйверов. Мониторинг последовательной шины (Serial Monitor) программы Arduino позволяет посылать и получать текстовые данные при подключении к платформе. Светодиоды RX и TX на платформе будут мигать при передаче данных через микросхему FTDI или USB подключение (но не при использовании последовательной передачи через выводы 0 и 1). Библиотекой SoftwareSerial возможно создать последовательную передачу данных через любой из цифровых выводов Uno. Программирование Платформа программируется посредством ПО Arduino. Из меню Tools > Board выбирается «Arduino Uno» (согласно установленному микроконтроллеру). Язык программирования устройств Ардуино основан на C/C++. Написание программ Программы, создаваемые в среде разработки Ардуино, иногда еще называют скетчами. Скетчи пишутся в текстовом редакторе и сохраняются в файлах с расширением .ino. Встроенный текстовый редактор имеет стандартные инструменты копирования, вставки, поиска и замены текста. Область сообщений в окне программы является, своего рода, обратной связью для пользователя и информирует его о событиях (в том числе и об ошибках), возникающих в процессе записи или экспорта написанного кода. Консоль отображает в виде текста поток выходных данных среды Ардуино, включая все сообщения об ошибках и пр. генерируемую ею информацию. В нижнем правом углу окна программы показывается модель текущей платы и последовательный порт, к которому она подключена. Кнопки на панели инструментов предназначены для создания, открытия, сохранения и прошивки программ в устройство. Отдельная кнопка запускает программу SerialMonitor. Библиотеки Библиотеки расширяют функциональность программ и несут в себе дополнительные функции, например, для работы с аппаратными средствами, функции по обработке данных и т.д. Для подключения библиотеки необходимо выбрать ее из меню Sketch > Import Library. После этого библиотека будет скомпилирована, а в начало программы будет добавлен один или несколько операторов #include. Помните, что библиотеки загружаются в контроллер вместе со скетчем, поэтому каждая подключенная библиотека треубет дополнительного места в памяти микроконтроллера. Соответственно, если та или иная библиотека больше не используется в вашей программе - просто удалите оператор #include из программы. Список основных библиотек, описанных на сайте, приведен здесь. Некоторые из них устанавливаются вместе со средой разработки Ардуино, остальные можно скачать из разных источников. ЛАБОРАТОРНАЯ РАБОТА №1 МИГАНИЕ СВЕТОДИОДОМ В этом уроке вы узнаете что такое скетч, о специальных функциях setup() и loop(). О том, как подрядить на работу цифровой вход-выход и подать на него напряжение. Также узнаете о том что такое breadboard. Перечень оборудования: 1) Плата Arduino Uno; 2) Usb-кабель; 3) Макетная плата; 4) 2 соединительных провода; 5) Светодиод; 6) Резистор на 290 Ом. Исходный код программы int ledPin=13; //объявление константы в нашей программе void setup() //оператор запуска программы { pinMode(13, OUTPUT);//цифровой вх/вых делаем вых } void loop() //оператор цикла { digitalWrite(13, HIGH); //записываем в цифровой выход 13 высокий уровень сигнала delay(1000); //ждем 1 секунду digitalWrite(13, LOW); //записываем в цифровой вых 13 низкий уровень сигнала delay(1000); //ждем 1 секунду } Описание используемых функции Тип данных int (от англ. integer - целое число) один их наиболее часто используемых типов данных для хранения чисел. int занимает 2 байта памяти, и может хранить числа от -32 768 до 32 767 (от -2^15 до 2^15-1). Функция setup() вызывается, когда стартует скетч. Используется для инициализации переменных, определения режимов работы выводов, запуска используемых библиотек и т.д. Функция setup запускает только один раз, после каждой подачи питания или сброса платы Arduino. После вызова функции setup(), которая инициализирует и устанавливает первоначальные значения, функция loop() делает точь-в-точь то, что означает её название, и крутится в цикле, позволяя вашей программе совершать вычисления и реагировать на них. Int устанавливает режим работы заданного вход/выхода(pin) как входа или как выхода. DigitalWrite подает HIGH или LOW значение на цифровой вход/выход (pin). Если вход/выход (pin) был установлен в режим выход (OUTPUT) функцией pinMode(), то для значение HIGH напряжение на соответствующем вход/выходе (pin) будет 5В (3.3В для 3.3V плат), и 0В(земля) для LOW. Delay() останавливает выполнение программы на заданное в параметре количество миллисекунд (1000 миллисекунд в 1 секунде). Схема подключения ЛАБОРАТОРНАЯ РАБОТА №2 ПОТЕНЦИОМЕТР Из этой л/р вы поймёте как подключать к ардуино аналоговый прибор на примере потенциометра. Научитесь пользоваться аналоговыми входами. В каждой л/р код будет немного усложняться и эта л/р не исключение. Перечень оборудования: 1) Плата Arduino Uno; Usb-кабель; Макетная плата; 4) 6 соединительных проводов; 5) Светодиод; 6) Резистор на 290 Ом; 7) Потенциометр. Исходный код программы int sensorPin = 1000; //переменная sensorPin int ledPin = 13; //переменная ledPin void setup() { pinMode(ledPin, OUTPUT); //подставляем ledPin в pinMode } void loop() { int sensorValue; //переменная sensorValue sensorValue = analogRead(sensorPin); //подставляем sensorPin в analogRead digitalWrite(ledPin, HIGH); delay(sensorValue); digitalWrite(ledPin, LOW); delay(sensorValue); } Описание используемых функции Функция analogRead() считывает значение с указанного аналогового входа. Напряжение поданное на аналоговый вход, обычно от 0 до 5 вольт будет преобразовано в значение от 0 до 1023, это 1024 шага с разрешением 0.0049 Вольт. Разброс напряжение и шаг может быть изменен функцией analogReference(). Схема подключения ВНИМАНИЕ Подключение светодиода без ограничивающего резистора может привести к выходу из строя светодиода (не спалите его). ЛАБОРАТОРНАЯ РАБОТА №3 RGB светодиод В этой л/р вы узнаете о "широтно импульсной модуляции" в ардуино. А также, что не мало важно, мы напишем нашу первую функцию. Сможете подключить RGB светодиод к ардуино и заставить его переливаться всеми цветами радуги. Перечень оборудования: 1) Плата Arduino Uno; Usb-кабель; Макетная плата; 4) 5 соединительных проводов; 5) RGB светодиод; 6) 3 резистора на 290 Ом. Исходный код программы const int RED_PIN = 9; const int GREEN_PIN = 10; const int BLUE_PIN = 11; void setup() { pinMode(RED_PIN, OUTPUT); pinMode(GREEN_PIN, OUTPUT); pinMode(BLUE_PIN, OUTPUT); } void loop() { mainColors(); //программа основных цветов showSpectrum();//программа спектра } void mainColors() { digitalWrite(RED_PIN, LOW); digitalWrite(GREEN_PIN, LOW); digitalWrite(BLUE_PIN, LOW); delay(1000); digitalWrite(RED_PIN, HIGH); digitalWrite(GREEN_PIN, LOW); digitalWrite(BLUE_PIN, LOW); delay(1000); digitalWrite(RED_PIN, LOW); digitalWrite(GREEN_PIN, HIGH); digitalWrite(BLUE_PIN, LOW); delay(1000); digitalWrite(RED_PIN, LOW); digitalWrite(GREEN_PIN, LOW); digitalWrite(BLUE_PIN, HIGH); delay(1000); digitalWrite(RED_PIN, HIGH); digitalWrite(GREEN_PIN, HIGH); digitalWrite(BLUE_PIN, LOW); delay(1000); digitalWrite(RED_PIN, LOW); digitalWrite(GREEN_PIN, HIGH); digitalWrite(BLUE_PIN, HIGH); delay(1000); digitalWrite(RED_PIN, HIGH); digitalWrite(GREEN_PIN, LOW); digitalWrite(BLUE_PIN, HIGH); delay(1000); digitalWrite(RED_PIN, HIGH); digitalWrite(GREEN_PIN, HIGH); digitalWrite(BLUE_PIN, HIGH); delay(1000); } void showSpectrum() { int x; for (x = 0; x < 768; x++) { showRGB(x); delay(10); } } void showRGB(int color) { int redIntensity; int greenIntensity; int blueIntensity; if (color <= 255) { redIntensity = 255 - color; greenIntensity = color; blueIntensity = 0; } else if (color <= 511) { redIntensity = 0; greenIntensity = 255 - (color - 256); blueIntensity = (color - 256); } else // color >= 512 { redIntensity = (color - 512); greenIntensity = 0; blueIntensity = 255 - (color - 512); } analogWrite(RED_PIN, redIntensity); analogWrite(BLUE_PIN, blueIntensity); analogWrite(GREEN_PIN, greenIntensity); } Описание используемых функции Конструкция for используется для повторения блока операторов, заключенных в фигурные скобки. Счетчик приращений обычно используется для приращения и завершения цикла. Оператор for подходит для любых повторяющихся действий и часто используется в сочетании с массивами коллекций данных/выводов. Заголовок цикла for состоит из трех частей: for (начало; конец; шаг) {операторы выполняющиеся в цикле} Функция analogWrite() выдает аналоговую величину (ШИМ волну) на порт вход/выхода. Функция может быть полезна для управления яркостью подключенного светодиода или скоростью электродвигателя. После вызова analogWrite() на выходе будет генерироваться постоянная прямоугольная волна с заданной шириной импульса до следующего вызова analogWrite (или вызова digitalWrite или digitalRead на том же порту вход/выхода). Частота ШИМ сигнала приблизительно 490 Hz. Схема подключения ЛАБОРАТОРНАЯ РАБОТА №4 МНОЖЕСТВО СВЕТОДИОДОВ В этой л/р изучим как можно использовать массивы и циклы. Просьба обратить внимание на скетч код, будет очень полезно разобраться в том, что там написано. Так же обратите внимание на функцию отвечающую за рандом. Перечень оборудования: 1) Плата Arduino Uno; Usb-кабель; Макетная плата; 4) 9 соединительных проводов; 5) 8 светодиодов; 6) 8 резистора на 290 Ом. Исходный код программы int ledPins[] = {2,3,4,5,6,7,8,9}; void setup() { int index; for(index = 0; index <= 7; index++) { pinMode(ledPins[index],OUTPUT); } } void loop() { oneAfterAnotherNoLoop(); //oneAfterAnotherLoop(); //oneOnAtATime(); //pingPong(); //marquee(); //randomLED(); } void oneAfterAnotherNoLoop() { int delayTime = 100; digitalWrite(ledPins[0], HIGH); delay(delayTime); digitalWrite(ledPins[1], HIGH); delay(delayTime); digitalWrite(ledPins[2], HIGH); delay(delayTime); digitalWrite(ledPins[3], HIGH); delay(delayTime); digitalWrite(ledPins[4], HIGH); delay(delayTime); digitalWrite(ledPins[5], HIGH); delay(delayTime); digitalWrite(ledPins[6], HIGH); delay(delayTime); digitalWrite(ledPins[7], HIGH); delay(delayTime); digitalWrite(ledPins[7], LOW); delay(delayTime); digitalWrite(ledPins[6], LOW); delay(delayTime); digitalWrite(ledPins[5], LOW); delay(delayTime); digitalWrite(ledPins[4], LOW); delay(delayTime); digitalWrite(ledPins[3], LOW); delay(delayTime); digitalWrite(ledPins[2], LOW); delay(delayTime); digitalWrite(ledPins[1], LOW); delay(delayTime); digitalWrite(ledPins[0], LOW); delay(delayTime); } void oneAfterAnotherLoop() { int index; int delayTime = 100; for(index = 0; index <= 7; index++) { digitalWrite(ledPins[index], HIGH); delay(delayTime); } for(index = 7; index >= 0; index--) { digitalWrite(ledPins[index], LOW); delay(delayTime); } } void oneOnAtATime() { int index; int delayTime = 100; for(index = 0; index <= 7; index++) { digitalWrite(ledPins[index], HIGH); delay(delayTime); digitalWrite(ledPins[index], LOW); } } void pingPong() { int index; int delayTime = 100; for(index = 0; index <= 7; index++) { digitalWrite(ledPins[index], HIGH); delay(delayTime); digitalWrite(ledPins[index], LOW); } for(index = 7; index >= 0; index--) { digitalWrite(ledPins[index], HIGH); delay(delayTime); digitalWrite(ledPins[index], LOW); } } void marquee() { int index; int delayTime = 200; for(index = 0; index <= 3; index++) { digitalWrite(ledPins[index], HIGH); digitalWrite(ledPins[index+4], HIGH); delay(delayTime); digitalWrite(ledPins[index], LOW); digitalWrite(ledPins[index+4], LOW); } } void randomLED() { int index; int delayTime; index = random(8); delayTime = 100; digitalWrite(ledPins[index], HIGH); delay(delayTime); digitalWrite(ledPins[index], LOW); Описание используемых функции Функция oneAfterAnotherNoLoop () не использует цикл for, поэтому её исходный код такой большой. Включает поочередно светодиоды, а затем гасит их. Функция oneAfterAnotherLoop () использует цикл for, поэтому её исходный код меньше чем предыдущий. Выполняет тоже самое что и предыдущая функция. Функция oneOnAtATime () будет включать светодиод один за другим, затем выключать. Функция pingPong () будет включать и выключать светодиод один за другим в одном направлении и в обратном направлении. Функция marquee () будет включать и выключать светодиоды с шагом в 4 светодиода. Функция randomLED () будет включать и выключать светодиоды в беспорядочном цикле. Схема подключения ЛАБОРАТОРНАЯ РАБОТА №5 КНОПКА, ЛОГИЧЕСКИЕ ОПЕРАТОРЫ В этой л/р вы узнаете про логические операторы (и, или, не, ...). Как использовать цифровые пины как входы и детектировать цифрового сигнала. Как подключить кнопку. Из этого урока вы не узнаете что такое подтягивающий резистор. Перечень оборудования: 1) Плата Arduino Uno; Usb-кабель; Макетная плата; 4) 5 соединительных проводов; 5) 1 светодиод; 6) 1 резистор на 290 Ом и 2 резистора на 10кОм; 7) 2 кнопки. Исходный код программы const int button1Pin = 2; //кнопка 1 пин 2 const int button2Pin = 3; // кнопка 2 пин 3 const int ledPin = 13; // светодиод void setup() { pinMode(button1Pin, INPUT); pinMode(button2Pin, INPUT); pinMode(ledPin, OUTPUT); } void loop() { int button1State, button2State; button1State = digitalRead(button1Pin); button2State = digitalRead(button2Pin); // A == B - логическое равенство // A && B - логическое и // A || B - логическое или // !A - логическое не // if ((button1State == LOW) || (button2State == LOW)) // Ёлочка зажгись // if ((button1State == LOW) && (button2State == LOW)) // Светодиод не гори if (((button1State == LOW) || (button2State == LOW)) // если жмём на кнопку 1 или 2 && ! // и не ((button1State == LOW) && (button2State == LOW))) // жмём кнопки 1 и 2 одновременно // тогда { digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } } Описание используемых функции Функция digitalRead считывает значение с заданного входа - HIGH или LOW. Схема подключения 2 ЧАСТЬ Сделаем так чтобы кнопкой можно было включать и выключать светодиод. Для этого изменим исходный код программы int buttonPin=2; int ledPin=13; boolean lastButton=LOW; // булевая функция boolean ledOn=false; //функция запоминания состояния светодиода void setup () { pinMode(buttonPin, INPUT); pinMode(ledPin, OUTPUT); } void loop () { if (digitalRead(buttonPin)== HIGH && lastButton == LOW ) //осуществляет проверку включенного состояния кнопки { ledOn= !ledOn; lastButton = HIGH; //обновленное значение состояния кнопки } else { lastButton=digitalRead(buttonPin); } digitalWrite(ledPin, ledOn); } Видим что светодиод иногда не реагирует на нажатие кнопки. Это происходит из-за "дребезгов" контактов кнопки. Для устранения этой неполадки добавим в исходный код несколько выражений: int buttonPin=2; int ledPin=13; boolean lastButton=LOW; boolean currentButton=LOW; //переменная запоминания текущего состояния кнопки boolean ledOn=false; void setup () { pinMode(buttonPin, INPUT); pinMode(ledPin, OUTPUT); } boolean debounce(boolean last) //выражение для стабилизации нашего нажатия на кнопку { boolean current = digitalRead(buttonPin); // считывание данных с кнопки и присвоение этого значения в currrent if (last != current) //сравнение предудущего значения кнопки с текущим { delay(5); //время для устранения дребезга current = digitalRead(buttonPin); //конечное считывание данных с кнопки } return current; //дает стабилизированное значение состояния на кнопке } void loop () { currentButton=debounce(lastButton); //передача данных от одной функции к другой if (lastButton == LOW && currentButton == HIGH) { ledOn= !ledOn; } lastButton=currentButton; //перезапись состояния кнопки digitalWrite(ledPin, ledOn); } Описание используемых функции Логический (булевый) тип данных — boolean. Может принимать одно из двух значений true или false. boolean занимает в памяти один байт. Управляющий оператор return прекращает вычисления в функции и возвращает значение из прерванной функции в вызывающую, если это нужно. 3 ЧАСТЬ Изменение яркости светодиода нажатием кнопки. int buttonPin=2; int ledPin=11; //меняем выход светодиода на выход с ШИМ модуляцией boolean lastButton=LOW; boolean currentButton=LOW; //переменная запоминания текущего состояния кнопки int ledLevel=0; //поменяли булевую функцию на постоянную от 0 до 255, которая будет задовать яркость светодиода void setup () { pinMode(buttonPin, INPUT); pinMode(ledPin, OUTPUT); } boolean debounce(boolean last) //выражение для стабилизации нашего нажатия на кнопку { boolean current = digitalRead(buttonPin); // считывание данных с кнопки и присвоение этого значения в currrent if (last != current) //сравнение предудущего значения кнопки с текущим { delay(5); //время для устранения дребезга current = digitalRead(buttonPin); //конечное считывание данных с кнопки } return current; //дает стабилизированное значение состояния на кнопке } void loop () { currentButton=debounce(lastButton); //передача данных от одной функции к другой if (lastButton == LOW && currentButton == HIGH) { ledLevel= ledLevel+51; //значение светодиода равно предыдущему значению + 51 } lastButton=currentButton; //перезапись состояния кнопки if (ledLevel >255) ledLevel= 0; //если значение ledLevel больше 255 то ledLevel будет равен 0 analogWrite(ledPin, ledLevel); //вместо digitalWrite ставим analogWrite, для модуляции ШИМ сигнала } ЛАБОРАТОРНАЯ РАБОТА №6 ФОТОРЕЗИСТОР, ДЕЛИТЕЛЬ НАПРЯЖЕНИЯ В этой л/р вы узнаете как подключить фоторезистор. Перечень оборудования: 1) Плата Arduino Uno; Usb-кабель; Макетная плата; 4) 6 соединительных проводов; 5) 1 светодиод; 6) 1 резистор на 290 Ом и 1 резистора на 10кОм; 7) 1 фоторезистор. Исходный код программы // Зададим константы для объявления пинов const int sensorPin = 0; const int ledPin = 9; // Также зададим 3 глобальные переменные - lightLevel, high и low int lightLevel, high = 0, low = 1023; void setup() { //ledpin - цифровой вход/выход 9, зададим как выход pinMode(ledPin, OUTPUT); } void loop() { // Чтобы считать значение на аналоговом входе воспользуемся analogRead() // Эта функция измерит напряжение на фоторезисторе. // Значение напряжения может варьироваться в пределах от 0 при 0 Вольт // до 1023 (5 Вольт ), lightLevel = analogRead(sensorPin); // Теперь полученное значение используем для контроля над яркостью светодиода // Но у нас есть проблема: функция analogRead() возвращает знач. от 0 до 1023 // А функция analogWrite() использует значения от 0 до 255. // Мы можем решить эту проблему с помощью двух полезных функций, map() и constrain(). // Map () переводит один диапазон значений в другой. // Если мы скажем функции map(), что наш "from" диапазон это 0-1023, // И наш "to" диапазон это 0-255, то map() скукожит больший диапазон до меньшего. // lightLevel = map(lightLevel, 0, 1023, 0, 255); // Поскольку map() все ещё может вернуть числа находящиеся за пределами "to" диапазона // мы просто на всякий пожарный воспользуемся функцией проверки пришедшего числа заданному диапазону // Функция называется constrain(), который будет вклеивать числа в нужный диапазон. // Если число выше диапазона, то оно станет 255 (самым высоким нужного диапазона) // Если ниже то станет нулём (самым низким нужного диапазона). // Если число находится в пределах, то оно останется тем же самым числом. // lightLevel = constrain(lightLevel, 0, 255); // Есть одно но. В схеме которую мы сделали не будет отражён весь диапазон от 0 до 1023. // Диапазон будет гораздо меньше. Например уровень тьмы будет соответствовать 300, а самое светлое значение - 800. // В таком случае светодиод никогда не будет полностью выключен или включен на максимум // В приведённых ниже функциях этот баг поправлен. Не забудьте раскомментировать вторую, а первую закомментировать manualTune(); // функция для изменения диапазона вручную //autoTune(); // в этой функции ардуинка всю работу сделает за нас // В этих функциях, которые выше, мы подправим уровни яркости освещения analogWrite(ledPin, lightLevel); // То, что написано выше подаст на 9ый цифровой выход уровень освещённости на фоторезисторе // Чтобы светодиод гас когда света попадает на фоторезистор меньше, а не так как сейчас - меньше света, сильнее горит, // замените "lightLevel" на "255-lightLevel". } void manualTune() { // Как я уже сказал выше, если запустить этот скетч без доп настройки // светодиод будет загораться или гаснуть не до конца, даже в при полном отсутствии света на фоторезисторе. // В функции мануальной настройки будем настраивать в ручную // Настроим диапазон "from" в функции map(). // Попытаемся вручную сменить диапзон на меньший (от 300 до 800) // Просто меняем 0, 1023 в страке ниже на что-то типа 300-800 lightLevel = map(lightLevel, 0, 1023, 0, 255); //!!!!!меняй сказал!!!!!!!! lightLevel = constrain(lightLevel, 0, 255); // теперь такой изменённый lightlevel попадёт на светодиод } void autoTune() { // Функция автонастройки будет менять значения автоматически, это гораздо удобнее. // Arduino будет отслеживать самое высокое и низкое значение освещённости, которое приходит из analogRead(). // В верху скетча, где мы задавали переменные, мы задали "low" = 1023 // Всё что мы получим из analogRead() ниже чем 1023, мы сохраним и подставим в "low". // Тоесть значение у нас сместится до более оптимального. if (lightLevel < low) { low = lightLevel; } // Тоже самое и с уровнем "high" if (lightLevel > high) { high = lightLevel; } // Тут есть ещё один баг // Чтобы светодиод не мигал на приделах полного включения и выключения мы добавим небольшое смещение lightLevel = map(lightLevel, low+30, high-30, 0, 255); lightLevel = constrain(lightLevel, 0, 255); } Схема подключения ЛАБОРАТОРНАЯ РАБОТА №7 ТЕРМОДАТЧИК, SERIAL MONITOR В этой л/р мы подключим термодатчик и выведем значения на монитор последовательного порта (sereal monitor). Также используем ардуино в качестве вольтметра. Перечень оборудования: 1) Плата Arduino Uno; Usb-кабель; Макетная плата; 4) 6 соединительных проводов; 5) 1 светодиод; 6) 1 резистор на 290 Ом и 1 резистора на 10кОм; 7) 1 фоторезистор. Исходный код программы const int temperaturePin = 0; //зададим константу temperaturePin void setup() { // тобы использовать сириал порт вначале его надо иницализировать // для этого используется функция Serial.begin() // также надо указать скорость передачи данных // Скорость измеряется в битах в секунду // 9600 бит в сек является очень широко используемой скоростью передачи, // при ней будет передаваться около 10 символов в секунду. // Не забудте, когда откроете сириал порт, выставить такую же скорость. Serial.begin(9600); } void loop() { // До сих пор мы использовали только целые числа ("int") переменных в наших скетчах. // В этом скетче, мы будем использовать переменные с плавающей запятой ("float"). float voltage, degreesC, degreesF; // Мы объявляем три переменные типа float // Чтобы получить данные с датчика темпиратуры, мы должны измерить напряжение на аналоговом входе. // Обычно мы бы использовали analogRead(), которая возвращает число от 0 до 1023. // Но в данном случаее нам нужно знать истинное значение напряжения. // функция getVoltage() возвращает истинное напряжение на аналоговом входе (от 0 до 5 Вольт) // эту функцию мы напишем самостоятельно voltage = getVoltage(temperaturePin); // Исходя из данных в спецификации, составим формулу для перевода напряжения в град. Цельсия и Фаренгейта. degreesC = (voltage - 0.5) * 100.0; //Цельсий degreesF = degreesC * (9.0/5.0) + 32.0; //Фаренгейт // Теперь нам нужно вывести эти значения на сириал порт // Для этого используется функция Serial.print() // Текст внутри ковычек, а переменные без ковычек Serial.print("voltage: "); Serial.print(voltage); Serial.print(" deg C: "); Serial.print(degreesC); Serial.print(" deg F: "); Serial.println(degreesF); // В окне сириал монитора должно быть написано примерно это: // "напряжение: 0.73 град Ц: 22.75 град Ф: 72.96" // Обратите внимание на код, в пяти функциях используется "print", // а в последней - "println" // "println" в отличии от "print" после того что написано ставит перевод строки delay(1000); // задержка = 1 секунда } float getVoltage(int pin) //а теперь напишем функцию getVoltage { // Эта функция читает аналоговый пин // В начале этой функции не используется слово void, потому, что она будет возвращать значение типа float - (2,2 В, 3,5 В и т.п) // Грубо говоря в перед названием функции пишется тип значение которое она возвращает, а в скобках - то, что принимает // Всё что будет возвращать эта функция выражено в простой формуле ниже return (analogRead(pin) * 0.004882814); //значение от 0 до 1023 будет преобразовано в значение напряжения от 0,0 до 5,0 В. } Схема подключения ВНИМАНИЕ Продолжительное не правильное подключение выводов датчика температуры к питанию, может вывести из строя сам датчик (не спалите его). ЛАБОРАТОРНАЯ РАБОТА №8 СЕРВОПРИВОД В этой л/р мы научимся подключать сервопривод к arduino и управлять им. Также мы научимся подключать библиотеки, которые будут очень облегчать нам жизнь в будущем. Перечень оборудования: 1) Плата Arduino Uno; Usb-кабель; Макетная плата; 4) 5 соединительных проводов; 5) 1 сервопривод; Исходный код программы // библиотека с коммандами для сервоприводов #include //описание библиотеки по ссылке - arduino.cc/en/Reference/Servo Servo servo1; // объект сервопривод №1 void setup() { servo1.attach(9); // Сервопривод подключен к цифровому выходу 9 //servo1.detach() для расслабления мотора сервопривода } void loop() { int position; //зададим переменную позиция, понадобится потом // Крутилка на полной скорости: servo1.write(90); // повернись на 90 град. delay(1000); // пауза чтобы он успел повернуться servo1.write(180); // повернись на 180 град. delay(1000); // пауза servo1.write(0); // повернись до уровня 0 град. delay(1000); // пауза // Крутилки на более низкой скорости: //от 0 до 180 с гагом в 2 градуса for(position = 0; position < 180; position += 2) { servo1.write(position); // передвинься на следующую позицию delay(20); // небольшой перерыв чтобы он успел передвинуться } // от 180 до 0 с шагом 1 градус for(position = 180; position >= 0; position -= 1) { servo1.write(position); // передвинься на следующую позицию delay(20); // небольшой перерыв чтобы он успел передвинуться } } Схема подключения ВНИМАНИЕ Продолжительное не правильное подключение выводов сервопривода к питанию, может вывести из строя сервопривод и отдельные узлы микроконтроллера (не спалите его). ЛАБОРАТОРНАЯ РАБОТА №9 ИК ПРИЕМНИК В этой л/р мы подключим к ардуино ИК приемник и считаем коды которые приходят с пульта для телевизора. Перечень оборудования: 1) Плата Arduino Uno; Usb-кабель; Макетная плата; 4) 3 соединительных проводов; 5) 1 ИК приёмник на 38кГц; Исходный код программы #include "IRremote.h" //вход ик приёмника к А0 const int IR_PIN = A0; //создаём объект ик приёмника IRrecv irrecv(IR_PIN); void setup (){ Serial.begin(9600); Serial.println("ready"); //начинаем прослушивание ик сигналов irrecv.enableIRIn(); } void loop() { //в results будут помещаться принятые и //декодированные ик команды decode_results results; //Если ик команда принята и успешно декодирована - //выводим полученный код в сириал монитор if (irrecv.decode(&results)) { Serial.println(results.value); irrecv.resume(); } } Схема подключения ВНИМАНИЕ Продолжительное не правильное подключение выводов сервопривода к питанию, может вывести из строя сервопривод и отдельные узлы микроконтроллера (не спалите его). |