Аналоговые входы

StruM
Offline
Зарегистрирован: 17.11.2015

Есть программка:

Код (C++):
// Подключаем библиотеку для работы с жидкокристаллическим
// экраном (англ. Liquid Crystal Display или просто LCD)
#include <LiquidCrystal.h>
//Выводит сообщения, помогает при определинии
//пороговых необходимых пороговых значений
#define PRINT_MESSAGES

// Задает используемые цифровые выходы
#define CAMERA_FLASH_PIN 3
#define LASER_PIN 4
//Задает вход высоты (задержка)
#define HEIGHT_PIN A0
//Задает вход порогового значения срабатывания лазерного триггера
#define LASER_THRESSHHOLD_PIN A1
//Задает вход срабатывания на номер капли
#define SET_NUMBER_DROP_PIN A2
// Задает используемые аналоговые входы фоторезистора
#define LASER_TRIGGER_ANALOG_PIN A3

//Пороговые значения для срабатывания триггера
//Определяются в зависимости от окружающих факторов

//LASER_THRESHHOLD 813

// Объявляем объект, для управления дисплеем. Для его создания
// необходимо указать номера пинов, к которым он подключен в
// порядке:       RS   E DB5 DB6 DB7 DB8
LiquidCrystal lcd(13, 12, 11, 10,  9,  8);
int NumberDrop=1;
void setup()
{

  // начинаем работу с экраном. Сообщаем объекту количество
  // строк и столбцов. Опять же, вызывать pinMode не требуется:
  // функция begin сделает всё за нас
  //lcd.begin(16, 2);

  pinMode(CAMERA_FLASH_PIN, OUTPUT);
  digitalWrite(CAMERA_FLASH_PIN, LOW);
  pinMode(LASER_PIN, OUTPUT);
  digitalWrite(LASER_PIN, HIGH);

  pinMode(HEIGHT_PIN, INPUT_PULLUP);
  pinMode(LASER_THRESSHHOLD_PIN, INPUT_PULLUP);
  pinMode(SET_NUMBER_DROP_PIN, INPUT_PULLUP);
  pinMode(LASER_TRIGGER_ANALOG_PIN, INPUT_PULLUP);

#ifdef PRINT_MESSAGES
  Serial.begin(9600); // открыть серийный порт
#endif
}
//void LcdDATA () //функция вывода на LCD дисплей
//{
// устанавливаем курсор, колонку 0, строку 0. На деле — это
// левый квадрат 1-й строки, т.к. нумерация начинается с нуля
//  lcd.setCursor(0, 0);
//  lcd.print("Laser Scan:");
//  lcd.print(laserVal, DEC);
//  lcd.print("   ");
// устанавливаем курсор, колонку 0, строку 1. На деле — это
// левый квадрат 2-й строки, т.к. нумерация начинается с нуля
//  lcd.setCursor(0, 1);
//  lcd.print("FlashDelay:");
//  lcd.print(SpeedDrop, DEC);
//  lcd.print("   ");
//  lcd.print("ms");
//}
void loop()
{

  // считывание показаний потенциометра высоты (240) задержка
  int SpeedDrop = analogRead(HEIGHT_PIN);
  SpeedDrop = map(SpeedDrop, 0, 1023, 20, 300);
  SpeedDrop = constrain(SpeedDrop, 20, 300);
  // считывание показаний потенциометра чуствительности (813)
  int LASER_THRESHHOLD = analogRead(LASER_THRESSHHOLD_PIN);
  LASER_THRESHHOLD = map(LASER_THRESHHOLD, 0, 1023, 700, 900);
  LASER_THRESHHOLD = constrain(LASER_THRESHHOLD, 700, 900);
  // считывание показаний потенциометра количества капель (2)
  int SetNumberDrop = analogRead(SET_NUMBER_DROP_PIN);
  SetNumberDrop = map(SetNumberDrop, 0, 1023, 1, 10);
  SetNumberDrop = constrain(SetNumberDrop, 1, 10);
  int laserVal;

  ////////////////////////////////////////////////////////////
  // Лазерный сенсор
  ////////////////////////////////////////////////////////////

  laserVal = analogRead(LASER_TRIGGER_ANALOG_PIN);

  if (laserVal < LASER_THRESHHOLD)
  {

    NumberDrop = NumberDrop + 1;

    if (NumberDrop > SetNumberDrop)
    {
      delay(SpeedDrop);
      NumberDrop = 1;
      digitalWrite(CAMERA_FLASH_PIN, HIGH);
#ifdef PRINT_MESSAGES
      Serial.println("Flash Triggered!!!");
#endif
      delay(100);
      digitalWrite(CAMERA_FLASH_PIN, LOW);
    }
  }
#ifdef PRINT_MESSAGES
  Serial.print("Laser: ");
  Serial.print(laserVal, DEC);

  Serial.print("Laser Threshhold: ");
  Serial.print(LASER_THRESHHOLD, DEC);

  Serial.print("NumbeDrop: ");
  Serial.print(NumberDrop, DEC);

  Serial.print("SetNumbeDrop: ");
  Serial.print(SetNumberDrop, DEC);

  Serial.print("Height: ");
  Serial.println(SpeedDrop, DEC);
#endif

}

До того как сконфигурировал аналоговые порты как
pinMode(HEIGHT_PIN, INPUT_PULLUP);
было
pinMode(HEIGHT_PIN, INPUT);
все переменные регулировались одним резистором подключеным на любой из портов одновременно
т.е. резистор на А0, но при его вращении происходит и изменемя по пинам А1 А2 А3.
когда же включаю INPUT_PULLUP - все становится нормально - из за чего это может быть?
Почему?

itjunky
Offline
Зарегистрирован: 15.09.2014

Ничего не понятно. То Вы ставите INPUT_PULLUP и всё ломается, то в конце Вы пишете, что включаете INPUT_PULLUP и всё становится нормально....

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

1. Читаем http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii . Если Вы этого читать не хотите, то не удивляйтесь, что никто не захочет читать Ваш код.

2. Пока Вы не сделали PULLUP Ваш пин болтался в воздухе и был антенной для помех, кои Вы благополучно ловили при поднесении руки к потенциометру.

StruM
Offline
Зарегистрирован: 17.11.2015

itjunky пишет:

Ничего не понятно. То Вы ставите INPUT_PULLUP и всё ломается, то в конце Вы пишете, что включаете INPUT_PULLUP и всё становится нормально....

 

Я, видимо, путано объяснил.

Пока не ставил INPUT_PULLUP - все работало не правильно

с INPUT_PULLUP все работает правильно

 

StruM
Offline
Зарегистрирован: 17.11.2015

1. Извиняюсь за код в теле - больше так не буду.

2. Я бы понял, что пин был бы антенной для помех, но, дело в том, что все аналоговые порты именно синхронно изменяются одним резистором на любом из этих портов, причем выдавали не чепуху от помех, а правильные значения

StruM
Offline
Зарегистрирован: 17.11.2015

Т.е.

резистор на пине HEIGHT_PIN,

а в Serial.print одновременно рисуются корректные, с учетом map и constrain переменные.

Как будто на все порты прикручены одинаковые резисторы и вращаются параллельно.

 

Или все переменные считываются с одного пина.

itjunky
Offline
Зарегистрирован: 15.09.2014

Так если не притягивать их куда-то, то он и ловят значения с соседних параллельно идущих дорожек на плате. Потому что ток идущий по одной, создаёт поле, которое создаёт в другой дорожке аналогичный ток. Если эти наводки не гасить реально идущим по проводнику током, то влияние становится настолько заметным, что Вы и наблюдаете.

StruM
Offline
Зарегистрирован: 17.11.2015

Спасибо.

 

itjunky
Offline
Зарегистрирован: 15.09.2014

Это влияние, кстати, должно быть наименьшим, если воткнуть сигнал в A0 и считывать его с A5, при этом на A1 он будет сильным, а к A5 может даже совсем затухнуть.