Нужна помощь в написании скетча для ардуино.

Zukutomas
Offline
Зарегистрирован: 12.12.2016

Добрый вечер!

Суть в том, что мне необхдимо создать яркую короткую вспышку светодиода при нажатии на микрокнопку\или при замыкании геркона длительностью в одну микросекунду. Вспышка должна быть максимально короткой и в тоже время максиально яркой.  Дело в том, что тот скетч, что я составил (или по другми неизвестынм мне причинам) делает вспышку слишком тусклой, скетч могу предоставить. Не могу разобраться как усилить яркость вспышки при ее длительности в одну микросекунду.

За помощь материально отблагодарю. С уважением, Евгений.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Zukutomas пишет:

Добрый вечер!

Суть в том, что мне необхдимо создать яркую короткую вспышку светодиода при нажатии на микрокнопку\или при замыкании геркона длительностью в одну микросекунду. Вспышка должна быть максимально короткой и в тоже время максиально яркой.  Дело в том, что тот скетч, что я составил (или по другми неизвестынм мне причинам) делает вспышку слишком тусклой, скетч могу предоставить. Не могу разобраться как усилить яркость вспышки при ее длительности в одну микросекунду.

За помощь материально отблагодарю. С уважением, Евгений.

А можно, хоть одним глазком, на ваш чудо скетч глянуть ?

Не ну дествительно интересно, как смотрится вспышка в 1 микросекунду.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Zukutomas, вы примерно представляете как устроен человеческий глаз? Увидеть вспышку длиной 1µS, это всё равно что рассмотреть пролетающую пулю.. )

Zukutomas
Offline
Зарегистрирован: 12.12.2016

Простите, описка. Имеется в виду одна милисекунда. 

Green
Offline
Зарегистрирован: 01.10.2015

А чем обусловлена такая длительность?

Onkel
Offline
Зарегистрирован: 22.02.2016

dimax пишет:

Zukutomas, вы примерно представляете как устроен человеческий глаз? Увидеть вспышку длиной 1µS, это всё равно что рассмотреть пролетающую пулю.. )

Отнюдь. Хорошо тренированный глаз (тренировка заключается в сидении в темноте) может видеть отдельные фотоны . Если энергия вспышки будет больше энергии от фона (внешнего освещения)  за десяток- другой миллисекунд, то глаз увидит и микросекундную, и наносекундную вспышку как превышение над фоном. Как колбочки, так и палочки являются интеграторами с постоянной времени 10 мс, что за это время пришло - то и считается сигналом в мозг. А пришло за 1, 5, 10 мс или микросекунду- проинтегрируется. Фемтосекундный лазер видно глазом очень даже хорошо, даже однократные импульсы. А наносекундным лазером достаточной мощности можно глаз прожечь навылет. Так что вопрос только в том, как накачать светодиод.

Onkel
Offline
Зарегистрирован: 22.02.2016

Zukutomas пишет:

Добрый вечер!

Суть в том, что мне необхдимо создать яркую короткую вспышку светодиода при нажатии на микрокнопку\или при замыкании геркона длительностью в одну микросекунду. Вспышка должна быть максимально короткой и в тоже время максиально яркой.  Дело в том, что тот скетч, что я составил (или по другми неизвестынм мне причинам) делает вспышку слишком тусклой, скетч могу предоставить. Не могу разобраться как усилить яркость вспышки при ее длительности в одну микросекунду.

За помощь материально отблагодарю. С уважением, Евгений.

тут дело может быть не только в скетче, но и в физике светодиода и обвязки. Пишите ydom@mail.ru  решим вопрос.

Zukutomas
Offline
Зарегистрирован: 12.12.2016

Длительность обусловлена тем, что всышка попадает на вращающийся элемент, если длительность выше указанной, то получается нежелательный "смаз". Оттого и вопрос. Неужели это обусловленок конструкцией светодиода?

Onkel
Offline
Зарегистрирован: 22.02.2016

Zukutomas пишет:

Длительность обусловлена тем, что всышка попадает на вращающийся элемент, если длительность выше указанной, то получается нежелательный "смаз". Оттого и вопрос. Неужели это обусловленок конструкцией светодиода?

В том числе и конструкцией, хотя вряд ли это ваш случай и конструкция имеет решающий вклад в затягивание импульса. Тут нужно конкретно разбираться. Пришлите исходные данные (схему с номиналами, можно и скетч)  ydom@mail.ru  я посмотрю.

Onkel
Offline
Зарегистрирован: 22.02.2016

xDriver пишет:

А можно, хоть одним глазком, на ваш чудо скетч глянуть ?

Не ну дествительно интересно, как смотрится вспышка в 1 микросекунду.

точно так же как вспышка в 2 микросекунды, в 20 микросекунд и в 200 микросекунд, и вообще любая вспышка короче 10 мс - как вспышка.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Onkel пишет:

Отнюдь. Хорошо тренированный глаз (тренировка заключается в сидении в темноте) может видеть отдельные фотоны . Если энергия вспышки будет больше энергии от фона (внешнего освещения)  за десяток- другой миллисекунд, то глаз увидит и микросекундную, и наносекундную вспышку как превышение над фоном.

Тут трудно возразить вам , т.к. нечем проверить. Нет у меня безинерционных светодидов. А у обычных светодиодов время послесвечения люминофора столь велико, что и 1µS можно как будто увидеть, у мощных так и вообще по секунде светится после отключения тока, чем кстати очень хорошо интегрирует шим )

Onkel
Offline
Зарегистрирован: 22.02.2016

Берите безлюминофорный светодиод. Обычные индикаторные светодиоды 1 мГц дают на ура.  Но поверьте - наносекундный лазер не только видно, но и через штаны можно почувствовать, мне удавалось (случайно) прожигать наносекундным лазером даже карбид кремния (по твердости уступает лишь алмазу) в сверхтекучем гелии.

А у т.с. проблема в том, что он применил digitalWrite () - это 6 мкс, да еще пару выражений в цикле, и delayMicroseconds(1) - а delayMicroseconds работает с аргументом, кратным четырем, так что delayMicroseconds (1) выполняется 4 микросекунды, вот у него в одном цикле и получилось не 1 мкс, а 4+6+6=12 мкс , вот и вспышка в 12 (как минимум) раз длиннее. Ну дальше не буду, а то опять забанят, фичи ardunio ide тут называть багами нельзя.

Zukutomas
Offline
Зарегистрирован: 12.12.2016

Простите, что-то я немного запутался) Мне нужна вспышка длительностью в 1 милисекунду. 

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

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

Zukutomas
Offline
Зарегистрирован: 12.12.2016

Вот мой "скетч":

 

 
#define LEDPIN 8        // Вывод светодиода
#define BTNPIN 2         // Вывод кнопки
 
volatile int count = 0;  // Переменная счётчика (volatile означает указание компилятору не оптимизировать код её чтения,
                         // поскольку её значение изменяется внутри обработчика прерывания)
 
ISR(INT0_vect)
{
   count = 25;           // Инициализировать счётчик
}
// Режимы вызова прерывания INT0
#define INT0_SENSE_LOW_LEVEL     0        // Прерывание при низком уровне на выводе
#define INT0_SENSE_LEVEL_CHANGE  1        // Прерывание при изменении уровня
#define INT0_SENSE_FALLING_EDGE  2        // Прерывание по фронту на спад (когда 1 переходит в 0)
#define INT0_SENSE_RISING_EDGE   3        // Прерывание по фронту на подъём (когда 0 переходит в 1)
 
// Управляющая функция для прерывания INT0
//    mode    - режим вызова прерывания
//    enable  - разрешить/запретить прерывание
void int0Control (uint8_t mode, bool enable){
    EIMSK &= ~ (1 << INT0);                    // Запретить прерывание (так как следующая команда устанавливает режим INT0_SENSE_LOW_LEVEL)
    EICRA &= ~ (1 << ISC00) | (1 << ISC01);    // Обнуляем биты ISC00 и ISC01 в регистре EICRA
    EICRA |= mode;                             // Устанавливаем режим вызова прерывания INT0
    if (enable)
      EIMSK |= (1 << INT0);                    // Разрешить прерывание
}
void setup() {
  pinMode(LEDPIN, OUTPUT);                      // Вывод светодиода в режим вывода
    pinMode(BTNPIN, INPUT);                       // Вывод кнопки в режим ввода
    int0Control(INT0_SENSE_RISING_EDGE, true);    // Разрешить прерывание по фронту на подъём (в данном случае при нажатии на кнопку)
    interrupts(); // put your setup code here, to run once:
 
}
 
void loop() {
 if(count==0) {                              
    digitalWrite(LEDPIN, LOW);        // Выключить светодиод, если счётчик равен 0...
  }
  else {
    digitalWrite(LEDPIN, HIGH);       // ... иначе включить светодиод,
     --count;                         // и уменьшить счётчик на 1.
  }
  delayMicroseconds(1);                          // Подумать 1 милисекунду. // put your main code here, to run repeatedly:
 
}

 

Onkel
Offline
Зарегистрирован: 22.02.2016

Если вам нужна миллисекунда, то эту часть нужно изменить

ISR(INT0_vect)
{
   count = 72;           // Инициализировать счётчик было 25 надо поставить
}
 
а все остальное в коде оставить как есть.
теперь у вас импульс будет примерно миллисекунда.
Длительность импульса можно оценить, вращая светодиод во время импульса и вычислив по длине зайчика и скорости вращения.

 

 

Zukutomas
Offline
Зарегистрирован: 12.12.2016

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

strarbit
Offline
Зарегистрирован: 12.06.2016


const int ledPin =  8;  // Вывод светодиода
const int buttonPin = 2; // Вывод кнопки

volatile int count = 0;  // Переменная счётчика (volatile означает указание компилятору не оптимизировать код её чтения,
// поскольку её значение изменяется внутри обработчика прерывания)

void setup() {
  pinMode(buttonPin, INPUT_PULLUP); // задействовать внутренние подтягивающий резистор 
  pinMode(ledPin, OUTPUT);
  // Прерывание при низком уровне на выводе
  attachInterrupt(0, flash, LOW);

}

// функция обработки прерывания
void flash() {
  digitalWrite(ledPin, HIGH); // включить светодиод
  delayMicroseconds(1000); // или delay(1) 1 миллисекунда
  digitalWrite(ledPin, LOW); // Выключить светодиод
}

void loop() {

}
Onkel
Offline
Зарегистрирован: 22.02.2016

strarbit пишет:


  // Прерывание при низком уровне на выводе
  attachInterrupt(0, flash, LOW);

}

Точно LOW? Вроде тс хочет только при нажатии, однократно, а если LOW то прерывание будет постоянно вызываться, пока кнопка нажата, вроде тут надо FALLING, не?

Но в общем некрасиво, когда мк долго торчит в функции обработки прерывания, а так рабочий вариант. Ну за исключением LOW / FALLING.

DrProg
Offline
Зарегистрирован: 07.08.2015

Вот что хочет ТС:

strarbit
Offline
Зарегистрирован: 12.06.2016

Onkel пишет:

strarbit пишет:


  // Прерывание при низком уровне на выводе
  attachInterrupt(0, flash, LOW);

}

Точно LOW? Вроде тс хочет только при нажатии, однократно, а если LOW то прерывание будет постоянно вызываться, пока кнопка нажата, вроде тут надо FALLING, не?

Но в общем некрасиво, когда мк долго торчит в функции обработки прерывания, а так рабочий вариант. Ну за исключением LOW / FALLING.

Да, не досмотрела. Нужно FALLING.  

По поводу паузы в прерывании – зависит от конкретных условий. А больших требований не было, поэтому допустимо. Если по-хорошему, то нужна аппаратная защита от дребезга контактов кнопки

Alex_Ferrum
Offline
Зарегистрирован: 04.05.2015

Если тема актуальна, пишите:

chemill@yandex.ru

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