Управление сервоприводами джойстиком через радиомодуль RF-5V

apendics
Offline
Зарегистрирован: 20.02.2018

http://wiki.amperka.ru/%D1%80%D0%BE%D0%B1%D0%BE%D1%82%D0%BE%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D0%BA%D0%B0:%D1%81%D0%B5%D1%80%D0%B2%D0%BE%D0%BF%D1%80%D0%B8%D0%B2%D0%BE%D0%B4%D1%8B

Библиотека Servo не совместима с библиотекой VirtualWire для работы с приёмником и передатчиком на 433 МГц.

Вот сайт, тут же пишут про что я говорил изначально. Может в этом проблема и стоит вернуться к первой библиотеке???

Там же они предлагают библиотеку Servo2, но ничего не меняется, всё остается по прежнему не понятным. Вот какая картина у нас VirtualWire работает корректно, но Servo у нас не работает, т.е. две сервы при 5В стоят на месте, а при 3.3В хаотично двигаются, при этом мешая корректно работать библиотеке VirualWire, т.к. ничего не поступает в монитор порта.

apendics
Offline
Зарегистрирован: 20.02.2018

Попробовал проверить работоспособность серво, вернулся к самому первому скетчу из сообщения №1. Серво работают и хаотично не двигаются, а напрямую подчинаются командам с джойстика. Следовательно, где то в скетчах косяк, либо косяк в конфликте библиотек. И что с этим делать?

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, а какие вам в голову приходят варианты кроме как:

1) Рыть упорно самому;

2) Заинтересовать кого-то другого, чтобы он рыл за вас.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

apendics пишет:

Приемник питается от 5В, сервы от 3.3В

От разных источников? Или от одного. Разведите на разные.

apendics
Offline
Зарегистрирован: 20.02.2018

От разных 

cray
Offline
Зарегистрирован: 25.01.2018

apendics пишет:

От разных 

А общую фотографию можете запостить ?

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

ЗЫЖ Сервы должны от 5В питаться.

cray
Offline
Зарегистрирован: 25.01.2018

sadman41 пишет:

Скоро обнаружите, что там сосед евонный в эфир срет...

ЕвгенийП, может действительно помехи от серв забивают приемник ?

То что приемник "без приемника" из 69 сообщения работает - наводит именно на эту мысль.

Как вариант сделать в передатчике и передачу в эфир и управление сервами, а в приемнике оставить только вывод в сериал.

Если при физическом подключении серв к передатчику приемник перестает что-либо ловить - то либо искать другие сервы, которые не срут в эфир, либо переходить на другие модели радиоприемника/передатчика.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, тоже думаю, что кто-то срёт в эфир. Либо сами сервы, либо их обвязка.

У меня с этой парой приёмник/передатчик была весёлая история с засёром эфира. Ошибся в программе и вместо 10 попыток передачи, фигачил передачу просто постоянно. Всё типа классно работало, приёмник включал и выключал то, что должен включать и выключать - всё здорово! Только потом заметил, что отвалилась метостанция (какая-то простая от Vitek, но с вынесенными на улицу датчиками) и ворота перестали открываться с брелока. Надо ж было так эфир засрать!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

apendics, Вы решили проблему?

А то я заказал вчера (по другому поводу) пару серв, как приедут, могу вернуться к этой теме и попытаться помочь Вам её дожать. Надо или всё уже решено? Если надо, то я апну тему, когда сервы придут (месяц, конечно, но всё же).

apendics
Offline
Зарегистрирован: 20.02.2018

Надо 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Хорошо, я тему сохраню в закладках, а как придут апну. Но это месяц примерно (China Post Registered Air Mail), да ещё пока продавец отправит. В общем, как только, так сразу.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

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

apendics, если Вам ещё актуально, смотрите. Вот макетка, на которой видны все соединения. Слева передатчик, справа - приёмник.

Как видите, передатчик ни с чём не соединён, как и положено, а сервы имеют общую землю с приёмником. Передатчик работает от 5В (что для него голодный паёк), но на таком расстоянии более или менее работает даже без антенны. Сервы питаются отдельно от лабораторного блока - 5В.

Вот скетч передатчика (читайте комментарии). В нём используется штатная библиотека VirtualWire. Он передаёт углы для серв, двигая их от 10 до 170 градусов и обратно. Первую серву крутит вдвое медленнее, чем вторую (смотрите шаги – 5 и 10).

#include <VirtualWire.h>

#define	PIN_DATA	A5

//
//Структура для передачи приёмнику. 
//Сделано предельно упрощённо, на практике так лучше не делать, 
//т.к. если у Вас более одного устройства на этой частоте, 
//приёмнику неоткуда узнать его это пакет или чужой (разве что 
//по длине, но длины могут совпасть). На практике, я предваряю 
//каждый такой пакет сигнатурой (просто 4-байтовое число) – в 
//первых трёх байтах уникальный код, а в старшем – длина пакета. 
//Приёмник проверяет уникальный код и длину, и если всё совпало – 
//считает это сообщение своим, иначе – игнорирует.
//
struct ServoPackage {
	int firsServoAngle;
	int secondServoAngle;
};

void setup() {
    vw_set_tx_pin(PIN_DATA);
    vw_setup(2000); 
}

//
//Здесь передача производится при каждом проходе loop – это сделано 
//потому, что в примере используется передатчик на самом голодном 
//(минимальном) питании и без антенны – некоторые посылки могут 
//теряться. На практике так делать нельзя, т.к. эфир сильно 
//загадится и в доме перестанут работать другие устройства на 
//этой частоте. По уму нужно делать либо обратную связь – 
//подтверждение приёма, либо хотя бы передачу несколько раз, 
//но не постоянно.
//
void loop() {
	static ServoPackage package = { 10, 170 };
	static int step1 = 5, step2 = -10;
	vw_send((byte *) & package, sizeof(ServoPackage));
 	vw_wait_tx();
 	static uint32_t startInterval = 0, interval = 50;
 	if (millis() - startInterval > interval) {
 		startInterval = millis();
	 	package.firsServoAngle += step1;
	 	package.secondServoAngle += step2;
	 	if (package.firsServoAngle == 10 || package.firsServoAngle == 170) step1 = -step1;
	 	if (package.secondServoAngle == 10 || package.secondServoAngle == 170) step2 = -step2;
 	}
}

А вот скетч приёмника, здесь используется моя VirtualWire2 (я Вам её давал), которая работает со вторым таймером и потому не конфликтует с библиотекой Servo.

#include <Servo.h>
#include <VirtualWire2.h>

#define	PIN_DATA	A4

#define PIN_FISRT_SERVO	5
#define PIN_SECOND_SERVO	6

struct ServoPackage {
	int firsServoAngle;
	int secondServoAngle;
};

static Servo servo1, servo2;

void setup(void) {
	servo1.attach(PIN_FISRT_SERVO);
	servo2.attach(PIN_SECOND_SERVO);
	vw_set_rx_pin(PIN_DATA);
	vw_setup(2000);
	delay(500);
	vw_rx_start();
}

void loop() {
	static ServoPackage package;
	uint8_t buflen = sizeof(ServoPackage);
	if (vw_get_message((uint8_t *)&package, &buflen)) {
		if (buflen == sizeof(ServoPackage)) {
			servo1.write(package.firsServoAngle);
			servo2.write(package.secondServoAngle);
		}
	}
}

Работает нормально, обе сервы одновременно крутятся, причем левая вдвое медленнее правой. Проверяйте по скетчу – так и должно быть.

Разбирайтесь что у Вас там не работало, попробуйте точно воспроизвести схему, в общем, удачи!

kors
Offline
Зарегистрирован: 07.08.2018

Спасибо Вам. Уже заработало. Введение двух переменных с углами решило вопрос)