Sunday, June 08, 2025

machine learning explained

Below is a summary of an article by Rodney Brooks, Machine Learning Explained (2017).

This inspiried me to take on the development of my own version of hexapawn (referenced below) in python. After reading the Rodney Brooks article I did search around and found a hexapawn version written in Scratch by puttering. The rules are outlined there. The machine improves their play as it plays. I played 30 games with it. For the first 10 I won 6 and the machine 4. For the next 10 I won 4 and the machine 6. For the final 10 I won 2 and the machine 8. I hasten to add that in this game black has the advantage and with perfect play should win 0 to 10.

Anyway Machine Learning is all the rage now so I'll summarise large section of the Brooks article. Of course, you should read the whole thing:

Machine Learning

  • is what has enabled the new assistants in our houses such as the Amazon Echo (Alexa) and Google Home by allowing them to reliably understand as we speak to them.
  • is how Google chooses what advertisements to place, how it saves enormous amounts of electricity at its data centers, and how it labels images so that we can search for them with key words.
  • is how DeepMind (a Google company) was able to build a program called Alpha Go which beat the world Go champion.
  • is how Amazon knows what recommendations to make to you whenever you are at its web site.
  • is how PayPal detects fraudulent transactions.
  • is how Facebook is able to translate between languages. And the list goes on!

Machine Learning is not magic.

Every successful application of ML is hard won by researchers or engineers carefully analyzing the problem that is at hand. They select one or many different ML algorithms, and custom design how to connect them together and to the data. In some cases there is an extensive period of training on very large sets of data before the algorithm can be run on the problem that is being solved. In that case there may be months of work to do in collecting the right sort of data from which ML will actually learn. In other cases the learning algorithm will be integrated in to the application and will learn while doing the task that is desired–it might require some training wheels in the early stages, and they too must be designed. In any case there is always a big design project about how, when the ultimate system is operational, the data that comes in will be organized, processed and mapped before it reaches the ML component of the system.

Alan Turing was assisted by Donald Michie in developing the code breaking Colossus computer Bletchley Park during WW2 which helped shorten the war against fascism

After the war Arthur Samuel developed a machine that could play draughts from 1952-56, the first AI in the USA.

Samuel wondered whether the improvements he was making to the program by hand could be made by the machine itself.

What Samuel had realized, demonstrated, and exploited, was that digital computers were by 1959 fast enough to take over some of the fine tuning that a person might do for a program, as he had been doing since the first version of his program in 1952, and ultimately eliminate the need for much of that effort by human programmers by letting the computer do some Machine Learning on appropriate parts of the problem. This is exactly what has lead, almost 60 years later to the great influence that ML is now having on the world.

Samuel explored two (machine) learning techniques:

  1. Memoization or memoisation is an optimization technique used primarily to speed up computer programs by storing the results of expensive function calls and returning the cached result when the same inputs occur again
  2. The other learning technique that he investigated involved adjusting numerical weights on how much the program should believe each of over thirty measures of how good or bad a particular board position was for the program or its human opponent. This is closer to how ML works today.

Donald Michie himself built a machine that could learn to play the game of tic-tac-toe (Noughts and Crosses in British English) from 304 matchboxes, small rectangular boxes which were the containers for matches, and which had an outer cover and a sliding inner box to hold the matches. He put a label on one end of each of these sliding boxes, and carefully filled them with precise numbers of colored beads. With the help of a human operator, mindlessly following some simple rules, he had a machine that could not only play tic-tac-toe but could learn to get better at it. He called his machine MENACE, for Matchbox Educable Noughts And Crosses Engine, and published⁠5 a report on it in 1961. A matchbox computer is still a computer!

In 1962 Martin Gardner⁠ reported on it in his regular Mathematical Games column in Scientific American, but illustrated it with a slightly simpler version to play hexapawn, three chess pawns against three chess pawns on a three by three chessboard. … Gardner suggested that people try building a matchbox computer to play simplified checkers with two pieces for each player on a four by four board.

Rodney Brooks recounts how he eventually came to realise that this was a wonderful way for explaining how machine learning works.

Today people generally recognize three different classes of Machine Learning, supervised, unsupervised, and reinforcement learning, all three very actively researched, and all being used for real applications. Donald Michie’s MENACE introduced the idea of ML reinforcement learning, and he explicitly refers to reinforcement as a key concept in how it works

Footnote:
I explain in this article, an AI taxonomy, the difference between Machine Learning (ML) and AI. You can have forms of AI that don’t learn over time. Symbolic AI, Traditional robotics and Behaviour based robotics could all fit this category. They are programmed, they do some human like stuff but don’t change or improve over time without human reprogramming. They are still important but sidelined at the moment due to the LLM (Large Language Models) hype.

Wednesday, June 04, 2025

my crystal neopixel lamp

The Concept:

This started from the idea of making a lamp with flashing, coloured LEDs inside. The inspiration here was seeing such a lamp made by Robin at Hackerspace for his grand-daughter. I learnt then about the ESP32 board which enables control of the flashing LEDs, aka Neopixels, from your phone.

Previously, I had made a Sierpinkski sieve a Sierpinski pyramid lamp with transparent PLA filament and lit it up with a couple of Circuit Playgrounds in the base. Up until then that was my favourite make! This background partially determined my direction for this project.

So, I found a crystal lamp on printables, here, which had been partially hollowed out and printed it with transparent filament.

This pic is from Printables: I plan to improve it with changing coloured neopixels that go to the top of the central pillar (see video near the bottom of this article)

Then began a complex process of research and buying of materials. I had to determine what to buy and the voltage and current requirements. Adafruit has a comprehensive uberguide about NeoPixels. Some helpful pointers from the adafruit uberguide were:

  • NeoPixels are usually described as “5 Volt devices” ... (but) ...Lower voltages are always acceptable, with the caveat that the LEDs may be slightly dimmer. There’s a limit below which the LED will fail to light, or will start to show the wrong color.
  • NeoPixels don’t care what end they receive power from. Though data moves in only one direction, electricity can go either way. You can connect power at the head, the tail, in the middle, or ideally distribute it to several points.

I also consulted with Robin at Hackerspace about which strips and ESP32 to purchase.

My plan became something like this:
  • purchase a cuttable RGB+IC 144LEDs/m WS2812B LED Strip. I then cut 3 strips, cutting at the copper dots, each 14 LEDs long and arranged them around a triangular prism so there will be lots of flashing lights from all directions.
  • design and 3D print a hollow triangular prism support for the LED strips after they had been cut
  • design and print a base with a cavity to hold the batteries and the ESP32 board
  • purchase a SuperMini ESP32-S3, 23mmx18mm, keeping it small so as to keep the cavity small
  • power the whole thing with 3xAAA batteries in a cylindrical holder (55mm long x 22mm diameter), amounting to 4.5 volts

In retrospect, this is or was a reasonable plan. Of course there are alternatives, eg. rather than the bulky battery holder run a cable to a 5v power supply. I was muddling through. Doing things for the first time is always hard.

Understanding the circuit and how the LED strip works

Initially I didn’t understand how the Neopixel strips (WS2812) worked. I hadn't grasped the significance of the comment in the adafruit uberguide, that "NeoPixels don’t care what end they receive power from." As it turns out each LED has its own processor. One side is positive, the other side negative and the data flows in one direction marked by an arrow on the strip. My understanding now is that the circuit(s) are made up on the fly as the current flows across through each LED.

Triangular prism designed with SCAD

I wanted to upgrade my 3D design skills so this time I opted to learn SCAD, which has a mathematical approach to design. I found it to be fairly intuitive after looking at a couple of beginner’s tutorials.

SCAD design of triangular prism onto which the LED strips are mounted (I printed this with transparent PLA filament too

Fastening the LED strips, wiring up, soldering and testing

I wanted a transparent hollow triangular prism to fasten the LED strips onto, with small holes at the top and bottom to run wires through to the inside. I designed this with SCAD. It was surprisingly easy and elegant!

I cut three strips, cutting at the copper dots 14 LEDs / strip. I wired up the positives at one one end and the GND and data the other end. The idea here was to avoid clutter at one end.

It took me a while and help from Robin to understand the circuit and data flow

  • the circuit goes through each LED (where is this explained?)
  • the arrows on the strip show the data direction

For stripping the wires I needed the right tool, although the experts can do it by feel. Before soldering I removed one LED from each strip with a heat gun. I did this because the copper dots when cut in half were very small.

I tested the strip using my Sunfounder kit and it was successful!

Design and redesigns of base with SCAD

I had to do a few redesigns along the way after I decided to insert a relatively bulky cylindrical battery holder (55mm long x 22mm diameter) into the base.

SuperMini ESP32-S3

I found helpful information about the SuperMini ESP32-S3 Development Board here.

  • some simple tests to check if the board was working
  • pin layour and which pins were safe to send data through

Then I had to figure out how to flash micropython onto the board. Once again help was there online: Instructions

Coding in micropython

I opted for coding in micropython which I find easier to understand than arduino C++. I bought a Sunfounder ESP32 starters kit, installed Thonny IDE and started working through their online micropython tutorials. They did have a micropython WS2812 tutorial for an 8 LED strip, which gave me a good start for the code.

I thought an effect where the colour grows stronger then fade and then changes to another colour would look good. It took me a while to figure out how to modify the code so it was both elegant and did what I wanted. This involved writing efficient functions and looking up the RGB values for different colours.

The Thonny code tested alright on the LED strips but then I had to figure out how to run it from the ESP32 board. With a Save As... I could download it to the board and then found an article which explained that it had to renamed main.py and then it would run.

There is also the WLED option which provides tremendous variety but you miss out on the joy of coding ;-)

Not the final version, but it does show the neopixels burning brightly!

Trouble shooting / Problem solving: Suitable wire thickness.

You need the right materials. The experts can wing it but mere mortals like me need the right materials.

"For the lack of a nail a kingdom was lost" - Shakespeare
For the lack of 26 AGW wire a crystal neopixel lamp was compromised - Kerr

During my near the end soldering session I suddenly discovered that two out of three LED strips no longer lit up. The problem was that I had used very thin wires and with a little twisting some of them broke. So, I went back to replacing the broken wires with thicker ones (22 AGW) and resoldering. But my problems persisted because now the wires were too thick and it is hard to twist three thick wires on the one side and solder them successfully to one thick wired on the other side. So, what I have planned here is to get some 26 AGW (in between thickness) wires and do the whole thing again!

Also my design lacked an important component given that I'm powering off three AAA batteries. A switch! This will be part of my new model

This experience has taught me to improve my soldering skills (use the third hand, flux and the solder sucker when required) and design skills (the wiring was far from elegant). Such is life. I've learnt a lot.

SUMMING UP: WHAT HAVE I LEARNT
  • Thonny python IDE upgrade and use
  • micropython for loops and functions
  • WS2812 Neopixel strip function (power, data), cutting procedure
  • Supermini ESP32 function and testing
  • OpenSCAD skills (designed and made tri prism and base)
  • Circuit or wiring design
  • Soldering skills (wire to wire, stripping, tinning, third hand, solder sucker, heat shrink)
  • Heat gun, to remove one of the LEDs from each strip
  • Problem solving and receiving help
  • Checking parts carefully before buying (eg. bought momentary switches)
REFERENCE