Передача данных через RF модули
- Войдите на сайт для отправки комментариев
Чт, 12/09/2013 - 01:11
Доброй ночи, я пытаюсь реализовать следующую идею: передавать значения гироскопа (ADXL345) с передатчика (Arduino UNO) на приемник (Arduino UNO + Ethernet Shield) при помощи RF модуля (RF1212), соответственно используется последовательная передача данных. Проблема заключается в том что не получается корректно передать данные на приемник. Подскажите могу ли я использовать в моей ситуации библиотеку VirtualWire для составления структуры пакета, точнее будет ли она корректно работать с моими RF модулями (http://appconwireless.blogspot.ru/2013/01/ultra-low-power-consumption-solution.html) ?
Нет не будет, эта библиотека для других целей.
Тогда что можите посоветовать для коректной отправки и приема данных?
Вот код приемника:
и передатчика:
Вы можете поискать по форуму как правильно передавать и принимать данные по сериал соединению.
Я бы сделал так:
передатчик:
приемник:
и почитайте что делает flush().
Спасибо большое, на счет flush как я почитал для очистки буфера можно использовать слейдущую конструкцию ? :
Можно, но в примерах выше он будет и так очичаться до тех пор пока не "встретит" идентификатор начала пакета D.
Спасибо за разъяснения))))
Попробовал вашу конструкцию, не получилось( На выходе из передатчика идут не читаемые символы.
Передатчик:
На каком выходе? И с чего вдруг они должны быть читаемыми? Они могут стать читаемыми если вы их соберете функцией IntRead() в числа и отправите в монитор кодами АСКИ.
Информация приходит с гироскопа на arduino с 4 и 5 входов, то есть мы ни как не сможем посмотреть какую информацию мы отправляем на приемник? Буду пробывать тогда копаться дальше)
Так же хотел спросить а почему в коде приемника Serial.read() идет 2 раза а не 3? Ведь у нас массив состоит из 3 позиций.
Код приемника
В общем не те вопросы вы задаете. Изучайте раздел Программирование вчастиноти Типы данных и описание класса Serial.
Вам пока не стоит вдаваться в эти подробности. Просто берете функции и пользуетесь.
Функция IntRead() читает только одну переменную типа int, состоящую из двух байт.
Передача данных работает и еще раз спасибо вам за это, но проблема появилась слейдущая что в один прекрасный момент должны придти примерно такие данные -2 1 0, а приходит все три числа по 17476 или одномиз чисел 17476. Вообщем это число начинает повторятся(
Код приемника:
Код передатчика:
Могу предположить что у вас переполняется буфер так как в приемнике сумарная задержка больше чем в передатчике. То есть вы отправляете данных больше чем можете прочитать.
Для чего это строка?
уберите ее.
Спасибо эту строку уже нашел, вот только числа теперь начали прыгать в районе 256(
Причем числа передаются нормально, но какая та из координат без переодичности может стать числом от 254 до 256. Пробывал ставить задержку отправки на передатчике 6000 мс.
Попробуйте в 63 строке увеличить задержку:
Попробывал не помогает, еще убрал блок записи в файл:
После этого появление числа 256 участилось
А в каком диапазоне у вас меняются данные в переменных x, y, z ?
Я стараяюсь чтобы гироскоп был в не подвижном состоянии и данные от -1 до +1. Иногда при загрузке первых чисел он сразу выдает одно из чисел равным 256.
Не важно как вы стараетесь и что вы хотите, важно в каких пределах изменяются данные.
Если гироскоп находится в не подвижном состоянии данные изменяются от -2 до +2
А если без если?
Извиняюсь я имел виду не гироскоп, а акселерометр))) Диапазан измерения у него до ±16g.
Уважаемый Максим а если сделать так чтобы приемник отсылал передатчику индификатор разрешающий передачу и только после этого передатчик начинал отсылать данные на приемник имеет ли такая идея право на существование?
Возможно ли связать две Arduino без радио модулей на прямую через RX и TX?
Соединил такая же картина(
При соединении напрямую работает как надо (код ниже), но этот код уже не работает при использовании rf модулей, принятые данные приемник отображает нулями:
Код передатчика (через rx и tx):
Код приемника (через rx и tx):
Со слейдущем кодом передача работает только появляется число 256 один, два раза в 10-15 показаниях с акселерометра. Хочу отметить что число 256 появляется только при перидачи, на самом передатчике при просмотре работы акселерометра все работает как надо.
Код передатчика (через rf):
Код приемника (через rf):
В общем вы так и не написали в каком диапазоне у вас изменяются значения в переменных x, y, z, поэтому если их значения колеблятся в пределах от -128 до 127, то обьявите их как char и передавайте/принимайте каждую переменну по одному байту.
передатчик:
приемник:
И учтите, что выводить переменные типа char через print() в вашем случае нужно с указанием базиса: