NooTriX

Sharing USB Devices over Wifi using Arduino Yún

Sharing USB Devices over Wifi using Arduino Yún


In this tutorial, we show how to use the Arduino Yún to connect a USB device through Wifi to your Linux based computer. We rely on the USB/IP project that allows USB device sharing over IP networks. This utility is really useful and has many applications. A simple one is to turn a plain USB webcam into one that you can access remotely through Wifi. But, it can apply to virtually any USB device and make it available remotely, paving the way to the Internet of things.


.



Server Side (Yún)
1) First and foremost, you need to ensure that you have an up to date version of the OpenWrt-Yún. If you acquired your Yún prior to september 2014, you likely need to upgrade it.

2) Assuming that the Yún is up and running, you need to change the Wifi setup. Your board should access a Wifi network that is connected to the Internet.

3) To install on the Yún usbip we’ll be using the opkg package manager. The opkg utility allows to download and install OpenWrt packages. Login through SSH as explained in our previous post. Then, update the list of available packages by evaluating the following command line in your terminal:

opkg update

As a result, you should be notified about downloaded and configurations as shown below:

Downloading http://downloads.arduino.cc/openwrtyun/1/packages/Packages.gz.
Updated list of available packages in /var/opkg-lists/attitude_adjustment.
Downloading http://downloads.arduino.cc/openwrtyun/1/packages/Packages.sig.
Signature check passed.

4) Install the usbip-server package that provides utilities for USB forwarding over IP:

opkg install usbip-server

The result should be a series of messages informing you about the ongoing installation. They should look like the following:


Installing usbip-server (1.1.1-2) to root...
Downloading http://downloads.arduino.cc/openwrtyun/1/packages/usbip-server_1.1.1-2_ar71xx.ipk.
Installing usbip (1.1.1-2) to root...
Downloading http://downloads.arduino.cc/openwrtyun/1/packages/usbip_1.1.1-2_ar71xx.ipk.
Installing libsysfs (2.1.0-2) to root...
Downloading http://downloads.arduino.cc/openwrtyun/1/packages/libsysfs_2.1.0-2_ar71xx.ipk.
Installing libwrap (7.6-1) to root...
Downloading http://downloads.arduino.cc/openwrtyun/1/packages/libwrap_7.6-1_ar71xx.ipk.
Installing kmod-usbip (3.3.8-1) to root...
Downloading http://downloads.arduino.cc/openwrtyun/1/packages/kmod-usbip_3.3.8-1_ar71xx.ipk.
Installing usbip-client (1.1.1-2) to root...
Downloading http://downloads.arduino.cc/openwrtyun/1/packages/usbip-client_1.1.1-2_ar71xx.ipk.
Installing glib2 (2.28.8-1) to root...
Downloading http://downloads.arduino.cc/openwrtyun/1/packages/glib2_2.28.8-1_ar71xx.ipk.
Installing kmod-usbip-client (3.3.8-1) to root...
Downloading http://downloads.arduino.cc/openwrtyun/1/packages/kmod-usbip-client_3.3.8-1_ar71xx.ipk.
Installing kmod-usbip-server (3.3.8-1) to root...
Downloading http://downloads.arduino.cc/openwrtyun/1/packages/kmod-usbip-server_3.3.8-1_ar71xx.ipk.
Configuring kmod-usbip.
Configuring libsysfs.
Configuring libwrap.
Configuring usbip.
Configuring glib2.
Configuring kmod-usbip-client.
Configuring usbip-client.
Configuring kmod-usbip-server.
Configuring usbip-server.

5) To provides USB/IP clients access to exported USB devices, start usbipd on the Yún by evaluating:

usbipd -D &

We use the -D option to make usbipd run as a deamon process. For the curious, the daemon accepts connections from USB/IP clients on TCP port 3240.

6) Now, we can share a USB device connected to the Yún. But, prior to plugin it, list usb devices embedded on your board by evaluating the following command. This will make our life easier to identify the ID of the device later.

usbip list -l

The list should ressemble the following:

Local USB devices
=================
- busid 1-1 (058f:6254)
1-1:1.0 -> hub

- busid 1-1.4 (058f:6366)
1-1.4:1.0 -> usb-storage

7) Plug your device to the USB host port of the Yún and list again USB devices (usbip list -l). You see that a new device shows up. In our example below, it is marked as unknown, and appears at the second position. The important information you are looking for is the bus ID, which is in our case 1-1.1.


Local USB devices
=================
- busid 1-1 (058f:6254)
1-1:1.0 -> hub

- busid 1-1.1 (1267:0201)
1-1.1:1.0 -> unknown

- busid 1-1.4 (058f:6366)
1-1.4:1.0 -> usb-storage

8) Time to share the USB device using the following command:

usbip bind -b 1-1.1

If everything goes well, you’ll get the answer that the binding was successful:

bind device on busid 1-1.1: complete

9) Now, if you list again devices using usbip list -l you’ll see that your device is bound to usbip.

Local USB devices
=================
- busid 1-1 (058f:6254)
1-1:1.0 -> hub

- busid 1-1.1 (1267:0201)
1-1.1:1.0 -> usbip-host

- busid 1-1.4 (058f:6366)


Client Side (Computer Running Linux)
A) Now you should be able to connect to USB device from your computer. A compatible version of usbip package should be installed. In our experiment, we work with Ubuntu 14.04LTS. The usbip package need to be installed. Unfortunately, the one available from Ubuntu repositories if outdated: it’s the very old version 0.1.7. A workaround is to install a Debian package. Ignore version 1.1.1 of usbip. It has a bug that forbids detaching. We definitely recommend usbip 2.0, which is available for Debian Sid. Beside fixing the detaching bug, it has also the port command that allows listing virtual ports in use. Once you have downloaded the usbip debian package, install it by evaluating the following command line:

sudo dpkg -i usbip_2.0+3.16-2_i386.deb

B) Now you can use your linux box as usbip client. To do so, you need to get the IP address of your Yún. Just open the http://arduino.local url in your browser and connect to display the network info of the board as explained in step 2 of our previous tutorial. The IP of your board should be there. In our experiment, it shows: 192.168.1.39

C) On your computer list usb devices shared by the Yún board by evaluating:

usbip list -r 192.168.1.39

Since we shared only one device on the Yún, there should only one displayed. In our experiment we used a USB mouse, and indeed, it’s there.


Exportable USB devices
======================
- 192.168.1.39
1-1.1: Logic3 / SpectraVideo plc : A4Tech SWOP-3 Mouse (1267:0201)
: /sys/devices/platform/ehci-platform/usb1/1-1/1-1.1
: (Defined at Interface level) (00/00/00)
: 0 - Human Interface Device / Boot Interface Subclass / Mouse (03/01/02)

D) Before connecting to the remote USB device, ensure that the kernel module that supports virtual usb ports (Virtual Host Controller Interface) is loaded by evaluating:

sudo modprobe vhci-hcd

E) Now, we can perform the actual connection by evaluating the following command line. The first parameter is the IP of the Yún. The second parameter is the ID of the bus related to our USB device. We had obtained it at step 7 on the server side (Yún).

sudo usbip attach -r 192.168.1.39 -b 1-1.1

Et voilà, you can start using your device. In our example, it’s a mouse. So, we can use it to control the GUI of our computer. Isn’t it cool! :-).


Cleaning Up the Client Side (Computer Running Linux)
Once you are done with your USB device, you can “unplug” it from the virtual USB port of your computer. This is a two step operation.

1) First, evaluate the following to get the port number used to connect to the remote USB device.

sudo usbip port

You’ll see that your device in a list, with the assigned port number 0.


Imported USB devices
====================
Port 00: <Port in Use> at Low Speed(1.5Mbps)
unknown vendor : unknown product (1267:0201)
3-1 -> usbip://192.168.1.39:3240/1-1.1
-> remote bus/dev 001/003


.

2) Now, you can use the port number as a parameter of the following command line to actually stop using the shared USB device.

sudo usbip detach -p 0

If you list again used port numbers (sudo usbip port) the list should be empty.


Imported USB devices
====================


Cleaning Up the Server Side (Yún)
If you want stop sharing the device on the Yún, simply evaluate the following command line. The parameter (1-1.1) is the ID of the bus of the USB device.

usbip unbind -b 1-1.1

If you don’t want to share any other device, don’t forget to stop the usbipd server launched at step 5 of the server side procedure.

Share

Related Articles

2 Comments

  1. jpeterson37
    jpeterson37 January 23, 21:16

    I’m getting an issue at the opkg update. I’m getting

    Signature check failed.
    Remove wrong Signature file.
    Collected errors:
    * opkg_download: Failed to download http://downloads.arduino.cc/openwrtyun/1/packages/Packages.gz: Error.
    * opkg_download: Failed to download http://downloads.arduino.cc/openwrtyun/1/packages/Packages.sig: Error.

    Any suggestions?

    Thank you

    Reply to this comment

Write a Comment

Latest Posts

    Silent Floor Cleaning Robots

Silent Floor Cleaning Robots

0 comment Read Full Article
    Text and Talk to Your Robotic Vacuum

Text and Talk to Your Robotic Vacuum

0 comment Read Full Article
    Donate Some CPU Cycles to Help Scientists Solve the World’s Biggest Problems

Donate Some CPU Cycles to Help Scientists Solve the World’s Biggest Problems

0 comment Read Full Article
    Affordable Virtually Indestructible Drones

Affordable Virtually Indestructible Drones

4 comments Read Full Article
    3 Game Changing Solutions to Recharge Your Smartphone without an Electric Outlet

3 Game Changing Solutions to Recharge Your Smartphone without an Electric Outlet

0 comment Read Full Article
    Starwars BB-8 Droid Working Miniature Version Awakens

Starwars BB-8 Droid Working Miniature Version Awakens

0 comment Read Full Article
    Meet Cozmo: A Playful Little Robot with Emotions

Meet Cozmo: A Playful Little Robot with Emotions

1 comment Read Full Article
    Wall-E Disney-Pixar Movie

Wall-E Disney-Pixar Movie

2 comments Read Full Article
    Game Console and Other Pets Care Automation Gadgets

Game Console and Other Pets Care Automation Gadgets

0 comment Read Full Article
    Solar Roads: The Next Green Electricity Power Plants?

Solar Roads: The Next Green Electricity Power Plants?

0 comment Read Full Article
    Turning Footsteps Energy into Green Electricity

Turning Footsteps Energy into Green Electricity

0 comment Read Full Article
    Warka Water: Collecting Water Out of Thin Air

Warka Water: Collecting Water Out of Thin Air

0 comment Read Full Article
    Will Boston Dynamics Make Domestic Robots?

Will Boston Dynamics Make Domestic Robots?

1 comment Read Full Article
    Will Your Next Robot Take Care of Folding Your Clothes?

Will Your Next Robot Take Care of Folding Your Clothes?

0 comment Read Full Article
    Machines Uprising: From Fun To Deep Thoughts

Machines Uprising: From Fun To Deep Thoughts

0 comment Read Full Article
    Grillbot Takes Care of the Chore of BBQ Grill Cleaning

Grillbot Takes Care of the Chore of BBQ Grill Cleaning

0 comment Read Full Article
    Roomba 980 vs Neato BotVac Connected: Review of the Two Best Robotic Vacuum Cleaners

Roomba 980 vs Neato BotVac Connected: Review of the Two Best Robotic Vacuum Cleaners

19 comments Read Full Article
    Neato Botvac Connected: The First Vacuum Robot Controlled from a Smartwatch

Neato Botvac Connected: The First Vacuum Robot Controlled from a Smartwatch

2 comments Read Full Article
    Best Wireless All-In-One Inkjet Printers with Scanner and Copier

Best Wireless All-In-One Inkjet Printers with Scanner and Copier

1 comment Read Full Article
    Drone Racing League Level 1: Miami Lights  Semi Finals

Drone Racing League Level 1: Miami Lights Semi Finals

1 comment Read Full Article

More Posts