Написание кода передатчика и приемника (для подводного аппарата) за вознаграждение
- Войдите на сайт для отправки комментариев
Здравствуйте. У меня в разработке проект подводного телеуправляемого аппарата. Не коммерция, чисто хобби. Посмотреть о чем речь можно в этой теме: http://forum.rcdesign.ru/f130/thread335111.html
Ищу исполнителя для написания программного кода передатчика и приемника команд управления (вперед, назад, вращение на месте, включение и выключение источников света, управление манипулятором и т.д.) Передача данных будет происходить по RS485. Аппаратная часть передатчика и приемника изготовлены и работают.
Предполагаю, что написание программ будет поэтапным. Сначала добавим функции управления освещением, затем движением, манипулятором и т.д. Оплата за работу так-же будет поэтапна. За дополнительную функцию программы (мои прихоти) оплата по договоренности. Предпочтение работать с одним человеком или группой, которые пишут и по необходимости наращивают программу.
Для начала необходимо написать код передатчика, который отправлял - бы в порт Serial в каналы E/F/G/H информацию о нажатии каждой для своего канала тактовой (нефиксируемой) кнопки. Допустим:
a) Включили передатчик - в порт отправляются "0"
б) Нажали и отпустили кнопку - в порт отправляются "1"
в) Нажали и отпустили еще раз - отправляются "0"
Пожелание по коду: (во время нажатия и последующего удержания (пускай даже на полсекунды) кнопки информация, отправляемая в порт не должна меняться. Допустим в порт отправляются нули, при нажатии кнопки в порт или сразу, или после отпускания кнопки должны отправиться единицы, а не 0-1-0-1 и т.д.)
Имеется код, который был написан ранее (если он подходит - отталкиваться необходимо от него)
// Передатчик команд управления v5.1 (23 дек 2014г) // Органы управления - 4 переменника, 9 кнопок. // Механизмы оповещения и индикации - 1мотор-вибратор, 1 светодиод //Цель: //при нажатии кнопки 1,2,3,4 отправить в сериал-порт информацию о текущем значении.(0 или 1) (канал с фиксацией значения при нажатии) //при нажатии кнопки 11 отправить в сериал-порт информацию о текущем значении.(0 или 1) (кнопка без фиксации значения) //при вращении ручки потенциометра 1-4 обработать значения с них и отправить данные в порт для каждого двигателя. (от -100 до 100, нейтральное положение - "0") //по каналу управления манипулятором передаются значения (от -100 до 0 и от 0 до 100) //по каналу управления наклоном камеры передаются значения (от 0 до 180) #define ANALOG_IN0 0 // Порт, к которому подключен переменный резистор 1 #define ANALOG_IN1 1 // Порт, к которому подключен переменный резистор 2 #define ANALOG_IN2 2 // Порт, к которому подключен переменный резистор 3 #define ANALOG_IN3 3 // Порт, к которому подключен переменный резистор 4 int LeftStickX = 0; // переменная Левого стика - ось X (вниз-вверх) int LeftStickY = 1; // переменная Левого стика - ось Y (пока неиспользуется) int RightStickX = 2;// переменная Правого стика - ось X (вперед-назад) int RightStickY = 3;// переменная Правого стика - ось Y (влево-вправо) int Pin2 = 2; //пин 2 используется для включения передачи данных по rs485 int Knopka1 = 10; //кнопка1 подключена к 3 цифровому контакту (освещение 1) (фиксируемая) int Knopka2 = 7; //кнопка2 подключена к 4 цифровому контакту (освещение 2) (фиксируемая) int Knopka3 = 8; //кнопка3 подключена к 5 цифровому контакту (освещение 3) (фиксируемая) int Knopka4 = 6; //кнопка4 подключена к 6 цифровому контакту (освещение 4) (фиксируемая) int Knopka7 = 11; //кнопка7 подключена к 7 цифровому контакту (манипулятор - сжать) (нефиксируемая) int Knopka8 = 5; //кнопка8 подключена к 8 цифровому контакту (манипулятор - разжать) (нефиксируемая) int Knopka9 = 4; //кнопка9 подключена к 9 цифровому контакту (камера - вверх) int Knopka10 = 3; //кнопка10 подключена к 10 цифровому контакту (камера - вниз) int Knopka11 = 9; //кнопка11 подключена к 11 цифровому контакту (резервная) (нефиксируемая) int MotorPin = 12; //моторы в пульте управления подключены через транзистор к 12 цифровому контакту (пока никак не используются) //int LedPin = 13; // инициализация светодиода, светодиод в пульте управления подключен к 13 цифровому контакту int KanalMotoraLevogoGor, KanalMotoraPravogoGor, KanalMotoraPerVert, KanalMotoraZadVert; int PinUpr1 = 13; int flag1, flag2, flag3, flag4 = 0; int KanalKn1, KanalKn2, KanalKn3, KanalKn4 = 0; void setup() { Serial.begin(115200); // скорость передачи данных в мониторе порта = 115200. // Инициализируем цифровые входы/выходы с 3 по 11 в режиме входов. pinMode(Knopka1, INPUT); // назначить выводу порт ввода digitalWrite(Knopka1, HIGH); // активируем подтягивающий резистор 20ком к питанию. pinMode(Knopka2, INPUT); //....... digitalWrite(Knopka2, HIGH); pinMode(Knopka3, INPUT); digitalWrite(Knopka3, HIGH); pinMode(Knopka4, INPUT); digitalWrite(Knopka4, HIGH); pinMode(Knopka7, INPUT); digitalWrite(Knopka7, HIGH); pinMode(Knopka8, INPUT); digitalWrite(Knopka8, HIGH); pinMode(Knopka9, INPUT); digitalWrite(Knopka9, HIGH); pinMode(Knopka10, INPUT); digitalWrite(Knopka10, HIGH); pinMode(Knopka11, INPUT); digitalWrite(Knopka11, HIGH); pinMode(PinUpr1, OUTPUT); } void loop() { // -----------------НАЧАЛО СЧИТЫВАНИЙ ПОКАЗАНИЙ СТИКОВ И ОТПРАВКА ЗНАЧЕНИЙ В ПОРТ----------------- LeftStickX = analogRead (ANALOG_IN0); LeftStickY = analogRead (ANALOG_IN1); RightStickX = analogRead (ANALOG_IN2); RightStickY = analogRead (ANALOG_IN3); Serial.print ("LeftStick-X "); Serial.println (LeftStickX); Serial.print ("LeftStick-Y "); Serial.println (LeftStickY); Serial.print ("RightStick-X "); Serial.println (RightStickX); Serial.print ("RightStick-Y "); Serial.println (RightStickY); Serial.println ("---------"); // -----------------КОНЕЦ СЧИТЫВАНИЙ ПОКАЗАНИЙ СТИКОВ И ОТПРАВКА ЗНАЧЕНИЙ В ПОРТ----------------- // -----------------НАЧАЛО ТЕСТА ПРОВЕРКИ РАБОТЫ КНОПОК (при каждом нажатии на кнопку вспыхивает светодиод)( в окончательном коде закомментировать все строчки----------------- // if (digitalRead(Knopka1) == HIGH && digitalRead(Knopka2) == HIGH && digitalRead(Knopka3) == HIGH && digitalRead(Knopka4) == HIGH && digitalRead(Knopka7) == HIGH && digitalRead(Knopka8) == HIGH && digitalRead(Knopka9) == HIGH && digitalRead(Knopka10) == HIGH && digitalRead(Knopka11) == HIGH ) // { digitalWrite (LedPin, LOW); // } // else { digitalWrite (LedPin, HIGH); // } // -----------------КОНЕЦ ТЕСТА ПРОВЕРКИ РАБОТЫ КНОПОК----------------- // -----------------НАЧАЛО ПРЕОБРАЗОВАНИЯ ДАННЫХ С КНОПОК И ПЕРЕМЕННИКОВ В ФОРМАТ ДЛЯ ПЕРЕДАЧИ ПО SERIAL----------------- // (-) канал вперед-назад-влево-вправо) RightStickX = constrain(RightStickX, 20, 1000); RightStickY = constrain(RightStickY, 20, 1000); KanalMotoraLevogoGor = map(RightStickX, 20, 1000, 100, -100); KanalMotoraPravogoGor = map(RightStickX, 20, 1000, 100, -100); // (+) начало обработки канала погружения-всплытия) LeftStickX = constrain(LeftStickX, 20, 1000); KanalMotoraPerVert = map(LeftStickX, 20, 1000, 100, -100); KanalMotoraZadVert = map(LeftStickX, 20, 1000, 100, -100); // (+) канал кнопки 1 if(digitalRead(Knopka1)==LOW&&flag1==0) //если кнопка нажата и переменная flag равна 0 , то ... { digitalWrite(PinUpr1,!digitalRead(PinUpr1)); flag1=1; } if(digitalRead(Knopka1)==HIGH&&flag1==1) //если кнопка нажата повторно и переменная flag равна 1 ,то ... { flag1=0; } //обнуляем переменную flag if(digitalRead(PinUpr1)==!HIGH) //если кнопка не нажата и переменная flag равна 1 , то ... { KanalKn1=1;} if(digitalRead(PinUpr1)==!LOW) //если кнопка не нажата и переменная flag равна 0 , то ... { KanalKn1=0;} // -----------------КОНЕЦ ПРЕОБРАЗОВАНИЯ ДАННЫХ С КНОПОК И ПЕРЕМЕННИКОВ В ФОРМАТ ДЛЯ ПЕРЕДАЧИ ПО SERIAL----------------- // -----------------НАЧАЛО ПЕРЕДАЧИ ПРЕОБРАЗОВАННЫХ И ОБРАБОТАННЫХ ДАННЫХ ПО SERIAL----------------- digitalWrite (Pin2, HIGH); // активация передачи данных по rs485 Serial.print('A'); //метка начала передачи значения канала "а" Serial.println(KanalMotoraLevogoGor); //....... Serial.print('B'); Serial.println(KanalMotoraPravogoGor); Serial.print('C'); Serial.println(KanalMotoraPerVert); Serial.print('D'); Serial.println(KanalMotoraZadVert); Serial.print('E'); Serial.println(digitalRead(KanalKn1)); Serial.print('F'); Serial.println(digitalRead(KanalKn2)); Serial.print('G'); Serial.println(!digitalRead(Knopka3)); Serial.print('H'); Serial.println(!digitalRead(Knopka4)); Serial.print('I'); Serial.println(!digitalRead(Knopka7)); Serial.print('J'); Serial.println(!digitalRead(Knopka8)); Serial.print('K'); Serial.println(!digitalRead(Knopka9)); Serial.print('L'); Serial.println(!digitalRead(Knopka10)); Serial.print('M'); Serial.println(!digitalRead(Knopka11)); Serial.println("------------------END------------------"); //конец передачи. // -----------------КОНЕЦ ПЕРЕДАЧИ ПРЕОБРАЗОВАННЫХ И ОБРАБОТАННЫХ ДАННЫХ ПО SERIAL----------------- delay(10); // delay(1000); // Задержка в 1000 включается только при проверке работоспособности осей стиков в мониторе порта. // Для включения задержки необходимо раскомментировать строку // Просматривать значения можно в Мониторе порта // В рабочем режиме задержка нужно установить = 10 }
Добрый день!
Не совсем понятно задание. Из описания - все просто (даже элементарно), тем более у вас есть программа. В чем подвох?
Дело в том, что катастрофически не хватает времени на изучение программирования. И так хотел запустить аппарат летом 2014, но загвоздка в программе была, хотел сам изучить, но дальше азов не продвинулся. Программа может пока легкая, только будет обрастать доп. Функциями. Подвоха нет, просто нужна помощь человеку-железячнику в программировании.
При нажатии на ссылку она не открывается. Чтобы открыть, необходимо стереть в конце ссылки 1 пробел.
Добрый вечер.
Искал ответ по синхронизации передачи данных по RS485 и случайно увидел Ваше сообщение. Сам сейчас с другом делаем наброски по аналогичному проекту - проект подводного телеуправляемого аппарата. Приятно видеть, что не только нам лавры Кусто не дают уснуть:).
Тоже делаю на RS485 передачу управления, делаю в свободное время.
По коду
Имеется код, который был написан ранее (если он подходит - отталкиваться необходимо от него)
Не рекомендовал бы использовать данный код в готовом решении.
Начнем с UART (Serial), лучше делать отправку и получение на прерываниях + передача байтами + кольцевой буфер, это уменьшит размер кода и сделает его более эффективным, без лишних задержек.
Более рациональное использование ресурсов позволит в будущем иметь запас по расширению, к примеру, для стабилизации при течении (акселерометр, гироскоп) и т.д. Тем более
wenom86 пишет: Программа может пока легкая, только будет обрастать доп. Функциями.
Примерное описание, данной реализации с неплохим пояснением.
Крайне не желательно использовать delay в loop.
Вы являетесь заказчиком, рекомендовал бы изменить требования к коду для разработчика.
Проект как я понял, почти закончен. Но возможно, будет полезно использование Playstation joystick, вместо кнопок. Более подробно тут.
Будут вопросы, пишите.
Artur1985, а с вашими набросками можно познакомиться?
Отчасти, увы нет времени их публиковать. Сейчас проходят тесты отдельные модули, работы еще много, в том числе и кодинга.
Я пишу коды и разбераюсь с электроникой, мой друг механикой и корпусом.
Вот пару фото

Габариты 164*156*202мм.
Меня, как волонтера, именно кодовая часть интересует.
Тут все очень сильно зависит от конкретного Rov. К примеру, для классического Rov, данные идут с береговой станции на Rov, а телеметрия отображается на видео сигнале. К примеру на той же MAX7456.
Я не стал изобретать велосипед и воспользовался проектом Multiwii, там хорошая схема передачи данных, простой протокол + проверенный IMU. Сейчас подпиливаю под собственные нужды протокол и думаю над синхронизации RS-485. У меня не классический Rov, данные идут в обе стороны.
Меня, как волонтера, именно кодовая часть интересует.
Готового решения у меня пока нет, делается в свободное время.
Мое решение, без доработки использовать не получится. Да можно будет взять саму передачу данных, но протокол придется переписывать. Так как он будет заточен, под особенности моего Rov.
Добрался до рабочего компа, как я говорил, лучше если Вы посмотрите код оригинала.
Вот мой код, по сути код от MultiWii, лишь изменена стилистика.
Так же начал вставлять комментарии.
UART.cpp
UART.h
Config.h
Def.h
Protocol.cpp
Protocol.h
.ino
Удачи!
Да чуть не забыл, у меня пока нет рабочего протокола, смотрите MultiWii, там пример протокола. Отправка и получение, вставленны лишь для проверки.
Спасибо!
Не за что, тут все помогают друг другу по мере сил.
Здравствуйте Artur1985 и Gippopotam. Телеметрия у меня будет выводиться именно на MAX7456. Первоначальный код действительно не самый удачный, как я посмотрю. О нем, если нужно, можно благополучно забыть.
День добрый wenom86.
wenom86 пишет:
Телеметрия у меня будет выводиться именно на MAX7456.
Тоже пока остановился на этой микросхеме. Если Вы покупали модуль, не подскажите где?
Ни РФ, ни в Китае не нашел отдельного модуля, есть платы OSD, но они совмещены с контролером, а как к ним подключится еще тот вопрос.
Доставка из США пока для меня не доступна.
А что с этими не так?
http://www.ebay.com/itm/170934217208?_trksid=p2059210.m2749.l2649&ssPage...
А что с этими не так?
http://www.ebay.com/itm/170934217208?_trksid=p2059210.m2749.l2649&ssPage...
MAX7456 заказывал летом с алиэкспреса. за 2 штуки вместе вышло около 11 баксов. Но это только 2 голые микрушки (обвес там, как я посмотрел, копеечный, у нас в радиомагазине все докупил)
Artur1985. Можете скинуть мне свою электронку? или напишите мне на wenom86@mail.ru Думаю нам есть о чем пообщаться.
MAX7456 заказывал летом с алиэкспреса. за 2 штуки вместе вышло около 11 баксов. Но это только 2 голые микрушки (обвес там, как я посмотрел, копеечный, у нас в радиомагазине все докупил)
Понятно думал используете модуль.
Пока стараюсь найти модуль, но если не получится найти, придется делать так же.
Artur1985. Можете скинуть мне свою электронку? или напишите мне на wenom86@mail.ru Думаю нам есть о чем пообщаться.
Разумеется, письмо отправил.
Андрей, а чем тебя не устроила обычная система управления "штатная" для RC ? с многоканальным же передатчиком/приемником. тебе и нужно всего ничего, исключить ВЧ составляющую и подавать PPM напрямую (с тренерского разьема например) через физический интерфейс типа 485 или что то подобное прямо двумя проводами, на дешифратор-приемника, дальше все "родное". дешифраторов там же обсуждалось в нескольких местах.
С wenom86 моя связь оборвалась, хотел сделать реализацию под его задачи (строители Rov, должны помогать друг другу, нас осталось мало:)), но так как точно не вижу задачи, не рискну делать.
Мой код передачи данных можно увидеть тут. Будут вопросы, буду стараться отвечать по мере сил.
Сейчас прервался в написании кода, конструирую винты, редуктора, подбираю моторы (пока не рискну делать сам). Да и на работе дел прибавилось.