Главная страница   Контактная информация   Новости науки и техники   Поиск на сайте   Форум

Преобразователь интерфейса USB - COM-порт - радиоканал (2.4 ГГц)

Введение

В ряде случаев для передачи данных с удаленных устройств (датчиков) к компьютеру нельзя или неудобно использовать проводную линию связи (например, в случае движущихся датчиков). Возможным способом решения проблемы является передача данных по радиоканалу, например,  в диапазоне частот ISM (Industrial, Scientific, Medical) 2.4 ГГц (2400 ... 2483.5 МГц), где можно использовать нелицензируемые устройства с дальностью работы примерно до 100 метров (работающие внутри зданий и производственных территорий, а также с мощностью излучения передающих устройств до 100 мВт включительно). Устройство приема и передачи данных по радиоканалу может быть построено по следующей схеме. К USB-порту компьютера подключается преобразователь USB - COM-порт, связанный с микроконтроллером, который, в свою очередь, управляет программируемым трансивером (приемо-передатчиком), работающим в указанном диапазоне частот. Аналогичный микроконтроллер и такой же трансивер устанавливаются на стороне датчика.

Схема электрическая принципиальная

Преобразователь интерфейса USB - COM-порт - радиоканал 2.4 ГГц собран из готовых модулей. Преобразователь USB - COM-порт построен в виде отдельного модуля на микросхеме CH340G [5]. В качестве микроконтроллера используется  Arduino Pro mini (микроконтроллер на микросхеме ATmega328) [2] со встроенным отладчиком, позволяющим использовать программы, написанные на языке C в среде программирования Arduino. Приемо-передатчик диапазона 2.4 ГГц - узел на микросхеме NRF24L01 (вариант 1 - без усилителя на дальность примерно до 10 м, вариант 2 - с усилителем на дальность до 100 м). Питание преобразователя интерфейса осуществляется непосредственно от USB-порта.

Рис. 1. Схема электрическая принципиальная первого варианта преобразователя интерфейса с радиоканалом.

Рис. 2. Схема электрическая принципиальная второго варианта преобразователя интерфейса с радиоканалом.

Конструкция

Модули преобразователя интерфейса монтируются на кросс-плату. Кросс-плата может устанавливается в корпус.

Рис. 3. Внешний вид первого варианта преобразователя интерфейса с радиоканалом (кросс-плата с модулями в диэлектрическом корпусе).

Рис. 4. Внешний вид второго варианта преобразователя интерфейса с радиоканалом (кросс-плата с модулями в корпусе и наружная антенна).

Датчик (магнитометр с передатчиком)

В качестве примера совместного использования преобразователя интерфейса на рис. 5 приведена схема магнитометра [4] с магниторезистивным датчиком QMC5883 (HMC5883) [1]. Магнитометр с передатчиком собран из готовых модулей (датчик, микроконтроллер, трансивер), размещенных на кросс-плате (рис. 6). Питание автономное от Li-ion аккумулятора напряжением 3.7 В. Для программирования микроконтроллера используется отдельная плата преобразователя интерфейса USB - COM-порт, подключаемая к кросс-плате при необходимости.

Рис. 5. Схема электрическая принципиальная магнитометра с передатчиком данных по радиоканалу.

Рис. 6. Внешний вид платы магнитометра с передатчиком данных по радиоканалу.

Программное обеспечение

Вариант программы для приемника на языке C в среде Arduino:

#include <nRF24L01.h>
#include <RF24.h>
#include <RF24_config.h>
#include <SPI.h>
const uint64_t pipe = 0xF0F1F2F3F4LL ; //
идентификатор приемопередающего канала
RF24 radio(9, 10); // CE, CSN подключены к выходам D9 и D10 Pro mini
byte massiv[4] ;

void setup()  
{
  Serial.begin(9600) ; // скорость передачи данных 9600
  radio.begin() ;  // начало работы с чипом nRF24L01
  delay(2) ;       // задержка на 2 мс
  radio.setChannel(9) ; // выбор коммуникационного канала (0 - 125)
  radio.setDataRate(RF24_1MBPS) ;     // скорость передачи данных 
  radio.setPALevel(RF24_PA_MAX) ;  // максимальная мощность передатчика 0 dBm
  radio.openReadingPipe(1, pipe) ; // открываем один канал с идентификатором pipe = 0xF0F1F2F3F4LL
  radio.startListening() ; // включаем приемник, начинаем прослушивание
}

void loop() 
{
  if (radio.available()){ // проверяем буфер
    float data[4] ; // создаем массив из 4-х переменных
    radio.read(&data, sizeof(data)) ; // читаем данные, указываем сколько байт читать
   
Serial.print("Bx: ") ; // выводим значение компоненты Bx магнитной индукции
    Serial.print(data[0]) ;
    Serial.println(" mkT")
;
    Serial.print("By: ") ;
// выводим значение компоненты By магнитной индукции
    Serial.print(data[1]) ;
    Serial.println(" mkT")
;
    Serial.print("Bz: ") ;
// выводим значение компоненты Bz магнитной индукции
    Serial.print(data[2]) ;
    Serial.println(" mkT")
;
    Serial.print("B: ");
// выводим значение модуля B магнитной индукции
    Serial.print(data[3]) ;
    Serial.println(" mkT")
;
    Serial.println()
;
} else {
  Serial.println("nodata") ;
 // сообщение об отсутствии данных
}
}

Вариант программы для магнитометра с передатчиком на языке C в среде Arduino:

//Датчик QMC5883
#include <SPI.h>
#include <Wire.h> //
I2C Arduino Library
#include <nRF24L01.h>
#include <RF24.h>
#define addr 0x0D //
I2C Address for QMC5883L
#define reg_2G 0x0D // Загрузка режима работы и диапазона измерений 2 Гс в регистр 09H
#define Bxoff 1.5       // Сдвиг по x, мкТл
#define Byoff 1.0      // Сдвиг по y, мкТл
#define Bzoff 0.0       // Сдвиг по z, мкТл
#define Num_Of_Meas 250 // Число измерений для усреднения
int x, y, z ;                // triple axis data. Данные с регистров
long x1, y1, z1 ;       // Суммированные данные для усреднения
double Bx, By, Bz, B ;  // Значения магнитной индукции в мкТл
int i ;                 // Счетчик
double Kx190 = 120.0 ;  // калибровочный коэффициент по x
double Ky190 = 120.0 ; // калибровочный коэффициент по y
double Kz190 = 120.0 ;  // калибровочный коэффициент по z
int RDY ;               // готовность данных
const uint64_t pipe = 0xF0F1F2F3F4LL ; // идентификатор приемопередающего канала
RF24 radio(9, 10) ; // CE, CSN подключены к выходам D9 и D10 Pro mini

void setup(){
  Serial.begin(9600)
;
  pinMode(3, INPUT) ; // вход DRDY
  radio.begin() ; // начало работы с чипом nRF24L01
  delay(2) ;  // задержка на 2 мс 
  radio.setChannel(9) ; // канал (0 - 127)
  radio.setDataRate(RF24_1MBPS) ; // скорость передачи данных
 
radio.setPALevel(RF24_PA_MAX) ;   // максимальная мощность передатчика 0 dBm
  radio.openWritingPipe(pipe) ; // открываем канал с идентификатором pipe = 0xF0F1F2F3F4LL
}

void loop()  
{
   measure_2G() ;
  Calc_B() ;
  float data[4] ; //
массив данных
  data[0] = Bx ;
  data[1] = By ;
  data[2] = Bz ;
  data[3] = B ;
  radio.write(&data, sizeof(data)) ; //
отправка данные с указанием размера
}

void measure_2G() { // Измерение
       Wire.begin()
;
       Wire.beginTransmission(addr) ;
       Wire.write(0x0B) ; // Установка QMC5883L
       Wire.write(0x01) ;  // Запись в регистр
       Wire.endTransmission() ;
       Wire.beginTransmission(addr) ;
       Wire.write(0x09) ;  // Установка QMC5883L
       Wire.write(reg_2G ) ; // Запись в регистр
       // Set the Register 0x09 to 0x0D - OSR_512_RNG_2G_ODR_200Hz_Mode_Continuous
       Wire.endTransmission()

 x1 = 0 ;
 y1 = 0 ;
 z1 = 0 ;
for(i = 1; i<=Num_Of_Meas; i++)
{
 lab1: // опрос по выводу DRDY
 
if (digitalRead(3) == LOW) {goto lab1 ;}
  Wire.beginTransmission(addr)
;
  Wire.write(0x00) ; //start with register 3
  Wire.endTransmission() ;
  // Read the data.. 2 bytes for each axis.. 6 total bytes
  Wire.requestFrom(addr, 6) ;
  if (6 <= Wire.available()) {
    x = Wire.read()
; // MSB  x
    x |= Wire.read() << 8
; // LSB  x
    y = Wire.read()
; // MSB  z
    y |= Wire.read() << 8
; // LSB z
    z = Wire.read()
; // MSB y
    z |= Wire.read() << 8
; // LSB y
  }
    x1 = x1 + x  ;
    y1 = y1 + y  ;
    z1 = z1 + z  ;
}

void Calc_B() { // Вычисление
    Bx = Bxoff + (double)(x1)/Kx190/(double)Num_Of_Meas ;
    By = Byoff + (double)(y1)/Ky190/(double)Num_Of_Meas ;
    Bz = Bzoff + (double)(z1)/Kz190/(double)Num_Of_Meas ;
    B = sqrt(Bx*Bx+By*By+Bz*Bz) ;
 }    

Для обеспечения совместной работы COM-порта преобразователя интерфейса с компьютером необходимо установить программу-драйвер для микросхемы CH340 (в некоторых случаях этого не требуется). Интерфейс одного из вариантов программы для приема данных от магнитометра компьютером и вывода показаний на монитор показан на рис. 7. Файл программы: MT_30.rar (~177 Кб, архиватор WinRAR). Скопированный файл может быть проверен на отсутствие вирусного кода в режиме on-line [6].

Рис. 7. Интерфейс программы для вывода показаний магнитометра на монитор компьютера.

Ссылки:

  1. http://honeywell.ru (сайт фирмы Honeywell)
  2. Аппаратная платформа Ардуино | Arduino.ru. Электронный ресурс: http://arduino.ru . Доступен по состоянию на 16.12.2017.
  3. Магда Ю. С. Программирование последовательных интерфейсов. - СПб.: БХВ-Петербург, 2009. - 304 с. ил. + CD-ROM - (Профессиональное программирование)
  4. Магнитометр с магниторезистивным датчиком QMC5883 (HMC5883) для мониторинга слабых постоянных полей и передачи данных по радиоканалу 2.4 ГГц
  5. Преобразователь интерфейса USB - RS-232 (COM-порт)
  6. Проверка файлов пользователя на наличие вирусного кода в режиме on-line

Словарь терминов:

26.12.2017
06.01.2018
08.01.2018


Альтернативные источники энергии
Компьютеры и Интернет
Магнитные поля
Механотронные системы
Перспективные разработки
Электроника и технология

Главная страница



 

 

 

 

 

 

 

 

 

 

 

 

 

Hosted by uCoz