цифровая электроника
вычислительная техника
встраиваемые системы

 
» » Стробоскоп на основе Arduino своими руками


Стробоскоп на основе Arduino своими руками

Автор: Mike(admin) от 12-03-2021, 03:35

Стробоскоп – это инструмент для определения скорости циклического движения (такого как вращение или вибрация), при котором движение кажется замедленным или остановленным: например, вращающийся диск с отверстиями по краю, через которые просматривается объект, или устройство, которое использует импульсную лампу для периодического освещения движущегося объекта.


Стробоскоп на основе Arduino своими руками

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


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


Стробоскоп на основе Arduino своими руками

Он разработан на базе Arduino Nano. Вспышки производятся обычным фонариком с 9 светодиодами, батарея которого 4,5 В заменена двумя проводами, подключенными к цепи стробоскопа. Период и продолжительность вспышки можно установить с помощью четырех кнопок. Их значения отображаются на стандартном жидкокристаллическом дисплее размером 16x2 символа. Они варьируются от 0,1 мс до 999,9 мс с разрешением 0,1 мс.


Кнопки увеличивают или уменьшают период или продолжительность мигания со скоростью, увеличивающейся со временем, в течение которого была нажата кнопка. Эта скорость подчиняется закону, который можно легко изменить в коде. ЖК-дисплей, используемый для отображения периода и продолжительности, совместим с библиотекой liquidCrystal и подключается так же, как в примерах из этой библиотеки, за исключением подсветки, которая регулируется потенциометром.


Стробоскоп может управлять дополнительной электронной вспышкой, кратковременно закорачивая центральный контакт с землей в каждый период времени. Эту вспышку можно использовать как альтернативу, так и одновременно со светодиодным фонариком. Синхронизация стробоскопа достигается за счет сокращения цифрового входа на землю. Когда этот вход заземлен, излучение вспышки прекращается. Когда он снова размыкается, вспышка срабатывает ровно на один период позже. Внимание: при установке времени зажигания двигателя не подавайте напряжение от системы зажигания на вход синхронизации, это может привести к повреждению Arduino.


Стробоскоп на основе Arduino своими руками

Светодиодный фонарик управляется цифровым выходом D13 Nano. Он не подключен напрямую к этому выходу, потому что ему нужен ток 180 мА при напряжении 4,5 В, а каждый выход Arduino ограничен 40 мА. Фонарик питается от батареи 9 В через N-канальный полевой МОП-транзистор Q2 и резистор R2 на 47 Ом. Этот резистор ограничивает ток через фонарик примерно до 100 мА, что достаточно для хорошего освещения. Резистор должен рассеивать мощность не менее 47 x 0,1² = 0,47 Вт. Резистор мощностью 1 Вт – хороший выбор.


Стробоскоп на основе Arduino своими руками

Стробоскоп на основе Arduino своими руками

Полные схемы соединений приведены далее.


Стробоскоп на основе Arduino своими руками

Стробоскоп на основе Arduino своими руками

Код программы Arduino выглядит следующим образом.



#include <LiquidCrystal.h>

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
const int backLightPotPin=A7;
const int backLightPin=10;

const int pushButtonPin[4]={6, 7, 8, 9};

const int ledPin=13;

const int electronicFlashPin=A6;

const int synchroPin=A5;

unsigned long flashPeriod=500000, flashDuration=100000;

unsigned long lastTime=0, actualTime, elapsed;

const unsigned firstDelayButton=1000,
               firstIncrementButton=100,
               firstRepeatButton=300,
               secondDelayButton=4000,
               secondIncrementButton=100,
               secondRepeatButton=50,
               thirdDelayButton=8000,
               thirdIncrementButton=10000,
               thirdRepeatButton=200;

const unsigned debounceDelay=50;
bool incremented=false;

int pressedButton;      

unsigned long actualButtonsTime=0;

unsigned long buttonPressedTime=0; 

unsigned long elapsedButton; 

unsigned long incrementTime=0;  

unsigned long incrementDelay=0; 

void displayValues()

{
  int displayedPeriod = flashPeriod/100;
  int displayedDuration = flashDuration/100;

  lcd.setCursor(6, 0);
  if (displayedPeriod < 100)
    lcd.print(" ");
  if (displayedPeriod < 1000)
    lcd.print(" ");
  lcd.print(displayedPeriod/10);
  lcd.setCursor(10,0);
  lcd.print(displayedPeriod-10*(displayedPeriod/10));
  
  lcd.setCursor(6, 1);
  if (displayedDuration < 100)
    lcd.print(" ");
  if (displayedDuration < 1000)
    lcd.print(" ");
  lcd.print(displayedDuration/10);
  lcd.setCursor(10,1);
  lcd.print(displayedDuration-10*(displayedDuration/10));
}

bool readButtons()
{
  for (int i=0; i<4; i++)
    if (digitalRead(pushButtonPin[i])==LOW)
    {
      pressedButton=i;
      return(true);
    }
  return(false);
}

void increaseDecrease(int increment)
{
  switch(pressedButton)
  {
    case 0 :
      if (flashPeriod < 999900-increment)
        flashPeriod+=increment;
      else flashPeriod=999900;
      break;
    case 1 :
      if (flashPeriod > 100+increment)
        flashPeriod-=increment;
      else flashPeriod=100;
      break;
    case 2 :
      if (flashDuration < 999900-increment)
        flashDuration+=increment;
      else flashDuration=999900;
      break;
    case 3 :
      if (flashDuration > 100+increment)
        flashDuration-=increment;
      else flashDuration=100;
      break;
  }
  displayValues();
}

void manageIncrementTime(int delayValue, int increment)
{
  if (actualButtonsTime < incrementTime)
    incrementDelay=0xFFFFFFFFul-incrementTime+actualButtonsTime;
  else
    incrementDelay=actualButtonsTime-incrementTime;    
  if (incrementDelay>=delayValue)
  {
    increaseDecrease(increment);
    incrementTime=actualButtonsTime;
  }
}

void setup() {
for (int i=0; i<4; i++) pinMode(pushButtonPin[i], INPUT_PULLUP);
pinMode(backLightPin, OUTPUT);
pinMode(ledPin, OUTPUT);
pinMode(electronicFlashPin, OUTPUT);
pinMode(synchroPin, INPUT_PULLUP);
digitalWrite(ledPin, LOW);
digitalWrite(electronicFlashPin, LOW);

lcd.begin(16, 2);

lcd.setCursor(1, 0);
lcd.print("Per.    .  ms");
lcd.setCursor(1, 1);
lcd.print("Dur.    .  ms");
displayValues();
}

void loop() {

digitalWrite(electronicFlashPin, LOW);
actualTime=micros();

if (digitalRead(synchroPin)==LOW) 
{
  lastTime=actualTime;
  digitalWrite(ledPin, LOW);
}
else
{
  if (actualTime < lastTime)
    elapsed=0xFFFFFFFFul-lastTime+actualTime;
  else
    elapsed=actualTime-lastTime;
  if (elapsed>=flashDuration) digitalWrite(ledPin, LOW);
  if (elapsed>=flashPeriod)
  {
    digitalWrite(ledPin, HIGH);
    digitalWrite(electronicFlashPin, HIGH);
    lastTime+=flashPeriod;
  }

actualButtonsTime=millis();
if (readButtons())
{
  if (actualButtonsTime<buttonPressedTime)
    elapsedButton=0xFFFFFFFFul-buttonPressedTime
                              +actualButtonsTime;
  else
    elapsedButton=actualButtonsTime-buttonPressedTime;
  if (elapsedButton>thirdDelayButton)
    manageIncrementTime(thirdRepeatButton, 
                        thirdIncrementButton);
  else if (elapsedButton>secondDelayButton)
    manageIncrementTime(secondRepeatButton,
                        secondIncrementButton);
  else if (elapsedButton>firstDelayButton)
    manageIncrementTime(firstRepeatButton,
                        firstIncrementButton);
  else if (elapsedButton>debounceDelay & !incremented)
  {
    increaseDecrease(100);
    incremented=true;
  }
}
else
{
  buttonPressedTime=actualButtonsTime;
  incremented=false;
}

analogWrite(backLightPin, analogRead(backLightPotPin)/4);
}
}



© digitrode.ru


Теги: Arduino, стробоскоп




Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий