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

Makkov
Offline
Зарегистрирован: 23.11.2014

Всем здравствуйте!

Подключил датчик давления MPXV7002DP к Arduino UNO, на выходе ШИМ измерительная панель, RM-428, 0-2 в., то-есть вольтметр с делителем 1:20. Датчик выдает в состоянии покоя 2.5 в., на панели 000, при подаче полного давления на выходе датчика 5 в., на панели 120, что соответствует 120 км./ч. Для контроля в паралель датчику включен авиационный указатель скорости. Вроде все работает, НО, нелинейно. Например на авиационном 80 км./ч. а на панельке 75, и т.д. Повидимому нужно привязать толи напряжение, от2.5-5в., толи уровни от 512 до 1023 на входе, к выходу ШИМ 0-127, или 0-2.4 в. Подскажите что надо сделать, с чего начать. Градации напряжений к скорости все промерял, например 3.13 в.=60 км./ч. и т.д

Скетч слепил такой.

 // Датчик давления подключен к А0.

 
// Измерительная панель (вольтметр) подключен к 10 ноге.
 
#define voltmeter 10
 
#define sensor A0
 
void setup()
 
{
 
// пин вольтметр — выход
 
pinMode(voltmeter, OUTPUT);
 
// пин датчик - вход
 
pinMode(sensor, INPUT);
 
}
void loop()
{
  int val = analogRead(0);
  val = map(val, 512, 1023, 0, 127);
  analogWrite(10, val);
}
 
NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Тут сначало нужно разобраться с физикой и математикой процесса. Тоесть узнать зависимость показаний датчика от скорости в виде формулы.

Makkov
Offline
Зарегистрирован: 23.11.2014

NeiroN пишет:

Тут сначало нужно разобраться с физикой и математикой процесса. Тоесть узнать зависимость показаний датчика от скорости в виде формулы.

Ну, эта зависимость как бы уже известна, на всем диаппазоне. Например, 2.67 в. на выходе датчика, соответствует 35 км./ч. 2.75-40 и т.д. Вот, нашел похожую ситуацию, а как привязать это к выходу ШИМ, не пойму. http://rezoh.ru/?p=4997

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Значит вам нужно 2 таблицы совместить в одну. где будут показания датчика и нужный шим на выходе

Makkov
Offline
Зарегистрирован: 23.11.2014

NeiroN пишет:

Значит вам нужно 2 таблицы совместить в одну. где будут показания датчика и нужный шим на выходе

Да это то понятно, а вот какими средстрами это сделать, не совсем. Может есть у кого какие-то примеры скетча, на эту тему. Или какими данными оперировать?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

Makkov
Offline
Зарегистрирован: 23.11.2014

Ну с железом же разобрались, теперь программирование, думаю сдесь больше програмистов, кто бы подсказал. Наверно для этого разделы и созданы. Пытаюсь разобраться с плавающими переменными fload, пока не понимаю как привязать их к ШИМ.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ты наверно хочешь получить точность (разрядность) как у ацп, но с шима? 127 тебе мало, так как полдиапазона всего используешь

1. если да то обломайся. или меняй схемотехнику (после шима делитель на 2 поставить и будешь использовать весь диапазон шима)

2. или не занимайся фигней. купи дисплей графический или с большими цифрами и сделай тоже самое но без извращений

3. купи цап и извращайся, но на высокой точности

Makkov
Offline
Зарегистрирован: 23.11.2014

Да ведь в принципе всего хватает 127 это 2.5 в. я их делю на 20, и получаю 125 мв. это максимальное значение. Сейчас работает все отлично, циферки меняются плавно, но не линейно. Вот пока не пойму, что к чему привязывать, толи напряжение к напряжению, толи уровни к уровням.  

Makkov
Offline
Зарегистрирован: 23.11.2014

Подскажите, как правильно разбить уровни на участки.

Написал так: 

void loop()
{
  int val = analogRead(0);
  val = map(val, 512, 563, 0, 41);
   analogWrite(10, val);
Первый участок работает правильно. Ввожу второй
void loop()
{
  int val = analogRead(0);
  val = map(val, 512, 534, 0, 31);
  val = map(val, 534, 563, 0, 41);
   analogWrite(10, val);
Начинает работать второй участок. А их, участков 18. Подскажите, как их правильно объеденить.

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

почитай про if

Makkov
Offline
Зарегистрирован: 23.11.2014

Спасибо! Да, прочитал все управляющие операторы, чувствую где-то рядом. Но не могу сообразить как это в код вставить. Примеры не понятны.  Пока с написанием проблема. Может по теме пример написания есть?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013
if(val>511 && val<535)  val = map(val, 512, 534, 0, 31);

...

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

да и настраивать будет проще

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

Makkov
Offline
Зарегистрирован: 23.11.2014

jeka_tm Большое спасибо!

Все заработало! Прописал все данные через 5 км., все стало работать как надо, плавно и правильно, через 1 км. Весной испытаю на мотодельтаплане. Сейчас еще все осмыслю, и подкорректирую код. Еще есть задумка сделать здесь же сигнализатор критической скорости. Например если скорость падает меньше 60-ти, в наушники подается звуковой сигнал, и при уменьшении скорости частота сигнала увеличивается. И высотомер тоже можно попробовать, есть датчик давления MPX4115AP/ А вобще Ардуино зацепило, очень интересно, много чего можно самому реализовать, если программирование знать конечно. Спасибо! 

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

да пожалуйста. ну вот еще одного зацепило)))

Makkov
Offline
Зарегистрирован: 23.11.2014

Что-то совсем мало нашел примеров со звуком. Вот, слепил генератор сигналов, а привязать его управление с аналогового входа не могу. Чтоб включался по уровню на входе, например от 200 до 500. Подскажите кто в теме.

void setup()  { 
  pinMode(11, OUTPUT);  
} 
 
void loop()  { 
  beep(200); 
}
 
void beep(unsigned char delayms){
  analogWrite(11, 30);      
  delay(200);          
  analogWrite(11, 0);       
  delay(200);           
}

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

Makkov
Offline
Зарегистрирован: 23.11.2014

При заливке этого скетча, на выходе получаю постоянный, прерывистый звуковой сигнал. А вот как отключать и включать его по команде аналогового уровня, который от 0 до 1023 не пойму. Например чтоб генератор включился на уровне 200, а выключился на 300. Например потенциометром, или датчиком.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

Makkov
Offline
Зарегистрирован: 23.11.2014

Ну, например на входе аналоговом, А0 потенциометр, вращаем ручку, и на определенном участке запикал генератор звука, а чуть дальше выключился.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

тау условия нет от звукового сигнала а от потенциометра, где сигнал постоянный

просто условия if

Makkov
Offline
Зарегистрирован: 23.11.2014

Ну вот, что то вроде получилось, правда сигнал непрерывный, меняется тон, а лучше бы частота. Вот теперь слить два скетча не получается. Какие то есть правила?

#define BUZZER_PIN  11
#define LDR_PIN     A0
void setup()
{
  pinMode(BUZZER_PIN, OUTPUT);
}
void loop()
{
  int val, frequency;
 
  val = analogRead(LDR_PIN);
if(val>595 && val<642)  frequency = map(val, 512, 1023, 1000, 500);
  tone(BUZZER_PIN, frequency,50);
}

 

Makkov
Offline
Зарегистрирован: 23.11.2014

Подскажите, кто в курсе. Почему на границах включения и выключения звука, наблюдается грязный шум? Нет четкого включения и выключения звука при достижении уровней на входе. Возможно ли это устранить?

#define BUZZER_PIN  11
#define sensor A0
void setup()
{
  pinMode(BUZZER_PIN, OUTPUT);
  pinMode(sensor, INPUT);
}
void loop()
{
int x, frequency;
   x = analogRead(0);
if(x>595 && x<642)  frequency = map(x, 512, 1023, 700, 300);
  tone(BUZZER_PIN, frequency);

 

vocvark11
Offline
Зарегистрирован: 27.08.2017

Makkov, здравствуйте решил тоже реализовать проек один в один с Вашим. Указатель воздушной скорости для дельталёта. Помогите пожалуйста с описанием.