Arduino Due

Тема в разделе "Arduino & Shields", создана пользователем АртДуино, 19 авг 2015.

  1. Решил перейти на новую платформу, Arduino Due.
    Кроме того, не пользуюсь средой разработки Arduino IDE, а пишу на почти чистом C в Atmel Studio 6.2.
    Ищу библиотеки на всевозможные устройства, датчики и прочее.
    Кое-что уже есть.
    Помогите и подскажите.
    Сам что умею и могу: помогу и подскажу.
    Развитие моего нового проекта на Arduino Due на нашем городском форуме http://elportal.lipetsk.ru
    Страничка моего проекта:
    Здесь
     
  2. DrProg

    DrProg Вечный нерд

    Почему обязательно зацикливаться на Дью?
     
    ИгорьК нравится это.
  3. А какие еще варианты?
    Мощный камень, много функций, много ножек.
    1000 руб - плата.
     
  4. DrProg

    DrProg Вечный нерд

    Вариантов полно, тинси, галлелео и тд. Да и не всегда нужна высокая производительность, в 95% случаев хватает Меги и ей подобных Мини. Или программирование и библиотеки Дью так сильно отличаются?
     
    ИгорьК нравится это.
  5. Unixon

    Unixon Оракул Модератор

    Какая у вас есть задача, которая по силам Due, но слишком сложна для Mega (например) ?
     
  6. Лучше на ты.

    Есть реальная цель, даже как минимум 3 [​IMG]

    1. Самая главная [​IMG] контроль производства напитков [​IMG]

    2. Контроль гидропонной установки.

    3. Умный дом - есть жилище, над которым можно и нужно экспериментировать.

    Очень много датчиков и исполнительных устройств. Путь комбинирования нескольких мег уже прошел.
    На Си очень мало библиотек. Или ардуинские или С++.
     
  7. DrProg

    DrProg Вечный нерд

    Гидропонную делал датчиках на 15, про мини справляется вообще не напрягается.

    В соседней ветке вот говорят, что считать бутылка на конвейре в пять линий по трем размерам по 6штук в секна каждой можно легко и непринужденно на Uno.

    Может я и не прав, но Дью по моему для математики, тригонометрии, например 3Д куб без компьютера поддерживать.
     
    Последнее редактирование: 19 авг 2015
    ИгорьК нравится это.
  8. Рад буду помощи.
    У меня тоже написан "Гидромат" для мини :)
    Только уже 15 датчиков неактуально ;)
    Навскидку:
    Каждый ящик это налив/слив + освещение мало/ много + датчик TDS + датчик уровня = 6
    + общие: температура + горячо/холодно, датчик освещенности, влажность и так далее.
    Берем: помидорчики, огурчики, петрушка, укропчик, лучок. ;) Итого уже больше 30.
     
  9. Просто посмотрел у какого камня больше всех ножек, вот и весь выбор :)
     
  10. DrProg

    DrProg Вечный нерд

    Больше всего ножек надо на датчики влажности почвы, я их повесил на одну ножку и включаю по очереди через каскад регистров 595, в теории можно сотнями считывать не увеличивая ног.
     
    ИгорьК нравится это.
  11. В теории можно и нужно ставить контроллеры расширяющие кол-во ног. А вот на практике, мне удобнее купить более мощный камень и не задумываться о делении задачи на много камней и ветвлении через регистры и контроллеры.
    Кроме того я реализовываю многоуровневую логику, позволяющую менять конфигурацию системы "на лету".
    Грубо говоря, несколькими кнопками, без перепрошивки добавляя еще один "ящик".
     
  12. Alex19

    Alex19 Гуру

    С Due у меня не сложилось, но когда-то давно изучал вопрос скорости работы пинов, на Arduino IDE.

    Возможно будет полезно, вот код, на ADC не смотрите, тогда я еще о них ни чего не знал.
    Код (Text):

    inline void digitalWriteDirect(int pin, boolean val)
    {
      if(val) g_APinDescription[pin].pPort -> PIO_SODR = g_APinDescription[pin].ulPin;
      else    g_APinDescription[pin].pPort -> PIO_CODR = g_APinDescription[pin].ulPin;
    }

    inline int digitalReadDirect(int pin)
    {
      return !!(g_APinDescription[pin].pPort -> PIO_PDSR & g_APinDescription[pin].ulPin);
    }

    int pin1 = 44;
    int pin2 = 43;
    int pin3 = 42;
    int pin4 = 41;
    int pin5 = 40;
    int pin6 = 39;
    int pin7 = 38;
    int pin8 = 37;
    int pin9 = 36;
    int pin10 = 35;

    int pin11 = 34;
    int pin12 = 33;
    int pin13 = 32;
    int pin14 = 31;
    int pin15 = 30;
    int pin16 = 29;
    int pin17 = 28;
    int pin18 = 27;
    int pin19 = 26;
    int pin20 = 25;
    int pin21 = 24;
    int pin22 = 23;
    int pin23 = 22;
    int pin24 = 49;
    int pin25 = 48;

    unsigned long timeCycleOne = 0;
    unsigned long timeCycle = 0;
    unsigned long timeCycleMax = 0;

    unsigned long unsignedLongMax = 4294967295;
    unsigned long digitalOne = 1;

    boolean bpin0;
    boolean bpin1;
    boolean bpin2;
    boolean bpin3;
    boolean bpin4;
    boolean bpin5;
    boolean bpin6;
    boolean bpin7;
    boolean bpin8;
    boolean bpin9;

    int iA0;
    int iA1;
    int iA2;
    int iA3;
    int iA4;
    int iA5;
    int iA6;
    int iA7;
    int iA8;
    int iA9;

    // the setup routine runs once when you press reset:
    void setup() {            
      // initialize the digital pin as an output.
      pinMode(pin1, INPUT);
      pinMode(pin2, INPUT);
      pinMode(pin3, INPUT);
      pinMode(pin4, INPUT);
      pinMode(pin5, INPUT);
      pinMode(pin6, INPUT);
      pinMode(pin7, INPUT);
      pinMode(pin8, INPUT);
      pinMode(pin9, INPUT);
      pinMode(pin10, INPUT);

      pinMode(pin11, OUTPUT);
      pinMode(pin12, OUTPUT);
      pinMode(pin13, OUTPUT);
      pinMode(pin14, OUTPUT);
      pinMode(pin15, OUTPUT);
      pinMode(pin16, OUTPUT);
      pinMode(pin17, OUTPUT);
      pinMode(pin18, OUTPUT);
      pinMode(pin19, OUTPUT);
      pinMode(pin20, OUTPUT);
      pinMode(pin21, OUTPUT);
      pinMode(pin22, OUTPUT);
      pinMode(pin23, OUTPUT);
      pinMode(pin24, OUTPUT);
      pinMode(pin25, OUTPUT);

      analogReadResolution(12);
      analogWriteResolution(12);

      REG_ADC_MR = (REG_ADC_MR & 0xFFF0FFFF) | 0x00020000;

      Serial.begin(115200);

      Serial.println("Begin");
    }

    // the loop routine runs over and over again forever:
    void loop() {
      timeCycleOne = micros();

      // Пустой цикл до 3

      /*digitalWriteDirect(pin11, HIGH);  // +1 digitalWrite +3 // +1 digitalWriteDirect +1
      digitalWriteDirect(pin12, HIGH);  // +1 digitalWrite +2 // +1 digitalWriteDirect +0
      digitalWriteDirect(pin13, HIGH);  // +1 digitalWrite +3 // +1 digitalWriteDirect +0
      digitalWriteDirect(pin14, HIGH);
      digitalWriteDirect(pin15, HIGH);
      digitalWriteDirect(pin16, HIGH);
      digitalWriteDirect(pin17, HIGH);
      digitalWriteDirect(pin18, HIGH);
      digitalWriteDirect(pin19, HIGH);
      digitalWriteDirect(pin20, HIGH);
      digitalWriteDirect(pin21, HIGH);
      digitalWriteDirect(pin22, HIGH);
      digitalWriteDirect(pin23, HIGH);
      digitalWriteDirect(pin24, HIGH);
      digitalWriteDirect(pin25, HIGH);*/
      // 15 digitalWrite + 38
      // 15 digitalWriteDirect + 5

      /*bpin0 = digitalReadDirect(pin1);  // +1 digitalRead +1 // +1 digitalReadDirect +1
      bpin1 = digitalReadDirect(pin2);  // +1 digitalRead +2 // +1 digitalReadDirect +0
      bpin2 = digitalReadDirect(pin3);  // +1 digitalRead +0 // +1 digitalReadDirect +1
      bpin3 = digitalReadDirect(pin4);
      bpin4 = digitalReadDirect(pin5);
      bpin5 = digitalReadDirect(pin6);
      bpin6 = digitalReadDirect(pin7);
      bpin7 = digitalReadDirect(pin8);
      bpin8 = digitalReadDirect(pin9);
      bpin9 = digitalReadDirect(pin10);*/
      // 10 digitalRead + 11
      // 10 digitalReadDirect + 7

      /*analogWrite(12, 255);  // +1 analogWrite +6
      analogWrite(11, 255);  // +1 analogWrite +6
      analogWrite(10, 255);  // +1 analogWrite +7
      analogWrite(9, 255);
      analogWrite(8, 255);*/
      // 5 analogWrite + 36

      iA0 = analogRead(0);    // +1 analogRead +39 // +1 analogRead(FASTADC) +4
      iA1 = analogRead(1);    // +1 analogRead +4 // +1 analogRead(FASTADC) +4
      iA2 = analogRead(2);    // +1 analogRead +4 // +1 analogRead(FASTADC) +4
      iA3 = analogRead(3);    // +1 analogRead +4 // +1 analogRead(FASTADC) +4
      iA4 = analogRead(4);
      iA5 = analogRead(5);
      iA6 = analogRead(6);
      iA7 = analogRead(7);
      iA8 = analogRead(8);
      iA9 = analogRead(9);
      // 10 analogRead + 76
      // 10 analogRead(FASTADC) + 41

      // 164 общее подсчет
      // 162 общее показания

      // 127 общее подсчет
      // 125 общее показания + digitalWriteDirect + digitalReadDirect

      // 92 общее подсчет
      // 89 общее показания + digitalWriteDirect + digitalReadDirect + FASTADC

      timeCycle = GetCycleTime(timeCycleOne, micros());

      if (timeCycle > timeCycleMax)
      {
        timeCycleMax = timeCycle;
        Serial.println(timeCycleMax);
      }
    }

    unsigned long resultGetCycleTime = 0;

    unsigned long GetCycleTime(unsigned long BeginTime, unsigned long EndTime)
    {
      if (EndTime<BeginTime)
      {
        resultGetCycleTime = unsignedLongMax - BeginTime + EndTime + digitalOne;
      }
      else
      {
        resultGetCycleTime = EndTime - BeginTime;
      }

      return resultGetCycleTime;
    }
     
    Тестирование проходило на не оригинальной Due.

    Сама Due, мне не понравилась, причин было масса, не большое кол-во статей и материалов по данному чипу. Не большая линейка отладочных плат на Atmel Sam3, которых на тот момент можно было купить в РФ и т.д. Хотя возможно, сказалось мое отсутствие опыта, когда изучал данную плату.

    Поэтому остановился на STM32F, для тех задач, где AVR не хватает, в частности на STM32F4. Огромное количество статей, материалов по контролерам STM32. Производительность, большое кол-во периферии (зависит от чипа). Множество библиотек, нормальная отладка. Большое количество отладочных плат в РФ и их не большая стоимость.

    Это лишь мнение любителя:).
     
  13. Я даже не любитель, а только начинающий ;)
    Прыгать на другую платформу особо не хочу, только если будет большая разница в показателе цена/функции.
    Так уж случайно получилось, что даже и не думал об STM, Rapsberry PI. А теперь уже наверное и поздно.
    За код спасибо.
    Материалов по Due действительно нет. Поэтому и хочу в одну кучу, на своей страничке все собрать .