Передача данных через Xbee

Обсуждаем Arduino, Raspberry Pi и другие электронные компоненты и проекты DIY
Ответить
PBR
Сообщения: 8
Зарегистрирован: 24 дек 2013, 17:30

Передача данных через Xbee

Сообщение PBR »

Допустим, имеем:
1.Две дуины
2. Две xbee
3. 2 шилда под них
4. 2 сенсора( дальномеры или джойстики) что в принципе не имеет значения в данной статье
5. 2 мотора или серво привода.

Что нужно:
На первой ардуине считываются данные с двух сенсоров, например получилось что один LOW, другой HIGH. Нужно по отдельности отправить эти данные на вторую ардуину.
На второй ардуине нужно принять эти данные и напрмер если на 1-ом сенсоре -0, крутить мотор назад. На втором - 1, крутить вперед. Наоборот аналогично.
Проблема заключается именно в приеме данных. Использование массива вроде бы можно было бы использовать, но нужно втобы каждый сенсор имел свое место для переменной в массиве, чтобы потом четко их вытаскивать.


Если неочень понятно, могу написать чисто примерный код и обозначить где именно проблема.
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1020
Зарегистрирован: 22 окт 2010, 23:57

Re: Передача данных через Xbee

Сообщение Mr.Kubikus »

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

Назначение битов в байте:
Бит 0 - состояние датчика №1
Бит 1 - состояние датчика №2
Биты 2-7 - не используется.

На стороне передатчика устанавливаете биты в байте в соответствии с состоянием датчиков и отправляете. На стороне приемника читаете из последовательного порта. Если пришел байт, то проверяете соответствующие биты в нем и шевелите моторами.
С уважением, Григорий
GitHub FB ВК
PBR
Сообщения: 8
Зарегистрирован: 24 дек 2013, 17:30

Re: Передача данных через Xbee

Сообщение PBR »

А если это дальномер?
Например, мне нужны только два значения 0 это LOW И что-либо на расстоянии 20 см это HIGH. Можно ли через map переделать.

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

И будьте добры, написать отрывки из кода как составить массив, отправить, и ВЫТАЩИТЬ переменные в приемнике.
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1020
Зарегистрирован: 22 окт 2010, 23:57

Re: Передача данных через Xbee

Сообщение Mr.Kubikus »

Хорошо. Давайте не будем изобретать велосипед и попробуем решить задачу с помощью библиотеки Arduino-EasyTransfer. Библиотека предоставляет функции для организации обмена информацией между двумя ардуинами. Всю работу, связанную с формированием пакетов, отправкой и получением она берет на себя.

Для начала надо описать структуру данных, для передачи между МК:

Код: Выделить всё

struct SEND_DATA_STRUCTURE{
  //Укажите здесь все переменные, которые вы хотите передавать
  //Это описание должно совпадать с описанием на второй ардуине
  int JoyX;
  int JoyY;
};
Затем следует объявить переменную с типом SEND_DATA_STRUCTURE:

Код: Выделить всё

SEND_DATA_STRUCTURE mydata;
Такая же структура данных будет использоваться на приемнике для хранения полученных данных:

Код: Выделить всё

struct RECEIVE_DATA_STRUCTURE{
  int JoyX;
  int JoyY;
};

RECEIVE_DATA_STRUCTURE mydata;
Далее рассмотрим код для платы-передачтика и платы-приемника:

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

Код: Выделить всё

#include <EasyTransfer.h>

EasyTransfer ET;

struct SEND_DATA_STRUCTURE{
  int JoyX;
  int JoyY;
};

SEND_DATA_STRUCTURE mydata;

void setup(){
  Serial.begin(9600);
  ET.begin(details(mydata), &Serial);
}

void loop(){
  mydata.JoyX = analogRead(A0);
  mydata.JoyY = analogRead(A1);
  
  //Отправляем данные
  ET.sendData();
  delay(50);
}
На приемнике:

Код: Выделить всё

#include <EasyTransfer.h>

EasyTransfer ET; 

struct RECEIVE_DATA_STRUCTURE{
  int JoyX;
  int JoyY;
};

RECEIVE_DATA_STRUCTURE mydata;
int motor1PWM;
int motor2PWM;

void setup(){
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  Serial.begin(9600);
  ET.begin(details(mydata), &Serial);
}

void loop(){
  //Проверяем не поступили ли данные. 
  if(ET.receiveData()){
    //Данные получены. Управляем моторами 
    motor1PWM = map(mydata.JoyX, 0, 1023, 0, 255);
    motor2PWM = map(mydata.JoyY, 0, 1023, 0, 255);
    analogWrite(5, motor1PWM);
    analogWrite(6, motor2PWM);
  }

  //Задержка должна быть меньше чем в программе передатчика иначе данные могут быть потеряны.
  delay(10);
}
С уважением, Григорий
GitHub FB ВК
PBR
Сообщения: 8
Зарегистрирован: 24 дек 2013, 17:30

Re: Передача данных через Xbee

Сообщение PBR »

Спасибо огромное! Подобную библиотеку и не видел, и вправду она все упрощает!
Еще раз Спасибо! Вы упростили мою жизнь до нельзя!:)
И еще маленький вопрос про дальномер HC-SR04: если на роботе стоят 3-5 дальномера которые считывают разные показания, можно ли все ножки Echo(или быть может Trig) подключить в один разъем?
PBR
Сообщения: 8
Зарегистрирован: 24 дек 2013, 17:30

Re: Передача данных через Xbee

Сообщение PBR »

Нужно ли объявлять на приемнике перед setup в const int полученные переменные?
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1020
Зарегистрирован: 22 окт 2010, 23:57

Re: Передача данных через Xbee

Сообщение Mr.Kubikus »

В приемнике надо объявлять:

Код: Выделить всё

struct RECEIVE_DATA_STRUCTURE{
  int JoyX;
  int JoyY;
};

RECEIVE_DATA_STRUCTURE mydata;
С уважением, Григорий
GitHub FB ВК
Ответить