радиопередатчик 433 мгц

Kostya
Offline
Зарегистрирован: 30.11.2016

Здравствуйте.

Есть у меня 2-ух осевой джойстик. С помощью каких команд можно передать значения X Y с одной ардуинки на другую, используя библиотеку VirtualWire. На ардуино с джойстиком использую базовый скетч (http://arduino-diy.com/arduino-dzhoystik)

Ссылка на радиопару http://arduino-diy.com/arduino-radioperedatchik-RF-315-433-MHz

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

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

У меня ребёнок вот так передаёт.

//template <typename T> inline Print & operator << (Print &s, T n) { s.print(n); return s; }

#include <Joystick.h>
#include <VirtualWire.h>
#include <FS1000A.h>

struct Pult {
  int leftFront;
  int rightFront;
  int leftRear;
  int rightRear;
  byte Break;
};

Joystick joy;

void setup() {
 // Serial.begin(115200);
  // x_pin, y_pin, btn_pin
  joy.init(A7, A6, A5);
  FS1000A_Init(A4);  // пин передатчика
}

void loop() {
  struct Pult dog; 
  joy.proceed();
  dog.leftFront = dog.leftRear = joy.x();
  dog.rightFront = dog.rightRear = joy.y();
  FS1000A_Send(&dog, sizeof(dog));
  delay(20);
}

Файлик FS1000A.h - это маленькая библиотечка, которая как раз и использует VirtualWire. Вот он, собственно

#ifndef  FS1000A_h
#define  FS1000A_h

#include <VirtualWire.h>

//////////////////////////////////////////////////////////////////////////////////////
//
// ФУНКЦИИ ПЕРЕДАТЧИКА
//

///////////////////////////////////////////////////
//
//	Инициализация передатчика
//
inline static void FS1000A_Init(const int8_t pin) {
	pinMode(pin, OUTPUT);
	vw_set_ptt_inverted(true);
	vw_setup(2000);
	vw_set_tx_pin(pin);
}

///////////////////////////////////////////////////
//
//	Ждать завершения передачи сообщения
//
inline static void FS1000A_WaitForTransmission(void) {
   vw_wait_tx();
}

///////////////////////////////////////////////////
//
//	Отправить сообщение из буфера buf длиной len
// если waitForTransmission - true, то дождаться завершения отправки
// иначе вернуться сразу же.
//
inline static void FS1000A_Send(const void * buf, const byte len, const bool waitForTransmission = true) {
   vw_send((byte *)buf, (byte)len);
	if (waitForTransmission) FS1000A_WaitForTransmission();
}

///////////////////////////////////////////////////
//
//	Отправить строку s без завершающего 0
// если waitForTransmission - true, то дождаться завершения отправки
// иначе вернуться сразу же.
//
inline static void FS1000A_Send(const char * s, const bool waitForTransmission = true) {
   FS1000A_Send((const byte *) s, strlen(s), waitForTransmission);
}

///////////////////////////////////////////////////
//
//	Возвращает true если идёт передача
//
inline bool FS1000A_InProgress(void) {
   return vx_tx_active();
}

//////////////////////////////////////////////////////////////////////////////////////
//
// ФУНКЦИИ ПРИЁМНИКА
//

///////////////////////////////////////////////////
//
//	Инициализация приёмника
//
inline static void XY_MK_5V_Init(const int8_t pin)  {
	vw_set_ptt_inverted(true); 
	vw_setup(2000);	 
	vw_set_rx_pin(pin);
}

///////////////////////////////////////////////////
//
//	Включаем "слушание" эфира
//
inline static void XY_MK_5V_Start(void) {
	vw_rx_start(); 
}

///////////////////////////////////////////////////
//
//	Выключаем "слушание" эфира
//
inline static void XY_MK_5V_Stop(void) {
	vw_rx_stop(); 
}

///////////////////////////////////////////////////
//
//	Возвращает true если пришло сообщение
//
inline static bool XY_MK_5V_Available(void) {
   return vw_have_message();
}

///////////////////////////////////////////////////
//
//	Ждёт прихода сообщения указанное количество миллисекунд (если 0, то ждёт бесконечно)
// Возвращает true если дождалась и false в противном случае.
//
inline static bool XY_MK_5V_WaitForMessage(unsigned long milliseconds = 0) {
   if (milliseconds) return vw_wait_rx_max(milliseconds);
   vw_wait_rx();
   return true; 
}

///////////////////////////////////////////////////
//
//	Получает сообщение в буфер buf.
// Максимальная длина буфера должна находится в *len
// по завершении в *len будет реальная длина полученного сообщения
// возвращает true если сообщение получено нормально
//
inline static bool XY_MK_5V_ReceiveMessage(byte * buf, byte * len) {
   return vw_get_message(buf, len);
}
inline static bool XY_MK_5V_ReceiveMessage(char * s, byte * len) { 
   return XY_MK_5V_ReceiveMessage((byte *) s, len);
}

#endif   // FS1000A

 

Kostya
Offline
Зарегистрирован: 30.11.2016

Большое спасибо

 

Kostya
Offline
Зарегистрирован: 30.11.2016

Сейчас поискал, не нашел ни библиотеку FS1000A.h ни Joystick.h>    немогли бы вы скинуть эти файлы или ссылку?

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

Kostya пишет:

Сейчас поискал, не нашел ни библиотеку FS1000A.h ни Joystick.h>    немогли бы вы скинуть эти файлы или ссылку?

Дык ... файл FS1000A.h был в моём первом посте (вторая вставка кода). Это маленькая библиотечка, которую я для ребёнка написал.

А Joystick.h это тоже маленькая самодельная библиотечка для работы с джойстиком. У Вас же вроде какая-то джойстиковая библиотека уже есть, используйте её. К передаче-то она не имеет отношения. Всё. что она делает - выдаёт координаты джойстика (строки 26 и 27). Получайте их от своей библиотеки, и передавайте также, как здесь передаётся.

Мне-то не жалко, я могу выложить эту библиотечку, но она очень спеицифичная, специально заточенная под ту схему управления, которую придумал мой внук. Там идея такая: машинка имеет танковое управление, т.е. нет руля, зато двигатели можно в разные стороны крутить. Так вот джойстик ставится по 45 градусов, а библиотека пишется так, чтобы когда он в верхней четверти, X и Y выдавались положительными, когда в нижней - отрицательными, а когда в правой и в левой, то одна координата положительная. а другая отрицательная. Т.е. по сути в качестве кооржинат джойстика сразу выдаётся скорость соответсвующего двигателя с правильным знаком. Нужна она Вам?

Kostya
Offline
Зарегистрирован: 30.11.2016

Какое совподение) я тоже делаю танк     библиотеку скидывайте

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

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

#ifndef Joystick_h
#define Joystick_h

#include <arduino.h>

class Joystick {
public:
	Joystick(void) {}
	Joystick(const int8_t x_pin, const int8_t y_pin, const int8_t btn_pin) { init(x_pin, y_pin, btn_pin); }

	void init(const int8_t x_pin, const int8_t y_pin, const int8_t btn_pin) {
		m_xPin = x_pin;
		m_yPin = y_pin;
		m_btnPin = btn_pin;
		m_x = m_y = 0;
		pinMode(m_btnPin, INPUT_PULLUP);
	}
	
	inline void proceed(void) {
		m_x = - aRead (m_xPin);
		m_y = aRead (m_yPin);
		m_pressed = digitalRead(m_btnPin) == LOW;
	}

	inline int x(void) const { return m_x; }
	inline int y(void) const { return m_y; }
	inline boolean pressed(void) const { return m_pressed; }
	
	private:
		static int aRead(const int8_t pin) {
			const int res = (analogRead(pin) * 10 + 5) / 20 - 255;
			if (res < -255) return -255;
			if (res > 255) return 255;
			if (abs(res) < 10) return 0;
			return res;
		}
		int8_t m_xPin, m_yPin, m_btnPin;
		int m_x, m_y;
		boolean m_pressed;
};

#endif	//	Joystick_h

Только помните, джойстик ставится под 45 градусов.

Запустите вот эту тестовую программу (она просто в сериал печатает X и Y джойстика, когда они меняются).

#include <Joystick.h>

template <typename T> inline Print & operator << (Print &s, T n) { s.print(n); return s; }

Joystick joy;

void setup() {
	Serial.begin(115200);
 //
 // Пины, куда включён джойстик (x, y и кнопка)
 // x_pin, y_pin, btn_pin
  joy.init(A7, A6, A5); // 
}

void loop() {
	joy.proceed();
	static int ox = -1, oy = -1;
	static boolean op = false;
	int x = joy.x(), y = joy.y(); // 
	boolean p = joy.pressed();
	if (x != ox || y != oy || p != op) {
		Serial << "X=" << x << "   Y=" << y << "   Pressed=" << p << '\n';
		ox = x;
		oy = y;
		op = p;
	}
}

Глядя на то, что печатается найдите такое положение при котором в верхней четверти обе X и Y положительны, а в нижней четверти - обе отрицательны.

Тогда можно будет полученные X и Y прямо использовать для задания скоростей правого и левого мотора. Если положительное число, то это скорость вперёд, а если отрицательное, то это скорость назад.

Kostya
Offline
Зарегистрирован: 30.11.2016

Не хочу быть назойливым, но пересмотрев ваш пост так и не нашел файлика  у меня идёт строка "Файлик FS1000A.h - это маленькая библиотечка, которая как раз и использует VirtualWire. Вот он, собственно" и на этом обрывается

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

Kostya пишет:

у меня идёт строка "Файлик FS1000A.h - это маленькая библиотечка, которая как раз и использует VirtualWire. Вот он, собственно" и на этом обрывается

Ну, да и после этого свёрнутый код, разве нет? У меня так. Хорошо, я выложу ещё раз и даже сворачивать не буду. Получили?

#ifndef  FS1000A_h
#define  FS1000A_h

#include <VirtualWire.h>

//////////////////////////////////////////////////////////////////////////////////////
//
// ФУНКЦИИ ПЕРЕДАТЧИКА
//

///////////////////////////////////////////////////
//
//	Инициализация передатчика
//
inline static void FS1000A_Init(const int8_t pin) {
	pinMode(pin, OUTPUT);
	vw_set_ptt_inverted(true);
	vw_setup(2000);
	vw_set_tx_pin(pin);
}

///////////////////////////////////////////////////
//
//	Ждать завершения передачи сообщения
//
inline static void FS1000A_WaitForTransmission(void) {
   vw_wait_tx();
}

///////////////////////////////////////////////////
//
//	Отправить сообщение из буфера buf длиной len
// если waitForTransmission - true, то дождаться завершения отправки
// иначе вернуться сразу же.
//
inline static void FS1000A_Send(const void * buf, const byte len, const bool waitForTransmission = true) {
   vw_send((byte *)buf, (byte)len);
	if (waitForTransmission) FS1000A_WaitForTransmission();
}

///////////////////////////////////////////////////
//
//	Отправить строку s без завершающего 0
// если waitForTransmission - true, то дождаться завершения отправки
// иначе вернуться сразу же.
//
inline static void FS1000A_Send(const char * s, const bool waitForTransmission = true) {
   FS1000A_Send((const byte *) s, strlen(s), waitForTransmission);
}

///////////////////////////////////////////////////
//
//	Возвращает true если идёт передача
//
inline bool FS1000A_InProgress(void) {
   return vx_tx_active();
}

//////////////////////////////////////////////////////////////////////////////////////
//
// ФУНКЦИИ ПРИЁМНИКА
//

///////////////////////////////////////////////////
//
//	Инициализация приёмника
//
inline static void XY_MK_5V_Init(const int8_t pin)  {
	vw_set_ptt_inverted(true); 
	vw_setup(2000);	 
	vw_set_rx_pin(pin);
}

///////////////////////////////////////////////////
//
//	Включаем "слушание" эфира
//
inline static void XY_MK_5V_Start(void) {
	vw_rx_start(); 
}

///////////////////////////////////////////////////
//
//	Выключаем "слушание" эфира
//
inline static void XY_MK_5V_Stop(void) {
	vw_rx_stop(); 
}

///////////////////////////////////////////////////
//
//	Возвращает true если пришло сообщение
//
inline static bool XY_MK_5V_Available(void) {
   return vw_have_message();
}

///////////////////////////////////////////////////
//
//	Ждёт прихода сообщения указанное количество миллисекунд (если 0, то ждёт бесконечно)
// Возвращает true если дождалась и false в противном случае.
//
inline static bool XY_MK_5V_WaitForMessage(unsigned long milliseconds = 0) {
   if (milliseconds) return vw_wait_rx_max(milliseconds);
   vw_wait_rx();
   return true; 
}

///////////////////////////////////////////////////
//
//	Получает сообщение в буфер buf.
// Максимальная длина буфера должна находится в *len
// по завершении в *len будет реальная длина полученного сообщения
// возвращает true если сообщение получено нормально
//
inline static bool XY_MK_5V_ReceiveMessage(byte * buf, byte * len) {
   return vw_get_message(buf, len);
}
inline static bool XY_MK_5V_ReceiveMessage(char * s, byte * len) { 
   return XY_MK_5V_ReceiveMessage((byte *) s, len);
}

#endif   // FS1000A

 

Kostya
Offline
Зарегистрирован: 30.11.2016

всё спасибо огромное за внимание которое вы мне уделили