Работа с внешним цап mcp4725 screw terminal troyka модуль

Тема в разделе "Arduino & Shields", создана пользователем perdman, 1 окт 2021.

  1. perdman

    perdman Нуб

    Здравствуйте! купил тройка модуль screw terminal troyka, при написании кода происходит какая-то коллизия если вставить "dac.begin(0x62);" то потенциометр ведет себя не адекватно, на мониторе порта значение вместо от 0 до 1023 меняется на 15 до 1023 и цифры не устойчивы (как будто помехи)

    Подскажите пожалуйста, что я делаю не так???

    #include <Wire.h>
    #include <Adafruit_MCP4725.h>
    Adafruit_MCP4725 dac;

    void setup(void) {
    Serial.begin(9600);
    dac.begin(0x62); //эту строку комментирую все ок, если оставить на Serial.println(val) не адекватные значе
    }
    void loop(void) {
    uint32_t counter;
    int val = analogRead(A4);
    Serial.println(val);
    }
     
  2. b707

    b707 Гуру

    для строчки
    Код (C++):
    int val = analogRead(A4);
    выберите другой пин

    Пины А4 и А5 - заняты шиной I2C. которая используется для связи с модулем
    mcp4725
     
    Последнее редактирование: 1 окт 2021
  3. Airbus

    Airbus Радиохулиган Модератор

    Неправильно вставляете код. Надо так
    [​IMG]
     
  4. Airbus

    Airbus Радиохулиган Модератор

    Есть хорошее средство для потенциометров
    [​IMG]
     
  5. akl

    akl Гуру

    даже при хорошем потенциометре с небольшим сопротивлением могут быть наводки. конечно сначала надо все правильно подключить, не на 4 аналоговый пин. Если значения потенциометра в промежуточных положениях крутилки крутятся туда-сюда на несколько единиц - значит это наводки. Лечится либо подключением конденсатора размером около 1мкф с аналогового входа на землю. Либо можно программно отфильтровать разными методами
     
  6. perdman

    perdman Нуб

    Спасибо за советы! Подскажите, можно ли как то опытным путем выяснить какие пины заняты???
    У меня рабочий код, но когда я включаю ЦАП "dac.begin(0x62);" все виснет и дергается....

    Я делаю переключатель для детской машинки, чтоб можно было управлять как с руля и педали так и с RC.
    Для этого использую библиотеки:


    #include <Servo.h>, для управления рулевой серво на 6 пин подключен серво-привод руля
    и
    #include <ServoInput.h> для считывания сигналов с приемника RC, всего занято 3 канала (1-переключение передач и перехвата управления 7 пин/ 2- управление серсо-приводом руля 2 пин/ 3- управления педалью газа через ЦАП напряжением от 0 до 3.3v 3 пин) в описании к библиотеке сказано, что нужны пины с прерыванием, поэтому использую Leonardo.

    Как я понял из опытов существует явный конфликт с #include <ServoInput.h> и работой RC приемника.
    https://www.partsnotincluded.com/how-to-use-an-rc-controller-with-an-arduino/

    Код (C++):
    #include <Servo.h>
    #include <ServoInput.h>
    #include <Wire.h>
    #include <Adafruit_MCP4725.h>
    #define but_st2 9
    #define but_revers 10
    #define st2 11
    #define revers 12
    #define rul A0
    #define pedal A1
    Adafruit_MCP4725 dac;

    ServoInputPin<2> CH1;
    ServoInputPin<3> CH2;
    ServoInputPin<7> CH3;
    const int NumPositions = 3;
    Servo STServo;

    void setup() {
      Serial.begin(9600);
      pinMode(but_st2, INPUT_PULLUP);
      pinMode(but_revers, INPUT_PULLUP);
      pinMode(st2, OUTPUT);
      pinMode(revers, OUTPUT);
      pinMode(rul, INPUT);
      pinMode(pedal, INPUT);
      STServo.attach(6);
      dac.begin(0x62);
    }

    void loop() {
      uint32_t counter;
      int position = CH3.map(1, NumPositions);
      boolean gear = (digitalRead(but_st2));
      boolean reversgear = (digitalRead(but_revers));
      float CH1angle = CH1.getAngle();  // get angle of servo (0 - 180)
      float CH2th = CH2.getAngle();  // get angle of servo (0 - 180)
      int st = map(analogRead(rul), 0, 1023, 0, 180);
      int gas = analogRead(pedal);
      dac.setVoltage(counter, false);

      if (position == 2 ) {
        digitalWrite(st2, !gear);
        digitalWrite(revers, !reversgear);
        STServo.write(st);
        counter = map(gas), 90, 180, 0, 2700);
     
      }
      else {
        digitalWrite(st2, !gear);
        digitalWrite(revers, !reversgear);
        STServo.write(CH1angle);
        counter = map(CH2th, 90.00, 180, 0, 2700);
      }

      if (position == 1) {
        digitalWrite(st2, HIGH);
      }
      else {
        digitalWrite(st2, 0);
      }

      if (position == 3) {
        digitalWrite(revers, HIGH);
      }
      else {
        digitalWrite(revers, 0);
      }
      //Serial.println(st);
      //Serial.println(counter);
    }


    [​IMG]
     
    Последнее редактирование: 2 окт 2021
  7. b707

    b707 Гуру

    это делается не "опытным путем", а изучением документации к контроллеру и библиотекам
    что за RC-приемник у вас?
     
    Последнее редактирование: 2 окт 2021
  8. perdman

    perdman Нуб

    ВЫ правы! посмотрел документацию, к своему контроллеру Iskra Neo, там увидел что 2 и 3 пины тоже отвечают за эту хрень "TWI/I²C: пины SDA и SCL"

    Всем спасибо вроде все получилось!!!