Здравствуйте! купил тройка модуль 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); }
для строчки Код (C++): int val = analogRead(A4); выберите другой пин Пины А4 и А5 - заняты шиной I2C. которая используется для связи с модулем mcp4725
даже при хорошем потенциометре с небольшим сопротивлением могут быть наводки. конечно сначала надо все правильно подключить, не на 4 аналоговый пин. Если значения потенциометра в промежуточных положениях крутилки крутятся туда-сюда на несколько единиц - значит это наводки. Лечится либо подключением конденсатора размером около 1мкф с аналогового входа на землю. Либо можно программно отфильтровать разными методами
Спасибо за советы! Подскажите, можно ли как то опытным путем выяснить какие пины заняты??? У меня рабочий код, но когда я включаю ЦАП "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); }
это делается не "опытным путем", а изучением документации к контроллеру и библиотекам что за RC-приемник у вас?
ВЫ правы! посмотрел документацию, к своему контроллеру Iskra Neo, там увидел что 2 и 3 пины тоже отвечают за эту хрень "TWI/I²C: пины SDA и SCL" Всем спасибо вроде все получилось!!!