[[Include(WikiToC)]] == GNURadio OFDM tutorial == === Description === This tutorial illustrates the use of GNURadio OFDM blocks for data transfer between a pair of USRPs. The GNURadio flowgraphs used here were obtained from the workshop material provided for [https://gitlab.flux.utah.edu/powderrenewpublic/mww2019 POWDER-RENEW Mobile and Wireless Week 2019]. They are mainly based on the GRC examples available in the [https://github.com/gnuradio/gnuradio/tree/main/gr-digital/examples/ofdm GNURadio repository]. For a good understanding of the flowgraphs and the blocks, please refer to OFDM pages on GNURadio Wiki such as [https://wiki.gnuradio.org/index.php/Basic_OFDM_Tutorial OFDM Basics] and [https://wiki.gnuradio.org/index.php/Schmidl_%26_Cox_OFDM_synch. OFDM Synchronization] === Prerequisites === In order to access the test bed, create a reservation and have it approved by the reservation service. Access to the resources is granted after the reservation is confirmed. Please follow the process shown on the COSMOS [wiki:GettingStarted getting started] page to get started. === Resources required === A pair of USRPs in COSMOS or ORBIT testbed. 2 USRP X310s (connected to node1-1,node1-2) in sb2.orbit-lab.org === Tutorial Setup === Follow the steps below to gain access to the [wiki:/hardware/Domains/sb1 sandbox 1 console] and set up nodes with appropriate images. 1. If you don't have one already, sign up for a [https://www.cosmos-lab.org/portal-2/ COSMOS account] 1. [wiki:/GettingStarted#MakeaReservation Create a resource reservation] on sandbox 1 1. [wiki:/GettingStarted#LogintoyourReservation Login] into sandbox 1 console (console.sb1.cosmos-lab.org) with an SSH session. SSH session for COSMOS SB1 with MobaXterm can be setup as shown, with remote host = console.sb1.cosmos-lab.org, and username = your COSMOS username. X11 forwarding is enabled to access GUI. [[Image(mobaxterm_sb1_session.JPG, width=600px)]] 1. Make sure all the nodes and devices used in the experiment are turned off: {{{#!shell omf tell -a offh -t system:topo:all }}} 1. Load gnuradio_ofdm.ndz on both the nodes {{{#!shell omf load -i gnuradio_ofdm.ndz -t node1-1,node1-2 }}} 1. Turn the nodes on and check the status {{{#!shell omf tell -a on -t node1-1,node1-2 }}} {{{#!shell omf stat -t all }}} 1. Open 2 terminal sessions and ssh into the nodes with -Y for X11 forwarding {{{#!shell ssh root@node1-1 -Y ssh root@node1-2 -Y }}} === Experiment Execution === ==== Find the USRPs ==== 1. As mentioned in the [https://orbit-lab.org/wiki/Hardware/bDomains/cSandboxes/bSB2 sb2.orbit] page, the X310s have their port 1 directly connected to their respective nodes, and the IP addresses hardcoded to 192.168.40.2 as given in the [https://files.ettus.com/manual/page_usrp_x3x0.html#x3x0_setup_network X310 manual]. To access the X310s run eth_config_sb2_orbit.sh on both the nodes. It sets a static IP address 192.168.40.1 on eno2 interface, and modifies the maximum send and receive socket buffer sizes. {{{#!shell root@node1-2:~# ./eth_config_sb2_orbit.sh net.core.wmem_max = 25000000 net.core.rmem_max = 25000000 root@node1-2:~# ip addr show DATA2 4: DATA2: mtu 9000 qdisc mq state UP group default qlen 1000 link/ether f4:52:14:83:af:80 brd ff:ff:ff:ff:ff:ff inet 192.168.40.1/24 scope global DATA2 valid_lft forever preferred_lft forever inet6 fe80::f652:14ff:fe83:af80/64 scope link valid_lft forever preferred_lft forever }}} 2. Run uhd_find_devices and uhd_usrp_probe to detect the X310s and to make sure they have a compatible firmware installed. {{{#!shell root@node1-2:~# uhd_find_devices [INFO] [UHD] linux; GNU C++ version 9.4.0; Boost_107100; UHD_4.4.0.0-0ubuntu1~focal1 -------------------------------------------------- -- UHD Device 0 -------------------------------------------------- Device Address: serial: 30F10F9 addr: 192.168.40.2 fpga: XG name: product: X310 type: x300 root@node1-2:~# uhd_usrp_probe --args="addr=192.168.40.2" [INFO] [UHD] linux; GNU C++ version 9.4.0; Boost_107100; UHD_4.4.0.0-0ubuntu1~focal1 [INFO] [X300] X300 initialization sequence... [INFO] [X300] Maximum frame size: 8000 bytes. [INFO] [GPS] No GPSDO found [INFO] [X300] Radio 1x clock: 200 MHz _____________________________________________________ / | Device: X-Series Device | _____________________________________________________ | / | | Mboard: X310 | | revision: 8 | | revision_compat: 7 | | product: 30818 | | mac-addr0: 00:80:2f:27:0d:51 | | mac-addr1: 00:80:2f:27:0d:52 | | gateway: 192.168.10.1 | | ip-addr0: 192.168.10.2 | | subnet0: 255.255.255.0 | | ip-addr1: 192.168.20.2 | | subnet1: 255.255.255.0 | | ip-addr2: 192.168.30.2 | | subnet2: 255.255.255.0 | | ip-addr3: 192.168.40.2 | | subnet3: 255.255.255.0 | | serial: 30F10F9 . . . . | | / | | | RX Frontend: 0 | | | Name: UBX RX | | | Antennas: TX/RX, RX2, CAL | | | Sensors: lo_locked | | | Freq range: 10.000 to 6000.000 MHz | | | Gain range PGA0: 0.0 to 31.5 step 0.5 dB | | | Bandwidth range: 160000000.0 to 160000000.0 step 0.0 Hz | | | Connection Type: IQ | | | Uses LO offset: No }}} {{{#!box note width=600px In case of firmware mismatch, follow the directions displayed in the error message and use uhd_image_loader to update the firmware. }}} ==== Run the GRC application ==== 1. Open OFDM receiver on node1-2 {{{#!shell root@node1-2:~# cd GNURadioOFDMExample/ root@node1-2:~/GNURadioOFDMExample# gnuradio-companion RX_OFDM_GUI.grc <<< Welcome to GNU Radio Companion 3.9.8.0 >>> Block paths: /usr/local/share/gnuradio/grc/blocks Loading: "/root/GNURadioOFDMExample/RX_OFDM_GUI.grc" >>> Done }}} With X11 forwarding enabled, GRC should show up as below. [[Image(RX_OFDM_grc.PNG, width=800px)]] 2. Open OFDM transmitter on node1-1 {{{#!shell root@node1-1:~# cd GNURadioOFDMExample/ root@node1-1:~/GNURadioOFDMExample# gnuradio-companion TX_OFDM.grc <<< Welcome to GNU Radio Companion 3.9.8.0 >>> Block paths: /usr/local/share/gnuradio/grc/blocks Loading: "/root/GNURadioOFDMExample/TX_OFDM.grc" >>> Done }}} [[Image(TX_OFDM_grc.PNG, width=800px)]] 3. Make sure the device arguments on both nodes are correctly set as shown below. Check the center frequencies and sample rates, and make sure they match. TX_OFDM.grc has a "File Source" block which reads the text file to be transmitted. RX_OFDM.grc stores the received data in a local file that is specified in the "File Sink" block. || [[Image(OFDM_SB2_args.PNG, width=300px)]] || [[Image(FileSource.PNG, width=300px)]] || [[Image(FileSink.PNG, width=300px]] || 4. Run the receive flowgraph followed by the transmit flowgraph. [[Image(RX_OFDM_samples.PNG, width=500px)]]