100% found this document useful (1 vote)
10 views

Java on the Raspberry Pi: Develop Java Programs to Control Devices for Robotics, IoT, and Beyond Flurry All Chapters Instant Download

The document promotes the ebook 'Java on the Raspberry Pi: Develop Java Programs to Control Devices for Robotics, IoT, and Beyond' by Greg Flurry, available for download on ebookmeta.com. It includes a variety of related digital products and provides detailed information about setting up and programming Raspberry Pi devices using Java. The ebook covers topics such as remote development, device support, and specific programming libraries.

Uploaded by

feliuhengly6
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (1 vote)
10 views

Java on the Raspberry Pi: Develop Java Programs to Control Devices for Robotics, IoT, and Beyond Flurry All Chapters Instant Download

The document promotes the ebook 'Java on the Raspberry Pi: Develop Java Programs to Control Devices for Robotics, IoT, and Beyond' by Greg Flurry, available for download on ebookmeta.com. It includes a variety of related digital products and provides detailed information about setting up and programming Raspberry Pi devices using Java. The ebook covers topics such as remote development, device support, and specific programming libraries.

Uploaded by

feliuhengly6
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 20

Get the full ebook with Bonus Features for a Better Reading Experience on ebookmeta.

com

Java on the Raspberry Pi: Develop Java Programs to


Control Devices for Robotics, IoT, and Beyond
Flurry

https://ebookmeta.com/product/java-on-the-raspberry-pi-
develop-java-programs-to-control-devices-for-robotics-iot-
and-beyond-flurry/

OR CLICK HERE

DOWLOAD NOW

Download more ebook instantly today at https://ebookmeta.com


Recommended digital products (PDF, EPUB, MOBI) that
you can download immediately if you are interested.

Real-Time IoT Imaging with Deep Neural Networks: Using


Java on the Raspberry Pi 4 1st Edition Nicolas Modrzyk

https://ebookmeta.com/product/real-time-iot-imaging-with-deep-neural-
networks-using-java-on-the-raspberry-pi-4-1st-edition-nicolas-modrzyk/

ebookmeta.com

Java: A Beginner's Guide: Create, Compile, and Run Java


Programs Today Herbert Schildt

https://ebookmeta.com/product/java-a-beginners-guide-create-compile-
and-run-java-programs-today-herbert-schildt/

ebookmeta.com

Raspberry Pi IoT In C 2nd Edition Harry Fairhead

https://ebookmeta.com/product/raspberry-pi-iot-in-c-2nd-edition-harry-
fairhead/

ebookmeta.com

Pediatric Hypertension 5th Joseph T Flynn Julie R


Ingelfinger Tammy M Brady Eds

https://ebookmeta.com/product/pediatric-hypertension-5th-joseph-t-
flynn-julie-r-ingelfinger-tammy-m-brady-eds/

ebookmeta.com
House of Music: Raising the Kanneh-Masons 1st Edition
Kadiatu Kanneh-Mason

https://ebookmeta.com/product/house-of-music-raising-the-kanneh-
masons-1st-edition-kadiatu-kanneh-mason/

ebookmeta.com

Wraparound Guide How to Gather Student Voice Build


Community a Wraparound Service Delivery Handbook for
Helping Students Overcome Barriers to Wellness and
Learning Partnerships and Cultivate Hope 1st Edition Leigh
https://ebookmeta.com/product/wraparound-guide-how-to-gather-student-
Colburn
voice-build-community-a-wraparound-service-delivery-handbook-for-
helping-students-overcome-barriers-to-wellness-and-learning-
partnerships-and-cultivate-hope-1st/
ebookmeta.com

Beautiful Monsters: Imagining the Classic in Musical Media


Michael Long

https://ebookmeta.com/product/beautiful-monsters-imagining-the-
classic-in-musical-media-michael-long/

ebookmeta.com

Thinking Through Images Narrative rhythm embodiment and


landscape in the Nordic Bronze Age Tilley Christopher

https://ebookmeta.com/product/thinking-through-images-narrative-
rhythm-embodiment-and-landscape-in-the-nordic-bronze-age-tilley-
christopher/
ebookmeta.com

Rigorous PBL by Design Three Shifts for Developing


Confident and Competent Learners 1st Edition Michael
Mcdowell
https://ebookmeta.com/product/rigorous-pbl-by-design-three-shifts-for-
developing-confident-and-competent-learners-1st-edition-michael-
mcdowell/
ebookmeta.com
Meredith The Guardians Trust 4 1st Edition Beth Linton

https://ebookmeta.com/product/meredith-the-guardians-trust-4-1st-
edition-beth-linton/

ebookmeta.com
TECHNOLOGY IN AC TION™

Java on the
Raspberry Pi
Develop Java Programs to
Control Devices for Robotics,
IoT, and Beyond

Greg Flurry
Java on the
Raspberry Pi
Develop Java Programs
to Control Devices for
Robotics, IoT, and Beyond

Greg Flurry
Java on the Raspberry Pi: Develop Java Programs to Control Devices for
Robotics, IoT, and Beyond

Greg Flurry
Austin, TX, USA

ISBN-13 (pbk): 978-1-4842-7263-3 ISBN-13 (electronic): 978-1-4842-7264-0


https://doi.org/10.1007/978-1-4842-7264-0

Copyright © 2021 by Greg Flurry


This work is subject to copyright. All rights are reserved by the Publisher, whether the whole or
part of the material is concerned, specifically the rights of translation, reprinting, reuse of
illustrations, recitation, broadcasting, reproduction on microfilms or in any other physical way,
and transmission or information storage and retrieval, electronic adaptation, computer software,
or by similar or dissimilar methodology now known or hereafter developed.
Trademarked names, logos, and images may appear in this book. Rather than use a trademark
symbol with every occurrence of a trademarked name, logo, or image we use the names, logos,
and images only in an editorial fashion and to the benefit of the trademark owner, with no
intention of infringement of the trademark.
The use in this publication of trade names, trademarks, service marks, and similar terms, even if
they are not identified as such, is not to be taken as an expression of opinion as to whether or not
they are subject to proprietary rights.
While the advice and information in this book are believed to be true and accurate at the date of
publication, neither the authors nor the editors nor the publisher can accept any legal
responsibility for any errors or omissions that may be made. The publisher makes no warranty,
express or implied, with respect to the material contained herein.
Managing Director, Apress Media LLC: Welmoed Spahr
Acquisitions Editor: Aaron Black
Development Editor: James Markham
Coordinating Editor: Jessica Vakili
Distributed to the book trade worldwide by Springer Science+Business Media New York, 1 NY
Plaza, New York, NY 10014. Phone 1-800-SPRINGER, fax (201) 348-4505, e-mail orders-ny@
springer-sbm.com, or visit www.springeronline.com. Apress Media, LLC is a California LLC and
the sole member (owner) is Springer Science + Business Media Finance Inc (SSBM Finance Inc).
SSBM Finance Inc is a Delaware corporation.
For information on translations, please e-mail [email protected]; for
reprint, paperback, or audio rights, please e-mail [email protected].
Apress titles may be purchased in bulk for academic, corporate, or promotional use. eBook
versions and licenses are also available for most titles. For more information, reference our Print
and eBook Bulk Sales web page at http://www.apress.com/bulk-sales.
Any source code or other supplementary material referenced by the author in this book is available
to readers on GitHub via the book’s product page, located at www.apress.com/978-­1-­4842-­7263-­3.
For more detailed information, please visit http://www.apress.com/source-­code.
Printed on acid-free paper
To my wonderful wife Sylvia, who endured many months of
a distracted husband who talked about “the book”
whenever he considered it acceptable.
Table of Contents
About the Author������������������������������������������������������������������������������xvii

About the Technical Reviewer�����������������������������������������������������������xix


Acknowledgments�����������������������������������������������������������������������������xxi

Chapter 1: Motivations�������������������������������������������������������������������������1
Why the Raspberry Pi?������������������������������������������������������������������������������������������2
The “Best” Raspberry Pi for Robotics��������������������������������������������������������������4
The “Best” Raspberry Pi for IoT�����������������������������������������������������������������������6
Why Java?�������������������������������������������������������������������������������������������������������������6
Programmer Productivity���������������������������������������������������������������������������������7
Performance��������������������������������������������������������������������������������������������������13
Industry Acceptance��������������������������������������������������������������������������������������13
The Verdict�����������������������������������������������������������������������������������������������������14
Why Remote Development Using NetBeans?������������������������������������������������������15
Why NetBeans?���������������������������������������������������������������������������������������������18
Summary������������������������������������������������������������������������������������������������������������19

Chapter 2: Raspberry Pi 3 Model B+ Setup����������������������������������������21


Setup Considerations������������������������������������������������������������������������������������������21
Choose the Operating System�����������������������������������������������������������������������������22
Load Raspberry Pi OS on the microSD Card�������������������������������������������������������23
Get Raspberry Pi OS��������������������������������������������������������������������������������������23
Image Raspberry Pi OS����������������������������������������������������������������������������������24

v
Table of Contents

Boot and Configure Raspberry Pi OS������������������������������������������������������������������31


Initial Configuration���������������������������������������������������������������������������������������31
Configure Remote Computing�����������������������������������������������������������������������39
Configure the Interface Capabilities��������������������������������������������������������������40
Install Java on Raspberry Pi OS��������������������������������������������������������������������������43
What Java to Install?�������������������������������������������������������������������������������������44
Check for Prior Java Installations������������������������������������������������������������������44
Install the JDK 11������������������������������������������������������������������������������������������46
Finish Java Installation����������������������������������������������������������������������������������46
Finish Pi3 Setup��������������������������������������������������������������������������������������������������47
Summary������������������������������������������������������������������������������������������������������������48

Chapter 3: Raspberry Pi Zero W Setup�����������������������������������������������49


Setup Considerations������������������������������������������������������������������������������������������49
Choose the Operating System�����������������������������������������������������������������������������50
Load Raspberry Pi OS on the microSD Card�������������������������������������������������������50
Write Raspberry Pi OS�����������������������������������������������������������������������������������50
Finish the Bootable microSD Card����������������������������������������������������������������������54
Boot and Configure Raspberry Pi OS������������������������������������������������������������������56
Find the IP Address����������������������������������������������������������������������������������������56
Connect to the Zero���������������������������������������������������������������������������������������57
Update and Upgrade Raspberry Pi OS�����������������������������������������������������������58
Additional Configuration��������������������������������������������������������������������������������58
Configure the Interface Capabilities��������������������������������������������������������������64
Install Java on Raspberry Pi OS��������������������������������������������������������������������������66
What Java to Install?�������������������������������������������������������������������������������������66
Check for Prior Java Installations������������������������������������������������������������������67
Install the JDK 11������������������������������������������������������������������������������������������67
Summary������������������������������������������������������������������������������������������������������������70

vi
Table of Contents

Chapter 4: Set Up the Workstation�����������������������������������������������������71


Remote Computing with SSH������������������������������������������������������������������������������71
Remote Computing with VNC������������������������������������������������������������������������������73
Start the VNC Server��������������������������������������������������������������������������������������73
Get and Start the VNC Viewer������������������������������������������������������������������������74
Tune the VNC Server��������������������������������������������������������������������������������������77
Summary������������������������������������������������������������������������������������������������������������81

Chapter 5: Remote Java Development with NetBeans�����������������������83


Choose NetBeans and Java Versions������������������������������������������������������������������83
Install Java 11�����������������������������������������������������������������������������������������������������84
Install NetBeans 12.0������������������������������������������������������������������������������������������87
Test the NetBeans Installation����������������������������������������������������������������������������90
Configure the Raspberry Pi As a Remote Platform���������������������������������������������95
Test Remote Development��������������������������������������������������������������������������������100
Debug Remotely������������������������������������������������������������������������������������������������102
Fix Remote Debug���������������������������������������������������������������������������������������102
Successful Debug����������������������������������������������������������������������������������������103
Examine Variables While Debugging�����������������������������������������������������������104
The Debugger Menu������������������������������������������������������������������������������������105
Run on the Raspberry Pi Without NetBeans������������������������������������������������������106
Leverage NetBeans in Complex Projects����������������������������������������������������������108
Create and Test Libraries�����������������������������������������������������������������������������109
Use Libraries������������������������������������������������������������������������������������������������113
Choose Which Program to Run from NetBeans�������������������������������������������������117
Run the Chosen Program on the Raspberry Pi Without NetBeans��������������������118
Just Download with NetBeans��������������������������������������������������������������������������119
Summary����������������������������������������������������������������������������������������������������������121

vii
Table of Contents

Chapter 6: Device Support in Java���������������������������������������������������123


Find Base I/O Libraries for Java������������������������������������������������������������������������124
Select the Best Base I/O Library�����������������������������������������������������������������������125
Functional Coverage������������������������������������������������������������������������������������125
Performance������������������������������������������������������������������������������������������������125
Support��������������������������������������������������������������������������������������������������������126
Ease of Use��������������������������������������������������������������������������������������������������127
The Base I/O Choice for This Book��������������������������������������������������������������������128
A Look at pigpioj������������������������������������������������������������������������������������������129
A Look at diozero�����������������������������������������������������������������������������������������130
Evaluating the Choices��������������������������������������������������������������������������������132
The Final Choice – diozero��������������������������������������������������������������������������134
Configure diozero in NetBeans�������������������������������������������������������������������������135
Find (and Port) Device Libraries������������������������������������������������������������������������141
Java Device Library and diozero Base I/O���������������������������������������������������143
Java Device Library and Non-diozero Base I/O�������������������������������������������143
C/C++ Device Library����������������������������������������������������������������������������������144
Python Device Library����������������������������������������������������������������������������������145
No Device Library����������������������������������������������������������������������������������������146
Summary����������������������������������������������������������������������������������������������������������146

Chapter 7: The diozero Base I/O API�������������������������������������������������149


diozero Utilities�������������������������������������������������������������������������������������������������149
Connect Devices to a Raspberry Pi�������������������������������������������������������������������150
diozero SerialDevice�����������������������������������������������������������������������������������������153
Background on Raspberry Pi Serial I/O�������������������������������������������������������153
Constructors������������������������������������������������������������������������������������������������155
Read and Write Methods�����������������������������������������������������������������������������156
Support for Device Identity��������������������������������������������������������������������������157

viii
Table of Contents

diozero I2CDevice���������������������������������������������������������������������������������������������164
Background on Raspberry Pi I2C�����������������������������������������������������������������164
Constructors������������������������������������������������������������������������������������������������167
Read and Write Methods�����������������������������������������������������������������������������168
diozero SpiDevice���������������������������������������������������������������������������������������������170
Background on Raspberry Pi SPI�����������������������������������������������������������������170
Constructors������������������������������������������������������������������������������������������������171
Read and Write Methods�����������������������������������������������������������������������������172
GPIO������������������������������������������������������������������������������������������������������������������173
Background on Raspberry Pi GPIO��������������������������������������������������������������174
diozero GPIO Classes�����������������������������������������������������������������������������������177
Device Library and Application Structure����������������������������������������������������������182
RuntimeIOException������������������������������������������������������������������������������������183
Safety Nets��������������������������������������������������������������������������������������������������184
Safety Net Guidelines����������������������������������������������������������������������������������188
Summary����������������������������������������������������������������������������������������������������������190

Chapter 8: A DC Motor Controller�����������������������������������������������������191


Choose the Device��������������������������������������������������������������������������������������������192
Understand the Device��������������������������������������������������������������������������������������193
Find a Device Library����������������������������������������������������������������������������������������195
Search for Java Libraries�����������������������������������������������������������������������������195
Search for Non-Java Libraries���������������������������������������������������������������������196
And the Answer Is …����������������������������������������������������������������������������������201
Porting Issues���������������������������������������������������������������������������������������������������202
Device Library Interface������������������������������������������������������������������������������202
Device Instances�����������������������������������������������������������������������������������������205
Verbatim vs. Cleansing Port������������������������������������������������������������������������206
Porting Approach�����������������������������������������������������������������������������������������207

ix
Table of Contents

Play with the Device�����������������������������������������������������������������������������������������208


Device Library Development�����������������������������������������������������������������������������209
RoboClaw Class�������������������������������������������������������������������������������������������212
Constructor Analysis and Implementation���������������������������������������������������214
Mid-level Methods Analysis�������������������������������������������������������������������������218
CRC-Related Methods���������������������������������������������������������������������������������218
Low-Level Methods Analysis�����������������������������������������������������������������������220
Mid-level Methods Implementation�������������������������������������������������������������220
Finish the Core��������������������������������������������������������������������������������������������224
Test the Core������������������������������������������������������������������������������������������������226
Complete the Implementation���������������������������������������������������������������������235
Summary����������������������������������������������������������������������������������������������������������246

Chapter 9: An Inertial Measurement Unit�����������������������������������������249


Understand the Device��������������������������������������������������������������������������������������250
Find a Device Library����������������������������������������������������������������������������������������252
A Search for Java Libraries�������������������������������������������������������������������������252
A Search for Non-Java Libraries�����������������������������������������������������������������������254
A Look at the C++ Libraries������������������������������������������������������������������������254
A Look at the C Libraries�����������������������������������������������������������������������������255
And the Answer Is …����������������������������������������������������������������������������������255
Device Library Port��������������������������������������������������������������������������������������������256
Play with the Device (FXAS21002C)������������������������������������������������������������������257
Device Library Development (FXAS21002C)�����������������������������������������������������259
Constructor Analysis and Implementation���������������������������������������������������260
Configuration�����������������������������������������������������������������������������������������������265
Read a Sample��������������������������������������������������������������������������������������������268
Test the Core������������������������������������������������������������������������������������������������271

x
Table of Contents

Additional Thoughts�������������������������������������������������������������������������������������276
Address Zero Offset and Noise��������������������������������������������������������������������291
Get Real�������������������������������������������������������������������������������������������������������302
What Next?��������������������������������������������������������������������������������������������������306
Device Library Development (FXOS8700CQ)�����������������������������������������������������306
Constructor Analysis and Implementation���������������������������������������������������311
Configuration�����������������������������������������������������������������������������������������������313
Read Sample and Status�����������������������������������������������������������������������������316
Test the Core������������������������������������������������������������������������������������������������318
Events Again������������������������������������������������������������������������������������������������323
What Next?��������������������������������������������������������������������������������������������������329
Summary����������������������������������������������������������������������������������������������������������331

Chapter 10: A Lidar Unit�������������������������������������������������������������������333


Understand the Device��������������������������������������������������������������������������������������334
Find a Device Library����������������������������������������������������������������������������������������334
Device Library Design���������������������������������������������������������������������������������������335
Interface������������������������������������������������������������������������������������������������������335
Common Methods���������������������������������������������������������������������������������������337
Other Considerations�����������������������������������������������������������������������������������338
Play with the Device�����������������������������������������������������������������������������������������339
Device Library Development�����������������������������������������������������������������������������342
Development Approach�������������������������������������������������������������������������������342
Lidar Core����������������������������������������������������������������������������������������������������343
Implementation�������������������������������������������������������������������������������������������344
Test the Core������������������������������������������������������������������������������������������������348
Additional Methods��������������������������������������������������������������������������������������352

xi
Table of Contents

Test the Additional Methods������������������������������������������������������������������������356


Additional Thoughts�������������������������������������������������������������������������������������360
What Next?��������������������������������������������������������������������������������������������������������369
Summary����������������������������������������������������������������������������������������������������������369

Chapter 11: An Environmental Sensor����������������������������������������������371


Understand the Device��������������������������������������������������������������������������������������371
Find a Device Library����������������������������������������������������������������������������������������373
Use the diozero BME280�����������������������������������������������������������������������������������376
Play with I2C and SPI����������������������������������������������������������������������������������������381
To the Datasheet������������������������������������������������������������������������������������������382
I2CDevice�����������������������������������������������������������������������������������������������������383
SpiDevice�����������������������������������������������������������������������������������������������������387
A Step Beyond Play�������������������������������������������������������������������������������������392
Summary����������������������������������������������������������������������������������������������������������395

Chapter 12: An Analog-to-Digital Converter�������������������������������������397


Understand the Device��������������������������������������������������������������������������������������398
Finding a Device Library�����������������������������������������������������������������������������������398
Use the diozero McpAdc�����������������������������������������������������������������������������������400
Play with SPI�����������������������������������������������������������������������������������������������������403
Turn Play into Reality����������������������������������������������������������������������������������������408
Summary����������������������������������������������������������������������������������������������������������412

Chapter 13: A Stepper Motor Driver�������������������������������������������������413


Understand the Device��������������������������������������������������������������������������������������413
Find a Device Library����������������������������������������������������������������������������������������416
Search for Non-Java Libraries���������������������������������������������������������������������416
And the Answer Is …����������������������������������������������������������������������������������417

xii
Table of Contents

Device Library Design���������������������������������������������������������������������������������������417


Interface Design������������������������������������������������������������������������������������������418
Device Library Development�����������������������������������������������������������������������������419
Play with the Device������������������������������������������������������������������������������������419
SilentStepStick Implementation������������������������������������������������������������������422
Constructor Implementation������������������������������������������������������������������������423
Test SilentStepStick�������������������������������������������������������������������������������������428
What Next?��������������������������������������������������������������������������������������������������������432
Speed Profiles���������������������������������������������������������������������������������������������437
Summary����������������������������������������������������������������������������������������������������������439

Chapter 14: A Project�����������������������������������������������������������������������441


The Metronome�������������������������������������������������������������������������������������������������441
Mechanical Design��������������������������������������������������������������������������������������������442
Electronic Design����������������������������������������������������������������������������������������������446
Software Design������������������������������������������������������������������������������������������������447
Project Component Testing�������������������������������������������������������������������������������448
Test waitForActive���������������������������������������������������������������������������������������448
Test whenActivated�������������������������������������������������������������������������������������452
Test addListener������������������������������������������������������������������������������������������455
Metronome Development����������������������������������������������������������������������������������458
Go Beyond Initial Requirements������������������������������������������������������������������������463
Get Closer to the Real World�����������������������������������������������������������������������������467
Summary����������������������������������������������������������������������������������������������������������472

xiii
Table of Contents

Appendix A1: Arduino Command Server������������������������������������������473


S
 ome Arduino Background�������������������������������������������������������������������������������474
Choose an Arduino��������������������������������������������������������������������������������������������475
The Command Server Pattern���������������������������������������������������������������������������476
The command_server Sketch���������������������������������������������������������������������������477
command_server File����������������������������������������������������������������������������������480
cmd_executor.h File������������������������������������������������������������������������������������484
cmd_executor file����������������������������������������������������������������������������������������485
Test the Command Server���������������������������������������������������������������������������������487
The Command Server As a “Device”�����������������������������������������������������������������489
Test the “Device” from Raspberry Pi�����������������������������������������������������������������489
Summary����������������������������������������������������������������������������������������������������������492

Appendix A2: Custom Lidar Unit�������������������������������������������������������493


The Hardware Design����������������������������������������������������������������������������������������493
Some Harsh Reality�������������������������������������������������������������������������������������������496
The Lidar Unit Sketch����������������������������������������������������������������������������������������497
cmd_executor.h�������������������������������������������������������������������������������������������499
cmd_executor����������������������������������������������������������������������������������������������499
lidar.h�����������������������������������������������������������������������������������������������������������504
lidar�������������������������������������������������������������������������������������������������������������505
servo.h���������������������������������������������������������������������������������������������������������507
servo������������������������������������������������������������������������������������������������������������509
Test�������������������������������������������������������������������������������������������������������������������512
Lidar Unit “Datasheet”��������������������������������������������������������������������������������������514
Power����������������������������������������������������������������������������������������������������������������514
Interface������������������������������������������������������������������������������������������������������������515
Summary����������������������������������������������������������������������������������������������������������519

xiv
Table of Contents

Appendix A3: NetBeans and Maven��������������������������������������������������521


Create a NetBeans Project Using Maven and diozero���������������������������������������523
Develop a Device Library����������������������������������������������������������������������������������526
Test the Device Library�������������������������������������������������������������������������������������529
Run TestLED with a diozero Remote Provider����������������������������������������������532
Run TestLED on a Raspberry Pi�������������������������������������������������������������������������535
Automate Build, Download, Run������������������������������������������������������������������������542
Summary����������������������������������������������������������������������������������������������������������546

Index�������������������������������������������������������������������������������������������������549

xv
Discovering Diverse Content Through
Random Scribd Documents

You might also like