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

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

Доброго времени суток. Простая задачка, которая вызывает у меня трудность. Управлять сервоприводами с помощью джойстика научился, а именно прикреплю ниже скетч, написанный мною. Но управлять им через радиомодуль RF-5V у меня никак не получается, потратил кучу времени и всё в пустую. Помогите написать программку для передатчика и приемника. То есть необходимо этот скетч, который я написал, внести в передатчик и что бы приемник принимал данные, и собственно, что бы сервоприводы двигались в нужном направлении. Собранные схемы во вложениях.

#include <Servo.h>

Servo Artur1;
Servo Artur2;

int z = 95;
int q = 95;

void setup() {
pinMode(A4,INPUT);
pinMode(A5,INPUT);
Artur1.attach(9);
Artur2.attach(10);
Artur1.write(z);
Artur2.write(q);
delay(500);
}

void loop() {
int x = analogRead(A5);
int y = analogRead(A4);
if (x>900) z=z+1;
if (x<200) z=z-1;
if (z>180) z=180;
if (z<10) z=10;
if (y>900) q=q+1;
if (y<200) q=q-1;
if (q>180) q=180;
if (q<10) q=10;
Artur1.write(z);
Artur2.write(q);
delay(15);
}

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
Строки 1, 3, 4, 12-15 и 30-31 удалете нафиг.
 
Вмесо строк 14-15 и 30-31 (в обоих местах) Всатвляете отправку по радио двух Ваших переменных z и q. Отправляете их одним пакетом (может для этого удобнее их в масси объяединить).
 
Всё, код пульта готов.
 
Пишете код приёмника. 
 
Он получается из этого же кода удаленим строк 10-11 и 20-29
 
И добавлением в setup инициализации приёмника, а в Loop приёма двух переменных z и q .
 
собственно, всё.
 
Есть там ещё нюанс с засёром эфира, но Вы сначала так сделайте, а потом о токостях поговорим.
apendics
Offline
Зарегистрирован: 20.02.2018

Напишите вашу эл. почту или же id ВК, WhatsApp, свяжусь с вами

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

Да я и здесь вполне читаю.

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

Хорошо, 1 вопрос, я подключаю библиотеку RCSwitch, далее я не знаю какими командами осуществлять передачу(в программировании я слаб), а как объединить в массив их темболее. Далее, 2 вопрос, удалив эти строки, что Вы написали, скетч становится не рабочим. Если не сложно, Вы не могли бы конкретно написать что на что менять, как для приемника, так и для передатчика, потому что я не понял даже как вставить отправку по радио.

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

Я не знаю библиотеки RCSwitch, но наверняка в ней есть примеры.

Для этой пары приёмник/передатчик, что у Вас я использовал библиотеку VirtualWire. Она отлично работает. И примеры как отправлять / получать там тоже есть.

Что значит "код становится не рабочим"? Не крутит серву? Так он и не должен. Его дело переменные по радио передать - крутить серву должен код приёмника.

Объединить в массив, ну не знаю, ну поставьте вместо строк 6 и 7 что-нибудь типа

int packet[2] = {95, 95};
#define z  packet[0]
#define q  packet[0]

Польуйтесь z и q как раньше, а по радио отправляйте packet.

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

Сейчас попробую что нибудь сделать, чуть попозже отпишусь.

Библиотека VirtualWire почему то не хочет взаимодействовать с сервоприводами, поэтому везде на форумах пишут использовать RCSwitch.

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

Виноват, опечатка. В строке 3 моего предыдущего сообщения надо packet[1]

apendics
Offline
Зарегистрирован: 20.02.2018
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();

int packet[2] = {95, 95};
#define z packet[0]
#define q packet[1]

void setup() {
mySwitch.enableTransmit(2);  
pinMode(A4,INPUT);
pinMode(A5,INPUT);
delay(500);
}

void loop() {
int x = analogRead(A5);
int y = analogRead(A4);
if (x>900) z=z+1;
if (x<200) z=z-1;
if (z>180) z=180;
if (z<10) z=10;
if (y>900) q=q+1;
if (y<200) q=q-1;
if (q>180) q=180;
if (q<10) q=10;
sendRC(packet[2]);
delay(1000);
}

Вот что получилось, при проверке пишет expected primary-expression before '=' token в 25 строчке.

В чём беда? Не пойму, что его не устроило в знаке "="?

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

Сравните Ваши строки 5 и 6 с моими из сообщения №5 (с учётом поправки - опечатки).

Вас ничего не смущает? Разницы не видите?

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

";" убрал, больше не ругается, теперь к приемнику перехожу

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

давайте.

В приёмнике сначала ничего не крутите. Просто примите два числа и выдайте их в монитор порта - потсмтрите наормально ли доходят.

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

Стоп, а это что за фигня в строке 26?

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

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

http://robotclass.ru/tag/%D1%80%D0%B0%D0%B4%D0%B8%D0%BE-433-%D0%BC%D0%B3...

и

http://homes-smart.ru/index.php/oborudovanie/bez-provodov-433-315mgts/al...

#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();

int packet[2] = {95, 95};
#define z packet[0]
#define q packet[1]

void setup() {
pinMode(2, OUTPUT);
mySwitch.enableReceive(0); 
}

void loop() {
???????????????????????????????????????????????
delay(1000);
}

Встрял на loop'e, не знаю, что писать туда, что бы принять массив?

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

Сначала надо с посылкой разобраться. Так, как Вы посылаете - неверно. Дайте посмотреть бибилотеку, подождите.

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

Здесь другой принцип передачи, потому и данные сделаем по другому.

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

1. Вместо строк 4-6 ставим

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

2. Везде, где мы использовали q и z заменяем их на packet.q и packet.z  соответсвенно

3. Строку 26 заменяем на 

mySwitch.send(packet.lval, 32);

4. в функции setup в любом месте вставьте

 packet.q = 95;
 packet.z = 95;

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

Тогда займёмся приёмником.

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

#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();

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


void setup() {
packet.q = 95;
packet.z = 95;

mySwitch.enableTransmit(2);  
pinMode(A4,INPUT);
pinMode(A5,INPUT);
delay(500);
}

void loop() {
int x = analogRead(A5);
int y = analogRead(A4);
if (x>900) packet.z=packet.z+1;
if (x<200) packet.z=packet.z-1;
if (packet.z>180) packet.z=180;
if (packet.z<10) packet.z=10;
if (y>900) packet.q=packet.q+1;
if (y<200) packet.q=packet.q-1;
if (packet.q>180) packet.q=180;
if (packet.q<10) packet.q=10;
mySwitch.send(packet.lval, 32);
delay(1000);
}

Ошибка такая error: 'union Packet' has no member named 'lval' в 34 строке



kalapanga
Offline
Зарегистрирован: 23.10.2016

Имена переменных регистрочувствительные, а у Вас в одном месте lVal, а в другом lval. Сделайте одинаково.

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

Изменил, всё откомпилировало, что дальше делаем?

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

Всё, приёмник делайте. Всё как по Вашей ссылке

void loop() {
    if( mySwitch.available() ){
        unsigned long value = mySwitch.getReceivedValue();
       Serial.print(value);
        mySwitch.resetAvailable();
    }
}

Ну, там в сетапе Serial.being не забудьте.

Скомпилируйте. оставьте работать. Запустите передатчик, пусть передаст. Скажите, что получается в мониторе порта у приёмника.

По идее должно быть 1593859840, но могу ошибиться. В любом случае скажите мне что там получается.

Остальная часть приёмника как по Вашей ссылке!

apendics
Offline
Зарегистрирован: 20.02.2018
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();

int packet[2] = {95, 95};
#define z packet[0]
#define q packet[1]

void setup() {
Serial.begin(9600);
pinMode(2, OUTPUT);
mySwitch.enableReceive(0); 
}

void loop() {
if( mySwitch.available() ){
unsigned long value = mySwitch.getReceivedValue();

Serial.print(value);
mySwitch.resetAvailable();
}
delay(1000);
}

Вот код из приемника, но на экране порта ничего не отображается

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

Остальная часть приёмника как по Вашей ссылке!

Что именно вставлять, не понял?
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, как там? 

Кстати, может разумнее в пятой строке поставить Serial.print(value, HEX);

Тогда результат в сериале по идее должен быть 5F005F00

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

Ну. строки 4-6 не нужны.

Что значит ничего не отображается. Передатчик запускали?

Он будет печатать только тогда, когда получит что-то от передатчика.

Да, кстати, пока в передатчике можно закомментировать строки 24-33, чтобы под ногами не путались. Добъёмся, что 95 передалось, тогда раскомментируем.

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

Вот так получается)

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

Ну, расскажите подробно. Передатчик работает? На другой ардуине?

Если работает, выложите актуальные коды приёмника и передатчика.

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

В общем, сейчас я ухожу, завтра продолжим.

Пока сделайте. что я просил - дайте актуальные коды.

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

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

apendics
Offline
Зарегистрирован: 20.02.2018
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();

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


void setup() {
packet.q = 95;
packet.z = 95;

mySwitch.enableTransmit(2);  
pinMode(A4,INPUT);
pinMode(A5,INPUT);
delay(500);
}

void loop() {
int x = analogRead(A5);
int y = analogRead(A4);
if (x>900) packet.z=packet.z+1;
if (x<200) packet.z=packet.z-1;
if (packet.z>180) packet.z=180;
if (packet.z<10) packet.z=10;
if (y>900) packet.q=packet.q+1;
if (y<200) packet.q=packet.q-1;
if (packet.q>180) packet.q=180;
if (packet.q<10) packet.q=10;
mySwitch.send(packet.lval, 32);
delay(1000);
}

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

#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();

int packet[2] = {95, 95};
#define z packet[0]
#define q packet[1]

void setup() {
Serial.begin(9600);
pinMode(2, OUTPUT);
mySwitch.enableReceive(0); 
}

void loop() {
if( mySwitch.available() ){
unsigned long value = mySwitch.getReceivedValue();

Serial.print(value, HEX);
mySwitch.resetAvailable();
}
delay(1000);
}

Это приемник

На экране монитора ничего не отображается, шаманил, но ничего не получилось, схема собрана вроде правильно, ничего не отходит. Завтра попробую затестить просто работоспособность радиомодулей. До этого проверял на светодиоде, работало. Тогда завтра выходите на связь и попробуем что нибудь нашаманить.
Если что, пишите на электронку 1997apendics@gmail.com

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
Когда не получается, всегда уменьшайте сложность, выбрасывая лишнее. Вот сейчас у нас не получается передача - значит джойстики и серву - нафиг.
 
ПЕРЕДАТЧИК
 комментируйте строки 18-19 и 24-33. Остаётсе только передача и ничего лишнего.
 
ПРИЁМНИК
Вы уверены, что он у Вас подключён к 2-му пину? А зачем Вы пин на OUTPUT конфигурите? Не думаю, что в этом корень проблемы, но по-любому это неправильно - убирайте строку 10 - она точно не нужна, а может и вредит.
 
После испытаний, выложите свежие скетчи.
apendics
Offline
Зарегистрирован: 20.02.2018

Сделал всё так, как Вы написали, безуспешно, в мониторе порта по прежнему ничего

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

Уже часа 2 тестирую просто работоспособность радиомодулей, никак не могу добиться передачи данных, почему то ничего не выводит мне на экран, кроме сетапа. МОжет стоить купить новые модули, а эти стоит заменить?

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

 Как я Вам говорил, я впервые вижу эту библиотеку, потому не могу сказать ничего о ней толком. Давайте сделаем так, я сегодня попозже (когда до СВХ доберусь) возьму такую же как у Вас пару приёмник / передатчик (их есть у меня) и попробую сам с этой библиотекой. Если получится, я выложу Вам скетчи и точную инструкцию по соединению. Если же не получится, я посмотрю почему не работает VirtualWire с сервой. Если там дело в таймере (как мне кажется) то у меня есть версия VirtualWire для этого радиомодуля на другом таймере - возьмём её. А уж тогда (если вдруг одни и те же скетчи у меня заработают, а у Вас нет), тогда будем думать об исправности аппаратуры. Пока рано.

Пока же, давайте уточним.

На Ваших фото я вижу передатчик, он такой же как у меня. Приёмник, видимоЮ тоже. Вот такая пара у Вас?

И библиотека Servo у Вас стандартная? Из поставки IDE? Какая версия IDE?

В общем, ответьте на мои вопросы, а я как только доберусб до СВХ, всё попробую и отпишусь.

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

Да, один в один. А я сегодня съезжу и куплю новые детали. Где то пишут, что их питают 3.3В, а где то 5В. Я всегда питал 5В, как думаете, можно было спалить ее 5 В?

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

Опа! Так может он потому у Вас и не передаёт. Хотя у меня от 5 недалеко, но передавал.

Питать их надо:

приёмник - от 5В (у него на спине написано название в котором 5V фигурирует)
передатчик - от 12В. В принципе от пяти работает (если на 10 см.), но чем больше. тем выше "дальнобойность")

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

На второй вопрос не забудьте ответить.

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

Всегда 5 питал и приёмник и передатчик, а расстояние между ними 5-20 см. Мне этого будет достаточно.

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

Servo.h. Версия ардуино IDE последняя, отошёл от компьютера и пока не могу сказать точно цифры

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

Как подойдёте - скажите.

Теперь новости для Вас.

Я добрался до своего СВХ.

Начал с того, что проверил свои приёмник и передатчик при помощи очень маленьких скетчей на VirtualWire. Запустил такую конфигураци. Передатчик работает сам по себе и раз в секунду шлёт в эфир слово Hello. Приёмник постоянно слушает эфир и печатает в монитор порта всё, что "услышал". Всё работает отлично, слово Hello раз в секунду в монитор порта печатется. И приёмник и передатчик питаются от 5В. На приёмнике имеется небольшая антенна, её хорошо видно на снимке (когда-то впаял туда ножку от резистора, которая была отрезана при впайке резистора на плату, я храю такие ножки в коробочке - ценная вещь :))))  И приёмник и передатчик подлючены ко вторым пинам своих ардуин (это тоже видно на снимке)

Теперь я покурю и начну эксперименты с Вашей библиотекой.

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

Снимок - https://drive.google.com/open?id=1AirQPCqhIh8Nuyi5arZrmUOVIg802O0j

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

#include <VirtualWire.h>

#define	DATA_PIN	2

void setup() {
    vw_set_tx_pin(DATA_PIN);
    vw_setup(2000);       // Bits per sec
}

void loop() {
	static uint8_t * packet = (uint8_t *) "Hello!!!";
	vw_send(packet, strlen((const char *) packet) + 1);
 	vw_wait_tx();
	delay(1000);
}

Скетч приёмника

#include <VirtualWire.h>

#define	DATA_PIN	2

void setup() {
	delay(500);
	Serial.begin(115200);
	Serial.println("Fun begins!");

	vw_set_rx_pin(DATA_PIN);
	vw_setup(2000);
	vw_rx_start(); 
}

void loop() {
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;

	if (vw_get_message(buf, &buflen)) {
		Serial.print("Got: ");
		Serial.println((char *)buf);
	}
}

Проверяйте, у меня работает. Я же начинаю Вашу библиотеку мучать.

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

Имейте в виду, что Servo.h рулит сервой, сидя на прерывании таймера. И RCSwitch тоже висит на прерывании. Так что, потенциально, они могут сталкиваться лбами. Посылки на слейва, думаю, надо повторять раз несколько.

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

Так, есть хорошие новости.

Похоже, я вчера просто недостаточно внимательно смотрел на Ваш код и не заметил, что Вы написали

RCSwitch mySwitch = RCSwitch();

разумеется, так нельзя (скажем, "не стоит"), надо

RCSwitch mySwitch;

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

Передатчик

#include <RCSwitch.h>

RCSwitch mySwitch;

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


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

void loop() {
  mySwitch.send(packet.lval, 32);
  delay(1000);
}

Приёмник

#include <RCSwitch.h>
RCSwitch mySwitch;

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

void setup() {
  Serial.begin(115200);
  Serial.println("Fun begins!");
  mySwitch.enableReceive(0);
}

void loop() {
  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);
}

На стороне приёмника запущен монитор порта, вот что он выдаёт

Fun begins!
q=95   z=87   time=1000
q=95   z=87   time=2000
q=95   z=87   time=3001
q=95   z=87   time=4002
q=95   z=87   time=5003
q=95   z=87   time=6003
q=95   z=87   time=7004
q=95   z=87   time=8005
q=95   z=87   time=9006
q=95   z=87   time=10006
q=95   z=87   time=11006
q=95   z=87   time=12008
q=95   z=87   time=13008

Т.е. всё отлично. Каждую секунду мы принимаем сигнал. И сигнал правильный. Некоторое нарастающее отставание по времени объясняется просто - мы же делаем паузу на секунду, а собственно время выполнения команд и даёт это нарастание.

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

Теперь Ваша задача,

1. запустить и убедиться, что модули живы и всё классно работает.
2. Не меняя пока скетч приёмника, вставить в скетч передатчика Ваши дела с джойстиком (просто всё, что надо скопируйте из своего вчерашнего скетча) и убедиться что при работе с джойстиком в мониторе порта приёмника печатаются правильные числа.

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

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

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

Коллега в посте #37 всё правильно говорит, но пока не парьтесь, мы до этого ещё доберёмся. Если библиотека подерётся с сервой, предлагаю перейти на VirtualWire - её я знаю и быстро ей мозги вправлю. . Что же касается посылки несколько раз, это особенно важно т.к. Вы хотите держать передатчик на голодном пайке (5В вместо 12), потому потери данных будут даже чаще, чем обычно.

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

sadman41 пишет:

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

Да, я в курсе, но ТС мне говорил, что где-то читал, что серва дерётся с VirtualWire, а RCSwitch вроде как не дерётся. Посмотрим. Но это даже не важно, у меня есть "самогонные" версии VirtualWire на любой таймер, так что разрулим. Ну, а про потерю данных - это да. Плавали, знаем :))) Я вообще много использую эту радиопару. Соит "рупь за ведро", а для моих нужд служит отлично.

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

Еду пока что за новым радиомодулем, как приеду, начну шаманить, отпишусь сразу

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

Валяйтё, но, возможно, с модкем поторопились. Хотя, лишним не будет. Я их покупаю десятками :)

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

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

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

Не знаю, как вы беретесь за задачи с коммуникациями, если даже скорость в Serial Monitor поменять не можете. Диктант будете писать под управлением Евгения или на шею ему сразу сядете?

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

Картинка неполная, но сильно подозреваю, что в правом нижнем углу указана скорость 9600, а в моих скетчах везде 115200.

Сделайте одинаково. Неважно где менять, но одинаково чтобы было.

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

sadman41, нет, это нормальный парень. Скетч писал сам. И когда я ошибся в регистре букв в идентификаторе, ошибку компиляции исправил сам. Т.е. здесь можно работать.

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

Вставил всё, как Вы написали, всё работает, если джойстик вверх, то прибавляет значение z на 1, если вниз, то вычитает 1, аналогично и другие две стороны(право и лево) вычитает и прибавляет 1. 

Идём дальше, теперь надо заставить сервоприводы двигаться, с чего начнём?

q=94   z=96   time=74045
q=94   z=97   time=75045
q=94   z=98   time=76046
q=94   z=98   time=77046
q=94   z=98   time=78048
q=94   z=98   time=79048
q=94   z=98   time=80049
q=94   z=98   time=81049
q=94   z=98   time=82050
q=94   z=98   time=83051
q=93   z=98   time=84051
q=92   z=98   time=86052
q=91   z=98   time=87053
q=91   z=98   time=88053
q=91   z=98   time=89054
q=91   z=98   time=90054
q=92   z=98   time=91055
q=93   z=98   time=92056
q=93   z=98   time=93057
 
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Значит передатчик с джойстиком у Вас уже есть. так. Оставляйте его в покое, берите скетч приёмника и ...

Посмотрите на Ваш старый скетч (из самого первого сообщения темы. В нём строки 3-4, 10-11, 20-29 отвечали за джойстик, а всё остальное за серву. так?

Теперь Вам джойстик не нужен, вместо джойстика у Вас есть приёмник. Смотрим скетч приёмника из поста #38. Там к строке №20 у Вас уже получены packet.z и packet.q (они по радио получены, а раньше Вы их с джойтиска получали, но какая разница? Важно, что числа есть).

Поэтому из самого начального скетча выбрасываем строки 3-4, 10-11, 20-29, а то, что осталось аккуратно переносим в правильные места скетча приёмника из поста 39.

Т.е. то что глобально, так и переносим глобально. То что там было в сетап, и сюда переносим в сетап. А то, что там вертело серву, ставим в то место, где числа уже получены и также вертим.

Если Всё аккуратно вставите, он должен начать вертеть серву по командам с передатчика.

Давайте, пробуйте. Надесюь, у Вас получится. Отчитаетесь. Только не исчезайте, там надо ещё будет до ума довести.

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

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

Посмотрите на Ваш старый скетч (из самого первого сообщения темы. В нём строки 3-4, 10-11, 20-29 отвечали за джойстик, а всё остальное за серву. так?

Поэтому из самого начального скетча выбрасываем строки 3-4, 10-11, 20-29, а то, что осталось аккуратно переносим в правильные места скетча приёмника из поста 39.

Это сделал, только не убирал 3-4 строку, иначе как ввести переменную, кроме как Servo Artur1 ?? 

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

#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 серва просто двигаются по кругу без какого либо алгоритма. Открываю монитор порта, они останавливаются на одном месте и гудят, сдвинуть их рукой не получается, встаёт на это же место, то есть на начальное. Тут возникает новая проблема, в мониторе порта ничего не отображается, кроме "Fun begins!", после, я очень близко кручу друг у друга передатчик и приемник приходит 3-4 сообщения: 

q=83   z=53   time=24503
q=83   z=53   time=25503
q=83   z=53   time=26504
Далее, ничего больше не приходит. Тут я подумал, что модули опять сломались, вернул всё к исходным скетчам, сообщения передавались в нормальном режиме, как и должны. Сделал заного, история та же. В чем проблема, может со скетчем что то не так. Передатчик я не трогал, менял только приемник.

 

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

apendics пишет:

не убирал 3-4 строку

Это правильно, это я с прямым углом перепутал

apendics пишет:

Далее, ничего больше не приходит. Тут я подумал, что модули опять сломались, вернул всё к исходным скетчам, сообщения передавались в нормальном режиме, как и должны. Сделал заного, история та же. В чем проблема, может со скетчем что то не так. Передатчик я не трогал, менял только приемник.

Т.е. если прямо в этом скетче закомментировать серву и всё, что с нею связано - всё равботает. Стоит открыть - перестаёт. Так?
 
Боюсь, что таки приёмник дерётся с сервой. Давайтте сейчас отложим. А завтра я внимательно посмотрю. Сервы у меня нет, но мне и не надо. Добьюсь, чтобы при подключенной (и якобы работающей) серве в монитор нормально выдавалось и тогда всё заработает.

 

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

Получается, что так, потому что даже в монитор порта Сообщения не приходят