3 / 3 / 0
Регистрация: 02.01.2016
Сообщений: 160

Драйвер для ик-передатчика 940nm (для мощного лазера-светодиода), управляемый Arduino

20.02.2026, 12:40. Показов 1010. Ответов 5

Студворк — интернет-сервис помощи студентам
Добрый день!
Вопрос в следующем.
Хотим собрать конструкцию по типу лазерной рулетки, но для других целей.
Цель: излучаем последовательность, она отражается от препятствия, прилетает назад, регистрация, что это именно то что нам нужно.
Излучаемая последовательность (0 и 1) модулируется меандром частотой 38кГц.
Вот схема:
Так как эти светодиоды TSAL6100 на 100мА, SFH400 на 300 мА, то сделал драйвер (усилитель меандра).
Вот схема: и осциллограмма
Вот файл в Proteus 8: Vkl_svetodioda-3.rar
Если такой диод подключить прямо к Ардуино, то напряжение (амплитуда) на ноге Ардуины сразу снижается до +- 1 вольта.

Когда к этому драйверу подключал светодиоды TSAL6100 и SFH400, то система работала, на приемнике была регистрация прихода излучаемого сигнала (7 и 8 метров соответственно), но особой разницы по дальности я не получил между тем как я напрямую подключал светодиод TSAL6100 к Ардуино (5 метров) или через этот драйвер. На драйвере сопротивления от светодиода на землю я подбирал по току светодиода. В моем случае это было или 39 Ом или 7,5 Ом. При подключении SFH400 дальность немного увеличилась но незначительно, на пару метров.
Но что я заметил, что сам меандр на эмиттере имеет искаженную форму (использую осциллограф) когда я подключаю светодиод. Когда просто подключаю нагрузочное сопротивление, то все отлично.
Я так понимаю, что раз форма искажается, то это возможная причина, что приемник не может нормально распознать сигнал и распознает его только на малом расстоянии.
Вот пример:
Модулирующая последовательность -
На выходе драйвера нагрузочное сопротивление -
На выходе драйвера ик-диод -
Но я пошел дальше, так как мне нужно расстояние 30 метров до препятствия.
Я купил лазер на Алиэкспресс - , ,
Подключил его к моему драйверу и получилось так, что приемник вообще не регистрировал никаких приемов. Видно что пакеты приходят, но правильно принятых нет... Осцилограмма еще больше искаженная, чем я приводил.
После, я начитался всего и собрал другой драйвер на MOSFET-транзисторе.
Вот схема:
Вот файл в Proteus 8: Vkl_svetodioda-2.rar
Но ситуация вообще не поменялась.
TSAL6100 на 100мА, SFH400 на 300 мА работают также, прием есть, расстояния те же.
Меандр немного также искажен.
Если подсоединяю двойной лазер с Али, то вообще никакого приема нет... Меандр искажен...
Код передатчика:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
byte Lshift[] = {3,3,2,2};
uint32_t UartFreq = 0; //Переменная для задания нужной частоты
uint32_t compare = OCR1A;     //OCR1A - Регистры сравнения A выхода таймера/счетчика1
uint16_t divider = 1;         //переменная коэфф. деления прескалера
float freqency;
int set_a = 0;
const int BTN_PIN = 10;
const int IR_PIN = 9;  // Пин передатчика
uint8_t DATA = 0b10101010;
 
void setup() {
  Serial.begin(38400);
  Serial.setTimeout(10);     // Устанавливает (миллисекунды) таймаут ожидания приёма данных для следующих ниже функций. По умолчанию равен 1000 мс (1 секунда).
  pinMode (IR_PIN, OUTPUT);       // выход генератора
  pinMode (BTN_PIN, INPUT_PULLUP);
  setFrequency(38000);
  //start_gen();
}
 
void loop() {
 
  if (Serial.available() > 0) {
    char cmd = Serial.read();
    
    if (cmd == 'F' || cmd == 'f') {
      uint32_t UartFreq = Serial.parseInt();
      if (UartFreq > 0) {
        setFrequency(UartFreq);
        //Serial.print("Установка частоты генератора");
      }
    }
  }
 
  if (digitalRead(BTN_PIN) == HIGH) {
    sendByte(DATA);
    //Serial.print("Отправлен пакет, f: "); Serial.println(freqency);
    delay(150);
  }
 
}
// =======================================================================================
void stop_gen() {
  TCCR1A=0;  // Регистр управления А таймера/счетчика1
  TCCR1B=0;   // Регистр управления B таймера/счетчика1
}
 
void start_gen() {
  TCCR1A = 1 << COM1A0;              // Регистр управления А таймера/счетчика1
  TCCR1B = set_a | ( 1 << WGM12 );   // Регистр управления B таймера/счетчика1
}
 
void setFrequency(uint32_t Freq) {
 
  if (Freq <= 130 || Freq > 100000) {             //Проверяем допустимый диапазон значений частоты
    Serial.println("Ошибка: частота должна быть 130 Гц - 100 kHz");
    return; 
  }
  compare = (F_CPU / Freq / 2 / divider); //вычисляем нужное значение OCR
  set_a = 0;
  for (byte i = 0; i < 4; i++) {
    if (compare > 65536) {
      divider <<= Lshift[i];
      compare = F_CPU / Freq /2 /divider;
    } else {
      set_a = i + 1;
      //TCCR1B = (i + 1) | ( 1 << WGM12 );
      break;
    }
  }
  OCR1A = compare-1;
  //TCCR1A = 1 << COM1A0;
 
  freqency = F_CPU / 2 / (OCR1A + 1) / divider;
  if (freqency < 10000) {
    Serial.print("Частота на выходе= ");
    Serial.print(freqency, 0);
    Serial.println(" Hz ");
    Serial.print("OCR1A= ");
    Serial.println(OCR1A);
    Serial.print(" Вы ввели частоту= ");
    Serial.println(Freq);
  }
  if (freqency >= 10000) {
    Serial.print("Частота на выходе= ");
    Serial.print(freqency / 1000, 3);
    Serial.println(" kHz");
    Serial.print("OCR1A= ");
    Serial.println(OCR1A);
    Serial.print(" Вы ввели частоту= ");
    Serial.println(Freq);
 
  }
}
 
void sendBit(bool bitValue) {
  start_gen();
  delayMicroseconds(bitValue ? 1000 : 500); // например для 1 - 1000мкс для 0 - 600 мкс
  stop_gen();
  delayMicroseconds(500);
}
 
void sendByte (uint8_t data) {
  start_gen();
  delayMicroseconds(3000);
  stop_gen();
  delayMicroseconds(1000);
  //первый бит синхронизация
  for(int i = 0; i < 8; i++) {
    sendBit(data & 0x80);//берем старший бит из байта - первый 
    //если будет sendBit(data) - то это передается весь байт сразу
    data <<= 1;//сдвигаем байт влево на 1 бит чтобы на след итерации 
    //старший бит был следующий
  }
  start_gen();
  delayMicroseconds(2000);
  stop_gen();
}
Код приёмника:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
const int RECV_PIN = 3;
const int LED_PIN = 13;
uint8_t DATA = 0b10101010;
 
uint8_t readByte() {
  uint8_t value = 0;//значение для результата
  // пока пин high ждем low
  while (digitalRead(RECV_PIN) == HIGH);
  unsigned long t = micros();  //создадим переменную t для замера low 
  while (digitalRead(RECV_PIN) == LOW);
  if (micros() - t < 2500) return 0;  // если сигнал стартового low < 2500 мкс возрващаем 0
 
 
 
  delayMicroseconds(1000);  // пауза после синхр
 
  for (int i = 0; i < 8; i++) {
    // ждём LOW
    while (digitalRead(RECV_PIN) == HIGH);
 
    t = micros();  //Засекаем время начала LOW
    while (digitalRead(RECV_PIN) == LOW);
 
    unsigned long pulse = micros() - t;  //Вычисляем длительность LOW в микросекундах
    value <<= 1;
 
    if (pulse > 750) value |= 1;  //больше 450мкс следует бит == 1 побитовое присваивание
  }
 
  return value;
}
 
void setup() {
  pinMode(RECV_PIN, INPUT);
  pinMode(LED_PIN, OUTPUT);
  Serial.begin(38400);
}
 
void loop() {
  if (digitalRead(RECV_PIN) == LOW) {
    uint8_t data = readByte();
    Serial.print("Принято: ");
    Serial.println(data, BIN);  //выводим в бинарном виде
    if (data == DATA) {
      digitalWrite(LED_PIN, HIGH);
      delay(100);
      digitalWrite(LED_PIN, LOW);
    } else {
      Serial.println("ошибка - не верно");
    }
  }
}
Подскажите где я ошибся, что сделал не так.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.02.2026, 12:40
Ответы с готовыми решениями:

Драйвер для ик-передатчика 940nm (для мощного лазера-светодиода)
Добрый день! Вопрос в следующем. Хотим собрать конструкцию по типу лазерной рулетки, но для...

Конструктивные расчеты мощного светодиода
Здраствуйте. Пишу диплом по светодиодам,куратор попросила включить конструктивные расчеты по...

Питание мощного cob-светодиода от 18650
Заказал вот такую вот штуку (линк на Али) если верить комментариям и другим лотам с подобной...

5
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8662 / 4498 / 1670
Регистрация: 01.02.2015
Сообщений: 13,914
Записей в блоге: 12
20.02.2026, 19:09
За лазер не скажу, помню, что когда читал о ИК-пультах телевизора был удивлён, что ИК-излучатель потребляет ток около 1 А, но за счёт очень коротких импульсов средний ток за период всей посылки остаётся ничтожно малым (для батарейного питания).

Это я к тому, что для передачи там используется какой-то другой принцип кодирования (не поднесущей и огибающей, как у Вас), позволяющий и сохранить среднее низкое потребление и устойчиво передавать сигнал. Т.е. полагаю, что нужно менять принцип кодирования каждого 0 и 1, и всего байта.
Не могу подсказать, на какой - опыта мало.

Добавлено через 2 минуты
Помню, что у Atmel был Appnote (пример) ИК-приёмника и передатчика с каким-то кодированием. Там был и код и описание.
Попробуйте найти - может, именно это и требуется.
0
656 / 409 / 76
Регистрация: 21.09.2008
Сообщений: 1,405
21.02.2026, 06:50
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Помню, что у Atmel был Appnote (пример) ИК-приёмника и передатчика с каким-то кодированием. Там был и код и описание.
Эти?
Ещё нашел этот код к данной ТД здесь.
1
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8662 / 4498 / 1670
Регистрация: 01.02.2015
Сообщений: 13,914
Записей в блоге: 12
21.02.2026, 12:54
Да, эти.
0
656 / 409 / 76
Регистрация: 21.09.2008
Сообщений: 1,405
22.02.2026, 06:35
Нашёл ещё исходники на ассемблере для данных Application Notes
Вложения
Тип файла: zip avr410.zip (2.1 Кб, 7 просмотров)
Тип файла: zip AVR415.zip (3.9 Кб, 7 просмотров)
1
52 / 49 / 17
Регистрация: 29.02.2016
Сообщений: 219
22.02.2026, 11:26
Для ИК ПДУ есть хорошая билиотека https://github.com/Arduino-IRr... o-IRremote там в ней есть описание некоторых особенностей использования, возможно их нужно учесть если используете тот же принцип.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.02.2026, 11:26
Помогаю со студенческими работами здесь

подключение мощного светодиода в МК
Собственно никогда с мощными дело не имел, и понятно что есть спец контроллеры с регулятором тока....

Сборка трех лазерных модулей (лазерных указок) в одно устройство
Всем доброго дня! У меня появилась необходимость в создании как бы простенького устройства...

Радио приёмник и передатчик arduino
Приветствую, недавно купил передатчик FS1000A и приёмник MX-RM-5V, от ардуино. Вот на этом сайте...

Сборка передатчика средней мощности
В журнале «Радио мир» пятый номер за 2004 год была опубликованна статья А.Бутова «Мощный...

Разность мощности передатчика
Привет! Допустим есть передатчик который передает какой-то сигнал(не важно какой) с мощностью 0...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru