радиопередатчик 433 мгц
- Войдите на сайт для отправки комментариев
Пнд, 12/12/2016 - 11:57
Здравствуйте.
Есть у меня 2-ух осевой джойстик. С помощью каких команд можно передать значения X Y с одной ардуинки на другую, используя библиотеку VirtualWire. На ардуино с джойстиком использую базовый скетч (http://arduino-diy.com/arduino-dzhoystik)
Ссылка на радиопару http://arduino-diy.com/arduino-radioperedatchik-RF-315-433-MHz
Ну, можно взять библиотеку 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Большое спасибо
Сейчас поискал, не нашел ни библиотеку FS1000A.h ни Joystick.h> немогли бы вы скинуть эти файлы или ссылку?
Сейчас поискал, не нашел ни библиотеку FS1000A.h ни Joystick.h> немогли бы вы скинуть эти файлы или ссылку?
Дык ... файл FS1000A.h был в моём первом посте (вторая вставка кода). Это маленькая библиотечка, которую я для ребёнка написал.
А Joystick.h это тоже маленькая самодельная библиотечка для работы с джойстиком. У Вас же вроде какая-то джойстиковая библиотека уже есть, используйте её. К передаче-то она не имеет отношения. Всё. что она делает - выдаёт координаты джойстика (строки 26 и 27). Получайте их от своей библиотеки, и передавайте также, как здесь передаётся.
Мне-то не жалко, я могу выложить эту библиотечку, но она очень спеицифичная, специально заточенная под ту схему управления, которую придумал мой внук. Там идея такая: машинка имеет танковое управление, т.е. нет руля, зато двигатели можно в разные стороны крутить. Так вот джойстик ставится по 45 градусов, а библиотека пишется так, чтобы когда он в верхней четверти, X и Y выдавались положительными, когда в нижней - отрицательными, а когда в правой и в левой, то одна координата положительная. а другая отрицательная. Т.е. по сути в качестве кооржинат джойстика сразу выдаётся скорость соответсвующего двигателя с правильным знаком. Нужна она Вам?
Какое совподение) я тоже делаю танк библиотеку скидывайте
Ну, вот, держите. Но это делалось для себя и чётко под ту схему управления. что ребёнок придумал. Вполне возможно, что Вам это покажется неудобным, если у Вас другая схема управления.
#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 прямо использовать для задания скоростей правого и левого мотора. Если положительное число, то это скорость вперёд, а если отрицательное, то это скорость назад.
Не хочу быть назойливым, но пересмотрев ваш пост так и не нашел файлика у меня идёт строка "Файлик FS1000A.h - это маленькая библиотечка, которая как раз и использует VirtualWire. Вот он, собственно" и на этом обрывается
у меня идёт строка "Файлик 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всё спасибо огромное за внимание которое вы мне уделили