Friday, 26 September 2025

Digital Picture Frame

Status

I have had some success in the past setting up digital picture frame applications.
My principal web-based slideshow app allows me to look through art images and includes a description/opinion on the art.  A modified version dispenses with the writing and just displays images - it is particularly aimed at the iPad.



I have also used  and blogged the iPad Pixette app which displays full screen pictures randomly from a folder on my picture database server.
Finally when investigating uses for old iPads I setup a slideshow in the Apple photo app (or LiveFrame) using shared icloud photo albums.  This has been used mainly to show Annette's aged father images of the family and places he may remember.

I feel that all of these are successful but I dont use them regularly.  Somehow I need more.

Typically I will use a DPF to view art, I wont be concentrating on the screen all the time, just dipping in and out when something attracts my attention.  I should evaluate some different solutions and see which one I use in practice.

Parameters

DPF output could be displayed on the lounge large TV, study small TV, computer monitor or iPad.
If a dedicated iPad is required it should preferably an obsolete IOS9 device.

An iPad is a natural choice to create a slideshow, possibly mirrored / cast to a TV screen.  It may be worth considering some sort of RPI solution which is output to a monitor or TV.

Preferably images should be used from my database server.  It is also preferable that the existing labelled low resolution images should be used.  Saving images on iCloud may be acceptable.

It should be easy to choose, start and change the slideshow which is displayed.  I should be able to pause the show.  Images must have simple artist information to be interesting.

Option 1 : Pixette app on newer iPad and large TV

+ existing low resolution images on database server can be used
+ image file name gives approximate author and title details
+ The full screen is used and image transition is smooth
+ "image enhancement" makes low res pictures look good on a big screen
+ slideshow starts as soon as app is loaded
+ same app works for both iPad and large TV (with screen mirroring)
+ app and images are already in place and working
- can only display pics in random order
- picture selection is based on choosing to include/exclue folders on settings screen
- app no longer works on oldest IOS9 ipad

  








Option 2 : Use old iPad and Apple Photos / LiveFrame /SoloSlides

+ Can choose to display images in time order.  Less randomness useful for multiple folders
+ apps are already in place
+ screen displays pictures full screen
+ it is easy to add images to shared icloud folder for display
- uses iCloud storage - images may not fit my free storage
- lots of work to setup new database of hi res images with meaningful file names
- artist / title not available using Apple photos
- old iPad doesn't allow mirroring to large TV



Option 3: Improve Slideshow app fullscreen capability

I have previously modified the slideshow app to remove image description / analysis providing more space on an iPad screen for images.
However the Google / Safari browser headers are still displayed detracting from the "full screen" objective.  In additon the screen includes a title line (which I probably want to keep) and a menu bar (which I may remove).

The first issue to resolve is the removal of browser headings.  On Windows Chrome allows F11 to make an image full screen, however this isn't possible using Safari/Chrome on an iPad.
There is a workaround using a deprecated <meta> tag
If you add the meta tag to a web page and save a link to that page on your safari homescreen then you see a nice slideshow without an address bar at the top which looks a lot better.

+ works on iPad3
+ it uses existing image database
+ can cast using iPad7 to a suitable TV
+ proper artist / title information
+ By saving iPad homescreen icons, can choose ALL galleries in a group
- It isn't quite a fullscreen app
- It is a bit fiddly to setup icons for all the desired galleries

This solution works both on iPad3 and iPad7.  I cant easily cast the iPad7 screen to my (old) Small Samsung TV in the study, even using its Chromecast stick, but I did try an app called Screen Mirroring for Chromecast which will display the slideshow on the Study TV.  I feel it works well, the TV is easy to ignore and unobtrusive but the pictures look good.  It is probably that we are conditioned to ignore TVs more than iPads which we are holding.

Conclusion

Both options one and two are good applications.  Pixette is too limited for art because of its random display.  Apple Photos and related solutions cant easily display titles and require much work to fully setup.
Option 3 is good enough to be practical, I just need to setup icons for each image gallery I want to view.  In addition, if I use iPad7 the slideshow looks good on our large Samsung TV.

I did rather like looking at the slideshow on my small Study TV.  Another option I wanted to consider was an RPI application using Study TV as an RPI screen.  So far, investigations indicate that this is quite feasible and I will blog the results separately.


Wednesday, 24 September 2025

ATHENA Configuration 1

Previously I described my purchase and installation of ATHENA, my Geekom mini PC.  My first action following installation was to setup RDP so that I could access FREEDOM, my existing primary Windows 10 PC, since there isn't anything much I can do with the new PC except access the old one!

As I suspected it is taking me a long time to move over apps / functionality to ATHENA.  Details of all the installations would be very very tedious so I shall limit myself to points that I find interesting and others may find merely very tedious.

RDP (Remote Desktop Program) is great to avoid the need to switch over keyboard/mouse/screen.
However to make it even  easier I setup WOL (Wake on Lan).  This is a tiny utility which sends a magic packet to power on another computer.  I told it FREEDOM's MAC address, so that when I click on the associated icon FREEDOM starts up - without me needing to rummage under the desk.
Once the PC is turned on I can click on the RDP icon to use it.
This means I no longer need a screen, keyboard, mouse attached to FREEDOM.
I have another (noisy) Win11 mini PC called PICO which I also setup for RDP.  I now have a practical single desktop for my Windows Environment.


Ideally I would like to move away from MS-Office.  Excel is great, Word is a pain and Outlook is pretty useless.  However it is too much effort.  I was going to migrate (remove and install) MS-Office 2019 from the old PC, but found that I could buy a new activation key for £10 - so that it what I did.  



I setup WSL2:Ubuntu for linux access and setup SSH and Shares to access my RPI storage.  I also shared the legacy PC disks so that I can easily transfer data across.

One of my own main apps is my Art Library / slideshow.  It is an RPI web application written in Javascript/HTML which uses a MariaDB SQL database to organise picture information.
Although the webapp, database and pictures are stored on RPI I need some PC apps to manage the system.  My old HTML editor is obsolete now, so I set up a new one WebStorm which seems very good.  I installed a new instance of Heidi SQL on ATHENA so that I can update the image database and I copied across my master picture Library to ATHENA so that I can edit and move pictures to the RPI.
I have installed Irfanview to manipulate the images, it appears more popular than Fastone, which I used previously.



Removing Bloatware

When I first started using Win11, I found the constant adverts, popups very irritating.  I round a random article in The Register which provides some quick fixes.  Now I don't have Windows telling me about the picture it has chosen for the lock screen and I dont have news flashes disturbing me.
Microsoft still try hard to make me use OneDrive and Office365, Edge and Copilot, but I can cope.
 

Windows 11 Features

There isn't much improvement, moving from Windows 10 to Windows 11.  I  have listed here what I have noticed so far:
1)    The Phone Link app is great, it allows me to use many phone functions on the PC and makes transferring photos across very simple
2)    File Explorer has tabs so that you can view multiple folders in one place, I always lost track of them as soon as I needed two or three open
3)    When switching between virtual desktops, each desktop can have a different screen background, so you can see where you are at a glance.

Monday, 11 August 2025

Geekom Mini PC

 

I have been considering a new PC for a number of years but I haven’t had a compelling reason to upgrade: I can install and use any apps I want to on my current / old PC FREEDOM; it is powerful enough for most software I use; it is a lot of work to change over; new ones don’t have features I desire.

However FREEDOM, is becoming less reliable: it needs to be booted twice to restart; recently it has had a few “blue screens of death”; a few programs such as 3D manipulation can be slow; it isn’t Win11 compatible…

I decided to make a quick decision on a new PC.  I have been keen to buy a new small PC from inside-tech but their small ones aren’t very attractive.  Currently there are plenty of adverts for a number of mini-PCs. My main requirements are:

·         Small size
·         Silent operation
·         At least 2GB SSD C: drive
·         Preferably a second SSD drive
·         At least 16GB memory
·         Allow 3 monitors
·         Win 11 Pro

Geekom have a good range of mini-PCs and appear to be widely used.  Most, but not all, reviews seem positive.  They are available from Amazon and directly from Geekom.
Since this is a rare and important purchase I am not too concerned about price – it is going to last me a long time.  Looking at the options, purchase with a 2GB SSD was a limiting factor.  I chose the IT13 as it seemed most appropriate for me.


I ordered the PC on 3rd July and it was delivered the next day.  It is as small as it seems, it feels sturdy and looks good.  If appropriate I can attach it to the rear of a VESA mount so it wont take up any space.

For me the most important test is silent operation.  When I turned it on the fan started but after a few seconds, at mostly thereafter it is beautifully tranquil.  It has passed the first test with flying colours.
I connected up two HDMI screens, wireless mouse and keyboard and I now have a useful system.  She has been named ATHENA after the powerful and wise Greek goddess.

My first action was to setup RDP so that I can use FREEDOM from ATHENA seamlessly.  This gives me access to all existing functionality whilst I change over to the new system which I expect to take a number of weeks.

My verdict is that I am happy with the new hardware.  I couldn't ask for more.  Windows 11 remains irritating whilst Microsoft "features" try to push Edge, OneDrive, Office365 and their horrible widgets .
In a next episode I can say how configuration and migration turn out. 



Saturday, 14 June 2025

What is (good) Art

 Intro

Although I am interested in Art and aim to like a wide variety, I often see Art which I don't think is very good.

This article provides some musings on the subject, many of which come from Wikipedia which I believe to be the fount of most knowledge (academics can be a bit sniffy about it).

Wiki

Wikipedia has an excellent article "Classifactory disputes about Art"

Ancient China had six arts  and the nine Muses embodied the Greek arts



The French generally recognise / classify 10 arts.  The first six are traditional with four newer ones developed over the last century.






A good starting point is whether to include Conceptual Art, immortalised by Marcel Duchamp's "Fountain", a mass-produced urinal.
Conceptual Art is "art in which the concepts or ideas involved in the work are prioritized equally to or more than traditional aesthetic, technical, and material concerns".
From my perspective I generally give this a big "NO". I believe art should offer more than this.

Below are provided some "notable" examples  and some more recent disputed works.



Definitions


Google AI provides a good starting point for what is art.

It also makes a good effort at describing Good Art

Good Art


Google AI definitions seem fine to me.

One "arty" definition which I have paraphrased is "art is what people who call themselves artists say they produce".
One could also try "art is what can potentially be bought and sold at art auctions".  Good art has a higher price / value.

The easiest way forward is to say that good art is what I like and to be prepared to say how much one likes it and why.

Some characteristics I try to include:

Can I see great technical skill in producing the work?
Is there a strong message being communicated by the work which I can detect?
Is it beautiful / enjoyable to experience?
Do I want to spend some time experiencing the work or seeing it repeatedly?
Does it stimulate me to think further on the subject?

I believe that covers it, surprisingly.



Monday, 2 June 2025

3D Printing : Platonic Solids

 Intro

I have previously been successful in defining a tetrahedron, the simplest 3D object, in STL.
Along the way I found that OpenSCAD is my preferred tool for creating STL files.  In OpenSCAD you can define a polyhedron in terms of its vertices and faces.  It is then a simple matter for SCAD to turn this into STL.  In fact I don't think I need to look at raw ASCII STL further because the SCAD "program" defines the object at a low level.

Following completion of a tetrahedron it makes sense to define the four other platonic solids in SCAD.
Wikipedia gives us a good start by defining vertex co-ordinates for the solids.

Octahedron

An octahedron has 6 vertices and 8 faces.  Armed with a suitable picture it is quite easy to label the vertices v0-v7.  I could then define three vertices for each visible face (in clockwise order, looking into the tetrahedron).  It was slightly harder to determine vertices for the hidden faces.  I wrote down the answer "looking through" the solid and reversed their order so they were clockwise.

I could then draw the octahedron in SCAD.  Although vertices are in the simplest form they do not provide a "flat-bottomed" object to print.  I struggled a bit then realised that I need two rotations for a flat-bottom.  Firstly 45 degrees around Z then, after a bit of trignonometry revision, 54.7 degrees around Y.

The result looks good and printed perfectly.




Icosahedron



I found good pictures for an icosahedron at sacred-geometry 

As usual work is required to define the faces which are not visible from the front. I started by creating a polyhedron with 5 trianglular faces touching point Z.  It was then an easy matter to go round the 10 triangles in the middle layer and 5 more to the bottom vertex.

The model produces needed to be rotated around the X-axis. The calculation for this is tan α = (φ-1/ φ) which gives a rotation 20.9052°



Cube

The cube is extremely simple to crate in SCAD and it doesn't require any rotation.  AS STL requires triangular faces the final ASCII STL output has 12 triangular faces instead of six squares.




Dodecahedron

I found it difficult to determine the vertices making up the six invisible faces of a dodecahedron even using the helpful diagrams.

Each time I worked out a face I added to the SCAD model so I could check it was correct and I gradually built up the final shape.  I could then work out the rotation (31.7 degrees) to give it a flag bottom and print it.

Outro

SCAD provides a great platform to build 3D polyhedra.  The Platonic solids all have convenient co-ordinates so most of the work involved in making the model is to determine which vertices make up each face.
I have noticed that others define their solids in SCAD in a different way, so I may investigate further.



Wednesday, 28 May 2025

MSBASIC : Control LCD

 Intro

We have implemented MSBASIC on BEN2, which is a 6502 system closely following Ben Eater's design.  MSBASIC was originally developed by Microsoft for the 6502 in 1976 and was implemented on many early and famous computers, including Apple and Commodore.  The software source was released some years ago and is available on Github.  It can be compiled for a variety of different machines.  Ben Eater has forked his own version which runs on his 6502 and mine!

Ben (me too) has an LCD display display on his 6502 and the generic MSBASIC doesn't include commands to use an LCD display.  Ben and has provided a video tutorial describing how to control the LCD using POKE/PEEK commands and he adds new MSBASIC commands allowing the user to "print" to an LCD.

As usual it is an interesting, educational tutorial allowing me to add LCD display into my MSBASIC.

POKE/PEEK

MSBASIC includes the commands PEEK and POKE to view (read) and update (write) specific actual memory locations.  We control LCD hardware by writing values to VIA (Versatile Interface Adapter) ports which are wired up to the LCD.  PORTB pins PB4-PB7 are used for data.  PORTA pins PA5-PA7 are used for control signals.

Ben uses different connections from VIA to LCD so I needed to work out how it should work BEN2.

So far we have done this in assembly programs by writing to the VIA ports we use at addresses $6000-$6003 (hexadecimal).
Similarly we can use POKE in BASIC programs to  write directly to VIA ports.  BASIC uses decimal address so $6000 equates to 24576.  By putting the data in 24576 = $6000 (PORTB) and changing control bits in 24577 = $6001 (PORTA) the character CHAR$ is displayed on the LCD.


We implement three principle BASIC subroutines using POKE commands: LCDINIT (set  up display) LCDPRINT (char display), LCDCMD (control command, clear screen, set cursor etc)
This subroutine shows that we can easily print a string on the LCD.


Add MSBASIC Commands

It is encouraging to know that we can control the LCD from MSBASIC.  It would be preferable to add some commands to the MSBASIC language so that we can easily initialise / control / display LCD output.  In his video Ben describes his detective work to add three such commands LCDINIT, LCDCMD and LCDPRINT to MSBASIC.  It turns out to be quite simple to add new commands and cause them to execute assembly subroutines.  Our own assembly code is stored in LCD.s and added in to the MSBASIC build.

For example, the LCDINIT command executes the code at label LCDINIT: in lcd.s.  This sets up the ports we need to use and calls LCD4_init which is my existing assembly code to initialise LCD.

Part of the detective work was to determine how MSBASIC passes arguments to assembly subroutine.  Ben looked at the PRINT command code and found that a subroutine GETBYT takes a value from the command line and stores it in the X-register.
So we can have a BASIC command "LCDPRINT 65" and the value 65 is passed to our LCDPRINT assembly subroutine in X-reg.  We then tell the subroutine to print what is in X-reg and prints the corresponding character "A".

I was very pleased that I could mainly cut and paste my assembly routines into lcd.s, rebuild MSBASIC and then see the code working.

Printing Strings

The MSBASIC PRINT command allows you to print characters strings of numeric expressions and Ben uses a follow-up video tutorial to show how he decoded the way in which the code (written by Bill Gates et al) works.  


One really cool idea is to display some of the MSBASIC internal variables addresses on the terminal then drop out of Basic to WOZMON..  You can then list out those addresses in WOZMON to find what values they are set as.  Ben uses this to understand how zero page memory is used to store characters, variables, strings, numbers and expressions for 

Armed with this knowledge the LCDPRINT subroutine can now print expressions and strings.  Ben provides a copy of his source on github and to make it work I simply had to swap in my own LCD subroutines, developed previously.
It worked without any quirky complications.


Outro

In the two MSBASIC tutorial implementing LCDs Ben has done a grand job discovering how the original code works, with some clever detective work along the way.  The tutorials are rather different from his usual approach of carefully reviewing data sheets and devising assembly code but interesting all the same.
It is rewarding to get the LCD working in BASIC as you can actually see the computer producing something rather than looking at a terminal emulator as usual.  The knowledge gained from this approach could be applied to add other hardware related functions if I feel like it.









































Thursday, 22 May 2025

Improving MSBASIC

Intro

Our 6502 Basic programming language implementation is quite comprehensive, but it does have some big problems.  In particular, since we didn't implement the LOAD and SAVE commands when setting up basic we have to start inputting lines of code from scratch each time we start MSBASIC.  Since BEN2 possesses no disk storage we cannot easily implement those commands.

A good, effective, convenient and practical workaround is to cut and paste programs from a PC editor into our terminal window.  This technique is ok for a single line of code but the MSBASIC program cant process larger chunks of code arriving quickly.
The first step in solving this problem, which Ben describes, is to receive characters into a 256 byte buffer, from which BASIC can read them at a more leisurely pace.
However, when reading in larger programs the 256 byte buffer fills up and characters are dropped.  To resolve this Ben implements RTS/CTS hardware flow control.  When the buffer is nearly full the 6502 sets the serial pin RTS low which causes the the terminal emulator to stop sending characters.  When the buffer is mostly empty the 6502 sets RTS high at which point more characters can be sent.

Ben explains how to implement these features in two videos How input buffering works and RS232 Flow Control.

Input Buffering

The original MSBASIC program uses a subroutine CHRIN to read characters in from the ACIA UART serial interface.  If no character is ready CHRIN waits until a key is pressed.  This works fine when a human (me) is typing on the keyboard as the program can process characters faster than I can type them.


We are going to create a buffer which will hold upto 256 characters which have been "pasted" into the terminal screen so that MSBASIC doesn't need to read them immediately.  Characters are placed in the buffer as soon as they arrive and are stored in the buffer at a location pointed to by WRITE_PTR, which is then incremented.  When MSBASIC needs to read  a character it uses the location pointed to by READ_PTR which is then incremented.  If READ_PTR=WRITE_PTR no character is available so the program waits.

We need to use an interrupt mechanism to help us with this.  The ACIA UART has an interrupt (pin 26) which we connect to the Interrupt (pin 4) on the 6502.  Now the 6502 interrupt pin will go high when a the ACIA has received a character.
In the 6502 software we enable interrupts and setup an interrupt vector at address 0xFFFE and 0xFFFF.
When an interrupt is received MSBASIC will jump to the interrupt vector address and run the interrupt service route to read in the character to the buffer.

On completion it will return from the interrupt to continue whatever program is running.
When MSBASIC needs to read character in we use a modified version of CHRIN.  First it calls a subroutine BUFFER_SIZE to see if there are any characters in the buffer, if not it waits for characters.
If characters are available CHRIN calls READ_BUFFER to get the next character and increment READ_PTR.

This mechanism works very nicely for small chunks of data pasted in to the terminal but fails if there are more than 256 bytes waiting.

The mechanism is called a circular buffer. The WRITE_PTR variable can take values from 0 to 255.  When the pointer is incremented from 255 it resets to 0 so the buffer wraps around.  Similarly READ_PTR "follows" it so the buffer continues to work.

When WOZMON, the monitor, starts we initialise the buffer so READ_PTR=WRITE_PTR and the bufer is empty before we enable interrupts. We must also use the modified CHRIN subroutine to read characters in from WOZMON to the buffer.

Flow Control

The RS232 protocol specifies wires in the cable to be used for flow control, the ones we will use are CTS/RTS.  On the PC end of the cable the serial driver looks at the CTS "Clear To Send" wire and if the voltage is set low the serial driver will not send any more characters until  the voltage is set high.  On the 6502 end the same wire is connected to RTS "Request to Send" (more appropriately "Ready for Receiving") which the 6502 will set low if it cant cope with any more characters.

Previously our serial UART only used four wires 5V, GND, RX, TX.  We need to make sure our RS232 cable or FTDI connector has six wires including CTS/RTS.  On the PC side the cable still plugs into a USB port.  On the 6502 side we connect a BLUE wire to RTS.

Now all we have to do is update our interrupt handler so that if the buffer is nearly full we set RTS low to stop communication.  When the buffer has plenty of space, set it high again.  In fact the ACIA RTS pin doesn't work very well so we use PORTA PA0 instead.


Lastly we need to tell PC terminal emulation software picocom or TeraTerm that it should use hardware flow control, otherwise the terminal emulator will just keep sending data.

It works, I can cut and paste a large BASIC program (say 500 lines) into the terminal window and it will be read in correctly, although it takes a few seconds.

Outro

Input buffering and flow control are vital but not very interesting.  It is pretty awesome how straightforward it is to program it on BEN2 with Bens help.  By implementing both buffering and flow control we have now written a proper serial driver on our 6502.
The benefits of this work are huge.  There is no way anyone would type a BASIC program in each time BEN2 was started up, but it isn't much work to spend a few seconds cutting and pasting a file before you start.



3D Printing : STL


Intro

I have started printing a variety of models on my Elegoo Neptune 3d printer.  3D models which I make using Tinkercad or are available at 3D websites are predominantly defined in the STL file format.  Once a suitable STL file has been created and saved the Cura app is used to "slice" them into layers and printing instructions are saved in TFT / gcode files which are sent to the printer.

STL stands for stereolithography but is better translated as "Standard Triangle Language". It makes 3D shapes by combining 2D triangles.  Curved surfaces are approximately with lots of triangles.  As you make the triangle smaller, you can make smoother surfaces at the expense of using more and more triangles.  Most STL files are in an unreadable binary format but ASCII STL is a valid alternative where points, polygons and surfaces are defined in a readable format.

It occurred to me that it should be interesting and straightforward to create simple ASCII STL models, e.g. for polyhedra.  In particular, the simplest polyhedron is a tetrahedron which comprises four vertices and four triangular edges.

Rules

The STL file format is very simple, you define a number of facets (i.e. triangular faces) each with three vertices.  You should also define a unit vector which is normal to the surface in the triangle.
A "solid" is made up of a set of facets.
There are some simple rules which are explained below:
1  The normal should be pointing outwards
2 Vertices should be listed anti-clockwise.
3 Each triangle should share two vertices
4 All vertices should be positive values.
5 values should be exponentials e.g. +2.00e03


It seems that, in practice, it is not necessary to follow all the rules.
As I want to read my STL files into Tinkercad or Cura I ignore any rules that they dont appear to require.

I didn't specify normal values as they are difficult to work out.
It appears that values dont have to be positive.
I used floating point or integers instead of exponentials.



Googling

I started by googling for ASCII STL examples but there don't appear to be many out there.  Florida State University have a Computational Geometry course, which contains a number of examples I may look at.


A couple of printables users Ambrosia and GaelLaFond provide details of STL tetrahedrons, including ASCII STL, which I will investigate further.


There seem to be a number of python apps which help with STL generation, Hand-and-Machine looks the best, it appears to generate various polyhedra in ASCII STL form.

A simple calculator for working out tetrahedron co-ordinates, an STL file viewer and some notes written by someone writing his own STL files from scratch may be useful.


As I hoped I came across an app, called OpenSCAD, which will be extremely helpful if I want to write STL to generate geometric shapes. Gael LaFond's tetrahedron was written in openscad as shown below.
There is a little quirk with OpenSCAD, in that it will only export ASCII STL files if you run it from the command line.  However, that isn't too much of a problem.



Tetrahedron

I have two possible files for my simplest possible STL object, from printables users Ambrosia and GaelLaFond . 

Ambrosia
Gael LaFond

Ambrosia's tetrahedron definition is very simple.  Normals are all set to zero, vertices are at unit addresses and are set as integers.
Unfortunately there is an error somewhere and I cant import the file into Tinkercad.
In contrast Gael LaFond provides a regular tetrahedron with all faces the same.  For a regular tetrahedron some of the vertices will always be at non-integer values.

I decided to make my simplest tetrahedron like Ambrosia's.
I started from Gael LaFond tetrahedron then changed the vertices to have unit co-ordinates and set normals to zero.







The result loads perfectly. We now have our simplest tetrahedron.  It isn't at all regular but it is very simple.  It has vertices (0,0,0), (1,0,0), (1,1,0), (1,1,1).
It is also very small as each co-ordinate is only 1 unit.  However choosing the units as inches makes it 25.4 times larger, alternatively it is easy to enlarge within Tinkercad.

I wanted to improve my design a bit. Firstly I wanted to make the tetrahedron with a right angle corner at the origin.  This has co-ordinates origin O(0,0,0), x-axis X(1,0,0), y-axis Y(0,1,0), z-axis Z(0,0,1).
I also found that the vertex command can have a description after it, so I added the vertex name after each.  This makes it easier to identify the order for the four facets (O,X,Z), (O,Y,X), (OZ,Y), (X,Y,Z).




Outro


It is interesting to understand how STL files are used to make up 3D objects and to be able to define them myself.  The files quickly become very complicated as they grow so a tetrahedron, as the simplest example is very instructive.  To me the hardest part is putting the vertices in anti-clockwise order when speciying triangular facets.  I suspect it would be very difficult to construct more than a few shapes manually.  I aim to be able to create more STL files using OpenSCAD, particularly poly