In this In this article by Alexander Hiam, author of the book Learning BeagleBone Python Programming, we will go through the initial steps to get your BeagleBone Black set up. By the end of it, you should be ready to write your first Python program. We will cover the following topics:
- Logging in to your BeagleBone
- Connecting to the Internet
- Updating and installing software
- The basics of the PyBBIO and Adafruit_BBIO libraries
(For more resources related to this topic, see here.)
If you’ve never turned on your BeagleBone Black, there will be a bit of initial setup required. You should follow the most up-to-date official instructions found at http://beagleboard.org/getting-started, but to summarize, here are the steps:
- Install the network-over-USB drivers for your PC’s operating system.
- Plug in the USB cable between your PC and BeagleBone Black.
- Open Chrome or Firefox and navigate to http://192.168.7.2 (Internet Explorer is not fully supported and might not work properly).
If all goes well, you should see a message on the web page served up by the BeagleBone indicating that it has successfully connected to the USB network:
If you scroll down a little, you’ll see a runnable Bonescript example, as in the following screenshot:
Updating your Debian image
The GNU/Linux distributions for platforms such as the BeagleBone are typically provided as ISO images, which are single file copies of the flash memory with the distribution installed. BeagleBone images are flashed onto a microSD card that the BeagleBone can then boot from. It is important to update the Debian image on your BeagleBone to ensure that it has all the most up-to-date software and drivers, which can range from important security fixes to the latest and greatest features. First, grab the latest BeagleBone Black Debian image from http://beagleboard.org/latest-images. You should now have a .img.xz file, which is an ISO image with XZ compression.
Before the image can be flashed from a Windows PC, you’ll have to decompress it. Install 7-Zip (http://www.7-zip.org/), which will let you decompress the file from the context menu by right-clicking on it.
You can install Win32 Disk Imager (http://sourceforge.net/projects/win32diskimager/) to flash the decompressed .img file to your microSD card. Plug the microSD card you want your BeagleBone Black to boot from into your PC and launch Win32 Disk Imager. Select the drive letter associated with your microSD card; this process will erase the target device, so make sure the correct device is selected:
Next, press the browse button and select the decompressed .img file, then press Write:
The image burning process will take a few minutes. Once it is complete, you can eject the microSD card, insert it into the BeagleBone Black and boot it up. You can then return to http://192.168.7.2 to make sure the new image was flashed successfully and the BeagleBone is able to boot.
Connecting to your BeagleBone
If you’re running your BeagleBone with a monitor, keyboard, and mouse connected, you can use it like a standard desktop install of Debian. This book assumes you are running your BeagleBone headless (without a monitor). In that case, we will need a way to remotely connect to it.
The Cloud9 IDE
The BeagleBone Debian images include an instance of the Cloud9 IDE (https://c9.io) running on port 3000. To access it, simply navigate to your BeagleBone Black’s IP address with the port appended after a colon, that is, http://192.168.7.2:3000. If it’s your first time using Cloud9, you’ll see the welcome screen, which lets you customize the look and feel:
Another great use for the Bash terminal in Cloud9 is for running the Python interactive interpreter, which you can launch in the terminal by running python without any arguments:
If you’re a Linux user, or if you would prefer not to be doing your development through a web browser, you may want to use SSH to access your BeagleBone instead. SSH, or Secure Shell, is a protocol for securely gaining terminal access to a remote computer over a network. On Windows, you can download PuTTY from http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html, which can act as an SSH client.
Run PuTTY, make sure SSH is selected, and enter your BeagleBone’s IP address and the default SSH port of 22:
When you press Open, PuTTY will open an SSH connection to your BeagleBone and give you a terminal window (the first time you connect to your BeagleBone it will ask you if you trust the SSH key; press Yes). Enter root as the username and press Enter to log in; you will be dropped into a Bash terminal:
As in the Cloud9 IDE’s terminals, from here, you can use the Linux tools to move around the filesystem, create and edit files, and so on, and you can run the Python interactive interpreter to try out and debug Python code.
Connecting to the Internet
Your BeagleBone Black won’t be able to access the Internet with the default network-over-USB configuration, but there are a couple ways that you can connect your BeagleBone to the Internet.
The simplest option is to connect the BeagleBone to your network using an Ethernet cable between your BeagleBone and your router or a network switch. When the BeagleBone Black boots with an Ethernet connection, it will use DHCP to automatically request an IP address and register on your network.
Once you have your BeagleBone registered on your network, you’ll be able to log in to your router’s interface from your web browser (usually found at http://192.168.1.1 or http://192.168.2.1) and find out the IP address that was assigned to your BeagleBone. Refer to your router’s manual for more information. The current BeagleBone Black Debian images are configured to use the hostname beaglebone, so it should be pretty easy to find in your router’s client list. If you are using a network on which you have no way of accessing this information through the router, you could use a tool such as Fing (http://www.overlooksoft.com) for Android or iPhone to scan the network and list the IP addresses of every device on it.
Since this method results in your BeagleBone being assigned a new IP address, you’ll need to use the new address to access the Getting Started pages and the Cloud9 IDE.
If you don’t have access to an Ethernet connection, or it’s just more convenient to have your BeagleBone connected to your computer instead of your router, it is possible to forward your Internet connection to your BeagleBone over the USB network. On Windows, open your Network Connections window by navigating to it from the Control Panel or by opening the start menu, typing ncpa.cpl, and pressing Enter. Locate the Linux USB Ethernet network interface and take note of the name; in my case, its Local Area Network 4. This is the network interface used to connect to your BeagleBone:
First, right-click on the network interface that you are accessing the Internet through, in my case, Wireless Network Connection, and select Properties. On the Sharing tab, check Allow other network users to connect through this computer’s Internet connection, and select your BeagleBone’s network interface from the dropdown:
After pressing OK, Windows will assign the BeagleBone interface a static IP address, which will conflict with the static IP address of http://192.168.7.2 that the BeagleBone is configured to request on the USB network interface. To fix this, you’ll want to right-click the Linux USB Ethernet interface and select Properties, then highlight Internet Protocol Version 4 (TCP/IPv4) and click on Properties:
Select Obtain IP address automatically and click on OK;
Your Windows PC is now forwarding its Internet connection to the BeagleBone, but the BeagleBone is still not configured properly to access the Internet. The problem is that the BeagleBone’s IP routing table doesn’t include 192.168.7.1 as a gateway, so it doesn’t know the network path to the Internet. Access a Cloud9 or SSH terminal, and use the route tool to add the gateway, as shown in the following command:
# route add default gw 192.168.7.1
Your BeagleBone should now have Internet access, which you can test by pinging a website:
root@beaglebone:/var/lib/cloud9# ping -c 3 graycat.io PING graycat.io (188.8.131.52) 56(84) bytes of data. 64 bytes from 184.108.40.206.static.a2webhosting.com (220.127.116.11): icmp_req=1 ttl=55 time=45.6 ms 64 bytes from 18.104.22.168.static.a2webhosting.com (22.214.171.124): icmp_req=2 ttl=55 time=45.6 ms 64 bytes from 126.96.36.199.static.a2webhosting.com (188.8.131.52): icmp_req=3 ttl=55 time=46.0 ms --- graycat.io ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2002ms rtt min/avg/max/mdev = 45.641/45.785/46.035/0.248 ms
The IP routing will be reset at boot up, so if you reboot your BeagleBone, the Internet connection will stop working. This can be easily solved by using Cron, a Linux tool for scheduling the automatic running of commands. To add the correct gateway at boot, you’ll need to edit the crontab file with the following command:
# crontab e
This will open the crontab file in nano, which is a command line text editor. We can use the @reboot keyword to schedule the command to run after each reboot:
@reboot /sbin/route add default gw 192.168.7.1
Press Ctrl + X to exit nano, then press Y, and then Enter to save the file. Your forwarded Internet connection should now remain after rebooting.
Using the serial console
If you are unable to use a network connection to your BeagleBone Black; for instance, if your network is too slow for Cloud9 or you can’t find the BeagleBone’s IP address, there is still hope! The BeagleBone Black includes a 6-pin male connector; labeled J1, right next to the P9 expansion header (we’ll learn more about the P8 and P9 expansion headers soon!). You’ll need a USB to 3.3 V TTL serial converter, for example, from Adafruit http://www.adafruit.com/products/70 or Logic Supply http://www.logicsupply.com/components/beaglebone/accessories/ls-ttl3vt. You’ll need to download and install the FTDI virtual COM port driver for your operating system from http://www.ftdichip.com/Drivers/VCP.htm, then plug the connector into the J1 header such that the black wire lines up with the header’s pin 1 indicator, as shown in the following screenshot:
You can then use your favorite serial port terminal emulator, such as PuTTY or CoolTerm (http://freeware.the-meiers.org), and configure the serial port for a baud rate of 115200 with 1 stop bit and no parity. Once connected, press Enter and you should see a login prompt. Enter the user name root and you’ll drop into a Bash shell. If you only need the console connection to find your IP address, you can do so using the following command:
# ip addr
Updating your software
If this is the first time you’ve booted your BeagleBone Black, or if you’ve just flashed a new image, it’s best to start by ensuring your installed software packages are all up to date. You can do so using Debian’s apt package manager:
# apt-get update && apt-get upgrade
This process might take a few minutes.
Next, use the pip Python package manager to update to the latest versions of the PyBBIO and Adafruit_BBIO libraries:
# pip install --upgrade PyBBIO Adafruit_BBIO
As both libraries are currently in active development, it’s worth running this command from time to time to make sure you have all the latest features.
The PyBBIO library
The PyBBIO library was developed with Arduino users in mind. It emulates the structure of an Arduino (http://arduino.cc) program, as well as the Arduino API where appropriate. If you’ve never seen an Arduino program, it consists of a setup() function, which is called once when the program starts, and a loop() function, which is called repeatedly until the end of time (or until you turn off the Arduino). PyBBIO accomplishes a similar structure by defining a run() function that is passed two callable objects, one that is called once when the program starts, and another that is called repeatedly until the program stops. So the basic PyBBIO template looks like this:
from bbio import * def setup(): pinMode(GPIO1_16, OUTPUT) def loop(): digitalWrite(GPIO1_16, HIGH) delay(500) digitalWrite(GPIO1_16, LOW) delay(500) run(setup, loop)
The first line imports everything from the PyBBIO library (the Python package is installed with the name bbio). Then, two functions are defined, and they are passed to run(), which tells the PyBBIO loop to begin. In this example, setup() will be called once, which configures the GPIO pin GPIO1_16 as a digital output with the pinMode() function. Then, loop() will be called until the PyBBIO loop is stopped, with each digitalWrite() call setting the GPIO1_16 pin to either a high (on) or low (off) state, and each delay() call causing the program to sleep for 500 milliseconds. The loop can be stopped by either pressing Ctrl + C or calling the stop() function. Any other error raised in your program will be caught, allowing PyBBIO to run any necessary cleanup, then it will be reraised. Don’t worry if the program doesn’t make sense yet, we’ll learn about all that soon!
Not everyone wants to use the Arduino style loop, and it’s not always suitable depending on the program you’re writing. PyBBIO can also be used in a more Pythonic way, for example, the above program can be rewritten as follows:
import bbio bbio.pinMode(bbio.GPIO1_16, bbio.OUTPUT) while True: bbio.digitalWrite(bbio.GPIO1_16, bbio.HIGH) bbio.delay(500) bbio.digitalWrite(bbio.GPIO1_16, bbio.LOW) bbio.delay(500)
This still allows the bbio API to be used, but it is kept out of the global namespace.
The Adafruit_BBIO library
The Adafruit_BBIO library is structured differently than PyBBIO. While PyBBIO is structured such that, essentially, the entire API is accessed directly from the first level of the bbio package; Adafruit_BBIO instead has the package tree broken up by a peripheral subsystem. For instance, to use the GPIO API you have to import the GPIO package:
from Adafruit_BBIO import GPIO
Otherwise, to use the PWM API you would import the PWM package:
from Adafruit_BBIO import PWM
This structure follows a more standard Python library model, and can also save some space in your program’s memory because you’re only importing the parts you need (the difference is pretty minimal, but it is worth thinking about).
The same program shown above using PyBBIO could be rewritten to use Adafruit_BBIO:
from Adafruit_BBIO import GPIO import time GPIO.setup("GPIO1_16", GPIO.OUT) try: while True: GPIO.output("GPIO1_16", GPIO.HIGH) time.sleep(0.5) GPIO.output("GPIO1_16", GPIO.LOW) time.sleep(0.5) except KeyboardInterrupt: GPIO.cleanup()
Here the GPIO.setup() function is configuring the ping, and GPIO.output() is setting the state. Notice that we needed to import Python’s built-in time library to sleep, whereas in PyBBIO we used the built-in delay() function. We also needed to explicitly catch KeyboardInterrupt (the Ctrl + C signal) to make sure all the cleanup is run before the program exits, whereas this is done automatically by PyBBIO. Of course, this means that you have much more control about when things such as initialization and cleanup happen using Adafruit_BBIO, which can be very beneficial depending on your program. There are some trade-offs, and the library you use should be chosen based on which model is better suited for your application.
In this article, you learned how to login to the BeagleBone Black, get it connected to the Internet, and update and install the software we need. We also looked at the basic structure of programs using the PyBBIO and Adafruit_BBIO libraries, and talked about some of the advantages of each.
Resources for Article:
- Overview of Chips [article]
- Getting Started with Electronic Projects [article]
- Beagle Boards [article]