Давно смотрел на схему со слежением за источником света, на операционных усилителях. Но паять и крутить подстроечные резисторы, было лень. Особо ничего нового не изобрел, но может кому, что-то и пригодится.
После экспериментов на esp8266, я просто забил на аналоговый вход, т.к. там такой мусор был в показаниях. Может модуль мне попался не качественный, еще и напряжение надо было ограничивать в 1V.
Вот дошло дело до ESP32. Естественно код писать, тоже лень, хотелось у себя в интерфейсе это делать, с возможностью без перепрошивки менять параметры. Ради статьи и чтоб не пинали, скетч тоже сделал.
Как заливать прошивку, есть много статей. Поэтому этот момент не описываю.
Опишу 2 варианта, оба работают прекрасно.
Первый способ.
Самый простой, что можно купить и сразу спаять.
Нам понадобится
1 блок питания на 5v 700mA ~110руб
ссылка
2 стабилизатор напряжения 3.3v ~100руб.
ссылка
3 модуль ESP32-WROOM 32 или что-то подобное, на практике выяснилось 16Мб самый раз модули прошивку можно большую грузить и для файлов место останется от 200 до 300 руб.
4 сервопривод ~110руб
ссылка
5.2шт. сопротивления 10Ком, выпаял со старых блоков питания
6 2шт. фоторезистора, у меня под рукой были GL5549 (10lux 45~140K 25C), думаю фоторезисторы могут подойти любые. ~80руб за партию
ссылка
7 для прошивки понадобится кабель
ссылка
и провода. Я решил не спаивать все и навесным монтажом все подключил т.к. плата уже давно была спаяна.
Схема проста как барабан
//
int posX = 1; // множитель
int pos = 90; // начальное положение
int sens1 = 32; // вывод для первого светочувствительного резистора
int sens2 = 33; // вывод для второго светочувствительного резистора
int tolerance = 400;
int port_out = 16;
const int freq = 50;//50Гц
int resolution = 16;
void set_pos() {
ledcWrite(port_out, 1638 + 6226/180*(pos/posX));// устанавливаем положение сервомотора
}
void setup() {
pinMode(sens1, INPUT);
pinMode(sens2, INPUT); \
if (ledcAttach(port_out, freq, resolution)) {
set_pos();
}
}
void loop() {
int val1 = analogRead(sens1); // считываем значение первого датчика
int val2 = analogRead(sens2); // считываем значение второго датчика
if(val1 - val2 > tolerance)
pos = --pos;
if(val2 - val1 > tolerance)
pos = ++pos;
if(pos > 180*posX) { pos = 180*posX; } // устанавливаем на 180, если больше этого значения
if(pos < 0) { pos = 0; } // устанавливаем в 0, если меньше этого значения
set_pos();
delay(50);
}
Так повелось давно, использование библиотек, не всегда удобно, они в большинстве своем не рассчитаны на динамическую и параллельную работу. По этому все делаю вручную и код не захламляется и не завишу не от кого. Свои грабли найти проще чем чужие.
Второй способ.
Естественно я с него и начал. Печатные платы заказаны в Китае. Сборка естественно ручная.
На модулях учтены нюансы и добавлены свои хотелки. Т.к. каждый контакт на счету приходится вертеться.
Это сменный модуль.
Заказывал модуль 4Мб флэш, думал в esp8266 хватает и в esp32 хватит. Оказалось маловато т.к. прошивка 1400Мб, а нужно обновление прошивки не по кабелю и файлы хранить где-то. Первым делом впаял 8Мб, но когда расширил возможности и доработал интерфейс, оказалось маловато места для файлов. И при перезаписи файлов начались глюки. В результате впаял 16Мб и забыл про глюки при нехватке места.
Заранее извиняюсь за следующее фото. Плата работает в тестовом режиме и отключать проводки не хочется. А камера фокус на провода все пытается навести.
Это вид сверху, собранной платы.
На борту
— 16ШИМ выходов внешних,
— 16 вход/выход внешних,
— 8 аналоговых
— 16 контактов esp32
— разъемы шин OneWire и i2c
— чип времени ds3231sn
— 4 канала MOSFET
— 3 для симисторов (не распевал, пока нужды не было)
Цель была с минимальными затратами и без создания прошивки сделать радар слежения за светом.
Нужно всего лишь добавить 3 порта и настроить их работу.
Потом добавить обработку сигналов для увеличения и уменьшения значений.
Картинки не вижу смысла делать, проще не большое видео, мышью насколько возможно, показываю какие поля заполнял.
Не большое разъяснение по цифрам при 50Гц, сервопривод в положении 0 на значении ШИМ 1638, положение 180 сервопривода соответствует значению ШИМ 8164, получается 8164-1638=6226 это шагов который может делать сервопривод.
Таким образом формула 1638+6226/180*(v/10) дает нам с точностью до 0.1 градуса поворачивать сервопривод, при желании точность можно увеличить еще в 3 раза вместо 10 написав 30 и получим точность 0.033 градуса.
Напряжение на портах 32 и 33 представлено 4096 значениями 12бит. Но я не вдавался в перевод значений в напряжение, значение 400 подобрал методом тыка, это если интересно 3.3/4096*400=0.3V
Ну и напоследок тест работы
если видео не видно, то
ссылка
PS. Единственное что в esp32 не удалось побороть сеть жнет память безбожно и интерфейс начинает тормозить
Желание без особых затрать и автономно работающее. Так же простая настройка и при желании быстро можно изменить поведение удаленно. Причем значения с датчиков тоже можно корректировать сидя у монитора.
habr.com/ru/articles/120480/
Трекер солнца делается на 2 фотодатчиках и маленькой горстке рассыпухи.
Например
eloquentarduino.com/posts/esp32-cam-object-detection
Мой посыл был в том, что задача отслеживания панелей решается без
CMC и регистрациимикроконтроллеров.И ещё раз, это всё при том что положение солнца давно рассчитано и вычисляемо в любой момент времени.
З.Ы. А, да, совсем забыл. Вечером солнышко сядет на западе и встанет на востоке — т.е. литералли со строго противоположной стороны, куда ваш сенсор вообще не смотрит. Как будем реализовывать алгоритм поиска? Держим в уме что подвижные контактные группы дорогие, ненадёжные и не очень приспособленные к тому чтобы жить на улице, т.е. бесконечно наматывать круги не вариант(к тому что мы тут пытаемся немножко вырабатывать электричество не для того чтобы напрасно жечь его ночью)
Единственная реальная проблема это вечером подготовиться к восходу. Остальное — фантазии.
Единственная реальная проблема — это при наличии копеечных МК пытаться героически изобретать очередной аналоговый велосипед.
Я не говорю пихать их куда угодно, если есть свободные контакты и это может осилить один микроконтроллер который уже стоит в доме, почему бы не применить его.
Я понимаю, что эстетство — как же так, 100500 мегагерц делают то, для чего нужны два фототранзистора. А пофигу — если первое стоит 5 долларов, а второе — один, но на первом я сэкономлю час времени, то для единичного изделия — самое оно.
Я например его использую, чтобы включать свет по датчику движения в разное время в зависимости от текущего времени года(не используя при этом датчики освещённости)
Ваш способ чисто визуально конечно проще, однако соверешнно точно будет глючить в моменты переменной облачности и всяких прочих погодных казусов. ИМХО гораздо проще просто наводиться в заранее известную координату в каждый момент времени.
Сейчас решаются простые задачи без расчетов и на том, что есть.
По сути, если вникнуть в расчеты, то их можно конечно и в котроллер просто прикрутить тоже.
И нужно будет только геолокацию внести и все посчитается само
github.com/happytm/SunTracker/tree/master
Автор утверждает, что результаты сходятся с suncalc.org
Правда есть подозрение, что если хочется совсем безинтернетный проект — придётся тогда еспшку оснастить каким-нибудь модулем часов реального времени(встроенные нифига не точные), но это лирика.
github.com/GyverLibs/SunPosition
у esp32 34, 35, 36, 39 аналоговые
У меня цель была другая проверить, а могу ли я простыми действиями, просто в интерфейсе, добавить порты и управлять слежением.
Намек выше про тучи учел, сделал эмуляцию, да будет сбоить, но гистерезис можно и уменьшить.
Все же для солнца пойдет математический расчет., часы есть положение не проблема внести.
Но как радиолюбитель я прошел опыт которого не прошел в детстве. И может какой мальчишка это попробует и ему пригодиться.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.