Допустим, имеем:
1.Две дуины
2. Две xbee
3. 2 шилда под них
4. 2 сенсора( дальномеры или джойстики) что в принципе не имеет значения в данной статье
5. 2 мотора или серво привода.
Что нужно:
На первой ардуине считываются данные с двух сенсоров, например получилось что один LOW, другой HIGH. Нужно по отдельности отправить эти данные на вторую ардуину.
На второй ардуине нужно принять эти данные и напрмер если на 1-ом сенсоре -0, крутить мотор назад. На втором - 1, крутить вперед. Наоборот аналогично.
Проблема заключается именно в приеме данных. Использование массива вроде бы можно было бы использовать, но нужно втобы каждый сенсор имел свое место для переменной в массиве, чтобы потом четко их вытаскивать.
Если неочень понятно, могу написать чисто примерный код и обозначить где именно проблема.
Передача данных через Xbee
- Mr.Kubikus
- Сотрудник ПАКПАК
- Сообщения: 1020
- Зарегистрирован: 22 окт 2010, 23:57
Re: Передача данных через Xbee
Если задача не ответственная и датчики дискретные т.е. у них только два состояния 0 и 1, то все можно закодировать в одном байте. В этом случае не придется городить какой-то сложный протокол.
Назначение битов в байте:
Бит 0 - состояние датчика №1
Бит 1 - состояние датчика №2
Биты 2-7 - не используется.
На стороне передатчика устанавливаете биты в байте в соответствии с состоянием датчиков и отправляете. На стороне приемника читаете из последовательного порта. Если пришел байт, то проверяете соответствующие биты в нем и шевелите моторами.
Назначение битов в байте:
Бит 0 - состояние датчика №1
Бит 1 - состояние датчика №2
Биты 2-7 - не используется.
На стороне передатчика устанавливаете биты в байте в соответствии с состоянием датчиков и отправляете. На стороне приемника читаете из последовательного порта. Если пришел байт, то проверяете соответствующие биты в нем и шевелите моторами.
Re: Передача данных через Xbee
А если это дальномер?
Например, мне нужны только два значения 0 это LOW И что-либо на расстоянии 20 см это HIGH. Можно ли через map переделать.
Вся загвоздка в том и состоит, что 0 и 1 не отделаешься - делаю пульт с джойстиком, который управляет двумя моторами. 2-ой джойстик клешней для захвата. Если не углубляться то в общем случае нужно передавать с аналоговых входов значения и четко распределять их на приемнике.
И будьте добры, написать отрывки из кода как составить массив, отправить, и ВЫТАЩИТЬ переменные в приемнике.
Например, мне нужны только два значения 0 это LOW И что-либо на расстоянии 20 см это HIGH. Можно ли через map переделать.
Вся загвоздка в том и состоит, что 0 и 1 не отделаешься - делаю пульт с джойстиком, который управляет двумя моторами. 2-ой джойстик клешней для захвата. Если не углубляться то в общем случае нужно передавать с аналоговых входов значения и четко распределять их на приемнике.
И будьте добры, написать отрывки из кода как составить массив, отправить, и ВЫТАЩИТЬ переменные в приемнике.
- Mr.Kubikus
- Сотрудник ПАКПАК
- Сообщения: 1020
- Зарегистрирован: 22 окт 2010, 23:57
Re: Передача данных через Xbee
Хорошо. Давайте не будем изобретать велосипед и попробуем решить задачу с помощью библиотеки Arduino-EasyTransfer. Библиотека предоставляет функции для организации обмена информацией между двумя ардуинами. Всю работу, связанную с формированием пакетов, отправкой и получением она берет на себя.
Для начала надо описать структуру данных, для передачи между МК:
Затем следует объявить переменную с типом SEND_DATA_STRUCTURE:
Такая же структура данных будет использоваться на приемнике для хранения полученных данных:
Далее рассмотрим код для платы-передачтика и платы-приемника:
На передатчике:
На приемнике:
Для начала надо описать структуру данных, для передачи между МК:
Код: Выделить всё
struct SEND_DATA_STRUCTURE{
//Укажите здесь все переменные, которые вы хотите передавать
//Это описание должно совпадать с описанием на второй ардуине
int JoyX;
int JoyY;
};
Код: Выделить всё
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);
}
Re: Передача данных через Xbee
Спасибо огромное! Подобную библиотеку и не видел, и вправду она все упрощает!
Еще раз Спасибо! Вы упростили мою жизнь до нельзя!:)
И еще маленький вопрос про дальномер HC-SR04: если на роботе стоят 3-5 дальномера которые считывают разные показания, можно ли все ножки Echo(или быть может Trig) подключить в один разъем?
Еще раз Спасибо! Вы упростили мою жизнь до нельзя!:)
И еще маленький вопрос про дальномер HC-SR04: если на роботе стоят 3-5 дальномера которые считывают разные показания, можно ли все ножки Echo(или быть может Trig) подключить в один разъем?
Re: Передача данных через Xbee
Нужно ли объявлять на приемнике перед setup в const int полученные переменные?
- Mr.Kubikus
- Сотрудник ПАКПАК
- Сообщения: 1020
- Зарегистрирован: 22 окт 2010, 23:57
Re: Передача данных через Xbee
В приемнике надо объявлять:
Код: Выделить всё
struct RECEIVE_DATA_STRUCTURE{
int JoyX;
int JoyY;
};
RECEIVE_DATA_STRUCTURE mydata;