roboforum.ru

Технический форум по робототехнике.

cvAVR + nRF24L01+ (разрабатывается библиотека)

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

cvAVR + nRF24L01+ (разрабатывается библиотека)

Сообщение sky-walker » 18 ноя 2012, 20:34

Всем доброго времени суток.

Захотелось поднять беспроводной канал связи (хочу по нему температуру с DHT22\AM2303 передавать). Заказал для этих целей пару трансиверов nRF24L01+ (eBay, ДШ). Полез в даташит, а он - 78стр... Беглое чтение дало понять, что работает по SPI, есть куча фич (125каналов, автосборка-разборка пакета, возможность принимать от 6 девайсов параллельно, проверка на правильность). Но как с ним работать - так и не понял... Даже проверить не могу. Нашел либу на С, но она под WinAVR и под обычную (не +) версию... В рунете про нее очень мало, на англоязычных тоже шаром покати (ну или я ищу неправильно...)

Подскажите пожалуйста, как с ним работать? Я так понял, под SPI придется писать свою либу (в встроенной только одна функция, сразу пишет и читает по 1 байту, а там нек. данные (адреса например) - 5 байт) нашел подходящую. Может, есть какие-то готовые либы под данный трансивер, или хотя бы примеры приема\передачи?

Заранее спасибо.
Последний раз редактировалось sky-walker 03 янв 2013, 02:50, всего редактировалось 1 раз.
Аватара пользователя
sky-walker
 
Сообщения: 40
Зарегистрирован: 29 сен 2012, 14:41
прог. языки: C\C++, AutoIt, PHP

Re: cvAVR + nRF24L01+...

Сообщение Romikgy » 19 ноя 2012, 12:04

обычный spi радиоудлинитель только с буферизацией и своим протоколом общения
как я понял DHT22 это 1-wire устройство , т.е. контроллер надо ставить на двух сторонах, на стороне датчика для конвертации из 1-wire to spi
die Wahrheit ist irgendwo da draußen
Аватара пользователя
Romikgy
 
Сообщения: 750
Зарегистрирован: 15 ноя 2009, 13:37
Откуда: Porto Franco "Odessa"

Re: cvAVR + nRF24L01+...

Сообщение sky-walker » 19 ноя 2012, 13:44

Про DHT я разобрался давно, он у меня работает.
Спасибо, буду пробовать подключать...
Аватара пользователя
sky-walker
 
Сообщения: 40
Зарегистрирован: 29 сен 2012, 14:41
прог. языки: C\C++, AutoIt, PHP

Re: cvAVR + nRF24L01+...

Сообщение sky-walker » 19 ноя 2012, 20:58

Так, регистры считывать научился, уже хорошо :)
Вроде SPI работает в режиме 0, макс. скорость не выяснил, стоит максимально доступная в codeWizard - 2МГц (без "x2" флага).
Попробую что-нибудь записать, и, собственно, осуществить передачу...

Romikgy писал(а):контроллер надо ставить на двух сторонах, на стороне датчика для конвертации из 1-wire to spi

Что-то не сразу въехал, медленный сегодня... Да, это само собой. Планирую что-нибудь с малыми энергозатратами - может тиньку какую, или мегу с L на конце...
Аватара пользователя
sky-walker
 
Сообщения: 40
Зарегистрирован: 29 сен 2012, 14:41
прог. языки: C\C++, AutoIt, PHP

Re: cvAVR + nRF24L01+...

Сообщение sky-walker » 21 ноя 2012, 14:04

Запустил, ура! За основу взял либу от Tinkerer, немного переделал. Сейчас буду добавлять функций для удобной работы... Тему можно считать закрытой (но как допишу либу, сюда скину).

UPD (03.01.13): Появилось свободное время и интерес - взялся наконец за либу. Пока реализовал: настройку скорости, мощности, канала, размера payload для каждой pipe, количество и время задержки для retransmit.
Следующие приоритетные вещи: разрешение\запрет pipe1-5, динамический размер payload, считывание приемных буферов с pipe1-5 (сейчас только p0), улучшение кода прерывания (тогда и функция mirf_data_ready отпадет, и проверка успешной передачи будет), режим работы библиотеки без прерывания (мало ли - нога занята и т.д., все функции будут блокирующими), возможность выбора порта для CSN и CS. Как доделаю все это - выложу сюда промежуточную версию. А то в инете кроме библиотеки Tinkerer'а (я на его основе делаю) - ничего нет...

И кстати, с Новым Годом! :beer:
Аватара пользователя
sky-walker
 
Сообщения: 40
Зарегистрирован: 29 сен 2012, 14:41
прог. языки: C\C++, AutoIt, PHP

Re: cvAVR + nRF24L01+ (разрабатывается библиотека)

Сообщение cas2010 » 04 сен 2013, 03:10

sky-walker Здравствуйте, я вот почитал вашу тему, и у меня вопрос, у вас получилось с бибилиотекой на CodeVisionAvr? Если да то пожалуйста поделитесь... очень прошу... unu@mail.ru
cas2010
 
Сообщения: 1
Зарегистрирован: 04 сен 2013, 03:07

Re: cvAVR + nRF24L01+ (разрабатывается библиотека)

Сообщение _pva » 02 апр 2014, 14:06

Здравствуйте! Поделитесь библиотекой(проектом) под CodeVisionAvr пожалуйста! Сбросьте в личку или здесь приложите. СПАСИБО!
_pva
 
Сообщения: 1
Зарегистрирован: 02 апр 2014, 14:04

Re: cvAVR + nRF24L01+ (разрабатывается библиотека)

Сообщение Insler » 24 апр 2014, 02:56

А можно и мне, пожалуйста? :roll:
Asondo.kun@gmail.com
Insler
 
Сообщения: 42
Зарегистрирован: 24 апр 2014, 02:46
Откуда: Санкт-Петербург
прог. языки: С

Re: cvAVR + nRF24L01+ (разрабатывается библиотека)

Сообщение Chipkin » 25 апр 2014, 09:08

И мне сбросьте, пожалуйста?
AV89@yandex.ru
Chipkin
 
Сообщения: 1
Зарегистрирован: 25 апр 2014, 09:04

Re: cvAVR + nRF24L01+ (разрабатывается библиотека)

Сообщение Insler » 27 апр 2014, 09:57

Скачал либу Tinkener'a, все поставил. Отредактировал файлик. Все компилится. Ща буду экспериментировать. Код для radioPinFunctions.c получился такой:
Код: Выделить всёРазвернуть
//#include <avr/io.h>

#define set_bit(reg,bit) reg |= (1<<bit)
#define clr_bit(reg,bit) reg &= ~(1<<bit)
#define check_bit(reg,bit) (reg&(1<<bit))

/* ------------------------------------------------------------------------- */
void nrf24_setupPins()
{
    DDRB=0b101110;
    /*
    set_bit(DDRA,0); // PB2 CE output
    set_bit(DDRA,1); // PB1 CSN output
    set_bit(DDRA,2); // PB5 SCK output
    set_bit(DDRA,3); // PB3 MOSI output
    clr_bit(DDRA,4); // PB4 MISO input
    */
}
/* ------------------------------------------------------------------------- */
void nrf24_ce_digitalWrite(uint8_t state)
{
    if(state)
    {
        PORTB.2=1;
    }
    else
    {
        PORTB.2=0;
    }
}
/* ------------------------------------------------------------------------- */
void nrf24_csn_digitalWrite(uint8_t state)
{
    if(state)
    {
        PORTB.1=1;
    }
    else
    {
        PORTB.1=0;
    }
}
/* ------------------------------------------------------------------------- */
void nrf24_sck_digitalWrite(uint8_t state)
{
    if(state)
    {
        PORTB.5=1;
    }
    else
    {
        PORTB.5=0;
    }
}
/* ------------------------------------------------------------------------- */
void nrf24_mosi_digitalWrite(uint8_t state)
{
    if(state)
    {
        PORTB.3=1;
    }
    else
    {
        PORTB.3=0;
    }
}
/* ------------------------------------------------------------------------- */
uint8_t nrf24_miso_digitalRead()
{
    return PINB.4;
}
/* ------------------------------------------------------------------------- */



Настраивается все как-то так уже в void main(void) :)
Код: Выделить всёРазвернуть
/* Настройка nRF24 */
nrf24_init();
nrf24_rx_address("serv1"); //адрес приемника
nrf24_tx_address("cli1");   //адрес кому отправлять будем
nrf24_config(2, 32);  //выбираем канал №2, и длину пакета в 32 байта


Добавлено спустя 2 часа 21 минуту 50 секунд:
Так. Все завелось. Итого результаты такие.
Вот код конфигурации для mega328p в файле radioPinFunctions.c:
Код: Выделить всёРазвернуть
#define set_bit(reg,bit) reg |= (1<<bit)
#define clr_bit(reg,bit) reg &= ~(1<<bit)
#define check_bit(reg,bit) (reg&(1<<bit))

/* ------------------------------------------------------------------------- */
void nrf24_setupPins()
{
    DDRB.2=1;
    DDRB.1=1;
    DDRB.5=1;
    DDRB.3=1;
    DDRB.4=0;
    /*
    set_bit(DDRA,0); // PB2 CE output
    set_bit(DDRA,1); // PB1 CSN output
    set_bit(DDRA,2); // PB5 SCK output
    set_bit(DDRA,3); // PB3 MOSI output
    clr_bit(DDRA,4); // PB4 MISO input
    */
}
/* ------------------------------------------------------------------------- */
void nrf24_ce_digitalWrite(uint8_t state)
{
    if(state)
    {
        PORTB.2=1;
    }
    else
    {
        PORTB.2=0;
    }
}
/* ------------------------------------------------------------------------- */
void nrf24_csn_digitalWrite(uint8_t state)
{
    if(state)
    {
        PORTB.1=1;
    }
    else
    {
        PORTB.1=0;
    }
}
/* ------------------------------------------------------------------------- */
void nrf24_sck_digitalWrite(uint8_t state)
{
    if(state)
    {
        PORTB.5=1;
    }
    else
    {
        PORTB.5=0;
    }
}
/* ------------------------------------------------------------------------- */
void nrf24_mosi_digitalWrite(uint8_t state)
{
    if(state)
    {
        PORTB.3=1;
    }
    else
    {
        PORTB.3=0;
    }
}
/* ------------------------------------------------------------------------- */
uint8_t nrf24_miso_digitalRead()
{
    return PINB.4;
}


Используемые либы; не забываем в свойствах проекта указать пути к библиотеке. Файл radioPinFunctions.c лежит где-то в примерах, я его выкинул в корень либы и вытаскиваю оттуда:
Код: Выделить всёРазвернуть
#include <mega328p.h>
#include <delay.h>
#include <stdio.h>
#include <nrf24.h>
#include <radioPinFunctions.c>


Настраиваем передатчик в void mai(void):
Код: Выделить всёРазвернуть
/* Настройка nRF24 */
nrf24_init();
nrf24_rx_address("serv1"); //адрес приемника
nrf24_tx_address("cli1");   //адрес кому отправлять будем
nrf24_config(2, 32);  //выбираем канал №2, и длину пакета в 32 байта


Как выглядит передача данных:
Код: Выделить всёРазвернуть
nrf24_send("banana"); //отправляем строку
while(nrf24_isSending()); //ждем пока отправится. Бесконечные циклы это зло, не забудьте создать таймаут


Прием данных:
Код: Выделить всёРазвернуть
nrf24_powerUpRx(); //выводим и спячки и говорим "Слушай!"
while(!nrf24_dataReady()); //ждем пока придут данные
nrf24_getData(data_array); //вытаскиваем данные из буфера


Бонусные вкусности:
Код: Выделить всёРазвернуть
var = nrf24_lastMessageStatus(); //возвращает 1 если в последний раз все отправилось успешно
var = nrf24_retransmissionCount(); //возвращает количество попыток отправить ушедший пакет
nrf24_powerDown(); //отправляет модуль спать


Пока все. Курю мануалы дальше 8)

Добавлено спустя 49 минут 35 секунд:
Теперь у меня вопрос :)

А кто-нибудь игрался с адресами? Или делал ретранслятор?

Ну допустим. Есть сеть, в которой несколько клиентов, сервер и ретранслятор.

Ретранслятор должен принимать все сообщеньки и ретранслировать их без изменений PID и прочей чуши.
Сервер должен принимать сообщеньки от всех, и на месте разбираться от кого пришла сообщенька и отправлять результат обратно.

Как реализовать проверку адресов уже на месте, без автоматической проверки?
Insler
 
Сообщения: 42
Зарегистрирован: 24 апр 2014, 02:46
Откуда: Санкт-Петербург
прог. языки: С

Re: cvAVR + nRF24L01+ (разрабатывается библиотека)

Сообщение Madf » 27 апр 2014, 10:52

Подтверждения не нужны, это всё есть в железке, надо только включить настройки правильно (и CRC тоже). Выглядит это всё просто, отправляешь данные и считываешь регистр состояния по прерыванию, там сразу ясно становится, данные отправлены/приняты корректно или нет.

Проблема с адресацией модулей имеется, на эту тему долго размышлял, сложность вся в том, что модули на себя берут только 50% рутины. Если в сети будет более одного устройства с одинаковыми адресами, то данные примут все, но подтвердить получение у них не получится, т.к. адресация одна (все откликнуться). Автоматическую адресацию делать практически не реально, всё сводится к ручной выдачи адреса (PID). Можно попытаться организовать авто раздачу адресов в сети, но будет жесткое ограничение, на единицу времени может подключаться только одно устройство! Если сразу включится много устройств, то будет опять клин и всё потому, что трансивер/ресивер разные блоки в чипе...
Madf
 
Сообщения: 3298
Зарегистрирован: 03 янв 2012, 12:55
Откуда: Москва
прог. языки: VB6, BASCOM, ASM...

Re: cvAVR + nRF24L01+ (разрабатывается библиотека)

Сообщение avr123.nm.ru » 27 апр 2014, 11:04

Советую делать мешь сеть или что-то мульти-точечное, а не точка точка.
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: cvAVR + nRF24L01+ (разрабатывается библиотека)

Сообщение Insler » 27 апр 2014, 18:10

Нет, ну вот есть же функция ретранслятора. То есть в теории модуль может принять данные от любого девайса, и потом их же нужному адресу кинуть в воздух, в этом время данные все хранятся в FIFO, и их оттуда реально стянуть...
Можно же как-то выйти на ручное управление и выключить авто подтверждения и прочие вещи. В датащите я уже перекопал все, но формулировки какие-то слишком расплывчатые

Добавлено спустя 9 минут 59 секунд:
Нет, ну в принципе, одинаковые адреса это можно обойти. Другой вопрос, а вот прислал мне допустим клиент какие-то данные. Я могу откуда-то вытащить адрес этого клиента? Чтобы после обработки данных я мог вернуть какие значения тому, кто их запросил. Или придется обратный адрес включать в пакет данных дополнительно?

И еще надо подумать как обойти конфликт двух серверов, если они окажутся в области видимости )

Вот, еще вопрос появился. В теории, судя по датащиту, я могу запустить на стороне сервера аж 6 параллельных уха, и каждое могу настроить на свой адрес и канал, кто-нибудь пробовал реализовать? Часть конфликтов по крайней мере может решится так. Если канал в данный момент занят переходит на другой и передаем серверу тож самое

Добавлено спустя 35 минут 15 секунд:
:pardon:

Добавлено спустя 11 минут 5 секунд:
avr123.nm.ru писал(а):Советую делать мешь сеть или что-то мульти-точечное, а не точка точка.



А какие-нибудь примеры можете привести? :roll:
Вложения
мкуц.PNG
Вот это не то, что мне нужно? :)
Insler
 
Сообщения: 42
Зарегистрирован: 24 апр 2014, 02:46
Откуда: Санкт-Петербург
прог. языки: С

Re: cvAVR + nRF24L01+ (разрабатывается библиотека)

Сообщение avr123.nm.ru » 27 апр 2014, 18:19

вот из моих заметок:

mesh xbee стек RFM22B RFM23B Si4430 RF22 Arduino atmega328 - http://www.airspayce.com/mikem/arduino/RF22/index.html

RFBee RF module Arduino Atmega168 и CC1101 RF transceiver
http://www.seeedstudio.com/depot/RFbee- ... p-614.html

ZigBee модули Telit mesh на CC2430 протокол симплисити www.ti.com

MESH-протокол с открытым кодом для Интернета вещей Thingsquare

аппаратные сети радио-чипы соки:

zigbee mesh чип ATmega256RFR2 atmel http://www.atmel.com/devices/ATMEGA256RFR2.aspx

mesh чип http://www.analog.com/static/imported-f ... DF7023.pdf
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: cvAVR + nRF24L01+ (разрабатывается библиотека)

Сообщение Insler » 27 апр 2014, 20:54

Madf писал(а):Если в сети будет более одного устройства с одинаковыми адресами, то данные примут все, но подтвердить получение у них не получится, т.к. адресация одна (все откликнуться).

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

Тут вроде тоже решаемо. А вот как слушать одновременно несколько каналов и принимать, а потом обрабатывать, особенно в случаях, когда у нас нет подтверждения, это уже серьезный такой вопрос :o
Insler
 
Сообщения: 42
Зарегистрирован: 24 апр 2014, 02:46
Откуда: Санкт-Петербург
прог. языки: С

След.

Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 5