Давно смотрел на схему со слежением за источником света, на операционных усилителях. Но паять и крутить подстроечные резисторы, было лень. Особо ничего нового не изобрел, но может кому, что-то и пригодится.
После экспериментов на 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 и регистрациимикроконтроллеров.Я не говорю пихать их куда угодно, если есть свободные контакты и это может осилить один микроконтроллер который уже стоит в доме, почему бы не применить его.
Я например его использую, чтобы включать свет по датчику движения в разное время в зависимости от текущего времени года(не используя при этом датчики освещённости)
Ваш способ чисто визуально конечно проще, однако соверешнно точно будет глючить в моменты переменной облачности и всяких прочих погодных казусов. ИМХО гораздо проще просто наводиться в заранее известную координату в каждый момент времени.
Сейчас решаются простые задачи без расчетов и на том, что есть.
По сути, если вникнуть в расчеты, то их можно конечно и в котроллер просто прикрутить тоже.
И нужно будет только геолокацию внести и все посчитается само
github.com/happytm/SunTracker/tree/master
Автор утверждает, что результаты сходятся с suncalc.org
Правда есть подозрение, что если хочется совсем безинтернетный проект — придётся тогда еспшку оснастить каким-нибудь модулем часов реального времени(встроенные нифига не точные), но это лирика.
у esp32 34, 35, 36, 39 аналоговые
У меня цель была другая проверить, а могу ли я простыми действиями, просто в интерфейсе, добавить порты и управлять слежением.
Намек выше про тучи учел, сделал эмуляцию, да будет сбоить, но гистерезис можно и уменьшить.
Все же для солнца пойдет математический расчет., часы есть положение не проблема внести.
Но как радиолюбитель я прошел опыт которого не прошел в детстве. И может какой мальчишка это попробует и ему пригодиться.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.