Stories
Slash Boxes
Comments

SoylentNews is people

Log In

Log In

Create Account  |  Retrieve Password


Scripts For Scraping News

Posted by cafebabe on Sunday March 15 2020, @06:00PM (#5164)
4 Comments
Code

(Numerous websites are mentioned which I either love or hate. Disliked websites are monitored so that I am aware of subjects which may adversely affect friendly parties. Irrespective of attention/power dynamics, continuous exposure to conflicting opinion is essential. Separately, a minority of websites are monitored and collated on behalf of friends. It is for this reason that I follow an unusual mix of technology, futurology, paranormal, religion, minority rights, finance, design and loony fringe sources.)

Introduction

I'm often off-line for a week or more. I also pay a significant amount for my brief Internet access. Therefore, I have developed a set of scripts to grab and collate a high volume of data whenever possible. By popular request (one friend asked), I present the tidied scripts. Due to the ability to scrape, collate and speak a large volume of text (millions of words per month), these scripts may be of interest to busy people, news-hounds, people with disability and/or people caught in a pandemic.

During my brief sessions at an Internet café, I work through a written paper list of searches. This is mostly pop culture which occurs to me when I'm off-line but may also be postal addresses or technical details which are unresolved. I also work through email or provide acknowledgement that a more detailed response may be forthcoming.

Meanwhile, in the background, I typically fetch more than 2000 URLs (about 5 million words) along with JPEGs, PDFs and video. HTML may exceed 250MB and video may exceed 10GB per hour. This process mostly revolves around wget and a Firefox derivative but also includes the occasional use of OpenOffice or suchlike. Bulk data is primarily:-

  • Plain text format of one URL per line, suitable for wget.
  • HTML bookmark format, suitable for Firefox or similar. This consists of one named hyperlink per line within a bullet list.
  • JavaScript paginated webpages (Twitter, YouTube) may be temporarily pasted into OpenOffice. Thankfully, .odt format is an LZMA PKZip file and content.xml contains data which is analogous to HTML bookmark format.
  • Access logs which allow quality control.
  • Uncompressed directory structure mirrored by wget.
  • Date-stamped archives with partial text index.
  • Distilled text suitable for espeak.

The workflow mostly consists of scripts which compress data, summarize data or convert data from one format to another. At a minimum, scripting is required to convert to and from the formats used by wget and Firefox derivatives.

Fetching When On-Line

I usually have a "generator" list of news sources and one or more categories of bulk data to fetch as time (and storage) allows. If the list is particularly long then the Unix command split -l allow fragments to be fetched in parallel. This generally keeps sessions under one hour. An example list includes:-

With optional filtering, this is effectively run through wget -x -i - with extra parameters to ensure fetching does not get snagged for too long on a dud URL. These index pages can be reviewed off-line (when I'm not paying per hour at an Internet café) and interesting URLs may be collated into another list. I'll explain the collation process after on-line tasks are completed. Instead, assume that URLs of interest have been collated into fragments of tiers of lists. Repeat the fetching process for each fragment, as desired.

In a 20 seat Internet café, I often consume more than half of the available downstream bandwidth. Therefore, I have url-fetch-fast.sh and url-fetch-slow.sh. The latter keeps video transfer and similar under 1/3 of the estimated bandwidth. You may want to adjust this script for your circumstances.

Archiving

At this point, I typically have more than 250MB of HTML sitting in a RAM disk of a live boot at an Internet café. And I often have less than 250MB of persistent storage. Thankfully, news websites are often template driven and it is usually possible to obtain 10:1 compression. It is often possible to obtain 20:1 compression on the Daily Mail website and this is especially true if the URLs are all scraped within one hour because the infamous "sidebar of shame" will be relatively unchanged. Indeed, the major exceptions are the sections for finance, science and travel. Given the depth-first traversal of archiving and compression, these tend to be grouped where the compressor is most able to strip redundancy. Actually, it is quite disconcerting to fetch 100MB from the Daily Mail website and take home a 3MB archive.

I run du -a * | sort -n and compress any directory above 1MB which is not likely to be a single PDF. (There's no point putting a lone turd in a box.) compress-dir.pl accepts any number of directory handles and converts www.foo.tld into www_foo_tldYYYYMMDD.tar.xz where YYYYMMDD is the modification date of the directory. The script also produces a compressed SHA512 manifest and a compressed partial text index which often alleviates extraction of an archive. The partial text index is not case sensitive and does not permit phrase search. However, it is often sufficient to find technical terms and formal names. Indeed, the partial index has words in alphabetical order so that a compressor effectively stems the search terms. Overall, the manifest and search index typically increases storage overhead by less than 10%. The archiving script is intended to be run daily or less frequently. If you want more frequent archiving then you may want to change the time-stamp format within the script.

I run diff -r -q between $HOME/Downloads and persistent storage. It often gives false positives where persistent storage is FAT32 or similar due to transliteration of file names. Then I forget to persist bookmarks which I accumulate during my session. (Doh!) Then I take the data home and extract it.

Bookmark Management

At home, I live-boot, run a web browser, disable JavaScript (because all local HTML has read/write access to filing system), import bookmarks, unpack today's archives back into $HOME/Downloads, categorize stragglers into directories and then run:-

perl /path/to/convert-dir-to-bookmark.pl /path/to/uncompressed/stragglers $HOME/Downloads > /tmp/foo.html

This runs a breath-first, alphabetical enumeration over new data and the result can also be imported into Firefox. It lists files in the first level, second level, third level and suchlike directories separately. This has the advantage of collating (most of) the news indexes sequentially while many of the disadvantages are mitigated with browser bookmark search. Unfortunately, I sometimes forget to categorize URLs such as London's Evening Standard theater reviews. Although, it doesn't help that said URL occasionally drops off their web server configuration and is therefore occasionally not present in the saved data.

./convert-dir-to-bookmark.pl makes a token attempt to retrieve a title from HTML. However, if it has the placeholder title 'foo' then a <title> tag was probably obscured by yards of JavaScript and/or CSS. This should be regarded as a warning about a website's priorities.

From here, it is trivial to categorize bookmarks by priority and topic. From Firefox's bookmark management window, it is trivial to use meta keys to select ranges of mostly sequential bookmarks and open them as browser tabs. For example, it is relatively trivial to open all financial news index pages in one window and fashion news in another. Almost all of the web pages will be displayed without adverts, CSS or JavaScript - which is utter bliss. Unfortunately, without style, elements may be significantly more spread and this may incur significantly more scrolling. This can be partially overcome by tabbing through hyperlinks.

Further use of meta keys allows all interesting hyperlinks to be spawned in additional browser tabs. Obviously, these are all dangling references and all of the browser tabs will contain error messages about network connectivity or suchlike. Regardless, all of the tabs can be bookmarked with a menu item such as "Bookmark all tabs..." and named as required. This process creates a tab explosion and some forks of Firefox may have a hard limit of 1000 tabs per window. Even without this difficulty, I find it useful to occasionally checkpoint and persist bookmarks to storage.

Be aware that Firefox derivatives may silently fail to save bookmarks if there is insufficient space. Combined with the issues of truncation and corruption, bookmark state is of critical importance to the workflow. This leads to numerous versions of bookmark file being saved. It is strongly recommended that bookmark versions are named in globbing order. This simplifies periodic use of diff-bookmark-count.pl when deleting of uninteresting versions. This script treats unannotated URLs as an unordered set. In particular, URLs which have been annotated, categorized and possibly duplicated are regarded as "same".

As a top priority, I find it useful to scour index pages. Firstly, headlines alone keep me abreast of developments. (I'm often a week or three behind published news.) Secondly, if I'm unexpectedly near a friendly Internet café, I'll have a partially collated list of URLs to fetch and this may reduce the usual latency. The list of URLs can be collated by opening the current version of bookmarks.html in a text editor, searching for the first instance of >fetch< or similar and then pasting the remainder as the standard input of:-

perl ./convert-bookmark-to-list.pl | ./dedup-url.pl /path/to/previous/*/fetch*.list - > fetch.list

This list will require extensive tidying. At a minimum, instances of HTTP Method GET parameters should be reviewed. Obvious cases of privacy violation, such as ?fbclid=, are automatically removed but this will fail if it is merged with other parameters. This edge case has not been handled. Likewise for an endless list of unknown parameters. It is for this reason that you should always check. Further checking, sifting, sorting and de-duplication is likely. Regardless, the bulk of the process is automated and it allows unique references to be followed with relative impunity.

  • ./convert-bookmark-to-list.pl contains multiple messy heuristics which may fail. A large number of clickbait websites use absolute URLs so that copypasta hyperlinks resolve back to the correct website. Many of the remainder use relative URLs with identifiable patterns. For example, Wikipedia URLs begin with /w/ or /wiki/. In Firefox's bookmarks, this will be held eroneously as file:///wiki/ or similar. Unfortunately, the Encyclopedia Dramatica uses the same format, so you may want to modify the script according to preferences. Invariably, there is a long-tail of unknowns which have not been promoted to absolute references. If this is not the case then assume truncation. Anyhow, common cases which annoy me are handled. This includes off-line reading of Reddit via re-direction to old.reddit.com with the suffix ?limit=500. If you have example URLs then I may be able to include more cases. However, this may be delayed.

    ./convert-bookmark-to-list.pl has miscellaneous functions. -b converts to bookmark format and preserves ordering. This can be used to convert OpenOffice XML to bookmark format. This allows YouTube video indexes and other JavaScript pagination to be pasted into OpenOffice (while on-line) and then the titles can be loaded as Firefox bookmarks (while off-line) for further consideration. -o and -u create de-duplicated lists which are sorted by URL. The HTML output may use tags for ordered or unordered lists. Such lists can be collated at leisure (while off-line) and inspected manually (while on-line). Overall, this is useful for awkward cases, such as designer websites, websites with pagination or other scripts, or websites which require agreement to terms.

  • ./dedup-url.pl avoids retrieval loops, such as traversal around Wikipedia's non-hierarchical category system. File references can be specified in chronological order using globbing. Novel URLs contained within the final file are sent to standard output. The script contains an exception such that all URLs from SoylentNews and Reddit are regarded as novel. This allows interesting discussions to be followed after the first retrieval. With judicious use of text de-duplication, a delta of all discussions can be collated.

I may work on scripts for quality control (URLs removed from bookmarks but not fetched, wget failures). However, this is currently an infrequent ad hoc process which has not been automated.

Collation And Rendering

So far, I've described a never-ending cycle of fetching URLs. While it is possible to read all data on screen and select more URLs for download, for example, within the body of Wikipedia articles, this process can exhaust all available time. A more productive approach is to distill text and render it as speech. This process may *also* exhaust all available time. However, it allows more information to be absorbed while performing other activities.

An overview of the collation process is:-

cat /path/to/current/bookmarks.html | fgrep YYYYMMDD | egrep -v '_(dailymail|reddit|wikipedia)_' | perl ./convert-html-to-text.pl -t -s -c | perl ./dedup-lines.pl -c -n | perl ./dedup-words.pl -c -n > /tmp/speak.txt

YYYYMMDD is assumed to be consistent with the name of the directory on persistent storage which holds files which were not compressed. It is *also* assumed to be consistent with extracted archives under $HOME/Downloads. If you do not live-boot or compress a subset of data then this split storage complication may not arise. Regardless, you may otherwise wish to hold data in chronological bins and only rummage through the most recent ones.

  • ./convert-html-to-text.pl accepts a list of file handles from standard input *or* command line but not both. File handles may be in plain text format, HTML bookmark format or OpenOffice XML format (not the compressed archive). The function of this script is to concatenate files and distill them them to plain text. The original documents are seperated with ++++. -s suppresses unwanted content. -t trims low-priority fluff like Wikipedia's ubiquitous '[citation needed]'. This alone greatly improves the flow of text-to-speech. It also eliminates forum meta-data from SoylentNews and Reddit - although the result is a sea of humanity where posts become one block of text. (If you are alarmed by this then you will be displeased to discover subsequent steps to increase throughput.) -c skips WordPress comments and is likely to be expanded to skip comments of other systems.

  • ./dedup-lines.pl builds a hash of string keys and only outputs unique lines (and the webpage separator which is now stripped of its HTML paragraph tag). This process often requires more than 1GB RAM and 5 minutes to run. On 32 bit computers, it is likely to exhaust resources. This can be reduced slightly by setting -c for case insensitive matching and -n for numerically insensitive matching. I considered other methods to compact the data but I am concerned that it may run slower. The purpose of the script is to eliminate obvious duplication, such as website navigation. In the general case, only the first instance passes through and this can be manually trimmed before running text-to-speech. If a website suggests related articles then the number of novel suggestions is likely to decrease over a few pages. Unfortunately, this doesn't apply to spammy websites, such as the libelous PinkNews or plagiarist TheRegister (which look surprisingly similar at this stage of processing).

  • ./dedup-words.pl may be far too aggressive and can be skipped. It splits words from surrounding punctuation and eliminates 4-grams using a window and a 4 tier hash structure. -c make the 4-grams case insensitive and -n makes the 4-grams numerically insensitive. Overall, this process uses surprisingly little RAM or processing time. Furthermore, it has no effect on dense information but trims empty phrases commonly found in journalism. It removes duplicate articles; typically ones which have been syndicated around the "Intellectual Dark Web". Most often, unremarkable sentences with the same ending are truncated. From investigation, if it was trimmed, it very rarely contained anything of critical importance.

I may add further steps to reduce data and this may include grammatical analysis, word frequency analysis or text summaries to remove low-value sentences. At present, the output of these scripts may exceed 3 million words. Regardless, it can be read with the following scripts:-

  • ./speak-slow.pl reads at espeak's default rate of 150 words per minute (9000 words per hour) but with the pitch raised for use with headphones with speakers which are 32mm diameter.

  • ./speak-medi.pl reads at 300 words per minute (18000 words per hour). Ideal for fiction and technical documents.

  • ./speak-fast.pl reads at 360 words per minute (21600 words per hour) and eliminates common glue words for additional throughput. Ideal for bulk data, such as financial reports, pop culture and speculative research. This script has been set as high as 480 words per minute (28800 words per hour) but the ability to absorb information is limited without sustained use.

I may be inclined to make SIGUSR1 play/pause and SIGUSR2 read lines forwards/backwards through text.

espeak is able to write .wav to file or standard output. ffmpeg may read from standard input or concatenate .wav files. Therefore, it is possible for ffmpeg to convert espeak's output to .aac, .ogg or .mp3. Therefore, it is possible to make text-to-speech audio files which can be played, paused or skipped while away from your main computer. Keep a pen and paper handy so that you can follow references!

begin 644 script20200315.tar.gz
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
6]M?^VE_[:W_MK^_[^B_F?RJZ`'@`````
`
end

(Usual instructions for uudecode process.)

Simple Reliable Networking

Posted by cafebabe on Sunday March 08 2020, @03:41PM (#5117)
3 Comments
Hardware

I'm going to explain Simple Reliable Networking and I have to begin by explaining that any network protocol which is prefixed with "Simple" is currently a disaster or primed to become one. Examples include SMTP [Simple Mail Transport Protocol], SNMP [Simple Network Management Protocol] and SOAP [Simple Object Access Protocol].

It is in the public interest to describe a simplified technique for cell networking which can be implemented on Unix, Arduino or more widely. I have stripped many of the clever parts and reduced it to a system which can be implemented over serial links with UART start bits, stop bits and optional parity. The full implementation is effectively ATM Lite with 256 bit cells (16 bit frame marker + 6 × 40 bit encoded payload blocks) with error correction, novel routing and packet fragmentation. It also requires 6.5KB ROM and a 66kHz interrupt. These requirements are far too onerous for many applications. It is for this reason that I have devised a simplifed version.

There are a ridiculous number of unreliable network protocols and this is not an attempt to add to the collection. Many of these protocols are random successes. There are countless failures. A few of the unknown failures exceed the quality of the most popular implementations. However, the overall standard is generally poor. X10, DALI, MIDI, RC5, I2C, CANBus, DMX512, IEEE802.15.4 (including ZigBee) and many other protocols have a combination of flaws which include terrible bandwidth, no signal integrity, tied to transport medium, small address-space and/or terrible allocation of addresses and/or incompatible extensions, some of which attempt to increase addresses. These same protocols may be used to switch huge amounts of power, or control pyrotechnics. Even high bandwidth protocols, such as Ethernet and ATM have integrity checks which are demonstrably too weak for the volume of data transferred.

I'll start with the case of "smart" light clusters in a car. I want a micro-controller within each light cluster. Power is supplied from a battery (via fuses). I want to connect data in a ring from the dashboard, around each corner of the car and back to the dashboard. I would like to do this with identical firmware within each light cluster. In this arrangement, it should be possible for each device to obtain an implicit, sequential address without setting jumpers or suchlike. A jumper implies micro-controller pins. Pins implies metal and metal costs money. I am trying to do this with the smallest, cheapest circuitry and/or least number of firmware configurations. Primarily, I wish to do this without compromising safety.

In the general case, I am specifying a scalable I/O expander where each section of a chain is a few metres apart or more. In this case, it is preferable to have a stable protocol where all nodes have the same firmware - except for one host node which differs. This is particularly desirable during development because functional changes only require the host node to be re-programmed. All of the other nodes in the closed-loop network remain unchanged. So far, such specification excludes bus networks, such as CANBus, due to the required foreknowledge of network addresses. Unfortunately, closed-loop networks are also excluded for reasons which could be explained as a succession of "Don't do that" admonishments until we are left with something workable. The fictional detective, Sherlock Holmes stated "How often have I said to you that when you have eliminated the impossible, whatever remains, however improbable, must be the truth?" Well, this also applies to network protocols.

As I stated on Tue 9 Oct 2018:-

General Purpose I/O

A general purpose I/O expander system is of general interest because they are often implemented poorly. Multiple incompatible systems exist for Raspberry Pi systems. For some domains, this would be acceptable if basic database theory was applied to process control. (Error detection, read locks escalating to write locks, atomic commits.) More often, it is written for children or halfwits. And it is an insult to children. The typical scenerio is something akin to "Hey! I've got two Raspberry Pis connected via Ethernet and I'm running out of I/O pins. *Surely* I can get a program on one Raspberry Pi to flip pins on another?" And this is how we get pigpio and the numerous incompatible variants. Please don't use them; especially on hardware lacking parity RAM.

I first encountered this scenario when working with PIC micro-controllers. I found that PICs with more I/O were disproportionately more expensive because they came with additional RAM, ROM and interfaces which were not required. My idea, which was not unique, was to have an open or closed loop where all-but-one of the chips had identical firmware. This leads to the possibility that additional I/O pins don't have to be in the same place. For example, each node may control a cluster of car lights. The next consideration was addressing.

I didn't want I/O expanders with 16 I/O pins and then lose 8 pins to a hard-coded address. (Nor some variation thereof.) Nor did I want to maintain consistent addressing. So, I devised a protocol of three byte triples of the form <device>, <command>, <data>. In all cases, <data> is provided even if it is a dummy value. This allows upward compatibility and provides a placeholder within a closed loop serial stream for read operations. The part that I thought was particularly cunning was that the device number would be decremented by each I/O expander. It was hoped that every device could test against zero. This would allow the I/O expander at the head of the chain to be device zero. All subsequent devices would be numbered contiguously in ascending order and no I/O pins would be used for device addressing. Unfortunately, this scheme is very susceptible to bit error - before or after a triple is processed by the intended device. There is also the very fundamental problem that each byte of a triple may be mis-interpreted. For example, a command may be interpreted as a device number.

Loop networks have particularly poor reliability. Data may be garbled within a node and between nodes. When more nodes are essential to communication, scope for error is greatly increased. This alone should exclude any loop network configuration unless there is very good reason to retain it, such as cost over distance. This consideration of network reliability also provides a gentle introduction to networking trade-offs. In particular, the conflation or omission of fields. It is good practice to maintain data integrity with a checksum. It is bad practice to modify data - except in specific circumstances, such as decrementing a hop count to prevent endless packet routing loops.

Handling an address like a hop count is bad practice but how do we handle the contradiction that some fields should be unchanged and covered by checksum while others vary? Do we place all of the varying fields in one place and omit them from the checksum? Yes. In the general case, we have protocol layers and each layer should be wrapped with a length and a checksum. In the general case, it is possible to have an end-to-end checksum for variable length data and also a per hop checksum. With a packet/cell arrangement, it is possible to have unchanging packets of varying length and also malleable cells of fixed length. If the packet format has a hop count then traversal over any number of cell network nodes counts as one hop. So far, this is similar to inefficient mess of PPPoA, PPPoE, AAL5 and ATM. However, it is more abstract because a link layer is undefined.

Bit Stuffing

I will continue to assume that some kind of uni-directional link is required and that it can potentially be implemented over UART. How is it possible to distinguish 8 bit address, 8 bit command, 8 bit data and 8 bit checksum? I define a dumb, unbalanced 4/5 bit stuffing technique where one bit in every nybble is Manchester encoded:-

  1. Take 4 bytes of data.
  2. Split into eight 4 bit nybbles.
  3. Duplicate and invert the bottom bit of each nybble.
  4. Assemble these 40 stuffed bits into 5 bytes.
  5. Separate the 5 bytes with a marker which is contrary to the bit stuffing.
  6. The most obvious marker is 2 bytes which consists of alternating pairs of bits.

For a payload which begins abcdefghijklmnop, the encoded cell begins 00110011, 00110011, abcd, 1-d, efgh, 1-h, ijkl, 1-l, mnop, 1-p. So far, this encoding looks shockingly similar to Commodore PET floppy disk format and AppleTalk over MC6854 transceivers. A marginally smarter encoding would be current balanced 4/6 encoding. An equal quantity of zeros and ones in an ungrounded environment ensures that bits are more likely to be read correctly. Electrons conveying a signal are less likely to be repelled by a transient accumulation of Coulomb charge. This can be minimized with frequent emptying of bit buckets and other scheduled maintenance tasks. However, current balanced encoding ensures maximum reliability.

As I stated on Tue 9 Oct 2018:-

My primary use-case is hydroponics and home automation - where everything is grounded. However, my choice of bit-stuffing would look hopelessly naïve in an ungrounded automotive or aerospace environment. A quick fix would be Manchester encoding where every bit is echoed with the reverse polarity. However, that halfs the bit-rate. In typical cases, such as bit-stuffing with an even Hamming distance, it is possible (and often desirable) to have an equal number of zeroes and ones to represent each valid symbol. This maximizes current balance and discourages accumulation of static. For my purposes, unbalanced bit-stuffing is sufficient. Indeed, it is desirable for low-speed software implementation. This would be re-considered if an ungrounded and/or high-speed, hardware implementation was ever required. Similar choices define the different generations of USB, although neither USB 1.x, 2.x nor 3.x are current balanced within one wire.

In the case of 4/6 encoding, there are 20 encodings which have three zeros and three ones. We only require 16 of them. While it is possible for the surplus encodings to have special meaning, a cell marker of alternating quads (0000111100001111) cannot arise from any choice of 6 bit encodings. Unfortunately, 4/6 encoding is slower and more difficult to encode, slower and more difficult to decode, incurs significantly more transmission overhead and provides very minimal improvement to reliability. (I will show that the latter is moot.) For this reason, the dumber 4/5 encoding is preferable.

I can quickly prove that the incompatible encodings of cell marker and payload can be detected. Feel free to skip this proof. In 4/5 encoding, an uncorrupted pair of encoded nybbles (10 sequential bits), of any alignment and any value, cannot be mistaken for a cell marker. An opposing pair of bits occurs in every fifth place. The first or second occurrence must contradict the encoding of the cell marker. It is possible for short runs of payload to resemble the cell marker. Likewise, it is possible for short runs of cell marker to resemble payload. However, they are deliberately incompatible encodings and the cell marker pattern is always contradicted by the 10th bit of uncorrupted payload.

Unfortunately, no bits are special and it is possible for bit corruption to make the cell marker look like payload and make the payload look like a cell marker. There is no easy way around this problem except to make a series of graded filters in which a rigorous checksum appears somewhere between the link layer encoding and the application. A 32 bit CRC makes false positives exceedingly unlikely. Schemes guarantee, for example, 100% rejection of three bit flips over 13KB of payload. However, for any random pattern of bits with a valid cell marker and comb of complimentary bits, there remains a 1/4,294,967,296 chance that random static is accepted as a valid cell.

That may seem grossly improbable. However, I have yet to specify an application or its parameters. For automotive, I haven't specified the number of cells per second, the number of micro-controllers per vehicle, the number of channels per micro-controller, the duration of operation or the maximum number of vehicles. All of this makes the improbable much more probable. I can choose realistic figures where a 32 bit CRC fails daily, in the control of 200BHP or considerably more. Don't assume that the improbable is impossible. Just don't do that.

Deferred Two-Phase Commit

The next part of the solution solves this problem and a few others. Specifically, an XA style, two-phase, atomic commit (with signing) allows synchronous events to occur over an unlimited number of micro-controllers. Furthermore, within an envelope of lead time and bandwidth, synchronous events may occur reliably when there is a very high rate of cell checksum errors. As a trivial example, it is possible to get indicator lights to blink in unison, even if they do not have an autonomous blink function, even if 70% of cells are dropped due to data corruption. This cannot be achieved with MIDI, CANBus, pigpio or similar.

  1. Host sends signed message with future time offset, command and data.
  2. Host periodically repeats command with reduced time offset.
  3. Leaf node responds with signed acknowledgement.
  4. When all nodes respond and sufficient time remaining, host counter-signs all responses and begins second phase of commit.
  5. Host periodically repeats second phase until all nodes respond.
  6. Leaf nodes respond with signed acknowledgement.

This leads to several scenarios when changes apply to any number of nodes:-

  1. Nothing happens.
  2. Some things change and they all change at the specified time.
  3. Everything changes at the specified time but the host is unaware that all changes occurred.
  4. All state updates consistently.

Without exception, the cases between "all" and "nothing" reduce to a common case. The host is aware of some change. For N nodes, this is preferable to 2^N cases when N ≥ 2. You don't get that with pigpio.

Although I cite an example of blinking indicator lights (a system which I am most likely to implement with a 1:4 scale model vehicle, 12 surplus micro-controllers and 600 surplus LEDs) this equally applies to active suspension or traction control. Obviously, such systems should not be left in an inconsistent state. However, if they are managed in moderate steps then it is possible to be slightly inconsistent when failure occurs but not overtly inconsistent. For example, if network failure occurs during hard cornering and braking then the active suspension remains almost perfectly square. Maybe not level, but definitely square.

Topology

In response to CID746816 by UID4543 on Wed 10 Oct 2018, there is a fundamental problem with a bus or ring topology and this must be discarded. Everything on a bus or within a uni-directional ring is in the same domain of trust. Each node in a ring has to trust the others that query or response is not selectively dropped or modified by another node. Unfortunately, a "snowflake" or "hub and spoke" model is no improvement because there is more scope for MITM attack when a router handles the same request and response. In either topology, it is also trivial for a malicious node to exhaust bandwidth. In the case of malicious leaf nodes, bandwidth exhaustion can be averted splitting a network into a high speed and low speed sections and ensuring that malicious communication from the edge of the network cannot exhaust the bandwidth of a high speed link. Unfortunately, this is only a partial solution which facilitates other types of resource exhaustion, such as processing time to handle malicious cryptographic requests. Algorithms have to be written such that all types of resources are immune to resource exhaustion. Unfortunately, this is in an environment where event logging is minimal. Therefore, failures may be hard to diagnose and correct.

As I noted on Sun 22 Apr 2018, MITM can be averted with a double snowflake or double star topology which may be wired with routers from different vendors. Indeed, this exposes the insecurity of radio networking. Nothing is wired but everything is connected. This precludes a second route around a malicious party. By happenstance, double wiring may be preferable for reliability but this is not the primary consideration. Unlike ARINC664, double wiring does not increase susceptibility of malicious injection from the application layer.

A hub and spoke model partially solves network addressing. In the trivial case, network leaf nodes don't require a network address. Instead, it is possible to route by switch port number. With extremely high confidence, it is possible for a host to assign a random value to each node when seeking erroneous, duplicate wiring to one port - or correlating wiring across switches. In the trivial case, MAC is assigned at manufacture. However, it is cheaper for a factory to produce units with unwavering MAC and therefore all claims of uniqueness are contrary to market forces.

Initially, leaf node firmware will be undifferentiated. However, development will advance to the point where, for example, an electric mirror and an electric chair, erm, seat have different firmware. From here, it may be beneficial to query device type and/or enumerate type and purpose of pins which are exposed to the network. pigpio style functionality should be handled with extreme caution. However, this is the reason for cell encoding, parity, CRC and signing.

For automotive use (and many other applications), it may be beneficial for a host to remember a "high tide mark" of sane configuration. For example, if a host has ever found two electric mirrors on a network then finding less is an error. Additional electric mirrors may be useful when towing but are not part of the base configuration. Regardless, messages to additional mirrors are automatically routed. You don't get that with CANBus.

Addressing, Routing And QoS

Proper network addresses are useful and they are particularly useful when migrating from a hierarchical tree (possibly with dimers) to a generic mesh. A feature which is often lacking from uni-directional protocols, such as RC5, or short communication, such as CANBus and ATM, is a source address. For short messages, it is quite tempting to omit source address and make them shorter. In the trivial case, where messages are not signed, a source address field provides minimal security because any malicious party may populate the field with any random contents. For a source address field of S bits, malicious injection will be reduced at most by a factor of 2^S for stateful communication. For stateless communication or session establishment, there is typically no improvement. However, with the introduction of signed messages (and other safeguards in a protocol stack), it is possible that malicious (or accidental) injection becomes a lesser concern than winning a lottery and being struck by a meteorite within the same week.

Regardless, a network source address should be provided for the same reason that parcels have a return address. The network is untrusted but there are two classes of untrusted nodes: routers and leaf nodes. Hopefully, a router makes a faithful, best effort to forward data without modification. Hopefully, a leaf node responds to an application request. Omission of a source address field is willful conflation of these untrusted domains. Compare protocols without a source address field (CANBus, Win32 events, DBus) versus protocols with a source address field (Ethernet, IPv4).

With a packet/cell arrangement, It is possible to have a secure and verbose source and destination field within the packet and it also possible to have an insecure routing tag which only appears within a cell header. Furthermore, it is possible to introduce the most crude QoS. For any protocol, fragment zero (the first or only fragment) is handled as high priority traffic. Unfortunately, single cell communication does not have space for either a full source or destination address and relies only upon a routing tag. Overall, this leads to two classes of network traffic with complimentary functions. Single cell, real-time traffic implements source routing, as defined in a routing tag. A single cell is less trustworthy unless it uses signing and is part of a two-phase commit. Bulk data can be fragmented across any number of cells. Routing is more flexible and trust may be higher. Unfortunately, trust may be lower if legacy protocols are encapsulated. Regardless, cases are predictable and can be evaluated on merit.

This packet/cell, QoS arrangement has curious and desirable properties which are not widely available:-

  1. Immunity to some types of signal injection.
  2. Real-time protocols can interject in the middle of packet transfer.
  3. A router may transfer a packet which exceeds its memory.
  4. Trivial QoS is deterministic, protocol oblivious and upward compatible.

As a practical example, it is possible, although not necessarily desirable, for a host in a vehicle to confirm brake light activity while displaying a video feed from a rear-view camera. Brakes are immediate and the video feed uses the remaining bandwidth.

Finally, A Cell Format

I have yet to specify a cell size. After consideration of common cases, with examples and figures, it is possible to determine a minimum and practical cell size. There is pressure to make it as small as possible. This allows communication with more devices within a unit of time. It also allows faster and repeated communication with one device. As Bruce Schneier notes, it is better to have 10% of a trusted computer rather than 100% an untrusted computer. Meanwhile Sun MicroSystems noted that "The network is the computer." I logically conclude that it is better to have 10% of the channel capacity rather than none of it. This is a common failure of the unreliable network protocols. It is possible to be parsimonious until it is a false economy.

Anyhow, my proposal is fixed length cell structure with a minimum size of 20 bytes where many fields may be amortized over multiple cells:-

  • Mandatory 16 bit routing tag.
  • Mandatory 8 bit protocol multiplex.
  • Mandatory 8 bit fragment number.
  • Optional 32 bit CRC.
  • Optional 64 bit signature.
  • Optional 16 bit time offset.
  • Optional 8 bit command.
  • Optional 8 bit data.

The suggested link layer, with 4/5 bit encoding and 2 byte cell marker, requires 27 byte transfers. (Or 32 byte transfers, if you remain committed to 4/6 encoding.) However, these bytes can be sent over tty and/or micro-controller UART using very little software. Within the ever increasing field of networking, cells of this size are extremely uncommon. TeTRa allows 10 byte payload and one extension allows 16 byte payload. ATM uses 53 byte cells with a 48 byte payload. USB 1.x defines variable length packets up to 128 bytes. However, I cannot recall anything between 16-53 bytes as a fixed length cell size.

This simplified explanation omits a large number of topics including steps to improve reliability, reduce cell size, refragmentation, regenerative checksums, logging, routing, handshaking, bandwidth amplification attacks, selective acknowledgement, header compression, trunking, firewalling, stateful inspection, key management, host failover, upward compatibility, audio conferencing, video tiling, wireless considerations and use of cell structure for data storage. Regardless, it is possible and desirable to ensure negligible false positives within a network protocol.

Pong, Servos, Model Helicopters, Teddy Ruxpin And NeoPixels

Posted by cafebabe on Sunday March 01 2020, @04:07PM (#5092)
2 Comments
Code

This is one of my articles where I connect seemingly unrelated topics, such as Carbon, Hydrogen, Trojans And Javalins, perhaps VTOL, UFOs, Crop Circles, Graffiti, MIBs, Mandela, Octrees or the frankly alarming Pressure Cooker, Induction Heater, systemd, PHP and MySQL. In this article I will describe common functionality found in analog game controllers, analog servo control, WS2812 and WS2812x NeoPixel™ LEDs and other circuits. In all cases, a capacitor is filled via a current limiting resistor over a period of time. The time taken to fill the capacitor conveys useful information.

Pong

In games like Pong, an analog potentiometer controlled by a player forms the current limiting resistor which controls the rate at which a capacitor is filled. If there are two or more players, circuitry is duplicated for each player. If a potentiometer is turned to one extreme then a corresponding racket within game is at the uppermost position. If the same potentiometer is turned to the opposite extreme, the racket is at the lowermost position. How does this work? The games console is connected to a television. The games console transmits a serialized picture to the television. This is rastered like reading a book, from left to right, from top to bottom. Unlike a book, frames may be sent 25 times per second or much more frequently. Also unlike a book, a frame may be split into two separate fields in which the odd and even lines are sent separately. This provides a good compromise between signal quality and high speed action.

At the end of line's transmission there is a horizontal retrace period. At the end of each field or frame's transmission, there is a vertical retrace period. This is provided for two purposes. Firstly, it provides sufficient time for CRT electron beam deflection hardware to adjust to a new line (or field or frame). It also provides a synchronization pulse in the otherwise continuous signal. Early game consoles extended this technique to incorporate low level changes with each line of the display and high level changes. Low level changes include a decision whether to draw a racket or not, and modification of the playfield. High level changes include scoring during a game and, between games, selection of game parameters. It is functionality between these levels which is of interest.

At the beginning of display, a transistor empties the capacitor. During the display of lines, the capacitor fills until a threshold Voltage level is reached. The values for the resistor, capacitor and threshold are chosen to ensure this happens during display or a little afterwards. Furthermore, a logarithmic potentiometer is often used to compensate for the exponential curve of capacitor charging/discharging. The threshold may be detected by polling or interrupt and segment may be repeated over successive display lines, as determined by the difficulty level of the game, to represent one player's racket. On systems which are particularly starved for resources, such as an Atari 2600, a flag register records intersection between different types of display object, including wall, sprite, ball and missile. 50 or 60 times per second, this register may be queried to determine high level game behavior. In the case of Pong, it allows the velocity of a ball to be reflected before its position is updated.

This crude extension to rastered television created an unbelievable craze in the late 1970s and it continued to build for about seven years. Some of the early systems used dedicated logic and no micro-processor. Others, such as the popular Atari 2600, were supplied with a 6507 (a 6502 in a cheaper 28 pin package) and a generous 128 bytes of RAM. It only occurred to me recently that 128 bytes is insufficient to hold a full bitmap display but exceeds the memory which can be accessed during one scanline. Regardless, this is definitely an environment where it is critical to count clock cycles. A 1.19MHz 650x in a system displaying 262 pseudo-interlace NTSC has approximately 76 memory cycles per scanline. This is sufficient to make trivial Boolean choices and poke registers but little else.

Servos

Open loop analog servos use a similar arrangement of capacitor, resistor and discharge transistor to convey information. In this case, the system typically works faster. A smaller capacitor may be filled 400 times per second or more frequently. A common standard for analog servo signal is 1ms pulse for servo at one extreme of movement and 2ms pulse for servo at the other extreme of movement. This applies to a wide range of servos irrespective of size, power, angular range or linear movement. It was disappointing to discover such detail. My reaction was "That's it? That's your standard?" This is the lowest common denominator of protocol standards. It is easy to explain. It is easy to implement. It is easy to calibrate. It is easy to repair. It is an interoperable standard across a wide range of hardware vendors. More importantly, have you got anything better to compete against this entrenched standard?

Unlike Pong, there are two sources of pulse. One is transmitted from a controller which may be a hand controller or recording. The other is generated locally. The positive (rising) edge of the incoming signal begins the charging cycle of the local capacitor. This is moderated via a local potentiometer which is positioned at the end of a motor and gearbox. From here, one of two cases occurs. Either the capacitor reaches a threshold before the incoming signal pulse ends or the incoming pulse ends first. (In this analog arrangement, exclude the possibility of simultaneous change.) The signal mis-match nudges a electric motor in the middle of an H-bridge. The nudge is proportionate to the duration of the imbalance. Indeed, the motor is nudged with every pulse cycle. However, with a clean signal, the nudge may be sufficiently brief that the motor and/or gears do not overcome friction.

Remote Control Models

Remote control models typically require a minimum of two channels: locomotion and steering. Model helicopters require control for a minimum of three channels: main rotor, trim rotor and steering. Models may have other functional or decorative movement. While it is possible to modulate pulse trains with separate carrier frequencies, it is easier to implement a synchronization pulse and stagger the encodings for, maybe, eight channels. A standard encoder module and decoder module was available with such functionality and allowed encode/decode of up to eight servo pulse trains. I would be highly unsurprised if it was used to control Omnibot's numerous functions. It was definitely used in Teddy Ruxpin, an extremely creepy toy from the 1980s which is like the furry version of a Chucky doll. Teddy Ruxpin had a compact cassette player. Tapes had one channel of read-along story which used the standard modulated audio encoding. The other channel encoded eight channels of servo pulses. This controlled Chucky, erm, Teddy's eyes and suchlike and there was dedicated channel which could wired to the murderer's accomplice, erm, Teddy's little friend. Unfortunately, this channel did not use the standard modulated encoding and thus discouraged unofficial spoof tapes.

NeoPixels™

I've been working with LEDs and micro-controllers. It was inevitable that multiple friends suggested NeoPixels™. This is a brand of AdaFruit which consists of some marketing, some more marketing, marketing in the guise of tutorial videos, a completely borked library, overpriced circuit boards and some otherwise undifferentiated open-loop, serial, daisy-chainable, programmable brightness, WS2811 RGB LED controllers and WS2812 and WS2812x RGBW controllers with integrated LEDs. If you look carefully, unbranded parts have the same component numbers and are 1/3 of the price.

Independently, two of my friends physically connected a string of these NeoPixels™ to an Arduino™ and compiled the standard LGPL NeoPixel™ library with the standard LGPL Arduino™ library before flashing the resulting BLOB via a poorly defined protocol spoken by avrdude. From here, it is easy to tinker with example programs which generate rainbow patterns and similar. But how does it work? My friends didn't know.

I like to investigate more thoroughly. A WS2811 datasheet says that eight bits per channel of brightness data should be sent MSB [Most Significant Bit] first, with one byte for red then green then blue. For reasons which are completely unfathomable to me, a WS2812 re-arranges this to green then red then blue. Also, the protocol lacks any forward compatibility. So, there is no padding byte to maintain compatibility between RGB and RGBW LEDs. The WS2812 datasheet says that a zero bit should be encoded as a 350ns±50ns pulse and that a one bit should be encoded with a minimum pulse of 700ns and no maximum. Data is automatically set live after a minimum of 50000ns inactivity. However, electronics forums widely repeat the factoid that many components have a less tolerant timeout of 6000ns. That's a broad and unhelpful range. It is also a cockeyed encoding. What's wrong with serial UART with a start bit? I tried explaining this encoding to a friend. Before I finished my explanation, my friend said "So, it works like Morse code?" I was surprised. A fixed number of bits are sent with fixed spacing but, yes, it otherwise works like Morse code. In this case, dot and dash represents zero and one. But why choose this encoding? It retains a very useful property which is shared with Morse code. It is a self-clocking signal. The receiver doesn't require an oscillator or UART over-sampling. Transmission speed may differ by a factor of two and it still works. Furthermore, it requires very simple circuitry which is very small.

Rather than working at the scale of 50Hz/60Hz television or the 1ms timescale of servo control, this works at a 350ns timescale. For any given value of resistor, a capacitor can be shrunk and filled proportionately faster. The positive (rising) edge of the signal begins capacitor changing. The negative (falling) edge of the signal determines the sampling time for the capacitor. There is no maximum period for a one (dash) because the capacitor remains full whenever it is sampled. This leads to the opposite question. Why is this type of protocol not used everywhere? Due to signal skew, it is only suitable for short-range communication. Morse style encoding is only suitable for high speed communication or long distance communication. Choose one. In this case, it is high speed communication over a short range and each LED acts as a repeater to the next LED. For this reason, it differs from typical LAN/WAN encodings.

Unfortunately, there are multiple, incompatible variants of WS2811, WS2812, WS2812B and other LEDs. Most variants don't receive red values first, although there are exceptions. Also, there is no placeholder byte and therefore RGB and RGBW LEDs are mutually incompatible - unless they are used exclusively with very smooth monochromatic values or completely random values, which is unlikely. In the case that you receive the wrong variant, be ready to patch code, re-compile code and re-deploy code.

In practice, there are two modes of operation for WS2812 LEDs. If 24 bits of data are sent (or 32 bits for RGBW variants), data is shuffled along by one LED. If this is repeated 20 times per second or suchlike, it creates a soothing trail along an unrestricted length of LEDs. Or, at least, until a chain breaks or becomes intermittent. Given that LEDs are powered in parallel, problems are easier to locate than series Christmas lights. However, it may be difficult to repair if the chain is within a water-proofed strip.

The other mode of operation is to blat serial data at (approximately) 1Mb/s and flush through all of the previous values. This is the most practical method to make a progression of lights run backwards through a chain or otherwise allow arbitrary change per frame. The upper limit for this process is chain length reliability, power considerations and the product of chain length × frame rate - which is adversely affected by the vague timeout parameter. In practice, 512 RGBW LEDs can be updated at 60Hz. To improve signal quality or exceed this limit, it is possible to divide a chain into segments. Each segment may have a separate micro-controller and they may be co-ordinated via uni-directional broadcast messages over RS-232 UART or RS-485 multi-drop serial. The latter was successfully used to implement interactive Christmas lights at King's Cross Station and a one dimensional retro game which is quite addictive.

There are separate problems with Voltage and Ampage. A WS2812 LED requires a 5 Volt supply. Power is automatically pulse limited for 2.7V red, 3.0V green and 3.3V blue channels. However, the blue channel is most susceptible to Voltage drop. This creates an effect where color temperature through the chain may drop from white hot, to yellow hot, to amber, to nothing as it extends from a power supply. In the general case, Voltage drop can be minimized by affixing a power feed in the middle of a chain rather than at one end. This doubles the effective span of power collection/distribution.

The next problem is current. I ordered a huge quantity of RGB LEDs. However, after it arrived, I realized that it required a 5V × 8A current correcting PSU. I then sheepishly ordered a 16 LED ring for development and testing. If you are brave enough, it is possible to connect multiple switched mode PSUs in parallel and hope that the Voltage drop makes the arrangement self-balancing. If this doesn't work, it'll make a very loud bang, destroy equipment and/or catch fire.

Some display signage uses WS2812 protocol. Square and rectangular panels are typically sold with 2^N LEDs with 3mm or 5mm spacing. However, to minimize distance between LEDs in a square grid matrix, they are wired in a serpentine arrangement. Therefore, even rows of LEDs are left to right and this is alternated with odd rows of right to left. Any transfer of an arbitrary bitmap from a host requires alternate lines to be sent backwards. Panels are now available in fine strips which can be fitted to the inside or outside of a gentle and varying curve. However, the joints between rows are most susceptible to damage.

NeoPixels™ Library

I downloaded the current version of the library used by my friends. I unpacked the example programs, the 88KB library and the 2KB addendum which is required to compile on ESP8266 with different compiler flags. My first reaction was "Oh, fuck me. It's amateur hour." 90KB? To blink lights?? That's either very comprehensive documentation, a large number of example programs or someone is doing it wrong. After writing a replacement library, which is 4KB, runs on more micro-controllers and - using the optional bit matrix transpose - drives up to eight chains of LEDs, I conclude that all of the contributors to the NeoPixels™ library are doing it wrong.

In the official NeoPixel™ library, the bulk of the source code is inline assembly; mostly variants of code so that a subset of supported micro-controllers, via a subset of supported pins, may work with a WS2811's legacy half-speed mode. I wondered if it was possible to replace most or all of the platform specific code with something dependent upon the de facto F_CPU compiler parameter. I also wondered if it was possible to have a delay function which works on a larger timescale; ideally beyond one second. My initial strategy was as follows:-

  • Shim of assembly NOP instructions.
  • 8 bit loop which may be optimized away.
  • 16 bit loop which may be optimized away.
  • 32 bit loop which may be optimized away.

32 bit ARM is notoriously poor with 16 bit integers. It effectively has an 8/32 bit field on some instructions. Much of the remainder is handled with bitmasks. This is relatively tractable because many other instructions have a 2 bit field which allows an 8 bit constant 0xRS to be loaded as 0x000000RS, 0x0000RSRS, 0x00RS00RS or 0xRS00RS00. This allows the bitmask 0xFFFF to be handled relatively concisely. Regardless, the 16 bit loop isn't required on ARM. Actually, it isn't required on any other platform. After a few more tweaks, chose an arrangement which includes:-

  • 32 bit loop which may be optimized away.
  • Architecture optimizations to reduce size.
  • Shim which is a combination of Duff's device and NOP slide.

This works very well. For long pauses, a C pre-processor is able to calculate the residual number of clock cycles required for the shim. Meanwhile, for short pauses, a C optimizer can omit the 32 bit busy loop. In all cases, the shim is output as a sequence of idle cycles. The official NeoPixel™ code isn't completely terrible. I was able to salvage one line and use it for a space saving optimization. Specifically, for AVR, it is possible to replace a pair of one cycle NOP instructions with RJMP .+0 which takes the same time but uses less ROM. Similar practice covers other architectures. My contribution to portable assembly may extend to a volatile empty string within the 32 bit loop. This appears to work on avr-gcc but I cannot guarantee that it is universal.

The advantage of my technique is a portable, (mostly) clock-cycle accurate busy wait which works over a wide timescale. It should work on a superset of micro-controller architecture which has NOP instruction, lacks instruction cache, executes exclusively from internal storage and is supported by GCC or other C compiler with inline assembly. The disadvantage of this technique is a power hungry busy loop which does not count elapsed time within interrupts. It is possible to save 10mW or more, for a brief period, while waiting for a hardware timer. However, this energy consumption is a minor consideration when I target automotive or agriculture; handling kiloWatts or MegaWatts.

Arduino™ + NeoPixels™ doesn't cover every case either - and this is a horrible example of leaky abstraction. Arduino™ covers a small subset of micro-controllers. NeoPixels™ covers a different subset and is very specific about clock frequency unless you want to modify the inline assembly for each processor architecture. NeoPixels™ provides clock-cycle accurate timing for one specialist case, outside of interrupt, unless you want to modify the inline assembly for each processor architecture.

My code busy waits but it doesn't busy wait until a hardware timer interrupt sets a global flag. Arduino's camel case delay(short) and delayMicroseconds(short) may use AVR's gloriously inconsistent 8 bit TIMER0, 16 bit TIMER1 or 8 bit TIMER2, with no fall-through case, using a worked example from an Atmel, erm, Microchip Corporation datasheet rather than the best accuracy. If you require a re-occurring interrupt, you are hopefully using a different timer.

Remember that long pulses have no upper bound? This is particularly ugly. On some processor architectures, the NeoPixels™ library only works outside of interrupt but to maintain responsiveness, only disables interrupts around the short pulses. Regardless, interrupts should not exceed the official timeout of 50000ns or the unofficial timeout of 6000ns. This possibly requires empirical testing with each batch of LEDs because the alternative is counting clock cycles of disassembled output or setting another hardware timer. Neither is pleasant. Some of the cruft in the NeoPixels™ library is for compatibility with Wiring® which was secretly registered by one of its contributors. This subsequently incurred a fork of the project which was named after a bar which was frequented by some of the contributors. The bar itself was named after Arduin Of Ivrea, who was King Of Italy from 1002 to 1014. The NeoPixels™ library compiles with either branch.

For my suggested implementation strategy:-

  • Re-implementation is unrestricted. Reference implementation is negotiable.
  • Requires 2KB ROM.
  • Drives up to eight chains of LEDs.
  • Runs with interrupts disabled or inside interrupt.
  • Provides general purpose delay. Worst granularity is 62.5ns.
  • Does not require hardware timer.
  • Does not save energy during wait.
  • Unfortunately, delay period excludes time elapsed in interrupt.
  • Works with all batches of LEDs.
  • Effectively, it works on micro-controllers with NOP instruction. Should work on AVR, ARM (SAM, STM, MSP432), ESP, 8051 and beyond.
  • Optional shim provides compatibility with a subset of Wiring®/Arduino™ functions. There is no shim for NeoPixels™ because it is too broken.
  • Porting to new processor architecture requires disabling interrupts, defining digital pins and setting clock cycle constant for loops.
  • Has best code quality. Suitable for automotive applications.

For Arduino™ + NeoPixels™:-

  • LGPL. At the minimum, failure to supply object code to customer is illegal breach of contract.
  • Requires 3KB ROM.
  • Drives one chain of LEDs.
  • Runs with interrupts disabled or outside interrupt. On some processor architectures, it can also be run at the highest interrupt priority.
  • Provides general purpose delay. Typical granularity is 5000ns.
  • Requires hardware timer.
  • Does not save energy during wait.
  • Delay period includes time elapsed in interrupt.
  • Each permutation of micro-controller, compiler and library such be empirically tested with each batch of LEDs. However, due to component drift, this does not guarantee long-term compatibility.
  • Works on small subset of micro-controllers running at specified speeds.
  • The official NeoPixels™ library works with the official Wiring® or Arduino™ library.
  • Porting to new processor architecture requires disabling interrupts, defining digital pins, choosing a random hardware timer and contributing all changes to Arduino™. It then requires writing clock frequency specific bit banging assembly for a subset of supported I/O pins and contributing all changes to AdaFruit. If changes are ignored then you will have to maintain your own forks.
  • Has worst code quality. Not suitable for automotive applications.

This is an unsatisfactory situation. There are many applications where neither implementation is suitable. Arduino™ + NeoPixels™ is most suitable for trinkets, although mass production is inadvisable. My implementation is most suitable for high power control and could be extended to low power control.

Re-implementation, with the described strategy, may be most suitable for a kernel module. This would allow multiple chains of WS2812 LEDs to be driven directly from a credit card computer; typically running Linux or BSD; most typically, a Raspberry Pi running Raspbian. This is not possible from an application due to privilege and timing problems. Furthermore, the NeoPixels™ library is not compatible with Broadcom's ARM I/O implementation. Most micro-controllers and implementations of ARM micro-processors have registers to specify if a pin is digital input or output. This may be subsequently overridden by enabling a specialist unit, such as UART, I2C, PWM or analog. It is quite typical for a pin to have five seperate functions specified across three or more registers. Broadcom takes a refreshingly sane approach and provides 30 bit registers which allow the function of 10 pins to be specified in octal. It could be improved by having 32 bit registers which allow *consistently* numbered functions to be specified in hexadecimal. Regardless, it is unusual and therefore neglected.

Feature Request

I would dearly like a variant of WS2812 LED with a restricted palette suitable for automotive use. Although it is possible to restrict color in software, I would also like a hardware interlock. This would prevent anything outside of typical light cluster colors. This can be easily achieved with a small amount of logic. Imagine a RGB color cube. Black in one corner. In adjacent corners are the primary colors: red, green and blue. Opposite to black is white. In adjacent corners to white are the secondary colors: cyan, magenta and yellow. If R ≥ G ≥ B then only 1/6 of the volume (a skewed tetrahedron) is available. This limits color within the range of black, red, yellow and white. It prevents green, blue, purple or any permutation (due to transient error, corroded wiring or other condition) which may be mistaken for emergency services. It also prevents citation for a vehicle with illegal lights while allowing matrix LEDs with user configurable indicator patterns.

Edit 1: By chance, I encountered the author of the one dimensional game. Said author confirms that the NeoPixel library is junk and recommends FastLED. I skimmed through the code and I confirm that it is far more competent. However, it uses C++ templating for clock cycle delays which is quite hairy.

My Ideal Car, Part 4: Pics Or It Didn't Happen

Posted by cafebabe on Monday February 03 2020, @05:51PM (#4971)
8 Comments
Hardware

I wrote a 13000 word epic about vehicle design and I could have written more. In this post, I'm going to try a more graphical approach to explain ideas. In particular, I'm going to explain why I've rolled sheets of paper into tubes and taped them together. Specifically:-

Deprecated Design

I previously considered making a pyramid car because the triangle shapes should be strong. Apparently, this is an old idea. A friend presumably searched for 'pyramid car' and found a 1980 concept car, Citreön Karin, with a glass pyramid roof and three seats. The interior is lovely and very much in the style of the NCC1701-D's bridge. The steering wheel and keypad on the steering wheel is dodgy but it is otherwise a fantastic design. Where can I buy one? I'd definitely drive it.

Proposed Design

Unfortunately, a pyramid vehicle is only safe for one occupant in a center position. I would say I'm working on a more conventional design. However, it is more like BigTrak, shuttlecraft Galileo or Africar.

I'm working on a hilariously small development budget. Regardless, this is more than sufficient to make prototypes of a space-frame design from rolled paper at 1:10 scale and 1:4 scale. Apparently, 1:4 scale prototyping is standard in the car industry. This is understandable because this scale is quite convenient to carry through doorways. However, I'm not sure that it is common practice to use Build-A-Bear plushies as crash test dummies. Regardless, I take safety sufficiently seriously to order safety clothing for bears. This includes crash helmet, goggles and dungarees.

Future Developmemt

I'm currently working on a 1:4 scale metal frame. Unlike paper models, this is suitable for a small combustion engine. (The full size design is parameterized but the default configuration has enough space for a Mercedes AMG engine.)

It is possible to make considerable progress with vehicle development by working entirely on scale model prototypes. Indeed, it is possible to install a credit card computer and miniature displays. From here, it is possible to have a reversing camera, music system or similar features found in modern cars. I won't spend much time on conveniences. I just want to show that it is practical and affordable to develop most features at scale. I'm more concerned about functional matters, such as energy efficiency. I also want to work on the killer feature of the proposed design. Specifically, the dashboard is three columns of 19 inch racking. The allows after-market functionality to be easily added. However, I'm working at 1:4 scale and therefore I'm currently investigating 1:4 scale 19 inch racking. This may be of general interest for projects which don't involve vehicles (or bears).

Given the miniaturization of electronics, miniature racking may be of interest for hi-fi separates, server farms or other applications. For example, it is possible to fit a credit card computer into a 1:4 scale rack. It is also possible to fit a 12 channel, surround sound amplifier into the same space. Indeed, it is possible to fit quite a powerful and flexible entertainment system into the space of maybe half an IKEA pigeonhole shelf. I don't mean half of the shelfing. I mean half of one pigeonhole.

At full scale, I might have a glider ready for London's next Red Bull Soapbox Race. Previous events in London have been on odd years, on the first or second Sunday of July. Assuming the event continues, it is unlikely to be on Sun 4 Jul 2021. It is more likely to be on Sun 11 Jul 2021. Admittedly, if I'm entering a glider into a comedy cart competition, I haven't made sufficient progress.

How You Can Help

  • The instructions, diagrams and a spreadsheet to calculate sizes are at the end of the previous post. Example pictures of construction may also be useful. Please verify the design or use the techniques to make a competing design. The objective is to make safe, affordable vehicle which is easy to repair (and also cheap to prototype). If you have better a technique or a cheaper, safer design then we will readily adapt to your methods.

  • Work on electronics or firmware. There is essential and non-essential functionality. The six channel agricultural light (hardware, firmware) is easily adapted into a automotive light cluster controller which can drive 55W headlights. Anyone who has driven a strip of NeoPixels with an Arduino will find the frivolous functionality in a Mini trivial to replicate.

  • Request parts from us. Collect in London or we'll list them on EBay at cost. For some reason, you may want a 1:10 scale paper model rather than making your own from instructions. To send this within the UK it would cost £5 or less. Larger models and stronger material is likely to cost considerably more. Light clusters (5V, 12V, 20V or 48V) without PSU would be less than £10 per pair. Cost of 1:4 scale racking is currently unknown.

  • Welding. Technically, I'm trained to arc-weld but I know my limits. All welding tasks paid at commercial rate.

  • Looking for opportunity to promote this design and I'm not too fussy. If someone has an *actual* production budget for a music video and wants something unique, interesting and visually arresting, well, we've got it. And whoever pays for the hardware keeps the hardware.

  • If you're in London then come to the weekly geek meetings where we discuss this and other topics.

Mon 27 Jan 2020: London: Weekly Geek Meeting

Posted by cafebabe on Monday January 27 2020, @06:14PM (#4941)
8 Comments
Career & Education

The weekly geek meeting, which occasionally incorporates Sewing For Physicists, has changed day, changed location and gained additional attendees. We now get 3-7 people who meet at the back of The Foxglove Public House, 209-211 Liverpool Road, Islington, London, N1 1LX, which is approximately 400 metres North of Angel Underground Station. This is not to be confused with The Regent on the North West corner of Richmond Avenue and Liverpool Road.

Unfortunately, we now meeting at an independent pub where drinks are more expensive due to the lack of volume purchasing or volume selling provided by (politically divisive) companies such as Wetherspoons. Restaurant options are slightly more limited. There is a Vietnamese restaurant between The Foxglove and The Regent. Alternatively, The Regent serves two pizzas for £14 on Mondays and Tuesdays. The Regent also has an unusual item on the desert menu which will be sampled at some point. Specifically, Nutella and banana calzone. The Regent also has a comedy open mic night in its (rather small) basement. Previous attendees include Rob Beckett, Sara Pascoe and dozens of other professional comedians. So, if you get bored with our geek conversation, there are other options within the immediate vicinity.

We will possibly discuss:-

Any reference to the UK leaving the European Union, colloquially known as Brexit, will initiate a game of Mornington Crescent or reference to Brawndo. Political comedy is two doors along and in the basement.

My Ideal Car, Part 3

Posted by cafebabe on Tuesday December 31 2019, @12:09PM (#4864)
5 Comments
Hardware

(For previous text about vehicles, see Part 1, Part 2 and Goodwill. Also see index of linked ideas.)

For more than 10 years, I've considered a pyramid car design. This impractical design is deprecated. However, since Nov 2018, I have been gathering requirements for a more practical implementation. The result is an angular, squashed hexagon cylinder with a truncated front. This text explains some of the design decisions and explains how you can make a remote control scale model of the design.

Enumeration Of Constraints

There are different arrangements for vehicles:-

My deprecated square based pyramid design was an attempt to economically compete with sub-compact/sedan/station-wagon designs:-

In the smallest version, I considered using the tip of the pyramid for storage. In the smallest two versions, I considered one door at rear. In the largest two versions, I strongly considered 19 inch racking between the engine and passengers. However, beyond that, I hadn't really considered the practicalities of steering, doors, windows - or even changing a tire.

I abandoned the design after reading about a failed prototype car. The gas turbine car featured in the television series, UFO was a commercial failure because it was introduced around the time of the 1973 oil crisis. Furthermore, one of the actors from UFO, Ed Bishop, who portrayed Colonel Edward Straker, often bumped his head against the sloped glass of the door window. This made me very concerned that flat glass windows were impractical and/or dangerous. I'd like to make a very safe design and too many vehicle manufacturers knowingly compromise safety. However, a "safe" chassis is worthless if occupants are more likely to be injured or killed by glass. I want a safe design which can be manufactured at home; possibly as a single unit for myself. One of the many barriers to vehicle manufacture is automotive glass. It is generally curved and designed for a specific vehicle. Sourcing such glass constrains a design until it is redundant, dangerous or tied to the obsolescence of the intended vehicle. I wrongly assumed that the era flat glass in vehicles was over until I began watching car reviews.

From Nov 2018 to Dec 2019, I watched more than 40 hours of Doug DeMuro's car reviews. These are generally 20-30 minutes and are quite detailed. Each video covers atypical placement of handles and switches - and even strange menu items in car computers. Doug also has 10 category DougScore™ which is summed as a percentile and collated as a spreadsheet. From this, I have iteratively gathered design constraints, sketched an outline design, gathered more constraints and refined the design. I settled on a mid-engine design for very simple reasons. Designs with engines at the front have been explored extensively and there is a glut of examples to purchase. Indeed, I'd be arrogant to compete with these designs. However, mid-engine and rear-engine designs are significantly more sparse and generally more expensive. At the very least, this could improve the margins of a commercial venture. We are also at the twilight of internal combustion engines. With the proliferation of high power semi-conductors, re-chargeable batteries and cameras (often mandated by regulations), the conventional arrangement of engine-block-at-front is open to review. This is especially true if a vehicle doesn't have an ICE [Internal Combustion Engine].

Designing a mid-engine vehicle is relatively unconstrained. Fortunately, the process is greatly simplified by copying previous designs, as is common throughout the industry. The process can be summarized as:-

  • If practical, copy from original version Toyota MR2.
  • If practical, copy from original version Lamborghini Countach.
  • If practical, copy from McLaren F1.
  • If practical, incorporate long list of features from more modern designs.

Toyota's MR2 is an almost a perfect car. It is easy to drive and easy to park. However, the dinky two seat mid-engine design relies upon a Wankel engine. Historically, the extended path of the triangular pistons required frequent engine re-builds. Alloys may have improved but a Wankel engine remains an exotic choice to the extent that Doug DeMuro reviewed 99 cars in 2017 and only one obsolete model had a Wankel engine (a Mazda RX-7, see here). Would prefer to allocate space to more conventional choices. This does not exclude use of a Wankel engine.

McLaren's F1 has a center driving position. Admittedly, this involves swapping the conventional number of rear-view mirrors and sun visors. Surprised this is not more common because the additional seat incurs minimal additional length. Placement of doors suitable for driver and passengers means that passengers are recessed from doors. This allows better crash protection because passengers may be fully shielded from side impacts by fixed beams. Likewise, the driver is always half a seat away from a side impact. Perhaps it is not popular because the official US version involved "deletion of side seats" to obtain safety certification. The US version of the McLaren F1 is therefore single seat, driver only.

General observation is that flat glass was common in the 1950s but also that designs become more rounded over time:-

Even within Lamborghini designs, there is a distinct progression of style:-

Vehicle bodies tend to get more rounded over time. Compare:-

Therefore, iterations of a blocky design become more rounded over time. However, design elements of a Lamborghini Countach are of particular interest. Is it possible to make something like a Countach but more practical, with the footprint of a commodity sedan without specialist car industry CAD software? Oh, definitely yes.

It is possible to make a flat glass, irregular pentagon/hexagon windscreen with a single recessed wiper which sweeps the vast majority of the windscreen in 90° or so. The steering column and wiper motor assembly is also compatible with two columns of 19 inch racking. In addition to Lamborghini's deprecated pentagonal windscreen, it is possible to retain the extremely popular wedge shape of a super-car. Although it is possible to have storage at front - and some cars have the ridiculous constraint that it should be possible to carry one full set of golf clubs - it is possible to abandon this constraint entirely and have a front access hatch which is primarily for rack cable access, fuses and air conditioning.

The vehicle is primarily intended to be four wheel drive diesel electric. Over a sufficient number of wheels and a sufficient number of motor phases, 5kW MOSFET or GaNFET transistors are more than sufficient to make a small vehicle accelerate fast. Regardless, I want redundant engine mounts so that it is possible to fit a Chevrolet Straight-6 engine, other common engine and (if internal combustion engines become illegal) retro-fit as fully electric. It is intended that the chassis can be retained for 30 years while the engine and electronics are re-fitted every 10 years or so.

A hill-billy home-brew SUV F1 MR2 Countach may look ugly. If the external shell of a hypothetical Countach van (without swept back) is stretched to the height, width and (almost) length of a Ford Focus, it'll look midway between a street cleaning machine and a super-car. However, with the exception of seating and public liability insurance, it'll moderately out-perform a Ford Focus on safety, depreciation, fuel efficiency, range, speed, acceleration, ease of repair and entertainment options while steadfastly not looking like a family sedan.

Home-brew construction requires tubular steel. It is possible to make a tube chassis from vanadium steel, aluminum, titanium, magnesium or other material. However, use of stainless steel is assumed for ease of construction and repair. Unfortunately, a bonded chassis has become more popular than a tube chassis due to cost (and repeat sales). This has occurred due to the following progression:-

  • Early cars were made from wood by boat builders or wagon makers.
  • Wood was replaced by sheet steel after the introduction of mass produced cars.
  • sheet steel was replaced by cheaper corrugated, welded steel before the introduction of robotic production.
  • Corrugated steel was a water trap and often caused premature corrosion. Therefore, liquid wax was dripped into holes to repel water.
  • Wax was replaced with glue to aid chassis strength. However, attempts to repair a buckled chassis with a hydraulic ram and welding is impossible because it destroys the structural glue.
  • Manufacturers would make cars from spit and paper if it was cheaper. Fortunately for the general public, an industrial quantity of spit is more expensive than the current materials.
  • Regardless, a bonded chassis is touted as a feature despite sheet steel and corrugated steel being easier to repair.

Compounding this arrangement:-

  • Mass production barriers to entry, regulatory capture and predatory loans have raised the cost of a vehicle beyond the cost of manufacturing one unit. (Economy of scale no longer applies.)
  • In particular, it is not possible for a manual worker to purchase their own vehicle over the course of one year; a practice established by Henry Ford to ensure that vehicles obtained mass market adoption.
  • The cost of a vehicle and the duration of a vehicle loan may exceed the median lifespan of a vehicle.
  • Many people are economically dependent upon a vehicle and are repeat customers for bonded chassis vehicles which resist repair.

The way out of this trap is to use a different construction technique: tubular steel. It has the benefits of corrugated steel, is easy to repair and avoids premature corrosion. So, how should the tubes be arranged? The deprecated pyramid design has uninterrupted tubes which run from front to back and from side to side. The remainder is the minimum number of triangles to hold them all apart. This provides integrity for front impact, side impact, rear impact and roll-over. However, placement of the wheels is unspecified. I would like to retain bars or tubes; especially lengthwise. A more moderate design places wheels beyond two parallel tubes. This provides protection for driver in a central position but does not provide protection for passengers. I considered various arrangements including squares, triangles and even a squashed dodecahedron inspired by Richard Buckminster Fuller. Perhaps this is not the best inspiration, given RBF's failed, fatal vehicle venture. Regardless, the windscreen is a relatively weak open pentagon and I hoped to increase its integrity by constraining everything around it. One fruitless avenue was 12 pentagons where 11 of them are each split into three rigid triangles.

The proposed solution is a squashed hexagonal cylinder with one end sliced off to make an angled, regular hexagon for a super-car style wedge front. The regular hexagon at the front is sub-divided with cross tubes into an irregular pentagon windscreen (like the outline of the SuperMan logo), front light clusters and an access hatch for electronics. The wheels may be placed under the corresponding tapering hexagonal body. Between the axles, the chassis may be extended to a rectangular bottom to accommodate two passengers who flank the driver's center position. However, this does not explain how passenger safety is maintained to a standard which exceeds a McLaren F1. A cross section of the hexagon cylinder between the engine compartment and the cabin is a mesh of tubes. This acts like the roll cage in, for example, a Porsche 911 GT3RS 4.0 except that it is integral part of the base design rather than a retro-fitted cage. The cabin's rear wall and floor are both a mesh of triangles. The doors have side impact bars which lock into the side triangles. Passengers are protected on four sides of a hypothetical cube and are sufficiently protected if a vehicle rolls. The driver is a different case and the driver's feet (near the very front of the vehicle and between the front wheels) are particularly vulnerable to front impact and side impact injury. In particular, should avoid type injury incurred by Alex Zanardi. In these cases, the broader wedge with two wheel wells (and reduced speeds) permit a design which buckles downwards and avoids crushing legs between metal.

This is not a full enumeration of mass market safety tests applied to all occupants. It certainly doesn't exceed specification. However, this is sufficient to iterate a design to a scale model prototype. Before making a model, an outline idea of doors and windows is particularly useful.

It is possible to affix doors in a variety of configurations. I prefer doors with vertical hinges and three stop positions. However, it is becoming common for car doors to work like laptop hinges and stop at any position. Also possible to have near vertical hinges to avoid curb scrape. This may be combined with "puddle lights" which shine a logo on the ground and the new trend is to shine a color logo. Possible to have a horizontal hinge and gull wing doors, although this is quite impractical. A feature of the Toyota Sera design (which was copied in the McLaren F1 design) is doors fixed at the side and top of the windscreen to make a more practical version of gull wing doors. Other variations for doors include the highly impractical scissor doors; commonly found on a 1980s Lamborghini. Koenigsegg has a more practical version of scissor doors where the doors push out and spiral upwards. This has the exoticism of scissor doors and the practicality of a sedan. I presume this feature is patented and not available for license. Further options with doors include the downward motorized doors of a BMW Z1 and the pointless over-hang of a T-top Ford GT.

Safety features on doors may include rear reflectors and/or warning lights. Some vehicles also have a cross hand latch which encourages an occupant to avoid door collision with an approaching cyclist. This Dutch reach-around technique (repeatedly featured in London's Evening Standard) emphasizes the importance of industrial design. This practice, enforced by latch design, could save an estimated eight lives per year in the Netherlands - none of which are connected the driver or occupants.

Doors and roof may be partially or fully glass. This looks exotic on a McLaren Senna (see Doug's review) and aids parking. However, it may encourage comparison to a street cleaning vehicle. The roof may be fitted with liquid crystal to obscure sun. (See Doug's fascination with this feature.) Polarizing planes around the liquid crystal may be chosen such that the roof defaults to clear or opaque when electricity is not applied. Like a Lamborghini Countach (see Doug's review), flat angled glass restricts lowering a window fully, if at all. However, like a Lamborghini Espada, it may be possible to open a pane with a lever.

The proposed design is not intended to be made as an open top model. However, the design has space for eight or more steel tubes which may run the full or partial length of the vehicle. Therefore, it is trivial to stiffen the floor of the chassis. Similar opportunity exists to stiffen the windscreen frame. Actually, a sneaky ruse played by multiple super-car manufacturers is as follows:-

  1. Make car.
  2. At "end" of production run, make one or more "limited edition" "high performance" models.
  3. Make an open top model.
  4. Maybe boost performance further and make an limited edition, open top, high performance model.
  5. Discontinue car and introduce successor made by the same staff in the same factory.
  6. Repeat scam.

Anyhow, we confirm that there are absolutely no plans to make an open top model despite changes to the blue-prints being trivial. Likewise for a gull-wing T-top. It definitely won't happen.

I semi-jest about Audi, BMW, Porsche and Volkswagen designs all being interchangeable (and Porsche and BMW drivers taking 50% more priority because they paid 50% more for their interchangeable sedans). However, there is one marketing gimmick definitely worth copying from Audi R8: each model is only available in one color. I therefore propose the following colors:-

  • Version 1 [Flux]: Unpainted like a DeLorean DMC-12.
  • Version 2 [Hornet]: Black and yellow.
  • Version 3 [Mansell]: British Racing Green. This is dark green; not the pastel green or mid green commonly found on street sweeping vehicles. Totally different. No comparison.
  • Version 4 [Stark]: Metallic orange for the completely fictitious, hypothetical open top version which isn't planned.

Actually, I might save British Racing Green for a version with the best feature. By using the same materials and components (but in different quantities), it is possible to greatly improve traction by adding extra wheels. The most obvious method is to make a longer vehicle with an extra axle. However, it is also possible to remove passenger seats and add another axle behind the doors. This has several advantages. An all wheel drive vehicle has approximately the same weight but with six motors each powering a wheel. Traction is improved by half. For safety certification and insurance, the engine is unchanged, vehicle length is unchanged, wheelbase is unchanged and side impact handling is effectively unchanged for the driver. It is also very distinctive. Six wheel vehicles are relatively rare. Examples include the six wheel Land Rover design and the Formula 1 Tyrrell P34 which raced in 1976 and used four small front wheels in an attempt to improve aerodynamics.

A single seat design and a lengthened design remain compatible options. Therefore, it is possible to have more than six wheels to further improve power delivery. If the design is particularly fast, may want to stagger wheels like the BloodHound with the intention of reducing shocks. As a marketing gimmick, may want proposed design painted green, with rotary street cleaning brushes, billed as The World's Fastest Street Cleaning Machine.

Requirements

Mandatory requirements include:-

  • Trunk emergency release (or divider) to meet US regulations about kidnapping. (See The Bugatti Loophole.)
  • All lights fixed in place to meet US regulations.
  • Side reflectors to meet US regulations.
  • Side turn indicators to meet European regulations.
  • DIN13164 medical kit to meet German regulations.
  • Hazard triangle to meet French regulations.
  • Reflective yellow vest to meet French regulations.
  • Air bags are subject to manufacturer minimum purchase quantity. Air bags are not usually purchased in small quantities but the minimum quantity may exceed the total budget. Alternative option is to purchase air bags intended for a different vehicle and hope that hardware does not have DRM or that DRM can be cracked. However, this is also fraught with difficulty because the explosive caps in air bags have potential for significant mis-use.

Essential requirements:-

  • Should comfortably transport three overweight adults. 7 foot (213cm), BMI 35kg/m2, 160kg.
  • Should comfortably transport one morbidly obese adult. 7 foot (213cm), BMI 55kg/m2, 250kg.
  • (Note that BMI is correctly applied to a statistical range of potential customers and is not applied to an individual.)

Disability access:-

  • Wheel-chair access, if possible.
  • Inductive loop to allow vehicle audio to be received by people with hearing aids.

Desirable requirements:-

Optional safety/anti-theft features:-

Less important options:-

  • One piece padded steel seat.
  • Five point safety seat belt which may be used in four point configuration to accommodate, for example, a ballgown. This may not be available in US due to regulations related to racing cars. Doug DeMuro, former employee of Porsche in US, stated (near end of one of the numerous Porsche 911 reviews?) that it was common practice to supply a complimentary five point safety seat belt if fitted after purchase.
  • Storage under each seat.
  • Symmetrical glove boxes - or perhaps asymmetrical if only one side can be locked. Unfortunately, each glove box is smaller than typical due to center driving position.
  • Handbag holders.
  • Gearbox and flywheel option so that vehicle can be used as mobile motive power, like a steam roller. (Some people used a Ford Model T in this configuration.)
  • Spare wheel on roof or rear.
  • Roof rack.
  • Lockable roof rail system for flight cases and luggage. (Inspired by metal suitcase with removable lithium-ion battery charger.)
  • Power and data for flight cases and luggage.
  • Umbrella and holder, as commonly supplied with Aston Martin vehicles for US$295. Unlike Aston Martin, the umbrella will be a sensible price and contain a safety light.
  • Solar panels. They don't gather much energy but are typically used to power ventilation when parked.
  • Air conditioning with perfume selection. Oversize container system reduces refill frequency. It also allows use of scents from all major rivals. Suggest 4 inch × 4inch × 4 inch (10cm×10cm×10cm) container with up to four compartments. Adapter box allows use of single or multiple compartment scents from Mercedes and similar.
  • Separate climate zones.
  • Dedicated buttons to heat/cool/vent each seat.
  • Dedicated buttons for each climate zone. Acceptable to multiplex buttons (but not display) where multiple occupants can easily access a shared panel. Unfortunately, the proposed seating arrangement has no method to share buttons in a manner which retains symmetry.
  • Separate audio zones.
  • Vehicle co-ordinates available via SMS.
  • Accelerometer.
  • Screen-casting. (See suggested technique for implementation.)
  • Option to replace one or two passenger seats with floor to ceiling racking. Unfortunately, not full depth and may be partially obscured by driver seat.
  • Pipe organ.
  • Picture gallery.
  • Plant vase.
  • Potato clock.
  • Geometric stitching.
  • Aston Martin occasionally has a good idea. Specifically, VIN which excludes all instances of 4 and 8. In Chinese, "four" and "eight" sound like the words for "death" and "pain". Buildings in China (particularly hospitals) don't have 4 or 8 floor. I wonder what the Chinese think of the gambling website 888.Com? In Chinese, that would sound like "pain pain pain blah blah". More pertinently, vehicle numbering would effectively be octal and this would not be first instance of such a restriction. For transport geeks, London's Piccadilly Line was scheduled by an 18 bit mini-computer which used octal numbering for the train carriages. This practice continued for many years after the restriction was eased. In a separate case, Swiss railways have an 8 bit unsigned roll-over problem and therefore trains are not allowed to have 256 axles.

The interior of the proposed design similar to the interior of a Boeing CH-47F Chinook (or Vector W8 "aeromotive" design, see Doug DeMuro's review) with rack mount displays and two columns of switch panels. Difference to Chinook design is additional rack for displays and the two columns of switch panels separated by a middle seat. The panels are intended to be multiples of 4 inch × 2 inch (10cm×5cm) and be of the following types:-

Some features were not relevant to this design but may of particular note for competing designs which incorporate a tailgate. Specifically, ensure that the design has a extensible rotating cage like a Subaru Baja and seats and cup holders like a Pontiac Aztek while conforming to regulations about lights and license plate.

Optional packages include:-

The floor to ceiling cuboid of space behind the driver and between the passengers is a miscellaneous volume which may vary significantly:-

  • The bottom is the logical place for a sub-woofer - but that assumes all occupants want same audio source.
  • May be good location for a refrigerator which opens at top - if kitchenette not installed.
  • May be suitable for arm rests and cup holders but that's unimaginative.
  • May be suitable to hang clothes. However, available space is relatively small. May be worthwhile to develop a coat hanger which folds in half if it does not exist already.
  • May be worthwhile to install a metal divider. The proposed design may only transport three people but it is possible to transport two children without them prodding each other behind your back.
  • May have step to aid access to shelf in rear compartment.
  • May be suitable for transporting small pets, such as a lap dog.
  • From the Rules Of Cute: Anything with a smaller version of itself is cute. May be space for one or more plushie seats. 16 inch (40cm) Build-A-Bear is approximately 1:4 scale. Actually, making prototypes at Build-A-Bear scale may be a very worthwhile exercise. 2 inch (5cm) tubular steel would be reduced to 0.5 inch. 20 inch wheels would be reduced to 5 inch. 19 inch racking would be slightly less than 5 inch and the accessory panels would be reduced to 1 inch × 0.5 inch. Material cost is approximately nothing compared to real car. However, it remains possible to make a remote control gasoline electric car with working light clusters, credit card computer, 8 channel CCTV and 4 miniature displays. For safety, don't scale this to a live system without ECC RAM. Regardless, this is a fun and affordable method to prototype. A scale model unlikely to be more than 20kg (including three occupants). May fit carry handle to roof for convenience. Actually, I'm semi-seriously considering a hoop in the full size design so that all accurate scale models include a carry handle.

Target Customers

I assumed this would be a niche product (possibly for a market of one) where the requirements are for a safe, configurable vehicle where styling is secondary. Specifically:-

  • US individualists.
  • British eccentrics.
  • Australian and New Zealand drivers. See EEVBlab, Episode 63: How Affordable Are Electric Cars? regarding the cost of electric vehicles with steep import tax and lack of electric vehicle subsidy. Cost is approximately three times the cost of a traditional vehicle.

Friends suggest a utility vehicle to extend a person's ability by 10×10×10. Specifically, to allow one person to transport 10 times what they can carry, 10 times further than they can walk at 10 times the speed. This would cover light industrial tradesperson (carpenter, plumber, electrician, cable layer), fast food delivery or mobile beautician. However, traditional vehicles are sufficient for these rôles and low-range, fully electric vehicles already replace them.

After considering the performance version, people considering a premium vehicle may consider a more distinctive vehicle at a reduced price. However, after considering specification in more detail, realize that it is the modern equivalent of a Citroën 2CV. I believe that the use case for this vehicle was to climb a 45° dirt track and allow a farmer to get eggs to market. That explains much about this quirky (but easily maintained) vehicle including the soft suspension. Unfortunately, a 2CV doesn't meet modern safety regulations and has ceased manufacture. A safer design with similar constraints would be ideal in rural France. Indeed, with the social unrest in France, Iraq, Chile and elsewhere triggered by fuel costs (distinct from political unrest in Portland, Germany, Hong Kong and elsewhere), mass appeal may be outside of the relatively calm Anglosphere. The French Government planned to ban diesel vehicles by 2030. This is particularly onerous when the French are heavily taxed and regulated. They can barely afford their current vehicles. The proposed design provides a migration path from the current vehicle to fully electric, at the least cost, over an indeterminate time-scale:-

  • Take failing car.
  • Build own chassis.
  • Migrate internal combustion engine.
  • Vehicle obtains better fuel efficiency in hybrid configuration.
  • Reduced cost allows migration to full electric configuration before engine fails.
  • Further savings are obtained.

Many steps of this migration are difficult, time consuming and resource intensive. In particular, it requires expertise in diverse skills including welding, electronics and possibly writing software to handle network protocols. The latter skill is required to migrate a modern engine management computer and maintain vehicle emission standards. This requires work which may be specific to each year of each model of each manufacturer.

For customers who depend upon private transport, there is considerable scope to offer products and services up to and including delivering a roadworthy vehicle to customer specification on 100% credit. More modestly, it is possible to offer blue-prints and software license for US$100, redeemable against products and services. For example, a welded chassis, etched circuit boards, flashed micro-controllers, cut glass, wound motors, batteries, power control boards, ECU bridging and re-conditioned engines. There is also considerable scope to offer upgrades to customers. The most significant upgrade is migration from internal combustion engine to fully electric. At present, mass market adoption of electric vehicles is not possible due to:-

An electric vehicle is not currently economic for the average person, even with 100% interest free credit. However, the *option* to migrate would build a significant number of repeat customers. The popular (and sometimes violent) opinion is that migration by 2030 is optimistic. Therefore, this business is a very long-term proposition over 30 years or more. This requires:-

  • Design of a safe, flexible vehicle; much like a modern incarnation of the Ford Model T, Volkswagen Beetle or Citroën 2CV.
  • Encourage widespread adoption.
  • Encourage novel use and best practice.
  • Sell minor upgrades from 2020 to 2030.
  • Sell increasingly major upgrades from 2030 to 2050 (and beyond).

This is manufacturing business which is:-

  • Capital intensive.
  • Labor intensive.
  • Knowledge intensive.
  • Heavily regulated.

Thankfully:-

Comparison To Tesla Motors CyberTruck

I'm not a fan of Elon Musk's ventures:-

Elon Musk is also a magnet for controversy:-

Regarding vehicles, the progression has been:-

  • Tesla Motors Roadster launched on Wed 19 Jul 2006.
  • Tesla Motors Model S launched on Thu 26 Mar 2009.
  • Tesla Motors Model X launched on Thu 9 Feb 2012.
  • Tesla Motors Model 3 launched on Thu 31 Mar 2016.
  • Tesla Motors Model Y launched on Thu 14 Mar 2019. Looks like a taller version of the Model X. The launch event was extremely underwhelming and most notable for Mr. Musk's mumbling.
  • Tesla Motors CyberTruck launched on Thu 21 Nov 2019. This does not follow the launch schedule of previous designs. The CyberTruck also matches the original description of the Model Y. Henceforth, I will refer to the Tesla Motors CyberTruck as the Real Model Y.

Naming products in the style of Henry Ford is sensible. However, naming them SX3Y (or BFR) is puerile.

Regarding the Real Model Y, I have doodled in a similar space and I am definitely unimpressed with Tesla Motors. I stated on Tue 9 Oct 2018 that it was possible to avoid car industry CAD software but the design would look angular; like an F-111 Aardvark or the USS Zumwalt. I have worked further in this area. Despite that, I was not prepared for the style of the Real Model Y. My first impression was "J*sus, F**k! That's uglier than my design!" Please note, that's from someone planning to sell an angular, unpainted car with bullet-proof glass option and - due to small volume production side-stepping crash testing - may have a product ready before the Real Model Y. And you know the Real Model Y is an ugly vehicle when a competitor jokingly compares its *own* design to a street cleaning vehicle and still thinks it has the better design.

The major influences of the Real Model Y appear to be a Lamborghini Countach and a Hummer. More specifically, a Countach Hummer Zumwalt DeLorean iPhone. Perhaps with a hint of Atari ST mouse. (Does anyone remember the Atari ST mouse? Or, more pertinently, does anyone *fondly* remember the Atari ST mouse? I quite liked it but I'm definitely in the minority.)

Admittedly, if I placed more emphasis on passenger seats, cruise speed and smart-phone aesthetics, my design would be much closer to Tesla Motors' most recent effort. However, I specifically rejected the swept back. It increases efficiency at speed but it is also possible to gain significant volume with very little metal. I also rejected the upward sweeping line. It is supposed to make a vehicle look like an angry, aggressive, road hugging wedge. However, it reminds me of:-

A famous mantra is that "form follows function." Unfortunately, the main function of an upward sweeping line is to signal idiocy and, more recently, aggressive idiocy.

Onto more substantive matters, the Real Model Y is only offered with one, two or three electric motors. Each improvement to the specification is accompanied with a price increment of US$10,000 or US$20,000. However, the all-terrain vehicle is not offered with one motor per wheel option. This greatly compromises acceleration and braking.

Elon Musk claims zero market research prior to launching the Real Model Y and this is quite believeable. The failure of bullet-proof glass was the most notable clanger of the Real Model Y's launch. Worryingly, I may have researched bullet-proof glass more thoroughly than Elon Musk and my findings are quite concise. Bullet-proof glass in retail environments is typically recessed from direct sunlight because ultra-violet light may cause the glass to de-laminate and become counter-productive and/or dangerous. The window frame of a moving vehicle is a significantly more demanding environment and Tesla has failed to specify suitable material in the most high profile instance.

Prototyping

People may find fault with my development process but I have made considerable progress making a 1:10 scale model and then progressing to a 1:4 model (which is suitable for three Build-A-Bear occupants). My process is to doodle in a vector drawing package then tape a tube chassis from rolled paper and then repeat the process after obvious weaknesses have been eliminated. The most beneficial part of this process is that crash testing is trivial. Merely hold the paper model at the desired angle and drop it onto floor. It generally makes a noise like a wicker basket being dropped. More importantly, it is a quick method to diagnose faults.

The most objectionable part of my process is that I have been doodling in OpenOffice. People may suggest numerous CAD programs but OpenOffice files are relatively trivial to share. Additionally, it fits into my workflow for business plans and video presentations. Anyhow, onto physical prototyping. I considered using old copies of London's Evening Standard as a substitute for structural steel. Indeed, this is common practice in London where, for example, the partial collapse and subsequent demolition of Ronan Point Tower Block was due to similar substitution. However, it is more generally applicable to use A4 (or US Letter) paper rolled into 30cm (or 11 inch) batons. With moderate practice, it is possible to roll paper into tight tubes with fairly consistent diameter. The actual diameter doesn't matter too much - nor does the consistency. For spans longer than any piece of paper, the obvious technique is to tape two or more pieces of paper together before rolling. However, a superior technique is to roll individual batons then tape them lengthwise before splinting them with a second layer of paper rolled around the first. The wider tube can be made on demand, cut to length without waste and has the appearance of bamboo. It is sufficiently strong despite the inner tube sliding freely within the outer tube. Alternatively, use drinking straws as the construction material. (Or perhaps K'Nex which was inspired by the concatenation of drinking straws by two drunken brothers at a wedding.)

The 1:10 scale prototype was made without wheels. It has a foot-print slightly larger than a pad of paper. It is approximately 32cm×22cm×15cm - and it looks *much* better than expected. It looks like a StarTrek Next Generation run-about shuttle-craft except with symmetrical bulges for side impact safety. The regular hexagon front window at 45° looks particularly good. Actually, a hexagonal white frame could plausibly be a prop from StarWars, Silent Running or Battlestar Galactica. It has a late 1970s futuristic vibe influenced by the mid 1970s Lamborghini Countach design.

Some observations from physical modeling:-

  • 1:4 scale is extremely practical because the result fits through an ordinary doorway.

  • Trivial to convert scale model into remote control car. Indeed, this reduces cost and would be a particularly good educational gift.

  • It is easy to complain about the arrangement of a humble sedan but it is quite impressive to fit an engine block, five adults and one large suitcase into 10m3 box (or less), made from a modest amount of metal, self-propelled for several hours at a rate much faster than sprinting speed. It is a small miracle which is deemed unremarkable. Unfortunately, manufacturers treat sales as final - even when there is a duty of care to inform customers about fatal flaws.

  • It is manageable (but not trivial) to design a vehicle as an irregular polyhedron with 60 vertexes or less.

  • It is trivial to design wheel well size and position but it is significantly more difficult to design a safe and responsive steering column. Doug DeMuro has repeatedly mentioned a dead zone when driving old cars (and a lack of dead zone in new cars). Even for non-drivers, this may be familiar concept when playing driving games, such as Sega Rally or Scud Race which has a widening dead zone as a penalty for minor collisions. In the real world, it is widely known that steering is not designed with a perfect turning circle and is instead biased with deliberate under-steer/over-steer to compensate for rear/front wheel drive. This may extend to bias in power steering. In particular, CANBus power steering may be non-linear to reduce the apparent slack in steering. This leads to the question about automatic trim of the steering potentiometer. Presumably, dead center is derived from the weighted average of the steering position over a sufficiently large distance. Even for people who enjoy driving in circles for a considerable period, obvious out-liers can be excluded. Regarding the universal joints in the steering column:-

    • Zero or one universal joints is not safe because it does not collapse into a Z shape during emergencies.
    • Two universal joints may be safe and may provide responsive steering, if designed correctly.
    • Three or more universal joints are not optimal for responsive steering.
  • Physical model indicates that front to back balance is excellent.

  • Building architects are a bunch of weenies. Especially the ones who design unimaginative glass and metal buildings. I've been making white paper models, like architects. Except my design is weight optimized, on wheels and has to survive collision with similar designs.

  • Numerous problems can be solved by making a longer vehicle. For example, and five or six seat version can be made by duplicating the rear of the cabin. Passengers in the last row would sit between two bulk heads. A more unusual arrangement would be six wheels with four seats in a diamond configuration.

  • The short six wheel configuration is definitely incompatible with passenger seats. However, the reason is divided into two cases. In a long, flat sport-car, seat would intersect wheel well. In a tall, short configuration, seat would be above wheel well. However, the removal of side impact tubes mean this arrangement works until it doesn't. This is an unacceptable compromise to passenger safety.

  • Open front, optional glass in lower doors and optional sun roof creates astounding visibility. It is like a motorized green-house. Ignoring windscreen wipers and tachometer, it is possible to have a giant hexagonal window with visibility to the floor. However, probably wouldn't want to drive this with a short skirt and definitely shouldn't drive it while wearing a kilt in the traditional manner! More seriously, front has to be divided but if it is divided as a door, it is possible to provide access for three wheel-chairs. Multiple electric wheel-chairs can be charged while driving.

  • Physical model has given me a good appreciation of the mass production crash impact tests. They only cover common cases and should definitely be exceeded. Current iteration of model likely to pass full front impact, side impact and rear impact. Partial front impact is an awkward case but many designs which passed full front impact caused catastrophic injury in this less common case. Current design likely to fail roll test. Sufficiently securing the upper windscreen is relatively difficult.

  • It is relatively easy to design a cabin as a convex hull which resists deformation leading to catastrophic injury. Major problem is that force at one point may deform in a beneficial manner but force of the same magnitude and direction at the next vertex may crush occupants to death. Graze impact is quite insidious. First iteration was very fragile at front to the extent that clipped front corner led to buckled chassis and possible write-off. Obviously, this is now resolved. However, graze impact can occur from anywhere, including clipping an open lorry door at top of chassis. (From personal experience, a Volvo 345 handles this case surprisingly poorly.)

  • Easy to design vehicle where eight tubes meet at one point. Unfortunately, this is difficult to weld (or repair) with certainty. May require cast iron joints and rivets. If the joints are designed to be symmetrical, some spurs may be used for seat belt fixings. However, it may be preferable to avoid an accumulation of tubes at one point. An early design, from the side view had a radial arrangement of horizontal, vertical and diagonal bars welded to the central cross impact bar. It was possible to change the upward diagonal across the storage compartment to a downward diagonal. This also provides a hatchback option. ("Form follows function.") A further tube can be removed from this knot by hinging doors to open forward. This changes the diagonal sweep of side impact protection so that it does not affix to center. Moderate change is to set constraint that no more than six tubes may meet at a point.

  • Engine compartment may be 90cm×90cm×50cm or thereabouts. This is sufficient for:-

    • Any engine used in a roadworthy McLaren (plus alternator). Therefore, 600BHP is easily achievable.
    • A modest engine and an extended range fuel tank. Therefore, alternative configuration exceeds 500 mile range.
    • Half a cubic metre of batteries. Therefore, 600BHP and zero emissions is possible over shorter range.
  • Diesel electric allows transverse installation of any engine because mechanical coupling is not required. It is also possible to install multiple engines; adjacent or stacked. In the most extreme configuration, may have three or more engines working simultaneously.

  • Not in original specification but front wheel drive engine may be installed with mechanical coupling in mid-engine vehicle. In this arrangement, it is possible to have only rear wheel steering and stiffened front for additional impact protection.

  • Possible to have rear view and pillars similar to Toyota MR2 or Jaguar XJS. This option significantly improves access to engine but eliminates trunk.

  • Air intake for mid-engine design is a traditional problem. Possible to take air from underside of vehicle. However, this creates a virtual cushion of air which reduces handling - and requires energy to suck the air under. Design has space for air intake ahead of rear wheels. Unfortunately, intake will be triangular and may therefore require a pyramid number of small, relatively ineffective fans. Side grilles also have similar appearance to diesel electric train.

  • It is possible to fit a heavy engine sideways, towards to the cabin. It is also possible to fit a light engine at rear. Both options maintain excellent front to back balance. Indeed, it may be desirable to have tapering mount points to maintain engine balance. Tapering at base of rear compartment is also structurally compatible with a tow fixing.

  • Possible to make matching trailer (or camper or caravan) which is half height, full height or compliments hatchback. In the latter case, air which sweeps down from a hatchback then sweeps up the matching trailer.

  • Matching trailer requires two or four matching rear light clusters, rear view color/infra-red camera (possibly a ninth channel), parking distance sensor and optional strip lighting. Maintaining upward and downward compatibility with the dumb seven pin connector is also useful.

  • Matching trailer may also have brakes. However, if the brakes are fail-safe, it may be difficult to move an unattached trailer.

  • Light clusters are all within elongated right-angle triangles. Where the rear is a squashed hexagon, it is possible vertically mirror the light clusters for a distinctive look by duplicating the symmetrical parts. Door on front for disabled access may require re-location of the front light clusters. However, these can be affixed over front wheels and are also elongated right-angle triangles, although smaller. Side turn indicators can be mounted inside glass panels such that the remainder of the panel aids parking.

  • Optional storage area is above engine. Therefore, have problem of thermal separation. This is a matter of conduction, convection and radiation. The shelf is a suspended structure and it is possible to line the underside with a reflector to reduce radiation and insulating foam to reduce convection. This fulfills the use case of "eggs to market" but a 10 hour drive would create hard-boiled eggs. Conduction of heat through the frame is the most awkward part of the problem. Many super-cars have the related problem that wind resistance over the front compartment (hood? trunk? trood? hunk?) is sufficient to cook an egg. Perhaps there is no good solution.

  • Open tubing may be suitable to prevent heat conduction to storage compartment but this may create a water trap and premature corrosion. Open tube at windscreen would allow air to pass through door roll bar and continue to rear before exit. This may prevent upward conduction of heat from engine to storage compartment but may also incur relatively high thermal stress at welding weak point. Solution may require a full scale ball-and-stick construction but with cast iron joints, rivets and ducting through or around the joint.

  • Tubing may contain two, four or six pulse jet engines for turbo boost. Aardvark's Doodlebug pulse jet design is suitable with the exception that a heart valve design avoids the requirement for a flared air intake section. This is suitable to periodically accelerate and safely negotiate traffic at speed. However, it is not suitable for sustained use due to the clanking pulse jet noise which would propagate through the chassis. Remember to include pulse jet thrust in brake caliper calculations!

  • I may have discovered why a center driving position is so rare (in addition to "deletion of side seats"). The more common off-center driving position typically uses two universal joints to a central rack and pinion. For crash protection, the middle rod works as a lever allowing the steering column to collapse into a Z shape. The universal joints fail to rotate in this collapsed arrangement but the effect is to withdraw the steering wheel from the driver prior to imminent deformation of the cabin. The may cause permanent injury to hands but it is preferable to permanent brain injury or death. A center driving position requires an off-center rack and pinion to re-create this safety arrangement. In a front-engine design, this would be placed under the engine. In a mid-engine design, the driver is further forward and there is less space to connect a steering wheel to a pinion. A vertical off-center steering axle (horizontal pinion) is possible but it requires a curved rack which correctly meets the pinion while taking into account the parallelogram which places each front wheel in the correct turning circle. Historically, that was awkward to calculate. However, it should be possible to parameterize such a shape in suitable CAD program. (This is why I doodle and make physical models. Suitable CAD software has yet to be selected.)

  • Possible to have open chassis with no side panels and no glass. Under UK regulations, a vehicle with three or more wheels does not require crash helmet. (See Ozzy Osbourne's antics for further details.) However, it remains desirable protect eyes with goggles or, more sensibly, a crash helmet and neck brace.

  • Under UK regulations, may be possible to have open engine compartment if covered with bird net sufficient to prevent gerfingerpoken and prevent struck pedestrians from encountering cam belt. Open rear may be restricted to upper one or three panels.

  • Hoped to have two columns of full depth 19 inch racking. However, this is not possible for two reasons. Firstly, center mount post and center drive position is a safety hazard. Secondly, full depth racking intersects front wheel wells. Fortunately, maximum width may be 175cm (69 inch) and three columns of 19 inch racking is only 57 inch (145cm) excluding mount posts. Therefore, it is possible to have one column of full depth racking flanked by two full columns of shallow racking suitable for buttons, displays and trivial equipment.

  • Previously assumed that two columns of 4U rack would be approximate limit. However, racking has to exceed radius of a possibly after-market steering wheel plus thickness of gloved hands plus a comfortable clearance. Therefore, three columns of 6U rack is minimum. 2U or more may be reserved for mandatory gauges but these do not have to be in the central (full depth) column.

  • Optional glove box(es) may hang from racking and bolt over or under rack panels.

  • The industrial designers of the cordless kettle suggest looking for design elements which remain unchanged. In addition to front-engine design, rectangular door window with clipped upper corner is also common to the extent that deviation looks aesthetically wrong. It appears to be a compromise between roll safety, visibility and material cost. Even if safety is the primary concern, it may not be beneficial to affix vertical pillar to top of windscreen because it reduces visibility and the longer, weaker pillar provides no sacrificial section of windscreen frame for roll safety.

  • I wrongly assumed that an open top model mostly required a chassis to be stiffened around the bottom plane. However, it is quite a feat to suspend a large sheet of glass at an angle such that it is unaffected by the pressure of wind at speed. Also, I assumed that, for example, the Bugatti Chiron is not available as an open top model because few people like the wind in their hair at Mach 0.7. However, the constraint appears to be technically difficult.

  • It is possible to "delete" the center seat and have a somewhat more conventional wedge, mid-engine vehicle with two seats. Optionally, this may be tall and short or low and long. For safety, it requires corresponding changes to the console and steering. Unfortunately, this requires deletion of full depth racking, deletion of half of the accessory panels and deletion of retro-fitted wheel-chair access. Anyone considering this arrangement should first consider purchase of a Toyota MR2.

  • While many cars exceed length of 4.4m, desirable to keep vehicle under 4m (13 foot) because it is possible to fit three such vehicles into an ISO 6346 40 foot (12m) shipping container. Especially desirable to keep vehicle under 3m (10 foot) because is is possible to fit four such vehicles into a 40 foot (12m) shipping container, two vehicles into a 20 foot (6m) shipping container or one vehicle into a 10 foot (3m) shipping container. Wedge front allows partially assembled vehicles to exceed 10 foot with some penalty. Cannot angle vehicles upwards and total height should be less than 7.4 foot (2.3m). These constraints can be relaxed if transport is restricted to over-size containers only.

  • For this design, solid tubes occupy approximately 2.6% of Length×Width×Height cuboid and hollow tubes occupy approximately 0.8% of the volume. As explained by a lead researcher of aerospace grade titanium, welds are weak points and therefore an extruded chassis is lighter and/or stronger. In this case, approximately 99% of a solid metal block would be discarded. Alternatively, processes (such as sand casting) would incur lesser waste at the expense of greater error. Extrusion allows more amenable shapes but otherwise provides minimal benefit. Additionally, solid block extrusion is prohibitively expensive and significantly more energy intensive. Subtractive manufacturing remains preferable for engine blocks, super-sonic aircraft and air-lock hatches. However, welded tubes provide the safest, affordable, repairable option for wheeled vehicles.

Further Development

A previous attempt to collaborate on a diesel electric vehicle made minimal progress because it required participants to purchase a similar model of roadworthy vehicle. This is obviously a resource intensive exercise which eliminates the vast majority of potential contributors. The current proposal reduces the initial resources to a pad of paper, some tape and a few hours to craft a scale vehicle chassis. At present, this does not require a common chassis design. Following a common template is encouraged because results are more certain. However, for anyone who wishes to deviate, the recommended steps are:-

  • Doodle some diagrams.
  • Build 1:10 scale chassis from paper without wheels or electronics.
  • Doodle some more diagrams.
  • Build 1:4 scale chassis from paper without wheels or electronics.
  • Add wheels, motors, servo rack steering and remote control system.
  • Add and swap components until 1:4 scale model has metal chassis, gasoline electric with regenerative braking and working light clusters.
  • Consider using some proper CAD software.
  • Build full scale prototypes from metal.

Many tasks can run in parallel. For example:-

  • Build scale models.
  • Obtain commercial funding.
  • Develop electronics (including stand-alone products).
  • Develop software.

In particular:-

  • Develop alternator to battery cell distribution system.
  • Develop all wheel drive system with traction control.
  • Develop regenerative braking.
  • Develop fast charging.

A commercial product can be sold with only two of these features because customers can upgrade after purchase. In some cases, upgrades may be a free firmware update. The most difficult tasks come last:-

  • Retro-fit existing vehicle with power modifications. In the automotive industry, this is known as a mule.
  • Repeatedly build roadworthy vehicles.
  • Establish production facility.

Until this occurs, it is no loss and, indeed, only advantageous for people to prototype the suggested design (or competing designs) until commercial production can be established. On this basis:-

  • Many of the ideas presented here are collated from public sources. Some of them may be claimed by particular parties. Obviously, public domain ideas may be used without restriction. Unique ideas may be used in isolation without attribution.
  • Scale models of the suggested design may be made for amusement, education and prototyping of full scale vehicles. There is no restriction on the use of suggested techniques to make a substantially different design.
  • Construction and use of one roadworthy vehicle is permitted for individual use on the condition that no branding, association or endorsement is claimed. Construction and use of one roadworthy vehicle per private enterprise is permitted with the additional restriction that it must be initially (and truthfully) certified as roadworthy by a government agency within the next five years. (From 2020 to 2024 inclusive.) Obviously, there is no restriction on substantially different designs.
  • Construction and use of the suggested design exclusively on private land is unrestricted.
  • Construction and use of the suggested design after industrial collapse is not endorsed but cannot be enforced.

Eventually, I hope that a subset of collaborators (most likely determined by proximity) will formalize a commercial venture which sells everything from a "blue-prints and firmware" package to complete, roadworthy vehicles with long-term support for spares. You can participate and innovate in this process by building a 1:10 scale prototype from 20 sheets of paper and then a 1:4 scale prototype using proportionately more paper. (Approximately 100 sheets in total.) From here, it is possible to make a remote control car with rack servo control steering.

It is fun and educational to make scale models and significantly more fun to make your own remote control model. Initially, the electronics can be purchased. However, it is possible to swap with own parts as experience grows. This includes 3D printing motor frames and winding your own motor coils. Components using micro-controllers may use the same firmware as a real car; differing at most by the choice of numerical constants which account for scale.

This may provide you with nothing more than an affordable and overlooked method to make your own remote control car. However, it may segue into a due diligence exercise and vehicle maintenance training. Even if you intend to purchase an existing vehicle from an established competitor, I hope this helps you consider your purchase in more detail. In particular, I hope you re-consider or defer purchase given that many options are possible but currently unavailable.

Suggested design:-

begin 644 projection0-0-8pub.odg
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
M```(```NO9Y/````````````````'P```$-O;F9I9W5R871I;VYS,B]I;6%G
M97,O0FET;6%P<R]02P,$%```"```+KV>3P```````````````!H```!#;VYF
M:6=U<F%T:6]N<S(O<W1A='5S8F%R+U!+`P04```(```NO9Y/````````````
M````&@```$-O;F9I9W5R871I;VYS,B]P;W!U<&UE;G4O4$L#!!0```@``"Z]
MGD\````````````````<````0V]N9FEG=7)A=&EO;G,R+W!R;V=R97-S8F%R
M+U!+`P04```("``NO9Y/L7R8&A,!``#>`P``%0```$U%5$$M24Y&+VUA;FEF
M97-T+GAM;*U3VV[#(`Q][U=$O`>V/DVH:1\J[0NZ#V#$29'`(&RJYN^71.IE
MFC*M6M]\L'W.P9C-[AQ\=8),+F(C7N6+J`!M;!WVC?@XO-=O8K==;8)!UP&Q
MO@35V(=TA8TH&74TY$BC"4":K8X)L(VV!$#6W^OUK'1%=P;68KNJ;GJ=\U"/
M_7FX57?%^SH9/C9"+9'<C@.TSM0\)&B$2<D[:W@L4R=LY6Q8WON4?3;IZ"P)
M]8B/P[&$3S3.D^)+*!/V"SY<,#VH*?^0"@'S^#`DQV$N,#.<64WIAX@#L'DZ
MJ8W(TT2?S4L\>'C^#/81.]>7/&\'K96Q%CR,,&9E2\Z_7^5_6G]<5RHX69#%
M27O/,(EOU(\_NOT"4$L!`A0`%```"`@`+KV>3XV1C0B\%```RP\!``L`````
M`````````````````&-O;G1E;G0N>&UL4$L!`A0`%```"`@`+KV>3]4T<J.X
M"0``XS\```H`````````````````Y10``'-T>6QE<RYX;6Q02P$"%``4```(
M```NO9Y/````````````````&`````````````````#%'@``0V]N9FEG=7)A
M=&EO;G,R+VUE;G5B87(O4$L!`A0`%```"```+KV>3P```````````````!H`
M````````````````^QX``$-O;F9I9W5R871I;VYS,B]T;V]L<&%N96PO4$L!
M`A0`%```"```+KV>3P```````````````!@`````````````````,Q\``$-O
M;F9I9W5R871I;VYS,B]T;V]L8F%R+U!+`0(4`!0```@``"Z]GD\`````````
M```````8`````````````````&D?``!#;VYF:6=U<F%T:6]N<S(O9FQO871E
M<B]02P$"%``4```(```NO9Y/````````````````'P````````````````"?
M'P``0V]N9FEG=7)A=&EO;G,R+VEM86=E<R]":71M87!S+U!+`0(4`!0```@`
M`"Z]GD\````````````````:`````````````````-P?``!#;VYF:6=U<F%T
M:6]N<S(O<W1A='5S8F%R+U!+`0(4`!0```@``"Z]GD\````````````````:
M`````````````````!0@``!#;VYF:6=U<F%T:6]N<S(O<&]P=7!M96YU+U!+
M`0(4`!0```@``"Z]GD\````````````````<`````````````````$P@``!#
M;VYF:6=U<F%T:6]N<S(O<')O9W)E<W-B87(O4$L!`A0`%```"`@`+KV>3[%\
MF!H3`0``W@,``!4`````````````````AB```$U%5$$M24Y&+VUA;FEF97-T
:+GAM;%!+!08`````"P`+`/4"``#,(0``````
`
end

Spreadsheet to calculate tube lengths. Choose chassis options as Booleans. Set length, width and angle of front window where zero degrees is horizontal.

begin 644 tube0-0-2.csv.gz
M'XL(`"^."EX"`WU6WW.:2AA]]Z]@>.BH61M8EE7OC'=&-)ED)FE:L6GGOA'=
M*%.%#&+3]J^_Y]L%`F+SH,#'V?/].M^RCVH;KW;*NLZBO;*6QR=EW:EDDV\/
MC+$._19I^LQ<W#Q&B;[.XT/TM%-K:[I:J<.!.;!=_<JSR`I5E%N+]+5NVJ99
M;DU_[90V$N$RS:-=X85Y#ID_1X<#GE5FS=+]2Y3E>Y7DB"E-<L;=OR,6*LJ,
MLV03)ZK^CDV"\2!P'?PHZ&_Q&M[<H8][S6M]BY-U^FI-DPUB$U5P5(%%M(Z/
M!\8_^J5EB2K]2'2V'T4!O4FS^`^8D,PL'5P]/\>K6#N>/83=Q71^._T4=@-7
M]'I4/)7E\:H%#6\_M:#++(XHJ!-HX'J7X9?%LBL)=!/MGBV3E'[#8?MR1.ZH
M4,U,L5[%FVV^K5M'1*#(C&?N]GD_X$Y)^O;";[#6[:*JXCQ-L[*7$U/N<5]S
M%E7"\B2/\]_,@*RK:+4M[\/C4TYB8,O?+ZK#J65L,O7<?N"Y[/JX*U5B+8Y)
MHK*#AO#1!5HZP+4?#`F.Z#W.[M)7!!G&:U6A)_PBD#IC@GF`>:S>M"P]'+3D
M`?4N`@%T7WO@A!?`BS8^?(E692@N7`N*YJ+;2+V'I43AX^HS&J`BD8ZLZ"7>
M26:*^'!$@3L3]R+PBX808@C$L$#,XVB3)C0V4;91@`XT%!A^J5VA&-[H%'RO
MH.-]#6VPB-(;GV+#?;3;`>J@$'TJ7%]0+`AX*ARDZ;!*PF&>'7/4;%2':FD&
M'%7FJ"5'>AQ"Q6)T4[A,IUCS9BAXM0ZHHGJX-M93C7E9J)\D[ZU29QA*S^@;
M%PT&O!$>J^FU"B/(T,PV!_7516(F<<T!5B'8UY<7!!!$JQ^G'-0\6?'00/%&
M#)""\-]*:+2DEY8MY:7\!,T=EF"QD.>7F&:9:2`HI")*J=04:\+5*1<R+UQ@
M2\0J:$:,&.VA[R_B_2XIJ%>EI].JTJO>3@4Z*%K*.N,?A=54-"FD,!^%]AT3
MRKEU)E/,_/#-F0^I^&X[:;,1M)S:D_OI]RX2'L`["NST;")!IWS>JD&+XR\R
MTW'`XGNLMO,8;5K_J2SMG$Y&5^<AQJA:>:=)0.>+,R0/B>K8$S&@X!T6#`<!
M"L[M5CA0`!]J)BC-]\\P+5_3SD3T:RHM(]*[*?6QO"N[@O[Z\AS5-E-*ZX(/
M@F&OS5G&4_#@P1^>X;E.C]CVJ*.`MDNLKT9>)C4(UA^=XXE_JHY[,GWEIC*@
M/O4;3YH,6O7']?V].!;HW:4^F20^?ZQG4D*GTGE_D9G-,]&,JDA&510204FW
M33B+GN*D%85T312@E/S]1<5VWMZ37"J#6W1&HL2R\5'4D]#V7@ZN]$P$I"/Q
M[KKS9:"YH;;B7Z</L4J__9%M)6ZV1`E!2ODWN/'X=L+4D\M8X[@Y5X=XDT1Y
MG":=2?CUOHO3QC]3"7DQ_3C#XXP>[8EM?W^T[0]=*1SL[?C0.D[O@VU?PG9[
MW0W\?QUFVW/;QK]M][1-3,AVT[!)C;MKV#R-"YMK->ZQM-FU1![3W7&O&/+>
M[7!B-4?UPEC8'E:KXTN,,[DQHU^0MTN5QA%V,I/TA`[V/]]VT7H7YZ;9D%].
AA[QCCOEANHO7369C.B6NL=&/^(C+UUS_`Z[JZF]-#```
`
end

(Usual instructions for uudecode process.)

VTOL, UFOs, Crop Circles, Graffiti, MIBs, Mandela, Octrees

Posted by cafebabe on Tuesday October 15 2019, @04:37PM (#4675)
5 Comments
/dev/random

VTOL

I've previously mentioned that an honorary/great uncle led the team that developed aerospace grade titanium which led to the development of the X-1 super-sonic aircraft. Friend 1 has a similar family connection with VTOL aircraft and from this spent many early years in San Diego and Tel Aviv.

My friend's father was a world leading expert in the construction of seamless tubular steel and was invited to the Pentagon to discuss the feasibility of vectored thrust aircraft. My friend's story may be highly embellished but involved being invited to a meeting for purposes unknown, passing three sets of armed guards on the way to the sub-sub-sub basement and finally being brought to a room with a projector which was swept for bugs before a man hand-cuffed to a brief-case signed over a carousel of slides. VTOL was a common trope in science-fiction and my friend's father had no expertise apart from steel manufacturing. However, he caused quite a commotion when the first slide was projected and he said "I *knew* you were working on VTOL!" Supposedly, this led to an investigation over possible leaks. After this was resolved, my friend's father developed predecessors to the Harrier Jump Jet before retiring in San Diego.

These events set the path of my friend's life. After such an exotic childhood, it was an obvious choice for my friend to join the air force. However, my friend had a very disjoint education and didn't have the technical knowledge to develop aircraft. Instead, my friend worked in logistics. My friend was qualified to drive a truck, off-road, lights-out in a war zone. However, much of the time was spent tinkering with the stock room computer and, eventually, sharing a desk with Nick Pope, the UK military's most famous UFO researcher.

UFOs

A scientific investigation of UFO phenomena can easily cause a person to lose faith in humanity. Firstly, you'll be disappointed by the number of people who report the Moon as a UFO. Secondly, you'll be disappointed about the number of UFO reports which surround civilian airports. Unfortunately, that is the life of a military UFO researcher. Is it the Moon? Is it a commercial flight? Is it a military flight? Is it a weather balloon? If no then place in next pile. This procedure eliminates more than 95% of reports. This procedure may create a few false negatives but that doesn't matter because the remainder is inexplicable and can be correlated with the initially rejected reports.

I have no idea about the remainder and my friend was very hesitant to be drawn about the issue. Indeed, what follows could be described as a mix of Babylon 5 and Barberella. My friend had a theory that human gestation only works if a soul associates with a fetus. So far, this is broadly compatible with the theories in the book: DMT - The Spirit Molecule by psychiatrist Rick Strassman. Indeed, if there are sentient aliens then perhaps a similar association between fetus and soul would be required. However, my friend has the notion that there is a shortage of souls elsewhere in the galaxy; possibly due the human population explosion. Therefore, aliens who wish to procreate do so in the vicinity of Earth where there is a relative abundance of souls. Actually, this sounds more like the work of Douglas Adams or L. Ron Howard.

Crop Circle Formations

Crop circles are supposedly alien spacecraft landing imprints and/or messages from Gaia, the collective unconscious or the future. (As I've noted with BitCoin conspiracy theories, time-travel is awkward to debunk.) Like UFO sightings, most crop circle formations can be trivially dismissed. Some of the crop circles are obviously made by drunken amateurs. Others are known to be constructed by people using string, wooden planks and geometry known to the ancient Greeks. Despite this, any crop circle attracts a gathering of hippies with dowsing rods and crystal woo-woo. Worryingly, they *always* find vortex energy and some claim that the fakes were made by the unwitting agents of Gaia or somesuch bunkum. To complete this freak show, a guy call Sørenson used to fly over crop circle formations in a micro-lite and then make compilation videos of crop circle formations. (I presume this has been replaced with drone footage.) An annual illustrated calendar was also popular. (I know too much about this madness due to working in Internet cafés and hydroponics.)

Graffiti

A few crop circle formations are inexplicable. The ones which follow tractor treads are invariably constructible with string. 2012 in binary is obviously made by people. To mis-quote Douglas Adams, the widely propagated interpretation is a dead give-away. 216 circles in a hexagonal radial pattern is barely possible without error; obviously not a first attempt. However, less than 5% cannot be dismissed easily. A friend describes it as rural graffiti. In the case of urban graffiti, elaborate designs are produced overnight. Many of them have a traceable origin and some of them span multiple canvases in an artistic manner. In either the case of crop circles or urban graffiti, can we trace the origin of all examples? No.

Should we trace the origin of all examples? Friend 2 suggests that we shouldn't but it'll happen anyhow and it'll lead to "bad mojo". I should possibly explain that this friend was a qualified electro-mechanical engineer who survived the King's Cross Fire and then quit in disgust due to multiple safety lapses after 31 fatalities. This included a front page exposé in a national newspaper about tins of paint thinner stored under escalators. The flammable paint thinner was covered in lint and the hastily instigated smoking ban was frequently breached. My friend was offered counseling but it was a career limiting move because counseling wasn't taken seriously in 1987. Instead, my friend dropped out, became a hippy, learned juggling, learned fire-breathing, repaired fairground rides and learned video editing. Despite my expertise with C and Unix, my friend was quite ahead of me with Raspberry Pi expertise and remains ahead of me with Kodi.

Anyhow, my friend has a hard to explain theory that an observed, willed or otherwise cajoled universe is constrained in unforeseeable ways. To quote Douglas Adams: "There is a theory which states that if ever anyone discovers exactly what the Universe is for and why it is here, it will instantly disappear and be replaced by something even more bizarre and inexplicable. There is another theory which states that this has already happened." While this is humorous, there is, apparently, a more morbid side. Call it the Overton window, the Collective Id or morphic resonance but the rich stimulus of, for example, ubiquitous cameras has a price. A fluffy cat playing a theramin? Cute. Dashcam meteorite? Holy crap! Dashcam fatal aircraft crash? Now we're getting into engineering/snuff porn. This is "bad mojo". But it doesn't end there. The dystopian social credit systems rely heavily on CCTV and facial recognition. This is the downside of everything being observed and collated. Anything of note will be logged, tracked and shared without regard to privacy or dignity unless we make a conscious effort to leave matters unspoken and uninvestigated. To quote The Prisoner: "I will not be pushed, filed, stamped, indexed, briefed, debriefed, or numbered! My life is my own!"

Men In Black

Friend 3 has a more quixotic theory which I assumed was a ghost story or similar. My friend is mad and in poor health but suitably responsible to handle payroll and medical data as a DBA in the UK's NHS. In the course of this work, my friend would often drive at night in remote locations. My friend said that the landscape changed. Not in a get-off-my-lawn, everything-used-to-be-fields kinda way. The waterworks used to be by the main road. Now it is 1/2 mile away. In a year or so, it'll be closer. The pylons are in different positions. Again. The roads are wider/narrower. Just to spook me, my friend told me this near Halloween, while we were in a bar by a canal, major trunk road and chain of pylons. However, the best was yet to come. Near the bar was a World War 2 pill-box turret. Apparently, there are two lines of these turrets across the UK and they were intended to impede a possible Nazi land invasion. After the war, they were left in place. However, my friend claims that the pill-box turret (by an intersection of water, road and electricity) didn't exist during World War 2 and instead appeared spontaneously many decades after the war. My friend claims there is no official record of the turret. Investigation is likely to be inconclusive because war records would be sketchy, classified (as a matter of national, strategic importance), de-centralized to prevent compromise or retro-active by heritage groups.

My friend claims to have seen and spoken to MIBs [Men In Black] around the waterworks and also claims to have been driving along a road while it spontaneously widened and the vegetation changed. Some of this can be attributed to driving while tired. Regardless, my friend appears to believe that the landscape has been changing for centuries and that towns in a crescent shape all have Wiccan names. (Crescent shape disputed. Town names inconclusive.) I was certainly spooked. I subsequently had a dream that I was in a team of MIBs working behind a hologram screen under a road bridge sequestering pollution. This could be a composite of films I've watched. I've also had flying dreams around pylons and I was trying to induce similar before I used text-to-speech to read huge quantities of information.

Rendering Errors?

I'm quite relaxed about these matters but I've been prompted to look again. The first instance was a letter box in an inexplicable place and the post office dis-avows record of its placement. The second instance occurred while walking around London. There is a lovely road called Tufnell Park Road. It is a quintessential London street with an eclectic mix of houses and, at one of the junctions, there is a beautiful stone church. I wondered if it was possible to re-create a street like this using fractals or generative techniques. This is a wholly unoriginal idea inspired by little more than a screen-saver. XWindows has some very ornate screen-savers. One simulates galaxy collisions and, from watching it, the simulation quite obviously relies upon a large hidden mass to make the simulation work. I note that shortly after this screen-saver became widespread, the concept of super-massive black-holes at the center of galaxies *also* became widespread. Another screen-saver sketches lines and it makes patterns which look somewhat like street maps. An early iteration of this screen-saver only drew straight lines. A more current version adds curves. While thinking about this screen-saver, I walked along the other side of the main road (Holloway Road) and wandered along Tollington Park. This street is like a fractal version of Tufnell Park Road. The terrain is different. The angle of the road is different. The trees are different. However, it has a complimentary mix of houses and a different style of stone church at a differently angled junction. Streets are fractal and these two streets are pleasing examples.

I like the two miles or so along Tufnell Park Road, Tollington Way, Tollington Park and Upper Tollington. Ignoring the crack dealers and occasional murder, it is relatively quiet and relatively affluent. Along Upper Tollington, a railway line has been converted into a pedestrian walkway. Because it has become a literal rat-run, the neighborhood cats pick a random spot to survey and hunt rats leaving the walkway. One of these cats has a particular dislike of rain. It can often be found in a dry spot where it makes the most mournful pleading noises when it gets attention from anyone. Overall, it is pleasant to walk along this road and get lost in thoughts. It was therefore a surprise to pass through this road on several occasions without noticing a very unusual artifact near the junction of Turle Road. It is not a turret or an inexplicable post box. However, it is definitely in a similar class. There is an inexplicable brick archway near the West corner of Tollington Park and Turle Road. It is particularly unnerving to walk past this site on multiple occasions and only notice it while thinking of such matters. Was it there on each occasion? Probably. Am I certain? I would like to think so but I cannot guarantee it. Ahhh. I'm being afflicted by the madness of ley-lines and crystal dowsing woo-woo - except I've arrived at such notions via screen-savers and the fringe ideas of three people who were trusted with critical infrastructure.

Rationally, the arch was outside of my filter bubble or reality tunnel. This was abruptly corrected through thoughts on a related topic. An alternative explanation is that we live in a reality with far less fidelity than is generally acknowledged. I hope it is a lapse of perception. Perhaps it is like the time when I wanted to know the whereabouts of my local bus stop - and then realized that people who occasionally loitered outside my place were waiting for a bus. Resource discovery boot-strap. Unknown unknowns. You don't know what you don't know - and there is no easy way to correct it. It isn't always wilful ignorance but there is finite will and infinite ignorance.

The Mandela Effect

I conclude this tour of Fortean Fortina with the Mandela effect. It is possible for the collective memory of the general public the err and a good example is Nelson Mandela's 27 years as a political prisoner. When Nelson Mandela was released from prison, a common reaction was "Nelson Mandela? I thought he died in the 1980s!" And, of course, this led to the inevitable conspiracy theory that dead Nelson Mandela had been replaced with an actor. The unfortunate truth may be that people stopped caring and assumed that he'd died. This may be the root of the Mandela effect. If there is something you don't care about, there's a Mandela effect for you.

Don't care about sculpture? There's a Mandela effect regarding Rodin's Thinker. Don't care about spelling? Then you won't care if someone uses a MacIntosh in McDonald's to read about Berenstain Bears. Don't care about celebrities? Then you won't care who's dead, who's alive or care about celebrity sibling age gaps. Don't care about geography? Oh, this one is vast. There's so much to not care about because of the current/historical names and relative positions of so many places. Many kooks cite the Mandela effect applied to geography as evidence of parallel universes. I cite it as evidence that people care less about their out-group.

I'm an open skeptic but testing objective reality/my sanity gets to the crux of existential philosophy. René Descartes wrote: "I think therefore I am." However, subsequent Occidental philosophy discards causality and history. So, how can I test that I'm not segueing through/interacting with parallel universes when I cannot trust records or memory? More concisely, if you devise an objective test, how can I distinguish your truthful transmission of the correct solution from a false memory of the solution? For the duration of empirical experiment? And when acting upon conclusions? I cannot. It is not an artifact of neurons or atomic decay. It is an information universe with bit rot where nothing is certain. Everything is built on a foundation of sand but some foundations are packed more firmly than others. If we are in a simulated universe then nothing within the universe can ever be smart enough to act without error. If it is dualist then it has a particularly hooky user interface. Can I prove it? Not really but I'm fairly certain. Under such circumstances, what more could you ask?

Octrees

Taking ideas from this mix (and also the worst Neal Stephenson book that I've ever read), I would like to make a computer game which lazily evaluates the game world as players move through it. In the trivial case, start with the top level of an octree, an undifferentiated sphere and some statistics, such as a total allotment of gold and the sphere being 30% land; divided into mountains, jungles, farms, towns and cities. Place one or more players onto the sphere and sub-divide the octree until everything in the player's field of view has sub-pixel resolution. From here, rendering is similar to the REYES algorithm. When a player moves, perform incremental sub-divisions, as required.

Somewhere in the process of sub-division, terrain will be approximated, streets will be apportioned, buildings will be outlined and everything down to the personality of the neighborhood cats will be assigned. Sometimes, this process will lead to an anomalous street, a stray archway or a homeless cat. To prevent the volume of game data growing without bound, leaf nodes may be reclaimed as a player passes an area of detail. This may occur using LRU or random replacement algorithms. Indeed, this is a source of inexplicable, transient quirks while being consistent with the bit rot of an information universe.

Programming such a simulation requires considerable effort and perhaps I describe nothing more than the ultimate goal of open-ended game design. However, I suggest goals for a very secondary objective. If particle physics is implemented with some precision, it may be possible to nest simulations. In the same way that it is possible to nest virtual machines, the inner ones have progressively less processing power and memory. With or without a seed and algorithm which approximates consensus reality, it remains possible to simulate one universe and nest approximations of it with decreasing fidelity.

See Also

  • Elevated by RGBA is an animation with accompanying music. The screen-grab is taken from a 4KB MSWindows executable. It features fly-throughs of generative terrain. The first 80 seconds is awful because the full terrain is calculated in the background. The final 90 seconds will leave you wanting more.
  • Subdream's 2011 octree fractal graphics demo, Raum/Zeit [Space/Time].
  • Subdream's 2013 octree fractal graphics demo, Turtles All The Way Down, which incidentally has a Douglas Adams quote.
  • The Thirteenth Floor is a film about a start-up company working on virtual reality. I found it unnerving and hard to dismiss.
  • Anomalies is a cartoon which takes about 45 minutes or so to read. I also found this unnerving and hard to dismiss.

Carbon, Hydrogen, Trojans And Javalins

Posted by cafebabe on Tuesday October 01 2019, @04:52PM (#4634)
15 Comments
Hardware

Space Elevator

A few years ago, SoylentNews discussed future technology, such as a space elevator. This is an alluring concept in which a very long rope and a counter-weight allows payloads to be winched to geo-stationary orbit. This uses about 5% of the energy of a rocket - and is correspondingly cheaper. One variant uses a solar powered motor. This variant requires about two weeks to raise a payload but, heh, it is cheaper than a rocket.

I don't think that a space elevator is politically feasible because it would be bombed before it is completed. The economics are too skewed to allow any nation/consortium to use a space elevator. Ignoring politics, there are technical constraints, including the anchor point, weather, space debris and the material used to make the rope. I was under the impression that a space elevator had to be anchored to rock. This necessarily limited a space elevator to land masses on the equator. I have been subsequently informed that a floating anchor is beneficial to avoid harsh weather. Unfortunately, this completely changes the political constraints because the anchor would spend much of its time in international waters, with one axis of freedom, between two land masses. What could possibly go wrong?

Ignoring all of the social problems (and the last 50km or so through the atmosphere), there is no material which is strong enough to use as a rope. Steel doesn't work because it sheares under its own weight. Indeed, safety requirements within a tall building require that all elevators have a cable. The weight of the elevator plus the weight of the cable is insufficient to cover 100 storeys of a building. This definitely won't work for a space elevator. The goto suggestion is nano-fibers of carbon. Specifically, tubes of hexagonal graphene. This leads to a problem which is often considered in rocketry and computing but rarely considered in nano-technology: MTBF [Mean Time Between Failure]. Most pertinently, MTBF of carbon atoms. In the most simplified form, if one carbon atom has a half-life of one trillion years before spontaneously decaying then a system with two trillion atoms and no fault-tolerance lasts one year before it ceases to work. 200 trillion atoms last about 3.6 days, which is less time than one journey up a space elevator.

I was reminded of this problem when discussing semi-conductors with a friend who worked at CERN. (CERN is a large Euro, pork-barrel, boon-doggle with a small core staff and an endless rotation of under-paid students. Its main contribution to the world, HTTP/0.9, was successful because the internal telephone directory was too unwieldy. This was otherwise unrelated to its core mission.) CERN uses semi-conductors to detect high-energy particle collisions because semi-conductors are very sensitive. Unfortunately, the collisions eject particles which cause fission in the semi-conductors. One of the more predictable reactions is that two carbon atoms plus one neutron and one proton becomes beryllium plus fluorine. All of this screws chemical bonds. A reaction with an extra proton also requires an complimentary electron. Typically, this is enough to destroy a semi-conductor sensor.

Transplant all of this fission to a nano-fiber of carbon in a space-elevator which cuts through the Van Allen belt. The atoms of carbon will spontaneously become other elements and the conceptual symmetry of hexagonal tubes will be kinked, ionized and/or sheared. This makes a space elevator from Earth technically infeasible with any material. I understand that a space elevator on the Moon can be made with a very large amount of dollar store string. However, the higher gravity and rotation of the Earth prevents an equatorial space elevator. It may be possible to run a rope from the North Pole of the Earth to the North Pole of the Moon and then use a equatorial space elevator on the Moon. However, this requires a ridiculously large tower which is subject to atmospheric corrosion. A more recent variant of this proposal is a rope from the Moon which only approaches the Earth and a friend suggests unconnected sections of rope floating between the Earth and the Moon. In all cases, getting to the first section of rope remains a challenge. Also, sites of interest on the Moon are awkwardly distant. Regardless, the concept allows payloads to be mostly winched out of the Earth's gravity well and then mostly winched out of the Moon's gravity well.

Vacuum Tube Travel

Another alluring concept is vacuum tube travel. For more than a century, shops and metropolitan areas have used vacuum tubes to transport small objects, messages and cash. However, larger schemes have always failed. The first notable failure was Isambard Kingdom Brunel's attempt to make a vacuum train using leather seals. A contemporary example is the PayPal co-founder and US$7 billion corporate welfare queen, Elon Musk, who proposes HyperLoop vacuum transport. Assuming the manufacture of mono-crystal diamond tubes of 1km length and 10m circumference, a tube has a surface area of 10000m2 per kilometre. Diamond of any thickness is permeable by hydrogen. Therefore, any section of tube which is pumped to perfect vacuum will eventually fill with hydrogen at atmospheric pressure. In the ideal case, this occurs very slowly and the tube can be used for greatly accelerated travel. In the practical case, with a concrete and/or metal tunnel, low pressure attracts air (and water) at an impractical rate.

This is a cognitive limitation. Inventions often handle many multiples of atmospheric pressure. Examples include submarines and diving equipment. In some applications, such as gas cylinders, acceptable losses leak through cylinder walls. However, the principles of high pressure and low surface area don't apply to low pressure and high surface area. That's why vacuum trains don't work.

StarChip and Javalin Ships

There is another scenario where hydrogen is a major hindrance. As I understand, in inter-stellar space, there is approximately three molecules of hydrogen per cubic metre. In some circumstances, this can act like wind felt on a human scale. This was noted by a friend who regularly contributes to WorldBuilding on StackExchange. Fiction authors can check the feasibility of their ideas. This could be the family tree of various fictional species, Turing complete magic or hard science calculations often related to the speed of light. A standing joke on WorldBuilding is that reasonable proposals often result in destroyed space-ships and dead crew. ("Everything is on fire and they're all dead.") One scenario was very similar to the type of question answered by XKCD's What If series: What would happen if aliens launched one metric ton of lead from Pluto to the Earth at 99% of the speed of light. Assuming a perfectly spherical cow, erm, mass, it would rapidly become plasma, singe all vegetation and permanently blind every exposed creature on one side of the Earth and then create the most astounding aurora visible on the other side of the Earth. However, it wouldn't destroy a city, create any tectonic activity, significantly poison the atmosphere or kill anyone.

A similar question is space-ship repair at 90% of the speed of light. The technician would feel the inter-stellar hydrogen like wind while being fatality irradiated. Unfortunately, the investigation of various Trojan horse scenarios involving ice and/or rock reveal a fundamental flaw in our understanding of space-probes and space-ships. A space-craft with a cross sectional area of 1m2 which travels one light year will sweep a volume of approximately 10^16m3 and will encounter a minimum of 3*10^16 molecules of hydrogen. This is a minor problem when travelling slowly. However, it becomes increasingly significant as speed increases.

The inter-stellar medium will strip the leading surface of any space-craft. Unfortunately, the hydrogen is not ionized and therefore cannot be deflected with an electric field. Indeed, equipment to ionize hydrogen will be stripped at the same rate as any sacrificial surface and is therefore pointless. If a space-craft travels at 10% of the speed of light, approximately 1km of sacrificial iron is required per light year travelled. That makes any feasible space-craft look like a javalin.

To make matters worse, a space-ship which rotates to simulate Earth gravity cannot rotate more than three times per second without dis-orietating its crew. This requires a minimum diameter of approximately 400m and a cross section of approximately 126,000m2. Therefore, any solid space-ship with (animate) human crew and conventionally simulated Earth gravity requires a minimum of 1/8 of a cubic kilometre of iron per light year travelled. This requires an astounding quantity of energy to assemble and accelerate and is not feasible as casual transport.

Many forms of space exploration remain possible, including cryogenics, stasis, gene seeding, androids and robotics. However, something like Battlestar Galactica, Ulysses 31 or Andromeda won't happen. Likewise, inter-stellar nano-probes won't happen either. A prototype version involves a highly redundant fleet of space-probes which are approximately 1cm3, contain a small ion drive, a camera, other sensors, a guidance computer and a phased array antenna. One million of these can be directed to survey a neighboring star, sling-shot at 90° and send data back to us without concern about relativistic effects. The minimum cross sectional area of one million StarChip is 100m2 and the proportion which will survive the journey to any star is zero. Oh, erm, yeah. That isn't going to work. The inter-stellar medium is too harsh for tiny probes which continuously accelerate. While this idea seduced smart people, such as Bill Gates and Stephen Hawkin and everyone's favorite fraudster, Mark Zuckerberg, the popular understanding of space-craft is deeply flawed.

However, it isn't all dome and glome. The infeasibility of StarChip means that we are extremely unlikely to be killed by an alien student's errant science project. Likewise, we are extremely unlikely to kill anyone outside of our solar system.

Financial Emergency - Yours Not Mine

Posted by cafebabe on Tuesday August 27 2019, @06:55PM (#4528)
41 Comments
Business

I apologize for being relatively inactive on SoylentNews since at least Oct 2018. I wrote a few scripts which allow me to inhale huge amounts of text via the wonders of text to speech. I've steadily increased the rate of speech and I currently have my computer read text to me at the rate of 440 words per minute; sometimes for 10 hours per day. I've peaked 0.5 million words per week. While text to speech is a terrible medium for absorbing numerical information, I have grazed quite broadly and followed many of the hyperlinks given on SoylentNews. Unfortunately, these are often collected via another script when I connect to the Internet at a local Internet café. Sometimes, this occurs weekly or less frequently. On occasion, I have fetched more than 3000 URLs. Unfortunately, my awareness of topical events often lags by two or more weeks. Delay plus thorough examination of references are major contributors to apparent lurking.

During this period, I have also followed fringe news websites, including some capitalists and the un-reconstructed Trotskyists. While I do not claim that sources are free from bias, it is curious to observe massive economic downturn described from opposing sides of a global economic system.

I do not have time to explain problems in detail or give citations. Regardless, the most optimistic economic predictions found among mainstream experts is that severe economic recession will occur by Dec 2021. Pessimists and people without an economic buffer are more likely to say that severe economic recession started at least three months ago. We only have to wait for the official figures to be collated, published and re-stated until we get an accurate assessment. Economic experts are also comparing the current economic charts to every economic downturn over the past century, including the 1929 stock market peak, the 1930s depression, the Second World War, 1970s stagflation, the Oct 1987 crash, the Dot Com boom, the Dot Com bust and the 2008 stock market crash.

The big stock market crashes usually occur in October but some think that it could be days away in September. The final straw could be a fourth round of Quantitive Easing [QE4]. With globally inter-connected supply chains and multiple central banks trying to keep floating fiat currencies in proportionate ratios, we may see every major currency become virtually worthless. I hope that I'm wrong but cash may decrease in value by 1/3 by Dec 2019. Ignoring this scenario, the global economy is completely screwed.

Vehicle sales in the US, India and China are all down. Almost every major US company is in trouble. That includes Apple, Boeing, FedEx, Ford, Netflix, Tesla and Uber who are collectively losing more than US$50 million per day. Elon Musk's ventures have received more than US$7 billion of direct and indirect subsidies from the US Government. US shale and fracking is an economic mirage which has skewed global data. Retail sales are down. Trucking is down. Shipping is down. Recycling is down. Smartphone sales peaked in 2016. Cinema tickets are down. Disney and Warner are defying industry trends. The Disney mega-mergers account for much of this success. However, Disney is also rushing through live-action re-makes of (almost) every musical cartoon rather than pacing themselves. Why? Musicals are very successful in a economic depression.

The average US farm is US$1.3 million in debt and food shortages have begun. Due to flooding in the US, 19 million acres of farmland didn't get planted. In China, more than 20% of pigs have been slaughtered to combat swine fever. The loss of animal protein from the global supply chain would feed the US for a year.

Homelessness in California exceeds 0.3 million people and is likely to accelerate. Opioid deaths have peaked but could be overtaken by deaths from measles, tuberculosis, typhus and bubonic plague. The world's second worst incident of Ebola hasn't been contained. Earthquakes around the "Ring Of Fire" are also unusually high.

National protests in France have been ongoing for more than 40 weeks. Protests in Hong Kong have been ongoing for more than 10 weeks. Expect these to become more widespread. Also expect telecommunications to be filtered, cut or filled with dis-information to hinder mass gatherings.

Decreased wealth, decreased purchasing and decreased shipping is causing a glut of oil. This is causing proxy battles involving the US, Russia, Europe (except Germany), Turkey, Syria, Libya, Yemen, Iran and Israel. Asia, which has become the workshop of the world is also squabbling. As sales decline, divisions are being drawn between South Korea, Japan, Taiwan and China (with its honorary province, North Korea). India and Pakistan are also on the verge of war. Eight or more of these countries are declared nuclear powers and a treaty banning medium range missiles just expired.

Resource allocation (glut of oil, glut of metal, shortage of water, shortage of food) plus religious tension could lead to a world war with a starting position of China, North Korea, Iran and Pakistan versus the world with Italy switching sides, France surrendering and Russia selling weapons to all sides. Minimum casualties from physical injury, mental trauma, disease and famine will be 3% of the global population. (250 million people.)

Global war could be deferred for up to two decades. Unfortunately, we'll only have a steep depression until war begins. Arguably, the global economy has been under-performing since the Dot Com bust and we may only be midway through the trend towards the historic mean. We've definitely been askew since the market wobble on Wed 28 Feb 2007, bank bail-outs and Quantitative Easing. Many of the worst financial practices of the past 20 years have been restarted. This includes flipping unprofitable tech companies and 100% mortgages with no proof of income.

National debt cannot be repaid. When one nation's debt reaches 85% of GDP, it is considered to be distressed. However, the sum of national debts is 320% of GDP and that excludes state debt, city debt and private debt. US$15 trillion of bonds have negative yield. Investors are guaranteed to lose money if they are redeemed in full. We also have negative yield junk bonds and Denmark is pioneering the negative rate mortgage. Yes, the debt owed decreases even if you miss a payment. Why would anyone lend on such terms? It is safer than stock market investment. As an example, the P/E ratio of the S&P 500 is 16.7 but, by 2026, the average duration of company listing is expected to be 14 years. 18 out of 20 criteria show similar poor value. On this basis, funding a negative rate mortgage in Denmark is a better investment. If debt is reset through hyper-inflation, a physical asset is a *much* better investment.

We're in a hole deeper than the 1930s depression - with much of the economic and political turmoil ahead. The global economy is completely primed to collapse. This time, it won't be Germans with wheelbarrows of worthless cash. It'll be Zimbabwe, Greece and Venezuela for everyone.

We're also living in a post-truth era where Jeffrey Epstein died in suspicious circumstances. With no obvious source of wealth or financial success, he spent decades collecting incriminating video of many rich and famous people; possibly on behalf of a nation state. As soon as DeepFakes made the archive worthless, he becomes a British establishment pedophile Arkancide. Unfortunately, this is only one example where authority is distrusted and justice is not served. Disputed facts leave us with fragmented politics, no easy answers and no uniting cause. Without the political consent of the population, national interests don't get defended and the chaos continues until it becomes untenable. Then we get a despot with a unifying message. Any message will do.

Predictions

  • US stock market crash by Dec 2019.
  • Global currency devaluation by Dec 2021.
  • Netflix, Tesla and Uber cease trading by Dec 2021.
  • Homelessness in California to exceed 0.5 million people.
  • Two mass shootings in Switzerland by Dec 2021. In the US, 40 mass shootings in seven consecutive days by Dec 2021.
  • James Howard Kunstler's Long Emergency scenario. Emergency services don't respond. Infrastructure degrades. Oil rigs explode, chemical refineries explode, oil pipelines explode, gas pipelines explode, power cuts, fatal aircraft crashes, bridges collapse, tower block fires. Pot holes don't get repaired.
  • Citizen protests spread to another five countries. Police kill protesters in all of them. Protests continue.
  • Multiple political assassinations. Not metaphorical. Mark Zuckerberg, Greta Thunberg and Andrew Windsor dead by Dec 2029.
  • China invades Taiwan.
  • Ebola in Europe.

Augmented Light Controller

Posted by cafebabe on Monday July 22 2019, @08:52PM (#4442)
4 Comments
Hardware

I've been prototyping agricultural lights. The prototype design uses a laptop power supply, a colander, an ice cream tub and about 240 5mm circular LEDs. They look terible but they're really cheap to make because the power supply costs more than all of the other components. The prototype only consumes about 5 Watts of electricity. Given that the LEDs are about 30% efficient, that is about 1.5 Watts of visible light. That's completely inadequate for use as a grow light. However, it is sufficient for domestic lighting and other uses. It is also sufficient to develop the design further. Most importantly, the prototype currently lacks safety features. I also want to add networking. Although, after obtaining preliminary feedback from experts, LTS [Long Term Support] for networking isn't good and may be restricted to 9600 Baud serial.

Two of these lights were shipped to an agricultural/environmental gathering/conference hosted by Mitch Altman. There was space in the middle of two facing colanders for a spherical cow plushie. This invocation of rubber chicken protocol trivially confirmed delivery of the lights.

Before sending the prototype lights to the conference, I hawked the prototypes around my local lighting and hydroponic shops. The response was wholly underwhelming. At the lighting shop, before I had removed a prototype from a bag while asking "Would you be interested in a...", the first impression led to the terse response of "Nah." At my two nearest hydroponic shops, enthusiasm was also lacking, although I got as far as demonstrating powered lights to the owner each shop. In response to variable brightness LEDs, one said "They all do that." However, feedback was vaguely useful because one suggested researching the McCree curve and the other advised against working on yet another proprietary network protocol. Apparently, over the last four years, at least one protocol per year was commercialized before it failed. With the recent increase of Internet connected devices, I suspect that the quantity of failed protocols is greatly accelerating.

Hydroponic retailers are also underwhelmed by equipment which compliments natural sunlight and doesn't require any configuration beyond physical installation.

I sent extensive documentation to the conference and it is quite obviously written before I got feedback. Regardless, it describes the design with sufficient detail to maintain it or reproduce it. It also includes a large amount of speculation including ideas for a significantly larger version, a significantly smaller version and use of the agricultural lighting on an industrial scale in conjunction with other equipment. This is a tidied and hyperlinked version:-

#### Augmented Light Controller ####

==== Rationale ====

It is possible to boost plant growth with artificial light. This is prohibitively expensive for low value plants. It is especially expensive to grow illegal plants in a sealed environment in which natural light is completely absent. Methods to reduce cost include stealing electricity and use of sustainable energy.

Sustainable energy is popular because it allows "off grid" use. Furthermore, sustainable energy largely moves the unit cost of energy to the initial cost of installing hydro-electric, wind or solar collection. Although efficiency may decline over multiple years, replacement systems are increasingly efficient.

Indeed, after many decades of pioneering such systems, we are now at the knee of the curve where the collection, transportation, storage and usage of electrical energy at a domestic scale now exceeds 5% total efficiency. With improvements to solar panels and LEDs, total system efficiency may exceed 20% by 2050. This would allow "off grid" farming up to the Arctic Circle with less than 100m2 of solar panels per adult (and considerably less in tropical regions).

A neglected method of reducing energy consumption is augmenting natural light with synthetic light. Although C3 and CAM plants happily thrive on 2kW/m2 of light, there are advantages to staggering and extending the duration of light. To minimise damage to plants (for example, from lensing of dew on plant leaves), it is desirable for an augmented light cycle to lead or lag the natural light cycle. This is implemented with custom software running on fairly generic hardware.

[Diagram omitted. Graph of brightness over time. Bell curve (in pale red) "Natural Light" overlaps with bell curve (in pale green) "Synthetic Light". Sum of curves (in pale yellow) "Total Light".]

==== Implementation ====

---- Hardware ----

Circuitry is implemented on 5cm×7cm prototyping boards. Each light has one controller board and three LED boards. The 18×24 holes at 0.1 inch spacing are barely sufficient to host 12 strings of up to eight 5mm LEDs in series. (One row and column is unused.) This is achieved with triangular packing and (nominally) two heights of LEDs. Strings are arranged as pairs (which mostly work) and everything is powered from a replacement Sony laptop power supply which provides a regulated, unisolated, switched mode supply of 19.5 Volts. It is strongly recommended that a power supply targets an older laptop. New laptops require less Voltage than old laptops. However, energy efficiency can be maximised by minimising Voltage drop. Therefore, it is convenient to obtain a "replacement" power supply for an old laptop.

Use of a switched mode power supply is not suitable for agricultural use where water and electricity are often mixed inadvertently. However, it is suitable for further development.

Empirically, the 19.5 Volt supply is sufficient to power eight red LEDs, eight orange LEDs, seven yellow LEDs, seven olive/gallium green LEDs, seven gallium blue LEDs and/or six pink/purple LEDs. Presumably, infra-red, ultra-violet and white LEDs can be deployed in similar quantities.

[Diagram omitted. Pale green board has 12 columns of triangular packed circles. Two columns each have eight pale red circles. Subsequent pairs of columns each have seven or six pale circles and end with dashed circle outlines which raise the total in each column to eight.]

Each of the three LED wafers are soldered with common anode. Channels across all wafers are gated with 2N2222A transistors with current limiting resistors to Port D of a DIP [Dual In-line Package] Atmel ATMEGA328P. (Wiring/Arduino pins D0-D5.) The remainder of Port D, is connected to an LDR [Light Dependent Resistor] and a switch. Fly leads for the LDR and switch are quite fragile. Use of tack or tape is strongly recommended to provide strain relief.

Although D0 and D1 may be used with the micro-microtroller's dedicated UART rather than power switching, use of D0-D7 is more convenient on a small board. In the medium term, multiple channels of a custom wire protocol are required. This is not satisfied by reserving two UART pins.

At present, it is significantly more important that the micro-controller's dedicated I2C pins are not obstructed. This allows the least obstruction when experimenting with I2C thermometers. This is intended to ease implementation of thermal shutdown.

[Diagram omitted. Circuit diagram/block diagram has 20V and 0V rails. "Voltage Regulator" connects to both rails and "Micro-Controller" which connects to "Sensors". 20V rail connects to six strings of LEDs (in pastel rainbow) which connect to a diagonal of six NPN transistors which connect to "Micro-Controller" and 0V rail.]

With the current arrangement, one binary input is trusted and this input is used to switch all power. It is extremely bad practice to trust inputs in this manner.

An example of this practice is Toyota's accelerator pedal where two potentiometers were connected with a SIP [Single In-line Package] connector wired as ground, power, pot, pot, power, ground. Unobstructed paths and the use lead-free solder allows formation of tin whiskers. A tin whisker between power and ground quickly resolves itself. A tin whisker which gangs potentiometers effectively halves their resistance. A tin whisker between Voltage sense and the power rail spuriously indicates full acceleration.

Another example of this practice is the anti-stall system in a Boeing 737 Max. This was only connected to one of the two air speed sensors. Erroneous readings from a faulty sensor were not ignored but prevented an aircraft from gaining height. This led to two crashes and 346 fatalities.

The lighting controller should not be scaled without safeguards. The current implementation is for development of such safeguards.

---- Low Voltage Power Regulation ----

Power regulation is rather arcane and may be skipped.

[Diagram omitted. 10 pin ICSP connector and 6 pin ICSP connector commonly used with Atmel products.]

An Atmel ATMEGA328P (with optional six pin ICSP [In Circuit Serial Programming] connector) obtains a lesser Voltage via an LM317T. This controller board is suitable to drive six channels up to 800mA per channel at 30V. Future iterations of this design will push to envelope to 1.1A per channel at 48V.

The use of an LM317T variable Voltage regulator was a failed test. A series of floating Voltage regulators may power a micro-controller directly from mains electricity. Unfortunately, this requires a very large number of passive components. Furthermore, it is extremely inefficient with energy because the majority is wasted as heat. A further failure was the attempt to use an LM317 with an NE555. Use of a 555 usually indicates use of a dumb, stock circuit or something smart. An accepted use of a 555 is to only use its internal resistors. This potential divider circuit has the properties of matched values and close thermal coupling.

[Diagram omitted. Diagram of 555 containing potential divider connected to three external lines. Remaining 2/3 of block hatched with text "Other Stuff".]

Specifically, if a resistor value drifts due to Joule heating, the others rapidly follow due to their proximity. This occurs regardless of current flowing through each resistor. Unfortunately, a 555 fails to work with a 317 because a 317 specifically limits current to a maximum of 100µA while re-injecting it to the floating output. This specifically requires low value resistors otherwise the derived reference exceeds range and no Voltage regulation occurs. A dimensional analysis of current multiplied by resistance is Voltage. The current is drawn from the potential divider and cannot be sunk. Indeed, this is not desirable because it is not energy efficient. Unfortunately, the current drawn by the 317 and the resistance provided by the 555 leads to a value which is useless. Therefore, the devices are incompatible.

---- Metal Chassis ----

All hardware is mounted with electrical insulation in a metal chassis with ventilation grills. Specifically, the LED wafers are mounted in a triangular formation around the edge of a Poundland cooking colander and the insulation is cut from white plastic Sainsbury vanilla ice cream tubs. Although this looks laughably amateur, it is only intended to boot-strap a more serious design. The total BOM [Bill Of Materials] per light is approximately £16 (US$22). Of this, the 90 Watt PSU is £9.49 (US$14) and may be shared among multiple lights.

It is possible to mount six or more LED wafers in a colander. However, when a colander is mostly covered with LEDs, the reflective property of the colander is under-utilised.

Mirror image wafers were implemented with the intention of simplifying soldering. However, the lack of rotational symmetry is quite jarring. Therefore, mirror image wafers have been discontinued.

[Diagram omitted. Circle containing central block, three surrounding blocks with rotational symmentry and three dashed outlines which would form six way rotational symmetry. Peripheral blocks are wired to central block with rainbow lines.]

During use, LED wafers get quite warm; presumably about 40°C during sustained use. Thermal expansion and proximity of LEDs on wafers leads to cracking noises. In future iterations, LM75A I2C temperature sensors (with accuracy ±2°C) will be mandatory within each LED cluster. AVR micro-controllers also have a temperature sensor within the analogue section but the accuracy is only ±10°C. Other micro-controllers may not have a temperature sensor of any form.

---- Firmware ----

12 bit PWM [Pulse Width Modulation] with granularity of 1µs (cycle time of approximately 120Hz) is implemented across six channels in software. Although the target hardware provides PWM on some channels, software portability is paramount. Although development has greatly benefited from the idiot-proofing of the AVR processor architecture, it is significantly cheaper to deploy firmware on WCH's 8051 micro-controllers, such as a CH340 or CH554 (the infamous 25¢ micro-controller). This reduces micro-controller cost by a factor of 30 or 40.

A POST [Power-On Self Test] fades all channels from minimum to maximum in sequence. Modifications to this sequence will provide firmware version identification. Additional channels were planned for diagnostic lights. However, the main six channels have been sufficient for this task. For example, while diagnosing a compiler bug, one channel was used to provide indication of a bounds check. Underflow was displayed as 10Hz flashing with 1/3 duty ratio and Overflow was displayed as 10Hz flashing with 2/3 duty ratio. If this is not sufficient, a debug string can be emitted in Morse code.

The main algorithm maintains a delta summation (increments/decrements) as a 32 bit variable. Due to one of many compiler bugs in GCC 4.8.1 cross-compiling from armv6t to AVR, it was not possible to implement the 32 bit value as a global variable. Therefore the Wiring/Arduino loop() hook-back maintains state within its own endless loop. Other compiler bugs include -O3 eliminating endless loops and multiple calls from main() to loop().

Summation is used to implement an approximation of colour temperature by stepping through a rainbow of six colours and pulsing zero or one of the channels. This is intended to lag behind natural light by approximately four hours. It is also intended to moderately amplify a change of season. Therefore, plants boosted with augmented light should continue flower and fruit with the natural season.

In normal operation, the augmented light controller produces no visible output for the first hour of operation. This is correct behaviour but is quite tedious when testing. Therefore, a switch has been provide which accelerates the summation process by a factor of 240. (Four minutes are compressed to one second.) During daylight, this allows confirmation of LDR position within 20 seconds. It also allows the augmented light cycle to be manually advanced after installation or power failure.

Ensure that the LDR does not receive direct or reflected rays from any augmented light otherwise the light controller will be locked in an undesirable feedback loop where lights correctly switched on but never switched off.

Given that the rainbow of LEDs provide spectral peaks at 30nm or so throughout the human visible spectrum of light, it is possible to replace the firmware and generate arbitrary spectral peaks with the same hardware. When combined with A/B testing, it is possible to determine the most energy efficient lighting for different species of plants. This information may used to modulate augmented light output. Given that the six or more identified variants of chlorophyll are typically most sensitive to red and blue, it is expected that yellow, green and purple may be reduced but not eliminated.

It is unlikely but other arrangements of colour may be more suitable for agriculture. Cool white plus red and blue provides a generic base for agricultural lighting but re-emission of photons to provide a broad spectrum of yellow is not the most energy efficient arrangement. It also creates an unwanted spectral peak around green, blue or purple which may disrupt plant life-cycle.

[Diagram omitted. Pale green board has 12 columns of triangular packed circles. Pairs of columns represent red, white, blue, red, white, blue.]

---- Code Quality ----

Firmware is developed with the Wiring/Arduino digital I/O API. However, it is not linked, tested or deployed with the standard Wiring/Arduino LGPL library. The code quality of this library is objectively awful. As an example, digitalWrite() is slow and bloated due to indexing three look-up tables; one of which has 16 bit values. This requires adding a value to a base pointer then left shifting by one bit and then adding the value to another base pointer. Clearing a bit also requires inverting a value obtained from a table. In all cases, this can be reduced to accessing two of three tables with no shifts or inversions.

As a further example, pinMode() uses a macro from Arduino.h which uses pointer arithmetic. This is contrary to the MISRA standard which was originally developed to improve code quality in the automotive industry but is now used in other critical industries, such as aerospace and healthcare. Although agriculture is relatively dull compared to these industries, there is no excuse for lax practice which needlessly increases MTBF [Mean Time Between Failure].

Agricultural lighting may cause electrical fire. In a domestic environment, this may lead to homelessness. In many cases this reduces crop yield. It is for this reason that good practices will be followed rigidly. This includes watchdog timers, thermal shut-down, parity checks, strong CRCs, static analysis, assertions, fuzzing, redundant sensors, two phase commits and hardware interlocks.

==== Other Applications ====

Six channels of lights may be arranged as two redundant sets of three channels or three redundant sets of two channels.

---- Stage Lighting ----

Two sets of RGB [Red, Green, Blue] LEDs may provide arbitrary colour for stage lighting. This is most useful if the lighting controller works with a communication protocol, such as DMX.

[Diagram omitted. Pale green board has 12 columns of triangular packed circles. Pairs of columns represent red, green, blue, red, green, blue.]

---- Home/Office Lighting ----

If power output is restricted to half of the maximum, it is possible to control three sets of warm white and cool white LEDs in a pleasing manner. Specifically, colour temperature can be set independently of brightness. This allows home or office lighting to minimise sleep disruption. This may be set with switches and/or dials, set automatically via an LDR and/or configured via a network communication protocol.

[Diagram omitted. Pale green board has 12 columns of triangular packed circles. Pairs of columns represent cool white, warm white, cool white, warm white, cool white, warm white.]

---- Industrial/Event Lighting ----

Dumb arrangements of cool white light are typically used for flood lighting. This is not the most energy efficient arrangement. This is especially true if LEDs are retro-fitted to legacy light sockets. On large structures (bridges, tall buildings) systems using 370VDC are common to minimise Voltage drop across long spans of wiring. However, many of these systems would benefit from using narrow bands of LEDs to further improve efficiency.

==== Regulations =====

The light controller has been developed in anticipation of laws within multiple jurisdictions. The majority of competing designs do not fulfill these obligations.

---- Colour Rendering Index ----

European regulations require certain categories of lighting to attain 80% accurate illumination compared to sunlight. In the long term, this is likely to be raised to 90% and then 95%. CFL [Compact Fluorescent] lighting does not meet this requirement. White LEDs do not meet the long term objective either.

Test wafers have low chromatic coherence. Specifically, shadows have two rainbow fringes. However, sunlight also has low chromatic coherence due to white hot sunlight being split into direct yellow light (with a dark purple shadow) and indirect blue. Some experimental lights use nano-particles to simulate this scattering.

---- Right To Repair ----

Right To Repair legislation is intended to counter planned obsolescence, abandonware, proprietary lock-in, pollution and landfill of working electronics and frustration of customers who are unable to adapt or repair their own equipment. Proposed European regulations will ensure that all LEDs in luminaires can be replaced. This is vehemently opposed because it would eliminate the majority of products from the European market.

---- Recycling ----

Electronics manufacturers within Europe are required to pay towards disposal. If a minimal amount of electronics is manufactured (determined by weight), a flat fee is payed. This is believed to be £35 per year for one tonne or less of electronics. Larger quantities incur larger fees and the responsibility to accept returns. Although the regulation appears to be comparable to Data Protection costs and obligations, the fee is payed to a private contractor. In the UK, RecoLight has the majority of the market. However, recycling of LEDs is currently quite crude. Currently, boards are ground to dust and the dust is heated to extract gallium and other useful material. This is quite energy intensive but less intensive or damaging than mining more minerals.

==== Future Development ====

---- Network Communication Protocol ----

A 256 bit cell network protocol is being developed. It is intended to be a slow-speed ATM Lite protocol which can be implemented in the firmware of an 8 bit micro-controller. Specifically, it should be possible to implement an eight port network switch using a micro-controller with 2KB RAM. The use of cell networking (rather than packet networking) allows packets of arbitrary size to be switched. Indeed, using AAL5 (commonly used to implement PPPoE or PPPoA over ATM) or similar, it is possible to switch 9KB Ethernet jumbo frames via a micro-controller with 2KB RAM. Optimal choice of 32 bit CRC raises maximum packet size to almost 13KB.

In terms of the OSI seven layer network stack, layer one and layer two are implemented although efficiency improvements are desirable so that more throughput may be obtained with cheap, slow micro-controllers.

Many network communication protocols operate as an open loop or provide minimal signal integrity. Lighting controllers are intended to provide reliable operation in conjunction with water pumps or other equipment by implementing a protocol similar to XA distributed transactions.

Surplus bandwidth may be used for agricultural analytics, home security, voice communication and/or slow-scan video.

---- Nybble Virtual Machine ----

The target architectures have a 16 bit address space. Up to 56KB may be EEPROM or OTP [One Time Programmable] EPROM although many of these options are more expensive than 256KB of paged serial EEPROM and a 32 bit micro-controller.

As a contingency, a 32 bit stack based virtual machine with 4 bit instructions requires 2KB ROM. This allows up to 60 kilo-nybbles of code to be distributed without external storage and/or paging. Unfortunately, nybble code runs with significant performance and energy penalty compared to native code. Until a nybble compiler is written, it also requires writing an application in nybble assembly.

Regardless, it has several desirable features which makes it suitable for extended functionality. It works on most micro-controllers supported by GCC. It has better code density than x86. It is fast enough to implement software only PWM for lights and servos. It is fast enough to process network buffers and implement network switch routing. It is also possible to have multiple virtual machines within one micro-controller. One possible arrangement is a virtual router for the other virtual machines.

At present, this functionality will not be used. However, the option exists to make extreme manufacturing savings or add significantly more features. Indeed, confidently having the option to compact code and/or virtualise functionality may defer or avoid such necessity.

---- Industrial Agriculture ----

A six channel lighting controller is sufficient to develop an industrial version which may switch up to 3kW of LEDs with energy supplied from lead acid batteries, 110VAC, 220VAC or 440VAC. The toy implementation is sufficient to develop and test watchdog timers, thermal shut-down and staggered power switching co-ordinated over network.

The prototype will be re-implemented as a single-sided, copper clad, surface mount triangular wafer with an approximate length of 20cm. Six or more 48 Volt channels require 15-18 LEDs per string. This can be arranged as three sets of six clusters of LED rings in a space-filling fractal curve with three way rotational symmetry.

[Diagram omitted. Pale green triangle with 18 pale yellow circles; six per corner arranged in triangle formation, all connected in series. Magnified section shows six cricles in a circular rainbow representing LEDs. Wiring within magnified section is staggered to allow a maximum of one wire to pass between LEDs.]

One or more of these wafers may be bolted to a passive cooling chassis which optionally contains a Galvanically isolated, continuous mode Çuk transformer which is intended to operate safely at 100% humidity. To minimise signal noise, the transformer and LEDs will pulse at a common multiple of 50Hz and 60Hz. Transformer switching and power factor management may use an optically isolated channel from a micro-controller (which also functions as a network switch for the wafers). Obviously, power management requires a hardware interlock to ensure safe operation and boot-strap to power the micro-controller.

Customers may wish to use branded LEDs, such as Nichia, Cree, whatever Philips is this week - and all of the second tier brands. This may require replacing all of the LED surface mount pads in CAD software. Hopefully, this process is compatible with dumb auto-routing of the LED strings.

---- The Square Kilometre Problem ----

When designing an industrial network, people typically sketch tiers of network protocol (often including Ethernet and RS-485) without consideration of cost, bandwidth, long-term reliability or availability of parts. Systems involving radio communication often have no consideration for power, scale or security.

These approaches are wrong. Instead, a cost effective system can be obtained by considering an infinite plane of agricultural lights, water pumps, nutrient pumps and moisture sensors being used indefinitely. Horticulturists tend to be very practical people who have no time for infinities. Thankfully, an infinite plane of hydroponics can be approximated with a practical example. Some of the world's largest industrial greenhouses are suitably measured in square kilometres. Anything of this scale can tiled while approximating a system with optimal TCO [Total Cost of Ownership].

Assuming square packing of 30cm diameter buckets with no access paths and one moisture sensor per bucket, approximately 11 million sensors are required per square kilometre. From this consideration alone, use of almost every protocol with a small address space can be eliminated unless there is bridging to a larger address space. Anything with IEEE802.15.4 header compression will also fail.

Waterproofing and connectors are a significant cost which do not depreciate with Moore's law. Use of radio is an obvious attempt to reduce the cost of connectors and corresponding water traps. However, one micro-controller may have dozens of crimped moisture sensors which do not require connectors or waterproofing. We minimise cost by minimising the spanning tree of connectors and wire. The calculation is only tempered by the practicality of installing and maintaining each cluster of moisture sensors.

Another consideration involves water tanks. Ebb and flow systems have a reservoir of water which is pumped to and from plant roots every two, three of four hours during daylight. Most of the time, the water does nothing. It is possible to multiplex the reservoir. For example, it is possible to have one tank in the middle of eight clusters of plants. This raises many questions. Does the water get pumped directly between clusters, does it go via the tank, or both? What happens if there is a leak? What happens if a pump fails? What happens if re-planting requires one section to be skipped? Can tanks be pooled together? What happens if a virus, bacteria or fungus spreads between clusters of plants or pooled tanks? The simplest arrangement is for everything to go via one independent tank. However, every variation requires MTBF calculations based upon unknown figures.

For domestic use, water may be pumped with aquarium pumps. Although these have low throughput and are irreparably damaged by sustained dry pumping, they are cheap, waterproof, work with local mains electricity and widely available. Unfortunately, aquarium pumps are unidirectional and fairly unreliable. This can be overcome by redundancy. The typical arrangement is one outbound pump back-to-back with two return pumps. This reduces probability of sustained plant root flooding due to pump failure. Pipe junction leakage is also minimised because three way cross or swept splitters are only incrementally less reliable than T or Y splitters.

To further counter unreliability of water pumping, it may be possible to monitor back-EMF of aquarium pumps. Although this does not cover all failure modes, it allows near continuous operation when using commodity parts. In all cases, it would be particularly desirable if a pump controller switched multiple sets of two, three or four mains power aquarium pumps while working autonomously with moisture sensors.

---- Lighting Over USB ----

Some companies specialise in PoE [Power over Ethernet] lighting. At launch, PoE cost US$50 per port and this excludes cabling and equipment using the port. PoE is now cheaper. However, it remains significantly more expensive than USB. PoE has advantages with span and bandwidth but these are not a concern in the majority of cases.

The reliable network protocol fits within a 24 byte packet payload. Therefore, it may be tunneled over USB. This allows the minimal implementation to be a USB dongle of the same size as a BlueTooth dongle. USB protocol allows up to 63 devices per USB host port. PCI/USB bridges and similar typically allow four ports per card to be added to a computer. Dedicated USB bridges may significantly extend the address space. Leaf nodes may be manufactured for £0.20 (US$0.30) or less.

[Diagram omitted. Green rectangle has four pin USB A connector. "Oscillator" connects to "Micro-Controller" connects to a rainbow of six LEDs. Rectangle has dimensions 18mm×11mm.]

In the minimal implementation, PWM is capped at the LED's preferred Voltage. For example, if a 3.3V blue LED is powered from 5V USB, PWM for the blue LED is limited to 66% duty ratio. PWM for a 2.7V red LED is limited to 54% duty ratio. Inputs should be transparently scaled down otherwise the spectrum will saturate in an undesirable manner.

If none of the LEDs are driven at their maximum duty ratio, it is possible to implement Charlieplexing, an awful technique, presumably implemented by someone called Charlie, in which two LEDs may be wired back-to-back and selectively driven by the differential Voltage between two micro-controller pins. This can be extended such that n pins may drive up to n(n-1) LEDs. Examples with 60 or more LEDs have been implemented. It is possible to drive six LEDs with three pins and obtain an average of 33% duty ratio.

Devices connected via any network communication protocol should remember their state of operation so that useful behaviour is observed. This requires storing one integer or a small set of flags in persistent memory (after the oscillator trim value and thermometer trim value, if any):-

State 0: Device has never been connected to a valid network. For USB devices, device has never been suitably queried by a program running on the USB host. In this case, device should run default stand-alone behaviour. For an augmented light controller, input should be taken from the LDR. Water pump controller should run a default schedule. For USB lighting, LEDs should be set to full brightness. Animatronic controller should run default program.

State 1: Device has previously been connected to a promiscuous network. Effort should be made to re-connect to network. If network is not found then operation should revert to stand-alone behaviour.

State 2: Device has previously been connected to a promiscuous network. Effort should be made to re-connect to network. Diagnostics should indicate error condition. Device does not revert to stand-alone behaviour.

State 3: Device has previously exchanged keys with a host and paired. Effort should be made to re-connect with previously trusted host. Diagnostics should indicate error condition. Device does not revert to stand-alone behaviour. Operation in this state may require switch or jumper to be set. Clearing this state may require host releasing device from pairing, removing switch or jumper or re-flashing device. For some devices, leaving this state would be regarded as tampering with security. Therefore, some devices will only work in this mode and resist casual replacement of key material.

In many common configurations, a large number of interchangeable devices may be connected to a network. However, network addressing may be relatively transient. For example, connectors may be swapped or inadvertently jostled during gardening. Furthermore, USB devices may obtain addresses in a fairly random order. This can be countered by providing a name field and/or asset tag field. This allows devices and their location to be associated with a human readable text name while allowing numeric addressing.

Where the device name field is longer than the network protocol payload, the name is sent and received in chunks. When setting a name, the obvious method is to hold intermediate chunks in RAM. However, RAM is a premium commodity within a micro-controller. Therefore, double buffering should be used within the persistent memory and a flag should be used to indicate which version is live.

Despite writing approximately 4500 words, there were a few things that I forgot to include.

Firstly, I didn't mention why I started writing my own version of the Arduino library. I erroneously thought that an Arduino Nano was supplied with a 20MHz crystal oscillator. An Atmel ATMEGA328P works quite reliably at 20MHz if it has a reliable 5 Volt supply. However, it works quite reliably over a wide Voltage range if it is only clocked at 16MHz. Indeed, I confirm widespread reports that it works outside of the range specified by the datasheet. Unfortunately, it took a while to resolve timing problems and generally get experience, confidence and a feel for the capabilities of this architecture. Essentially, I was specifying the compiler constant -DF_CPU=20000000, deploying it on a slower system and then wondering why the timing delays were out by about 25%. Duh! After reading library code, header files, disassembling code and generally being frustrated by the incomplete interrupt driven Arduino time delay code, I wrote a more portable version which should hopefully work on an 8051 and other micro-controllers. A similar situation occurred after disassembling Arduino I/O functions. The result is a smaller, faster, more portable implementation of delay(), delayMicroseconds(), pinMode(), digitalRead() and digitalWrite(). This covers a surprisingly broad range of Arduino projects and isn't subject to LGPL terms.

Secondly, the arrangement of the 16MHz crystal and decoupling capacitors adjacent to the DIP micro-controller was unconventional but quite effective. On a 0.1 inch grid, a two pin crystal with 0.2 inch spacing was placed diagonally in the X, Y and Z plane. This allows the crystal to be placed very close to the micro-controller. Relevent pins on the micro-controller are power, ground, xtal1, xtal2. Without spreading pins of the crystal, one pin is placed 0.1 inches from xtal1 and the other is placed 0.3 inches from xtal2. Decoupling capacitors are connected from each pin of the crystal to ground. The crystal sits diagonally against board and DIP socket. It provides a thermal buffer when soldering and the surrounding micro-controller pins aren't particularly obscured. Furthermore, the decoupling capacitors fill a narrow region of the board which would otherwise be unused. This arrangement looks incongruent but it is compact, reliable and practical.

Thirdly, don't buy 28 pin narrow DIP sockets. Two 14 pin DIP sockets are cheaper. That's partly why Atmel popularized a 28 pin narrow DIP format. Admittedly, it allows a DIP scale micro-controller to be manufactured with less material. However, people who buy 28 pin narrow DIP sockets are imbeciles.

I also sent source code and compiled code. License unchanged from previous iteration. The major difference is that the PWM cycle frequency has been raised from 4 seconds to approximately 120Hz. It also has a fancy power-up sequence.

begin 644 augment-light20190527.ino.gz
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
GM.X?_7GW\;24=5;]H_W?39!=D7L;^YTXK:>>K0'WO_P_,^2*)0``
`
end

(Usual instructions for uudecode process.)