Мобільна версія Форум Arduino Документація Гарантійні умови 0 0
UA RU
Графік роботи магазину:
Пн-Пт: 8.00 - 19.00
Сб: 10.00 - 17.00
Нд: вихідний
Каталог
Напиши статтю і отримай знижку!

Анализатор спектра 2,4 ГГц на Pololu Wixel

2016-06-14

Всі статті →

Владимир Соколов

Реализовано множество анализаторов спектра для ISM диапазона 2,4–2,5 ГГц для подключения через USB-интерфейс. Например, Ubiquiti AirView2, MetaGeek Wi?Spy, Wi-Detector, а также на базе разнообразных отладочных комплектов (таких как TI eZ430-RF2500) или сетевых карт (например, Atheros AR92xx и AR93xx со spectral scan режимом). У этих устройств есть ряд недостатков: цена; сложность получения данных, которые обычно привязаны к какой-то конкретной программе; невозможность изменить прошивку устройств. Кроме этого есть конечно же множество проектов-самоделок, обычно на основе чипов TI CC2500 и Cypress 693x, а также модулей на их основе. Но данные устройства не подойдут для серийного производства.

Рис. 1. Примеры радиомодулей

Модуль Pololu Wixel позволяет частично решить эту проблему. Ниже показано, как на его основе создать достаточно приличный анализатор спектра. Модуль построен на чипе TI CC2511F32, которые представляет собой микроконтроллер со встроенным радиомодулем TI CC2500. Из-за особенностей реализации доступны лишь 256 заранее зарезервированных каналов, на которых можно снимать уровни сигналов. Устройство рассчитано в первую очередь для американского рынка, потому покрывает не весь частотный диапазон: от 2403,5 до 2476,5 МГц. В итоге расстояние между каналами составляет 286,4 кГц, что опережает многие коммерческие образцы.

В качестве прототипа взяты коды из wixel-sdk (https://github.com/pololu/wixel-sdk/) и наработки С. Джеймса Ремингтона (https://forum.pololu.com/t/spectrum-analyzer-app-code/3394). Проект был доработан кнопкой паузы (нормально разомкнутая между P0_0 и GND).

Рис. 2. Общий вид устройства с кнопкой

Данное устройство собирает по 100 замеров на каждом канале, затем с помощью быстрого преобразования Фурье рассчитывает уровень сигнала и усредняет значение. На чтение одного канала уходит в среднем 1,6 мс, на полный проход всех каналов около 414 мс.

Листинг С кода для прошивки устройства

#include <wixel.h>

#include <radio_registers.h>

#include <stdio.h>

#include <usb.h>

#include <usb_com.h>

static int16 XDATA rssiValue[256];

void frequentTasks(void);

void updateLeds() {

usbShowStatusWithGreenLed();

LED_RED(0);

}

void analyzerInit() {

radioRegistersInit();

MCSM0 = 0x14;

MCSM1 = 0x00;

MDMCFG2 = 0x70;

RFST = 4;

}

void checkRadioChannels() {

uint16 i;

uint16 channel;

LED_YELLOW(1);

for(channel=0; channel<256; channel++) {

int32 rssiSum;

rssiValue[channel] = -115;

while(MARCSTATE != 1);

CHANNR = channel;

RFST = 2;

while(MARCSTATE != 13);

rssiSum = 0;

for (i=0; i<100; i++) {

if (TCON & 2) {

uint8 rfdata = RFD;

TCON &= ~2;

}

rssiSum += radioRssi();

}

RFST = 4;

rssiValue[channel] = (int16) (rssiSum/100);

frequentTasks();

}

LED_YELLOW(0);

}

void putchar(char c) {

while(!usbComTxAvailable()){ frequentTasks(); }

usbComTxSendByte(c);

}

void reportResults(int iterationFirst, int iterationLast) {

uint16 i;

uint32 time;

time = getMs();

if (iterationFirst == 0) {

printf("%02X-%02X-%02X-%02X #%d, 0x%04X%04X ms [ ", (uint16)serialNumber[3], (uint16)serialNumber[2], (uint16)serialNumber[1], (uint16)serialNumber[0], iterationLast, (uint16)(time >> 16), (uint16)time);

} else {

printf("%02X-%02X-%02X-%02X #%d%04d, 0x%04X%04X ms ", (uint16)serialNumber[3], (uint16)serialNumber[2], (uint16)serialNumber[1], (uint16)serialNumber[0], iterationFirst, iterationLast, (uint16)(time >> 16), (uint16)time);

}

for (i=0; i<256; i++) {

printf("%d ", rssiValue[i]);

}

printf("]\r\n\n");

}

void frequentTasks() {

boardService();

usbComService();

updateLeds();

}

void main() {

uint32 iterationFirst;

uint32 iterationLast;

int mute;

iterationFirst = 0;

iterationLast = 0;

mute = 1;

systemInit();

usbInit();

analyzerInit();

while(1) {

if (usbComRxAvailable() == 0) {

if (isPinHigh(0) && mute == 1) {

LED_RED(0);

frequentTasks();

checkRadioChannels();

if (iterationLast == 10000) {

iterationLast -= 10000;

iterationFirst++;

}

reportResults(iterationFirst, iterationLast);

iterationLast++;

} else {

LED_RED(1);

}

} else {

switch(usbComRxReceiveByte()) {

case 's':

mute = 0;

break;

case 'c':

mute = 1;

break;

}

}

}

}

Сборка прошивки из исходного кода подробно описана в инструкции по сборке проекта (https://www.pololu.com/docs/0J46/10.b). Прошивка устройства производится с помощью стандартной утилиты Pololu Wixel Configuration Utility, см. подробнее в инструкции по загрузки прошивки на устройство (https://www.pololu.com/docs/0J46/3.d).

Теперь устройство готово к работе. Достаточно подключить его к компьютеру, установить драйверы для операционной системы (https://www.pololu.com/docs/0J46/3) и подключиться к виртуальному СОМ-порту.

Рис. 3. Скриншот данных, полученных с помощью утилиты Putty

Кроме того, для получения данных в разных операционных системах написан специальный скрипт на Python с автоматическим определением подключенных COM-устройств. Скрипт можно запускать с параметром «-i», указывающим на количество итераций считывания, например, C:\Python\python.exe C:/wixel/specscan.py -i 2

Рис. 4. Скриншот данных, полученных с помощью скрипта на Python

Ссылка для скачивания исходных кодов на Python.

Ваша оцінка статті:

Відмінно
Добре
Задовільно
Погано
Дуже погано

Дякуємо Вам за звернення! Ваш відгук з'явиться після модерації адміністратором.
Поки немає відгуків на цю статтю.
оплата картами Visa і MasterCard