Сензор за въртене Arduino. Тахометър. Пример за работа с фоторезистор и HD44780 LCD дисплей на arduino. Верига за прекъсване на инфрачервения лъч

Модулът на сензора за скорост на двигателя е предназначен основно за откриване на скоростта на въртене на вала на двигателя. Този модул, заедно с микроконтролера, може да определя освен скоростта, броя на импулсите и положението на вала.



Обикновено сензорите измерват величината, като регистрират определени събития, след което броят на събитията се свързва с периода от време, през който са се случили.

Секцията, която сумира импулсите при въвеждането им, може да бъде електромеханична, интегрирана или микропроцесорна електроника. Определен брой електромеханични импулси могат да бъдат намерени във вашия дом като ключ за домашно осветление. В миналото мишките използваха оптични енкодери, за да броят движения въз основа на получените импулси.

В много случаи е достатъчен обикновен делител на напрежение. За да преброим оборотите на двигателя, трябва да свържем ротационния енкодер към ротора. На изображението двигателят е оборудван с диск, който редува черни части и прозрачни части. инфрачервен сензорблизостта разпознава кога влиза в контакт с черна повърхност и кога повърхността е прозрачна.


Така че в този случай се измерва скоростта - събитията тук се разбират като импулси, получени в резултат на работата на оптичния сензор по време на въртенето на диска със слотове. Сензорът се състои от светодиод и фототранзистор, който отчита наличието или отсъствието на LED излъчване.


Схема


Представената схема може да се използва за изпращане на регистрираните импулси към микроконтролера. Основата на схемата е оптичен сензор OS25B10 (OC1) с LED и фототранзисторен изход.

По този начин се създават светлинни импулси, които чрез сензора за близост се превръщат в електрически импулси. Ако преброите импулсите, можете да изчислите ъглово положениедиск, а оттам и ротор. След като направих практически пример, можем да приемем, че дискът има 36 черни и 36 прозрачни фрагмента. Това означава, че за всяка пълна ос на оста на двигателя, фотоклетката генерира 36 електрически импулса. Ако по време на интервал от 1 секунда от 360 импулса двигателят има 10 оборота в минута за една секунда.

Правейки това, ние знаем скоростта, но не и посоката, в която се движи двигателят. За да знаем това, трябва да имаме две фотоклетки, разположени на две различни позиции. Когато щифтът на енкодера се завърти, се генерират два квадратурни електрически сигнала, поради което те са дефинирани, тъй като са изместени с 90° електрически. Тези два импулса осигуряват скоростта на въртене на щифта, както и изчислената посока, като "виждат" кой от двата импулса идва преди другия.


Следва двоен компаратор LM393 IC (IC1), конфигуриран като прост тригер на Schmitt. Зелен светодиод(LED1) показва наличието на напрежение, приложено към веригата, а червеният светодиод (LED2) следи изхода на модула на сензора за скорост на двигателя. Препоръчва се работно напрежениемодул е ​​между 4,5 и 5,5 V.



В някои случаи не е необходимо да се изчислява скоростта, а само количеството на въртене на щифта на енкодера. Има поне два начина за определяне на броя импулси, генерирани от енкодера. Декодирайте състояние, което се променя с времето и извлечете информация. . Ако имате опция, най-добре е да използвате верига за премахване на отскоците, която елиминира фалшиви щифтове, които могат да причинят неправилно отчитане на импулсите на енкодера. Следващата схема на изображение има две версии за отказ от отговорност.

Използват се само кондензатори. Всеки път, когато енкодерът се завърти, електрическите сигнали се променят според посоката на въртене. Стрелките показват промяната на сигнала. Програмата използва щифтове 2 и 4 за изчисляване на щракванията на енкодера и щифт 3 за откриване на активиране на бутон. Всеки път, когато енкодерът се завърти, програмата изпраща обща актуализация на кликванията, направени на серийния порт. Всеки път, когато се натисне бутон, той се записва в серийния порт "натиснат бутон" и общият брой снимки се нулира.


Имайте предвид, че резистор R1 (180 ома) се използва тук за ограничаване на работния ток на светодиода вътре в оптичния сензор OS25B10 (OC1). Ако е необходимо, можете да промените стойността му за вашия прототип. Можете също така да регулирате стойността на резистора R2 (10 kΩ), за да получите необходимото напрежение за вашата верига. Резистор R7 (10 kΩ) е допълнителен издърпващ резистор.

Изглед отгоре на въртящ се енкодер с връзка между името на щифта и неговото местоположение. Страничен изглед на енкодера. И кой не иска да използва Arduino като него? Има интегрални схеми, които действат като брояч на импулси. Можеш да видиш електрическа верига, който може да се използва и с квадратурен енкодер.

Електрически сигнали на ротационен енкодер

Ротационният енкодер се върти по посока на часовниковата стрелка с бавно движение. Всички сигнали са в положителна логика. Ротационният енкодер се върти по посока на часовниковата стрелка с бързо движение. В същото време, както и в предишния случай, има 15 вариации на сигнала, които съответстват на броя кадри на реалния енкодер.


Диск за енкодер


Диск за енкодер, поставен в слота на сензора, разделя оптичния сензор по такъв начин, че от едната страна на диска има светодиод, а от другата страна - фототранзистор. Ако пътят на светлинния лъч от светодиода не е блокиран от диска, фототранзисторът ще премине ток, в противен случай ще бъде затворен.

В тази статия ще покажа как можете да направите тахометър с помощта на конвенционален светодиод и фоторезистор - измервател на скоростта на двигателя. И за да стане по-интересно, получените данни ще се показват на LCD дисплея, току-що имах модула HD44780, който лежеше наоколо, той може да показва данни в два реда от 16 колони.

Как работи фоторезисторът?

Фоторезисторът е полупроводник, който променя съпротивлението си в зависимост от количеството светлина, което го удря. Колкото повече светлина, толкова по-ниско е съпротивлението. Тази способност ще ни помогне при внедряването на оборотомера. Ще светим с помощта на светодиод върху фоторезистор от малко разстояние - 1,5-2 сантиметра. И с помощта на arduino ще следим какво напрежение минава през фоторезистора, ако напрежението падне, значи нещо блокира светлината. Ако поставите острие на вала на двигателя и го накарате да се върти между светодиода и фоторезистора, можете да разберете колко често острието блокира светлината. И тогава това е въпрос на технология - да направите няколко дузини измервания, да изчислите средната аритметична стойност за по-точно измерване и да преобразувате тези данни в броя на оборотите в минута.
При първия тест се оказа, че моторът, на който тествах, се върти със скорост от почти 12 хиляди оборота в минута. Веднага ми хрумна мисълта, че някъде има грешка в изчисленията или arduino не обработва правилно данните от фоторезистора. Трябваше да забавя двигателя с потенциометър и данните също започнаха да се забавят. Оборотите паднаха до две, а след това и до хиляда в минута. Всичко работи и изчислено правилно. Но с максимално увеличение на скоростта се получиха все същите 12 хил. Трябваше да търся лист с данни за двигателя и се оказа, че нормалната му скорост на въртене е 11,5 -12,5 хиляди оборота. Тоест всичко работи правилно. Никога не бих си помислил, че толкова малък мотор може да се върти с такава скорост.
По-долу има две снимки, едната показва как са разположени светодиодът и фоторезисторът, а втората вече е добавила към тях двигател, чиято скорост на въртене ще бъде измерена.


Извеждане на данни към HD44780 LCD дисплей с помощта на arduino

Много е удобно да използвате интерфейсния модул I2C за работа с дисплея HD44780. Има модули и LCD дисплеи, продавани отделно, но често запоени като комплект. Препоръчвам да използвате вече сглобени, защото ако свържете без I2C, ще трябва да свържете дисплея с 16 проводника, когато броят им падне до 4 чрез I2C, два от които са захранващи. А другите два проводника са свързани към щифтовете A4 и A5 на ардуино.
За да направите управлението на извеждането на данни на дисплея по-удобно и удобно, можете да използвате библиотеката LiquidCrystal_I2C.
По-долу има схема за свързване на дисплей, както и светодиод с фоторезистор към arduino.


Какво е използвано в проекта:

  • Arduino (използвах arduino uno, но можете да използвате всеки друг). Купен тук: arduino uno
  • 1 резистори със съпротивление 300 ома. Купен тук:
  • 1 резистора със съпротивление 10 kOhm. Купих тук: комплект резистори 700 бр. 10 ома до 1 мегаом
  • 1 светодиод. Закупени от тук: 100 светодиода, 10 различни цвята
  • LCD дисплей Hd44780 с I2C модул. Купен тук: LCD дисплей Hd44780 с I2C модул
  • Фоторезистор. Закупени от тук: Фоторезистори 20 бр

Скица на тахометър на arduino

По-долу има скица с подробни коментари и можете също да я изтеглите на вашия компютър: изтеглете.

// библиотеки за работа ЛСД дисплейот I2C #include #включи // инициализация на дисплея. // GND - земя // VVC - 5+ волта // SDA - щифт A4 // SCL - щифт A5 // 16 колони и 2 реда LiquidCrystal_I2C lcd(0x27,16,2); const int pinPhoto = A0; // порт за четене на данни от фоторезистора int light = 0; // променлива за съхраняване на данни от фоторезистора int numTurn = 0; // брой итерации за проверка на оборотите int valArray; // масив за съхраняване на данни от фоторезистора, необходими за първоначална настройка int maxLight = 1024; // праг, при който ще считаме, че светодиодът е затворен int sum = -1; // сбор от броя обороти int count_zamer = 20; // брой итерации, след които ще се изчисли средната стойност на скоростта unsigned long lastMillis = 0; // променлива за съхраняване на времето на предишното припокриване на LED bool work = true; // флаг, който се повдига, след като светодиодът се отвори void setup() ( Serial.begin(9600); pinMode(pinPhoto, INPUT); // изчакайте светодиодът да загрее delay(1000); // на всеки 10 милисекунди, прочетете стойността от фоторезистора, 100 пъти за (int i = 0; i< 100; i++){ valArray[i] = analogRead(pinPhoto); delay(10); } // выбераем минимальное значение с фоторезистора for(int i = 0; i< 100; i++){ if(maxLight >valArray[i]) maxLight = valArray[i]; ) // леко понижаване на прага maxLight -= 10; Serial.println(maxLight); забавяне (500); Serial.println("СТАРТ!"); lastMillis = millis(); // стартиране на дисплея lcd.init(); // включване на подсветката lcd.backlight(); // изчистване на всичко останало LCD. clear(); // показване на текстов LCD setCursor(0, 0); lcd.print("S"); lcd.setCursor(1, 0); lcd.print("T"); lcd.setCursor(2, 0); lcd.print("A"); lcd.setCursor(3, 0); lcd.print("R"); lcd.setCursor(4, 0); lcd.print("T"); lcd.setCursor(5, 0); lcd.print("!"); ) void loop() ( // чете показанията от светлината на фоторезистора = analogRead(pinPhoto); // ако стойността е под прага, тогава светодиодът е блокиран if(light< maxLight && work){ // опускаем флаг, чтобы не считать, пока светодиод перекрыт work = false; // если первая итерация, то не считаем ее, чтобы начать отсчет времени if(sum == -1){ // записываем время старта lastMillis = millis(); sum = 0; }else{ unsigned long currentMillis = millis(); // записываем в sum количество миллисекунд между оборотами sum += (currentMillis - lastMillis); numTurn++; // считаем 20 раз, для большей точности if(numTurn == count_zamer){ float sredSpeed = 0; numTurn = 0; // берем среднее и высчитываем количество оборотов для минуты sredSpeed = 60000 / ((float)sum / (float)count_zamer); // оборотов в минуту Serial.print("speed: "); Serial.println(sredSpeed); sum = -1; // вывод данных на LCD дисплей lcd.clear(); lcd.setCursor(0, 0); lcd.print("S"); lcd.setCursor(1, 0); lcd.print("P"); lcd.setCursor(2, 0); lcd.print("E"); lcd.setCursor(3, 0); lcd.print("E"); lcd.setCursor(4, 0); lcd.print("D"); lcd.setCursor(5, 0); lcd.print(":"); // преобразовываем числовое значение в строку // и по одному символу выводим не дисплей char string_turn = ""; sprintf(string_turn,"%d", (int)sredSpeed); char *current = string_turn; int count_numbers = 0; while (*current != "\0") { lcd.setCursor(6+count_numbers, 0); lcd.print(*current); count_numbers++; current++; } lcd.setCursor(count_numbers+7, 0); lcd.print("r"); lcd.setCursor(count_numbers+8, 0); lcd.print("/"); lcd.setCursor(count_numbers+9, 0); lcd.print("m"); lcd.setCursor(count_numbers+10, 0); lcd.print("i"); lcd.setCursor(count_numbers+11, 0); lcd.print("n"); } lastMillis = currentMillis; } } // если светодиод не загорожен if(light >= maxLight)( работа = вярно; ) )

Послеслов

Можете да видите работещото устройство във видеото, където направих няколко измервания.