Радио модуль для Raspberry Pi
Хотите передавать данные с помощью вашей платы Raspberry Pi, управлять вашими радио-розетками (433МГц) или получать информацию от вашей портативной погодной станции за окном?Но у вас нет желания разогревать вашу паяльную станцию и паять подобное решение самостоятельно. Вы хотите иметь элегантное и профессиональное решение европейского качества?
Если - да, то тогда вы в правильном месте!
Наш новый модуль Pi433 позволит вам в мгновение ока расширить функционал вашей Raspberry Pi приемо-передатчиком работающим на частоте 433 МГц. Pi433 удобно и легко устанавливается на разъёмы общего назначения вашей Raspberry.
Он настолько компактен, что помещается практически во все доступные корпуса для Raspberry Pi.
Pi433 оборудован встроенной в печатную плату антенной, технические характеристики которой достаточны для большинства вариантов использования. Так же в модуле есть возможность подсоединения внешней антенны через U.FL разъём, что позволяет применять Pi433 в ещё более широком спектре технических решений.
Данный модуль открывает огромный простор для использования беспроводной коммуникации с вашей Raspberry Pi. Вы можете обмениваться беспроводной информацией, как между двумя Raspberry Pi, так и с другими устройствами работающими на 433МГц. Например радиоуправляемыми розетками, датчиками температуры, оконными ролетами и т.д.
Карта сайта
Особенности Pi433Техническая информация
Установка Pi433
Управление Pi433
Приобретение Pi433
Контактные данные
Особенности Pi433
- устанавливается на все вариатны серии плат Raspberry Pi (Pi zero требует дополнительной установки разъёма)
- возможно установить на множество других устройств имеющих совместимый разъём (GPIO)(Banana Pi, Orange Pi, ...)
- требует всего 10 пинов, все остальные могут быть исспользованы по вашему усмотрению
- поддерживает, как прием, так и передачу данных
- поддерживает несколько режимов модуляции сигнала (FSK, MSK, OOK)
- поддерживает подстраиваемую частоту 433 МГц в ISM диапазоне (433,05...434,79MHz)
- поддерживает режим FIFO, который позволяет сперва загрузить данные, а потом их передавать, без участия Raspberry Pi (нет необходимости делать pin toggeling)
- так же имеет другие возможности ( например: генерация и обнаружение преамбулы, фильтр адресов, AES, CRC)
- поддерживает подключение внешней антенны через U.FL разъём
- Linux kernel driver интегрированный в официальное дерево, начиная с Linux kernel 4.14
- cертификат CE
Техническая информация
Pi433 оснащен приемо-передатчиком RFM69 от фирмы HopeRf. Документация используемого модуля доступна в интернете, например здесь. Технические характеристики RFM69 практически полностью поддреживаются Pi433:- +13 дБм мощность выхода
- Высокая чуствительность: до -120 дБм на 1.2 Кб/с
- Высокая избирательность: 16-tap FIR фильтр канала
- Программируемая Pout: -18дБм to +13 дБм с шагом 1дБм
- Пропусканя способность FSK до 300 Кб/с
- Полностью интегрированный синтезатор с разрешением 61 Гц
- FSK, GFSK, MSK, GMSK и OOK модуляции
- Встроенный синхронизатор битов выполняющий восстановление синхросигнала
- Распознавание входного синхронизационного слова
- 115 дБ+ динамический диапазон RSSI
- Автоматический детектирование RF Sense с ультра-быстрым AFC
- Пакетный препроцессор с CRC-16, AES-128, 66-byte FIFO
- Встроенный температурный сенсор
модуль | Raspberry Pi |
---|---|
DIO0 | GPIO24 |
DIO1 | GPIO25 |
DIO2 | GPIO7 |
Установка Pi433
Pi433 может быть установлена в GPIO разъём Raspberry Pi.На Raspberry Pi второго и третьего поколений, а так же в модели B+, Pi433 устанавливается в середине GPIO разъёма. Правильное положение - семь двойных пинов со стороны сетевого разъёма, с другой стороны восемь.
На первом поколении Raspberry Pi модуль устанавливается с краю разъёма GPIO со стороны разъёма RCA (video out).
Управление Pi433
Pi433 управляется через SPI интерфейс.Детальное описание регистров и вариантов работы можно найти в документации модуля RFM69CW.
Ниже вы найдете два примера, которые демонстрируют идею работы с Pi433 через SPI интерфейс. Первый пример реализует простой передатчик, который передает телеграмму длиной в 16 байт, каждый раз по нажатию кнопки. Второй пример демонстрирует приемник этой телеграммы. Эти два примера используют несколько дополнительных функций предоставляемых модулем RFM69 для проверки ошибок передачи: генерация/обнаружение преамбулы, генерация синхро-слова и CRC.
/* * Pi433 tx demo * * Copyright (c) 2017 Marcus Wolf <marcus.wolf@wolf-entwicklungen.de> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License. * */ #include <stdint.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <sys/ioctl.h> #include <linux/types.h> #include <linux/spi/spidev.h> #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) #define PAYLOAD_LEN 16 static void pabort(const char *s) { perror(s); abort(); } static uint8_t bits = 8; static uint32_t speed = 500000; static uint16_t delay = 0; static int setupRFParameters(int fd) { int i, ret; uint8_t tx[] = { /* attention - do not modify this parameters */ unless you know what you do. Wrong settings may violate yapplicable law */ 0x81,0x04, // set standby mode (just for safety) 0x82,0x08, // OOK, packet, no shaping 0x91,0x9f, // set up power amps 0x98,0x08, // antenna impedance (default: 50Ohm) 0x87,0x6c, // frequency 0x88,0x7a, // frequency 0x89,0xe1, // frequency 0x83,0x1a, // bit rate 0x84,0x0a, // bit rate 0x85,0x00, // deviation (FSK only) 0x86,0x45, // deviation (FSK only) 0x92,0x09, // pa ramp (default: 40µs) }; for (i = 0; i < ARRAY_SIZE(tx); i+=2) { struct spi_ioc_transfer tr = { .tx_buf = (int)tx+i, .rx_buf = 0, .len = 2, .delay_usecs = delay, .speed_hz = speed, .bits_per_word = bits, }; ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr); if (ret < 1) pabort("can't send spi message to \ setup RF parameters"); } printf("RF parameters set up\n"); } static int setupMessageParameters(int fd) { int i, ret; uint8_t tx[] = { 0xBC,0x80, // startup condition (fifo not empty) 0xB8,PAYLOAD_LEN, // payload length 0xAC,0x00, // preamble size 0xAD,0x0a, // preamble size 0xB7,0x10, // fixed length, CRC on, no adress filtering 0xAE,0x98, // sync pattern on, 3 bytes 0xAF,0x01, // 1st sync byte 0xB0,0x02, // 2nd sync byte 0xB1,0x03, // 3rd sync byte }; for (i = 0; i < ARRAY_SIZE(tx); i+=2) { struct spi_ioc_transfer tr = { .tx_buf = (int)tx+i, .rx_buf = 0, .len = 2, .delay_usecs = delay, .speed_hz = speed, .bits_per_word = bits, }; ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr); if (ret < 1) pabort("can't send spi message to setup \ message parameters"); } printf("message parameters set up\n"); } static int transferData(int fd, unsigned int packetNr) { int i, ret; uint8_t tx[] = { 0x81,0x04, // stop transmission (in case stil active) /* load fifo */ 0x80,(packetNr & 0xff00) >> 8, 0x80,packetNr & 0xff, 0x80,0xAA, 0x80,0x55, 0x80,0x88, 0x80,0x88, 0x80,0x88, 0x80,0x88, 0x80,0x88, 0x80,0x8E, 0x80,0x8E, 0x80,0x88, 0x80,0x8E, 0x80,0x8E, 0x80,0x47, 0x80,0x11, 0x81,0x0c, // start transmission }; for (i = 0; i < ARRAY_SIZE(tx); i+=2) { struct spi_ioc_transfer tr = { .tx_buf = (int)tx+i, .rx_buf = 0, .len = 2, .delay_usecs = delay, .speed_hz = speed, .bits_per_word = bits, }; ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr); if (ret < 1) pabort("can't send spi message \ to trasmit data"); } printf("Transmission started\n"); } int main(int argc, char *argv[]) { int i; int fd; int packetNr = 0; printf("*** Pi433 TX demo by Marcus Wolf ***\n"); printf("Press enter to send further telegrams.\n"); printf("Enter 'q' to quit\n\n"); /* open and configure SPI interface */ fd = open("/dev/spidev0.0", O_RDWR); if (fd < 0) pabort("can't open spi. Maybe you need to enable \ spi by calling \"raspi-config\""); setupRFParameters(fd); setupMessageParameters(fd); do { transferData(fd,packetNr++); sleep(1); // wait for transmission to complete } while(getchar() != 'q'); close(fd); return 0; }
/* * Pi433 rx demo * * Copyright (c) 2017 Marcus Wolf <marcus.wolf@wolf-entwicklungen.de> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License. * */ #include <string.h> #include <stdint.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <sys/ioctl.h> #include <linux/types.h> #include <linux/spi/spidev.h> #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) #define PAYLOAD_LEN 16 static void pabort(const char *s) { perror(s); abort(); } static uint8_t bits = 8; static uint32_t speed = 500000; static uint16_t delay = 0; static int setupRFParameters(int fd) { int i, ret; uint8_t tx[] = { /* attention - do not modify this parameters */ unless you know what you do. Wrong settings may violate yapplicable law */ 0x81,0x04, // set standby mode (just for safety) 0x82,0x08, // OOK, packet, no shaping 0x91,0x9f, // set up power amps 0x98,0x08, // antenna impedance (default: 50Ohm) 0x87,0x6c, // frequency 0x88,0x7a, // frequency 0x89,0xe1, // frequency 0x83,0x1a, // bit rate 0x84,0x0a, // bit rate 0x85,0x00, // deviation (FSK only) 0x86,0x45, // deviation (FSK only) 0xA9,0x90, // RSSI threshold 0x9B,0x43, // OOK threshold 0x99,0x90, // bandwidth configuration 0x9A,0x90, // bandwidth configuration 0xEF,0x00, // continuous Dagc in normal mode }; for (i = 0; i < ARRAY_SIZE(tx); i+=2) { struct spi_ioc_transfer tr = { .tx_buf = (int)tx+i, .rx_buf = 0, .len = 2, .delay_usecs = delay, .speed_hz = speed, .bits_per_word = bits, }; ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr); if (ret < 1) pabort("can't send spi message \ to setup RF parameters"); } printf("RF parameters set up\n"); } static int setupMessageParameters(int fd) { int i, ret; uint8_t tx[] = { 0xBC,0x80, // startup condition (fifo not empty) 0xB8,PAYLOAD_LEN, // payload length 0xAC,0x00, // preamble size 0xAD,0x0a, // preamble size 0xB7,0x10, // fixed length, CRC on, no adress filtering 0xAE,0x98, // sync pattern on, 3 bytes 0xAF,0x01, // 1st sync byte 0xB0,0x02, // 2nd sync byte 0xB1,0x03, // 3rd sync byte }; for (i = 0; i < ARRAY_SIZE(tx); i+=2) { struct spi_ioc_transfer tr = { .tx_buf = (int)tx+i, .rx_buf = 0, .len = 2, .delay_usecs = delay, .speed_hz = speed, .bits_per_word = bits, }; ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr); if (ret < 1) pabort("can't send spi message to \ setup message parameters"); } printf("message parameters set up\n"); } static int receiveData(int fd) { int i, ret; struct spi_ioc_transfer tr; struct data_struct { uint8_t reg; uint8_t value; }; union data_union { struct data_struct strct; uint8_t array[2]; } data; uint8_t rx[66]; int messageLen; /* prepare tr struct */ memset(&tr, 0, sizeof(tr)); tr.tx_buf = (int)data.array; tr.rx_buf = (int)rx; tr.len = 2; tr.delay_usecs = delay; tr.speed_hz = speed; tr.bits_per_word = bits; /* start reception */ data.strct.reg = 0x81; data.strct.value = 0x10; ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr); if (ret < 1) pabort("can't send spi message to \ start reception\n"); /* wait for CRC ok */ rx[1]=0x00; while( (rx[1] & 0x02) == 0 ) { data.strct.reg = 0x28; data.strct.value = 0; ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr); if (ret < 1) pabort("can't send spi message to \ read flag register\n"); } /* read fifo */ data.strct.reg = 0x00; data.strct.value = 0; for (i = 0; i < ARRAY_SIZE(rx); i+=2) { tr.rx_buf = (int)rx+i; ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr); if (ret < 1) pabort("can't send spi message to read fifo"); } /* set standby mode */ data.strct.reg = 0x81; data.strct.value = 0x04; ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr); if (ret < 1) pabort("can't send spi message to switch to standby\n"); /* every second value in buffer contains a valid value */ for (i = 0; i < PAYLOAD_LEN*2; i+=2) { printf("0x%x ",rx[i+1]); } printf("\n"); } int main(int argc, char *argv[]) { int i; int fd; int packetNr = 0; printf("*** Pi433 RX demo by Marcus Wolf ***\n"); /* open and configure SPI interface */ fd = open("/dev/spidev0.0", O_RDWR); if (fd < 0) pabort("can't open spi. Maybe you need to enable \ spi by calling \"raspi-config\""); setupRFParameters(fd); setupMessageParameters(fd); /* receive */ printf("entering endless loop to receive telegrams\n"); while (1) receiveData(fd); /* these lines will never be reaced */ close(fd); return 0; }
Загрузить пример кода передатчика.
Загрузить пример кода приемника.
Следующий пример демонстрирует механизм контроля радиоуправляемой розетки. Пример написан для розеток с чипсетом PT2262 (или совместимых, например HX2262 и SC5272). Для управления другими типами розеток необходимо будет внести изменение в код. Текущий пример оптимизирован для работы с розетками PFS-3 от Pollin electronics.
/* * Pi433 socket demo (for sockets with PT2262 or compatible) * * Copyright (c) 2017 Marcus Wolf <marcus.wolf@wolf-entwicklungen.de> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * */ #include <stdint.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <sys/ioctl.h> #include <linux/types.h> #include <linux/spi/spidev.h> #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) #define REPETITIONS 4 #define PAYLOAD_LEN 32*REPETITIONS static void pabort(const char *s) { perror(s); abort(); } static uint8_t bits = 8; static uint32_t speed = 500000; static uint16_t delay = 0; static uint8_t tx[PAYLOAD_LEN + 4]; static int setupRFParameters(int fd) { int i, ret; uint8_t tx[] = { /* attention - do not modify this parameters unless you */ /* know what you do */ /* wrong settings may lead to violation of law */ 0x81,0x04, // set standby mode (just for safety) 0x82,0x08, // OOK, packet, no shaping 0x91,0x9f, // set up power amps 0x98,0x08, // antenna impedance (default: 50Ohm) 0x87,0x6c, // frequency 0x88,0x7a, // frequency 0x89,0xe1, // frequency 0x83,0x25, // bit rate 0x84,0xe0, // bit rate 0x92,0x09, // pa ramp (default: 40µs) }; for (i = 0; i %lt; ARRAY_SIZE(tx); i+=2) { struct spi_ioc_transfer tr = { .tx_buf = (int)tx+i, .rx_buf = 0, .len = 2, .delay_usecs = delay, .speed_hz = speed, .bits_per_word = bits, }; ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr); if (ret < 1) pabort("can't send spi message"); } printf("RF parameter set up\n"); } static int setupMessageParameters(int fd) { int i, ret; uint8_t tx[] = { 0xBC,0x80, // startup condition: fifo not empty 0xB8,PAYLOAD_LEN, // payload length 0xAC,0x00, // preamble size 0xAD,0x00, // preamble size 0xB7,0x10, // fixed length, CRC off, no adress filtering 0xAE,0x80, // sync pattern config: off }; for (i = 0; i < ARRAY_SIZE(tx); i+=2) { struct spi_ioc_transfer tr = { .tx_buf = (int)tx+i, .rx_buf = 0, .len = 2, .delay_usecs = delay, .speed_hz = speed, .bits_per_word = bits, }; ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr); if (ret < 1) pabort("can't send spi message"); } printf("message parameter set up\n"); } static int prepareTxDataOn(void) { int i; /* stop transmission (in case stil active) */ tx[0] = 0x81; tx[1] = 0x04; /* load fifo */ for (i=0; i < REPETITIONS; i++) { /* This dataset is intended to control sockets equipped with a PT2262 chip or comparable. The second column contains the data. 0x88 = on, 0x8E = high-z. Sockets of different companies use different wiring on the PT chip. So maybe you need to tune. Left comments shows most commen combination */ tx[32*i+ 2] = 0x80; tx[32*i+ 3] = 0x88; // 1 // 8 tx[32*i+ 4] = 0x80; tx[32*i+ 5] = 0x88; // 2 // 7 tx[32*i+ 6] = 0x80; tx[32*i+ 7] = 0x88; // 3 // 6 tx[32*i+ 8] = 0x80; tx[32*i+ 9] = 0x88; // 4 // 5 tx[32*i+10] = 0x80; tx[32*i+11] = 0x88; // 5 // open tx[32*i+12] = 0x80; tx[32*i+13] = 0x8E; // 6 // open tx[32*i+14] = 0x80; tx[32*i+15] = 0x8E; // A // GND tx[32*i+16] = 0x80; tx[32*i+17] = 0x88; // B // GND tx[32*i+18] = 0x80; tx[32*i+19] = 0x8E; // C // Teste 1 tx[32*i+20] = 0x80; tx[32*i+21] = 0x8E; // D // Teste 2 tx[32*i+22] = 0x80; tx[32*i+23] = 0x88; // L // Taste 4? tx[32*i+24] = 0x80; tx[32*i+25] = 0x8E; // R // Taste 2 tx[32*i+26] = 0x80; tx[32*i+27] = 0x80; // S1 // S1 tx[32*i+28] = 0x80; tx[32*i+29] = 0x00; // S2 // S2 tx[32*i+30] = 0x80; tx[32*i+31] = 0x00; // S3 // S3 tx[32*i+32] = 0x80; tx[32*i+33] = 0x00; // S4 // S4 } /* start transmission */ tx[32*i+0] = 0x81; tx[32*i+1] = 0x0c; } static int prepareTxDataOff(void) { int i; /* stop transmission (in case stil active) */ tx[0] = 0x81; tx[1] = 0x04; /* load fifo */ for (i=0; i < REPETITIONS; i++) { /* This dataset is intended to control sockets equipped with a PT2262 chip or comparable. The second column contains the data. 0x88 = on, 0x8E = high-z. Sockets of different companies use different wiring on the PT chip. So maybe you need to tune. Left comments shows most commen combination */ tx[32*i+ 2] = 0x80; tx[32*i+ 3] = 0x88; // 1 // 8 tx[32*i+ 4] = 0x80; tx[32*i+ 5] = 0x88; // 2 // 7 tx[32*i+ 6] = 0x80; tx[32*i+ 7] = 0x88; // 3 // 6 tx[32*i+ 8] = 0x80; tx[32*i+ 9] = 0x88; // 4 // 5 tx[32*i+10] = 0x80; tx[32*i+11] = 0x88; // 5 // open tx[32*i+12] = 0x80; tx[32*i+13] = 0x8E; // 6 // open tx[32*i+14] = 0x80; tx[32*i+15] = 0x8E; // A // GND tx[32*i+16] = 0x80; tx[32*i+17] = 0x88; // B // GND tx[32*i+18] = 0x80; tx[32*i+19] = 0x8E; // C // button 1 tx[32*i+20] = 0x80; tx[32*i+21] = 0x8E; // D // button 3 tx[32*i+22] = 0x80; tx[32*i+23] = 0x8E; // left button // button 4 tx[32*i+24] = 0x80; tx[32*i+25] = 0x88; // right button // button 2 tx[32*i+26] = 0x80; tx[32*i+27] = 0x80; // sync 1 // sync 1 tx[32*i+28] = 0x80; tx[32*i+29] = 0x00; // sync 2 // sync 2 tx[32*i+30] = 0x80; tx[32*i+31] = 0x00; // sync 3 // sync 3 tx[32*i+32] = 0x80; tx[32*i+33] = 0x00; // sync 4 // sync 4 } /* start transmission */ tx[32*i+0] = 0x81; tx[32*i+1] = 0x0c; } static int transferData(int fd, unsigned int packetNr) { int i,ret; for (i = 0; i < ARRAY_SIZE(tx); i+=2) { struct spi_ioc_transfer tr = { .tx_buf = (int)tx+i, .rx_buf = 0, .len = 2, .delay_usecs = delay, .speed_hz = speed, .bits_per_word = bits, }; ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr); if (ret < 1) pabort("can't send spi message"); } } int main(int argc, char *argv[]) { int i; int fd; int packetNr = 0; printf("*** Pi433 socket demo by Marcus Wolf ***\n"); /* open and configure SPI interface */ fd = open("/dev/spidev0.0", O_RDWR); if (fd < 0) pabort("can't open spi"); setupRFParameters(fd); setupMessageParameters(fd); printf("\nPress enter to toggle state of the socket.\n"); printf("^C to quit\n"); while(1) { sleep(1); // wait a sec for transmission to complete getchar(); printf("On\n"); prepareTxDataOn(); transferData(fd,packetNr++); sleep(1); // wait a sec for transmission to complete getchar(); printf("Off\n"); prepareTxDataOff(); transferData(fd,packetNr++); } close(fd); return 0; }
Как альтернативный способ управления Pi433 через SPI интерфейс можно использовать драйвер Linux. На данный момент в разработке. Драйвер предоставит следующие возможности:
- удобное использование функций (open, read, write, close)
- де-факто непрерывную приемо-передачу
- доступ к Pi433 из нескольких приложений
- использование произвольной длины телеграмм
- легкое конфигурирование всех важных настроек модуля RFM69
Приобретение Pi433
Из-за правил утилизации (WEEE guideline of EU) Smarthome-Wolf принято решение о приостановке прямых продаж Pi433.
Бизнес партнёры (например: Онлайн магазины для продажи Raspberry-Pi и сопутствующих аксессуаров), которых интересует распространение Pi433 приглашаются к сотрудничеству.
Мы открыты к любым предложениям по сотрудничеству, как в Европе, так и за её пределами!
Pi433 - это продукт бренда Smarthome-Pi
Контактная информация
Smarthome-Wolf UG (haftungsbeschränkt)Helene-Lange-Weg 23
80637 München
Адрес электронной почты защищён от спам-ботов! Для просмотра необходимо разрешить исполнение JavaScript информация
© Smarthome-Wolf UG (haftungsbeschränkt)