# DIY Desktop Calculator with CircuitPython 

## Overview

In this project, you'll build your own Desktop Calculator with CircuitPython. Along the way you'll also learn about the alternative "RPN" notation for calculating, how a keyboard matrix works (and how to create your own!), and more!

![](https://cdn-learn.adafruit.com/assets/assets/000/096/176/medium800/projects_PXL_20201021_162405210.jpg?1603297544)

### What is "RPN", anyway?

Most of us are accustomed to standard mathematical notation, like 2+3\*7 or (2+3)\*7. Because most operations (like "+") appear between the two things operated on (like 2 and 3), this is called "infix" notation. Two alternatives to "infix" are "postfix" and "prefix". Postfix notation is also called RPN, which stands for "Reverse Polish Notation".

Possibly because it was used in some classic HP calculators, many people have a fondness for RPN or even feel that it works better than standard notation.

In standard infix notation, you have to know the "precedence rule", and understand that when given 2+3\*7 you first compute 3\*7=21 and then compute 2+21=23. When the rule does not reflect your intent, you add parentheses:&nbsp; (2+3)\*7. In this case you evaluate 2+3=5 first, then 5\*7=35. Mnemonic devices such as PEDMAS help us remember the rules.

In postfix notation, there are no parentheses and no rules of precedence. Instead, there what is called the "stack". When you enter a number, it is placed on the stack.&nbsp; When you enter an operator such as "+" that operates on two values, the "top" two values are taken off the stack, the operation is performed, and the result is put back on the stack.

If you'd like to know more about RPN, I found that the short paper "[Order of Operations and RPN](https://digitalcommons.unl.edu/cgi/viewcontent.cgi?article=1045&context=mathmidexppap)" provides helpful background.

To interpret "2 3 7 \* +", start with the empty stack and place each number on the stack as you encounter it. When you encounter "\*", your stack will contain "2", "3", and "7" in that order. This makes the values that "+" will operate on "3" and "7", so they are removed and replaced with "21". Now the stack contains "2" and "21" in that order. When you encounter "+", you take "2" and "21" off and put "23" on. That's the same as "2 + 3 \* 7" in standard notation.

Operations don't have to appear at the end only, they can appear in the middle. Consider "2 3 + 7 \*". When you encounter "+", the stack has "2" and "3", so replace it with "5". Next, 7 gets placed on the stack. When you encouter "\*", the stack has "5" and "7" so replace them with "35". That's the same as "(2 + 3) \* 7" in standard notation.

![](https://cdn-learn.adafruit.com/assets/assets/000/096/178/medium800/projects_IMG_20200910_124534%281%29.jpg?1603297790)

### What is Decimal Arithmetic?

This calculator uses a decimal arithmetic library ported from standard Python3. It's available in the community bundle under the name jepler\_udecimal. Decimal is "designed with people in mind, and necessarily has a paramount guiding principle–computers must provide an arithmetic that works in the same way as the arithmetic that people learn at school."

In this library, "0.1 + 0.2" is exactly equal to "0.3". Even better, the precision isn't limited to just 6 digits. In Python code, you can select any number of digits (even in the hundreds!). For this project, so that numbers fit on the display, numbers up to 14 digits are displayed.

This stands in contrast with how floats work in CircuitPython. CircuitPython flating point numbers only have about 6 to 7 digits of decimal precision, and values like "0.1" are not exact values.

## Parts
### Adafruit SHARP Memory Display Breakout - 2.7" 400x240 Monochrome

[Adafruit SHARP Memory Display Breakout - 2.7" 400x240 Monochrome](https://www.adafruit.com/product/4694)
The **Adafruit** &nbsp; **2.7" 400x240 SHARP Memory Display Breakout** &nbsp;is a chonky cross between an eInk (e-paper) display and an LCD. It has the ultra-low power usage of eInk and the fast-refresh rates of an LCD. This model has a gray background, and the...

Out of Stock
[Buy Now](https://www.adafruit.com/product/4694)
[Related Guides to the Product](https://learn.adafruit.com/products/4694/guides)
![Adafruit SHARP Memory Display Breakout connected to a half-sized breadboard and a microcontroller. The breakout board plays a black and white animation video of black figures playing violins and a keyboard.](https://cdn-shop.adafruit.com/product-videos/640x480/4694-04.jpg)

### Adafruit Feather nRF52840 Express

[Adafruit Feather nRF52840 Express](https://www.adafruit.com/product/4062)
The **Adafruit Feather nRF52840 Express** is the new Feather family member with Bluetooth® Low Energy and _native USB support_ featuring the nRF52840!&nbsp; It's our take on an 'all-in-one' Arduino-compatible + Bluetooth® Low Energy with built-in USB...

Out of Stock
[Buy Now](https://www.adafruit.com/product/4062)
[Related Guides to the Product](https://learn.adafruit.com/products/4062/guides)
![Angled shot of a Adafruit Feather nRF52840 Express. ](https://cdn-shop.adafruit.com/640x480/4062-02.jpg)

### Colorful 12mm Square Tactile Button Switch Assortment - 15 pack

[Colorful 12mm Square Tactile Button Switch Assortment - 15 pack](https://www.adafruit.com/product/1010)
Little clicky switches are standard input "buttons" on electronic projects. These work best in a PCB but [can be used on a solderless breadboard as shown in this tutorial](http://www.ladyada.net/learn/arduino/lesson5.html). The pins are normally open (disconnected) and...

In Stock
[Buy Now](https://www.adafruit.com/product/1010)
[Related Guides to the Product](https://learn.adafruit.com/products/1010/guides)
![Angled  shot of 15 colorful square tactile button switches in green, yellow, red, blue, and white.](https://cdn-shop.adafruit.com/640x480/1010-04.jpg)

### Bakelite Universal Perfboard Plates - Pack of 10

[Bakelite Universal Perfboard Plates - Pack of 10](https://www.adafruit.com/product/2670)
Make your next project as you imagine it with&nbsp;prototyping perfboards that can easily be cut with scissors like these **Bakelite Universal Perfboard Plates**!

We wanted a perfboard&nbsp;that was both customizable and durable and <a...></a...>

In Stock
[Buy Now](https://www.adafruit.com/product/2670)
[Related Guides to the Product](https://learn.adafruit.com/products/2670/guides)
![Angled shot of single Bakelite Universal Perfboard Plate.](https://cdn-shop.adafruit.com/640x480/2670-00.jpg)

### Part: Break-away 0.1" 36-pin strip right-angle male header (10 pack)
quantity: 1
 Pack of ten
[Break-away 0.1" 36-pin strip right-angle male header (10 pack)](https://www.adafruit.com/product/1540)

### Part:  Premium Female/Female Jumper Wires - 20 x 3" (75mm) Premium Female/Female Jumper Wires - 20 x 3" (75mm)
quantity: 1
Premium jumper wires (10 pack)
[ Premium Female/Female Jumper Wires - 20 x 3" (75mm) Premium Female/Female Jumper Wires - 20 x 3" (75mm)](https://www.adafruit.com/product/1951)

### Part: White Nylon Screw and Stand-off Set – M2.5 Thread
quantity: 1
420 pieces
[White Nylon Screw and Stand-off Set – M2.5 Thread](https://www.adafruit.com/product/3658)

### Part: Hook-up Wire Spool Set - 22AWG Solid Core - 6 x 25 ft
quantity: 1
Perfect for bread-boarding, 6 spools of solid-core wire
[Hook-up Wire Spool Set - 22AWG Solid Core - 6 x 25 ft](https://www.adafruit.com/product/1311)

### Part: Solder Wire - 60/40 Rosin Core - 0.5mm/0.02" diameter - 50 grams
quantity: 1
0.1 lb (about 50 grams) spool 
[Solder Wire - 60/40 Rosin Core - 0.5mm/0.02" diameter - 50 grams](https://www.adafruit.com/product/1886)

## Tools
### Part: Adjustable 30W 110V soldering iron
quantity: 1
'pen-style' soldering iron
[Adjustable 30W 110V soldering iron](https://www.adafruit.com/product/180)

### Part: Flush diagonal cutters
quantity: 1
CHP170
[Flush diagonal cutters](https://www.adafruit.com/product/152)

# DIY Desktop Calculator with CircuitPython 

## Soldering the Keyboard Matrix

You'll need a total of 24 "12mm" through-hole tactile switches, one piece of 7x9CM perfboard, and preferably two colors of wire. If you buy 4 sets of Adafruit's colorful assortment, you'll have enough caps of a single color to do all the digits, with some left over for your next project.

Begin by snipping the small plastic pins off of the bottom of each key. These are great if you're doing a custom PCB, don't hurt if you are using a protoboard, but just don't fit in the perfboard. You don't have to get them flush, just do the best you can with a pair of flush cutters.

The pins will fly off if you're not careful, so doing this directly in a small wastebasket is highly recommended!

![3d_printing_IMG_20200825_135546.jpg](https://cdn-learn.adafruit.com/assets/assets/000/095/918/medium640/3d_printing_IMG_20200825_135546.jpg?1602860028)

Warning: 

Identify which side of the perfboard is the bottom—this is the side with the copper pads. We're going to stick the keys through from the top, non-copper side.

Insert the keys in the perfboard in a "4x6" (4 columns, 6 rows) pattern, with the pins sticking out the left and right sides. Use the very first row of holes (this will become the bottom of the keypad), and place everything as close as possible. This should leave you with an unused row at the top where we will later add the connecting header.

![3d_printing_IMG_20200825_135806.jpg](https://cdn-learn.adafruit.com/assets/assets/000/095/921/medium640/3d_printing_IMG_20200825_135806.jpg?1602860279)

![3d_printing_IMG_20200825_150309.jpg](https://cdn-learn.adafruit.com/assets/assets/000/095/922/medium640/3d_printing_IMG_20200825_150309.jpg?1602860343)

Flip the board over, the next task is to complete the "row wiring". There is already an internal connection between pins 1 and 2, and pins 3 and 4 that will be taken advantage of. (then, when the switch closes, all of 1, 2, 3, and 4 are momentarily connected)

The "row wiring" needs to connect pins 1 and 2 of every key on the same row. This can be accomplished by bending pin 1 of one switch towards pin 2 of the next switch, then soldering them together. As you complete each row, use your multimeter in continuity test mode between the far left and right ends of the row to make sure everything is soldered.

When you proceed to the next row of keys, make sure to skip over a row of pins—We'll be soldering to pins 3 and 4 when it's time to do the "column wiring".

![3d_printing_IMG_20200825_151123.jpg](https://cdn-learn.adafruit.com/assets/assets/000/095/923/medium640/3d_printing_IMG_20200825_151123.jpg?1602860496)

![3d_printing_IMG_20200825_151402.jpg](https://cdn-learn.adafruit.com/assets/assets/000/095/924/medium640/3d_printing_IMG_20200825_151402.jpg?1602860718)

For the column wiring, I like to use a diagonal wire, from pin 3 of one button to pin 4 of this next one. This lets me place small pieces of wire, stripped at each end, and only solder one wire (not two) to each pin. The length of each wire in this case is about 2/3" or 16mm.

If, after soldering, the wire sticks beyond the end of the pin, trim it with flush cutters. As you complete each column, use your meter in continuity test mode to check that the connections are good from the top to bottom of the column.

![3d_printing_IMG_20200825_153050(1).jpg](https://cdn-learn.adafruit.com/assets/assets/000/095/925/medium640/3d_printing_IMG_20200825_153050%281%29.jpg?1602862091)

![3d_printing_IMG_20200825_152435.jpg](https://cdn-learn.adafruit.com/assets/assets/000/095/926/medium640/3d_printing_IMG_20200825_152435.jpg?1602862403)

![3d_printing_IMG_20200825_160938.jpg](https://cdn-learn.adafruit.com/assets/assets/000/095/927/medium640/3d_printing_IMG_20200825_160938.jpg?1602862409)

Finally, we need to add a 10-pin header and connect each row and each column to it. No GND or VCC connection is needed.

Your calculator will look tidiest if you solder a right angle male header on the bottom (copper) side of the board, pointing out the top. Use the very topmost row of the perfboard.

Next, solder the first 6 positions with a connection from a "pin 3" or "pin 4" of each row.

Finally solder the other 4 positions with a connection from "pin 1" or "pin 2" of each row.

![3d_printing_IMG_20200825_161629.jpg](https://cdn-learn.adafruit.com/assets/assets/000/095/928/medium640/3d_printing_IMG_20200825_161629.jpg?1602862431)

![3d_printing_IMG_20200825_164047(1).jpg](https://cdn-learn.adafruit.com/assets/assets/000/095/929/medium640/3d_printing_IMG_20200825_164047%281%29.jpg?1602862533)

![3d_printing_IMG_20200825_164047(1).jpg](https://cdn-learn.adafruit.com/assets/assets/000/095/930/medium640/3d_printing_IMG_20200825_164047%281%29.jpg?1602862579)

Phew!&nbsp; That was a lot of wiring!&nbsp; Now, for a final test get out your meter, make sure it's still set to continuity mode, and clip your probes to one row pin and one column pin. At first it will read open circuit, but when you press the button at that row and column it will beep for continuity. Check this for a few keys until you're satisfied the keyboard works properly. The microcontroller will do this rapidly for each combination of row and column when it "scans the matrix".

# DIY Desktop Calculator with CircuitPython 

## 3D Printing, Wiring & Assembly

Download the zip file below and use the STL file inside for 3D printing. The source file, in "scad" format, is also included if you want to modify the design using [OpenSCAD](https://www.openscad.org/ "OpenSCAD - The Programmers Solid 3D CAD Modeller").

The print size is about 175 x 35 x 40mm.

The file is designed to print without supports using a layer height of 0.2mm or less.

![](https://cdn-learn.adafruit.com/assets/assets/000/095/948/medium800/3d_printing_calculon.png?1602875650)

[calculon.zip](https://cdn-learn.adafruit.com/assets/assets/000/095/949/original/calculon.zip?1602875665)
Solder male pins headers to the display and to your Feather, with the pins "down" as usual for breadboard use. Use 75mm jumper wires to wire the matrix and display to a CircuitPython Feather (such as the nRF52840 Feather)&nbsp; Keep the wires in bundles, especially the row and column bundles. Make the following connections:

- Matrix "column" pins to **D10** , **D9** , **D6** , **TX**
- Matrix "row" pins to **A0** , **A1** , **A2** , **A3** , **A4** , **A5**
- Display pins to feather pins: **CLK** to **SCK** , **DI** to **MO** , **CS** to **RX** , **GND** to **GND** , **VIN** to **3V**

![3d_printing_Screenshot_2020-10-19_09-37-07.png](https://cdn-learn.adafruit.com/assets/assets/000/096/087/medium640/3d_printing_Screenshot_2020-10-19_09-37-07.png?1603118289)

![3d_printing_Screenshot_2020-10-19_09-36-42.png](https://cdn-learn.adafruit.com/assets/assets/000/096/088/medium640/3d_printing_Screenshot_2020-10-19_09-36-42.png?1603118314)

Assembly uses nylon M2.5 screws, nuts, and standoffs. Place the feather in back, pins up in the air. The best order for assembly I found is:

1. Loosely secure 4 short stand-offs in the keypad area. I used F-F standoffs and screws.
2. Place the keypad on top, adjust the stand-offs within the slots, and add screws from the top
3. Tighten the bottom screws until the keypad doesn't shift around anymore
4. Follow a similar procedure to secure the Feather
5. Insert nuts in the 4 slots, then 4 long M-F stand-offs into them.
6. Place the screen on top and secure with screws. Note the correct orientation of the screen.

Info: 

# DIY Desktop Calculator with CircuitPython 

## Installing the Code

## Step 1 - Install CircuitPython

This guide requires CircuitPython be installed, click the button below to learn how to do that and install the latest version of CircuitPython.

Are you new to using CircuitPython? No worries, [there is a full getting started guide here](https://learn.adafruit.com/welcome-to-circuitpython "Welcome to CircuitPython").

Adafruit suggests using the Mu editor to edit your code and have an interactive REPL in CircuitPython.&nbsp;[You can learn about Mu and installation in this tutorial](https://learn.adafruit.com/welcome-to-circuitpython/installing-mu-editor "Mu tutorial").

[Install CircuitPython on the Feather nRF52840 Board](https://learn.adafruit.com/introducing-the-adafruit-nrf52840-feather/circuitpython)
## Step 2 - Install Libraries

First make sure you are running the&nbsp;[latest version of Adafruit CircuitPython for the Feather nRF52840](https://circuitpython.org/board/qtpy_m0/). You'll also need to install several libraries on your Feather:

- **jepler\_udecimal** (from the [Community Bundle](https://github.com/adafruit/CircuitPython_Community_Bundle/releases/latest))
- **adafruit\_hid**
- **adafruit\_display\_text**

Carefully follow the steps to find and install these libraries from [Adafruit's CircuitPython Library Bundle](https://circuitpython.org/libraries). Our CircuitPython starter guide has [a great page on how to install libraries from the bundle](https://learn.adafruit.com/welcome-to-circuitpython/circuitpython-libraries).

![](https://cdn-learn.adafruit.com/assets/assets/000/096/083/medium800/3d_printing_files2.png?1603114179)

## Step 3 - Install code

Use the "Project Zip" link to download the rest of the files needed for the calculator, then unzip it inside the **CIRCUITPY** drive.

![](https://cdn-learn.adafruit.com/assets/assets/000/096/084/medium800/3d_printing_files1.png?1603114194)

https://github.com/adafruit/Adafruit_Learning_System_Guides/blob/main/CircuitPython_RPN_Calculator/code.py

# DIY Desktop Calculator with CircuitPython 

## Using your calculator

## The stack

There is an unlimited stack of numbers. The last 4 entries are displayed as "T", "Z", "X" and "Y". The number currently being entered is shown on the line marked "\>".

## Entering numbers

Thanks to the jepler\_udecimal library, the calculator uses 14-digit numbers and allows exponents from -99 to +99.

Enter a simple number by pressing digit keys followed by ENT, such as "1234". This places the number at the last entry of the stack and moves the other entries deeper in the stack.&nbsp;

The "decimal point" key doubles as the exponent key, so to enter the number "6.02e23" enter "6.02.23". For "1E3" type "1..3".

## Performing operations

To perform an operation, enter the required operands and then press the operation key. If you were in the middle of entering a number when you press an operation key, the number is automatically Entered.

For example, to add "1" and "2", you can type: "1 ENT 2 +". "1" and "2" are removed, and "3" is placed on the stack.

## Alternate Function

Some keys have two functions. To access the alternate function, press and release ALT, then press the other key.

## Pasting to PC

When you press Paste (ALT 0), the "X" number is entered via USB HID on the attached computer. The number remains on the stack.

## Keypad Reference

Here are all the functions you can access within the calculator. The left hand side is the normal key, and the right hand side is the alternate function.

![](https://cdn-learn.adafruit.com/assets/assets/000/095/946/medium800/3d_printing_reference.png?1602874964)

# DIY Desktop Calculator with CircuitPython 

## Code Highlights and Customization

The code is long enough (around 400 lines) that a line by line explanation would be too verbose. Here are some high level notes to give you an overview:

```python
class AngleConvert:
   ...
```

The AngleConvert class helps implement the "degrees / radians / gradians" mode common on scientific calculators. It wraps each of the 6 trig functions, converting to/from radians as necessary. To improve the precision of the result, these steps are carried out with extra digits of precision using the `extraprec` decorator function.

```python
getcontext().prec = 14
getcontext().Emax = 99
getcontext().Emin = -99
```

Sets the default precision (number of decimal places), minimum and maximum exponents. These values were chosen so that any number should fit on the screen without being cut off, but any of these values can be increased or decreased if desired.

```python
class MatrixKeypadBase:
    ...

class MatrixKeypad:
    ...

class LayerSelect:
    ...
    
...
layers = (
    (
        ('^', 'l', 'r', LS1),
        ...
    ),
    ...
)
```

These classes implement a matrix keyboard, including layer selection. The "layers" tuple has "layer 0" (normal layer) followed by "layer 1" (alternate layer). Except for the special values `LS1` (layer shift 1) and `LL0` (layer lock 0), each one specifies a (possibly empty) string that is handled later by the the dictionary of `ops` or by the main `loop`.

```python
class Impl:
    ...
```

The "Impl" (implementation) class has the details of how to interact with the keyboard matrix and update the display. The calculator program originally ran on a PC in a terminal window, and this class is a vestige of trying to support for both CircuitPython and standard Python3 within a single program.

```python
def do_op(arity, fun):
    ...
    
ops = {
    '\'': (1, lambda x: -x),
    '\\': (2, lambda x, y: x/y),  # keypad: SHIFT+/
    ...
    '@': angleconvert.next_state,
    ...
}
```

`ops` is a dictionary where the **key** is a character produced by the key matrix and the **value** is either a **callable** or a tuple of **(arity, callable)**.

When an operation is a&nbsp; **callable** , it has to manage the stack itself. When it's a tuple, then the first number in the tuple (called the **arity** ) specifies how many arguments the function expects. That number of arguments are passed as arguments to the function. If the function succeeds, the arguments are removed from the stack. Then, the return value, if it's not **None** , is put back on the stack.

```python
def pstack(msg):
    ...
```

The pstack function updates the screen.

```python
def loop():
    ...
```

The loop function runs continuously, waiting for key to be entered. Some keys are processed specially (like the digits, "./E", backspace, and enter/dup), other keys are handled by looking up the operation in `ops`.

### Adding new functions

To add a new function, you will need several things:

- The implementation of the mathematical function. This can be a function that you write, but for this example we will use the existing function `Decimal.log10`
- The physical key location you choose for the function. Let's choose the ALT function of the key that is normally "+"
- The character you use to represent it. Let's choose "O" (capital Oscar), perhaps standing for the "o" of **log10** but mostly because it is not used yet.
- The arity of the function. **log10** takes a single number (x), so its arity is 1

With all these pieces of information, we can start to modify the code. First, we have to modify the keymap, called **layers** :

```python
layers = (
    (
        ('^', 'l', 'r', LS1),
        ('s', 'c', 't', '/'),
        ('7', '8', '9', '*'),
        ('4', '5', '6', '-'),
        ('1', '2', '3', '+'),
        ('0', '.',  BS,  CR)
    ),

    (
        ('v', 'L', 'R', LL0),
        ('S', 'C', 'T', 'N'),
        ( '',  '',  '',  ''),
        ( '',  '',  '', 'n'),
        ( '',  '',  '', 'O'), # modify this line, changing '' to 'O'
        ('=', '@',  BS, '~')
    ),
)
```

Next, add `'O': Decimal.log10,` to `ops`:

```python
ops = {
    'O': (1, Decimal.log10),   # Add this line
    '\'': (1, lambda x: -x),
    ...                        # Keep the other lines as-is
}
```

When you save the file, CircuitPython will automatically restart. Type "1000 ALT +" and you should see the result "3", because **1000=10^3**.

Here are some other ideas about functions to add to the calculator:

- Unit conversions like inches to millimeters
- Constants like π or e. π can be computed as `Decimal('1').atan() * 4`, and e can be computed as `Decimal('1').exp()`
- Engineering functions, statistical functions, etc

## Other ideas for customization and improvement

- The Feather nRF52840 can also act as a BLE (bluetooth) keyboard. Convert the calculator to run from a rechargeable battery and make it paste over Bluetooth instead of or in addition to USB.
- Using the jepler\_udecimal library, implement a standard "infix" calculator instead.
- Add the ability to enter a formula from the keypad and create a CircuitPython graphing calculator


## Featured Products

### Adafruit SHARP Memory Display Breakout - 2.7" 400x240 Monochrome

[Adafruit SHARP Memory Display Breakout - 2.7" 400x240 Monochrome](https://www.adafruit.com/product/4694)
The **Adafruit** &nbsp; **2.7" 400x240 SHARP Memory Display Breakout** &nbsp;is a chonky cross between an eInk (e-paper) display and an LCD. It has the ultra-low power usage of eInk and the fast-refresh rates of an LCD. This model has a gray background, and the...

Out of Stock
[Buy Now](https://www.adafruit.com/product/4694)
[Related Guides to the Product](https://learn.adafruit.com/products/4694/guides)
### Adafruit Feather nRF52840 Express

[Adafruit Feather nRF52840 Express](https://www.adafruit.com/product/4062)
The **Adafruit Feather nRF52840 Express** is the new Feather family member with Bluetooth® Low Energy and _native USB support_ featuring the nRF52840!&nbsp; It's our take on an 'all-in-one' Arduino-compatible + Bluetooth® Low Energy with built-in USB...

Out of Stock
[Buy Now](https://www.adafruit.com/product/4062)
[Related Guides to the Product](https://learn.adafruit.com/products/4062/guides)
### Colorful 12mm Square Tactile Button Switch Assortment - 15 pack

[Colorful 12mm Square Tactile Button Switch Assortment - 15 pack](https://www.adafruit.com/product/1010)
Little clicky switches are standard input "buttons" on electronic projects. These work best in a PCB but [can be used on a solderless breadboard as shown in this tutorial](http://www.ladyada.net/learn/arduino/lesson5.html). The pins are normally open (disconnected) and...

In Stock
[Buy Now](https://www.adafruit.com/product/1010)
[Related Guides to the Product](https://learn.adafruit.com/products/1010/guides)
### Bakelite Universal Perfboard Plates - Pack of 10

[Bakelite Universal Perfboard Plates - Pack of 10](https://www.adafruit.com/product/2670)
Make your next project as you imagine it with&nbsp;prototyping perfboards that can easily be cut with scissors like these **Bakelite Universal Perfboard Plates**!

We wanted a perfboard&nbsp;that was both customizable and durable and <a...></a...>

In Stock
[Buy Now](https://www.adafruit.com/product/2670)
[Related Guides to the Product](https://learn.adafruit.com/products/2670/guides)
### Break-away 0.1" 36-pin strip right-angle male header (10 pack)

[Break-away 0.1" 36-pin strip right-angle male header (10 pack)](https://www.adafruit.com/product/1540)
Breakaway header is like the duct tape of electronics. Its great for connecting things together, soldering to perf-boards, fits into any breadboard, etc. We go through these guys real fast, and thought that given how handy they are, we'd offer them in a pack of ten!  
  
Each pack...

In Stock
[Buy Now](https://www.adafruit.com/product/1540)
[Related Guides to the Product](https://learn.adafruit.com/products/1540/guides)
### Premium Female/Female Jumper Wires - 20 x 3" (75mm)

[Premium Female/Female Jumper Wires - 20 x 3" (75mm)](https://www.adafruit.com/product/1951)
These female-female premium jumper wires are handy for making wire harnesses or jumpering between headers on PCB's. They're&nbsp;3" (75mm) long and come in a 'strip' of 20 (2 pieces of each of ten rainbow colors). They have 0.1" female header contacts on either end...

In Stock
[Buy Now](https://www.adafruit.com/product/1951)
[Related Guides to the Product](https://learn.adafruit.com/products/1951/guides)
### White Nylon Machine Screw and Stand-off Set – M2.5 Thread

[White Nylon Machine Screw and Stand-off Set – M2.5 Thread](https://www.adafruit.com/product/3658)
Totaling 420 pieces, this **White Nylon&nbsp;M2.5 Screw Set** &nbsp;is a must-have smörgåsbord for your workstation.&nbsp;You'll have more than enough screws, nuts, and hex standoffs to construct&nbsp;your maker projects&nbsp;for days on end! M2.5 screws fit nearly...

In Stock
[Buy Now](https://www.adafruit.com/product/3658)
[Related Guides to the Product](https://learn.adafruit.com/products/3658/guides)
### Hook-up Wire Spool Set - 22AWG Solid Core - 6 x 25 ft

[Hook-up Wire Spool Set - 22AWG Solid Core - 6 x 25 ft](https://www.adafruit.com/product/1311)
Perfect for bread-boarding, free wiring, etc. This box contains 6 spools of solid-core wire. The wire is easy to solder to and when bent it keeps its shape pretty well. We like to have a few spools of this stuff around which is why this set is quite nice! We suggest picking up wire strippers...

In Stock
[Buy Now](https://www.adafruit.com/product/1311)
[Related Guides to the Product](https://learn.adafruit.com/products/1311/guides)

## Related Guides

- [Introducing the Adafruit nRF52840 Feather](https://learn.adafruit.com/introducing-the-adafruit-nrf52840-feather.md)
- [Doomscroll and Chill - A Wireless BLE Scroll Wheel Remote](https://learn.adafruit.com/doomscroll-and-chill-wireless-ble-scroll-wheel-rotary-encoder-remote.md)
- [CircuitPython BLE Libraries on Any Computer](https://learn.adafruit.com/circuitpython-ble-libraries-on-any-computer.md)
- [Introducing Adafruit Feather](https://learn.adafruit.com/adafruit-feather.md)
- [A CircuitPython BLE Remote Control On/Off Switch](https://learn.adafruit.com/circuitpython-ble-remote-control-on-off.md)
- [All the Internet of Things - Episode Four: Adafruit IO](https://learn.adafruit.com/all-the-internet-of-things-episode-four-adafruit-io.md)
- [CircuitPython 101: State Machines, Two Ways](https://learn.adafruit.com/circuitpython-101-state-machines.md)
- [Getting Started with CircuitPython and Bluetooth Low Energy](https://learn.adafruit.com/circuitpython-nrf52840.md)
- [BLE HID Keyboard Buttons with CircuitPython](https://learn.adafruit.com/ble-hid-keyboard-buttons-with-circuitpython.md)
- [BLE Vibration Bracelet](https://learn.adafruit.com/ble-vibration-bracelet.md)
- [CircusPython: Jump through Hoops with CircuitPython Bluetooth LE](https://learn.adafruit.com/circuspython-jump-through-hoops-with-bluetooth-le.md)
- [Bluefruit Ouija Board](https://learn.adafruit.com/bluefruit-ouija-board.md)
- [BLE Light Switch with Feather nRF52840 and Crickit](https://learn.adafruit.com/bluetooth-light-switch-with-crickit-and-nrf52840.md)
- [Wearable Continuous Temperature Monitor with Adafruit IO](https://learn.adafruit.com/wearable-temperature-monitor.md)
- [Busy Box Interruption Sign](https://learn.adafruit.com/busy-box-interruption-sign.md)
