In-depth instruction and practical techniques for building with the BeagleBone embedded Linux platform
Exploring BeagleBone is a hands-on guide to bringing gadgets, gizmos, and robots to life using the popular BeagleBone embedded Linux platform. Comprehensive content and deep detail provide more than just a BeagleBone instruction manual-you'll also learn the underlying engineering techniques that will allow you to create your own projects. The book begins with a foundational primer on essential skills, and then gradually moves into communication, control, and advanced applications using C/C++, allowing you to learn at your own pace. In addition, the book's companion website features instructional videos, source code, discussion forums, and more, to ensure that you have everything you need.
The BeagleBone's small size, high performance, low cost, and extreme adaptability have made it a favorite development platform, and the Linux software base allows for complex yet flexible functionality. The BeagleBone has applications in smart buildings, robot control, environmental sensing, to name a few; and, expansion boards and peripherals dramatically increase the possibilities. Exploring BeagleBone provides a reader-friendly  guide to the device, including a crash course in computer engineering. While following step by step, you can:
- Get up to speed on embedded Linux, electronics, and programming
- Master interfacing electronic circuits, buses and modules, with practical examples
- Explore the Internet-connected BeagleBone and the BeagleBone with a display
- Apply the BeagleBone to sensing applications, including video and sound
- Explore the BeagleBone's Programmable Real-Time Controllers
- Updated to cover the latest Beagle boards, Linux kernel versions, and Linux software releases.
- Includes new content on Linux kernel development, the Linux Remote Processor Framework, CAN bus, IoT frameworks, and much more!
Hands-on learning helps ensure that your new skills stay with you, allowing you to design with electronics, modules, or peripherals even beyond the BeagleBone. Insightful guidance and online peer support help you transition from beginner to expert as you master the techniques presented in Exploring BeagleBone, the practical handbook for the popular computing platform.
Table of Contents
Introduction xxix
Part I Beagle Board Basics 1
Chapter 1 The Beagle Hardware Platform 3
Introduction to the Boards 3
Who Should Use the Beagle Platform 6
When to Use Beagle Boards 7
When Should You Not Use the Beagle Boards 7
BeagleBone Documentation 8
The Beagle Hardware 10
BeagleBone Versions 10
The Beagle Hardware 12
Beagle Accessories 19
Highly Recommended Accessories 19
Headers for the PocketBeagle 20
Micro-SD Card (for Booting or Flashing eMMCs) 20
External 5V Power Supply (for Peripherals) 22
Ethernet Cable (for Wired BBB Network Connection) 22
HDMI Cable (for Connection to Monitors/Televisions) 22
USB to Serial UART TTL 3.3 (for Finding Problems) 23
Optional Accessories 24
USB Hub (to Connect Several USB Devices to a USB Host) 25
Micro-HDMI to VGA Adapters (for VGA Video and Sound) 25
Wi-Fi Adapters (for Wireless Networking) 25
USB Webcam (for Capturing Images and Streaming Video) 25
USB Keyboard and Mouse (for General-Purpose Computing) 26
Capes 26
How to Destroy Your Board! 27
Summary 29
Support 29
Chapter 2 Beagle Software 31
Linux on the Beagle Boards 32
Linux Distributions for Beagle Boards 32
Create a Linux Micro-SD Card Image 33
Communicating with the Boards 34
Installing Drivers 34
Wired Network Connections 35
Internet-over-USB (All Boards) 36
Regular Ethernet (BBB and BeagleBoard Only) 39
Ethernet Crossover Cable (BBB and BeagleBoard Only) 40
Communicating with Your Board 42
Serial Connection over USB 42
Serial Connection with the USB-to-TTL 3.3 V Cable 43
Connecting Through Secure Shell 44
Secure Shell Connections Using Putty 45
Chrome Apps: Secure Shell Client 45
Transferring Files Using Putty/psftp over SSH 46
Controlling the Beagle Board 48
Basic Linux Commands 48
First Steps 49
Basic File System Commands 50
Environment Variables 52
Basic File Editing 53
What Time Is It? 54
Package Management 56
Beagle-Specific Commands 58
Expand the File System on an SD Card 59
Update the Kernel 60
Interacting with the On-Board LEDs 61
Shutdown 63
Node.js, Cloud9, and BoneScript 64
Introduction to Node.js 64
Introduction to the Cloud9 IDE 66
Introduction to BoneScript 67
Summary 69
Further Reading 69
Chapter 3 Exploring Embedded Linux Systems 71
Introducing Embedded Linux 72
Advantages and Disadvantages of Embedded Linux 73
Is Linux Open Source and Free? 74
Booting the Beagle Boards 74
Bootloaders 74
Kernel Space and User Space 83
The systemd System and Service Manager 85
Managing Linux Systems 90
The Superuser 90
System Administration 92
The Linux File System 92
Links to Files and Directories 94
Users and Groups 95
File System Permissions 98
The Linux Root Directory 102
Commands for File Systems 103
The Reliability of SD Card/eMMC File Systems 111
Linux Commands 113
Output and Input Redirection (>, >>, and <) 113
Pipes ( - and tee) 114
Filter Commands (from sort to xargs) 115
echo and cat 117
diff 118
tar 119
md5sum 120
Linux Processes 121
How to Control Linux Processes 121
Foreground and Background Processes 122
Other Linux Topics 124
Using Git for Version Control 124
A Practice-Based Introduction 126
Cloning a Repository (git clone) 126
Getting the Status (git status) 128
Adding to the Staging Area (git add) 128
Committing to the Local Repository (git commit) 129
Pushing to the Remote Repository (git push) 129
Git Branching 130
Creating a Branch (git branch) 130
Merging a Branch (git merge) 132
Deleting a Branch (git branch -d) 132
Common Git Commands 133
Desktop Virtualization 134
Code for This Book 135
Summary 136
Further Reading 136
Bibliography 137
Chapter 4 Interfacing Electronics 139
Analyzing Your Circuits 140
Digital Multimeter 140
Oscilloscopes 141
Basic Circuit Principles 143
Voltage, Current, Resistance, and Ohm’s Law 143
Voltage Division 145
Current Division 146
Implementing Circuits on a Breadboard 147
Digital Multimeters and Breadboards 149
Example Circuit: Voltage Regulation 150
Discrete Components 152
Diodes 152
Light-Emitting Diodes 153
Smoothing and Decoupling Capacitors 156
Transistors 158
Transistors as Switches 159
Field Effect Transistors as Switches 162
Optocouplers/Optoisolators 164
Switches and Buttons 166
Hysteresis 168
Logic Gates 169
Floating Inputs 173
Pull-Up and Pull-Down Resistors 173
Open-Collector and Open-Drain Outputs 174
Interconnecting Gates 175
Analog-to-Digital Conversion 177
Sampling Rate 177
Quantization 178
Operational Amplifi ers 178
Ideal Operational Amplifiers 178
Negative Feedback and Voltage Follower 181
Positive Feedback 181
Concluding Advice 182
Summary 182
Further Reading 183
Chapter 5 Practical Beagle Board Programming 185
Introduction 186
Performance of Different Languages 186
Setting the CPU Frequency 190
Scripting Languages 192
Scripting Language Options 192
Bash 193
Lua 196
Perl 197
Python 198
Dynamically Compiled Languages 201
JavaScript and Node.js on the Beagle boards 201
Java on the Beagle Boards 203
C and C++ on the Beagle Boards 207
C and C++ Language Overview 210
Compiling and Linking 211
Writing the Shortest C/C++ Program 213
Static and Dynamic Compilation 215
Variables and Operators in C/C++ 215
Pointers in C/C++ 219
C-Style Strings 221
LED Flashing Application in C 223
The C of C++ 224
First Example and Strings in C++ 225
Passing by Value, Pointer, and Reference 226
Flashing the LEDs Using C++ (non-OO) 227
Writing a Multicall Binary 228
Overview of Object-Oriented Programming 229
Classes and Objects 229
Encapsulation 230
Inheritance 231
Object-Oriented LED Flashing Code 233
Interfacing to the Linux OS 236
Glibc and Syscall 237
Improving the Performance of Python 239
Cython 239
Boost.Python 242
Summary 244
Further Reading 244
Bibliography 244
Part II Interfacing, Controlling, and Communicating 245
Chapter 6 Interfacing to the Beagle Board Input/Outputs 247
General-Purpose Input/Outputs 248
Introduction to GPIO Interfacing 248
GPIO Digital Output 250
GPIO Digital Input 255
GPIO Confi guration 257
Internal Pull-Up and Pull-Down Resistors 258
GPIO Pin Configuration Settings 258
Interfacing to Powered DC Circuits 265
C++ Control of GPIOs 267
The Linux Device Tree 271
Flattened Device Tree on the Beagle Boards 272
Modifying a Board Device Tree 276
Boot Confi guration Files 278
Analog Inputs and Outputs 280
Analog Inputs 280
Enabling the Analog Inputs 280
Analog Input Application - A Simple Light Meter 282
Analog Outputs (PWM) 285
Output Application - Controlling a Servo Motor 289
BoneScript 290
Digital Read and Write 290
Analog Read 292
Analog Write (PWM) 293
GPIO Performance 294
Advanced GPIO Topics 295
More C++ Programming 295
Callback Functions 295
POSIX Threads 297
Linux poll (sys/poll.h) 298
Enhanced GPIO Class 299
Using GPIOs without Using sudo 302
Root Permissions with setuid 304
Summary 306
Further Reading 306
Chapter 7 Cross-Compilation, Eclipse, and Building Linux 307
Setting Up a Cross-Compilation Toolchain 308
Cross-Compiling Under Debian 309
Testing the Toolchain 311
Emulating the armhf Architecture 312
Cross-Compilation with Third-Party Libraries (Multiarch) 314
Cross-Compilation Using Eclipse 315
Installing Eclipse on Desktop Linux 315
Confi guring Eclipse for Cross-Compilation 316
Remote System Explorer 318
Integrating GitHub into Eclipse 322
Remote Debugging 322
Automatic Documentation (Doxygen) 328
Adding Doxygen Editor Support in Eclipse 330
Cross-Building Linux 330
Downloading the Kernel Source 331
Building the Linux Kernel 332
Building a Poky Linux Distribution (Advanced) 335
Summary 340
Chapter 8 Interfacing to the Beagle Board Buses 341
Introduction to Bus Communication 342
I2C 343
I2C Hardware 343
I2C on the Beagle Boards 344
I2C Devices on the Beagle Boards 345
An I2C Test Circuit 346
A Real-Time Clock 346
The ADXL345 Accelerometer 347
Wiring the Test Circuit 348
Using Linux I2C-Tools 348
i2cdetect 348
i2cdump 349
i2cget 353
i2cset 354
I2C Communication in C 356
Wrapping I2C Devices with C++ Classes 358
SPI 360
SPI Hardware 361
SPI on the Beagle Boards 363
Testing an SPI Bus 363
A First SPI Application (74HC595) 365
Wiring the 74HC595 Circuit 366
SPI Communication Using C 367
Bidirectional SPI Communication in C/C++ 370
The ADXL345 SPI Interface 370
Connecting the ADXL345 to the Beagle Boards 372
Wrapping SPI Devices with C++ Classes 373
Three-Wire SPI Communication 375
Multiple SPI Slave Devices 376
UART 377
The Beagle Board UART 378
UART Examples in C 380
Beagle Board Serial Client 381
LED Serial Server 383
UART Applications: GPS 386
CAN Bus 388
Beagle Board CAN Bus 389
SocketCAN 390
A CAN Bus Test Circuit 392
Linux CAN-utils 393
A SocketCAN C Example 394
Logic-Level Translation 396
Summary 398
Further Reading 399
Chapter 9 Interacting with the Physical Environment 401
Interfacing to Actuators 402
DC Motors 403
Driving Small DC Motors (up to 1.5 A) 406
Controlling a DC Motor Using sysfs 407
Driving Larger DC Motors (Greater Than 1.5 A) 409
Controlling a DC Motor Using C++ 411
Stepper Motors 412
The EasyDriver Stepper Motor Driver 413
A Beagle Board Stepper Motor Driver Circuit 414
Controlling a Stepper Motor Using C++ 415
Relays 417
Interfacing to Analog Sensors 418
Protecting the ADC Inputs 420
Diode Clamping 421
Op-Amp Clamping 422
Analog Sensor Signal Conditioning 427
Scaling Using Voltage Division 427
Signal Offsetting and Scaling 428
Analog Interfacing Examples 431
Infrared Distance Sensing 431
ADXL335 Conditioning Example 436
Interfacing to Local Displays 438
MAX7219 Display Modules 438
Character LCD Modules 441
Building C/C++ Libraries 445
Makefi les 446
CMake 447
A Hello World Example 448
Building a C/C++ Library 449
Using a Shared (.so) or Static (.a) Library 452
Summary 453
Further Reading 454
Chapter 10 Real-Time Interfacing Using External Slave Processors 455
Real-Time Beagle Board 456
Real-Time Kernels 456
Real-Time Hardware Solutions 458
Extended GPIO Availability 458
The MCP23017 and the I2C Bus 460
Controlling the GPIO LED Circuit 461
Reading the GPIO Button State 462
An Interrupt Configuration Example (Advanced) 463
The MCP23S17 and the SPI Bus 464
A C++ Class for the MCP23x17 Devices 465
Adding External UARTs 468
The Arduino 471
An Arduino Serial Slave 474
A UART Echo Test Example 475
UART Command Control of an Arduino 478
An Arduino I2C Slave 481
An I2C Test Circuit 481
I2C Register Echo Example 482
I2C Temperature Sensor Example 484
I2C Temperature Sensor with a Warning LED 486
Arduino Slave Communication Using C/C++ 488
An I2C Ultrasonic Sensor Application 490
Summary 493
Further Reading 493
Part III Advanced Beagle Board Systems 495
Chapter 11 The Internet of Things 497
The Internet of Things 498
A Beagle Board IoT Sensor 499
The Beagle Board as a Sensor Web Server 501
Installing and Configuring a Web Server 502
Configuring the Apache Web Server 503
Creating Web Pages and Web Scripts 503
PHP on the Beagle Board 506
GNU Cgicc Applications (Advanced) 508
Replacing Bone101 with Apache 511
A C/C++ Web Client 512
Network Communications Primer 513
A C/C++ Web Client 514
Secure Communication Using Open SSL 516
A Beagle Board as a “Thing” 518
Thing Speak 518
The Linux Cron Scheduler 521
System crontab 521
User crontab 523
Sending E-mail from the Beagle Board 524
If This Then That 526
IoT Frameworks 528
MQ Telemetry Transport 529
MQTT Server/Broker 531
MQTT Publisher/Subscriber on a Beagle Board 533
The mqtt-spy Debug Tool 534
Writing MQTT Code 535
A Paho MQTT Publisher Example 535
A Paho MQTT Subscriber Example 537
Adafuit IO 539
Configuring the Adafruit IO Account 540
Connecting to Adafruit IO with MQTT 542
An MQTT Node.js Publish Example 543
The C++ Client/Server 545
IoT Device Management 548
Remote Monitoring of a Beagle Board 548
Beagle Board Watchdog Timers 549
Static IP Addresses 551
Power over Ethernet 551
PoE Power Extraction Modules (Advanced Topic) 553
Summary 554
Chapter 12 Wireless Communication and Control 555
Introduction to Wireless Communications 556
Bluetooth Communications 557
Installing a Bluetooth Adapter 558
Checking the LKM 559
Configuring a Bluetooth Adapter 560
Making the Beagle Board Discoverable 561
Android App Development with Bluetooth 563
Wi-Fi Communications 564
Installing a Wi-Fi Adapter 564
The NodeMCU Wi-Fi Slave Processor 568
Flashing with the Latest Firmware 569
Connecting the NodeMCU to Wi-Fi 570
Programming the NodeMCU 571
The NodeMCU Web Server Interface 574
JSON 575
The NodeMCU and MQTT 577
ZigBee Communications 579
Introduction to XBee Devices 579
AT versus API Mode 581
XBee Confi guration 582
XCTU 582
Configuring an XBee Network Using XCTU 583
An XBee AT Mode Example 584
Setting Up the Arduino XBee Device (XBeeA) 584
Setting Up the PocketBeagle XBee Device (XBeePB) 586
An XBee API Mode Example 589
Setting Up the PocketBeagle XBee Device (XBee1) 589
Setting Up the Stand-Alone XBee Device (XBee2) 589
XBee API Mode and Node.js 590
XBee and C/C++ 592
Near Field Communication 593
Summary 596
Chapter 13 Beagle Board with a Rich User Interface 599
Rich UI Beagle Board Architectures 600
Beagle Boards as General-Purpose Computers 601
Connecting a Bluetooth Input Peripheral 603
BeagleBone with a LCD Touchscreen Cape 604
Virtual Network Computing 605
VNC Using VNC Viewer 605
VNC with Xming and PuTTY 606
VNC with a Linux Desktop Computer 607
Fat-Client Applications 608
Rich UI Application Development 608
Introduction to GTK+ on the Beagle Boards 609
The “Hello World” GTK+ Application 609
The Event-Driven Programming Model 610
The GTK+ Temperature Application 611
Introduction to Qt for the Beagle Board 612
Installing Qt Development Tools 613
The “Hello World” Qt Application 613
Qt Primer 615
Qt Concepts 615
The QObject Class 617
Signals and Slots 617
Qt Development Tools 618
A First Qt Creator Example 620
A Qt Temperature Sensor GUI Application 621
Remote UI Application Development 625
Fat-Client Qt GUI Application 626
Multithreaded Server Applications 629
A Multithreaded Temperature Service 632
Parsing Stream Data 634
The Fat Client as a Server 635
Parsing Stream Data with XML 638
The Beagle Board Client Application 639
Summary 641
Further Reading 641
Chapter 14 Images, Video, and Audio 643
Capturing Images and Video 644
USB Webcams 644
Video4Linux2 (V4L2) 646
Image Capture Utility 647
Video4Linux2 Utilities 648
Writing Video4Linux2 Programs 650
Streaming Video 652
Image Processing and Computer Vision 654
Image Processing with Open CV 654
Computer Vision with Open CV 656
Boost 659
BeagleBone Audio 660
Core Audio Software Tools 661
Audio Devices for the Beagle Boards 661
HDMI and USB Audio Playback Devices 661
Internet Radio Playback 664
Recording Audio 664
Audio Network Streaming 666
Bluetooth A2DP Audio 666
Text-to-Speech 669
Summary 670
Further Reading 670
Chapter 15 Real-Time Interfacing with the PRU-ICSS 673
The PRU-ICSS 674
The PRU-ICSS Architecture 674
The Remote Processor Framework 675
Important Documents 676
Development Tools for the PRU-ICSS 676
The PRU Code Generation Tools 677
The PRU Debugger 677
Using the AM335x PRU-ICSS 679
Setting Up the Board for Remoteproc 679
Testing Remoteproc under Linux 680
A First PRU Example 683
PRU-ICSS Enhanced GPIOs 683
A First PRU Program 686
A First PRU Program in C 686
A First PRU Program in Assembly 688
The PRU-ICSS in Detail 691
Registers 691
Local and Global Memory 692
PRU Assembly Instruction Set 696
PRU-ICSS Applications 698
PRU-ICSS Performance Tests 698
Utilizing Regular Linux GPIOs 702
A PRU PWM Generator 704
A PRU Sine Wave Generator 708
An Ultrasonic Sensor Application 709
Summary 714
Further Reading 714
Chapter 16 Embedded Kernel Programming 717
Introduction 718
Why Write Kernel Modules? 718
Loadable Kernel Module Basics 719
A First LKM Example 720
The LKM Make file 722
Building the LKM on a Beagle Board 723
Testing the First LKM Example 724
Testing the LKM Parameter 726
An Embedded LKM Example 727
Interrupt Service Routines 729
Performance 733
Enhanced Button GPIO Driver LKM 733
The object Interface 734
Enhanced LED GPIO Driver LKM 741
Kernel Threads 742
Conclusions 744
Summary 744
Index 745