Измеряем скорость вращающегося спиннера

В этом уроке мы создадим экспериментальную установку для измерения скорости, частоты, времени периода вращения спиннера. С помощью лазерного излучателя и фоторезистора мы можем сделать это довольно легко.

Измеряем скорость вращающегося спиннера

Шаг 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: Конструируем устройство

  1. Используйте горячий клей, чтобы сначала зафиксировать фоторезистор, а затем лазерный излучатель. Лазерный луч должен попадать на фоторезистор. Вы также должны зафиксировать макетную плату и Arduino.
  2. Подключите компоненты, как показано на фотографиях выше.
    - Подключите фоторезистор к 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
  3. Заклейте отверстия спиннера скотчем, потому что это может повлиять на ваши данные.

Шаг 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, он отображает скорость тангетиона в м/с, снова нажимайте его и он показывает скорость в км/ч.

Если у вас возникнут вопросы об эксперименте - пишите нам на почту или оставляйте комментарии.

Ардуино+