0% found this document useful (0 votes)
416 views

Raspberry Pi Build HAT

The document provides information about the Raspberry Pi Build HAT including how to set it up, connect LEGO Technic motors and sensors, and control them using Python or .NET code. The Build HAT connects to the Raspberry Pi and allows controlling up to four LEGO motors and sensors through an easy to use library. It can be powered by an external 8V power supply.

Uploaded by

Steve Attwood
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
416 views

Raspberry Pi Build HAT

The document provides information about the Raspberry Pi Build HAT including how to set it up, connect LEGO Technic motors and sensors, and control them using Python or .NET code. The Build HAT connects to the Raspberry Pi and allows controlling up to four LEGO motors and sensors through an easy to use library. It can be powered by an external 8V power supply.

Uploaded by

Steve Attwood
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 1

Foundation

Raspberry Pi
Documentation

Computers

Accessories

Microcontrollers

Services

Pico C SDK

Build HAT

Introducing the Build HAT


Edit this on GitHub

The Raspberry Pi Build HAT is an add-on board that


connects to the 40-pin GPIO header of your Raspberry Pi,
which was designed in collaboration with LEGO®
Education to make it easy to control LEGO® Technic™
motors and sensors with Raspberry Pi computers.

NOTE

A full list of supported devices can be found in the


Device Compatibility section.

It provides four connectors for LEGO® Technic™ motors


and sensors from the SPIKE™ Portfolio. The available
sensors include a distance sensor, a colour sensor, and a
versatile force sensor. The angular motors come in a
range of sizes and include integrated encoders that can
be queried to Pnd their position.

The Build HAT Pts all Raspberry Pi computers with a 40-


pin GPIO header, including — with the addition of a ribbon
cable or other extension device — Raspberry Pi 400.
Connected LEGO® Technic™ devices can easily be
controlled in Python, alongside standard Raspberry Pi
accessories such as a camera module.

The Raspberry Pi Build HAT power supply (PSU), which is


available separately, is designed to power both the Build
HAT and Raspberry Pi computer along with all connected
LEGO® Technic™ devices.

The LEGO® Education SPIKE™ Prime Set 45678 and


SPIKE™ Prime Expansion Set 45681, available separately
from LEGO® Education resellers, include a collection of
useful elements supported by the Build HAT.

NOTE

The HAT works with all 40-pin GPIO Raspberry Pi


boards, including Raspberry Pi 4 and Raspberry Pi
Zero. With the addition of a ribbon cable or other
extension device, it can also be used with Raspberry
Pi 400.

Controls up to 4 LEGO® Technic™ motors and


sensors included in the SPIKE™ Portfolio

Easy-to-use Python library to control your LEGO®


Technic™ devices

Fits onto any Raspberry Pi computer with a 40-pin


GPIO header

Onboard RP2040 microcontroller manages low-


level control of LEGO® Technic™ devices

External 8V PSU available separately to power both


Build HAT and Raspberry Pi

NOTE

The Build HAT can not power the Raspberry Pi 400 as it


does not support being powered via the GPIO headers.

Preparing your Build HAT


Edit this on GitHub

NOTE

Before starting to work with your Raspberry Pi Build


HAT you should set up your Raspberry Pi, install the
latest version of the operating system using
Raspberry Pi Imager.

Attach 9mm spacers to the bottom of the board. Seat the


Raspberry Pi Build HAT onto your Raspberry Pi. Make
sure you put it on the right way up. Unlike other HATs, all
the components are on the bottom, leaving room for a
breadboard or LEGO® elements on top.

+tting build hat

Access the GPIO Pins


If you want to access the GPIO pins of the Raspberry Pi,
you can add an optional tall header and use 15 mm
spacers.

tall headers

The following pins are used by the Build HAT itself and
you should not connect anything to them.

GPIO Use Status

GPIO0/1 ID prom

GPIO4 Reset

GPIO14 Tx

GPIO15 Rx

GPIO16 RTS unused

GPIO17 CTS unused

Setting up your Raspberry Pi


Once the Raspberry Pi has booted, open the Raspberry Pi
ConPguration tool by clicking on the Raspberry Menu
button and then selecting “Preferences” and then
“Raspberry Pi ConPguration”.

Click on the “interfaces” tab and adjust the Serial settings


as shown below:

Using your Raspberry Pi Headless

If you are running your Raspberry Pi headless and using


raspi-config, select “Interface Options” from the Prst
menu.

Then “P6 Serial Port”.

Disable the serial console:

And enable the serial port hardware.

The Pnal settings should look like this.

You will need to reboot at this point if you have made any
changes.

Powering the Build HAT


Connect an external power supply — the oicial
Raspberry Pi Build HAT power supply is recommended —
however any reliable +8V±10% power supply capable of
supplying 48W via a DC 5521 centre positive barrel
connector (5.5mm × 2.1mm × 11mm) will power the Build
HAT. You don’t need to connect an additional USB power
supply to the Raspberry Pi as well, unless you are using a
Raspberry Pi 400.

NOTE

The Build HAT can not power the Raspberry Pi 400 as it


does not support being powered via the GPIO headers.

NOTE

The LEGO® Technic™ motors are very powerful; so to


drive them you’ll need an external 8V power supply. If you
want to read from motor encoders and the SPIKE™ force
sensor, you can power your Raspberry Pi and Build HAT
the usual way, via your Raspberry Pi’s USB power socket.
The SPIKE™ colour and distance sensors, like the motors,
require an external power supply.

You have the choice to use Build HAT with Python or


.NET.

Using the Build HAT from


Python
Edit this on GitHub

Installing the Python Library


Install the Build HAT Python library. Open a Terminal
window and type,

$ pip3 install buildhat

For more information about the Build HAT Python Library


see ReadTheDocs.

Using Motors from Python


There are a number of motors that work with the Build
HAT.

Connecting a Motor

Connect a motor to port A on the Build HAT. The LPF2


connectors need to be inserted the correct way up. If the
connector doesn’t slide in easily, rotate by 180 degrees
and try again.

connect motor

Working with Motors

Start the Thonny IDE. Add the program code below:

from buildhat import Motor

motor_a = Motor('A')

motor_a.run_for_seconds(5)

Run the program by clicking the play/run button. If this is


the Prst time you’re running a Build HAT program since
the Raspberry Pi has booted, there will be a few seconds
pause while the Prmware is copied across to the board.
You should see the red LED extinguish and the green LED
illuminate. Subsequent executions of a Python program
will not require this pause.

Your motor should turn clockwise for 5 seconds.

Change the Pnal line of your program and re-run.

motor_a.run_for_seconds(5, speed=50)

The motor should now turn faster. Make another change:

motor_a.run_for_seconds(5, speed=-50)

The motor should turn in the opposite (anti-clockwise)


direction

Create a new program by clicking on the plus button in


Thonny. Add the code below:

from buildhat import Motor

motor_a = Motor('A')

while True:
print("Position: ", motor_a.get_aposition())

Run the program. Grab the motor and turn the shaft. You
should see the numbers printed in the Thonny REPL
changing.

Using Sensors from Python


There is a large range of sensors that work with the Build
HAT.

Working with Sensors

Connect a Colour sensor to port B on the Build HAT, and a


Force sensor to port C.

NOTE

If you’re not intending to drive a motor, then you don’t


need an external power supply and you can use a
standard USB power supply for your Raspberry Pi.

Create another new program:

from signal import pause


from buildhat import ForceSensor, ColorSensor

button = ForceSensor('C')
cs = ColorSensor('B')

def handle_pressed(force):
cs.on()
print(cs.get_color())

def handle_released(force):
cs.off()

button.when_pressed = handle_pressed
button.when_released = handle_released
pause()

Run it and hold a coloured object (LEGO® elements are


ideal) in front of the colour sensor and press the Force
sensor plunger. The sensor’s LED should switch on and
the name of the closest colour should be displayed in the
thonny REPL.

Using the Build HAT from


.NET
Edit this on GitHub

Installing the .NET Framework


The .NET framework from Microsoft is not available via
apt on Raspberry Pi. However, you can follow the oicial
instructions from Microsoft to install the .NET framework.
Alternatively, there is a simpliPed third party route to get
the .NET toolchain on to your Raspberry Pi.

WARNING

The installation script is run as root. You should read


it Prst and make sure you understand what it is doing.
If you are at all unsure you should follow the oicial
instructions manually.

$ wget -O - https://raw.githubusercontent.com/pjgpetecodes/dotnet5pi/master/install.sh | sudo bash

After installing the .NET framework you can create your


project:

$ dotnet new console --name buildhat

This creates a default program in the buildhat


subdirectory, and we need to be in that directory in order
to continue:

$ cd buildhat

You will now need to install the following nuget packages:

$ dotnet add package System.Device.Gpio --version 2.1.0


$ dotnet add package Iot.Device.Bindings --version 2.1.0

Running C# Code
You can run the program with the dotnet run
command. Let’s try it now to make sure everything works.
It should print "Hello World!"

$ dotnet run
Hello World!

(When instructed to "run the program" in the instructions


that follow, you will simply rerun dotnet run)

Editing C# Code
In the instructions below, you will be editing the Ple
buildhat/Program.cs, the C# program which was
generated when you ran the above commands.

Any text editor will work to edit C# code, including Geany,


the IDE/Text Editor that comes pre-installed. Visual Studio
Code (often called "VS Code") is also a popular
alternative.

Using the Build HAT from .NET


The Raspberry Pi Built HAT is referred to "Brick" in LEGO®
parlance and you can talk directly to it from .NET using
the Build HAT Serial Protocol.

You can create a brick object as below,

Brick brick = new("/dev/serial0");

but you need to remember to dispose of the brick at the


end of your code.

brick.Dispose();

WARNING

If you do not call brick.Dispose() your program


will not terminate.

If you want to avoid calling brick.Dispose at the end,


then create your brick with the using statement:

using Brick brick = new("/dev/serial0");

In this case, when reaching the end of the program, your


brick will be automatically disposed.

Displaying the information

You can gather the various software versions, the


signature, and the input voltage:

var info = brick.BuildHatInformation;


Console.WriteLine($"version: {info.Version}, firmware date: {info.FirmwareDate}, signature:");
Console.WriteLine($"{BitConverter.ToString(info.Signature)}");
Console.WriteLine($"Vin = {brick.InputVoltage.Volts} V");

NOTE

The input voltage is read only once at boot time and is


not read again afterwards.

Getting sensors and motors details

The functions GetSensorType, GetSensor will allow you


to retrieve any information on connected sensor.

SensorType sensor = brick.GetSensorType((SensorPort)i);


Console.Write($"Port: {i} {(Brick.IsMotor(sensor) ? "Sensor" : "Motor")} type: {sensor} Connected: ");

In this example, you can as well use the IsMotor static


function to check if the connected element is a sensor or
a motor.

if (Brick.IsActiveSensor(sensor))
{
ActiveSensor activeSensor = brick.GetActiveSensor((SensorPort)i);
}
else
{
var passive = (Sensor)brick.GetSensor((SensorPort)i);
Console.WriteLine(passive.IsConnected);
}

ActiveSensor have a collection of advanced properties


and functions allowing to understand every element of
the sensor. It is also possible to call the primitive
functions from the brick from them. This will allow you to
select speciPc modes and do advance scenarios. While
this is possible, motor and sensor classes have been
created to make your life easier.

Events

Most sensors implements events on their special


properties. You can simply subscribe to
PropertyChanged and PropertyUpdated. The changed
one will be Pred when the value is changing while the
updated one when there is a success update to the
property. Depending on the modes used, some properties
may be updated in the background all the time while
some others occasionally.

You may be interested only when a color is changing or


the position of the motor is changing, using it as a
tachometer. In this case, the PropertyChanged is what
you need!

Console.WriteLine("Move motor on Port A to more than position 100 to stop this test.");
brick.WaitForSensorToConnect(SensorPort.PortA);
var active = (ActiveMotor)brick.GetMotor(SensorPort.PortA);
bool continueToRun = true;
active.PropertyChanged += MotorPropertyEvent;
while (continueToRun)
{
Thread.Sleep(50);
}

active.PropertyChanged -= MotorPropertyEvent;
Console.WriteLine($"Current position: {active.Position}, eventing stopped.");

void MotorPropertyEvent(object? sender, PropertyChangedEventArgs e)


{
Console.WriteLine($"Property changed: {e.PropertyName}");

You might also like