Приобрел я ардуинку Mega2560 и 2 платки с PCA9685. Пытаюсь ардуинкой управлять двадцатью каналами светодиодов. Но загружаю тестовый скетч: /***************** * This example demonstrates the library assuming that LEDs are connected to the outputs * It will run through all 16 LEDs turning them up and down in 10 steps. * The PCA9685 chip is assumed to have PINS A0,A1 and A2 grounded (LOW) and A3,A4 and A5 set to VCC (5V, HIGH) * * - kasper */ #include <Wire.h> #include <PCA9685.h> PCA9685 ledDriver; void setup() { Serial.begin(9600); // set up serial Serial.println("Serial Started"); Wire.begin(); // Wire must be started! ledDriver.begin(B111000); // Address pins A5-A0 set to B111000 ledDriver.init(); } void loop() { // Notice: setLEDDimmed cannot be used in a loop to give you a pleasant // "turning-up" of the LED. This is because each time you set a level for a LED // it will calculate random timing intervals for the PWM function in the chip // This is done in order to distribute current consumptions of the full time period. for(int level=5;level>=0;level--) { for(int i=0; i<32; i++) { ledDriver.setLEDDimmed(i,level*20); delay(1000); } } for(int level=0;level<=5;level++) { for(int i=0; i<32; i++) { ledDriver.setLEDDimmed(i,level*20); delay(1000); } } } И ничего не происходит. PCA9685 подключена к ардуине - GND -> GND, +5v -> vcc, 20(SDA) -> SDA, 21(SCL) ->SCL. На выходах "PWM" PCA9685 логический "0" и ничего не происходит. В чем может быть загвоздка?
Блин, спасибо всем, понимающим. Сам нашел, опытным путем. Wire.begin(); // Wire must be started! ledDriver.begin(B111000); // Address pins A5-A0 set to B111000 ledDriver.init(); красным 1 место перемычки на PCA9685 Не могу решить с одновременной работой двумя (В000010) и (В000001). Может в этом кто, что подскажет?
А создать 2 объекта PCA9685? PCA9685 ledDriver1, ledDriver2; ledDriver1.begin(B000001); ledDriver2.begin(B000010);
3 дня пытаюсь написать хоть какой скетч под это железо - нифига не работает. Подскажите пожалуйста, кто шарит или хотя-бы не настолько начинающий, как я. Как должно выглядеть под связку из arduino Mega2560 и 2 плат с PCA9685: Изначально все PWM PCA9685 = "0" или задаваемы При появлении "1" на одном из портов ардуинки, на указуемых PWM - PCA9685 должно появляться PWM пропорциональное напряжению на analoginput "0" на ардуинке. При снятии "1" порта ардуинки PWM PCA9685 = "0" или задаваемы
Добрался я лишь до: #include <Wire.h> #include <PCA9685.h> #define POT_PIN A0 #define DAY_BUTTON_PIN 12 PCA9685 ledDriver1, ledDriver2; void setup() { Serial.begin(9600); // set up serial Serial.println("Serial Started"); pinMode(POT_PIN, INPUT); pinMode(DAY_BUTTON_PIN, INPUT); Wire.begin(); // Wire must be started! ledDriver1.begin(B000001); ledDriver2.begin(B000010); // Address pins A5-A0 set to B111000 ledDriver1.init(); ledDriver2.init(); } void loop() { { // заявляем, что далее мы будем использовать 2 переменные с // именами rotation и brightness, и что хранить в них будем // целые числа (англ. «integer», сокращённо просто «int») int rotation, brightness; // считываем в rotation напряжение с потенциометра: // микроконтроллер выдаст число от 0 до 1023 // пропорциональное углу поворота ручки rotation = analogRead(POT_PIN); // в brightness записываем полученное ранее значение rotation // делённое на 4. Поскольку в переменных мы пожелали хранить // целые значения, дробная часть от деления будет отброшена. // В итоге мы получим целое число от 0 до 255 brightness = rotation * 4; Serial.println(brightness); if(DAY_BUTTON_PIN=1) {Serial.print(DAY)} else {Serial.print(NIGHT)} delay(1000); } {} } Выделенное красным не работает. И нет понятия как это подружить с PWM PCA9685
надо if(DAY_BUTTON_PIN==1) Да и вообще не должно компилироваться, DAY и NIGHT нигде не описаны. Если это постоянные строки, то должны быть в кавычках.
SERGUNCHIK, почитай http://wiki.amperka.ru/программирование:структура-программы-для-arduino О пустом месте и красивом коде Твой код не читаемый.
Код (Text): // в brightness записываем полученное ранее значение rotation // делённое на 4. Поскольку в переменных мы пожелали хранить // целые значения, дробная часть от деления будет отброшена. // В итоге мы получим целое число от 0 до 255 brightness = rotation * 4; Serial.println(brightness); if(DAY_BUTTON_PIN=1) {Serial.print(DAY)} else {Serial.print(NIGHT)} delay(1000); } {} } Выделенное красным не работает. Я думал что в brightness записываем полученное ранее значение rotation делённое на 4 должно выглядеть так: "brightness = rotation / 4;" if(DAY_BUTTON_PIN=1) Тут DAY_BUTTON_PIN, который определен и равен 12? Это условие просто лишено всякого смысла. И как и сказал X-Dron: DAY и NIGHT в строках {Serial.print(DAY)} и {Serial.print(NIGHT)} не определены. Либо их нужно определить и присвоить какие либо значения прежде чем выводить, либо взять в кавычки. Опоздал немного...
Подправил: #include <Wire.h> #include <PCA9685.h> #define POT_PIN A0 #define DAY_BUTTON_PIN 12 PCA9685 ledDriver1, ledDriver2; void setup() { Serial.begin(9600); // set up serial Serial.println("Serial Started"); pinMode(POT_PIN, INPUT); pinMode(DAY_BUTTON_PIN, INPUT); Wire.begin(); // Wire must be started! ledDriver1.begin(B000001); ledDriver2.begin(B000010); // Address pins A5-A0 set to B111000 ledDriver1.init(); ledDriver2.init(); } void loop() { { // заявляем, что далее мы будем использовать 2 переменные с // именами rotation и brightness, и что хранить в них будем // целые числа (англ. «integer», сокращённо просто «int») int rotation, brightness; // считываем в rotation напряжение с потенциометра: // микроконтроллер выдаст число от 0 до 1023 // пропорциональное углу поворота ручки rotation = analogRead(POT_PIN); // в brightness записываем полученное ранее значение rotation // умноженое на 4. Поскольку в переменных мы пожелали хранить // целые значения, дробная часть от деления будет отброшена. // В итоге мы получим целое число от 0 до 4092 brightness = rotation * 4; Serial.println(brightness); if(DAY_BUTTON_PIN==1) {Serial.print("DAY");} else {Serial.print("NIGHT");} delay(1000); } Только я не понял, подача +5в на пин 12, для контролера будет как "1" или "HIGH": в if(DAY_BUTTON_PIN==1) {Serial.print("DAY");} else {Serial.print("NIGHT");}
DAY_BUTTON_PIN у вас предопределен и равен 12. (#define DAY_BUTTON_PIN 12) По факту ваше условие выглядит так: if(12==1)
как я понимаю "DAY_BUTTON_PIN 12" определило DAY_BUTTON_PIN как вывод 12 ардуинки. Как в if(DAY_BUTTON_PIN==1) {Serial.print("DAY");} else {Serial.print("NIGHT");} показать его лог "1" и лог "0"?
Наверное нужно считать показания этого пина. http://arduino.ru/Reference/DigitalRead - "считать данные с пина" http://arduino.ru/Reference/Constants - "что такое HIGH" http://arduino.ru/Reference - "Вообще полезно изучить" Очень подробно и очень доступно все написано...
Планируется свет в аквариум. Железо все в сборе: Ардуино мега, 2pca9685, 20 димируемых драйверов, 20 каналов светодиодов (всего 760ватт света), 2 канала вентиляторы. В планах рассвет (1белый, 2белый, 3белый и т.д., +корекция цвета RGB). Самым сложным для меня оказался скетч. Сейчас хочу хоть как-то зажечь свет в аквариуме процентов на 25....30 яркости, для чего и пристраиваю к ардуине внешний таймер и потенциометр.
Я описания языка читаю и не могу догнать, мне на примерах проще понимается. Пока не получается скетч. В чем вопрос? Вопрос в том, как увязать условие потенциометра, кнопки и pwm pca9685.
Вот, что у меня вышло на сегодняшний день: Код (Text): #include <Wire.h> //Библиотека I2C #include <PCA9685.h> //Библиотека РСАшек PCA9685 ledDriver1, ledDriver2; int daypin = 14; // Таймер подключен к 14-му входу int SunPin = 0; // Потенциометр подключен 0-му аналоговому входу int MoonPin = 1; // Фоторезистор подключен 1-му аналоговому входу int led1Pin = 2; // светодиод подключается к digital pin 2 int led2Pin = 3; // светодиод подключается к digital pin 3 int led3Pin = 4; // светодиод подключается к digital pin 4 int led4Pin = 5; // светодиод подключается к digital pin 5 int led5Pin = 6; // светодиод подключается к digital pin 6 int led6Pin = 7; // светодиод подключается к digital pin 7 int led7Pin = 8; // светодиод подключается к digital pin 8 int led8Pin = 9; // светодиод подключается к digital pin 9 int led9Pin = 10; // светодиод подключается к digital pin 10 int led10Pin = 11; // светодиод подключается к digital pin 11 int led11Pin = 12; // светодиод подключается к digital pin 12 int led12Pin = 13;// светодиод подключается к digital pin 13 int Sun = 0;// переменная для хранения значения входного напряжения int Moon = 0;// переменная для хранения значения входного напряжения int day = 0; // переменная для хранения внешней команды "день"/"ночь" void setup() { Serial.begin(9600); pinMode(daypin, INPUT); Wire.begin(); // Wire старт ledDriver1.begin(B000001); //адреса РСАшек ledDriver2.begin(B000010); //адреса РСАшек ledDriver1.init(); ledDriver2.init(); } void loop() { day = digitalRead(daypin); // узнаём состояние кнопки Moon = analogRead(MoonPin); // считываем значение с фоторезистора Sun = analogRead(SunPin); // считываем значение с потенциометра Serial.println(Sun); delay(50); Serial.println(Moon); Sun = Sun/4; // конвертируем из 0-1023 к 0-255 Moon = Moon/4; // конвертируем из 0-1023 к 0-255 if(day==HIGH) // кнопка нажата { analogWrite(led1Pin,Sun); analogWrite(led2Pin,Sun); analogWrite(led3Pin,Sun); analogWrite(led4Pin,Sun); analogWrite(led5Pin,Sun); analogWrite(led6Pin,Sun); analogWrite(led7Pin,Sun); analogWrite(led8Pin,Sun); analogWrite(led9Pin,Sun); analogWrite(led10Pin,Sun); analogWrite(led11Pin,Sun); analogWrite(led12Pin,Sun);// устанавливаем значение delay(20);} else { analogWrite(led1Pin,Moon/2); analogWrite(led2Pin,Moon/2); analogWrite(led3Pin,Moon/2); analogWrite(led4Pin,Moon/2); analogWrite(led5Pin,Moon/2); analogWrite(led6Pin,Moon/2); analogWrite(led7Pin,Moon/2); analogWrite(led8Pin,Moon/2); analogWrite(led9Pin,Moon/2); analogWrite(led10Pin,Moon/2); analogWrite(led11Pin,Moon/2); analogWrite(led12Pin,Moon/2);// устанавливаем значение delay(20);} delay(1000); } Ардуина выполняет то, что требуется, но на своих выводах (а их всего 12). Заставить ее выполнять то-же, но на выводах PCA9685 у меня не получается. Кто-нибудь тут может показать как это делается?