Обнаружение приблизительного угла/местоположения источника света с помощью фототранзисторов

Примечание: [Я изучаю Arduino примерно две недели, поэтому у меня мало опыта в использовании фототранзисторов.]

Мой план заключается в размещении четырех одинаковых фототранзисторов, расположенных на расстоянии примерно 10 см друг от друга, на макетной плате в форме буквы V. Каждый фототранзистор подключен к одному из «аналоговых входов». контакты соответственно (я использую Arduino Uno), при этом длинная ножка подключена к 5 В, а короткая ножка подключена к земле через резистор на 220 Ом. В центре этой установки я планирую разместить сервопривод, который будет смотреть в направлении светового луча, испускаемого фонариком.

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

Вы можете найти прикрепленные таблицы данных ниже (все компоненты взяты из стартового набора Arduino :)).

[Техническое описание фототранзистора]

[Техническое описание серводвигателя]

[Технические характеристики резистора 220 Ом]

Вот что у меня есть для кода:

#include <Servo.h>
Servo myServo;
const int transistorPin1 = A0;
const int transistorPin2 = A1;
const int transistorPin3 = A2;
const int transistorPin4 = A3;
void setup() {
  myServo.attach (10);
  Serial.begin (9600);
}
void loop() {
 int reading1 = analogRead (transistorPin1);
 int reading2 = analogRead (transistorPin2);
 int reading3 = analogRead (transistorPin3);
 int reading4 = analogRead (transistorPin4);
 int reading [] = {reading1, reading2, reading3, reading4}; //Это массив значений:
 int maxReading = reading [0], maxSensor = 1; // Я устанавливаю максимальное значение и фототранзистор, который ему соответствует:
   for (int i = 1; i <= 3; i++){ //Установка для остальных трех фототранзисторов:
     if (reading[i] > maxReading){  
     maxReading = reading[i];
     maxSensor = i + 1;
     }
   }
}

Итак, мой вопрос: как наиболее эффективно вычислить угол источника света? И подходит ли мой метод для этого приложения?

Спасибо, что нашли время прочитать это! Ваша поддержка будет очень признательна!

Обновлено 1:

Объяснение настройки моего оборудования:

Этот проект размещен на двух соединенных макетных платах, что означает отсутствие движущихся частей. Единственным движущимся компонентом является один единственный сервопривод, который фиксируется на месте.

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

Как вы можете видеть на первом изображении, я не планирую полный поворот на 360 градусов, что, вероятно, еще больше усложнит проблему. Любые предложения о том, как я могу закодировать это, будут очень признательны! Еще раз спасибо за ваше время.

, 👍3

Обсуждение

См. https://www.instructables.com/Arduino-Sunflower-an-Electronic-Sundancer/ или Google для Arduino Sunflower или солнечного трекера для получения дополнительных примеров. Я считаю, что наиболее эффективными являются датчики света, установленные на панели, которую перемещают сервоприводы. Сервоприводы продолжают позиционировать панель до тех пор, пока все фотодатчики не дадут точно такое же измерение. Можете ли вы сказать что-нибудь о физической конструкции вашего проекта?, @6v6gt

Спасибо за ваш ответ, ссылка, которую вы мне прислали, была весьма полезной, однако я заметил, что в упомянутом проекте используются два серводвигателя для полного вращения на 360 градусов (охватывающие все три координаты x, y и z). К сожалению, мне приходится прибегать к использованию одного серводвигателя, который обеспечивает только 180 градусов. Еще одна проблема, которую я заметил, заключается в том, что датчики света не являются стационарными и вращаются «шасси» робота. Из-за того, что мой проект полностью основан на макетах, используемый метод не будет работать для моего приложения. Я надеюсь, что мое редактирование прояснит идею немного лучше., @Alexander Watkins

Ваши усилия хорошо продуманы, но используйте другие до вас, например, https://arduinoprosto.ru/q/36597/detecting-the-light-source-location-using-multiple-photoresistors (да, я знаю, что это LDR, но задача аналогична). Кроме того, приложите некоторые усилия для калибровки фототранзисторов, даже если это просто проверка уровней, когда источник света находится на расстоянии 6 дюймов — они должны быть как можно более идентичными, а фиксированные 220 могут оказаться недостаточно хорошими. Наконец, помните, что у вас есть только 1 АЦП и вы переключаете каналы, проверьте, так сказать, соблюдаете ли вы ограничения скорости. // конец двух центов., @DrG

Просто для начала я бы, вероятно, посмотрел на фототранзистор, который дает самое сильное значение света, и использовал его в качестве текущей начальной точки (0, 60, 120 или 180 градусов, предполагая, что транзисторы были распределены вокруг сервопривода), а затем посмотрел на соседних транзисторах, чтобы определить, насколько и в каком направлении сместить результат от начальной точки. Результат отправляется на сервопривод. Повторять каждые X мс. Конфигурация вашего оборудования необычна тем, что все датчики статичны. В большинстве проектов слежения датчики перемещаются к источнику света., @6v6gt

Это действительно помогло! Это заняло у меня некоторое время, но мне удалось заставить его работать. Сервопривод дергается, но я доволен. Сегодня я прикреплю URL-адрес YouTube, чтобы показать свои результаты. Спасибо, ребята, за ответ!, @Alexander Watkins


1 ответ


1

В принципе, вам нужно всего два фототранзистора, левый и правый. Частное значений из рекламного конвертера (Vleft/Vright) скажет вам, где найти источник света. Если частное > 1, то источник света находится слева, если частное < 1, то источник света находится справа. Скорее всего, нет линейной зависимости между частным и угловым положением источника света. Это соотношение зависит от корпуса и расположения диодов в их корпусах. Одна из возможностей состоит в том, чтобы выполнить калибровку заранее и использовать справочную таблицу во время работы. Калибровку можно выполнить, поместив макетную плату с фотодиодами на вращающуюся платформу с источником света впереди, а затем записать Vleft и Vright под разными углами (с шагом в 1 градус?) платформы по отношению к источнику света. Если два фоторезистора не обеспечивают требуемой точности и/или диапазона, вы можете использовать больше фоторезисторов и использовать пару, которая лучше всего «смотрит» в направлении источника света.

,

Значение также может быть вычтено, а знак указывает направление. В любом случае оба датчика освещенности должны иметь одинаковую чувствительность., @Tarabas