Wednesday, December 27, 2017

Gas-powered waterjet cutter (and other project updates)

Build a capable waterjet cutter from a commercial pressure washer.

Cutting head -

Orifice -

Mixing tube (nozzle) -

Pressure washer -

Pressure washer hose coupling (for brazing into cutting head) -

eBay CNC milling (eg) -

Applied Science on Patreon -

Saturday, November 25, 2017

Glass engineering - designing and making photochromic glass

How to make small batches of specialty glass with minimal equipment.

Good overview glass engineering book from 1920 (how to choose ingredients) :

"5mW" *nudge-wink*   405nm laser pointer:

Alumina melting dish on eBay:

Source of kiln paper, mold release, molds, glass fusing supplies:

Paragon Quickfire kiln:

Case of 12 insulating fire bricks:

Graphite mold:

Relevant patents for photochromic recipes:

Applied Science on Patreon:

Sunday, October 29, 2017

Fast partial refresh on 4.2" E-paper display from Waveshare / Good Display

Google Drive link with Arduino firmware used in this project:

I bought the Waveshare devices on Aliexpress:

Datasheet with the 42-byte LUT format used in the 4.2" display, but not the exact correct part.

Interesting thread with other folks experimenting with LUTs on the 2.7" display.

Waveshare (distributor) datasheet

Good Display (manufacturer) datasheet

Waveform "theory" with class 7-5-7 pulse sequence:

My favorite microcontroller dev board, the Teensy:

The new awesome 5-series oscilloscope from Tek:

Saturday, July 1, 2017

World's smallest lightbulb flasher? Flashing Light Prize 2017

I built an extremely small lightbulb flasher and describe the design process and challenges. This video is free for Patreon subscribers, and if I win the contest prize, I will donate the winnings to a STEM education charity.

2017 Flashing Light Prize:

Source of micro light bulbs:

Single Schmitt inverter:

The SR416 cell is the smallest primary power source available:

Spot Welder:

Big thanks to Tektronix for very useful test gear. Much appreciated!

Applied Science on Patreon:

Monday, May 29, 2017

Waterjet cutter built with a cheap pressure washer

Building an abrasive waterjet cutter with a $150 pressure washer.

Water orifice, mixing tube (nozzle), cutting head, high pressure fittings, valve:

80 grit garnet abrasive - ebay

Sun Joe pressure washer:

Pressure gauge -

Good waterjet background and design info:

Good selection of higher-end pressure washers:

Wikipedia waterjet cutter (diagram image source):

Support more Applied Science videos:

Thursday, March 23, 2017

T-shirts available now

Hello!  I have re-launched the Applied Science T-shirt campaign on Teepspring.  It will end in just a few days, but will re-launch after that, and be active for at least two weeks.  These shirts are being sold at-cost -- thanks so much for your support!

Monday, February 20, 2017

 I show how to collect detailed CAN bus data from a Tesla Model S, and display it in the car's own web browser!

Complete Raspberry Pi with CAN bus shield and 12V buck converter:

Tesla diagnostic connector:

RPi CAN bus tutorial:

Get node.js installed on the RPi:

I used, which is a module that installs into node.js:

Diagnostic connector pinout (scroll through the images):

Tesla CAN bus reverse engineering:

Basic sequence to setup the server on the Pi:
sudo ip link set can0 type can bitrate 500000 listen-only on
sudo ip link set can0 up

candump -cae can0,0:0,#FFFFFFFF

candump -cae can0,0:0,#FFFFFFFF | grep 106 | awk -Winteractive '{ print $10}' | node app.js

I will post the node.js code on my blog:

Support Applied Science on Patreon:


var readline = require('readline');
var rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
  terminal: false
pipedata = '';
rl.on('line', function(line){
pipedata = line;

var http = require('http'),
    fs = require('fs'),
    // NEVER use a Sync function except at start-up!
    index = fs.readFileSync(__dirname + '/index.html');

// Send index.html to all requests
var app = http.createServer(function(req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'});

// server listens to our app
var io = require('').listen(app);

// Send current time to all connected clients
function sendTime() {
//    io.emit('time', { time: new Date().toJSON() });
    io.emit('time', pipedata);

// Send current time every 10 secs
setInterval(sendTime, 100);

// Emit welcome message on connection
io.on('connection', function(socket) {
    // Use socket to communicate with this particular client only, sending it it's own id
    socket.emit('welcome', { message: 'Welcome!', id: });

    socket.on('i am client', console.log);



<!doctype html>



        <script src='/'></script>


            var socket = io();

            socket.on('welcome', function(data) {


                // Respond with a message including this clients' id sent from the server

                socket.emit('i am client', {data: 'foo!', id:});


            socket.on('time', function(data) {



            socket.on('error', console.error.bind(console));

            socket.on('message', console.log.bind(console));

            function addMessage(message) {

              //  var text = document.createTextNode(message);

                  document.getElementById('messages').textContent = message;

        //     el = document.createElement('li'),

               //     messages = document.getElementById('messages');

              //  el.appendChild(text);

              //  messages.appendChild(el);




p.sansserif { font-family: Arial, Helvtica, sans-serif; font-size:300%;}




        <p class = "sansserif" id='messages'>Hello</p>



Monday, January 2, 2017

Camera movement and dolly zoom with Chronos high-speed camera

High speed video with Chronos 1.4 camera movement and dolly zoom effect.

Big servo motor:

Small servo motor:

Ball-joint mount:

Chronos high-speed camera:

Slow mo music:  "Dewdrop Fantasy" Kevin MacLeod (
Licensed under Creative Commons: By Attribution 3.0 License