Proiect Convertor ASK / USB

Multe dintre dispozitivele casnice fără fir funcționează prin comunicație radio în bandă ISM de 433MHz modulație ASK. Cele mai des întâlnite astfel de dispozitive sunt sistemele de securitate fără fir, prizele sau soclurile de bec comandate de la distanță și chiar sistemele meteo cu senzori fără fir. Toate aceste sisteme oferă dispozitive fără fir gata construite, ieftine și foarte ușor de folosit în sisteme de comandă personalizate. Dacă sistemul de comandă este bazat pe o placă de dezvoltare de tipul Arduino nu este nici un fel de problemă deoarece există module radio ASK în bandă de 433MHz cu un cost mic și ușor de folosit. Dacă sistemul de comandă are o complexitate mai mare și necesită utilizarea unui PC sau a unei plăci de tipul Raspberry Pi lucrurile se complică puțin. În cadrul acestui proiect ne propunem să realizăm un sistem ieftin și de mici dimensiuni care să realizeze legătura între comunicația radio în bandă de 433MHz modulație ASK și portul USB prezent în sistemele de calcul de uz general (PC-uri, laptop-uri, plăci de dezvoltare bazate pe microprocesoare). Astfel de dispozitive există deja dar au un preț destul de mare (a se vedea (*)).

Sistemul nostru se va baza pe o placă de dezvoltare Arduino Pro Micro cu un microcontroler ATmega 32U4 la 16MHz / 5V, un transmițător radio și un receptor radio – ambele în bandă de 433MHz modulație ASK. Componentele au fost alese astfel încât să asigure un cost total cât mai scăzut și posibilitatea de a fi integrate într-o carcasă de mici dimensiuni (aproximativ cât o baterie USB externă, imagine alăturată, astfel de carcase se găsesc de cumpărat pe Internet la prețuri de circa 2$).

2

Dispozitivul rezultat va fi văzut de sistemul de calcul în cadrul căruia va fi utilizat ca un dispozitiv serial ce va transmite către sistem codurile radio primite și va transmite radio codurile primite de la sistem – va fi realiza conversia dintre comunicația serială (over USB) și comunicația radio ASK în bandă de 433MHz.

 

Interconectarea componentelor

Interconectarea dintre placa de dezvoltare și cele două module radio este reprezentată în diagrama următoare:

3

Transmițătorul radio va avea linia de date conectată la pinul 10 al plăcii de dezvoltare iar receptorul radio va avea linia de date conectată la pinul 4 al plăcii de dezvoltare (pinul de întrerupere 0). Ambele module se vor alimenta la 5V prin intermediul pinilor VCC / GND ai plăcii de dezvoltare.

Pentru mai multe detalii despre instalarea și operarea plăcii Sparkfun Pro Micro se recomandă parcurgerea materialului ”Pro Micro & Fio V3 Hookup Guide” .

 

Programarea sistemului

Programul a fost dezvoltat și testat utilizând Arduino IDE 1.8.1 cu extensia Arduino AVR Boards 1.6.19 instalată și bibilioteca rc-switch 2.6.2.

 

#include <string.h>

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

void setup() {

  while (!Serial);

  Serial.begin(115200);

  mySwitch.enableTransmit(10);

  mySwitch.setRepeatTransmit(3);

  mySwitch.enableReceive(0);

}

void loop() {

  char inData[80];

  int index = 0;

  while(Serial.available() > 0)

  {

     char aChar = Serial.read();

     if(aChar == ‘\n’)

     {

        inData[index] = NULL;

        index = -1;

     }

     else

     {

        inData[index] = aChar;

        index++;

        inData[index] = ‘\0’;

     }

  }

  char * number;

  unsigned long number1, number2, number3;

  if (index==-1) {

    number = strtok(inData,”,”);

    number1 = atol(number);

    number = strtok(NULL,”,”);

    if(number!=NULL) { number2=atoi(number); }

    number = strtok(NULL,”,”);

    if(number!=NULL) { number3=atoi(number); mySwitch.setProtocol(number3);}

    mySwitch.send(number1,number2);

  }

  if (mySwitch.available()) {

     int value = mySwitch.getReceivedValue();

        if (value == 0) {

      Serial.print(“Unknown encoding”);

    } else {

      Serial.print( mySwitch.getReceivedValue() );

      Serial.print(“,”);

      Serial.print( mySwitch.getReceivedBitlength() );

      Serial.print(“,”);

      Serial.println( mySwitch.getReceivedProtocol() );

    }

    mySwitch.resetAvailable();

  }

}

Comunicația dintre sistemul de calcul și dispozitivul USB construit va avea mesajele de forma COD,DIMENSIUNE,VERSIUNEPROTOCOL .

De exemplu, în consola serială, apăsarea butoanelor unei telecomenzi radio ce face parte dintr-un sistem de securitate a locuinței va avea următorul efect (se observă codul butonului de dimensiune 24 biți, protocol radio versiunea 1).

4

5

Pentru mai multe informații legate de diverse dispozitive radio de securitate se poate parcurge și proiectul ”HomeWatch” din cartea ”10(zece) proiecte cu Arduino”.

În cazul în care dorim să dăm o comandă radio vom tasta în consola serială cei trei parametrii necesari transmisiei. De exemplu: 2474994176,32,2 (cod de deschidere pe 32 de biți, protocol versiunea 2, specific unei prize radio din gama Conrad RSL).

6

Pentru mai multe informații legate de dispozitivele din gama Conrad RSL se pot parcurge și materialele ”Cloud’s Lights” și ”Local Area Power Plugs”.

Bineînțeles, dispozitivul prezentat nu își găsește utilitatea majoră în comanda sau supravegherea manuală în consola serială. Utilizarea lui trebuie integrată într-o aplicație specifică platformei la care este conectat (o aplicație Windows sau un script de automatizare sub platforma Linux) și sub care pot fi predefinite codurile de comandă pentru diverse dispozitive cunoscute.

O aplicație utilă poate fi utilizarea dispozitivului în conjuncție cu o platfotmă de automatizare a locuinței, de exemplu OpenHAB. În acest scop se pot vedea și materialele ”Realizarea unui sistem de tip Home Automation” și ”Conectarea unor dispozitive antiefracție la platforma OpenHab”.

Cum putem partaja dispozitive USB între două plăci Raspberry Pi?

Avantajele partajării de dispozitive USB între mai multe dispozitive sunt evidente: accesul la distanță la un element de scanare, la elemente ale interfațării cu utilizatorul (tastatură, mouse) sau chiar accesul la sisteme de stocare (USB drives). Partajarea dispozitivelor USB se realizează prin intermediul rețelei și poartă denumirea de USB over Ethernet, USB over Network sau USB over IP. Există numeroase produse comerciale (software, hardware sau combinație software și hardware) ce oferă posibilitatea de a partaja dispozitive USB între mai multe sisteme de calcul dar, în general, aceste produse au un cost destul de mare. Câteva exemple:

Industrial USB 2.0 Over IP Network 4-Port Hub – TCP/IP Network

https://www.coolgear.com/product/industrial-usb-2-0-ip-network-4-port-hub-share-usb-device-tcpip-network

USB IP Extender

http://www.digivision.it/prodotti/NTI/usb-ip-extender.html

USB over Network – USB for Remote Desktop

http://www.usb-over-network.com/

USB over Network – Share and access your USB devices over local network or Internet

http://www.usb-over-network.com/usb-over-network.html

Grație proiectului open-source USB/IP putem implementa (fără nici un cost de licențiere) o partajare de dispozitive USB între sisteme ce rulează Linux (există și portări ale proiectului pentru Windows și MacOS dar nu sunt foarte stabile). În cadrul proiectului de față vom ilustra instalarea și utilizarea acestui proiect software pe două plăci de dezvoltare Raspberry PI.

2

http://usbip.sourceforge.net/

Componentele software USB/IP permit partjarea de dispozitive USB de diverse tipuri:

  • Dispozitive de stocare USB;
  • Dispozitive de intrare (tastatură, mouse);
  • Camere video sau sisteme audio USB;
  • Imprimante, scanere și chiar interfețe de rețea.

Utilizarea dispozitivelor partajate se face utilizând driverele originale ale acestora dar se introduce un nivel suplimentar de retransmitere a mesajelor I/O specifice comunicației USB: VHCI Driver – Virtual Host Controller Interface <-> Stub Driver. Sistemul care găzduiește fizic dispozitivul USB și îl partajează în rețea joacă rolul de Server iar sistemul care instalează virtual la distanță dispozitivul USB joacă rolul de Client.

 3

 

 Instalarea și configurarea USB/IP pe o placă Raspberry PI (server)

Pentru instalarea pachetului software USB/IP se va utiliza comanda (pachetul este inclus în distribuția Raspbian 7 și 8):

sudo apt-get install usbip

Pentru a vedea toate dispozitivele USB din sistem se va utiliza comanda lsusb:

4

Vom încărca componentele driver pentru server cu ajutorul comenzii:

sudo modprobe usbip-host

după care vom putea vizualiza care din dispozitivele USB sunt vizibile pentru partajare:

sudo usbip list -l

5

Pentru pornirea componentei server vom utiliza comanda:

sudo usbipd -D

iar pentru a partaja un dispozitiv vom utiliza comanda:

sudo usbip bind -b x-x.x

unde x-x.x este indicativul dispozitivului USB dorit.

În exemplul nostru dacă dorim să partajăm dispozitivul 1-1.2 care nu este altceva decât un stick USB vom da comanda:

sudo usbip bind -b 1-1.2

și vom putea verifica disponibilitatea lui cu ajutorul comenzii:

sudo usbip list -r xxx.xxx.xxx.xxx

unde xxx.xxx.xxx.xxx este adresa de rețea IP a sistemului.

6

 

Instalarea și configurarea USB/IP pe o placă Raspberry Pi (client)

La fel ca și în cazul sistemului server se va instala pachetul software USB/IP:

sudo apt-get install usbip

Pentru a vedea dispozitivele partajate de sistemul server se folosește comanda:

sudo usbip list -r xxx.xxx.xxx.xxx

unde xxx.xxx.xxx.xxx este adresa IP a sistemului server.

”Conectarea” dispozitivului USB presupune încărcarea driverului VHCI:

sudo modeprobe vhci-hcd

și atașarea propriu-zisă a dispozitivului:

sudo usbip attach –host xxx.xxx.xxx.xxx –busid x-x.x

Dacă atașarea s-a realizat cu succes dispozitivul USB se va putea vizualiza cu ajutorul comenzii lsusb.

7

În cadrul exemplului nostru, fiind vorba de un dispozitiv de stocare USB, dispozitivul se va putea utiliza ca și cum ar fi conectat local. Se va verifica identificarea ca și dispozitiv de stocare cu ajutorul comenzii:

ls -l /dev/disk/by-uuid/

8

și se va putea monta în cadrul sistemului local de fișiere:

sudo mkdir /mnt/usb

sudo mount /dev/sda /mnt/usb

Testarea configurației prezentate s-a făcut pe două plăci Raspberry Pi rulând Raspbian GNU/Linux 8 (jessie), kernel 4.4.45-v7+, și usbip 2.0+3.16.7-ckt20-1.

O alternativă comercială la proiectul USB/IP este VirtualHere USB Server. Acest produs comercial are componentă binară server specială pentru placa Raspberry Pi, client pentru mai multe sisteme de operare (inclusiv Windows) și poate fi utilizat și în variantă trial (se poate partaja un singur dispozitiv USB și se va afișa o fereastră de avertizare la fiecare utilizare).

9

https://virtualhere.com/

Pentru instalarea acestui produs comercial se poate vedea tutorialul:

VirtualHere with Raspberry Pi as USB server

http://vmwarebits.com/content/virtualhere-raspberry-pi-usb-server