Помогите разобраться новичку.
- Войдите на сайт для отправки комментариев
Предыстория:
Строю я крышку к аквариуму, в которой собрал 8 каналов белого (включать 1, затем 2, затем 3 и т.д. тем самым имитируя рассвет, и в обратном порядке выключая - закат). Так-же там собрал 4 RGB (12 каналов - для коррекции цвета, например "вечером" добавляя красного).
Итого у меня 20 каналов света, управляемые LDD-700h + 2 канала охлаждения, упраляемые MOSFETами.
Купил Arduino Mega 2560 и 2 шилда с PCA9685, таймер реального времени ("утром" подача "1" на один из входов Arduino, вечером "0") собрал все это.
Проблемка:
Неделю уже бъюсь над кодом, чтобы хотя-бы на нектороый процент PWM днем включать свет, ночью гасить, оставляя небольшой процент PWM.
Непосредственно на свои PWM Arduino выводить это я научился, а вот выводить это на PCA9685 никак.
Подскажите, пожалуйста что и где я не так делаю.
#include <Wire.h> #include <HT_PCA9685.h> int daypin = 14; // Таймер подключен к 14-му входу int SunPin = 0; // Потенциометр подключен 0-му аналоговому входу int MoonPin = 1; // Фоторезистор подключен 1-му аналоговому входу int Sun = 0;// переменная для хранения значения входного напряжения int Moon = 0;// переменная для хранения значения входного напряжения int day = 0; HT_PCA9685 pwm2 = HT_PCA9685(0x42); HT_PCA9685 pwm1 = HT_PCA9685(0x41); void setup() { { Serial.begin(9600); pinMode(daypin, INPUT); Wire.begin(); // Wire старт } { pwm1.begin(); pwm1.PWMFreq(1000); // 1kHz pwm2.begin(); pwm2.PWMFreq(1000); // 1kHz } } void loop() { { day = digitalRead(daypin); // узнаём состояние кнопки Moon = analogRead(MoonPin); // считываем значение с фоторезистора Sun = analogRead(SunPin); // считываем значение с потенциометра Serial.println("d"); Serial.println(Sun); Serial.println(day); delay(50); Serial.println("n"); Serial.println(Moon); Sun = Sun*4; // конвертируем из 0-1023 к 0-4096 Moon = Moon*4; // конвертируем из 0-1023 к 0-4096 } { if(day==HIGH) {pwm1.PWM(0,Sun); pwm1.PWM(1,Sun); pwm1.PWM(2,Sun); pwm1.PWM(3,Sun); pwm1.PWM(4,Sun); pwm1.PWM(5,Sun); pwm1.PWM(6,Sun); pwm1.PWM(7,Sun); pwm1.PWM(8,Sun); pwm1.PWM(9,Sun); pwm1.PWM(10,Sun); pwm1.PWM(11,Sun); pwm1.PWM(12,Sun); pwm1.PWM(13,Sun); pwm1.PWM(14,Sun); pwm1.PWM(15,Sun); delay(100);} else { pwm1.PWM(0,Moon); pwm1.PWM(1,Moon); pwm1.PWM(2,Moon); pwm1.PWM(3,Moon); pwm1.PWM(4,Moon); pwm1.PWM(5,Moon); pwm1.PWM(6,Moon); pwm1.PWM(7,Moon); pwm1.PWM(8,Moon); pwm1.PWM(9,Moon); pwm1.PWM(10,Moon); pwm1.PWM(11,Moon); pwm1.PWM(12,Moon); pwm1.PWM(13,Moon); pwm1.PWM(14,Moon); pwm1.PWM(15,Moon); delay(100); } delay(200); } }
Коменто типа: "говнокод", читай "ссылка" не надо. Читал я много статей, но для меня это темный лес, у меня лишь на опыте/примерах получается учиться.
Непосредственно на свои PWM Arduino выводить это я научился, а вот выводить это на PCA9685 никак. Для начала с его системой команд разобратся, там в библиотеке примеры есть какие-нибудь?
Вот тот пример полностью, переиграв котрый я пытаюсь написать:
А если закомментить с 24 по 26 строку, у вас после этого яркость изменяется?
Кстати http://www.nxp.com/documents/data_sheet/PCA9685.pdf , если с аглицким нормально.
Закоментить24
}
25
void loop() {
26
{ ?
Читал я это несколько раз, но не силен я в английском.
Пробовал его и гугл переводчиком - еще непонятнее.
Я строки из кода примера имел в виду, если с ним нормально работает.
Опаньки, а он сам по себе дает те-же результаты.
Работает лишь:
Но в нем я мало догоняю, и менять под свои нужды в нем у меня не особо выходит.
Во втором градаций яркости очень мало получается. А по первой конструкции, пример тоже не работает?
В общем, я залил очередной пример, и у меня все выводы PCA9568 вышли в высокоимпедансное состояние, хотя до этого на них был "0", все поперепробовал - не знаю уже что делать
Ток даташит курить с библиотекой и пробовать, ну может еще кто связывался с этой радостью.
А не могли бы вы мне раскоментировать часть кода?
И еще смешной вопрос, вы I2C адреса своих мелкосхем проверяли? Откуда 0х41 и 0х42 ?
:) Этот момент я еще 4 дня назад победил.
0х41 и 0х41 получены путем установки перемычек на платы.
проверял осцилографом на SDA:
когда ставлю адрес 0х40 - есть лишь короткая серия запроса от Arduino
Когда ставлю 0х41 и 0х42 - идет постоянное общение длинными сериями между Arduino и PCA9685.
К слову:
Спасибо Вам за раскоментированный код, я сильно продвинулся, мне удалось заставить реагировать на "Sun" (см.код) один канал на PCA9685.
Сейчас допишу на все каналы и могу сюда сбросить.
:) Этот момент я еще 4 дня назад победил.
0х41 и 0х41 получены путем установки перемычек на платы.
проверял осцилографом на SDA:
когда ставлю адрес 0х40 - есть лишь короткая серия запроса от Arduino
Когда ставлю 0х41 и 0х42 - идет постоянное общение длинными сериями между Arduino и PCA9685.
К слову:
Спасибо Вам за раскоментированный код, я сильно продвинулся, мне удалось заставить реагировать на "Sun" (см.код) один канал на PCA9685.
Сейчас допишу на все каналы и могу сюда сбросить.
Сложным вы однако путем шли, есть такая вещь, зовется I2C сканер. Заливаете код в дуину, он вам выдает адреса всех подключенных устройств. Вопрос возник от того, что по магической цифре B111000 у меня получается 0х38, а есть подозрения что это адрес.((((
На шильде PCA9685 впаивается до 6ти перемычек, задающие ее адрес. "В111000" - это равносильно перевычкам "111000" я же впаял перемычки "000001" и "000010". - Все постигнуто опытным путем.
Заработала одна плата PCA9685 вот так:
И работают плавно на всю длину потенциометра?
То плавно, то подергивают. Но я считаю это косяком старого Б/У потенциометра, так-как монитор порта тоже не очень ровно меняет цифры цифры, когда кручу потенциометр.
Не подскажите, как проще и правильнее в вышеуказанный код вторую PCA9685 плату вписать либо расширить пины с 0...15 до 0...31?
Для проверки, возьмите ваш начальный пример и измените в цикле level с 0 до 4096. вывод просто level ,без умножений. Была ведь причина, что значение только до 100 принимается, а это 2,5% от вашей шкалы.
По второму вопросу не помогу, не настолько опыт велик.
Не очень понял методику проверки. Для меня оказалось проще посмотреть плавность изменения PWM с помощью осцилографа.
Изменения PWM идут через 400мс но вполне точно, под изменение напряжения на а0/а1 (в зависимости от состояния D14).
Спасибо большое за совет.
Имел в виду вот это.
Все работало без видимых глюков, при подключении светодиодов, для тестов непосредственно к pca9685. При подключении pca9685 к ldd700 (pwm драйверам светодиодов) выяснилось:
- Необходимо инвертировать сигнал с pca9685 - кто может подсказать как?
- Ldd700 не совсем адекватно воспринимают pwm: 870 и более диоды погашены.
867 - минимальная яркость диодов. 830 и менее - практически полная яркость диодов.
- диоды горят со вспышками, при каждом цикле loop.
подозревал о связи вспышек с моментами
Serial
.println(
"d"
);
31
Serial
.println(Sun);
32
Serial
.println(day);
33
delay(50);
34
Serial
.println(
"n"
);
выключил serial вообще - не помогает.
Для начала попробуйте корректность работы ldd от обычного ШИМ ардуины без промежуточных узлов. Если все корректно, пробовать экспериментировать с предделителем на 9685. Не 4096, а 2048, 1024 и ниже. Потом уже с инверсией и вспышками разбиратся.
Я не очень понимаю в каком месте меняется настройка: "экспериментировать с предделителем на 9685. Не 4096, а 2048, 1024 и ниже."
На этом месте подробнее не опишете?
Обманул, похоже не меняются они. Могу только посоветовать даташит курить и экспериментировать, я такого зверя в руках не держал, может кто то юзал, посоветует чего. Ну и драйвера проверьте все таки на корректность работы с ШИМ. Все бывает.
А не могли бы вы мне раскоментировать часть кода?
По предделителю этот пример навел на размышления. Здесь максимальное значение 100 из 4096 возможных, теоретически вообще не должно светить или еле видно в темноте. А у вас вроде нормально работало????
Я извеняюсь за, вероятно глупый вопрос. Как редактировать библиотеки/драйвера?
я пытался блокнотом - не прокатывает, получается лишь читать.
Целый день пытаюсь вникнуть в суть библиотеки, примерно понимаю, но как это применять?...
Не раскоментируете по русски и понятно для новичка?
В результате скетч получается такой:
Из "проблем" осталось лишь "перемигивание" со "скоростью delay(50)" всех каналов светодиодов.
Как я понимаю, необходимо пристроить сюда прерывание. Но вот оно то мне и не дается.
Может кто-нибудь подскажет КАК и в какое место тут пожно пристроить прерывание?
Так а эти delay с какой целью у вас вставлены?
Лишь для визуального эфекта, при включении, при моем продвижении в понимании языка написания планируется их замена на функции типа "fade".
На этапе сейчас я могу их и закоментить.
http://notepad-plus-plus.org/
http://notepad-plus-plus.org/
Спасибо.
По вопросу #28 нет мыслей?
Лишь для визуального эфекта, при включении, при моем продвижении в понимании языка написания планируется их замена на функции типа "fade".
На этапе сейчас я могу их и закоментить.
Сейчас у вас получается, что с интервалом delay последовательно включаются каналы. Что вы хотите делать с помощью прерывания, тайна покрытая мраком))). Прерывание предназначено для обработки какого то события с приоритетом более высоким чем у основной программы.
я с этой микросхемой не работал. но если учитывать правильное подключение и рабочую либу то действительно непонятно зачем кучу delay воткнул. без этого не работает?
и нафига столько лишних скобок
то что день узнаешь с кнопки? то есть не в автоматическом режиме
Если интересно можете посмотреть http://arduino.ru/forum/proekty/groekt-dlya-akvariuma-akvakontroller-dly...
Там тоже человек освещение для банки делает. Правда схема попроще. Сейчас причесывает.
delay воткнуты лишь для визуального эфекта, ввиду неумения написать типа fade под эти каналы.
Скобок "понавтыкал" по причине неопытности.
прерыванием я надеюсь остановить "перемигивание" каналов - каждый канал дает вспышку в момент когда "ардуина" задает его яркость, а она это делает по кругу.
(Заранее извиняюсь за корявое описание)
ledDriver2.writeLED(0, 1023, 1023 - Sun);
А что у вас делают магические цифры 2-й и 3-й номер? и какие у них рабочие пределы min-max?
0, - номер канала.
1023, - Х.З. но, при изменении яркость меняется по пока непонятному мне алгоритму.
1023 - Sun - яркость канала в зависимости от Sun (в инверсии). То есть "0" - выходит полная яркость, 1023 - Канал погашен.
Здравствуйте помогите разобраться пожалуйста.
Имею вот такой код нужно понять что за что отвечает в англиском не силен (переводчик непомогает) :
А свернуть эту жуть, ну совсем никак?
А что, прочитать и вникнуть слабо?
Всего то 814 строк...
Ребят начальство купило глобус просит разобраться как изменить какой либо эфект на их надпись и сменить продолжительность эфекта.
Помогите пожалуста
а как вы вытащили код с МК??
и тут не в английском надо соображать,а в немецком=))комметарии в скетче на немецком,если не ошибаюсь...переведите их,может что и прояснится..
для меня вообще понятие глобус,эта та круглая штука,что стояла на шкафу в кабинете географии и которую мы брали вместо баскетбольного мяча,когда учитель выходила из класса=))и как там в нем мог оказаться подобный код я никак не пойму..
в англиском не силен (переводчик не помогает) :
.....немецкий там :)
эффекты-картинки-Bild_01 (Globus) - в массивах , время-скорость - кажися в
047
unsigned
long
sector_time = 20;
// Sektorzeit in µs
похоже на персистенцию.... поищите "VisionWand" , похожая штука....
или на табло с бегущей картинкой.....
дайте хоть фотку этого чЮда :)
http://www.instructables.com/id/Persistence-of-Vision-Wand/
массив PROGMEM prog_uchar bild_01[] - дайте сюда полностью, а можно и все три картинки
только при вставке кода в допЗакладке ставьте галочку СВЕРНУТЬ КОД !
судя по всему скетч полный,я и сам не мог понять где картинка,но видимо это все что есть
Вот весь код какой есть.Как прикрепить фото не знаю
При проверке кода выдает ошибку.
пожалуйста,установите версию Arduino IDE ниже чем 1.6.0,не нужна она в вашем случае...самое свежее не всегда самое лучшее..
а из ошибок ясно видно,что ругается только на массивы PROGMEM...но я не в силах в этом помочь,для самого темный лес еще эти PROGMEM,будем ждать знающих=)