NVM : Non Volatile Memory

Not much to show this week from Phil, he’s been getting deep into learning more about OOP in Python, and running into several problems that led him to more exploration, experimentation & fails (so, as we said, not much to show). He also sadly lost his 22 year old cat “Link” this week…

He did however, last week get into “NVM” (Non Volatile Memory) – A very elegant way of writing data to the Pico, so you can save info & recall it when the Pico Starts up again… We had tried using it for the Dinky OSC, but the older versions of CircuitPython didn’t support it, or at least were buggy with the ability to save without hanging the Pico (and forcing “Nuke ReFlashes!”).

Martin had read on the fantastic CircuitPython discord channel that the NVM issues had been addressed in the latest version. And so Phil re-opened his exploration of the use of NVM on a Pico… Phil did a quick search on discord & found :


“you might want to look into foamyguy’s NVM helper in the community bundle https://github.com/FoamyGuy/Foamyguy_CircuitPython_nvm_helper

Phil followed the link, downloaded the library from FoamyGuy and within minutes, had a fully working, easily updateable way of reading & writing info to NVM ! Like a dream you can save a dictionary via NVM_helper & all the byte conversions are sorted in that amazing script… So! Phil is back on track to keep track of the digital Tree , so we can implement the Real Time Clock & apply the effect of time to the tree depending on how often the tree is watered & fed & given sunlight! We will then hopefully see the fully working Tamagochi-esque digital tree…

Week 9 : Adding a Real time clock to a Raspberry Pico

For our new project we think at some point we are going to need to have an accurate measure of time that has passed and for this we will need a real time clock.

For our new project we think at some point we are going to need to have an accurate measure of time that has passed and for this we will need a real time clock.

The Pico doesn’t have it’s own clock, and for that matter non of the Raspberry Pi family do, a quick google search revealed a few different boards that could offer this facility.

I decided to go with one that was based on a DS1307 and communicated via I2C. I ordered three of them from Amazon at a cost of £4.99. They arrived complete with installed batteries, with a claimed running time of a few years which would be more than enough for our project.

DS1307 Module

Another Google search was undertaken to find out how to connect them to a Raspberry Pi Pico. Most articles suggested that they were primarily a 5V device as they were originally designed for use with an Arduino and so would need to have two pull-up resistors moved from the board for use with the 3.3V system of the Pico. The resistors are R2 and R3 in the above image. The boards also needed to have headers installed.


Only four connections were needed:
GND: Ground
VCC: 3.3V

Luckily CircuitPython has a library for use with the DS1307, complete with an example code listing.

I installed the required libraries and ran the example code. An error came up complaining about a lack of pull-up resistors.

Martin’s RTC Set up with Resistors…

I installed a couple of resistors, anything around 3.3k should be fine, between the SDA/SCL pins and VCC (3.3V) and ran the code again.

This time there were no errors. The code, see below, has a part where you can set the time by changing the ‘if False’ statement to ‘if True’. Once this has been done change it back to False. The RTC clock will continue to keep the time even after the Pico has been powered off.

Code listing

import time
import board
import adafruit_ds1307

# To create I2C bus on specific pins
import busio
i2c = busio.I2C(board.GP1, board.GP0)    # Pi Pico RP2040

rtc = adafruit_ds1307.DS1307(i2c)

# Lookup table for names of days (nicer printing).
days = ("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday")

if False:  # change to True if you want to set the time!
    #                     year, mon, date, hour, min, sec, wday, yday, isdst
    t = time.struct_time((2022, 5, 6, 15, 2, 15, 5, -1, -1))
    # you must set year, mon, date, hour, min, sec and weekday
    # yearday is not supported, isdst can be set but we don't do anything with it at this time
    print("Setting time to:", t)  # uncomment for debugging
    rtc.datetime = t
# pylint: enable-msg=using-constant-test

# Main loop:
while True:
    t = rtc.datetime
    # print(t)     # uncomment for debugging
        "The date is {} {}/{}/{}".format(
            days[int(t.tm_wday)], t.tm_mday, t.tm_mon, t.tm_year
    print("The time is {}:{:02}:{:02}".format(t.tm_hour, t.tm_min, t.tm_sec))
    time.sleep(1)  # wait a second
Readouts from the RTC


After doing this I realised that because I was connected to pin 36 (3V3 out) that I hadn’t actually needed to remove the on board resistors and wouldn’t need the added pull-up resistors either.

I soldered headers to the remaining two boards to test that I was correct and indeed I was. So we now have three working realtime clocks, but one of them needs pull-up resistors.

Week 8/9 : Oop Tree

Object Orientated Programming in CircuitPython to make Digital Trees

We think we’ve taken the Asteroids development as far as we can just now (looking at speeding up the FFT calculations)… but, in the mean time, Phil has started re-visiting an old passion… OOP Trees!

Object Orientated Programming in CircuitPython to make Digital Trees… Phil used to play with Macromedia Director 8 / 8.5 (!) and made some digital trees. Phil’s had an idea of re-visiting making OOP trees, but on the tiny Raspberry Pi Pico using CircuitPython…

Over 2 days, Phil’s successfully written a Tree Class, thinking of a tree as a series of “nodes” – He passed several key parameters to the Tree Class, an X,Y location, how many nodes the tree will have (“the Trunk”), how much those nodes can vary in direction from each other & how far they will be from each other. t = Tree() # Params cut out for ease here

Phil had a brainwave, to define all the lengths & angles “at the start” – and then “simply” multiply the values by a scale (from 0 to 1) – the “age” of the tree… so the entire tree is drawn but “scaled down” (to 0) at the start & in a loop, slowly increase the tree’s “age” by a tiny increment… giving the impression of growth! (it all worked smoothly! Not bad for a self taught N00B(!) – Phil’s sure there are probably a lot of pythonic conventions that need to be learned! ).

So, having a “working trunk” growing & stretching nicely, Phil wondered about adding branches… The thing is, they are nearly identical to a Trunk, just that the base of the 1st node isn’t “at a fixed point” (in the “ground”) – but a node on the Trunk (or even another Branch!). With a quick addition of “fNode” (“follow node”) – the Trunk having fNode = None & a branch having fNode = parentNode, he added in the code.py t.newBranch([2,3,3,4, 10]) The array passed, are positions of nodes in t (duplicates just add more branches to that node!). He even put in an error check to see if a node requested is in the range of the parent’s nodes! IT ALL WORKED! woohoo! The Branch grows just like the Trunk, but its base node follows the position of its parent node!

With the branches & trunk now growing nicely (and stopping growing when it reaches the scale of 1), Phil turned to add in leaves… a new Class “leaf” was added to the script & contains info of a colour of leaf, the radius of the leaf (using vectorIO.Circle objects) . Phil thought that the control of when / where & how many leaves appear should be decided by each node (on the trunk or branches). Passing several random numbers to determine how many, how big, how far away from the node they should be was passed in to the object. A few functions Phil’s made (“utility scripts”) like getting an X,Y position based on a known x,y position + length & angle (using Pythagoras) & adding a random range of R G B values to a “base R G B” colour to get variations of greens / browns (any colour!) – Phil rendered out leaves a hoy! But, things were slowing down again on the tiny Pico… So Phil decided to only render leaves when their parents reached specific criteria (age / length away from root) – and this gave a lovely effect of the leaves slowly blinking into existence, as the tree aged!

Phil was inspired & energised , getting into a “playful” development state…”I’ll try this!” he thought… boom! it works! And so, he added a few playful things, like a random “gust of wind” that jiggles the nodes occasionally, increasing & decreasing the scale quickly with the 2 buttons from week 1 … so many possibilities …

Anyway, if you want to have a play (& probably hone / improve the OOP!) download the scripts for the Pico set up here. Have fun!

Week 3/4 – CircularBar object with vectorIO

A slight “side track” to the flow of the project, but, Phil’s written a document about the “circular bar” graphic idea he had & some of the findings & thoughts as to how to make it better.

A slight “side track” to the flow of the project, but, Phil’s written a document about the “circular bar” graphic idea he had & some of the findings & thoughts as to how to make it better. Click here to download the PDF… This example requires some of the equipment featured above (OLEd screen) – but omits the mic / buttons for simplicity. The zip file of the code.py & libraries is here

Four “CircleBar” objects reacting to a generated angle value in CircuitPython

<EDIT> We’re super chuffed that we got featured in the Circuit Python newsletter </EDIT>

Week 3 : Adding a microphone

We are thinking that we could take the experiment into the realms of “playback / record” by adding a mic to the set up.

We are thinking that we could take the experiment into the realms of “playback / record” by adding a mic to the set up. There are several types of microphones to choose from, Martin started to use a 3 pinned MAX4466 mic, Phil used a 5 pinned Ada Fruit MAX9814 . Martin succinctly states:

“A microphone produces an analogue signal whereas the Pico needs a digital signal to work with. The RP2040 processor has four ‘analogue to digital’ converters, three of which are available on the Pico. An analogue to digital converter, ADC, converts the analogue signal to a digital signal that can be read by the Pico. The Pico ADC’s are 12 bit, returns a value between 0 and 4095. However CircuitPython is written to work across a number of devices and returns a 16 bit value, 0 – 65535”.

With these ranges in mind, Phil wrote the code to convert the mic signal into a range that displays a circle using vectorIO with a variable radius. Previously using circuitPython’s “displayIO shapes“, Phil found that it was difficult to change the size of a circle “on the fly” once a shape object had been created with displayIO. One of the great features of vectorIO is that “radius” is a mutable attribute (the value can be changed “on the fly”), so with a screen of 240 x 240 pixels, Phil placed the circle object in the centre of the screen & converted the mic input range to 0-120 px. After experimentation of what the actual values were for his MAX9814 Mic, Phil discovered that the “minimum” (at rest) was around 24,000 and the peak value was around 36000.

The code below is a very handy “mapping” function in python, we use it all the time in projects to convert a value from one range to the corresponding value in another range!

def mapFromTo(v, oldMin, oldMax, newMin, newMax):
   #v = passed value (should be inside the oldMin/oldMax range!)
   newV = (v-oldMin)/(oldMax-oldMin)*(newMax-newMin)+newMin
   return newV

Download Martin’s Week 3 pdf here

You can also download the zip of all the files needed for this week’s experiment here.

Week 2 – making & adding a speaker!

We love a bit of sound! So, we’ve decided to add a speaker to the Pico set up…

We love a bit of sound! So, we’ve decided to add a speaker to the Pico set up… But with the added fun of trying to make one from scratch!Martin’s DIY Speaker

Martin used some re-cycled motors for the insulated copper wire for the guts of a DIY Speaker & has had success! (all be it quiet, but, this project is about testing, trying, proof of concept etc)…

DIY Speaker!

For the full documentation, & Step By Step Guide on how to make a speaker from a cup & some old motor / electronic parts, download “week 2” pdf sheets, with code & materials lists etc.Phil’s Set up uses a bought speaker & Ada Fruit Amplifier

Weekly Electronics / Prototyping Project on Raspberry Pi Pico & Circuit Python!

We’ve started a “weekly project” – Trying to make an electronics prototype with a Raspberry Pi Pico + Supporting components using Ada Fruit’s Circuit Python…
We’ve created a page for it, but we’ll keep posting blogposts here as a way of documenting it …

Raspberry Pi Pico + Oled screen + buttons

Big Lottery funded DM CIC workshops start in Peterhead

We have been fortunate to be awarded a Big Lottery grant for 5 Driverless Car workshops in the North East of Scotland! We have arranged with Peterhead Academy & Inverurie Academy to start this term, Peterhead have an Afterschool Club for S2+ and We’ll be working with the Inverurie S3 Engineering class.

We’re running the Driverless Car workshop we piloted with Northfield Academy & Transition Extreme after school clubs (funded by ACC’s U-decide (participatory Budgeting)) – so a five week course, introducing the concepts of Machine Learning & Driverless Car technology.

Week one is always relaxed, fun & creative, with the teams creating their car chassis, camera mounts and raspberry pi placements. The Peterhead pupils were fantastic, engaged, entertained, interested, enthusiastic and inquisitive, all the attributes we love to see in innovators of tomorrow!

Below are a few photos from tonight’s session, we look forward to working with the class for the next 4 weeks!

If you’d like to know more about the Driverless Car workshop, want to get us into your school, or have any other questions about our STEAM activity, do email us! we’re getting busy!

Big thanks to the Big Lottery funding, it’s been invaluable! A lot of kids that wouldn’t usually get this type of STEAM education are now, thanks to this funding.

New Mission To Mars in Riverbank Primary School

Digital Maker CIC have started their 7 week course “Journey to Mars” in Riverbank Primary, Aberdeen.

We have previously run this workshop in St Peter’s, Woodside & Seaton Primary Schools, where pupils get hand on experience of electronics, computer programming, team work, design & engineering tasks, as well as experiencing critical & creative thinking, growth mindset, communication & problem solving.

The 7 weeks consist of, “scene setting”, where we discuss space travel, Scottish geography, NASA Mars exploration history, the solar system & anything the pupils bring up when shown the videos & images we bring. We then build a working Rover, working with CamJam robotics kits & laser cut PTFE chassis, the pupils have to construct & wire their robots from illustrations & trial & error. We love this task, as we see a lot of “Growth Mindset” creeping in, it always starts with “this is too difficult” to “yeah! look at our finished robot!”… emphasis on “trying” and making mistakes is key to our teaching philosophy. A lot of knowledge transfer can come form this task too, where pupils that complete the task early, ask to help others & show pitfalls & tips to complete their robots.

The following weeks, we design & build garages / habitats for our rovers from cardboard & MakeDo construction kits. We then explore making a simple program in a customised Blockly environment on the Raspberry PI to control the robot from a set start point to drive into the base, creating a repeatable algorithm. We learn about coordinates & instructions & what an algorithm is & does.

We then start introducing sensors & electronics to the kit, a line follower, an LED, a distance sensor… with around 4 weeks of deep learning & play / experimentation in using electronics & computer coding to control robotic tasks.

We have learned a lot ourselves when teaching this workshop & would like to thank all the schools that have had us so far, it’s really rewarding to see pupils surprising themselves with what they are capable of & enjoying challenging tasks.

Mission to Mars workshops

Digital Maker CIC have been working in some schools in Aberdeen, thanks to the Aberdeen City Council “U Decide” participatory funding we won last year.

We’ve just finished in Seaton & Woodside primary’s, running 7 week courses with the P6 & P7 themed around a “Mission to Mars”. During our time with the pupils, we’ve covered, Scottish Geography, Design, Electronics, Maths, Mapping, Engineering, Computing & Programming, pulling a wide range of skills & activities together, to create & manage working Rover (Robotics vehicles).

We’ve had fantastic feedback from the pupils & teachers. Below is a lovely testimonial from Ms Masters, P7 Teacher in Seaton.

I have loved having Awesome Tech in our class, and so have the children. They have helped teach skills such as resilience and applying a growth mindset, and there have been so many amazing ‘lightbulb’ moments! The children are applying skills and meeting outcomes that can be tricky for teachers to incorporate otherwise- and can be beyond our own subject knowledge! It has given confidence to pupils who find other areas of the curriculum challenging and allowed them to hone their skills in working as part of a team. It’s rare to have visitors who not only have such subject knowledge but are also so effective at working with children- my class think Martin and Phil are just the best and look forward to every visit!

Line Following robotics Rover & Raspberry Pi set up for programming