Прошу совета

Тема в разделе "Arduino & Shields", создана пользователем SERGUNCHIK, 5 фев 2015.

  1. SERGUNCHIK

    SERGUNCHIK Нуб

    Приобрел я ардуинку 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" и ничего не происходит.
    В чем может быть загвоздка?
     
  2. SERGUNCHIK

    SERGUNCHIK Нуб

    Блин, спасибо всем, понимающим.
    Сам нашел, опытным путем.
    Wire.begin(); // Wire must be started!
    ledDriver.begin(B111000); // Address pins A5-A0 set to B111000
    ledDriver.init();
    красным 1 место перемычки на PCA9685
    Не могу решить с одновременной работой двумя (В000010) и (В000001).
    Может в этом кто, что подскажет?
     
  3. X-Dron

    X-Dron Гик

    А создать 2 объекта PCA9685?
    PCA9685 ledDriver1, ledDriver2;

    ledDriver1.begin(B000001);
    ledDriver2.begin(B000010);
     
    SERGUNCHIK нравится это.
  4. SERGUNCHIK

    SERGUNCHIK Нуб

    Спасибо, именно так все и заработало.
     
  5. SERGUNCHIK

    SERGUNCHIK Нуб

    3 дня пытаюсь написать хоть какой скетч под это железо - нифига не работает.
    Подскажите пожалуйста, кто шарит или хотя-бы не настолько начинающий, как я.
    Как должно выглядеть под связку из arduino Mega2560 и 2 плат с PCA9685:
    Изначально все PWM PCA9685 = "0" или задаваемы
    При появлении "1" на одном из портов ардуинки, на указуемых PWM - PCA9685 должно появляться PWM пропорциональное напряжению на analoginput "0" на ардуинке.
    При снятии "1" порта ардуинки PWM PCA9685 = "0" или задаваемы
     
  6. SERGUNCHIK

    SERGUNCHIK Нуб

    Добрался я лишь до:
    #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
     
  7. X-Dron

    X-Dron Гик

    надо
    if(DAY_BUTTON_PIN==1)
    Да и вообще не должно компилироваться, DAY и NIGHT нигде не описаны. Если это постоянные строки, то должны быть в кавычках.
     
  8. vvr

    vvr Инженерище

  9. SERGUNCHIK

    SERGUNCHIK Нуб

    Спасибо X-Dron, за совет. помогло.
    Осталось скрестить это с PCA9685.
     
  10. Виталий

    Виталий Нерд

    Код (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)} не определены. Либо их нужно определить и присвоить какие либо значения прежде чем выводить, либо взять в кавычки.

    Опоздал немного...
     
    Последнее редактирование: 9 фев 2015
  11. SERGUNCHIK

    SERGUNCHIK Нуб

    Подправил:
    #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");}
     
    Последнее редактирование: 9 фев 2015
  12. Виталий

    Виталий Нерд

    DAY_BUTTON_PIN у вас предопределен и равен 12. (#define DAY_BUTTON_PIN 12)
    По факту ваше условие выглядит так: if(12==1)
     
    Tomasina нравится это.
  13. SERGUNCHIK

    SERGUNCHIK Нуб

    как я понимаю "DAY_BUTTON_PIN 12" определило DAY_BUTTON_PIN как вывод 12 ардуинки.
    Как в
    if(DAY_BUTTON_PIN==1)
    {Serial.print("DAY");}
    else {Serial.print("NIGHT");}

    показать его лог "1" и лог "0"?
     
  14. Виталий

    Виталий Нерд

    А что у Вас подключено к вывод 12 ардуинки ?
    Наверное нужно считать показания этого пина.
     
  15. SERGUNCHIK

    SERGUNCHIK Нуб

    Туда подключен внешний таймер, днем подающий "+5в"
     
  16. Виталий

    Виталий Нерд

    Наверное нужно считать показания этого пина.
    http://arduino.ru/Reference/DigitalRead - "считать данные с пина"
    http://arduino.ru/Reference/Constants - "что такое HIGH"
    http://arduino.ru/Reference - "Вообще полезно изучить"

    Очень подробно и очень доступно все написано...
     
  17. SERGUNCHIK

    SERGUNCHIK Нуб

    Планируется свет в аквариум.
    Железо все в сборе: Ардуино мега, 2pca9685, 20 димируемых драйверов, 20 каналов светодиодов (всего 760ватт света), 2 канала вентиляторы.
    В планах рассвет (1белый, 2белый, 3белый и т.д., +корекция цвета RGB).
    Самым сложным для меня оказался скетч.
    Сейчас хочу хоть как-то зажечь свет в аквариуме процентов на 25....30 яркости, для чего и пристраиваю к ардуине внешний таймер и потенциометр.
     
  18. Виталий

    Виталий Нерд

    Не совсем понял, в чем вопрос?
     
  19. SERGUNCHIK

    SERGUNCHIK Нуб

    Я описания языка читаю и не могу догнать, мне на примерах проще понимается. Пока не получается скетч.
    В чем вопрос?
    Вопрос в том, как увязать условие потенциометра, кнопки и pwm pca9685.
     
  20. SERGUNCHIK

    SERGUNCHIK Нуб

    Вот, что у меня вышло на сегодняшний день:
    Код (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 у меня не получается.
    Кто-нибудь тут может показать как это делается?
     
    Последнее редактирование: 10 фев 2015