Не понимаю как доставать данные из полученного радиосообщения

denis64
Offline
Зарегистрирован: 07.10.2013

Использую такое железо:

И библиотеку VirtualWire 1.15

Отправляю

'5','6','7','.','d','k',' ','t','e','s','t','#'

 

Получаю нечто такого вида:

 

Подскажите пожалуйста куда копать что бы понять эти кракозябры?

Отправляю побайтно. Принимаю по 5 кракозябр.

Пробовал отправлять один единственный символ. Приёмник принимал опять же разные кракозябры.

 

Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012

denis64 пишет:

Подскажите пожалуйста куда копать что бы понять эти кракозябры?

Отправляю побайтно. Принимаю по 5 кракозябр.

Пробовал отправлять один единственный символ. Приёмник принимал опять же разные кракозябры.

Скорость передачи и приема в мониторе выставлена одинаковая ? 

Еще похожий был вопрос, где все было настроено правильно, но проблему с "греческим" так и не удалось решить.

Можно и кусок кода отправки данных выложить...

Araris
Offline
Зарегистрирован: 09.11.2012

denis64,а код передающий и код принимающий покажете ?

denis64
Offline
Зарегистрирован: 07.10.2013

Да скорость одинаковая. Примеры из библиотеки (я их не менял):

Передатчик:

#include <VirtualWire.h>

const int led_pin = 13;
const int transmit_pin = 2;
const int receive_pin = 2;
const int transmit_en_pin = 3;

void setup()
{
    delay(1000);
    Serial.begin(115200);	// Debugging only
    Serial.println("setup");
    // Initialise the IO and ISR
    vw_set_tx_pin(transmit_pin);
    vw_set_rx_pin(receive_pin);
    vw_set_ptt_pin(transmit_en_pin);
    vw_set_ptt_inverted(true); // Required for DR3100
    vw_setup(2000);       // Bits per sec
    pinMode(led_pin, OUTPUT);
}

byte count = 1;

void loop()
{
  char msg[12] = {'5','6','7','.','d','k',' ','t','e','s','t','#'};
// replace chr 11 with count (#)
  msg[11] = count;
  digitalWrite(led_pin, HIGH); // Flash a light to show transmitting
  Serial.println(msg);
  vw_send((uint8_t *)msg, 12);
  vw_wait_tx(); // Wait until the whole message is gone
  digitalWrite(led_pin, LOW);
  delay(1000);
  count = count + 1;
}
/*
VirtualWire 1.15 modifyed by http:/567.dk to fit my setup
Com speed 115200
receive_pin = 3
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!! Prints out ASCII                 !!!!!!!!!!!! 
!!!!!!!!!!!! You screen will act on the codes !!!!!!!!!!!! 
!!!!!!!!!!!! Advice DEBUG with reciver1_5_HEX !!!!!!!!!!!! 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
*/
// receiver.pde
//
// Simple example of how to use VirtualWire to receive messages
// Implements a simplex (one-way) receiver with an Rx-B1 module
//
// See VirtualWire.h for detailed API docs
// Author: Mike McCauley (mikem@airspayce.com)
// Copyright (C) 2008 Mike McCauley
// $Id: receiver.pde,v 1.3 2009/03/30 00:07:24 mikem Exp $

#include <VirtualWire.h>

const int led_pin = 13;
const int transmit_pin = 12;
const int receive_pin = 3;
const int transmit_en_pin = 5;

void setup()
{
    delay(1000);
    Serial.begin(115200);	// Debugging only
    Serial.println("setup");

    // Initialise the IO and ISR
    vw_set_tx_pin(transmit_pin);
    vw_set_rx_pin(receive_pin);
    vw_set_ptt_pin(transmit_en_pin);
    vw_set_ptt_inverted(true); // Required for DR3100
    vw_setup(2000);	 // Bits per sec

    vw_rx_start();       // Start the receiver PLL running

    pinMode(led_pin, OUTPUT);
}

void loop()
{
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;

    if (vw_get_message(buf, &buflen)) // Non-blocking
    {
	int i;

        digitalWrite(led_pin, HIGH); // Flash a light to show received good message
	// Message with a good checksum received, dump it.
	Serial.print("HEX  : ");
	
	for (i = 0; i < buflen; i++)
	{
	    Serial.print(buf[i], HEX);
	    Serial.print(' ');
	}
	Serial.println();
        Serial.println(" ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ");
        digitalWrite(led_pin, LOW);
    }
}
Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012

Да, не имея устройства не поймешь... Че хоть за модуль, 315/433 RF link kit?

Какая схема сейчас собрана?  МК1 --- Передатчик --- Приемник --- МК2 --- ПК (для дебага в мониторе).

1) Для начала сделайте меньше скорость серийника Serial.begin(115200); Протестируйте отдельно. В мониторе тоже не забыть поменять. В передатчике в комент это - Serial.println(msg);

2) Подозрительная строка: vw_set_ptt_inverted(true); // Required for DR3100 комент на нее. Проверить отдельно.

3) С пинами transmit_pin и receive_pin и transmit_en_pin в обоих программах все правильно? (хз зачем их столько, вроде по 1 пину общение идет!?)

4) vw_setup(2000); в обоих скетчах на 2400, потом на 4800, пробуйте. Проверить отдельно.

5) Попробовать этот пример, похож на ваш, но без мусора. Интересный пример по подключению к Serial пинам, без либы VirtualWire. Примеры в книге. Дока по VirtualWire.

 

 

denis64
Offline
Зарегистрирован: 07.10.2013

0) да, такая схема

1) уменьшил до 9600

2) да, непонятная строка, закоментил

3) тоже непонимаю так как общение одностороннее, одного пина должно хватать, но трогать не стал

4) ничего из вышеперечисленного не помогло, а вот 4 вопрос: сделал наоборот - поставил vw_setup(1000);  // Bits per sec и всё заработало!

 

Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012

denis64 пишет:

4) ничего из вышеперечисленного не помогло, а вот 4 вопрос: сделал наоборот - поставил vw_setup(1000);  // Bits per sec и всё заработало!

Это конечно хорошо!

Но все передают на большей скорости, а вы на меньшей. Я бы на вашем месте разобрался с этим моментом. И свой серийник поднимите обратно повыше, хот на 38400, 57600, ...

denis64
Offline
Зарегистрирован: 07.10.2013

Да меня совершенно прикладная задача интересует, передать нажатие кнопки на пульте. И такие скорости вполне устраивают. А серийник я вообще из проекта исключу, он сейчас просто для отладки.

 

MaksMS
Offline
Зарегистрирован: 11.03.2013

Ээээ..?? Радиопульт на ардуине ?  Проще взять что-то типа этого http://www.ebay.com/itm/281037024484 и сопряч с арудиной..

denis64
Offline
Зарегистрирован: 07.10.2013

Этот вариант рассматривался но он не подходит так как обязательно нужно 6 каналов и ударопрочный водонепроницаемый корпус большого размера. Пульт управления кранбалкой в довольно большом цеху.

Замучились уже с проводом свисающим с потолка. Он то перекручивается то не с той стороны груза висит.

denis64
Offline
Зарегистрирован: 07.10.2013

дубль

MaksMS
Offline
Зарегистрирован: 11.03.2013

Эти пульты есть и на большее количество кнопок .Сама микросхема в них поддерживает больше кнопок,чем выведено(как раз до 6)..

Можно использовать плату от этих пультов.

А на ардуино,нужно городить будет спящий режим с пробуждением по прерыванию,иначе замучаетесь батарейки менять.

denis64
Offline
Зарегистрирован: 07.10.2013

ЛЮЮЮЮЮДИИИИИИИ!

Весь на измене я! Макните мою пустую голову в то место где можно зачерпнуть мозгов.

ВСЁ с этими кодами выше работает. Но только когда приёмник (с arduino nano) получает питание от USB компьютера.

Почему приёмник отказывается принимать сигнал (будучи запитанным от +5 c arduino nano)  в то время как она запитана от питания +5,17 V приходящего от USB зарядного блока? Так же отказывается работать когда дуина запитана через VIN от батареек.

И вообще сколько я конфигураций питания перепробывал - ни одна не работает кроме как от компа с юсб.

 

Передатчик работает от батареек.

denis64
Offline
Зарегистрирован: 07.10.2013

MaksMS пишет:

А на ардуино,нужно городить будет спящий режим с пробуждением по прерыванию,иначе замучаетесь батарейки менять.

Приколхожу выключатель с индикацией. Кто забудет выключить тот и пусть покупает батарейки)))

toc
Offline
Зарегистрирован: 09.02.2013

denis64,

>> И вообще сколько я конфигураций питания перепробывал - ни одна не работает кроме как от компа с юсб.

вероятно, оно работает только когда есть активный serial порт.

denis64
Offline
Зарегистрирован: 07.10.2013

Но почему так? Удалил из приёмника всё что касается сериалпорт (и вообще почти всё) и всё равно работает только от компьютера.

Вот код приемника:


#include <VirtualWire.h>
const int led_pin1 = 6;
const int led_pin2 = 7;
const int led_pin3 = 8;
const int led_pin4 = 13;
const int led_pin5 =10;
const int led_pin6 = 11;
const int transmit_pin = 12;
const int receive_pin = 3;
const int transmit_en_pin = 5;

void setup()
{
    delay(1000);


    // Initialise the IO and ISR
    vw_set_tx_pin(transmit_pin);
    vw_set_rx_pin(receive_pin);
    vw_set_ptt_pin(transmit_en_pin);
    vw_set_ptt_inverted(true); // Required for DR3100
    vw_setup(1000);	 // Bits per sec

    vw_rx_start();       // Start the receiver PLL running

    pinMode(led_pin1, OUTPUT);
    pinMode(led_pin2, OUTPUT);
    pinMode(led_pin3, OUTPUT);
    pinMode(led_pin4, OUTPUT);
    pinMode(led_pin5, OUTPUT);
    pinMode(led_pin6, OUTPUT);
    digitalWrite(led_pin1, HIGH);
    digitalWrite(led_pin2, HIGH);
    digitalWrite(led_pin3, HIGH);
    digitalWrite(led_pin4, HIGH);
    digitalWrite(led_pin5, HIGH);
    digitalWrite(led_pin6, HIGH);
}

void loop()
{
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;

    if (vw_get_message(buf, &buflen)) // Non-blocking
    {
        digitalWrite(led_pin4, LOW);
        delay(500); 
        digitalWrite(led_pin4, HIGH); // Flash a light to show received good message
    }
}

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

denis64, для начала нужно взять тестер, и убедиться что питание есть на всех важных точках. Питаете от USB зарядки? Значит проверяйте на usb разъёме, на диоде шоттки, на пине +5 вольт.

denis64
Offline
Зарегистрирован: 07.10.2013

dimax пишет:

denis64, для начала нужно взять тестер, и убедиться что питание есть на всех важных точках. Питаете от USB зарядки? Значит проверяйте на usb разъёме, на диоде шоттки, на пине +5 вольт.

Как не проверить? Проверил конечно. Я же говорю +5.17В. Скетчи работают. Приёма нет. Всё на бредбоарде собрано. Как только штепсель в нану втыкаю от компа - сразу 13 мин начинает мигать синхронно с диодом на передатчике. Через остановку передатчика проверяю что это именно от него был приём.

 

От этой же зарядки запитаны  релейные модули которыми планировалось управлять. Они работают нормально.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

denis64, ну чудес-то не бывает. В скетче компорт не упоминается -значит проблема в питании. Нужно семь раз всё перемерить. На модуль приёмника питание приходит, когда запитываете от внешнего источника? Сфотографируйте наконец, всем миром посмотрим что вы там насоединяли :)

toc
Offline
Зарегистрирован: 09.02.2013

если релейные модули отключить тоже не работает?

denis64
Offline
Зарегистрирован: 07.10.2013

toc пишет:

если релейные модули отключить тоже не работает?

нет, не работает

передатчик в кадр не попал но он работает нормально, когда его выключаешь - приём прекращается

(речь о приёме при запитке от юсб компа конечно)

denis64
Offline
Зарегистрирован: 07.10.2013

вот это рабочая конфигурация (питание отключено пока, но в работе 13 пин как и положено по скетчу активен и через него светится белый диод)

если этот штекер вытащить и воткнуть от юсб зарядного устройства то приём прекращается

напряжение на выходе с зарядки нормальное 5 в, мощности с головой хватает

если туда вообще ничего не совать а подключить положительные 6 вольт от батареек на vin ардуины и землю на gnd то ардуина с приёмником работают, на приёмнике питание есть, диоды на плате как положено горят

но приёма нет

denis64
Offline
Зарегистрирован: 07.10.2013

пробовал другой мк в качестве приёмника а так же менял местами эти - не помогло

ustas
Offline
Зарегистрирован: 12.03.2012

вот такие модули - крайне капризные (иногда пару вообще не удается запустить - у меня несколько пар таких валяются, не работают, а выкинуть вроде жаль). 

С дальностью работы - тоже не все так хорошо, как хотелось бы.

Боюсь, что у вас в реальных условиях работы (цех, насколько я понял) будет еще хуже, чем на макетке - добавятся проблемы. 

Кстати, что будет, если вдруг какая-то из релюх, управляющих кран-балкой включится и не получит вовремя команду на выключение?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

denis64, да, визуально всё в норме. Попробуйте другой БП на 5 вольт и ток не менее 0,5 ампера, или подайте на вход Vin напряжение не менее 8 вольт тоже помощней. Высокочастотная техника капризна к питанию..

denis64
Offline
Зарегистрирован: 07.10.2013

ustas пишет:

стати, что будет, если вдруг какая-то из релюх, управляющих кран-балкой включится и не получит вовремя команду на выключение?

Будет две релюхи на команду. А что касается второго, то сейчас, с кабелем так очень часто происходит.