Adafruit CircuitPython Libraries and Jupyter Notebook User Manual

CircuitPython Libraries and Jupyter Notebook on any Computer with
MCP2221
Created by Brent Rubell
Last updated on 2021-03-26 10:16:02 AM EDT
2 3
3 3 4
4
4
5 6
6 6 6 8 9 9
10
11 12
15
17 17 19
20
Guide Contents
Guide Contents Overview
MCP2221 CircuitPython Libraries on your Computer Jupyter Notebook
Jupyter Notebook is an open-source web application that allows you to create and share documents that contain live code, equations, visualizations and narrative text.
Parts
Materials Installing Anaconda
Set up MCP2221 Install Anaconda Launching Jupyter Notebook Code Usage Error: Board not supported None Error: BLINKA_MCP2221 environment variable set, but no MCP2221 device found
Jupyter Notebook Examples
Compatibility with FT232H
Temperature
Wiring Code Walkthrough
Accelerometer
Wiring
Code Usage
Increasing the Number of Sensor Readings Code Walkthrough About Notebook Performance
Thermal Camera Wiring
Code Usage
© Adafruit Industries
https://learn.adafruit.com/jupyter-on-any-computer-with-circuitpython-libraries-and-
mcp2221
Page 2 of 23
Overview
This guide will show you how to use Jupyter Notebook with the MCP2221(A) to connect I2C sensors from your desktop PC running Windows, macOS or Linux . You can use any CircuitPython library for any of our I2C sensors to stream data into your computer's USB port.
We've written three interactive Jupyter Notebooks for three different types of sensors - a temperature sensor, an accelerometer and a thermal camera. All of these notebooks have animated graphs so you can see data streaming into your computer in
real-time
.
This guide is also compatible with the Adafruit FT232H breakout (https://adafru.it/xhf) (EXCEPT for the MLX thermal camera example). You'll need to make a small adjustment to the code. See the Jupyter Notebook Examples page for more information (https://adafru.it/HMf).
MCP2221
Our MCP2221A breakout board (https://adafru.it/HMA) allows your computer to talk to sensors or devices that use I2C or analog/digital GPIO.
There's no firmware to deal with, so you don't have to deal with how to "send data to and from an Arduino which is then sent to and from" an electronic sensor or display or part.
This board is plug & play compatible with with all of our Stemma QT/Qwiic connector
sensors with no soldering required (https://adafru.it/HMB).
CircuitPython Libraries on your Computer
In this guide we will not be using the actual CircuitPython firmware. But we will be installing and using CircuitPython Libraries on your Computer. This allows us to interface with a growing collection of 200+ libraries and drivers.
For more information about how this works, check out the CircuitPython Libraries on MCP2221 Guide here... (https://adafru.it/HMC)
Jupyter Notebook
Jupyter Notebook is an open-source web application that allows you to create and share documents that contain live code, equations, visualizations and narrative text.
You'll use Jupyter to create interactive notebooks containing live code which interfaces with your MCP2221 and sensors.
Parts
Your browser does not support the video tag. Adafruit MCP2221A Breakout - General Purpose USB to GPIO ADC I2C
Wouldn't it be cool to drive a tiny OLED display, read a Out of Stock
Out of
Stock
© Adafruit Industries
https://learn.adafruit.com/jupyter-on-any-computer-with-circuitpython-libraries-and-
mcp2221
Page 3 of 23
Adafruit PCT2075 Temperature Sensor - STEMMA QT / Qwiic
The Adafruit PCT2075 Temperature Sensor is a 'code compatible' drop-in replacement for a very... $4.95 In Stock
Your browser does not support the video tag. Adafruit LSM6DSOX 6 DoF Accelerometer and Gyroscope
Behold, the ST LSM6DSOX: The latest in a long line of quality Accelerometer+Gyroscope 6-DOF IMUs from ST.This IMU sensor has 6 degrees of freedom - 3 degrees each of linear... $11.95 In Stock
Your browser does not support the video tag. Adafruit MLX90640 24x32 IR Thermal Camera Breakout
You can now add affordable heat-vision to your project and with an Adafruit MLX90640 Thermal Camera Breakout. This sensor contains a 24x32 array of IR thermal sensors. When connected... Out of Stock
Materials
The MCP2221A has a USB-C connector, make sure you pick up the correct cable or adapter for your computer.
1 x USB C to USB C Cable, 1 meter USB C to USB C Cable - USB 3.1 Gen 4 with E-Mark - 1 meter long
1 x Micro B USB to USB C Adapter Micro B USB to USB C Adapter
The sensors we selected for this guide can be used with a STEMMA QT cable so you can plug-and-play with the MCP2221's STEMMA QT port.
1 x STEMMA QT Cable, 50mm STEMMA QT / Qwiic JST SH 4-Pin Cable - 50mm Long
1 x STEMMA QT Cable, 100mm STEMMA QT / Qwiic JST SH 4-pin Cable - 100mm Long
1 x STEMMA QT Cable, 200mm STEMMA QT / Qwiic JST SH 4-Pin Cable - 200mm Long
1 x STEMMA QT to Male Headers Cable, 150mm STEMMA QT / Qwiic JST SH 4-pin to Premium Male Headers Cable - 150mm Long
Add to Cart
Add to Cart
Out of
Stock
Add to Cart
Add to Cart
Add to Cart
Add to Cart
Add to Cart
Out of
Stock
© Adafruit Industries
https://learn.adafruit.com/jupyter-on-any-computer-with-circuitpython-libraries-and-
mcp2221
Page 4 of 23
Installing Anaconda
Set up MCP2221
This guide assumes you've set up your computer to interface with the MCP2221. If you have not yet set up the MCP2221 for your computer, click the link below and come back to this page once you have everything set up.
MCP2221 Setup Page (https://adafru.it/HMD)
Install Anaconda
If you're new to all this, the Jupyter Project recommends installing Anaconda (https://adafru.it/HME). This package installs the latest stable version of Python, Jupyter Notebook, and other commonly used packages for scientific computing and data science.
Navigate to the Anaconda downloads page (https://adafru.it/FrB), select your operating system , and download the installer including Python 3.7+.
Install the version of Anaconda you downloaded by following the executable's instructions.
Launching Jupyter Notebook
Once Anaconda is installed, open the Anaconda Navigator Application.
Under Jupyter Notebook, click Launch
We are using Jupyter Notebook for this guide. At the time of writing, Jupyter Lab has problems with displaying Matplotlib's interactive elements and real-time data animations and is not recommended for this guide.
Jupyter Notebook should open in a new web browser at the URL http://localhost:8888/notebooks (). To ensure you set up the MCP2221 correctly, we created a Jupyter Notebook.
Download all the notebooks required for this project by clicking
Download: Project ZIP
on the upper left hand side of the embedded preview below.
Once downloaded, unzip the file and keep it somewhere safe like on your desktop.
© Adafruit Industries
https://learn.adafruit.com/jupyter-on-any-computer-with-circuitpython-libraries-and-
mcp2221
Page 5 of 23
{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Python Software Package I nstallation\n", "import sys\n", "!{sys.executable} -m pip in stall adafruit-blinka adafruit-ci rcuitpython-msa301 hidapi" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Set an Environment Variab le so Adafruit Blinka knows we're using the MCP2221\n", "import os\n", "os.environ[\"BLINKA_MCP2221 \"] = \"1\"" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Attempt to import a Circu itPython Module\n", "import board" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python ", "pygments_lexer": "ipython3", "version": "3.7.4" } }, "nbformat": 4, "nbformat_minor": 2 }
© Adafruit Industries
https://learn.adafruit.com/jupyter-on-any-computer-with-circuitpython-libraries-and-
mcp2221
Page 6 of 23
From Jupyter, click the Upload button.
From your file browser, navigate to and select the MCP2221_Test.ipynb file.
The Jupyter notebook should appear in the file browser. Click upload.
Once the Jupyter Notebook has been successfully uploaded, it will show up in the file browser. Click MCP2221_Test.ipynb to launch the notebook.
Code Usage
Jupyter Notebooks are split into cells. Cells may contain code, images, equations or text. This example notebook only contains code cells.
The first code cell contains two lines. The first imports the sys module which imports functions that interact with the Python interpreter. The second line installs all the dependencies we need to use this notebook with the MCP2221, including adafruit-blinka and hardware support packages.
To execute this cell, click the first "cell" containing code. Click the run button to execute the code within the cell.
You should observe the output from the Python interpreter print out underneath the cell. Once complete, the cell should display a
[1]
next to it, indicating the interpreter has completed executing the cell.
© Adafruit Industries
https://learn.adafruit.com/jupyter-on-any-computer-with-circuitpython-libraries-and-
mcp2221
Page 7 of 23
The next cell will set an Environment Variable ( BLINKA_MCP2221 ) so Adafruit Blinka knows we're using the MCP2221 board. Click the cell to highlight it, then click the run button or press ctrl/cmd+enter to execute the code within the cell.
You should get no errors at all, in which case you can continue onto the examples!
Error: Board not supported None
If you get NotImplementedError: Board not supported None ,
That could mean you did not set the MCP2221 environmental variable or you don't have the latest Python libraries installed or the MCP2221 is not plugged in to USB.
Error: BLINKA_MCP2221 environment variable set, but no MCP2221 device found
If you get this error, check your USB cable - it could be that you have a charge-only not charge+sync cable. Your board may also be unplugged from USB.
© Adafruit Industries
https://learn.adafruit.com/jupyter-on-any-computer-with-circuitpython-libraries-and-
mcp2221
Page 8 of 23
Jupyter Notebook Examples
Now that you have Jupyter installed and Blinka set up on your computer, let's play around!
The following pages contain code examples as downloadable Jupyter notebooks. The examples use some popular sensors we have and should serve as a jumping off point for your experimentation.
If you're looking for
more sensors
- check out our growing range of plug-and-play STEMMA sensors here (https://adafru.it/HMF). Most of these have CircuitPython
libraries available and are compatible with this guide.
Make sure you've set the BLINKA_MCP2221 environment variable at the top of your Jupyter Notebooks!
Compatibility with FT232H
The notebooks in this guide are also compatible with the Adafruit FT232H breakout (https://adafru.it/xhf) and CircuitPython Libraries.
If you're using a FT232H breakout, make sure you change the BLINKA_MCP2221 environment variable to BLINKA_FT232H.
Read the learning system guide here to get set up with the FT232H and CircuitPython Libraries... (https://adafru.it/FWD)
© Adafruit Industries
https://learn.adafruit.com/jupyter-on-any-computer-with-circuitpython-libraries-and-
mcp2221
Page 9 of 23
Temperature
This example is a Jupyter notebook which graphs the current temperature using a PCT2075 (https://adafru.it/HDi) temperature sensor. The graph is updated in real-time with temperature values and we've added horizontal lines across the X-axis to show temperature maximum and minimum thresholds.
While this notebook is designed for the PCT2075 sensor, you can easily implement one of the many temperature sensors available on the Adafruit website. Be sure to check if it has a CircuitPython library first!
Adafruit PCT2075 Temperature Sensor - STEMMA QT / Qwiic
The Adafruit PCT2075 Temperature Sensor is a 'code compatible' drop-in replacement for a very... $4.95 In Stock
STEMMA QT / Qwiic JST SH 4-pin Cable - 100mm Long
This 4-wire cable is a little over 100mm / 4" long and fitted with JST-SH female 4-pin connectors on both ends. Compared with the chunkier JST-PH these are 1mm pitch instead of... $0.95 In Stock
Wiring
We'll be using the PCT2075 (https://adafru.it/HDi) sensor to precisely measure temperature. The MCP2221 and PCT2075 both have STEMMA QT connectors, so you can either wire it up on a breadboard or use a STEMMA QT cable.
Try to avoid hot plugging I2C sensors. The MCP2221 doesn't seem to like that. Remove USB power first.
Add to Cart
Add to Cart
© Adafruit Industries
https://learn.adafruit.com/jupyter-on-any-computer-with-circuitpython-libraries-and-
mcp2221
Page 10 of 23
Make the following connections between the MCP2221 and the PCT2075:
Board 3V to sensor VCC (red wire ) Board GND to sensor GND (black wire) Board SCL to sensor SCL (blue wire) Board SDA to sensor SDA (yellow wire)
Then, download the example notebook:
https://adafru.it/RnD
In the Jupyter file browser, click Upload. From the file browser, select the
PCT2075.ipynb example.
Click the Run button to execute the first cell. This cell will install the adafruit-circuitpython-pct2075 library required for this
example and set an environment variable so Blinka knows we're using the MCP2221
The next cell imports CircuitPython modules (such as board and busio ) and initializes the I2C connection with the sensor. To verify that your board is properly initialized, it will also print a temperature reading from the PCT2075.
Click the cell containing the code to graph the temperature sensor. The graph should update every 5 seconds with a new reading.
Code Walkthrough
Let's walk through this notebook, cell-by-cell, to understand how this code works.
First, we import all the required libraries for the notebook. We'll be using matplotlib to plot the temperature data from our sensor. We'll also invoke the special
%matplotlib notebook magic to tell matplotlib we're using a Jupyter notebook.
%matplotlib notebook from datetime import datetime import matplotlib.pyplot as plt from collections import deque from matplotlib.animation import FuncAnimation
Next we declare some constants like HISTORY_SIZE (how many sensor samples we're displaying on the graph), and INTERVAL (the graph's update interval, in
https://adafru.it/RnD
© Adafruit Industries
https://learn.adafruit.com/jupyter-on-any-computer-with-circuitpython-libraries-and-
mcp2221
Page 11 of 23
seconds). We'll also declare MAX_TEMP and MIN_TEMP which are used to generate horizontal lines across the x-axis for displaying the maximum and minimum temperature values.
# How many sensor samples we wan t to store HISTORY_SIZE = 100
# Graph update interval (in seco nds) INTERVAL = 5
# Maximum Temperature (in degree s C) MAX_TEMP = 30
# Minimum Temperature (in degree s C) MIN_TEMP = 10
Our code plots and displays 100 sensor readings at a time. We store these readings in a list-like object called a deque container datatype (https://adafru.it/HNa). If you've never seen this datatype before, don't worry - it's very similar to a list object except it's "optimized for fast fixed-length operations" and support a maxlen argument which sets the maximum possible size of a deque. When the deque grows beyond its maxlen size, it pops objects off of its opposite end (like a FIFO stack).
We use one deque to store sensor readings ( temp_data ) and another deque to store time-stamps ( x_time )
# Global x-axis array x_time = deque(maxlen=HISTORY_SI ZE)
# Temperature data temp_data = deque(maxlen=HISTORY _SIZE)
Next up, let's make a new plot and give it a title.
# Create new plot fig, ax = plt.subplots()
# Global title fig.suptitle("PCT2075 Temperatur e", fontsize=14)
In the animate method, we'll poll the temperature sensor and store it in the temp_data deque. Using the CPython datetime module, the code takes the current time and formats it using strftime for display on the x-axis as ticks.
# Read the temperature sensor an d add the value to the temp_data array temp_data.append(pct.temperature )
# Grab the datetime, auto-range based on length of accel_x array x_time.append(datetime.now().str ftime('%M:%S'))
The next chunk of code clears the axis, constrains the y-axis to display a maximum value of 50 degrees celsius and 0 degrees celsius. It also adds a descriptive label to the Y-Axis.
# Clear axis prior to plotting ax.cla()
# Constrain the Y-axis plt.ylim(top=50,bottom=0)
# Y-Axis label plt.ylabel('Temperature\n(c)')
We'll use the autofmt_date method to rotate and align the x-axis tick labels. Then, let's add a grid so we can see our data better.
fig.autofmt_xdate() ax.grid(True, linestyle=':', lin ewidth=0.5)
Next up, plot the temperature graph and two dotted horizontal lines across the x-axis to represent maximum and minimum temperature values.
# Add a horizontal minimum line across the X-axis plt.axhline(y=MAX_TEMP, color='r ', linestyle=':', label='Max. Tem perature')
# Add a horizontal maximum line across the X-axis plt.axhline(y=MIN_TEMP, color='b ', linestyle=':', label='Min. Tem perature')
Let's add a legend to the graph. This will make it easy to discern which line is which if we look back at it later, or if the notebook is shared with a colleague or friend.
Matplotlib's ax.legend() method automatically creates a legend for your graph, provided each plot has a label attached to it.
# Add a legend to the graph ax.legend()
We'll pause the plot's output for INTERVAL seconds
# Pause the plot for INTERVAL se conds plt.pause(INTERVAL)
Finally, this method "makes an animation by repeatedly calling a function", animate . We provide it the fig we generated earlier and the function we'd like to
© Adafruit Industries
https://learn.adafruit.com/jupyter-on-any-computer-with-circuitpython-libraries-and-
mcp2221
Page 12 of 23
animate.
ani = animation.FuncAnimation(fi g, animate)
© Adafruit Industries
https://learn.adafruit.com/jupyter-on-any-computer-with-circuitpython-libraries-and-
mcp2221
Page 13 of 23
Accelerometer
Wiring
We'll be using the LSM6DSOX sensor to precisely measure acceleration data (https://adafru.it/HNb). The MCP2221 and LSM6DSOX both have STEMMA QT connectors, so you can either wire it up on a breadboard or use a STEMMA QT cable.
Try to avoid hot plugging I2C sensors. The MCP2221 doesn't seem to like that. Remove USB power first.
Your browser does not support the video tag. Adafruit LSM6DSOX 6 DoF Accelerometer and Gyroscope
Behold, the ST LSM6DSOX: The latest in a long line of quality Accelerometer+Gyroscope 6-DOF IMUs from ST.This IMU sensor has 6 degrees of freedom - 3 degrees each of linear... $11.95 In Stock
STEMMA QT / Qwiic JST SH 4-pin Cable - 100mm Long
This 4-wire cable is a little over 100mm / 4" long and fitted with JST-SH female 4-pin connectors on both ends. Compared with the chunkier JST-PH these are 1mm pitch instead of... $0.95 In Stock
Make the following connections between the MCP2221 and the LSM6DSOX:
Board 3V to sensor VIN (red wire) Board GND to sensor GND (black wire) Board SCL to sensor SCL (yellow wire) Board SDA to sensor SDA (blue wire)
Then, download the example notebook:
https://adafru.it/RnE
Code Usage
In the Jupyter file browser, click Upload. From the file browser, select the
LSM6DSOX_Accel.ipynb example.
Add to Cart
Add to Cart
https://adafru.it/RnE
© Adafruit Industries
https://learn.adafruit.com/jupyter-on-any-computer-with-circuitpython-libraries-and-
mcp2221
Page 14 of 23
Click the Run button to
execute the first cell. This cell installs the required libraries for using this notebook.
This cell installs the adafruit-
circuitpython­lsm6dsox library
for interfacing with the LSM303 sensor .
This cell also installs a Jupyter Extension,
ipympl . This
extension makes it possible for us to create interactive Matplotlib graphs from within a Jupyter notebook.
The next cell sets an environment variable so Blinka knows we're using the MCP2221.
Then, it imports CircuitPython libraries and initializes the I2C connection with the sensor.
The next cell imports CircuitPython modules (such as board and busio ) and initializes the i2c connection with the sensor. To verify that your board is properly initialized, it should also values form the LSM6DSOX's acceleration sensor.
The next cell sets an environment variable so Blinka knows we're using the MCP2221.
Then, it imports CircuitPython modules (such as board and busio ) and initializes the i2c connection with the sensor. To verify that your board is properly initialized, it should also print values from the LSM6DSOX acceleration sensor.
If you receive an error with the board module, make sure your MCP2221 is plugged into a usb port on your computer.
The third code cell uses Matplotlib to generate a graph for the LSM6DSOX's acceleration data. We used three side-by-side subplots to visualize the X, Y, and Z axis.
© Adafruit Industries
https://learn.adafruit.com/jupyter-on-any-computer-with-circuitpython-libraries-and-
mcp2221
Page 15 of 23
Increasing the Number of Sensor Readings
By default, this code cell only displays 20 sensor readings. If you want to display more sensor readings on your graph, simply change the value of the
HISTORY_SIZE variable in the code cell and re-run it.
For more information about how this code cell works, read on!
Code Walkthrough
First, we import all required libraries for this code cell. Most of the libraries come from the Matplotlib library. We use this library to plot the data obtained by our sensor.
%matplotlib notebook import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation import datetime import matplotlib.dates as mdate s from collections import deque
Our code only plots and displays 20 sensor readings at a time. We store these readings in a list-like object called a deque container
datatype (https://adafru.it/HNa). If you've never seen this datatype before, don't worry - it's very similar to a list object except it's "optimized for fast fixed-length
operations" and support a maxlen argument which sets the maximum possible size of a deque. When the deque grows beyond its maxlen size, it pops objects off of its opposite end (like a FIFO stack).
We'll be using four deque objects to represent the x-axis, the first graph's y-axis (accelerometer's x-axis data), the second graph's y-axis (accelerometer's y-axis data), and the third graph's y-axis (accelerometer's y-axis data). These deque objects use HISTORY_SIZE as the deque's maxlen . You may increase the amount of data to display on the graph by increasing HISTORY_SIZE .
# Deque for X-Axis (time) x_vals = deque(maxlen=HISTORY_SI ZE)
# Deque for Y-Axis (acceleromete r readings) accel_x = deque(maxlen=HISTORY_S IZE) accel_y = deque(maxlen=HISTORY_S IZE) accel_z = deque(maxlen=HISTORY_S IZE)
Next, we'll create three side-by-side sub-plots and call tight_layout to adjust the subplot parameters to give nicer padding between examples.
For more information about spacing matplotlib subplots, check out this guide... (https://adafru.it/HNc)
# Create 3 side-by-side subplots fig, (ax1, ax2, ax3) = plt.subpl ots(1,3)
# Automatically adjust subplot p arameters for nicer padding betwe en plots plt.tight_layout()
Let's now take a look at the animate method. This method polls the LSM303's acceleration values and stores them in a tuple named accel_data . Next, the code appends the values from the tuple to deque objects, accel_x , accel_y , accel_z .
def animate(i): # Poll the LSM303AGR accel_data = accel.accelerat ion # Add the X/Y/Z values to th e accel arrays accel_x.append(accel_data[0] ) accel_y.append(accel_data[1] ) accel_z.append(accel_data[2] )
We grab the current time (in seconds using CPython's datetime module) and store it in a deque, x_vals .
# Grab the datetime, auto-range based on length of accel_x array x_vals = [datetime.datetime.now( ) + datetime.timedelta(seconds=i) for i in range(len(accel_x))]
Now we're up to the fun part of this code walkthrough - displaying the graphs. Since we're "animating" the graph, the axis will need to be cleared and re-drawn each time the animate method runs. Let's clear the three axis, set up grid titles and enable grid lines.
© Adafruit Industries
https://learn.adafruit.com/jupyter-on-any-computer-with-circuitpython-libraries-and-
mcp2221
Page 16 of 23
# Clear all axis ax1.cla() ax2.cla() ax3.cla()
# Set grid titles ax1.set_title('X', fontsize=10) ax2.set_title('Y', fontsize=10) ax3.set_title('Z', fontsize=10)
# Enable subplot grid lines ax1.grid(True, linewidth=0.5, li nestyle=':') ax2.grid(True, linewidth=0.5, li nestyle=':') ax3.grid(True, linewidth=0.5, li nestyle=':')
Since we are displaying a large amount of data on the x-axis, we'll use Matplotlib's autofmt_xdate()
method (https://adafru.it/HNd) to automatically align and roate the x-axis labels.
The first image on the left shows this code without a call to autofmt_xdate while the second image shows a nicely formatted graph.
Pretty neat, right
Finally, we'll display the sub-plots on the figure by calling ax.plot and specifying the x-axis and y-axis deques. We'll also specify different colors for each graphs to help us visually identify the sub-graphs.
# Display the sub-plots ax1.plot(x_vals, accel_x, color= 'r') ax2.plot(x_vals, accel_y, color= 'g') ax3.plot(x_vals, accel_z, color= 'b')
Finally, we'll pause the plot's drawing for INTERVAL seconds.
# Pause the plot for INTERVAL se conds plt.pause(INTERVAL)
About Notebook Performance
Computers with less available resources will render choppy graphs. For reference, all GIFs in this guide were rendered on a computer with a 2.6GHz i7 and 32GB of RAM.
We can increase the INTERVAL , keeping in mind two things:
1. USB is limited to one transaction per millisecond
2. We are displaying HISTORY_SIZE samples at a time. You may want to decrease the number of samples displayed on the graph for better performance.
This method "makes an animation by repeatedly calling a function", animate . We provide it the figure we generated earlier and the function we'd like to animate.
© Adafruit Industries
https://learn.adafruit.com/jupyter-on-any-computer-with-circuitpython-libraries-and-
mcp2221
Page 17 of 23
# Update graph every 125ms ani = FuncAnimation(fig, animate )
© Adafruit Industries
https://learn.adafruit.com/jupyter-on-any-computer-with-circuitpython-libraries-and-
mcp2221
Page 18 of 23
Thermal Camera Wiring
We'll be using the MLX90640 IR Thermal Camera Breakout (https://adafru.it/HNe) to display an animated image comprised of thermal data to our notebook.
This breakout contains a 24x32 array of IR thermal sensors. When it's connected to the MCP2221, it returns an array of 768 individual infrared temperature readings over I2C. We'll read these values, manipulate, and display them in our Jupyter Notebook.
The MCP2221 and MLX90640 (https://adafru.it/HNe) both have STEMMA QT connectors, so you can either wire it up on a breadboard or use a STEMMA QT cable.
Your browser does not support the video tag. Adafruit MLX90640 24x32 IR Thermal Camera Breakout
You can now add affordable heat-vision to your project and with an Adafruit MLX90640 Thermal Camera Breakout. This sensor contains a 24x32 array of IR thermal sensors. When connected... Out of Stock
STEMMA QT / Qwiic JST SH 4-pin Cable - 100mm Long
This 4-wire cable is a little over 100mm / 4" long and fitted with JST-SH female 4-pin connectors on both ends. Compared with the chunkier JST-PH these are 1mm pitch instead of... $0.95 In Stock
Then, download the example Jupyter notebook:
https://adafru.it/RnF
Code Usage
In the Jupyter file browser, click Upload. From the file browser, select the MLX90640 Thermal Camera.ipynb
example.
Click the Run button to execute the first cell. This cell first sets an environment
variable so Blinka knows we're using the MCP2221 sensor.
Then, it installs the adafruit-circuitpython-mlx90 640 library for interfacing with the thermal camera breakout .
Out of
Stock
Add to Cart
https://adafru.it/RnF
© Adafruit Industries
https://learn.adafruit.com/jupyter-on-any-computer-with-circuitpython-libraries-and-
mcp2221
Page 19 of 23
The next code cell imports CircuitPython libraries such as board , busio , and
adafruit_mlx90640 . Then, it initializes an I2C connection with the sensor and
creates a mlx object.
We also set the refresh rate to 1HZ for this notebook.
Before continuing, make sure your code prints the MLX was found on I2C.
If it the MCP2221 was unable to detect the MLX breakout, unplug the sensor and plug it back in. Then, restart the Jupyter kernel by clicking Kernel->Restart.
Click run on the next cell . This cell reads data from the thermal camera and splits it into a 32x24 array of thermal readings. We're using the numpy
package (https://adafru.it/HNf) so we can do perform fast manipulations to the data within the array.
The next cell plots the data read from the previous cell. Click run to see a heatmap of your data .
This sensor reads the data
twice per frame
, in a checker-board pattern, so it's normal to see a checker-board dither effect when moving the sensor around - the
effect isn't noticable when things move slowly.
The final cell in this notebook produces a live heat-map from your thermal camera. Point the camera towards yourself and click run.
Note: This GIF has been sped up (2x), we suggest moving
very
slowly to avoid a dithering effect.
© Adafruit Industries
https://learn.adafruit.com/jupyter-on-any-computer-with-circuitpython-libraries-and-
mcp2221
Page 20 of 23
© Adafruit Industries
https://learn.adafruit.com/jupyter-on-any-computer-with-circuitpython-libraries-and-
mcp2221
Page 21 of 23
© Adafruit Industries
https://learn.adafruit.com/jupyter-on-any-computer-with-circuitpython-libraries-and-
mcp2221
Page 22 of 23
© Adafruit Industries Last Updated: 2021-03-26 10:16:02 AM EDT Page 23 of 23
Loading...