Создадим экспериментальную установку для измерения скорости, частоты, времени периода вращения спиннера. С помощью лазерного излучателя и фоторезистора мы можем сделать это довольно легко.
Шаг 1. Введение
Мы использовали 4-битный светодиодный дисплей для отображения данных и кнопку для изменения отображения типа данных.
Что это нам покажет?
- Тангенциальная скорость в м/с или км/ч;
- Частота / Число оборотов в секунду;
- Период времени в миллисекундах. Время полного оборота.
Как это работает?
- Вращающийся спиннер иногда перекрывает испускаемый лазерный луч и Arduino помогает фиксировать эти изменения;
- Он ждет, когда крыло спиннера перекроет луч и запомнит время, после, ан следующем крыле, также фиксирует время;
- Итак, у нас есть одна треть периода времени, если вы используете спиннер с тремя крыльями и тогда - это просто математика.
Шаг 2. Список деталей
Что мы использовали в уроке?
- Arduino Uno;
- Макетную плату;
- Источник лазера (часть набора датчиков 37 в 1), но вы также можете использовать фонарик, но вам может потребоваться немного изменить программу;
- Фоторезисторный модуль KY-018 (часть набора датчиков 37 в 1);
- 2 x Сопротивление 10 кОм;
- 4-разрядная цифровая катодная трубка (не нужна для эксперимента, вы также можете показать результаты на вашем ПК);
- 16 проводов Jumper M-M (папа - папа);
- 9 проводов Jumper M-F (мама-папа);
- Кнопка;
- Деревянные поверхности для фиксации лазерного излучателя и фоторезистора;
- Спиннер;
- Горячий клей;
- Скотч.
Шаг 3. Конструируем устройство
- Используйте горячий клей, чтобы сначала зафиксировать фоторезистор, а затем лазерный излучатель. Лазерный луч должен попадать на фоторезистор. Вы также должны зафиксировать макетную плату и Arduino.
- Подключите компоненты, как показано на фотографиях выше.
- Подключите фоторезистор к A0;
- Подключите кнопку к A1;
- Подключите контакты светодиодного дисплея так:
1 к Arduino D2
2 к Arduino D6
3 к Arduino D11
4 к Arduino D3
5 к Arduino D4
6 к Arduino D7
7 к Arduino D10
8 к Arduino D9
9 к Arduino D13
10 к Arduino D8
11 к Arduino D12
12 к Arduino D5 - Заклейте отверстия спиннера скотчем, потому что это может повлиять на ваши данные.
Шаг 4. Программирование
Используйте код ниже. Я новичок в Arduino и программировании, поэтому код может быть не идеальным. Но для меня он сработал хорошо. Я хотел бы немного объяснить код:
- Он содержит функцию, называемую «периодом», она ждет начала крыла (1) и измеряет пройденное время до следующего крыла (2).
- В функции цикла он вычисляет и печатает его на светодиодном дисплее.
- Функция changeSlide изменяет напечатанные данные, когда вы нажимаете кнопку.
- Функция printNumber печатает указанный номер на дисплее светодиода. Он может обрабатывать только целые числа. Так, например: если вы хотите напечатать номер 23.46, вам нужно умножить его на 100, а затем поместить запятую после 2-й цифры. так вот: printNumber (23.46 * 100,2);
Если вы не используете светодиодный дисплей, вы должны удалить всю функцию printNumber. И вместо этого вы можете использовать последовательный монитор или любой другой дисплей,
const int photoresistor = 0; const int button = 1; const int ch1 = 2; const int ch2 = 3; const int ch3 = 4; const int ch4 = 5; const int aa = 6; const int bb = 7; const int cc = 8; const int dd = 9; const int ee = 10; const int ff = 11; const int gg = 12; const int dot = 13; const int delay1=3; const float radius = 0.04; //enter it in meters const double pi = 3.14159265; long double periodtime; double speedt; int frequency; int slide = 0; void setup() { Serial.begin(9600); pinMode(ch1, OUTPUT); pinMode(ch2, OUTPUT); pinMode(ch3, OUTPUT); pinMode(ch4, OUTPUT); pinMode(aa, OUTPUT); pinMode(bb, OUTPUT); pinMode(cc, OUTPUT); pinMode(dd, OUTPUT); pinMode(ee, OUTPUT); pinMode(ff, OUTPUT); pinMode(gg, OUTPUT); pinMode(dot, OUTPUT); } long long period() { long long time1; long long time2; long PeriodTime; while(analogRead(photoresistor) >= 40); while(analogRead(photoresistor) < 40) { changeSlide(); } time1 = micros(); while(analogRead(photoresistor) >= 40); while(analogRead(photoresistor) < 40); time2 = micros(); PeriodTime = (time2 - time1)*3; if (PeriodTime < 2000) { return 0; } else { return PeriodTime; } } void loop() { periodtime = period(); if (periodtime > 0) { speedt = 2 * radius * pi / periodtime * 1000000; for (int x = 0; x < 100; x++) { changeSlide(); switch(slide) { case 0: //speed m/s printNumber(speedt*100,2); break; case 1: //speed km/h printNumber(speedt*360,2); break; case 2: //frequency 1/s frequency = 1 / periodtime * 100000000; printNumber(frequency,2); break; case 3: //period Time T printNumber(periodtime/1000,0); break; } } } } void changeSlide() { if (analogRead(button) > 900) { slide++; delay(300); if(slide > 3) { slide = 0; } digitalWrite(ch1,0); digitalWrite(ch2,0); digitalWrite(ch3,0); digitalWrite(ch4,0); switch(slide) { case 0: digitalWrite(aa,1); digitalWrite(bb,0); digitalWrite(cc,1); digitalWrite(dd,1); digitalWrite(ee,0); digitalWrite(ff,1); digitalWrite(gg,1); break; case 1: digitalWrite(aa,1); digitalWrite(bb,0); digitalWrite(cc,1); digitalWrite(dd,1); digitalWrite(ee,0); digitalWrite(ff,1); digitalWrite(gg,1); break; case 2: digitalWrite(aa,1); digitalWrite(bb,0); digitalWrite(cc,0); digitalWrite(dd,0); digitalWrite(ee,1); digitalWrite(ff,1); digitalWrite(gg,1); break; case 3: digitalWrite(aa,1); digitalWrite(bb,1); digitalWrite(cc,1); digitalWrite(dd,0); digitalWrite(ee,0); digitalWrite(ff,0); digitalWrite(gg,0); break; } } } void printNumber(long number,int place) { int num1 = number / 1000; int num2 = number / 100 - num1 * 10; int num3 = number / 10 - num1 * 100 - num2 * 10; int num4 = number - num1 * 1000- num2 * 100 - num3 * 10; //charachter 1 digitalWrite(ch1,0); digitalWrite(ch2,1); digitalWrite(ch3,1); digitalWrite(ch4,1); if(place==1) { digitalWrite(dot,1); } switch(num1) { case 0: digitalWrite(aa,1); digitalWrite(bb,1); digitalWrite(cc,1); digitalWrite(dd,1); digitalWrite(ee,1); digitalWrite(ff,1); digitalWrite(gg,0); break; case 1: digitalWrite(aa,0); digitalWrite(bb,1); digitalWrite(cc,1); digitalWrite(dd,0); digitalWrite(ee,0); digitalWrite(ff,0); digitalWrite(gg,0); break; case 2: digitalWrite(aa,1); digitalWrite(bb,1); digitalWrite(cc,0); digitalWrite(dd,1); digitalWrite(ee,1); digitalWrite(ff,0); digitalWrite(gg,1); break; case 3: digitalWrite(aa,1); digitalWrite(bb,1); digitalWrite(cc,1); digitalWrite(dd,1); digitalWrite(ee,0); digitalWrite(ff,0); digitalWrite(gg,1); break; case 4: digitalWrite(aa,0); digitalWrite(bb,1); digitalWrite(cc,1); digitalWrite(dd,0); digitalWrite(ee,0); digitalWrite(ff,1); digitalWrite(gg,1); break; case 5: digitalWrite(aa,1); digitalWrite(bb,0); digitalWrite(cc,1); digitalWrite(dd,1); digitalWrite(ee,0); digitalWrite(ff,1); digitalWrite(gg,1); break; case 6: digitalWrite(aa,1); digitalWrite(bb,0); digitalWrite(cc,1); digitalWrite(dd,1); digitalWrite(ee,1); digitalWrite(ff,1); digitalWrite(gg,1); break; case 7: digitalWrite(aa,1); digitalWrite(bb,1); digitalWrite(cc,1); digitalWrite(dd,0); digitalWrite(ee,0); digitalWrite(ff,0); digitalWrite(gg,0); break; case 8: digitalWrite(aa,1); digitalWrite(bb,1); digitalWrite(cc,1); digitalWrite(dd,1); digitalWrite(ee,1); digitalWrite(ff,1); digitalWrite(gg,1); break; case 9: digitalWrite(aa,1); digitalWrite(bb,1); digitalWrite(cc,1); digitalWrite(dd,1); digitalWrite(ee,0); digitalWrite(ff,1); digitalWrite(gg,1); break; default: digitalWrite(aa,0); digitalWrite(bb,0); digitalWrite(cc,0); digitalWrite(dd,0); digitalWrite(ee,0); digitalWrite(ff,0); digitalWrite(gg,0); break; } delay(delay1); //charachter 2 digitalWrite(aa,0); digitalWrite(bb,0); digitalWrite(cc,0); digitalWrite(dd,0); digitalWrite(ee,0); digitalWrite(ff,0); digitalWrite(gg,0); digitalWrite(dot,0); digitalWrite(ch1,1); digitalWrite(ch2,0); digitalWrite(ch3,1); digitalWrite(ch4,1); if(place==2) { digitalWrite(dot,1); } switch(num2) { case 0: digitalWrite(aa,1); digitalWrite(bb,1); digitalWrite(cc,1); digitalWrite(dd,1); digitalWrite(ee,1); digitalWrite(ff,1); digitalWrite(gg,0); break; case 1: digitalWrite(aa,0); digitalWrite(bb,1); digitalWrite(cc,1); digitalWrite(dd,0); digitalWrite(ee,0); digitalWrite(ff,0); digitalWrite(gg,0); break; case 2: digitalWrite(aa,1); digitalWrite(bb,1); digitalWrite(cc,0); digitalWrite(dd,1); digitalWrite(ee,1); digitalWrite(ff,0); digitalWrite(gg,1); break; case 3: digitalWrite(aa,1); digitalWrite(bb,1); digitalWrite(cc,1); digitalWrite(dd,1); digitalWrite(ee,0); digitalWrite(ff,0); digitalWrite(gg,1); break; case 4: digitalWrite(aa,0); digitalWrite(bb,1); digitalWrite(cc,1); digitalWrite(dd,0); digitalWrite(ee,0); digitalWrite(ff,1); digitalWrite(gg,1); break; case 5: digitalWrite(aa,1); digitalWrite(bb,0); digitalWrite(cc,1); digitalWrite(dd,1); digitalWrite(ee,0); digitalWrite(ff,1); digitalWrite(gg,1); break; case 6: digitalWrite(aa,1); digitalWrite(bb,0); digitalWrite(cc,1); digitalWrite(dd,1); digitalWrite(ee,1); digitalWrite(ff,1); digitalWrite(gg,1); break; case 7: digitalWrite(aa,1); digitalWrite(bb,1); digitalWrite(cc,1); digitalWrite(dd,0); digitalWrite(ee,0); digitalWrite(ff,0); digitalWrite(gg,0); break; case 8: digitalWrite(aa,1); digitalWrite(bb,1); digitalWrite(cc,1); digitalWrite(dd,1); digitalWrite(ee,1); digitalWrite(ff,1); digitalWrite(gg,1); break; case 9: digitalWrite(aa,1); digitalWrite(bb,1); digitalWrite(cc,1); digitalWrite(dd,1); digitalWrite(ee,0); digitalWrite(ff,1); digitalWrite(gg,1); break; default: digitalWrite(aa,0); digitalWrite(bb,0); digitalWrite(cc,0); digitalWrite(dd,0); digitalWrite(ee,0); digitalWrite(ff,0); digitalWrite(gg,0); break; } delay(delay1); //charachter 3 digitalWrite(aa,0); digitalWrite(bb,0); digitalWrite(cc,0); digitalWrite(dd,0); digitalWrite(ee,0); digitalWrite(ff,0); digitalWrite(gg,0); digitalWrite(dot,0); digitalWrite(ch1,1); digitalWrite(ch2,1); digitalWrite(ch3,0); digitalWrite(ch4,1); if(place==3) { digitalWrite(dot,1); } switch(num3) { case 0: digitalWrite(aa,1); digitalWrite(bb,1); digitalWrite(cc,1); digitalWrite(dd,1); digitalWrite(ee,1); digitalWrite(ff,1); digitalWrite(gg,0); break; case 1: digitalWrite(aa,0); digitalWrite(bb,1); digitalWrite(cc,1); digitalWrite(dd,0); digitalWrite(ee,0); digitalWrite(ff,0); digitalWrite(gg,0); break; case 2: digitalWrite(aa,1); digitalWrite(bb,1); digitalWrite(cc,0); digitalWrite(dd,1); digitalWrite(ee,1); digitalWrite(ff,0); digitalWrite(gg,1); break; case 3: digitalWrite(aa,1); digitalWrite(bb,1); digitalWrite(cc,1); digitalWrite(dd,1); digitalWrite(ee,0); digitalWrite(ff,0); digitalWrite(gg,1); break; case 4: digitalWrite(aa,0); digitalWrite(bb,1); digitalWrite(cc,1); digitalWrite(dd,0); digitalWrite(ee,0); digitalWrite(ff,1); digitalWrite(gg,1); break; case 5: digitalWrite(aa,1); digitalWrite(bb,0); digitalWrite(cc,1); digitalWrite(dd,1); digitalWrite(ee,0); digitalWrite(ff,1); digitalWrite(gg,1); break; case 6: digitalWrite(aa,1); digitalWrite(bb,0); digitalWrite(cc,1); digitalWrite(dd,1); digitalWrite(ee,1); digitalWrite(ff,1); digitalWrite(gg,1); break; case 7: digitalWrite(aa,1); digitalWrite(bb,1); digitalWrite(cc,1); digitalWrite(dd,0); digitalWrite(ee,0); digitalWrite(ff,0); digitalWrite(gg,0); break; case 8: digitalWrite(aa,1); digitalWrite(bb,1); digitalWrite(cc,1); digitalWrite(dd,1); digitalWrite(ee,1); digitalWrite(ff,1); digitalWrite(gg,1); break; case 9: digitalWrite(aa,1); digitalWrite(bb,1); digitalWrite(cc,1); digitalWrite(dd,1); digitalWrite(ee,0); digitalWrite(ff,1); digitalWrite(gg,1); break; default: digitalWrite(aa,0); digitalWrite(bb,0); digitalWrite(cc,0); digitalWrite(dd,0); digitalWrite(ee,0); digitalWrite(ff,0); digitalWrite(gg,0); break; } delay(delay1); //charachter 4 digitalWrite(dot,0); digitalWrite(aa,0); digitalWrite(bb,0); digitalWrite(cc,0); digitalWrite(dd,0); digitalWrite(ee,0); digitalWrite(ff,0); digitalWrite(gg,0); digitalWrite(ch1,1); digitalWrite(ch2,1); digitalWrite(ch3,1); digitalWrite(ch4,0); if(place==4) { digitalWrite(dot,1); } switch(num4) { case 0: digitalWrite(aa,1); digitalWrite(bb,1); digitalWrite(cc,1); digitalWrite(dd,1); digitalWrite(ee,1); digitalWrite(ff,1); digitalWrite(gg,0); break; case 1: digitalWrite(aa,0); digitalWrite(bb,1); digitalWrite(cc,1); digitalWrite(dd,0); digitalWrite(ee,0); digitalWrite(ff,0); digitalWrite(gg,0); break; case 2: digitalWrite(aa,1); digitalWrite(bb,1); digitalWrite(cc,0); digitalWrite(dd,1); digitalWrite(ee,1); digitalWrite(ff,0); digitalWrite(gg,1); break; case 3: digitalWrite(aa,1); digitalWrite(bb,1); digitalWrite(cc,1); digitalWrite(dd,1); digitalWrite(ee,0); digitalWrite(ff,0); digitalWrite(gg,1); break; case 4: digitalWrite(aa,0); digitalWrite(bb,1); digitalWrite(cc,1); digitalWrite(dd,0); digitalWrite(ee,0); digitalWrite(ff,1); digitalWrite(gg,1); break; case 5: digitalWrite(aa,1); digitalWrite(bb,0); digitalWrite(cc,1); digitalWrite(dd,1); digitalWrite(ee,0); digitalWrite(ff,1); digitalWrite(gg,1); break; case 6: digitalWrite(aa,1); digitalWrite(bb,0); digitalWrite(cc,1); digitalWrite(dd,1); digitalWrite(ee,1); digitalWrite(ff,1); digitalWrite(gg,1); break; case 7: digitalWrite(aa,1); digitalWrite(bb,1); digitalWrite(cc,1); digitalWrite(dd,0); digitalWrite(ee,0); digitalWrite(ff,0); digitalWrite(gg,0); break; case 8: digitalWrite(aa,1); digitalWrite(bb,1); digitalWrite(cc,1); digitalWrite(dd,1); digitalWrite(ee,1); digitalWrite(ff,1); digitalWrite(gg,1); break; case 9: digitalWrite(aa,1); digitalWrite(bb,1); digitalWrite(cc,1); digitalWrite(dd,1); digitalWrite(ee,0); digitalWrite(ff,1); digitalWrite(gg,1); break; default: digitalWrite(aa,0); digitalWrite(bb,0); digitalWrite(cc,0); digitalWrite(dd,0); digitalWrite(ee,0); digitalWrite(ff,0); digitalWrite(gg,0); break; } delay(delay1); digitalWrite(aa,0); digitalWrite(bb,0); digitalWrite(cc,0); digitalWrite(dd,0); digitalWrite(ee,0); digitalWrite(ff,0); digitalWrite(gg,0); digitalWrite(dot,0); }
Шаг 5. Итоговый результат и видео
Он показывает тангенциальную скорость по умолчанию. Нажмите кнопку, пока экран пуст:
- Если он показывает FFFF, он отображает частоту.
- Если он показывает 7777, он отображает период времени.
- Если он показывает SSSS, он отображает скорость тангетиона в м/с, снова нажимайте его и он показывает скорость в км/ч.
Если у вас возникнут вопросы об эксперименте - пишите нам на почту или оставляйте комментарии.