building python 3.10.1 on jetpack 4.5.1 and the jetson xavier nx

This is a follow-up to my last Python build and installation back in February ( https://arcanesciencelab.wordpress.com/2021/02/14/building-python-3-9-1-on-jetpack-4-5-and-the-jetson-xavier-nx/ ). That post has all the directions for setting up a build environment including installation of all packages. This time I downloaded the source to Python 3.10.1, unpacked it, and built it. I then performed an alt-install as before. Everything went well until the very end, when the alt-install process spit this out (see all the highlighted lines):

WARNING: Value for scheme.headers does not match. Please report this to <https://github.com/pypa/pip/issues/10151>
distutils: /usr/local/include/python3.10/UNKNOWN
sysconfig: /ssd/jetson/Python-3.10.1/Include/UNKNOWN
WARNING: Additional context:
user = False
home = None
root = '/'
prefix = None
Looking in links: /tmp/tmplaxd5qzj
Processing /tmp/tmplaxd5qzj/setuptools-58.1.0-py3-none-any.whl
Processing /tmp/tmplaxd5qzj/pip-21.2.4-py3-none-any.whl
Installing collected packages: setuptools, pip
  WARNING: Value for scheme.headers does not match. Please report this to <https://github.com/pypa/pip/issues/10151>
  distutils: /usr/local/include/python3.10/setuptools
  sysconfig: /ssd/jetson/Python-3.10.1/Include/setuptools
  WARNING: Value for scheme.headers does not match. Please report this to <https://github.com/pypa/pip/issues/10151>
  distutils: /usr/local/include/python3.10/pip
  sysconfig: /ssd/jetson/Python-3.10.1/Include/pip
Successfully installed pip-21.2.4 setuptools-58.1.0
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv

I have never had a problem before now, and I suspect it’s all to do with Python 3.10. I went looking for an explanation and fix ( see https://stackoverflow.com/questions/67244301/warning-value-for-scheme-data-does-not-match-when-i-try-to-update-pip-or-inst for example), but the explanation(s) are confusing, with the general consensus as “don’t worry about it.” Which I consider crap.

So far 3.10.1 seems to work, with one notable exception: you can’t install PyQt6, as there is no qt6-default support package, and PyQt6 won’t build without it. You’re thus stuck with PyQt5.

Determining Various Version Numbers

This section is primarily for me to remember for the future. I’m tired of looking it up.

To determine what version of Ubuntu you’re running:

$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="18.04.6 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.6 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
$

To determine what version of Jetpack you’re running:

$ sudo apt-cache show nvidia-jetpack
Package: nvidia-jetpack
Version: 4.5.1-b17
Architecture: arm64
Maintainer: NVIDIA Corporation
...

 

bringing up an adafruit stm32f405 feather express

Adafruit STM32F405

I purchased an Adafruit STM32F405 Feather ( https://www.adafruit.com/product/4382 ). I purchased it because it has an STM32, a SoC built around an ARM M4 with hardware floating point, clocked at 168MHz. You can check the full specs on the provided link. Because it’s an Express board, it will run Adafruit’s Circuit Python ( https://github.com/adafruit/circuitpython ), Adafruit’s fork of MicroPython ( http://micropython.org ). In this post I’m going to install the latest version of Circuit Python (as of the date of this post) on the Feather and test it with a simple Python application that flashes the on-board NeoPixel different colors.

All of this is hosted on a 2020 M1 13″ MacBook Pro running macOS Monterey version 12.0.1.

We’ll start by installing a helper application that will program the STM32 with the Circuit Python binary. I’ll use Homebrew ( https://brew.sh ) to install dfu-util (brew install dfu-util). I’ll then go to https://circuitpython.org/board/feather_stm32f405_express/ and download the latest version of Circuit Python, which as of right now is 7.0.0.  Save it somewhere you will remember for later. The file I downloaded was adafruit-circuitpython-feather_stm32f405_express-en_US-7.0.0.bin

Plug the Feather into one of the Mac’s USB-C ports. You’ll need a USB-C to USB-C cable for this; the STM32 Feather (finally!) is equipped with USB-C instead of micro USB.

Take a wire and connect the B0 pin to 3.3V (see image below). This is the bootloader wire. Press the reset key to put the Feather into bootloader mode.

On your host computer open a shell. I use iTerm which in turn uses zsh, the shell for macOS. Change directory to where you stored the downloaded binary (bin) file and use dfu-util to program the Feather with this file. Execute the following:

dfu-util -a 0 --dfuse-address 0x08000000 -D adafruit-circuitpython-feather_stm32f405_express-en_US-7.0.0.bin

When Feather programming finishes, unplug the Feather from USB-C, remove the bootloader wire, and reconnect the Feather. The Feather will now appear as a flash device on the Mac and it will execute Circuit Python programs stored on the flash device. What follows is the Feather’s flash filesystem:


When first booted after the initial Circuit Python programming, there is no file in the lib folder. You’ll need to add this yourself. Go to https://github.com/adafruit/Adafruit_CircuitPython_NeoPixel and download, from releases, adafruit-circuitpython-neopixel-7.x-mpy-6.2.3.zip. Unzip this file and look for lib/neopixel.mpy. Drag neopixel.mpy into the Feather’s lib directory, so that it looks like the image above.

Test Code

Using the code editor of your choice, open the file code.py on the Feather and delete everything you find. Then copy and paste the following:

import time
import board
import neopixel

neopixel = neopixel.NeoPixel(
    board.NEOPIXEL, 1, brightness=0.2, auto_write=False, pixel_order=neopixel.GRB
)

while True:
    neopixel.fill((64,0,0)) # red
    neopixel.show()
    time.sleep(1)

    neopixel.fill((0,64,0)) # green
    neopixel.show()
    time.sleep(1)

    neopixel.fill((0,0,64)) # blue
    neopixel.show()
    time.sleep(1)

    neopixel.fill((64,16,0)) # orange
    neopixel.show()
    time.sleep(1)

    neopixel.fill((0,32,32)) # cyan
    neopixel.show()
    time.sleep(1)

    neopixel.fill((0,0,0)) # black
    neopixel.show()
    time.sleep(5)

All you have to do is save the file, and the Feather will start to execute it immediately.