В този урок ще разработим схема, използваща FLEX сензор, Arduino Uno и серво мотор. Този проект е система за серво управление, при която положението на сервоосиото се определя от огъването или огъването или отклонението на сензора FLEX.
Нека първо поговорим малко за серво мотори. Сервомоторите се използват там, където има нужда от точно движение или положение на вала. Те не се предлагат за високоскоростни приложения. Те се предлагат за ниска скорост, среден въртящ момент и точно приложение на позицията. Тези двигатели се използват в роботизирани машини за управление, полет и системи за управление. Сервомоторите се използват във вградени системи като автомати и др.
Серво двигателите се предлагат в различни форми и размери. Серво мотор ще има предимно проводници, единият е за положително напрежение, друг е за заземяване и последният е за настройка на положението. ЧЕРВЕНИЯ проводник е свързан към захранването, Черният проводник е свързан към земята и ЖЪЛТИЯ проводник е свързан към сигнала.
Серво мотор е комбинация от DC мотор, система за управление на позицията, предавки. Положението на вала на постояннотоковия двигател се регулира от управляващата електроника в серво, на базата на коефициента на запълване на ШИМ сигнала на ПИН СИГНАЛА.
Просто казано управляващата електроника регулира положението на вала чрез управление на мотора с постоянен ток. Тези данни относно положението на вала се изпращат през щифта SIGNAL. Данните за местоположението към управлението трябва да се изпращат под формата на ШИМ сигнал през сигналния щифт на серво мотора.
Честотата на сигнала PWM (Pulse Width Modulated) може да варира в зависимост от типа на серво мотора. Важното тук е DUTY RATIO на PWM сигнала. Въз основа на това ДЪЛЖИМНО СЪОТНОШЕНИЕ управляващата електроника регулира вала. За да бъде шахтата преместена на 9o часовник, СЪОТНОШЕНИЕТО НА Включване трябва да бъде 1/18. 1 милисекунда от „включено време“ и 17 милисекунда от „изключено време“ в сигнал от 18 ms.
За да се премести валът на часовник 12 °, времето за включване на сигнала трябва да бъде 1,5 ms и времето за изключване трябва да бъде 16,5 ms. Това съотношение се декодира от системата за управление в серво и тя регулира позицията въз основа на него.
Този ШИМ тук се генерира с помощта на ARDUINO UNO. Така че засега знаем, че можем да управляваме вала на сервомотора, като променяме коефициента на запълване на ШИМ сигнала, генериран от Arduino Uno. UNO има специална функция, която ни позволява да осигурим позицията на SERVO, без да смущаваме PWM сигнала. Важно е обаче да се знае отношението на мито на ШИМ - отношение на позицията на серво. Ще говорим повече за това в описанието.
Сега нека поговорим за FLEX SENSOR. За да свържем FLEX сензор с ARDUINO UNO, ще използваме 8-битова функция ADC (аналогово към цифрово преобразуване), за да свършим работата. FLEX сензорът е преобразувател, който променя съпротивлението си при промяна на формата му. Сензорът FLEX е с дължина 2,2 инча или дължина на пръста. Това е показано на фигура.
Flex сензорът е преобразувател, който променя съпротивлението си, когато линейната повърхност е огъната. Оттук и името flex flex. Просто казано, съпротивлението на клемата на сензора се увеличава, когато е огънато. Това е показано на фигурата по-долу.
Тази промяна в съпротивата не може да донесе нищо добро, освен ако не можем да ги прочетем. Подходящият контролер може да отчита шансовете само по напрежение и не по-малко, за това ще използваме верига на делителя на напрежението, с което можем да извлечем промяната на съпротивлението при промяна на напрежението.
Разделителят на напрежение е резистивна верига и е показан на фигура. В тази резистивна мрежа имаме едно постоянно съпротивление и друго променливо съпротивление. Както е показано на фигурата, R1 тук е постоянно съпротивление, а R2 е FLEX сензор, който действа като съпротивление.
Средната точка на разклонението се измерва. С промяната на R2 имаме промяна при Vout. Така че с това имаме напрежение, което се променя с теглото.
Сега е важно да се отбележи, че входът, взет от контролера за преобразуване на ADC, е само 50µAmp. Този ефект на натоварване на делител на напрежение, базиран на съпротивление, е важен, тъй като токът, извлечен от Vout на делителя на напрежението, увеличава процента на грешка, увеличава се, засега не е нужно да се тревожим за ефекта на натоварване
FLEX SENSOR при огъване съпротивлението му се променя. С този преобразувател, свързан към верига на делителя на напрежението, ще имаме променящо се напрежение с FLEX на преобразувателя. Това променливо напрежение е FED към един от ADC каналите, ще имаме цифрова стойност, свързана с FLEX.
Ще съпоставим тази цифрова стойност със серво положение, с което ще имаме серво управление чрез flex.
Компоненти
Хардуер: Arduino Uno , Захранване (5v), кондензатор 1000 uF, кондензатор 100nF (3 броя), резистор 100KΩ, SERVO MOTOR (SG 90), резистор 220Ω, FLEX сензор.
Софтуер: Atmel studio 6.2 или Aurdino всяка вечер.
Електрическа схема и обяснение
Схемата на веригата за управление на серво мотора чрез сензор FLEX е показана на фигурата по-долу.
Напрежението на сензора не е напълно линейно; ще бъде шумно. За да филтрират шума, кондензаторите се поставят през всеки резистор в разделителната верига, както е показано на фигурата.
Тук ще вземем напрежението, осигурено от разделителя (напрежение, което представлява теглото линейно) и ще го подадем в един от ADC каналите на Arduino UNO. За това ще използваме A0. След инициализирането на ADC ще имаме цифрова стойност, представляваща огънатия сензор. Ще вземем тази стойност и ще я съпоставим със серво положение.
За да се случи това, трябва да установим няколко инструкции в програмата и ще говорим подробно за тях по-долу.
ARDUINO има шест ADC канала, както е показано на фигурата. В тях всеки един или всички от тях може да се използва като входове за аналогово напрежение. UNO ADC е с 10-битова разделителна способност (така че целочислените стойности от (0- (2 ^ 10) 1023)). Това означава, че ще преобразува входните напрежения между 0 и 5 волта в целочислени стойности между 0 и 1023. Така че за всеки (5/1024 = 4.9mV) за единица.
Тук ще използваме A0 на UNO.
Трябва да знаем няколко неща.
|
На първо място UNO ADC каналите имат референтна стойност по подразбиране 5V. Това означава, че можем да дадем максимално входно напрежение от 5V за ADC преобразуване на всеки входен канал. Тъй като някои сензори осигуряват напрежение от 0-2,5V, с 5V референция получаваме по-малка точност, така че имаме инструкция, която ни позволява да променим тази референтна стойност. Така че за промяна на референтната стойност имаме (“analogReference ();”) Засега я оставяме като.
По подразбиране получаваме максималната разделителна способност на ADC на борда, която е 10 бита, тази разделителна способност може да бъде променена с помощта на инструкция („analogReadResolution (битове);“). Тази промяна на резолюцията може да бъде полезна за някои случаи. Засега го оставяме така.
Сега, ако горните условия са зададени по подразбиране, можем да прочетем стойност от ADC на канал '0', като директно извикаме функцията „analogRead (pin);“, тук „pin“ представлява щифт, където сме свързали аналогов сигнал, в този случай ще бъде „A0“.
Стойността от ADC може да бъде взета в цяло число като „int SENSORVALUE = analogRead (A0); ”, Чрез тази инструкция стойността след ADC се съхранява в цялото число„ SENSORVALUE ”.
Сега нека да поговорим за SERVO, UNO има функция, която ни позволява да контролираме позицията на серво, като просто дадем стойността на градуса. Да кажем, че ако искаме серво да бъде на 30, можем директно да представим стойността в програмата. Заглавният файл SERVO се грижи вътрешно за всички изчисления на коефициента на мито.
#include
Серво серво; servo.attach (3); servo.write (градуси); |
Първото изявление представлява заглавния файл за управление на SERVO MOTOR.
Второто твърдение е именуване на серво; оставяме го като самото серво.
Трето изявление посочва къде е свързан сервосигналният щифт; това трябва да е ШИМ щифт. Тук използваме PIN3.
Четвъртото изявление дава команди за позициониране на серво мотора и е в градуси. Ако му се даде 30, сервомоторът се завърта на 30 градуса.
Сега sg90 може да се движи от 0-180 градуса, имаме ADC резултат 0-1024
Така ADC е приблизително шест пъти СЕРВОПОЛОЖЕНИЕТО. Така че като разделим резултата на ADC на 6, ще получим приблизителната позиция на SERVO ръка.
С това ще имаме стойност на серво позицията, подадена към серво мотора, която е пропорционална на огъване или огъване. Когато този гъвкав сензор е монтиран на ръкавица, ние можем да контролираме позицията на серво с движение с ръка.