Inspire-подобная рама своими руками с нуля
Тааакс… Подправил граничные условия в одном месте, вернул старый скетч эхолота и стер фрагмент про кнопку - пошло на пользу. Мотор ровно крутит в обе стороны и в обоих режимах. На сонар реагирует корректно.
Теперь надо фрагмент про кнопку правильно вставить.
…
Нее, если в то место вставляю, то картина портится.
Попробую в начало
…
Не, чет не то… Без кнопки все прям прекрасно работает. А фрагмент с кнопкой все резко портит. Андрей, кажется вы писали про оператор Continue, но потом редактировали. Он может помочь при размещении кода кнопки в начале цикла?
…
Текущее работоспособное состояние цикла без кнопки:
void loop()
{
duration = pulseIn(pin, HIGH);
if (duration > 1800)
{
servo_mode = 0;
} else if ((duration > 1300)&(duration <= 1700))
{
servo_mode = 180;
}
else
{
Serial.flush();
Serial.write(0x55);
delay(10);
if (Serial.available() >= 2)
{
HighLen = Serial.read();
LowLen = Serial.read();
Len_mm = HighLen * 256 + LowLen;
Serial.print(Len_mm, DEC);
Serial.println(“mm”);
}
if (Len_mm <= dist)
{
servo_mode = 0;
}
else
{
servo_mode = 180;
}
}
if (servo_mode != last_servo_mode)
{
myservo.write(servo_mode);
last_servo_mode = servo_mode;
}
}
писали про оператор Continue, но потом редактировали
continue это переход на следующий шаг цикла с текущего места, его использовать нельзя, потому что это не цикл for или while, поэтому я и отредактировал. Он не может помочь.
Надо понять, почему кнопка влияет так.
А вы можете наоборот все убрать и оставить только кнопку?
Оставить только кнопку и дополнить реакцию на отжатие:
if (digitalRead(button) == HIGH) {
// если кнопка транспортного положения нажата
servo_mode = 90; // лучи в среднем положении
} else {
servo_mode = 0; // в любом другом положении
}
А вы можете наоборот все убрать и оставить только кнопку?
Сама по себе стопорит она нормально. Но своим присутствием этот фрагмент кода влияет на остальной цикл и серва начинает неровно крутиться, стопориться, дергалься
if (digitalRead(button) == HIGH)
{myservo.write(90);
servo_mode = 90;}
Мне кажется хорошо бы воткнуть его вначале, чтобы программа проверила его, и если кнопка включена, то оставшаяся часть кода была бы проигнорирована за ненадобностью.
А если кнопка не нажата, то цикл выполнялся бы полностью.
А вы можете наоборот все убрать и оставить только кнопку?
сейчас попробую…
Но своим присутствием этот фрагмент кода влияет на остальной цикл и серва начинает неровно крутиться, стопориться, дергалься if (digitalRead(button) == HIGH) {myservo.write(90); servo_mode = 90;}
Погодите, именно этот фрагмент?
С ним будет дергаться, потому что в нем запись происходит. В нем должно быть только servo_mode = 90 и больше ничего. Запись производится после всех проверок один раз в конце цикла.
добавил команду myservo.write(servo_mode), чтоб приняла к исполнению, получилось:
if (digitalRead(button) == HIGH) {
// если кнопка транспортного положения нажата
servo_mode = 90; // лучи в среднем положении
myservo.write(servo_mode);
}
else
{
servo_mode = 0; // в любом другом положении
myservo.write(servo_mode);
}
Вообще-то странно себя ведет. Может сразу запуститься после отпускания кнопки, а может постоять на месте приличное время. Не ожидал сюрприза в таком простом фрагменте.
Погодите, именно этот фрагмент?
С ним будет дергаться, потому что в нем запись происходит. В нем должно быть только servo_mode = 90 и больше ничего.
таааакс, сейчас переделаю)
Мне кажется хорошо бы воткнуть его вначале, чтобы программа проверила его, и если кнопка включена, то оставшаяся часть кода была бы проигнорирована за ненадобностью.
Это неважно, т.к. запись происходит один раз в конце цикла. Кто последний изменил servo_mode, тот и приоритетнее.
Но вы можете поставить кнопку в начало, а остально завернуть в блок else, так вы избежите ненужных проверок
if (digitalRead(button) == HIGH) {
// если кнопка транспортного положения нажата
servo_mode = 90; // лучи в среднем положении
} else {
// здесь все остальные проверки
}
Попробовал в конец и в начало с Else. Чертовщина какая-то. Весь цикл прекрасно работает пока этот фрагмент не вставлю. Хоть в начало, хоть в конец - все одно - стопорит хорошо, но в “отжатом” положении серва плохо крутится.
Пожалуй надо придумать другой способ входа в транспортный режим, без кнопки.
…
Андрей, за код премного благодарю! “Авто” и “Ручной” работают как надо. Без вашей помощи не допетрил бы.
А на счет транспортного подумаю еще.
но в “отжатом” положении серва плохо крутится.
нет ли в отжатом положении какого-то дребезга кнопки?
Ну и еще такая мысль - может серве не нравится конкретно положение 90? Попробуйте сделать что-то типа 160 или 30, посмотрите как отреагирует.
нет ли в отжатом положении какого-то дребезга кнопки?
ну у меня самой кнопки пока нет - ее роль выполняли провода со штекерами мама-папа
Попробуйте сделать что-то типа 160 или 30, посмотрите как отреагирует.
я перед экспериментами раскрутил серву (тестовая серва непрерывного вращения), подкрутил энкодер, чтобы четко при 90* стопорилась без гудения. Поэтому встает то она хорошо, а вот влияет нехорошо.
Пожалуй надо придумать другой способ входа в транспортный режим, без кнопки.
Мы его добьем 😉 Должно работать. Может быть просто кнопка какая-то особенная и сигнал HIGH появляется только однократно, а не все время пока она нажата? Можно добавить код, который проверяет, как долго кнопка находилась в положении HIGH, и меняет режим сервы, только если прошло полсекунды, например.
Мы его добьем Должно работать.
Основательный подход))
и сигнал HIGH появляется только однократно, а не все время пока она нажата?
не не, со стопорением все очень хорошо, на сигнал грех жаловаться. В момент стопорения серва в полном покое и не гудит.
Вспомнил странность про которую писал выше, когда вы предложили протестировать чисто код стопорения… Я кнопку оджимал, а серва не торопилась крутиться. Могла сразу начать, а могла секунд пять стоять на месте, а потом начинать вращение… Мне это показалось крайне странным.
То есть как бы даже Через Чур стопорила, если можно так сказать… может это “черезчурстопорение” и вызывает пинки в работе сервы в режимах когда она должна вращаться.
Может микшером каналов на аппаратуре добавить еще одну четвертую ширину импульса для этого канала. Задействовать дополнительный тумблер для транспортного положения.
Подумал, может то что я под нужды кнопки взял два соседних контакта могло дать какую-то наводку, или еще что-то.
Попробовал развести немного в стороны, но это не повлияло
Если код кнопки даже в коротком, изолированном виде дает нестабильную работу, то может другое логическое условие придумать? Не HIGH на контакте, а что-нибудь иное, более конкретное. Импульсы программа распознает корректно.
Поковырял на пульте программный микшер - в принципе как вариант можно испробовать. Но это уже завтра, ибо утро вечера мудренее)
Если код кнопки даже в коротком, изолированном виде дает нестабильную работу, то может другое логическое условие придумать?
Дело в том, что чудес не бывает. Код должен работать. Причина сбоя в какой-то хитрости появления сигнала HIGH.
Давайте займемся только кнопкой.
Я по этой ссылке сделал код, попробуйте ее открыть, а то здесь теряется все форматирование. Там и чатик есть.
collabedit.com/4qfup
А не пробовали использовать встроенный резистор подтяжки на ардуине. Он как раз служит для того чтобы устранять дребезг контактов.
pinMode(pin,OUTPUT); // выход
pinMode(pin,INPUT); // вход
pinMode(pin,INPUT_PULLUP); // вход с подтяжкой
pinMode(pin,INPUT_PULLUP); // вход с подтяжкой
Попробовал с INPUT_PULLUP - серва стояла в 90* не реагируя ни на кнопку, ни на тумблер.
Я по этой ссылке сделал код, попробуйте ее открыть
Испробовал - кнопка стопорит исправно. Но вращение сервы не такое ровное как во вчерашнем коде без кнопки. Время от времени проскакивают запинки.
Вы же понимаете что pullup подтягивает линию к высокому уровню, и поэтому кнопка должна замыкать линию на землю?
А не пробовали использовать встроенный резистор подтяжки на ардуине. Он как раз служит для того чтобы устранять дребезг контактов.
Он подтягивает уровень сигнала к единице при размыкании кнопки, дребезг кнопки не устраняет
Вспомнил странность про которую писал выше, когда вы предложили протестировать чисто код стопорения… Я кнопку оджимал, а серва не торопилась крутиться. Могла сразу начать, а могла секунд пять стоять на месте, а потом начинать вращение…
Таки да, возможно отсутствует подтягивающий резистор (к земле или питанию) цифрового входа от кнопки ардуины.
Посмотри по ардуине видео курсы джереми блума, там все просто:)
С утра испробовал вариант кода с микшером. Режимы у меня на SD, а на соседнюю SG в ее центральном положении настроил смещение ширины сигнала. И в коде прописал, что если сигнал в пределах смещения, то на серве 90*.
Потестировал - работало хорошо.
По сути это тоже получился вариант с кнопкой, только кнопка на пульте. Пожалуй так даже удобнее - не нужно дополнительных проводов и соединений.
Андрею еще раз большая благодарность за рабочий код!!!
Что касается транспортного положения, то остановлюсь на управлении с пульта.
Тесты на макетной плате прошли хорошо, теперь надо на Ардуину-мини перенести и спаять схему.
Посмотри по ардуине видео курсы джереми блума, там все просто
Не слыхал про такого, но погляжу на досуге, может умища наберусь)
Зачинил схемку с ардуиной-про-мини. Получилось не с первого раза, из-за того, что свежие ардуины с Алика глючили и не хотели работать. В итоге спаял на старенькой. Заказал Ардуину-мини со встроенным программатором и микро-USB. Хочу сделать модуль поаккуратнее.
Сигнал и питание на плату будет идти с приемника, а на выходе сигнал на серву. Потестировал, все работало как надо и принимало 90* при переключении тумблера SG в среднее положение.
Сделал перемычки TX, RX, GND для коннектора дальномера (VCC совпало). И перемычки VCC, GND для запитки от приемника, чтоб одним стандартным трехжильным проводом соединить.
Вначале (на глючных ардуинах) я откидывал лапки микропроцессора для тех контактов на которые я вывожу перемычки (думал предостеречься от влияния сигналов и напряжения на процессор) но в последнем варианте не стал, так как никакого влияния не обнаружил.
Получился самостоятельный модуль который можно снимать и ставить в промежуток между приемником и сервой для управления шасси - возможно кому-то еще окажется полезным (Масса 13 грамм). На этот случай выкладываю:
Итоговый скетч
У меня там ширина импульса сдвинута относительно номинальной, из-за того что я раздвигал конечные точки на аппе, чтобы отрегулировать угол подъема спуска. Когда окончательно перейду на этот модуль, то верну конечные точки в исходную.
скетч для считывания ширины импульса
Убираясь на столе, не глядя воткнул сонар в ардуину не правильно, а буквой “Г”. Потом присмотрел и решил, что так гораздо удобнее разместить и закрепить. Перепаял пины и перемычки.
Закрепилось все карбоновой планкой - сонар можно легко снять не откручивая винты (в частности на время заливки скетча на ардуину) и воткнуть в разъем обратно. Только надо придумать как провести/закрепить провод аккума, чтобы он сонару не мешал.
Когда приедет ардуина с микро-USB, гребенка торчать не будет и перемычки перепаяю внутрь.
В домашних условиях схему потестировал, работает. А парке еще не пробовал - погода совсем не летная.
Поправил в скетче крайние углы спуска/подъема и середину, чтобы серва касалась стола. Получилось 45*, 94*, 160*
Люфт в подшипнике привода оказался из-за муфты которая соединяет с сервой - сползла на миллиметр. Пропаял ее для надежности, люфт почти полностью ушел.
Забрал вчера оставшиеся карбоновые детали с резки, поставил по местам.
фото
Вернул выкос на моторы. Хочу проверить полет с ним на тех же гейнах.
GPS пока на своей полке, так как разительных отличий, по сравнению с выносом на стойку, не заметил. Нужно еще по-тестировать.
Захотелось сделать обтекатель. Вначале думал, что буду его печатать, потом пришла идея, что было бы здорово вакуумной формовкой сделать, но в итоге решил попробовать сделать простой формовкой из миллиметрового полистирола в домашних условиях.
Заказал две половинки-матрицы из дерева у парня у которого карбон резал. Матрицы крепил на невысокую стойку, чтобы приподнять над полом; клал пластик на матрицу, дул сверху термофеном и одной рукой (одетой в зимнюю перчатку, чтобы не жгло) разглаживал и приминал пластик к матрице. Особенно обращал внимание, чтобы по нижней кромке матрицы прилегание было плотным. В процессе, по краям листа делал разрезы, чтобы разогретому пластику было легче свисать.
После остывания снял половинки с матриц, подрезал по кромке, склеил по центральной линии и изнутри дополнительно проклеил полоской такого же полистирола, чтобы стык был прочным.
Матрицу предварительно не готовил (не шпаклевал, не шкурил), так как думал, что для начала просто потренируюсь. В итоге кое-что начало получаться с первого раза и решил продолжить, но на формах отпечатались небольшие огрехи матрицы. Прошелся по ним шпаклевкой и шкуркой. А за одно и по матрице, на будущее. Никаких специальных шпаклевок не искал - пошел в Леруа полимерно-эластичную купил.
По-грунтовал, потом начал прикидывать как покрасить: однотонный черный, или белый, или с какими-нибудь полосками… Попалось в сети фото суперкара раскрашенного под серый угловатый камуфляж - понравилось, захотел сделать так же.
вот как в итоге получилось:
Думаю, может на аккум еще наклейку с такой же текстурой сделать…
Кстати до меня только что дошло, что раньше я ссылками не дублировал картинки, а отображаются они не всегда, поэтому вот залил архив предыдущих фото на всякий случай.
Немного по-тестировал в полете автоматический режим. Работает на четверочку с минусом из-за сонара (при его цене, ждать многого не стоило). Так то в целом все правильно работает, но замер высоты не точный и поэтому реакция не четкая.
Думаю, может попробовать лазерный, типо этого. Хоть он всего до 2 метров действует, но при четкой работе этого могло бы хватить. Если конечно испытания нового винта будут успешными.
Дальность всего два метра.