switch (переключатель) на ардуино. ардуинщики помогите?

sioleg1973

Данную тему разместил здесь во первых - потому, что строю катамаран для рыбалки, во вторых - в других разделах, там где вес имеет значение, данное устройство будет не актуально.
Начнем с того, что я решил построить катамаран для рыбалки. Это мой первый проект, так что в вопросах моделирования я полный чайник. Поэтому не судите меня строго, прошу оставлять комментарии по существу и по возможности в более подробном изложении.
Для реализации некоторых функций катамарана возникла необходимость в работающем от приемника аппаратуры радиоуправления переключателе (SWITCH). Так как в нашей местности приобрести данные устройства нет возможности, а при заказе из Китая придется ждать продолжительное время для этих целей выбор пал на имеющейся в наличие микроконтроллер Ардуино nano и реле для него. Получаемые выгоды от использования Ардуино: 1. Возможность изменения конфигурации под собственные нужды и добавления дополнительных функций, например, таких как V-Tail mixer и т. д.; 2. Расширение функциональности аппаратуры (например, при использовании двух двухпозиционных переключателей радиоаппаратуры можно получить четыре комбинации задействовав при этом всего два канала приемника); 3. Цена; и. т. д…

При сборке схемы было использовано: плата реле с двумя питающими и одним управляющим контактами на 5 вольт, ардуино нано, тестер сервомашинок, макетная плата, 4 светодиода с резисторами (для визуализации процесса), проводники.

Первое необходимо было это считать сигнал с приемника, что удалось сделать при помощи команды – pulseIn(). Тестер сервомашинок выдавал сигнал в виде импульсов приблизительно от 840 до 2070 микросекунд (делим на 1000 для миллисекунд). Далее мною был написан данный скетч:

int pin_1 = 7; // контакты куда подключаются
int pin_2 = 8; // выход сигнального контакта
int pin_3 = 9; // с тестера сервомашинок
int pin_4 = 10; // на них снимаем сигнал

int Rele_1=2; // сюда подключаем сигнальный
int Rele_2=3; // контакт реле в моем
int Rele_3=4; // случае я подключал
int Rele_4=5; // светодиоды

int val_1 = 0; // это наверное для того что бы
int val_2 = 0; // сюда записались показания
int val_3 = 0; // контактов
int val_4 = 0; // с pin_1 = 7 по pin_4 = 10

void setup()
{
pinMode(pin_1, INPUT); // назначаем контакты
pinMode(pin_2, INPUT); // как вход
pinMode(pin_3, INPUT); //
pinMode(pin_4, INPUT); //

pinMode(Rele_1, OUTPUT); // назначаем контакты
pinMode(Rele_2, OUTPUT); // как выход
pinMode(Rele_3, OUTPUT); //
pinMode(Rele_4, OUTPUT); //

Serial.begin(9600); // это вслучае вывода показаний на монитор

}

void loop()
{
{
val_1 = pulseIn(pin_1, HIGH); //снимаем показания
{
if (val_1 >2100) //если больше 2100
{
digitalWrite(Rele_1, LOW); // не чего не делать
}
else if (val_1 <1350) // если меньше 1350
{
digitalWrite(Rele_1, LOW); // не чего не делать
}
else
{
digitalWrite(Rele_1, HIGH); // в остальных случаях вкючить
}
}
}
{
val_2 = pulseIn(pin_2, HIGH); // все остальное по такму же
{
if (val_2 <750) // принципу
{
digitalWrite(Rele_2, LOW);
}
else if (val_2 <1250)
{
digitalWrite(Rele_2, LOW);
}
else if (val_2 >1750)
{
digitalWrite(Rele_2, LOW);
}
else if (val_2 > 2100)
{
digitalWrite(Rele_2, LOW);
}
else
{
digitalWrite(Rele_2, HIGH);
}
}
}
{
val_3 = pulseIn(pin_3, HIGH);
{
if (val_3 >2100)
{
digitalWrite(Rele_3, LOW);
}
else if (val_3 <1350)
{
digitalWrite(Rele_3, LOW);
}
else
{
digitalWrite(Rele_3, HIGH);
}
}
}
{
val_4 = pulseIn(pin_4, HIGH);
{
if (val_4 >2100)
{
digitalWrite(Rele_4, LOW);
}
else if (val_4 <1350)
{
digitalWrite(Rele_4, LOW);
}
else
{
digitalWrite(Rele_4, HIGH);
}
}
}
Serial.println(val_2); // показыват какой контакт передавать
// на монитор
}

Так как опыт программирования Ардуино у меня два дня данный скетч писался методом тыка. И что удивительно все заработало. Единственная проблема, которая мною была выявлена – если один из контактов от приемника не подключен к Ардуино то светодиод, отвечающий за этот канал ведет себя непредсказуемым образом. При практическом использовании в случае пропадания либо отключения контакта и при определенной конфигурации оборудования радиоуправляемой модели данная проблема может доставить неприятности. Вариант с применением стягивающих резисторов, думаю, не подходит. Попробовал установить сопротивление на 10 кОм от отключенного проводника к земле, сопротивление греется, то есть будут потери электроэнергии. Скорее всего, данную проблему нужно решать программными средствами.
Ардуинщики, помогайте.
При замере показаний с отключенного контакта результат выдает обычно импульс более 8000 микросекунд, но проскакивают и любые другие показания. Также показания на разных контактах бывают отличаются. Возможные пути решения думаю в более правильном описании сигнала поступающего с приемника, но как это реализовать я пока не пойму. Возможно нужно команду pulseIn(pin, value) писать в варианте pulseIn(pin, value, timeout) только не пойму как она работает и какой параметр выставлять ( timeout (опционально): время ожидания импульса в микросекундах; значение по умолчанию - одна секунда (unsigned long)). Кстати поиграв с цифрами я добился кое какого результата но какую цифру устанавливать если сигнал имеет продолжительность импульса от 1 до 2 миллисекунд я не пойму.
Что скажете, Господа….

V_Alex

При использовании стандартных сервомеханизмов импульсы должны идти с частотой 50 Гц. Это соответствует 20 мс или 20000 мкс. Если очередной импульс не пришел за 30 мс ситуацию можно считать аварийной. Если в приемнике есть фейлсейф, он сам обработает эту ситуацию и выдаст свой импульс вместо пропущенного.
А вообще место этой темы в разделе “Самодельная электроника, компьютерные программы”.

sioleg1973
V_Alex:

А вообще место этой темы в разделе “Самодельная электроника, компьютерные программы”.

По поводу размещения этой темы в данном разделе я писал выше. Разъясню подробней. Как я писал, данный девайс будет актуален при постройке, например, кораблика для рыбалки, для реализации таких функций как включение габаритных огней, сброса крючков и прикормки или как у меня для установки удочки и катушки. Моделисты - новички (такие как я) при решении указанных вопросов в первую очередь я думаю будут искать ответы в данном разделе. Так же, решение о правильности размещения темы выносят модераторы.
В связи с вышеизложенным прошу всех оставляющих комментарии писать только по существу, что бы не захламлять тему.

Панкратов_Сергей
sioleg1973:

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

Как то грубо. Не стоит поставленный вопрос открытия ТЕМЫ, а тем паче призывы писать по существу.
По существу если писать- то будет всего один пост. Практически его содержание раскрыто Александром.

V_Alex
sioleg1973:

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

Тему захламлять нельзя, а форум можно? 😃 Чем вас тема про Ардуино не устроила?

sioleg1973
Панкратов_Сергей:

Как то грубо.

Прошу прощения если показался кому то грубым. Не кому не хотел и не хочу грубить. Просто охота услышать совет и по возможности с объяснением почему именно так. Так как интересно самому разобраться.

Панкратов_Сергей:

По существу если писать- то будет всего один пост.

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

V_Alex:

Тему захламлять нельзя, а форум можно? Чем вас тема про Ардуино не устроила?

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