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

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

apendics пишет:

Вот конечный скетч

#include <Servo.h>
#include <RCSwitch.h>
RCSwitch mySwitch;

Servo Artur1;
Servo Artur2;
union Packet {
  unsigned long lval;
  struct {
    int q;
    int z;
  } ;
} packet;

void setup() {
  Artur1.attach(9);
  Artur2.attach(10);
  Artur1.write(packet.z);
  Artur2.write(packet.q);
  delay(500);
  Serial.begin(115200);
  Serial.println("Fun begins!");
  mySwitch.enableReceive(0);
}

void loop() {
  Artur1.write(packet.z);
  Artur2.write(packet.q);
  if ( mySwitch.available() ) {
    packet.lval = mySwitch.getReceivedValue();
    Serial.print("q="); 
    Serial.print(packet.q);
    Serial.print("   z="); 
    Serial.print(packet.z);
    Serial.print("   time="); 
    Serial.println(millis());
  }
  
  delay(1000);
}

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

А нахрена Вы вставили управление сервой до того, как получили числа? Вы числа по радио получаете в строке 30. А что Вы там в серву-то пихаете в строках 27-28?

Значит, строки 27-28 переносим в позицию между строками 36 и 37.

И что в лупе делает delay(1000), а заодно и delay(15);? Вам надо читать сигнал как только пришёл, а не спать в делэях. Удаляйте.

Но при этом перестаёт работать mySwitch.available(), сейчас я буду разбираться что там в библиотеке сбросить надо, но делэи здесь не нужны (и вредны) в любом случае.
apendics
Offline
Зарегистрирован: 20.02.2018

Заменил всё как Вы написали, видео прикрепляю, удалю после Вашего просмотра, 

https://vk.com/videos59230953?section=uploaded&z=video59230953_456239074...

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

Фигушки, там "Страница доступна только авторизованным пользователям". Но это не важно.

У меня много новостей.

1. Если убрать delay, то углы валятся постоянно не ожидая никакой секунды. Решение простое, после чтения угла сбрасывать available при помощи функции mySwitch.resetAvailable();

2.Как только я этосделал, столкнулся с новй бедой - углы приходят не одноразово, а по нескольку штук одинаковых. Стал разбираться. оказывается библиотека RCSwitch отправляет кажду посылку 10 раз (помните выше мы говорили о потерях данных? так вот, они с ними борются).

3. Хорошо, стал проверять что пришло и, если тоже самое. что в прошлый раз, то игнорировать. Полегчало, но не до конца.

4. Иногда пакет оказывается перевран. Стал разбираться. Нашёл, что в библиотеке в строка 33-36 файла RCSwitch.cpp объявлен переменные. Они используются (изменяются) в обработчике прерывания, но объявляьб их volatile дядя будет. Пришлось присобачивать костыль - читать при запрещённых прерываниях.

В результате удалось добиться более или менее вменяемого поведения.

Значит, смотрите, что Вы сейчас пробуете.

1. Сохраните свой передатчик, он пригодится, но для начала поэкспериментируем с моим.

2. Берёте вот эти два файла 

    приёмник

#include <Servo.h>
#include <RCSwitch.h>
RCSwitch mySwitch;

#define USE_SERVO	0

#if USE_SERVO != 0
Servo Artur1;
Servo Artur2;
#endif

union Packet {
  unsigned long lval;
  struct {
    int q;
    int z;
  } ;
} packet;

void setup() {
	Serial.begin(115200);
	Serial.println("Fun begins!");
	packet.z = 90;
	packet.q = 90;
#if USE_SERVO != 0
	Artur1.attach(9);
	Artur2.attach(10);
	Artur1.write(packet.z);
	Artur2.write(packet.q);
#endif
	delay(500);
	mySwitch.enableReceive(0);
}

static bool receiveIt(void) {
	static uint32_t lValOld = 0; // Старое значение углов
	cli();
  	if (mySwitch.available()) {
		packet.lval = mySwitch.getReceivedValue();
		mySwitch.resetAvailable();
 	}
  	sei();
	const bool res = packet.lval != lValOld;
	if (res) lValOld = packet.lval;
  	return res;
}


void loop() {
	if (receiveIt()) {
		Serial.print("q=");
		Serial.print(packet.q);
		Serial.print("   z=");
		Serial.print(packet.z);
		Serial.print("   time=");
		Serial.println(millis());
#if USE_SERVO != 0
		Artur1.write(packet.z);
		Artur2.write(packet.q);
#endif
	}
}

    передатчик

#include <RCSwitch.h>

RCSwitch mySwitch;

union Packet {
  unsigned long lval;
  struct {
    int q;
    int z;
  } ;
} packet;


void setup() {
	packet.q = 100;
	packet.z = 90;
	mySwitch.enableTransmit(2);
	delay(500);
}

void loop() {
	packet.q = 190 -  packet.q;
	packet.z = 190 -  packet.z;
	mySwitch.send(packet.lval, 32);
	delay(1000);
}

    запускаете их. В мониторе порта должна наблюдаться примерно такая картинка

Fun begins!
q=100   z=90   time=796
q=90   z=100   time=2365
q=100   z=90   time=3934
q=90   z=100   time=5502
q=100   z=90   time=7070

   Как видите здесь постоянно идут команды повернуться одном до 100, а втором до 90, затем наоборот.

3. Если картинка правильная, то меняете в строке №5 приёмника 0 на 1. Запускаете. Сервы должны ходить от 90 до 100 градусов в противоположные стороны каждую секунду (полторы). Ходят?

Если ходят нормально, то попробуйте использовать свой передатчик (который уже с джойстиком) с этим приёмником. Возможно, он и не заработает, но если при моём передатчике работает, а при "настоящем" не пашет - это уже понятнее и будем дальше бороться.

Жду результатов.

apendics
Offline
Зарегистрирован: 20.02.2018
В мониторе порта всего 1 строчка, больше ничего не поступает, почему?
Fun begins!
q=90   z=90   time=499
 
Не смотря на это поменял 0 на 1, ходить на 10 градусов серво не стали, они жужат на месте и их невозможно сдвинуть, они обратно возвращаются на это же место, по крайней мере они в этот раз не крутятся самопроизвольно------
apendics
Offline
Зарегистрирован: 20.02.2018

Чисто случайно переподал напряжение, серво зашевелились, ходят туда сюда примерно на 10 градусов, а вот в мониторе порта по прежнему ничего, то есть ничего конкретного по корректной работе сказать врятли могу

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

Так, то что показалось 90 и 90 означает, что Вы что-то перепутали.

Убедитесь, что Вы загружаете именно мой приёмник и менно мой передатчик в правильные ардуины (если их подключить две, то настройка порта у них одна на двоих и запросто запутаться). На всякийй случай в строка 23 и 24 приёмника замените 90 на ... ну на 98, чтобы видно было. По крайней мере без серв (с 0 в приёмнике) всё обязано работать, у меня ж работает. Сделайте всё точно и аккуратно и не переходите к сервам пока это не дожмёте.

Если вылазит это значение, значит Вы ничего не приняли.

то что крутятся на 10 градусов обнадёживает, они и должны на 10 градусов крутиться - с 90 до 100 и обратно

--------------

Попробуйте всё-таки всё с чистого листа аккуратно проделать.

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

apendics пишет:

Чисто случайно переподал напряжение, серво зашевелились, ходят туда сюда примерно на 10 градусов, а вот в мониторе порта по прежнему ничего, то есть ничего конкретного по корректной работе сказать врятли могу

Кстати, если переподали напряжение, то монитор перезапускать надо - он отваливается. Постарайтесь аккуратно с чистого листа всё сделать.

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

Убедился с правильностью портов, в этом сложностей нет. Далее поменял на 98 и вот чудо, заработало, не понятно почему в 1 раз не работало:

Fun begins!
q=90   z=98   time=499
q=100   z=90   time=677
q=90   z=100   time=2245
q=100   z=90   time=3812
q=90   z=100   time=5380
q=100   z=90   time=6946
q=90   z=100   time=8514
q=100   z=90   time=10082

 

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

Поменял 0 на 1, и снова 1 строка и более ничего:

Fun begins!
q=90   z=98   time=499
Дополнение: сервы зажужали, если это сыграет какую то роль, но не ходят, просто стоят на 1 месте
Дополнение2: пробовал с изначальным скетчем передатчика, результат точно такой же
 
 
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Блин, вот серв-то у меня как раз и нету, чтобы попробовать. так что придётся Вам отдуваться.

Делайте два эксперимента:

1. Увеличте в моём передатчике delay(1000) до 3000

2. Запустите приёмник без серв (с 0) - убедитесь, что пеатается правильно

3. Запустите прёмник с сервами. если опть бред, то попробуйте в приёмник закомментировать ВСЁ, связанное с Serial (и begin и все print'ы). запустите и посмотрите, будут ли вертеться сервы на 10 градусов туда-сюда.

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

1 и 2 эксперимент

Fun begins!
q=90   z=98   time=499
q=90   z=100   time=1635
q=100   z=90   time=5201
q=90   z=100   time=8712
q=100   z=90   time=12278
q=90   z=100   time=15901
q=100   z=90   time=19469

Вроде работает корректно

3 эксперимент

Fun begins!
q=90   z=98   time=499

Более ничего, зажужали сервы, стоят на 1 месте, не двигаются. Закоментировал, без изменений

Дополнение: 0 на 1 менять только в 5 строчке? Я пробовал везде менять, так вот, если везде 1, то серва молчит.
То есть, два серва я в произвольное положение ставлю, запускаю работу, два серва встают в это самое положение, которое видимо задано программой и гудят

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

Нет, конечно, только в 5-ой

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

Оставил я серво и отошел покурить, прихожу, в мониторе порта появились сообщения, но сами судите, сколько времени прошло судя по строке тайм

Fun begins!
q=90   z=98   time=499
q=90   z=100   time=19697
q=100   z=90   time=23206
q=90   z=100   time=155288
q=100   z=90   time=215808

 

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

apendics пишет:
Закоментировал, без изменений
Но В сериал-то ничего не печатается, так же?

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

Естесственно

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

Стоп, если Вы закомментируете всё связанное с сериалом, то нифига поялвться не должно! Вообще ничего, т.к. с сериалом не работаем! Вы что, закомментировали, а загрузить забыли?

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

Нет, я откомментировал обратно, если закоментить, то сервы также жужат, а в мониторе порта ничего

То есть у меня сейчас стоят ваши скетчи приемника и передатчика, с единичкой в 5 строке

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

Сука. Так, давайте поймём, что не работает и почему сервы так себя ведут. Сейчас я сделаю скетч "типа приёмника", но без приёма вообще. Если сервы заработают, значит таки библиотека. В этом случае будем переходить на VirtualWire. Ту я хоть знаю хорошо. Сейчас сделаю.

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

Передатчик тут не нужен - никто не принимает ничего. Просто запустите. Если сервы не заходят взад-вперёд, закомментируйте всё, свяанное с сериалом и ещё раз запустите. Посмотрим.

#include <Servo.h>

#define USE_SERVO	1

#if USE_SERVO != 0
Servo Artur1;
Servo Artur2;
#endif

union Packet {
  unsigned long lval;
  struct {
    int q;
    int z;
  } ;
} packet;

void setup() {
	Serial.begin(115200);
	Serial.println("Fun begins!");
	packet.z = 100;
	packet.q = 90;
#if USE_SERVO != 0
	Artur1.attach(9);
	Artur2.attach(10);
	Artur1.write(packet.z);
	Artur2.write(packet.q);
#endif
}

void loop() {
	delay(2000);
	packet.q = 190 - packet.q;
	packet.z = 190 - packet.z;
	Serial.print("q=");
	Serial.print(packet.q);
	Serial.print("   z=");
	Serial.print(packet.z);
	Serial.print("   time=");
	Serial.println(millis());
#if USE_SERVO != 0
	Artur1.write(packet.z);
	Artur2.write(packet.q);
#endif
}

 

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

Давайте сразу попробуем виртуалвайр, раз эта выпендривается

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

Браво, сервы заходили, зажили своей жизнью так сказать)
Примерно на 10 градусов туда сюда и двигаются, с учетом того, что я ничего не комментировал

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

ЕвгенийП пишет:

Сука. Так, давайте поймём, что не работает и почему сервы так себя ведут. Сейчас я сделаю скетч "типа

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

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

Т.е. и сервы ходят и в монитор порта печатается. Правильно я понял?

Сцуко. Самое подлое, что я не могу понять какого рожна ей надо. Она (RCWitch) ничего собственно особого-то не делает.

Ладно, с виртуал ваир не так сразу, Вам она нужна модифицированная, т.к. оригинальная занимает первый таймер (как и серва) - точно подерутся.

У меня есть версия для второго таймера. Вам подойдёт? Он у Вас свободен? Напишите. Если подойбёд, то я передалю под неё наши приёмник и передатчик, но это вечером или завтра.

Кстати, она и лучше. Мало того, что она универсальная (а RCSwitch - специализированая), но она ещё и грамотно написана, а RCSwitch - очень любительская.

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

Давайте попробуем, вот только не знаю , что значит первое и второе время.

п.с. И сервы шевелят и монитор печатается

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

Откладываем на завтра, но в случае, если Вы сегодня выйдите на связь, я готов и сегодня доработать

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

Ну, поехали.

Не выбрасывайте никуда вчерашние скетчи, возможно мы к ним вернёмся (см. мою ремарку в конце этого сообщения).

1.
Возьимте библиотеку VirtualWire2 - она точно такая же, как оригинальная VirtualWire, только умеет работать и с таймером 2 тоже (оригинальная только с таймером 1). В моём архиве она уже сконфигурирована на таймер 2, так что Вам нужно просто распаковать архив в папку библиотек, конфигурировать ничего не надо.

2.
Возьмите скетчи приёмника

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

#define USE_SERVO	0

static int qz[2];
#define q	qz[0]
#define z	qz[1]

#if USE_SERVO
Servo Artur1;
Servo Artur2;
#endif

void setup(void) {
	Serial.begin(115200);
	Serial.println("Fun begins!");
	z = 89;
	q = 89;
#if USE_SERVO
	Artur1.attach(9);
	Artur2.attach(10);
	Artur1.write(z);
	Artur2.write(q);
#endif
	delay(500);
	vw_set_rx_pin(2);
	vw_setup(2000);
	vw_rx_start();
}

void loop() {
	uint8_t buflen = sizeof(qz);
	if (vw_get_message((uint8_t *)qz, &buflen)) { // Non-blocking
		Serial.print("q=");
		Serial.print(q);
		Serial.print("   z=");
		Serial.print(z);
		Serial.print("   time=");
		Serial.println(millis());
#if USE_SERVO
		Artur1.write(z);
		Artur2.write(q);
#endif
	}
}

и передатчика

#include <VirtualWire2.h>

static int qz[2];
#define q	qz[0]
#define z	qz[1]

void setup(void) {
	vw_set_tx_pin(2);
	vw_setup(2000);
	q = 100;
	z = 90;
}

void loop(void) {
	q = 190 -  q;
	z = 190 -  z;
	vw_send((uint8_t *)qz, sizeof(qz));
	delay(1000);
	vw_wait_tx(); // если передача не закончилась - подождать
}

3.
Тестируем также, как вчера. Т.е. сначала в приёмнике USE_SERVO - 0 (как сейчас). Если он всё примимает и печатает, ставим 1 и смотрим.

Иногда пакеты могут теряться. Это нормально, не пугайтесь. RCSwitch делала 10 попыток передачи. Здесь мы делаем только одну. Ну, потеряется и ладно, на следующей секунде дойдёт. С потерями потом разберёмся, сейчас бы ей в принципе заработать.

--------------------

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

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

Во первых, с праздником, во вторых, я сделал всё, как Вы написали, при USE_SERVO - 0 всё работает, сообщения в монитор порта поступают, только делаю единичку, сообщений не поступает никаких, как бы я близко не подносил друг к другу радиомодули :( А серво по прежнему жужат, затормозившись в 1 положении.

Если вы "почти уверены" в сильном шуме серв, то я вообще не пойму в чём дело)

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

Начал питать 3.3 В и сервы зашевелились туда сюда на 10 градусов, но в мониторе порта ничего по прежнему не появляется. изменил способ, питаю теперь сервы 3.3 В, а радиоприемник 5В. НО проблема та же, в мониторе порта пусто :( Хотя бы заставили шевелиться сервы) 

Теперь как добиться корректной передачи сообщений? 

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

Ну, если они швелятся на 10 градусов, то значит, сообщение приходят нормально, но почему-то не печатаются.

Можете попробовать в строка 10-11 передатчика вместо 100 и 90 поставить 135 и 45 соответственно, а в строках 15-16 вместо 190 поставить180. Должны начать ходить на 90 градусов.

Если ходят, значит библиотеки приёма и сервы совместимы. Почему не работает сериал - хрен его знает. Попробуйте - ходят или нет?

Кстати, им времени хватает? Они "повернутся и отдыхают" или захлёбываются?

От чего Вы их питаете? Это важно. БП у них свой?

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

Пока что я не дома, приеду, сделаю, отпишусь. Сервы захлёбываются, то есть нету пауз у них, ходят туда сюда без отдыха. Питаю от самой ардуины

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

apendics пишет:

Сервы захлёбываются, то есть нету пауз у них

Увеличьте delay в передатчике - пусть ходят с паузами. Добейтесь этого

apendics пишет:

Питаю от самой ардуины

Очень плохая идея. Просто очень, учитывая, что Вы питаете две сервы сразу.

Попробуйте подключить к отдельному БП (только земли вместе соедините). Глядишь и сериал оживёт.

 

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

delay увеличил, без изменений, сервы также нервно дергаются туда сюда. Дело в том, что отсоединив приемник от питания, они по прежнему "ходят". Получается, что радиоприем не осуществляется. Подключил сервы к отдельному источнику питания, ничего не изменилось. Опять же, при серво 0, сообщения поступают..

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

Скайп/WhatsApp иная другая связь есть? Хоть городской телефон) Обмениваясь сообщениями с часовыми перерывами мы так долго к успеху идти будем)

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

Попробуйте убрать собственно движение, но сами сервы и их подключение оставить - закомментируйте строки 23-24 и 42-43.

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

Сделал, ничего не меняется. Сервы вертятся, монитор порта пустой

Green
Offline
Зарегистрирован: 01.10.2015

.

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

Т.е. q и z не меняется, servo.write() не вызывается, а сервы постоянно туда-сюда мотает? Дьявольщиной попахивает...

 

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

При Серво 0 q и z меняются в мониторе порта, а при серво 1,  в порт ничего не поступает, а сервы двигаются

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

Думаю, что это работа для экзорциста-ардуинщика.

Ну или для того, которому не лень собрать у себя стенд. Потому что по скетчу из #76 они могут мотаться только, если в Serial Monitor что-то будет вылезать.

Кстати, не пытались ли вы просто закомментировать в нем (#76) строку #define USE_SERVO? Если сделать так, то сервоверчение продолжается?

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

Нет, не продолжается, сообщения в монитор порта поступают, серво не крутится, как и при серво 0

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

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

Т.е. если в ситуации, когда define не закомментарен и, допустим, равен 1, в Serial Monitor вы видите некоторые данные, принимаемые с удаленной стороны, но сервы физически отключены (даже по питанию), вы, ничего не меняя в программной части, просто подключаете сервы - сразу чертовщина начинается - пропадает вывод в Monitor и пр.?

 

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

Вы точно закомментировали строки 23-24 и 42-43? Т.е. программе не осталось ни одной команды Servo.write, а они всё равно вертятся? Точно? Убедитесь в этом

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

apendics
Offline
Зарегистрирован: 20.02.2018
#include <VirtualWire2.h>
#include <VirtualWire2_Config.h>
#include <Servo.h>

#define USE_SERVO  1

static int qz[2];
#define q qz[0]
#define z qz[1]

#if USE_SERVO
Servo Artur1;
Servo Artur2;
#endif

void setup(void) {
  Serial.begin(115200);
  Serial.println("Fun begins!");
  z = 89;
  q = 89;
#if USE_SERVO
  Artur1.attach(9);
  Artur2.attach(10);
//  Artur1.write(z);
 // Artur2.write(q);
#endif
  delay(500);
  vw_set_rx_pin(2);
  vw_setup(2000);
  vw_rx_start();
}

void loop() {
  uint8_t buflen = sizeof(qz);
  if (vw_get_message((uint8_t *)qz, &buflen)) { // Non-blocking
    Serial.print("q=");
    Serial.print(q);
    Serial.print("   z=");
    Serial.print(z);
    Serial.print("   time=");
    Serial.println(millis());
#if USE_SERVO
//    Artur1.write(z);
//    Artur2.write(q);
#endif
  }
}

Удостоверился, сервы все равно крутятся на 10 градусов. Это при питании 3.3 В, если же питание 5 В, они жужат, затормозившись в 1 положении. Просто и разбираться собственно не в чем) Соединений мало, всё еще раз перепроверил и всё еще раз пошевелил, всё корректотно, почему же они вертятся?

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

sadman41 пишет:

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

Т.е. если в ситуации, когда define не закомментарен и, допустим, равен 1, в Serial Monitor вы видите некоторые данные, принимаемые с удаленной стороны, но сервы физически отключены (даже по питанию), вы, ничего не меняя в программной части, просто подключаете сервы - сразу чертовщина начинается - пропадает вывод в Monitor и пр.?

Если define = 0, тогда в мониторе порта есть сообщения, если =1, тогда сообщений нету, не важно подключены ли к питанию сервы или нет

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

Евгений, так всё же, есть скайп? Я бы всё показал наглядно, может и проянилось бы всё?

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

apendics пишет:

Удостоверился, сервы все равно крутятся на 10 градусов. Это при питании 3.3 В, если же питание 5 В, они жужат, затормозившись в 1 положении. Просто и разбираться собственно не в чем) Соединений мало, всё еще раз перепроверил и всё еще раз пошевелил, всё корректотно, почему же они вертятся?

Отключите управляющий провод... 

3V - это может быть мало, внутрисервовый контроллер потенциально может подглючивать или перезагружаться сам по себе, а при включении немного прокручивать серву, что и воспринимается, как хаотическое движение. Если же при 5V серва в одном положении застыла и рукой чувствуется ее сопротивление на проворот - значит контроллеру кто-то постоянно дает пульс. Отключайте управляющий провод. Если серва перестает держаться за место, то значит с пина ардуины постоянно летит пульс. ...что, впрочем, объяснимо - при servo.attach(9); на пин начинают поступать удерживающие импульсы.

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

Отключил управляющий провод, сообщения приходят(даже где define 1), только стоит подключить управляющий провод, сообщения больше не поступают и сервоприводы при 3.3В хаотически крутятся, а при 5В зацикливаются в 1 положении.

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

Ну, в общем, на этом я закончился. Дистанционно я тут ничего не могу сделать, извините. У меня даже сервы нет в СВХ, чтобы локально попытаться воссоздать ситуацию. Может кто другой сможет понять что там происходит. Извините.

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

Так всё же, давайте свяжемся в скайпе? Я всё покажу

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

Вы и приемник, поди, от 3.3в питаете... и сервы. Сервы поехали, напругу просадили, приемник отклячился и в Монитор перестало валитью

 

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

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