Реакция на изменение напряжения

Mexaelb
Offline
Зарегистрирован: 25.03.2013

 

Всем привет!

пожалуйста подскажите где почитать 

идея такая 

в зависимости от напряжения на входящем канале выдается определенная команда на исполнительную дорожку

т.е. к примеру 

есть датчик высоты (обычный патонциометр) и в зависимости от того какая высота (меняется напряжение) на исполнительнуюю ножку выдается команда 

leshak
Offline
Зарегистрирован: 29.09.2011

Это зависит от того что именно вам нужно.  В названии темы и в описании - поставлены немного разные задачи.

1. Реакция на изменения
2. В зависимости от напряжение.

Другими словами, вам нужно "если напряжение упало на 0,5V выдать команду" или "если напряжение попало в диапазон скажем от 1.5v до 2.0v выдать комманду"

Mexaelb
Offline
Зарегистрирован: 25.03.2013

если попало в диапазон такой-то, выдать такую команду

Mexaelb
Offline
Зарегистрирован: 25.03.2013

написал такую программу!

 

int analogPin = 3;     // номер порта к которому подключен потенциометр
int val = 0;           // переменная для хранения считываемого значения
 
void setup()
{
  pinMode(13, OUTPUT);  
  pinMode(12, OUTPUT); 
  pinMode(11, OUTPUT); 
}
 
void loop()
{
  digitalWrite(13, HIGH);
  val = analogRead(analogPin);     // считываем значение
  if (val < 918.36)
  {
    digitalWrite(12, HIGH); 
  }
  else
  {
    digitalWrite(11, HIGH); 
  }
 
}
 
 
 
но почему то не работает!
что может быть не так?
leshak
Offline
Зарегистрирован: 29.09.2011

Mexaelb пишет:

если попало в диапазон такой-то, выдать такую команду

Тогда чтение лучше всего начать с раздела Программирование в шапке сайта. И желательно целиком. Пусть не все понятно будет, но общую картину - нужно составить. И какая нибудь книжечка по программированию на C/C++  (да вообщем-то на любом языке) - тоже будет в помощ.

Вообщем для начала нужно разобратся с типами, if, циклами и т.п. базовые "строительные блоки". Хотя-бы знать какие есть. А потом осваивать их уже в процессе детально.

В вашем случае (не хочу просто срыватся еще 10-ток уточнящих вопросов "что же именно вам нужно"). Это могло бы быть что-то такое

setup(){
  pinMode(13,OUTPUT); // настроили светик
}
loop(){

  int val=analogRead(A0);// прочитали пин A0
  if(val>=256 && val<=512){ // если напряжение в диапазоне от 1.25V до 2.5V
     digitalWrite(13,HIGH); //  включили светик. "выдали" нашу команду
  }

}

Ну вот как-то так. Будет зажигать как только попадет в нужный диапазон (правда выключать при выходе из диапазона не будет. если нужно "выключать", то еще else digitalWrite(13,LOW) добавит нужно будет.

Можно, после чтения, сразу в вольты пересчитывать (и писать условие в вольтах). Пересчитывать исходя из того что 1023 возвращенное analogRead - соотвествует напряжению питания.

Поэтому, кстати 1.25 и 2.5 - это услоно. Если у вас дуина питается не ровно 5v, а, скажем 4.5вольтами, то диапазон - сместится. Будет уже сработка от  1.12v до 2.25v . Вообщем "нужно калибровать по реальное напряжение на 5v пине дуины".

leshak
Offline
Зарегистрирован: 29.09.2011

Прикрепленные ветки - тоже нужно читать

Вставка программного кода в тему/комментарий

 

leshak
Offline
Зарегистрирован: 29.09.2011

Mexaelb пишет:

но почему то не работает!

что может быть не так?

Ну откуда я знаю?  

1. Я не знаю как и куда вы подключили потенциометр.
2. Я не знаю чего вы ждете от этого скетча.
3. Я не знаю в чем выражается, с вашей точки зрения "не работает".

Итого: телепаты в отпуске.

P.S. А во то что догадались свой скетч показать - это хорошо. Возможно с этого стоило и начать. Плюс добавить "ожидаю что будет вот это, а выходит - вот такое".

leshak
Offline
Зарегистрирован: 29.09.2011

Попробую, все-таки "протелепатировать":

byte analogPin = 3;     // номер порта к которому подключен потенциометр
int val = 0;           // переменная для хранения считываемого значения

void setup()
{
  pinMode(12, OUTPUT); 
  pinMode(11, OUTPUT); 
}

void loop()
{

  val = analogRead(analogPin);     // считываем значение
  if (val < 918.36)
  {
    digitalWrite(12, HIGH); 
    digitalWrite(11, LOW); 
  }
  else
  {
    digitalWrite(11, HIGH); 
    digitalWrite(12, LOW); 
  }

}

 

__Alexander
Offline
Зарегистрирован: 24.10.2012

918.36 ?

leshak
Offline
Зарегистрирован: 29.09.2011

__Alexander пишет:

918.36 ?

42

Mexaelb
Offline
Зарегистрирован: 25.03.2013

__Alexander пишет:

918.36 ?

взято с 

http://arduino.ru/Reference/AnalogRead

Напряжение  поданное на аналоговый вход, обычно от 0 до 5 вольт будет преобразовано в значение от 0 до 1023, это 1024 шага с разрешением 0.0049 Вольт

 

т.е. 918.36*0,0049 = 4,49 В

leshak
Offline
Зарегистрирован: 29.09.2011

Mexaelb пишет:

__Alexander пишет:

918.36 ?

взято с 

http://arduino.ru/Reference/AnalogRead

Напряжение  поданное на аналоговый вход, обычно от 0 до 5 вольт будет преобразовано в значение от 0 до 1023, это 1024 шага с разрешением 0.0049 Вольт

 

т.е. 918.36*0,0049 = 4,49 В

Кажись я догадался что имел ввиду Александ. 

Вопрос нужно было задать не так "918.36 ?", а так "918.36 ?"

Тогда сразу было-бы ясно, что это намек на то, что val у нас имеет тип int (и это правильно, так как analogRead именно его и возвращает). А значит дробная часть - тут как бы и "лишняя". val никогда не будет иметь значений типа 918.30 или 918.40, только 918 или 919.

Mexaelb
Offline
Зарегистрирован: 25.03.2013

Согласен, поэтому я переписал программу и вот что получилось

int analogPin = 3;     // номер порта к которому подключен потенциометр
int val = 0;           // переменная для хранения считываемого значения

void setup()
{
  pinMode(13, OUTPUT);  
  pinMode(12, OUTPUT); 
  pinMode(11, OUTPUT); 
  Serial.begin(9600);
}
void loop()
{
  digitalWrite(13, HIGH);
  val = analogRead(analogPin);     // считываем значение
  Serial.println(val);  // выводим значение на экран 
  if (val < 230 )
  {
    digitalWrite(12, HIGH); 
    digitalWrite(11, LOW); 
  }
  else
  {
    digitalWrite(11, HIGH); 
    digitalWrite(12, LOW); 
  }
  delay(1000);
}

 

если обратить внимание, теперь сравнение идет со значением 230 потому что когда я посмотрел какие значения считаываются с потанциометра то очень удивился значения пляшут от 180 до 245 при чем когда никто ничего не меняет т.е. само по себе

программа кстати работает, и светодиоды переключаются как только условие выполняется

но если замерить вольтметром, то значения действительные оказываются в районе 4,5 вольт

отсюда вопрос почему ардуино неправильно считывает значения напряжения?

я использую функциию analogRead()

а прочитал про нее вот здесь http://arduino.ru/Reference/AnalogRead

питание я беру с 13 выхода куда подается максимальное значение напряжение, замыкаю его через патонциоментр на gnd на плате ардуино, чтобы наглядно видеть радоту патонциометра еще туда же воткнул светодиод (получается когда меняю значение патонциометра, то светодиод горит с разной яркостью)

вот последовательность подключения

идет 5В (13 выход), потом светодиод, потом патонциометр, потом провод на считывание значения напряжения, и дальше gnd

и все же не понятно почему же он начинает считывать значения из воздуха? и постоянно скачет от 180 до 245? при это патонциометр не трогается

 

Mexaelb
Offline
Зарегистрирован: 25.03.2013

то есть изначальная задумка такая

я считываю напряжение и в зависимости от того в каком оно диапазоне

включаю тот или иной светодиод, а остальные светодиоды отключаю

как бы начал экспереминтировать с 3 мя светодиодами 

благодарая вашим комментариям получилось что программа заработала

но теперь не ясно почему значения по напряжению считываются не правильно

rammires
Offline
Зарегистрирован: 04.04.2013

Mexaelb пишет:

но теперь не ясно почему значения по напряжению считываются не правильно

Значения по напряжению как раз считываются правильно - ты подключил светодиод ч\з резистор к земле и снимаешь падение напряжения на этом резюке, да еще ч\з делитель... Дальше сам догадаешься какое там напряжение будет?

А то, что оно у тебя прыгает, ну так: нестабильность питания, нестабильность опорного напряжения, нестабильный контакт в токосьеме резюка...

leshak
Offline
Зарегистрирован: 29.09.2011

Mexaelb пишет:

питание я беру с 13 выхода куда подается максимальное значение напряжение, 

Все. Стоп!!! Выключайте отключайте.

Mexaelb
Offline
Зарегистрирован: 25.03.2013

честно говоря не догадаюсь, можно немного подробнее?

я убрал светодиод но напряжение таким же осталось

Mexaelb
Offline
Зарегистрирован: 25.03.2013

 

честно говоря не догадаюсь, можно немного подробнее?

я убрал светодиод но напряжение таким же осталось

Mexaelb
Offline
Зарегистрирован: 25.03.2013

что не так?

leshak
Offline
Зарегистрирован: 29.09.2011

 

Mexaelb пишет:

питание я беру с 13 выхода куда подается максимальное значение напряжение, 

Никогда нельзя "брать питание с пина". Они не предназначенны для того. Если оттуда что-то и берется - то "нормальным" считается брать ток 15-20ma. Если очень нужно, то до 40ma, ну в зависимости от корупуса камня до 80-ти иногда прокатит кратковренно.

В вашем случае - вы явно понятие не имеете какой там ток идет. Следовательно - сразу забыть.

Общие праивло: питание берем с пина 5v или vin (если питаемся от внешнего блока и там нужно, например для мотора, что-то больше 5v). Но и в этом случае следим, что-бы держатся в границах 200-300ma. 500ma - граница допустимая по стандарту при питании от USB (но не факт что все китайцы выдерживают стандарт).

"Следить" можно двумя способами. Либо мерять с помощью амперметра, либо просто "прикинуть" сопротивление нагрузки (в вашем случае минимальное сопротивление потенциометра) и дальше - гуглить "закон Ома".

А так неплохо начать с изучения примеров идущих с ArduinoIDE. Их можно найти в меню File/Examples 

Или на сайте Arduino - Tutorials

Причем нужный вам пример находится в "самых базовых". В первых же ReadAnalogVoltage или AnalogReadSerial

Там вы можете увидеть как правильно подключать потенциометр.

P.S. Кстати там же можете увидеть как делать про что я писал выше "Можно, после чтения, сразу в вольты пересчитывать (и писать условие в вольтах)"

__Alexander
Offline
Зарегистрирован: 24.10.2012

кстати, а какую опору выбирает analogRead?

Mexaelb
Offline
Зарегистрирован: 25.03.2013

leshak пишет:

 

Mexaelb пишет:

питание я беру с 13 выхода куда подается максимальное значение напряжение, 

Никогда нельзя "брать питание с пина". Они не предназначенны для того. Если оттуда что-то и берется - то "нормальным" считается брать ток 15-20ma. Если очень нужно, то до 40ma, ну в зависимости от корупуса камня до 80-ти иногда прокатит кратковренно.

В вашем случае - вы явно понятие не имеете какой там ток идет. Следовательно - сразу забыть.

Общие праивло: питание берем с пина 5v или vin (если питаемся от внешнего блока и там нужно, например для мотора, что-то больше 5v). Но и в этом случае следим, что-бы держатся в границах 200-300ma. 500ma - граница допустимая по стандарту при питании от USB (но не факт что все китайцы выдерживают стандарт).

"Следить" можно двумя способами. Либо мерять с помощью амперметра, либо просто "прикинуть" сопротивление нагрузки (в вашем случае минимальное сопротивление потенциометра) и дальше - гуглить "закон Ома".

А так неплохо начать с изучения примеров идущих с ArduinoIDE. Их можно найти в меню File/Examples 

Или на сайте Arduino - Tutorials

Причем нужный вам пример находится в "самых базовых". В первых же ReadAnalogVoltage или AnalogReadSerial

Там вы можете увидеть как правильно подключать потенциометр.

благодарю за полезную информацию

когда все получится напишу сюда же

 

 

Mexaelb
Offline
Зарегистрирован: 25.03.2013

__Alexander пишет:

кстати, а какую опору выбирает analogRead?

 

что значит опору?

__Alexander
Offline
Зарегистрирован: 24.10.2012

Mexaelb пишет:

что значит опору?

 

эт я не у вас. это я ваще.

Mexaelb
Offline
Зарегистрирован: 25.03.2013

leshak пишет:

Mexaelb пишет:

питание я беру с 13 выхода куда подается максимальное значение напряжение, 

Все. Стоп!!! Выключайте отключайте.

 

все работает 

подключил патонциометр по этой схеме

занчения показывает здоровые!

всех благодарю за помощь!

=)

rammires
Offline
Зарегистрирован: 04.04.2013

__Alexander пишет:

кстати, а какую опору выбирает analogRead?

По дефолту напряжение питания.

Изменять можно c помощью analogReference(type) :

  • DEFAULT: the default analog reference of 5 volts (on 5V Arduino boards) or 3.3 volts (on 3.3V Arduino boards)
  • INTERNAL: an built-in reference, equal to 1.1 volts on the ATmega168 or ATmega328 and 2.56 volts on the ATmega8 (not available on the Arduino Mega)
  • INTERNAL1V1: a built-in 1.1V reference (Arduino Mega only)
  • INTERNAL2V56: a built-in 2.56V reference (Arduino Mega only)
  • EXTERNAL: the voltage applied to the AREF pin (0 to 5V only) is used as the reference.
leshak
Offline
Зарегистрирован: 29.09.2011

Mexaelb пишет:

leshak пишет:

Mexaelb пишет:

питание я беру с 13 выхода куда подается максимальное значение напряжение, 

Все. Стоп!!! Выключайте отключайте.

 

все работает 

подключил патонциометр по этой схеме

Ну и что бы закрепить знания и уменьшить вероятность криков "караул!" в будущем, советую не поленится и завершить эту лабораторную работу. Расчитать какой-же ток будет потреблять ваша нагрузка (резистор). Вначале "посчитать/прикинуть", а потом взять тестер и убедится что теория совпадает с практикой.

Для этого вам нужно
1. Узнать сопротивление вашего переменника (между ногой идущей к питанию и ногой идущей к земле. по идее, если все подключено правильно - оно не должно менятся от положения реостата). Узнать можно - либо по маркировке (если она есть), либо "знаю что покупал", либо опять-таки тестером в режиме омметра (или и так и этак).
2. Гуглим закон ома - и вычисляем какой ток у нас через него пойдет.
3. Берем тестер, включаем в режим амперметра и меряем проходящий ток (если не помним - гуглим как подключать правильно подключать амперметр для измерений). После чего либо радуемся что все правильно рассчитали, либо "чешим затылок".
4.Если расчетный/намеряный ток превышает 200-300ma - начинаем думать "а как бы его снизить", если ничего не приходит в голову - спрашиваем тут.

И на будущие, такую "расчет/прикидку габаритов", хотя-бы грубо, желательно делать до подключения.