From 太極
Jump to navigation Jump to search

Official website


BeagleboneCup.jpg Beaglebone-specs.png



Blog, Resource

The meaning of LEDs in BBB board

  1. USR0 is configured at boot to blink in a heartbeat pattern
  2. USR1 is configured at boot to light during microSD card accesses
  3. USR2 is configured at boot to light during CPU activity
  4. USR3 is configured at boot to light during eMMC accesses



Internet of Things from BeagleBone Cookbook

Derek Molloy

A series of Youtube videos to introduce Beaglebone. The source code of Video #9 can be downloaded from original website.

  • Video #1 introduction to beaglebone
  • Video #2 C/C++ Programming
  • Video #3 GPIO programming on ARM
  • Video #4 I2C
  • Video #5 USB Wifi & Build Kernel
  • Video #6 Stepper motor
  • Video #7 LCD touchscreen
  • Video #8 Qt Creator
  • Video #9 Example of Qt; shows an application using GPIO + Qt. Video at 1:55 shows how GPIO pins were used for both LCD and LEDs.
  • Video #10 OpenCV
  • Video #11 introduction to GPIO
  • Video #12 Streaming video
  • Video #13 Windows USB network
  • Video #14 JRE, Eclipse

Paul McWhorter 17 Lessons.

Google Group!forum/beagleboard

Linux, u-boot, kernel and kernel module sources


It seems the device can remember what was used to boot last time. The information on Fix the boot order/eMMC on a Beagle Bone Black does not hold now (2019-07-31) on my BBB.

From microSD: one time solution

To boot from microSD card, I have to hold on the boot button close to microSD card (S2 button). Recall there are 3 buttons on BBB (Power, reset and S2).

From microSD: permanently

BeagleBone Black: booting from SD by default


Download from Username: debian. Password: temppwd. This distribution contains graphical desktop environment.

  • the source code is hosted in github
  • to rebuild the image, follow the instruction at
  • to install the unstable release, check out


The Debian version can be found by (version 7 has a codename wheezy)

debian@beaglebone:~$ cat /etc/debian_version 

microSD version

(2024-06-22) AM335x 11.7 2023-09-02 4GB microSD IoT Debian 11 bullseye works fine on my old BBB and the SD can automatically expand the root partition after reboot. no need to use command line or gparted to increase the root partition.

(2019-08-05) We can use Etcher to write the image "bone-debian-9.5-lxqt-armhf-2018-10-07-4gb.img.xz" (Stretch) to a SD card. The fdisk will show the following. Note that the SD card (30GB) is at /dev/mmcblk0 and the eMMC (2GB) is /dev/mmcblk1.

~$ sudo fdisk -l
[sudo] password for debian: 
Disk /dev/mmcblk0: 29.7 GiB, 31914983424 bytes, 62333952 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xef3fa7f6

Device         Boot Start      End  Sectors  Size Id Type
/dev/mmcblk0p1       8192 62333951 62325760 29.7G 83 Linux

Disk /dev/mmcblk1: 1.8 GiB, 1920991232 bytes, 3751936 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000

Device         Boot  Start     End Sectors  Size Id Type
/dev/mmcblk1p1 *      2048  198655  196608   96M  e W95 FAT16 (LBA)
/dev/mmcblk1p2      198656 3751935 3553280  1.7G 83 Linux

Disk /dev/mmcblk1boot1: 1 MiB, 1048576 bytes, 2048 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/mmcblk1boot0: 1 MiB, 1048576 bytes, 2048 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

The partition table from gparted looks like (old but similar to new)

MicroSD BBB.png

The contents of each partitions look like

brb@brb-P45T-A:~/Downloads$ ls /media/BEAGLE_BONE/
App              debug    dtbs         MLO         scripts    u-boot.img
autorun.inf      Docs     initrd.img   README.htm     uEnv.txt
BASIC_START.htm  Drivers  LICENSE.txt   START.htm  zImage
brb@brb-P45T-A:~/Downloads$ ls /media/rootfs/
bin   dev  home  lost+found  mnt  proc  run   selinux  sys  usr
boot  etc  lib   media       opt  root  sbin  srv      tmp  var

Permanent boot from SD card

One option is to erase eMMC (2GB is too small). Follow Step 2.01 - 2.20 by using the fdisk utility to delete the disk /dev/mmcblk1 in Script to Erase Emmc independently. Beagle Bone Black.

Probably this guide How to Use Fdisk to Manage Partitions on Linux is simpler since we just need to delete the disk and there is no need to create partitions.

emmc version

sudo dd bs=1M if=BBB-eMMC-flasher-debian-7.4-2014-03-04-2gb.img of=/dev/sdc
sudo sync

Doing more in LXDE (outdated)

(2019-08-05) The current desktop is LXQt.

Launch a terminal in LXDE by the keyboard shortcut Ctrl+Alt+t

Check out this and this posts. In summary,

Add the following lines to the <keyboard> section,

<!-- Launch LXTerminal with Ctrl+Alt+t-->
    <keybind key="C-A-t">
      <action name="Execute">

to ~/.config/openbox/lxde-rc.xml. Then reboot.

Problem: if I type ifconfig, it will show bash: ifconfig: command not found. However, if I click on the terminal icon on the desktop, there is no this problem:(

Virtual keyboard

On my small lcd screen (480x272), matchbox is better than florence.


sudo apt-get install matchbox-keyboard

The matchbox keyboard can only be launched via command line matchbox-keyboard. It is not in Accessories nor Universal Access.


sudo apt-get update
sudo apt-get install florence

The florence keyboard can be accessed by LXDE Menu -> Universal Access -> Florence Virtual Keyboard.

The keyboard can be resized, make a change of color, et al. See

Maximize the terminal screen all the time

Modify the file ~/.config/openbox/lxde-rc.xml by adding (in the block of <applications>)

  <application name="lxterminal"> 

Then reboot or ran openbox --reconfigure after making the change. It works.

Change/Shorten the prompt

When I use the hdmi cape, the screen is too small so it makes to change/shorten the default prompt. The simplest setting is to use

PS1='$ ' 

We can add a color and the current path (Not the full path) by using PS1='\[\e[1;33m\]\W\$ \[\e[0m\]'

But if I want to change the setting permanently, I modify ~/.bashrc file and change two lines about PS1 by removing @\h, @u, and \w characters.

[if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\[\033[00m\]:\[\033[01;34m\]\[\033[00m\]\$ '
    PS1='${debian_chroot:+($debian_chroot)}\$ '

See this post.

Root terminal

  • To enable the root account, type sudo passwd root
  • To disable root access, type sudo passwd -l root


sudo apt install conky-all

I modify the configuration file /etc/conky/conky.conf to

  • Reduce the font size (conky.config: font)
  • Move the panel up (conky.config: gap_y)
  • Update interval (conky.config: update_interval)
  • Reorganize the elements, especially to show network IPs (conky.text)
  • This assume eth0 is connected. Check How can I get IP address showing from using Conky.
conky.config = {
    alignment = 'top_left',
    background = false,
    border_width = 1,
    cpu_avg_samples = 2,
	default_color = 'white',
    default_outline_color = 'white',
    default_shade_color = 'white',
    draw_borders = false,
    draw_graph_borders = true,
    draw_outline = false,
    draw_shades = false,
    use_xft = true,
    font = 'DejaVu Sans Mono:size=10',
    gap_x = 5,
    gap_y = 10,
    minimum_height = 5,
	minimum_width = 5,
    net_avg_samples = 2,
    no_buffers = true,
    out_to_console = false,
    out_to_stderr = false,
    extra_newline = false,
    own_window = true,
    own_window_class = 'Conky',
    own_window_type = 'desktop',
    stippled_borders = 0,
    update_interval = 9.0,
    uppercase = false,
    use_spacer = 'none',
    show_graph_scale = false,
    show_graph_range = false

conky.text = [[
${color grey}Uptime:$color $uptime
${color grey}RAM Usage:$color $mem/$memmax - $memperc% ${membar 4}
${color grey}Swap Usage:$color $swap/$swapmax - $swapperc% ${swapbar 4}
${color grey}CPU Usage:$color $cpu% ${cpubar 4}
${color grey}File systems:
 / $color${fs_used /}/${fs_size /} ${fs_bar 6 /}
${color grey}Networking:
Up:$color ${upspeed eth0} ${color grey} - Down:$color ${downspeed eth0}
${addr eth0}
${addr usb0}
${color grey}Name              PID   CPU%   MEM%
${color lightgrey} ${top name 1} ${top pid 1} ${top cpu 1} ${top mem 1}
${color lightgrey} ${top name 2} ${top pid 2} ${top cpu 2} ${top mem 2}
${color lightgrey} ${top name 2} ${top pid 3} ${top cpu 3} ${top mem 3}

For Autostart, I need to increase the pause time from 5 seconds to 30 seconds since LXQt is really slow to fully show up on BBB. See Arch linux wiki.

  • Create ~/.conkyrc file
  • Create ~/.config/autostart/conky.desktop file with a content
[Desktop Entry]
Exec=conky --daemonize --pause=30


The microSD card shows

  • device partition: /dev/sdd1
  • Mounted on /media/brb/rootfs

I back up the partition by

sudo dd if=/dev/sdd of=bbb_debian9.img status=progress

Restore it by

sudo unmount /dev/sdd1
sudo dd bs=4M if=bbb_debian9.img of=/dev/sdd status=progress

Note that though my data is only 3GB, it still back up the whole SD card (30GB in my case). My writing speed is about 20MB/s. So it will take 30 minutes (3000/20/60) to finish the backup.

If we want to compress the image we can try ("-c" means --stdout)

sudo dd if=/dev/sdd | gzip -c  > bbb_debian9.img.gz 
sudo gunzip -c bbb_debian9.img.gz | dd of=/dev/sdd bs=4M

This approach take the same amount of time to create the image but the image it created is much smaller (8.8G vs 30G).



  • Hold the S2 button & power on BBB. 1st and 3rd LEDs blink.

eMMC version (info was outdated now)

  1. wget the image
  2. Use sudo su instead su to have full root permission. Use xz command to write the image to microSD
  3. Insert microSD to BBB and holding the button (closest to microSD) while applying power on BBB
  4. To copy the image to eMMC, use wget again to get the image file. Use sudo su instead su to have full root permission. Then use xz command again to write the image to eMMC.
  5. Remove microSD and reboot BBB. If we keep microSD in BBB, it will boot from microSD. MicroSD has the advantage that we can extend the space while eMMC cannot.
  • Kernel is 3.8.
  • The image contains a miniminal Ubuntu system. It only takes 276 MB when I use df -h command to check. So it does not come with a full desktop.
  • Defautl username=ubuntu, password=ubuntu
  • If I try to install xubuntu-desktop, it requires 421MB data to download and 1.2GB space to install. So it is not feasible since the /dev/mmcblk0p2 partition has only 1.8GB space. Fortunately, the solution in here works well.
  • Unfortunately, I got an error when I issue 'startx'.
Fatal server error:
AddScreen/ScreenInit failed for driver 0

Please check the log file at "/var/log/Xorg.0.log" for additional informaiton.

After I reboot, things looks better. I can get a login GUI. However, the system is very slow and I can not see mouse on the desktop.

microSD version (with LXDE desktop environment) and expanding the file system

PS. Even the emmc version contains LXDE environment. Download from

If we boot into microSD (using ssh [email protected]) and follow the this or this to expand the microSD file system, we can make use whole space in uSD. It involves two commands: one is fdisk (extend the partition) and the other is resize2fs (extend the file system).

Below is what I see on my 32GB microSD card. I am using Debian 9.5 2018-10-07 4GB SD LXQT from the last images web page.

debian@beaglebone:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            215M     0  215M   0% /dev                       
tmpfs            49M  5.5M   43M  12% /run                       
/dev/mmcblk0p1   30G  2.9G   26G  11% /                          
tmpfs           242M     0  242M   0% /dev/shm                   
tmpfs           5.0M     0  5.0M   0% /run/lock                  
tmpfs           242M     0  242M   0% /sys/fs/cgroup             
tmpfs            49M  4.0K   49M   1% /run/user/1000

To find out the Debian version, use cat /etc/os-release.

Console version

Following the instruction on, we can install the console version of Ubuntu on BBB. The image I download is Ubuntu 13.10

This image has some features like access automatically just like Angstrom distribution (I don't know how to get this to work on eMMC version of Ubuntu image). That means I can just connect to BBB without using ethernet under Ubuntu OS.

Installation script (uSD is mounted on /dev/sdc in my case)

tar xJf ubuntu-13.10-console-armhf-2013-11-15.tar.xz
cd ubuntu-13.10-console-armhf-2013-11-15
sudo ./ --mmc /dev/sdc --uboot bone

The username/password is ubuntu/temppwd.

Below is what I get in HOST os

brb@brb-P45T-A:~/ubuntu-13.10-console-armhf-2013-11-15$ ifconfig
eth2      Link encap:Ethernet  HWaddr 90:59:af:63:df:45  
          inet addr:  Bcast:  Mask:
          inet6 addr: fe80::9259:afff:fe63:df45/64 Scope:Link
          RX packets:9 errors:0 dropped:0 overruns:0 frame:0
          TX packets:47 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1010 (1.0 KB)  TX bytes:11690 (11.6 KB)

and what I get inside BBB

ubuntu@arm:~$ ifconfig
eth0      Link encap:Ethernet  HWaddr 90:59:af:63:df:43  
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
usb0      Link encap:Ethernet  HWaddr c6:18:a5:e4:60:71  
          inet addr:  Bcast:  Mask:
          inet6 addr: fe80::c418:a5ff:fee4:6071/64 Scope:Link
          RX packets:178 errors:0 dropped:0 overruns:0 frame:0
          TX packets:100 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:22583 (22.5 KB)  TX bytes:20013 (20.0 KB)
ubuntu@arm:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/mmcblk0p2   15G  493M   14G   4% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
udev            247M  4.0K  247M   1% /dev
tmpfs            50M  236K   50M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            248M     0  248M   0% /run/shm
none            100M     0  100M   0% /run/user
/dev/mmcblk0p1   64M   17M   47M  27% /boot/uboot

We can make the Ubuntu talk to internet by using the instruction given in Angstrom section (run sudo su first).

TTL/Serial (FTDI) cable connection

The screenshot below shows we can use a ttl serial cable to log into beaglebone in command line mode. The beaglebone is powered by a 5v usb. The tricky part is the J4 pin (RXD) in BBB should be connected to the TXD pin in ttl cable. Similarly, the J5 (TDX) pin in BBB should be connected to the RXD pin 8n ttl cable. The 3.3v p8n in ttl cable is not used at all.

This post from asks NOT to connect the 5V pin from TTL to BBB. The Serial port pin settings is given on as linked from

Check out the beaglebone black system manual (Section 7.5 Serial Header) about the serial debug ports from

   BBB        TTL
   J1 GND    GND
   J4 (RXD)  TX
   J5 (TXD)   RX


Here is the log of the booting process (Debian OS).

See also the UDOO example.

Find out the IP address if we use internet sharing

If we are using ethernet on BBB, we can find out the IP adress by using the following way.

Download fing deb package from overlooksoft website. Install it by double clicking the file in file manager. Issue the following command to find out the IP of beaglebone black (shared computer). The IP of my 2nd ethernet adapter (eth1) is

sudo fing -n

Wifi setup using hashed password

wpa_passphrase your_SSID your_password

This command will output something like:


You can then use the generated PSK directly in your wpa_supplicant configuration file "/etc/wpa_supplicant/wpa_supplicant.conf" .

Start wpa_supplicant:

sudo wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf

Wifi setup command line using iwconfig and iwlist

  • A USB wifi adapter can be found
  • Some of my adapters
    • TP-LINK shows it is Atheros AR9271 802.11n.
    • The EdiMax is EW-7811Un 802.11n.
    • Rosewill RNX-EasyN1 is RT2870/RT3070
  • Setting up WiFi with BeagleBone Black from adafruit. The important messages are
    • Use a usb-extension (even an unpowered hub)
    • modify /etc/network/interfaces file to uncomment wlan0 interface & enter correct sssid/password
    • sudo ifup wlan0
    • To make the wlan0 up at the boot time, I have to change the line auto wlan0 to allow-hotplug wlan0 like this post on Raspberry Pi. Note that I am using a HDMI cape on my BBB.
  • My /etc/network/interfaces' looks like
    auto lo
    iface lo inet loopback
    allow-hotplug wlan0
      wpa-ssid "YOURSSID"
      wpa-psk "YOURPASSWORD
    iface usb0 inet static
  • (it is worthy to mention the tutorial uses USB emulated serial connection ONCE all required software are installed. Similar tech was also used in Raspberry Pi). The Adafruit website also teaches us how to use the USB cable provided by BBB to do an ad-hoc SSH connection. However, the BBB differ from BB by several factors, including removal of USB-to-serial interface; see here
    dmesg | grep rtl8192
    ifconfig wlan0
    sudo apt update
    sudo apt-get install wireless-tools
    # find out the name of your wireless interface using
    sudo iwlist wlan0 scanning
    sudo nano /etc/network/interface
    # Made appropriate change on /etc/network/interface
    sudo ifup wlan0 // not needed if we have enable wlan0 at boot. 
                    // sudo ifconfig wlan0 up

    where the file /etc/network/interface should be like

    auto wlan0
    iface wlan0 inet dhcp
        wpa-ssid mynetworkname
        wpa-psk mysecretpassphrase
  • Note that the output of "iwlist" is a long text. It does output signal level (eg -41 dBm) for each ESSID.

wifi setup with wicd-curses (TUI/text user interface)

Update: it seems wicd-curses is not available. Consider "sudo apt-get install network-manager" and then "nmtui".

If we don't know the ssid or the connection is done through 'I Agree' method in a webpage, the command line way is not useful. However, with wicd-curses program, we can still connect to a wireless network. This works when I tested it on my work place wifi network.

# Remove ethernet. Connect to BBB by ssh [email protected] using USB cable
ifconfig -a
sudo apt-get update
sudo apt-get install wicd-curses
sudo wicd-curses
# Shift+P to add wlan0 to wireless network. Press F10 to save it. Press Shift+R to refresh.

wifi setup with network-manager

sudo apt install network-manager

# List available WiFi networks including SSID, Channel, Rate, Signal, Bars, and Security.
nmcli device wifi list   

nmcli device wifi connect <SSID> password <password>  # Connect to a WiFi network
nmcli con show  # Show all network connections
nmcli con up id <connection_name>  # Bring up a connection

# OR use

Take a screenshot

Use the scrot program.

sudo apt-get install scrot
scrot -d 5 screenshot.png  # delay 5 seconds

apt source

On my Debian 7.5/wheezy (lsb_release -a), the /etc/apt/sources.list shows

deb wheezy main contrib non-free
deb wheezy-updates main contrib non-free
deb wheezy/updates main contrib non-free
deb [arch=armhf] wheezy-bbb main


# Umount the uSD card 
mount # find /dev/sdc1
sudo diskfutil unmount /dev/sdc1
ls *.xz

# Copy img file to microSD card. Took about 15-30 minutes.
# Method 1.
tar -xJf BBB-eMMC-flasher-2013.06.20.img.xz
sudo dd bs=1m if=~/Downloads/BBB-eMMC-flasher-2013.06.20.img of=/dev/sdc
sudo sync
# Method 2.
xz -cd BBB-eMMC-flasher-2013.06.20.img.xz > /dev/sdc

Remove the microSD card and insert it fully into BBB uSD card slot.

To flash the BBB: Hold down the 'user boot' button (closes to uSD card slot) and power on BBB until the 4 LED's light up for a few seconds. It will take 30-45 minutes to flash the image onto the eMMC. Once it's done, the 4 LED's will all stay lit up at the same time. You can then power down your BBB, remove uSD and power up BBB.

The username is root. There is not password. We can access it by ssh [email protected].

If we type ifconfig in Angstrom, we find the connection is through usb0 adapter.

root@beaglebone:~# ifconfig
eth0      Link encap:Ethernet  HWaddr 90:59:AF:63:DF:43  
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback  
          inet addr:  Mask:
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:12 errors:0 dropped:0 overruns:0 frame:0
          TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:760 (760.0 B)  TX bytes:760 (760.0 B)

usb0      Link encap:Ethernet  HWaddr 86:27:86:2D:45:5C  
          inet addr:  Bcast:  Mask:
          RX packets:2765 errors:0 dropped:0 overruns:0 frame:0
          TX packets:5003 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:179578 (175.3 KiB)  TX bytes:7067277 (6.7 MiB)

eMMC version

It contains two partitions.

fat16  BEAGLE_Bone    70.57MB
ext4   eMMC-Flasher   3.33GB

One BEAGLE_Bone partition, it contains 4 files. <ID.txt>, <MLO>, <u-boot.img>, and <uEnv.txt>.

<ID.txt> shows the eMMC flasher date (such as 2013.09.04). <MLI> and <u-boot.img> are binary files. <uEnv.txt> has only one line.

On eMMC-Flasher partition, it contains a regular Linux system (/bin, /boot, ...) and one file <eeprom.dump>.

Web server

Google coder


opkg update
opkg install x11vnc

x11vnc -bg -o %HOME/.x11vnc.log.%VNCDISPLAY -auth /var/run/gdm/auth-for-gdm*/database -display :0  -forever

To start VNC server at bootup and shutdown, check out

Package download

opkg update
opkg install XXXX
opkg list | grep "gfortran"

However, at least for BBB case, I cannot find gfortran package so I cannot install R. See discussions below

The angstrom linux package browser is the place we can see if packages for BBB Cortex-A8. According to Wikipedia the Cortex-A8 has armv7a architecture. Cortex-A7 (eg pcDuino3) is a smaller, faster, and more power-efficient successor to the Cortex-A8.

On ubuntu, we can use ldconfig -v command to show the installed libraries and their versions. See here. If we like to manually add libraries to ubuntu/debian, we can check the tip here.


Forget about XBMC on BeagleBone Black. It has many pros over PI except the GPU that XBMC is heavily realies on, even for the interface.

BBB does have any hardware codec acceleration.


beaglebone.local and Avahi/Bonjour/Zeroconf

(2019-08-01) We can ssh to BBB running Debian by ssh [email protected] and the default pw is temppwd.

Instead of typing an IP address, we can use [email protected] to access BBB running on Angstrom OS. The implementation is done by Avahi Daemon/Bonjour/ZeroConf/Multicast.

We can manually install avahi-daemon in ubuntu-armhf by

sudo apt-get update
sudo apt-get install avahi-daemon

After that, we should be able to ssh [email protected] instead of using IP. PS: not stable.

brb@brb-P45T-A:~$ ssh [email protected]
ssh: connect to host ubuntu-armhf.local port 22: Connection refused

The real IP address can be found by ping HOSTNAME.local (Updated: use ps -ef | grep avahi to find out the exact hostname used in .local domain because at least one of my Ubuntu machines does not use its hostname exactly)

For the Angstrom OS with beaglebone, I found the IP number is in (same as in the Getting Start page) by using ping command.

brb@brb-P45T-A:/etc/init$ ping beaglebone.local
PING beaglebone.local ( 56(84) bytes of data.
brb@brb-P45T-A:/etc/init$ ifconfig
eth2      Link encap:Ethernet  HWaddr 90:59:af:63:df:45  
          inet addr:  Bcast:  Mask:

The same method can be applied to Raspberry Pi or Ubuntu. In fact, avahi-daemon is installed by default. We can use ps -ef | grep avahi to check it.

Internet over Ethernet

Suppose the host machine has a USB ethernet adapter/cable. We can share the internet from the host to BBB.

The host's USB-ethernet adapter has an IP and it is configured as shared instead of DHCP.

The BBB will have eth0: and usb0:

We can use ssh [email protected] to access it. The BBB will have internet access.

echo "nameserver" > /etc/resolv.conf

Network over USB

We can use a USB cable to connect to BBB from a Windows/Linux/Mac computer. This is a very unique feature in BBB. Not even Raspberry Pi has this feature.

See the next section to know how to use this feature to get an internet access for BBB so it does not need to plug in an ethernet cable or a WIFI adapter.

Internet over USB

On BBB, run

sudo su
/sbin/route add default gw
echo "nameserver" >> /etc/resolv.conf
netstat -rn

Note it is convenient to save the first 2 lines in a script file (eg 'networkusb') and chmod +x it. Then when we want to use USB to connect to internet, we just use sudo su ~/networkusb.

It is perfectly fine to have multiple lines of nameserver. (IP Masquerade/Share the internet connection + IP forward)

The above procedure of setting gateway is temporary. We can also permanently change the gateway setting by editing /etc/network/interfaces file (

auto lo
iface lo inet loopback
auto usb0
iface usb0 inet static

Then run

sudo service networking restart

On host, run (wlan0 is my host internet adapter, eth1 is the BBB USB connection on my host)

sudo iptables --table nat --append POSTROUTING --out-interface wlan0 -j MASQUERADE
sudo iptables --append FORWARD --in-interface eth1 -j ACCEPT
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward > /dev/null
sudo iptables -t nat -L


  1. The ip-forward statement can be alternatively enabled by un-commenting a suitable line in /etc/sysctl.conf file (same method was used by Adafruit)
  2. We can save the first 2 lines in a script file (eg. 00-firewall) and put it in the /etc/network/if-up.d directory. Don't forget to run chmod 755 on this file. Any script in this directory will be executed as soon as your network interfaces come up. See the instruction from
  3. See also the method provided from Adafruit by just modifying /etc/network/interfaces file.

And the following is the output of running iptables -t nat -L before running the masquerade & ip forward.

$ sudo iptables -t nat -L
[sudo] password for brb: 
target     prot opt source               destination         

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

target     prot opt source               destination    

and the following is after I run the masquerade and ip forward:

$ sudo iptables -t nat -L
target     prot opt source               destination         

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

target     prot opt source               destination         
MASQUERADE  all  --  anywhere             anywhere     

Now everything should be done. Now we can ping in BBB to see if the connection works. This is tested on my home ubuntu host machine running 12.04 & 14.04. We can use the last command to show nat table on host machine; See here.



This post on Archlinux discusses how to get the usb network adapter that is built into the mini-usb power connector working under Arch.


How to share internet over USB on BBB?

microHDMI to VGA cable

Question: How to create EDIT? My NEC monitor supports only 1024 x 768.

Beagleboneblack HDMI page from

Remote desktop connection

From Linux

See Raspberry#Connection_to_Raspberry_Pi_with_tightvnc

# Server side
sudo apt-get install tightvncserver
tightvncserver     # set up the password, e.g. same password as the debian user
vncserver          # this step may not be necessary
vncserver –kill :1 # kill the current vncserver
vncserver -geometry 480x272   # Simulate using the 4D 4.3" LCD cape; see the screenshot below. 

# Client side
# or xtightvncviewer if we use usb0 
# or xtightvncviewer beaglebone.local:1 if we use usb0

BBB vnc.png

To start tightvncserver automatically at start, follow the instruction at here to create a new script file under /etc/init.d/ directory and run update-rc.d on the new script.

debian@beaglebone:~$ sudo nano /etc/init.d/vncserver
[sudo] password for debian: 
debian@beaglebone:~$ sudo chmod +x /etc/init.d/vncserver 
debian@beaglebone:~$ sudo update-rc.d vncserver defaults
update-rc.d: using dependency based boot sequencing
update-rc.d: warning: default start runlevel arguments (2 3 4 5) do not match vncserver Default-Start values (S)
update-rc.d: warning: default stop runlevel arguments (0 1 6) do not match vncserver Default-Stop values (0 6)
insserv: Script vncserver is broken: incomplete LSB comment.
insserv: missing `Required-Stop:'  entry: please add even if empty.
debian@beaglebone:~$ sudo reboot

Despite the warning, it still works. It make a copy of this vncserver file below. Something we may want to change for different scenario is the USER and GEOMETRY parameters.

#!/bin/sh -e
# Provides:          vncserver
# Required-Start:    networking
# Default-Start:     S
# Default-Stop:      0 6

# PATH="$PATH:/usr/X11R6/bin/"

# The Username:Group that will run VNC
export USER="debian"

# The display that VNC will use

# Color depth (between 8 and 32)

# The Desktop geometry to use.

# The name that the VNC Desktop will have.

OPTIONS="-name ${NAME} -depth ${DEPTH} -geometry ${GEOMETRY} :${DISPLAY}"

. /lib/lsb/init-functions

case "$1" in
log_action_begin_msg "Starting vncserver for user '${USER}' on localhost:${DISPLAY}"
su ${USER} -c "/usr/bin/vncserver ${OPTIONS}"

log_action_begin_msg "Stoping vncserver for user '${USER}' on localhost:${DISPLAY}"
su ${USER} -c "/usr/bin/vncserver -kill :${DISPLAY}"

$0 stop
$0 start

exit 0

From Windows


Remote Access to a Raspberry Pi using MobaXterm

My Observation about angstrom distribution

When I use the image BBB-eMMC-flasher-2013.06.20.img to put it on the microSD card with win32DiskImager, I see (from plugging SD in Ubuntu) the microSD card has 2 partitions

eMMC-Flasher  -ext4

where eMMC-Flasher contains an ubuntu data and BEAGLE_BONE contains only 4 files.

ID.txt - just one line
MLO - 98K binary
u-boot.img - 371K binary
uEnv.txt - just one line

Flashing is done by pressing the 'Boot' button while connecting the power. It took 1 hour in my case when I flashed BBB-eMMC-flasher-2013.06.20.img.

However, once the microSD is flashed to eMMC, the 'eMMC-Flasher' partition will be gone and 'BEAGLE_BONE' partition is changed to include 3 new folders- App, Docs and Drivers AND some new files - START.htm, autorun.inf,

Android OS

BBB vs Raspberry Pi

Beaglebone 101

Angstrom includes a web server running on BBB. The web address is

I have created screenshots in Google drive

Fix date/time

See here. Run the following to change the country and time zone.

sudo dpkg-reconfigure tzdata

Then run

sudo ntpdate

For one time fix (for example, we want to avoid an error from running 'make'), we can use

sudo date -s "2 Apr 2014 19:00:00"

Increase sudo timeout

sudo visudo
# Add the following line for 10 minutes. Use -1 for infinity.
# Modify USER_NAME for your own.
Defaults:USER_NAME timestamp_timeout=10

Run Graphical App on remote computer

Suppose we have a Qt app we want to launch from a local computer and show the GUI on BBB. We can

  1. Run xhost + as a user on BBB
  2. Run export DISPLAY=:0.0 then our own graphical application from the local computer.

To run xhost command at boot (The xhost command needs an active X server to run, it can run at the login screen e.g. when lightdm loads), we can follow the instruction here

Run Graphical App as root on local computer

This is related to the question: Make X11 program work in an ssh sudo session

One way that works is to run ssh -X [email protected] first (it seems not necessary to use ssh -Y option). Then

sudo XAUTHORITY=/home/debian/.Xauthority /home/debian/Downloads/servo/servo

Then my GUI app located in /home/debian/Downloads/servo/servo will be launched as root shown in my local machine.

If the GUI app is not run by root, we don't need to bother the xauthroity. We can just run the app.

Use microSD as ext storage

It is possible. See the idea in here.

Playing music using command line tools

Install ALSA libraries first (these may be installed already). ALSA stands for Advanced Linux Sound Architecture.

sudo apt-get install alsa-base alsa-utils
sudo apt-get install libasound2-dev
  1. Beaglebone Robotic Project: Chapter 3.
  • mpg123 - Yes, there are keyboard shortcuts. Use '-C' argument. For example, use ":" for fast? forward.
sudo apt-get install mpg123
  • sox - using about 50% of CPU. no keyboard shortcut
sudo apt-get install sox libsox-fmt-all
  • vlc - using about 50% of CPU and has a complete keyboard shortcuts. For example, a/z for volume and left/right arrow for fast backward/forward (seek -/+ 1%). Space for pause and s for stop. -/+ key to slow down/accelerate the playing speed for video files. Shift+left arrow to a short backwards jump. See also the hotkey page (not exactly the same).
sudo apt-get install vlc-nox
vlc -I ncurses XXX.mp3

To use Syba USB audio adapter, we should switch audio output from HDMI to USB adapter. To do that, create a new file called <.asoundrc> with the content

pcm.!default sysdefault:Device

If check the speaker and microphone are not muted, use


Use the m key to unmute the microphone. Make sure your USB sound device is detected, type

aplay -l
# OR
cat /proc/asound/cards

Now it is time to test the USB audio adapter by using VLC.

Build R on BBB

I am using Ubuntu 13.04 image since angstrom linux missing many required packages.

Since the space is limited, instead of using 'sudo apt-get build-dep r-base', I manually install the essential packages: build-essential, gfortran, libreadline6-dev, libx11-dev, libxt-dev and openjdk-7-jre.

I am using R 3.0.1. (Update) R 3.1.0 works well too.

ubuntu@ubuntu-armhf:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/mmcblk0p2  1.8G  276M  1.4G  17% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
devtmpfs        248M  4.0K  248M   1% /dev
none             50M  220K   50M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            248M     0  248M   0% /run/shm
none            100M     0  100M   0% /run/user
/dev/mmcblk0p1 1004K  472K  532K  48% /boot/uboot

sudo apt-get update
sudo apt-get install build-essential gfortran libreadline6-dev libx11-dev libxt-dev
sudo apt-get install openjdk-7-jre    
// (optional) need it if we don't want to get an error message at the end of running 'make'
// This require 143MB space.

// The whole process (configure + make) takes at least 2 hours on BBB
./configure --enable-R-shlib
// make > ~/Rmake.txt 2>&1

There is still warnings with library/datasets
It seems this is false alarm.

ubuntu@ubuntu-armhf:~/R-3.0.1$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/mmcblk0p2  1.8G  1.1G  615M  64% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
devtmpfs        248M  4.0K  248M   1% /dev
none             50M  224K   50M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            248M     0  248M   0% /run/shm
none            100M     0  100M   0% /run/user
/dev/mmcblk0p1 1004K  472K  532K  48% /boot/uboot

The complete process of running ./configure and make are recorded in

Other configure options

./configure --disable-byte-compiled-packages --enable-R-shlib

Performance Test


  • Sometimes the system does not respond. The desktop is freezed and ssh to log in does not work. I am current using Ubuntu image.

Benchmark (Raspberry Pi vs BBB vs Edison) using the sysbench utility

Note that sysbench does not benchmark gpu. For more information on sysbench, see the following pages:

sudo apt-get install sysbench
sysbench --test=cpu run
sysbench --test=memory --memory-block-size=1M --memory-total-size=10G run
sysbench --test=fileio --file-test-mode=rndwr --file-total-size=16MB prepare
sysbench --test=fileio --file-test-mode=rndwr --file-total-size=16MB --max-requests=1000 run
sysbench --test=fileio --file-test-mode=rndrd --file-total-size=16MB --max-requests=10000 run
# For the Edison tests, I added ‘-max-threads=2′
# For the Pi & BBB tests, I added ‘-max-threads=1′

My test result shows the storage random write result from the original post on should be 3.04 seconds instead of 43 seconds. So BBB beats RPi model B in cpu,memory,storage read & write but not in cpu when compared to RPi 2 (see

debian@beaglebone:~$ sysbench --test=cpu run
sysbench 0.4.12:  multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1

Doing CPU performance benchmark

Threads started!

Maximum prime number checked in CPU test: 10000

Test execution summary:
    total time:                          260.0903s
    total number of events:              10000
    total time taken by event execution: 260.0687
    per-request statistics:
         min:                                 25.57ms
         avg:                                 26.01ms
         max:                                 87.97ms
         approx.  95 percentile:              26.14ms

Threads fairness:
    events (avg/stddev):           10000.0000/0.00
    execution time (avg/stddev):   260.0687/0.00

debian@beaglebone:~$ sysbench --test=memory --memory-block-size=1M --memory-total-size=10G run
sysbench 0.4.12:  multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1

Doing memory operations speed test
Memory block size: 1024K

Memory transfer size: 2048M

Memory operations type: write
Memory scope type: global
Threads started!

Operations performed: 2048 ( 1160.85 ops/sec)

2048.00 MB transferred (1160.85 MB/sec)

Test execution summary:
    total time:                          1.7642s
    total number of events:              2048
    total time taken by event execution: 1.7564
    per-request statistics:
         min:                                  0.70ms
         avg:                                  0.86ms
         max:                                  8.66ms
         approx.  95 percentile:               1.86ms

Threads fairness:
    events (avg/stddev):           2048.0000/0.00
    execution time (avg/stddev):   1.7564/0.00

debian@beaglebone:~$ sysbench --test=fileio --file-test-mode=rndwr --file-total-size=16MB prepare
sysbench 0.4.12:  multi-threaded system evaluation benchmark

128 files, 128Kb each, 16Mb total
Creating files for the test...

debian@beaglebone:~$ sysbench --test=fileio --file-test-mode=rndwr --file-total-size=16MB --max-requests=1000 run
sysbench 0.4.12:  multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1

Extra file open flags: 0
128 files, 128Kb each
16Mb total file size
Block size 16Kb
Number of random requests for random IO: 1000
Read/Write ratio for combined random IO test: 1.50
Periodic FSYNC enabled, calling fsync() each 100 requests.
Calling fsync() at the end of test, Enabled.
Using synchronous I/O mode
Doing random write test
Threads started!

Operations performed:  0 Read, 1000 Write, 1280 Other = 2280 Total
Read 0b  Written 15.625Mb  Total transferred 15.625Mb  (5.1363Mb/sec)
  328.72 Requests/sec executed

Test execution summary:
    total time:                          3.0421s
    total number of events:              1000
    total time taken by event execution: 0.2028
    per-request statistics:
         min:                                  0.13ms
         avg:                                  0.20ms
         max:                                  5.65ms
         approx.  95 percentile:               0.26ms

Threads fairness:
    events (avg/stddev):           1000.0000/0.00
    execution time (avg/stddev):   0.2028/0.00

debian@beaglebone:~$ sysbench --test=fileio --file-test-mode=rndrd --file-total-size=16MB --max-requests=10000 run
sysbench 0.4.12:  multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1

Extra file open flags: 0
128 files, 128Kb each
16Mb total file size
Block size 16Kb
Number of random requests for random IO: 10000
Read/Write ratio for combined random IO test: 1.50
Periodic FSYNC enabled, calling fsync() each 100 requests.
Calling fsync() at the end of test, Enabled.
Using synchronous I/O mode
Doing random read test
Threads started!

Operations performed:  10000 Read, 0 Write, 0 Other = 10000 Total
Read 156.25Mb  Written 0b  Total transferred 156.25Mb  (182.72Mb/sec)
11693.80 Requests/sec executed

Test execution summary:
    total time:                          0.8552s
    total number of events:              10000
    total time taken by event execution: 0.7972
    per-request statistics:
         min:                                  0.02ms
         avg:                                  0.08ms
         max:                                  1.82ms
         approx.  95 percentile:               0.11ms

Threads fairness:
    events (avg/stddev):           10000.0000/0.00
    execution time (avg/stddev):   0.7972/0.00

Sysbench comparison of BBB and Intel(R) Xeon(R) W3690 @ 3.47GHz


debian@beaglebone:~$ sysbench --test=cpu --num-threads=1 --cpu-max-prime=2000 run
sysbench 0.4.12:  multi-threaded system evaluation benchmark
Test execution summary:
    total time:                          29.4288s

debian@beaglebone:~$ sysbench --test=cpu --num-threads=2 --cpu-max-prime=2000 run
Test execution summary:
    total time:                          29.3096s

Intel(R) Xeon(R) W3690 @ 3.47GHz (The results shows enabling hyper-threading has no advantage!!)

brb@brbweb4:~/Qt$ sysbench --test=cpu --num-threads=1 --cpu-max-prime=2000 run
Test execution summary:
    total time:                          1.1260s

brb@brbweb4:~/Qt$  sysbench --test=cpu --num-threads=6 --cpu-max-prime=2000 run
Test execution summary:
    total time:                          0.2691s

brb@brbweb4:~/Qt$  sysbench --test=cpu --num-threads=12 --cpu-max-prime=2000 run
sysbench 0.4.12:  multi-threaded system evaluation benchmark
Test execution summary:
    total time:                          0.3012s


The software was mentioned in another article about benchmark on different virtualization software.

Qt cross compile

The list below is specific to beaglebone (black)

Other resource related to Raspberry Pi

sudo apt-get install gcc-arm-linux-gnueabi

What's wrong when running a binary created on x86_64 OS

For the hello world example, I will get an error in BBB if I just scp the binary file from x86_64 OS to BBB.

debian@beaglebone:~$ ./a.out
-bash: ./a.out: cannot execute binary file

What we should do to compile hello.c

arm-linux-gnueabi-gcc -march=armv7-a -mtune=cortex-a8 -mfpu=neon -o hello hello.c
scp hello [email protected]:

Then we run hello program in BBB. It should run successfully.

What we should do to compile hello.cpp

Note: do not install g++-arm-linux-gnueabihf package. It will give me the following error when I try to compile a simple cpp program.

warning:, needed by /usr/lib/gcc/arm-linux-gnueabihf/4.6/, not found (try using -rpath or -rpath-link)

According to the above website or we shall install the toolchain

sudo apt-get install gcc-arm-linux-gnueabi
sudo apt-get install g++-arm-linux-gnueabi

I can build hello.cpp on my x86_64 host.

arm-linux-gnueabi-g++ -march=armv7-a -mtune=cortex-a8 -mfpu=neon -o hellocpp hello.cpp

But when I run the hellocpp program, I get the following error

debian@beaglebone:~$ ./hellocpp
./hellocpp: error while loading shared libraries: cannot open shared object file: No such file or directory

I also try the following. It is a big download but still does not help.

sudo apt-get install ia32-libs

Some people suggested to add the following when compiling your program

-static -static-libstdc++

It works!!! The complete compile command is (-static-libstdc++ is not necessary)

arm-linux-gnueabi-g++ -march=armv7-a -mtune=cortex-a8 -mfpu=neon -static -o hellocpp hello.cpp

Linaro Toolchain

Although there are different toolchains, we are particularly interested in linaro toolchain. See

Check out this page for more information about toolchain.

Some paths

  • arm-linux-gnueabi-gcc, arm-linux-gnueabi-g++, arm-linux-gnueabi-ar,... are located at /usr/bin/. This can be found by typing arm-linux-gnuabi-[TAB]
  • ar, objcopy, strip also are located at /usr/arm-linux-gnueabi/bin.
brb@brb-P45T-A:~/Documents$ arm-linux-gnueabi-
arm-linux-gnueabi-addr2line  arm-linux-gnueabi-gprof
arm-linux-gnueabi-ar         arm-linux-gnueabi-ld
arm-linux-gnueabi-as         arm-linux-gnueabi-ld.bfd
arm-linux-gnueabi-cpp        arm-linux-gnueabi-nm
arm-linux-gnueabi-cpp-4.6    arm-linux-gnueabi-objcopy
arm-linux-gnueabi-elfedit    arm-linux-gnueabi-objdump
arm-linux-gnueabi-g++        arm-linux-gnueabi-ranlib
arm-linux-gnueabi-g++-4.6    arm-linux-gnueabi-readelf
arm-linux-gnueabi-gcc        arm-linux-gnueabi-size
arm-linux-gnueabi-gcc-4.6    arm-linux-gnueabi-strings
arm-linux-gnueabi-gcov       arm-linux-gnueabi-strip

brb@brb-P45T-A:~$ dpkg -L gcc-arm-linux-gnueabi
brb@brb-P45T-A:~$ ls -l /usr/bin/arm-linux-gnueabi-gcc
lrwxrwxrwx 1 root root 25 Feb 18  2012 /usr/bin/arm-linux-gnueabi-gcc -> arm-linux-gnueabi-gcc-4.6
brb@brb-P45T-A:~$ locate arm-linux-gnueabi-gcc-4.6

Configure Eclipse for cross compile

GUI not shown up

Cross compile Qt

Some possible options

./configure -embedded arm -prefix /usr/local/QtEmbedded-arm -platform linux-g++ \
            -little-endian -xplatform qws/linux-arm-g++ -qt-gfx-linuxfb \
            -qt-gfx-vnc -qt-gfx-multiscreen -qt-mouse-pc -release -shared \
            -no-fast -depths all -D QT_NO_QWS_CURSOR -confirm-license -no-pch

# based on qt 4.8.5
./configure -v -opensource -confirm-license -prefix /opt/qt -embedded arm \
            -platform qws/linux-x86-g++ -xplatform qws/linux-am335x-g++ \
            -depths 16,24,32 -no-mmx -no-3dnow -no-sse -no-sse2 -no-glib -no-cups \
            -no-largefile -no-accessibility -no-openssl -no-gtkstyle -qt-mouse-pc \
            -qt-mouse-linuxtp -qt-mouse-linuxinput -plugin-mouse-linuxtp -plugin-mouse-pc \
            -fast -little-endian -host-big-endian -no-pch -no-sql-ibase -no-sql-mysql \
            -no-sql-odbc -no-sql-psql -no-sql-sqlite -no-sql-sqlite2 -no-webkit \
            -no-qt3support -nomake examples -nomake demos -nomake docs -nomake translations

# Based on qt 5.2.0
# # qwx is located at mkspecs/qws. What does platform and xplatform do? 
./qt-everywhere-opensource-src-5.2.0/configure -v -opensource -confirm-license \
    -prefix /usr/local/qt-5.2 -no-largefile -no-accessibility -qt-zlib \
    -no-gif -qt-libpng -qt-libjpeg -no-nis -no-cups -xplatform linux-linaro-gnueabihf-g++ \
    -device linux-beaglebone-g++ -device-option \
  1. qws

QWS is a window server similar to X11 that works independently from it. Unlike X11, QWS windows cannot be forwarded to your Windows machine and will be displayed by your board directly. Before we proceed with starting our application in QWS mode ensure that your board is showing the text terminal and not the X11 session (press Ctrl-Alt-F1 to switch to it):

Native build Qt on BBB

The following screenshot demonstrates running qt-4.8.5/examples/painting/basicdrawing/ in BBB. That is, it is possible to compile the Qt directly in beaglebone black without using cross-compile.

BBB Qt drawing.png

For general instruction of building Qt on different platforms, consult to

The way I build Qt is

mv qt-everywhere-opensource-src-4.8.5 qt-4.8.5
cd qt-4.8.5
./configure -v -opensource -confirm-license -no-largefile -no-accessibility \
            -qt-zlib -no-gif -qt-libpng -qt-libjpeg -no-nis -no-cups -no-pch
make # BBB is single core; o.w. pass -jN where N is the number of threads
sudo make install
  • configure takes about 1 hour. Not much information is given after running configure. It only said Qt is now configured for building. Just run 'make'. Once everything is built, you must run 'make install'. Qt will be installed into /usr/local/Trolltech/Qt-4.8.5. To reconfigure, run make confclean and configure.
  • How to shorten the Qt make process? -nomake demos, -nomake examples, -nomake tools, -no-webkit, -no-qt3support, -no-script, -no-scripttools. Recommended flags for a minimalistic Qt build is another post where one user suggested not to use '-nomake tools'.
  • Running make will take ~ 20 hours
  • Running sudo make install is quick (~ 5 minutes)
  • The std output shows /usr/local/Trolltech/Qt-4.8.5 is created
  • If we want to save (a little) time when running make, we can add -nomake examples -nomake demos to your configure invocations (I don't see these options in Qt 4.8), it works on both windows and linux. It still took ~18 hours when I build Qt 4.8.6.

It is interesting to compare the qt directory under $HOME and /usr/local/Trolltech. Note that even bin directory is copied to /usr/local, the contents inside bin folder are different (not shown here)

debian@beaglebone:~$ ls qt-4.8.5/
bin              configure      imports             LICENSE.FDL   plugins       templates
changes-4.8.5    configure.exe  include             LICENSE.GPL3  tools
config.profiles  demos          INSTALL             LICENSE.LGPL  qmake         translations
config.status    doc            LGPL_EXCEPTION.txt  Makefile      README        util
config.tests     examples       lib                 mkspecs       src

debian@beaglebone:~/qt-4.8.5$ ls /usr/local/Trolltech/Qt-4.8.5/
bin    doc       imports  lib      phrasebooks  q3porting.xml  translations
demos  examples  include  mkspecs  plugins      tests

debian@beaglebone:~/qt-4.8.5$ ls /usr/local/Trolltech/Qt-4.8.5/examples/
animation    draganddrop            help       mainwindows   qtestlib      threads    widgets
dbus         effects                helper     multimedia    README        tools      xml
declarative  examples-manifest.xml  ipc        network       richtext      touch      xmlpatterns
designer           itemviews  opengl        script        tutorials
desktop      gestures               layouts    painting      sql           uitools
dialogs      graphicsview           linguist   qtconcurrent  statemachine  webkit

The final step is to change PATH environment variable by nano ~/.profile

export PATH=/usr/local/Trolltech/Qt-4.8.5/bin:$PATH

Logout and login again to see if qmake is available OR type . $HOME/.profile to source the profile file.

We can write a simple Qt code to test. See here for the code and how to use command line to compile the code.

It is also interesting to see the gcc version on BBB (v4.6.3)

debian@beaglebone:~$ gcc -v
Using built-in specs.
Target: arm-linux-gnueabihf
Thread model: posix
gcc version 4.6.3 (Debian 4.6.3-14) 

debian@beaglebone:~$ ls /usr/bin/arm*
/usr/bin/arm-linux-gnueabihf-cpp      /usr/bin/arm-linux-gnueabihf-gcc-4.6
/usr/bin/arm-linux-gnueabihf-cpp-4.6  /usr/bin/arm-linux-gnueabihf-gfortran
/usr/bin/arm-linux-gnueabihf-g++      /usr/bin/arm-linux-gnueabihf-gfortran-4.6
/usr/bin/arm-linux-gnueabihf-g++-4.6  /usr/bin/arm-linux-gnueabihf-run

Qt Creator

To download the binary version, use

sudo apt-get update
sudo apt-get install qtcreator

This will install Qt Creator 2.5.0 (built on Aug 8 2012 as shown on 'About Qt Creator'). Since my LCD Cape only supports 480x272, I only see a small part of Qt Creator on my tiny screen even I maximize the app.

Note that the current version of Qt Creator 3.5.1 requires Qt 5.4.0. In order to use Qt 4.8.x, we can grab an old version of Qt. One version I can find is 2.5.2 which is available on

To build it (assume qmake is in the PATH)

tar xzvf qt-creator-2.5.2-src.tar.gz
cd qt-creator-2.5.2-src

This will take a very long time and a lot of space. Not worthy to compile from source!

Qt examples

Some great examples to try include

  • examples/animation/appchooser
  • examples/animation/states
  • examples/dialogs/extension
  • examples/dialogs/licensewizard
  • examples/effects/lighting
  • examples/effects/blurpicker
  • examples/graphicsview/weatheranchorlayout
  • examples/graphicsview/elasticnodes
  • examples/graphicsview/diagramscene (a working app for drawing diagrams)
  • examples/help/simpletextviewer (including image on help)
  • examples/help/ipc/ (networking)
  • examples/itemviews/chart (when a cell is selected, the corresponding text from another item list will be highlighted)
  • examples/itemviews/dirview
  • examples/itemviews/frozencolumn
  • examples/itemviews/pixelator
  • examples/itemviews/puzzle (Game)
  • examples/layouts/dynamiclayouts (widgets location changed at real time)
  • examples/network/bearermonitor (show all networks in a tree on lhs and status on rhs)
  • examples/network/fortunateclient
  • examples/network/http (download from an address)
  • examples/network/loopback (with progress bar for sent and receved packets)
  • examples/network/qftp (show contents in the textEdit. Cool!)
  • examples/network/securesocketclient (allow input)
  • examples/opengl (seems not working)
  • examples/painting/concentriccircles (for fun)
  • examples/painting/basicdrawing (basic test)
  • examples/painting/painterpaths (fill gradient on different shapes or letters)
  • examples/qtconcurrent/wordcount (becomes a background job running)
  • examples/richtext/calendar
  • examples/richtext/orderform
  • examples/script/helloscript (not sure about what 'script' means)
  • examples/statemachine/trafficlight
  • examples/statemachine/twowaybutton (very simple)
  • examples/statemachine/rogue (text game. How does it do it)
  • examples/statemachine/pingpong (nothing show up on BBB)
  • examples/threads/waitconditions (nothing show up on BBB)
  • examples/tools/inputpanel (auto pop up input panel from an empty box)
  • examples/tools/settingeditor
  • examples/uitools/textfinder (can highlight text)
  • examples/widgets/styles (use an image as background)
  • examples/widgets/stylesheet (no image was used)
  • examples/widgets/softkeys (no binary)
  • examples/widgets/digitclock (simple)
  • examples/widgets/calculator (classical)
  • examples/widgets/charactermap (magnifier on mouse-over character)
  • examples/widgets/codeeditor (highlight current line)
  • examples/widgets/lineedits (contain license key input with format hint)
  • examples/widgets/sliders (change widgets location at run time)
  • examples/widgets/tablet (manipulate image)
  • examples/widgets/tetrix (a game that works)
  • examples/widgets/tooltip (tooltip on shapes created at run time)
  • examples/xmlpatterns/trafficinfo (not working but background is cool)
  • examples/xmlpatterns/schema (specify a background color on a textEdit is effective)

Python + Qt

sudo apt-get install python-qt4

Create Qt application by using examples from

We can launch the application by one of 3 ways

  • Run it directly in BBB and the app is shown on BBB too
  • ssh -X [email protected] from host machine and run the app from there. The GUI will be shown on the host machine.
  • ssh [email protected] from host machine. Issue export DISPLAY=:0.0 and run the app from there. The GUI is shown on BBB.

GPIO Projects

Use terminal to access GPIO pins

Google: beaglebone black gpio /sys/class/gpio

root@beaglebone:/sys/class/gpio# ls -l
total 0
--w------- 1 root root 4096 Dec 31  1999 export
lrwxrwxrwx 1 root root    0 Dec 31  1999 gpiochip0 -> ../../devices/virtual/gpio/gpiochip0
lrwxrwxrwx 1 root root    0 Dec 31  1999 gpiochip32 -> ../../devices/virtual/gpio/gpiochip32
lrwxrwxrwx 1 root root    0 Dec 31  1999 gpiochip64 -> ../../devices/virtual/gpio/gpiochip64
lrwxrwxrwx 1 root root    0 Dec 31  1999 gpiochip96 -> ../../devices/virtual/gpio/gpiochip96
--w------- 1 root root 4096 Dec 31  1999 unexport
root@beaglebone:/sys/class/gpio# echo 7 > export
root@beaglebone:/sys/class/gpio/gpio7# cat value
root@beaglebone:/sys/class/gpio/gpio7# cat direction
root@beaglebone:/sys/class/gpio/gpio7# echo low > direction
root@beaglebone:/sys/class/gpio/gpio7# cat direction
root@beaglebone:/sys/class/gpio/gpio7# echo high > direction

The LED lit up now. The 'value' is changed by the 'direction'.

/sys/class directory

debian@beaglebone:~$ cd /sys/class/
debian@beaglebone:/sys/class$ ls
arvo       graphics     lcd           pps          sound         usbmon
backlight  hidraw       leds          pwm          spidev        vc
bdi        hwmon        mbox          pyra         spi_master    video4linux
block      i2c-adapter  mdio_bus      rc           thermal       virtio-ports
bsg        i2c-dev      mem           regulator    timed_output  vtconsole
dma        input        misc          rtc          tty           watchdog
drm        isku         mmc_host      savu         ubi
dvb        kone         mtd           scsi_device  udc
firmware   koneplus     net           scsi_disk    uio
gpio       kovaplus     power_supply  scsi_host    usbmisc

GPIO interactive map It can toggle available pins (40), HDMI pins (20), emmc2 pins (10), I2C2 pins (2), power related pins (13).

Onboard LEDs

$ ls /sys/class/leds/
beaglebone:green:usr0  beaglebone:green:usr1  beaglebone:green:usr2  beaglebone:green:usr3
## 'trigger' determines what event is monitored
$ ls /sys/class/leds/beaglebone\:green\:usr0/
brightness  device  max_brightness  power  subsystem  trigger  uevent
$ cat /sys/class/leds/beaglebone\:green\:usr0/trigger
none nand-disk mmc0 mmc1 timer oneshot [heartbeat] backlight gpio cpu0 default-on transient

## stop the heart
# echo none > /sys/class/leds/beaglebone\:green\:usr0/trigger

## turn LED on (no blinking)
# echo none > /sys/class/leds/beaglebone\:green\:usr0/trigger
# echo 1 > /sys/class/leds/beaglebone\:green\:usr0/brightness

## strobe LED (get BeagleBone's heart racing at 20 'beats' per second)
# echo timer > /sys/class/leds/beaglebone\:green\:usr0/trigger
# echo 25 > /sys/class/leds/beaglebone\:green\:usr0/delay_off
# echo 25 > /sys/class/leds/beaglebone\:green\:usr0/delay_on

## *whew* ... restore default heartbeat
# echo heartbeat > /sys/class/leds/beaglebone\:green\:usr0/trigger

Use C/C++ to control LED

4D LCD Cape (480x272) monitor/display

It is a cool add-on for BBB. See official web site. The 4D 4.3” LCD CAPE features a 4.3” TFT LCD 480x272 resolution display. See also

Tip 1: PLA on LCD should connect to P8 on BBB and PLB on LCD should connect to P9 BBB.

Tip 2: To remove full path from terminal, edit ~/.bashrc to replace "\w" with "\W". See for example

Tip 3: More pixels does not always mean good; slower refresh. See the comment on Running OpenGL-based Games & Emulators on Adafruit PiTFT Displays.

Tip 4: Possible way to turn off the display: see this or this post using xset or vbetool.

Input Gesture by xstroke

The instruction for Raspberry Pi works on my Debian Wheezy. Unfortunately, it keeps freeze my BBB.


Web Camera

To use a USB web camera, it is better to have BBB connected to a physical monitor, keyboard and mouse. However, I figure out it is also fine to use ssh with -X option. Make sure we use root to log in.

ssh -X [email protected]
  1. Run sudo apt-get update and sudo apt-get install guvcview
  2. shutdown BBB. Connect the USB camera. Start the system.
  3. Make sure /dev/video0 exists. It this is the case, it means the USB camera is detected.
  4. Run guvcview command. It should open 2 windows. One is the video and the other one is the setting dialog.

The third way is to use vnc. On BBB, issue vncserver. On local computer, issue xtightvncviewer Once the desktop appears, open a root terminal window instead of a regular terminal window. Type guvcview.

Compare the speed, it is clear using ssh -X is much ideal than using vnc. When we use vnc, the video keeps refreshing.

When we use ssh -X with video resolution 432x240, the video is quite fast. At the default resolution 640x480, the video does not refresh and not as fast as using low resolution.


Error :: You must put some 'source' URIs in your sources.list

we shall nano /etc/apt/sources.list and un-comment the lines containing deb-src. However, it still does not work. That said, the step 0 is not working.

If I replace the first step by the sudo apt-get install opencv and continue from step 2 to the end, it works. But it takes several hours (3-4 hours).

Step 0: Check "natural" dependencies on Debian

As root:

aptitude build-dep libopencv-dev

Step 1: Remove compromised packages

As root:

aptitude purge libavcodec-dev libavformat-dev libswscale-dev
aptitude purge libx264-dev x264

Step 2: Install dependencies

As root:

aptitude install autoconf automake build-essential libass-dev libfreetype6-dev libgpac-dev \
                 libsdl1.2-dev libtheora-dev libtool libva-dev libvdpau-dev libvorbis-dev \
                 libx11-dev libxext-dev libxfixes-dev pkg-config texi2html zlib1g-dev
aptitude install yasm

Step 3: Install x264

As user:

mkdir ~/ffmpeg_sources
cd ~/ffmpeg_sources
tar xjvf last_x264.tar.bz2
cd x264-snapshot*
./configure --enable-shared --enable-pic

As root:

make install
ldconfig -v

Step 4: Install FFmpeg

As user:

cd ~/ffmpeg_sources
tar xjvf ffmpeg-snapshot.tar.bz2
cd ffmpeg
./configure --extra-libs="-ldl" --enable-gpl --enable-libass --enable-libfreetype \
            --enable-libtheora --enable-libvorbis --enable-libx264 --enable-nonfree \
            --enable-x11grab --enable-shared --enable-pic

As root:

make install
ldconfig -v

Step 5: Install OpenCV

As user:

mkdir ~/opencv_sources
cd ~/opencv_sources
cd opencv-2.4.9
mkdir release
cd release

As root:

make install
ldconfig -v

If we use aptitude install libopencv-dev command to install opencv, we only get v2.3.1 (too old).

Setting up an IO python library (GPIO, PWM, ADC, I2C, SPI, UART)

  • PWM: P8_13, P8_34, P8_36, P8_45, P8_46, P9_14, P9_21, P9_22, P9_29, P9_42. Eg. blink LED, fading LED, servo.
  • ADC (analog input): P9_33, P9_35, P9_36, P9_37, P9_38, P9_39, P9_40. Eg. measure light, ultrasonic sensor, accelerometer, joystick, Potentiometer.
  • I2C: P9_19, PI_20. Eg. temperature/pressure sensors.
  • SPI: P9_17, P9_18, P9_21, P9_22, P9_28, P9_29, P9_30, P9_31.
  • UART: 17 pins.

Adding a push button

Measure light My example:

import Adafruit_BBIO.ADC as ADC
import time
from time import localtime, strftime

sensor_pin = 'P9_40'


print time.asctime(time.localtime(time.time())), '\tReading\t\tVolts'

while True:
    reading =
    volts = reading * 1.800
    #print('%f\t%f' % (reading, volts))
    #print(strftime("%Y-%m-%d %H:%M:%S", localtime()))
    print time.asctime(time.localtime(time.time())), '\t%f\t%f' % (reading, volts)

which can be run (and the output was written to a file for logging)

sudo python > tmp.txt

If we want, we can follow the tutorial in here to have the light reading logged on the COMS or send to google docs like [1]. Alternatively, we can let BBB to send an email to you like here.

Blinking an LED

Do not use a lower value resistor than 470Ω (R=V/I = 3.3/.008 where .008 means 8mA). The outputs can only provide about 4mA and the resistor prevents too much current flowing and potentially damaging the BBB.

But on another project (fading rgb LED), it mentioned you can use 220Ω to 1KΩ resistors.

Note that we have to run sudo su before we work on python program for any gpio project.

To install the Adafruit_BBIO python library in Debian, use the following. See

sudo ntpdate
sudo apt-get update
sudo apt-get install build-essential python-dev python-pip -y
#easy_install -U distribute  //debian only
sudo pip install Adafruit_BBIO

The python example to blink LED is

import Adafruit_BBIO.GPIO as GPIO
import time

GPIO.setup("P8_10", GPIO.OUT)

while True:
    GPIO.output("P8_10", GPIO.HIGH)
    GPIO.output("P8_10", GPIO.LOW)

Fading a RGB LED using PWM

Note that we don't have to use RGB led. We can just connect a single color led. But to use PWM, we cannot choose any pin we want. For example, p8_10 won't work. Below is a simplified example. Save it as and run it with sudo python

import Adafruit_BBIO.PWM as PWM
import time
red = "P8_13"
PWM.start(red, 0)
def fade(colorA):
    for i in range(0, 100):
	    PWM.set_duty_cycle(colorA, 100-i)
for j in range(10):

The led will fading using the above code. If we change line 7 to

            PWM.set_duty_cycle(colorA, i)

the LED will grow. If we change line 9 to while True:, the process will continue until we hit Ctrl+C.

The duty cycle is the reverse of what you might expect: if you have an LED plugged in, a duty cycle of 0 will be brightest, 100 will be dimmest.

PWM pins

BBB has 8 PWM channels. Each channel has 1 or 2 pins. See


P9 P8
14,16,21,22,28,29,31,42 13,19,34,36,45,46


  1. Period: inverse of frequency
  2. Frequency: Eg period=1000 mS is about freq 1kHz while period=10 mS is about 100 kHz. If we push the frequency too high, a transient noise on the signals would be observed on the waveforms.
  3. Duty cycle: the unit is 0 to 1=(100%). What percent of time the signal is in high level.

Controlling a servo motor (PWM)

We can actually try the following simpler approach using bonescript without bothering a command line. Just open a browser tab and type the address It just works (Angstrom Distribution, running using Bonescript from web)! Make sure to change P9_14 to whatever (eg P8_13) as needed.

The SG90 micro motor operators at 4.0 to 7.2 volts according to here although it works when I plug the power to A9 3.3V pin.

For some reason, the Adafruit python code does not work. The servo has a vibration but not turn. Not sure what needs to be changed.

I found we can control the servo using command line. See the post. Note that for my current Angstrom, I need to use pwm_test_P8_13.15. Also this folder is created only after I run the Bonescript. So the example code is (the pwm_test_P8_13.16 number may change from each run ??)

// On my BBB, polarity is inverted by default
echo 0 > /sys/devices/ocp.2/pwm_test_P8_13.16/polarity

echo 20000000 > /sys/devices/ocp.2/pwm_test_P8_13.16/period 
echo 500000 > /sys/devices/ocp.2/pwm_test_P8_13.16/duty
echo 1 > /sys/devices/ocp.2/pwm_test_P8_13.16/run 

Valid pulse width for "Tower Pro sg90" is 500-2400 µs, so valid values for "duty" are 500000-2400000.

The contents of the directory look like

root@beaglebone:~# ls -lh /sys/devices/ocp.2/pwm_test_P8_13.14/
driver	duty  modalias	period	polarity  power  run  subsystem  uevent

A summary of tutorial is on It is obtained from google: /sys/devices/ocp.2/pwm. As we can see, once the command line works, it is easy to wrap the code in other languages (python, c, et al). The full instruction is

echo am33xx_pwm > /sys/devices/bone_capemgr.8/slots
echo bone_pwm_P8_13 > /sys/devices/bone_capemgr.8/slots
echo 20000000 > /sys/devices/ocp.2/pwm_test_P8_13.14/period 
echo 0 > /sys/devices/ocp.2/pwm_test_P8_13.14/polarity     # seems necessary
echo 2400000 > /sys/devices/ocp.2/pwm_test_P8_13.14/duty   # counter-clockwise
echo 500000 > /sys/devices/ocp.2/pwm_test_P8_13.14/duty    # clockwise 180 degrees
echo 1 > /sys/devices/ocp.2/pwm_test_P8_13.14/run          # start the fun
echo 0 > /sys/devices/ocp.2/pwm_test_P8_13.14/run          # stop the fun

I found this approach works on both Angstrom and Debian.


Controlling stepper motor

Stepper Motor Driver Board ULN2003

H-bridge L293D

Controlling a Motor with an H-Bridge and the BeagleBone Black

See also Arduino Control DC motors page.

Measuring temperature

HC-SR04 (5v) sonar sensor

Connect to 5v device

See 3.2.4 of the book "Bad to the Bone".

Input voltage & voltage divider

PIR motion sensor (ADC)

Pull-up Resistor

A very simple robot


Project from Make

Other applications

How to make a BeagleBoard Elastic R Beowulf Cluster in a Briefcase


Create wireless access point

Unfortunately I got the following error when I followed the instruction from adafruit.

debian@beaglebone:~$ sudo service isc-dhcp-server start
[....] Starting isc-dhcp-server (via systemctl): isc-dhcp-server.serviceJob failed. See system journal and 'systemctl status' for details.

Note that after several tries, it works. Some comments

  • isc-dhcp-server is not necessary. Use dnsmasq instead. In Tiddlybot it uses udhcpd as a DHCP server. See creating hotspot and Tiddlybot.
  • For hostapda.conf configuration file, I use driver=nl80211 for TP-LINK TL-WN72N adapter (lsusb command shows the usb adapter is Atheros Communications, Inc. AR9271 802.11n. We can also use dmesg | grep ath9k_htc to check. Finally airmon-ng can show the driver). The wpa_passphrase has to be at least 8 characters. There are some discussions about driver selection.
  • For some unknown reason, wlan0 static ip is not working. I need to run sudo service networking restart. Also the 1st line to wlan0 is auto wlan0, not allow-hotplug wlan0.
  • Use sudo service --status-all to make sure hostapd and dnsmasq services are working (+ sign)
  • Need to make sure the BBB can forward traffic through ethernet. See the section 'Configure Network Address Translation' from Adafruit website. The trick to auto run the 3 commands does not work??
  • Finally, even though hostapd seems to be running, we need to issue the command sudo /usr/sbin/hostapd /etc/hostapd/hostapd.conf to make wifi access point available (ps: it is fine to ignore the message Failed to update rate sets in kernel module). Now everything should work.

Beaglebone Black wifi access point (AP)