Skip to content
View phorton1's full-sized avatar

Block or report phorton1

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Maximum 250 characters. Please don’t include any personal information such as legal names or email addresses. Markdown is supported. This note will only be visible to you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
phorton1/readme.md

My Github Repos

Home -- vGuitar -- Artisan

This page provides a bit of an overview of my repos here on Github.

This page was last updated on 2026-04-23. As of this writing I have 83 Public Repos on Github.

I write a lot of code and programs. Although the code I write is generally based on my own interests and needs at any given point in time, I generally try to present them as Open Source that others can build and use and perhaps extend or modify according to their own needs and interests.

The code I write is generally in the following program languages and development environments:

  • C/C++ for embedded processors like Arduino, Teensy, and ESP32's using the Arduino IDE 1.8.13
  • C/C++ for machine specific programs and libraries like MS Windows, Linux or running in bare metal on a Raspberry Pi using various specific tool chains, make systems, virtual machines and so on,
  • Perl for programs and services that run on established operating systems like MS Windows (using ActivePerl 5.12 or Strawberry Perl) and Linux (using Raspberry Pi's included Perl)
  • HTML/Javascript for web pages that run in a user's browser that are served by various programs and systems in these repos.
  • Java for specific Android Studio apps I write that run on Android phones
  • Python/Javascript for add-ins or extensions to specific programs I use like Firefox, Komodo Edit, and Fusion 360
  • Batch/Shell Scripts in a variety of languages from Bash (Linux shell script) to Windows CMD language (windows Batch files) or a host of other "languages" including some invented and used within these repositories.

As well as whatever language/application/API I may find that I need in a project to accomplish a particular goal, ranging from programs like Google Earth and openCPN, to APIs to things like GitHub, Google Maps, etc.

So these repos often contain much more than just code. They run the gamut from Pure Programs and Systems that run on MS Windows or Linux that provide services or functionality that I want, to DIY Things that represent finished physical objects in the real world that do things that I want them to do, and everything in-between. Thus these repos tend to include things like Libraries and other shared software as well as other pieces of the puzzle, including Fusion 360 CAD files, Prusa 3D Printing and Lightburn Laser Cutting files, Kicad Schematics and PCB (Printed Circuit Board Designs) as well as significant documentation on how to build, configure, use, troubleshoot, and modify the contents of the repos.

Whew. It's a lot to document. As a rule the documentation lags behind the development as I am constantly starting new projects, writing new code, and making new repos faster than I can document them.

Nonetheless, this readme file attempts to give some coherence to the entirety of my repos on Github.

The repos tend to fall into a number of groups of related projects based on my longer term interests and needs. Roughly they can be grouped into a number of Project Groups that are somehow related:

  • Boat Things - physical devices (things) I make for my boat like the Bilge Pump Alarm, Refrigerator Controller, and so on, that are typically reasonably well documented so that other people can make them as DIY projects.
  • Boat Instruments/Protocols - software and hardware I make that range from actual hardware/firmware devices (things) that exist on the boat like a GPS device or a general purpose Marine Protocol converter/hub, to applications with full User Interfaces that run on my laptop or as web-servers, to major reverse engineering efforts to expose and utilize otherwise undocumented or poorly documented proprietary protocols, particularly from, but not limited to understanding and using historical Raymarine proprietary protocols.
  • CNC Machines - A Series of CNC machines (things) I have designed and built, along with their underlying firmware and libraries as more or less completely documented DIY projects that others can build.
  • Clocks - A series of magnetically driven wooden geared clocks that I designed and implemented as complete DIY things that other people can make.
  • vGuitar systems - guitar foot pedals, loopers, etc culminating in the teensyExpression3 electric guitar synthesizer and effects foot pedal and looper system presented as completely documented DIY things.
  • Artisan - A multi-platform Music Server that I use to organize and play my music library (MP3s) from a local library on a hard-disk or USB memory device on a MS Windows or Raspberry Pi hardware platform that is reasonably documented and could be considered a DIY system.
  • Utilities - that tend to be complete MS Windows applications, sometimes include complete documentation as well a complete released Installer Program that can easily be run on any Windows machine, to not-so-well documented utilities I write for my own purposes. This group includes things like Console (Serial and Telnet Terminal) programs, UI programs to interface with Git (and Github), Remote File management on a variety of platforms, and so on.
  • Add Ins - Add Ins / Extensions that I have written, documented, and published for 3rd party applications including Fusion 360, Komodo Edit, Firefox, and so on.
  • Other Projects like one-off things I make for my own use and/or Arduino/rPi experiments in hardware/software to test a particular component, module, or concept, to specific instances of distinctly not-code-like things, like the plans to make a particular wooden engraving or inlayed wooden box (artsy stuff)

So, yeah, some kind of an overview (this document) is in order.

Architectural Overview Documents

In some cases it is particularly difficult to present to you, the reader, the over-arching concept behind a group of repositories. Typically each repo has its own documentation, but it is not always obvious how they all fit together to create a final product.

Also there are some repos that cross the above Project Group boundaries and are used by more than one class of projects and it can be difficult to discern those patterns from the raw repos themselves.

So, in certain cases, in THIS repo there may be a subpage which describes in more detail the overall architecture of one of the above project groups, or an underlying common sub-group, that would be otherwise difficult for the reader (you) to piece together without a roadmap of some kind.

  • vGuitar - an overview of my vGuitar System
  • Artisan - an overview of my Artisan Music Server system
  • teensyBoat - an overview of the teensyBoat multi-protocol marine instrument system: the Teensy 4.0 firmware, the teensyBoat.pm wxPerl Windows application, and the Arduino Boat Library.

Project Groups

Without further ado, here is the list of Project Groups, and the top level repos within those groups;

  • Boat Things
    • airco.ino - a ESP32 myIOT based monitor for a Webasto FCF 10000btu Marine Air Conditioner along with a controller/monitor/remote for a custom built DIY Water Level Sensor and 12V Condensate Pump as installed on my boat. On this project I reverse engineered the RS485 protocol the Webasto Controller Box and the Remote Control Panel to be able to monitor the state of the Air Conditioner remotely.
    • bilgeAlarm.ino - a ESP32 myIOT based Bilge Pump Alarm and remote monitor/controller as used on my boat.
    • fridgeController.ino - a ESP32 myIOT based controller/remote/monitor for Danfoss BD50 and related Refrigerator Compressors as used on my boat.
    • lightController.ino - a ESP32 myIOT based remote controller for various lights (Anchor, Deck, etc), as installed on my boat as part of its completely custom designed and re-implemented DC Electrical Panel.
    • tempController.ino a ESP32 myIOT based general purpose, controller/remote/monitor for temperature sensing and controlling a 12V fan that I use in the Inverter Compartment on my boat to aid in cooling the 2000W Inverter/Charger.
  • Fans a series of custom designed and 3D Printed 12V Brushless Fans in use on my boat:
    • fan1.ino - initial Arduino Nano Brushless Motor PWM controller and 3D printed fan design
    • Fan Designs (TBD) - Subsequent refined and more robust 3D printed fan designs that I am currently using.
  • Boat Instruments
    • teensyBoat.ino and teensyBoat.pm - A do-everything multi-protocol, multi-port, based general purpose device consisting of a teensy4.0 Arduino INO program with Firmware, Schematics, PCB Designs, and 3D Printed enclosure for NMEA2000, NMEA0183, and Seatalk1 protocols, largely encapsulated in my Arduino Boat Library along with a Serial Console and Windowed (wxPerl based) UI application that runs on my laptop.
      • The device is used on my boat to bridge Instruments and Displays using various protocols together and to allow me to monitor the state of the boat, and in certain cases, to control those Instruments and Displays as I see fit.
      • Also functions as a complete desktop testing device and UI to allow me to test and drive various Instruments and Chartplotters over any of the protocols, and includes a sophisticated physical boat simulator and nine instrument simulators that work across all three protocols that allow me to drive a virtual boat around manually or by simulated autopilot with realistic instrument outputs for all the virtual instruments.
      • Finally, it also presents the GP8 generalized hardware interface (to other circuits in other repos) that allow me to test a variety of Raymarine Instruments, specifically ST50/60 Speed/Log and Wind Instruments, by driving their sensors inputs to be able to test those devices on my desktop in the absence of their "real" transducers.
    • tbESP32.ino - a ESP32 myIOT based device that plugs into teensyBoat's GP8 plug that uses TCP/IP and UDP protocols to allow for monitoring of the teensyBoat device on my boat via Wifi, including allowing the teensyBoat.pm program to be used remotely.
    • teensyGPS.ino - a Marine Grade, teensy4.0/Neo6M based GPS device based on my Arduino Boat Library that can transmit NMEA2000 and/or Seatalk1, that includes the Firmware, Schematics, and soon-to-be 3D printing information and documentation as a complete DIY project. Will soon be installed on my boat as the primary GPS device.
    • teensyWind.ino - interfaces directly to an ST50/ST60 Wind Vane (the Wind Transducer on the top of a mast) to allow me to (a) test the Wind Vane on my desk, but that also (b) resolves the Vane's sensor outputs into the apparent wind angle, and thus (c) could, in the future, provide a complete replacement for Raymarine ST50/ST60 and even more recent Wind Instruments and interfaces.
    • raymarine - This repo documents the results of a systematic reverse-engineering effort targeting Raymarine's proprietary SeatalkHS ethernet protocols and FSH file format, and includes working Perl implementations of both. It is believed to be the most complete structured technical record of these protocols available anywhere. It is also the foundation for navMate, a planned desktop application for lifelong, device-independent navigation data management for mariners.
      • NET - This folder contains the world's first comprehensive reverse engineering and documentation effort regarding Raymarine's SeatalkHS ethernet protocols.
        • shark.pm - this program is used to probe, expose, and utilize the ethernet protocol(s). It uses Wireshark to sniff and analyze TCP/UDP traffic which it then formally encapsulates into several sub-protocols that I reverse engineered and understand and have named as follows.
          • RAYDP - the Multicast UDP device and discovery protocol within Seatalk HS
          • FILESYS - a UDP protocol that gives read-only access to the CF card in an E80 (E120 and potentially other) Raymarine MFDs (Chartplotters)
          • DB - a set of TCP and UDP protocols where the E80/E120 Database can be queried, and/or by which E80/E120 blasts database (navigation) information over UDP
          • WPMGR - a TCP protocol that allows for the reading, and importantly, writing, of Waypoints, Groups(Folders), and Routes to/from the E80/E120.
          • TRACK - a TCP protocol that allows for control (starting, stopping, saving, and renaming) of tracks on the E80/E120 as well as an important ability to download them over ethernet to my laptop for further processing.
      • FSH - This folder, initially based on parseFSH provides updated, perhaps crucial, information regarding the FSH file structure used by E80/E120 Chartplotters to store Waypoint, Group(Folder), Route, and Track information on the CF card (which can now be gotten with Ethernet directly from the Chartplotter using shark.pm above). This repo (and the shark.pm program above) are the first I know of in the world to write FSH files accurately.
        • fshConvert.pm - converts an FSH file to KML, GPX, or CSV formats
        • kmlToFSH.pm - reads a KML (Google Earth) file and writes an FSH file
      • CSV This folder contains a single utility program I have used that converts a Google Earth KML File into a Raymarine Raytech RNS compatible CSV file for input into a Raymarine based system.
        • kmlToCSV.pm
      • NMEA_Monitor.ino - vestigial General Purpose NMEA2000 monitor based on an ESP32 and a MCP2515 CANBUS Module that has been superseded by the teensyBoat PCB.
      • NMEA_Sensor.ino - vestigial simulated Instrument using an ESP32 and a MCP2515 CANBUS Module that has been superseded by the teensyBoat PCB.
      • Seatalk.ino - vestigial early program to read and write Seatalk1 using an opto-isolator interface that I developed that is now part of the teensyBoat PCB
      • navMate - a planned desktop application (wxPerl/Leaflet/SQLite) for lifelong, device-independent navigation data management — waypoints, routes, groups, and tracks — across multiple boats, multiple chartplotters, and a mariner's entire career. Built on the RAYNET protocol library above. Pre-implementation; architecture documented.
  • CNC Machines - a series of CNC machines, their firmware, design, 3D printing information, and supporting documentation that I have created based on my fork of the FluidNC Library and my extensions to it:
    • vMachine.ino - the first "cnc" machine I created that provides a port of the Maslow CNC Machine kinematics to make a pen-plotter using two stepper motors.
    • cnc3018.ino - the second cnc machine I created that I now use primarily to mill my own PCB (Printed Circuit Boards) that (a) milled ITS OWN PCB lol, and (b) which I used to create parts for the subsequent cnc20mm below. Most of the PCB designs that I present on other pages are milled on this machine.
    • cnc20mm.ino - a large CNC machine that I designed and created that can work on pieces up to 50x50 inches, allowing a complete 4x8 foot sheet to be worked on by doing it in two 4x4 foot halves, that currently sports a 500W 100V DC spindle for machining and a 30W optical power laser that is capable of cutting through up to 1/2" of plywood.
  • Clocks - The series of magnetically driven wooden geared clocks that I designed and implemented as complete DIY things, including the Architectures, Build Process, the Fusion 360 CAD files behind the overall clocks, the Lightburn files I used to laser cut the wooden parts on my cnc20mm machine, and the Prusa configuration and gcode files I used to 3D Print the plastic, along with the Kicad Schematics and PCB Designs that used to mill the PCBs on my cnc3018 machine, as well as additional End User documents on Maintaining and Tuning the clocks for people who might receive one of these DIY projects as a gift from another person. These clocks make use of my ESP32 myIOT library to provide a Web Based configuration and monitoring UI.
    • theClock.ino - the first clock I made. I made two of these and gave one away as a gift.
    • theClock3.ino - the next two iterations of the clock design. I have made four of the v3 clocks and given several away as gifts.
    • coilWinder.ino - a quick and dirty coil winding machine I made using laser-cut plywood and a stepper motor and a simple Arduino-Nano based control program, that I used to wind the electromagnet coils for the clocks.
  • vGuitar System
    • TE3.ino - the current, final generation of the evolution of the vGuitar system. It is beyond the scope of this outline to present the details and dependencies, but it is worth noting that there is a fairly comprehensive documentation page available separate from the repo, as well as a separate vGuitar System Overview document available within THIS repository regarding the overall system.
    • teensyExpression.ino - vestigial - the initial teensyExpression foot pedal part of the vGuitar system that received a bit of note on Hackaday.
    • teensyExpression2.ino - vestigial - A second generation instance of the foot pedal part of the vGuitar system.
    • circle - my fork of the circle Raspberry PI bare metal C++ system/library and my extensions to it that are both still used in the most current and final version (TE3) of the vGuitar system.
    • the bare metal based Looper that is still used in the most current and final version (TE3) of the vGuitar system.
  • Artisan - Please see the Overview Document for more information about my Artisan Music (MP3) Server
  • Utilities
    • buddy.pm and fileClient.pm - A Putty-like Serial and Telnet terminal Console Program, with additional File Transfer capabilities (for TE3 and other programs I've written) that can be run from its Perl source, but is also released as an installable MS Windows Application and that plays well with the Arduino Development Environment (to close the COM port when an Arduino build is in process).
    • gitMUI.pm - a replacement for the gitUI User Interface provided with most installations of Git that I use almost every day to update GitHub from my local repos. As opposed to the standard UI, my gitMUI program allows one to
      • commit, push, and pull multiple repos simultaneously
      • instantanously see any changed files (diffs) or uncommitted changes as soon as files are written to disk (saved from an editor) without needing to "rescan" repos each time you make changes
      • provides a process to manage and normalize submodules (code that is explicitly shared and included in more than one repo) without confusing and onerous jumping through hoops.
    • myIOTServer.pm - A service that works with my ESP32 myIOT library to aggregate and forward myIOT devices to a HTTPS (encrypted, protected) Machine on the internet at large so that I can access myIOT devices from anywhere on the planet.
  • Add Ins and extensions
    • My Fusion 360 prhParams Add In that allows me to work with, sort, comment, and modify the parameters that drive a Fusion 360 design.
    • My Fusion 360 pyJoints Add In that allows me to animate designs in ways that normally don't work in Fusion 360 so as to better judge the performance of mechanical designs. Used extensively in theClock3's design process.
  • Other Projects
    • wireStripper32.ino - a thing I made, based on my ESP32 myIOT library to provide a UI, with complete Fusion 360 Designs, 3D printing information, Schematics and PCB designs, to cut and strip 22ga wires for use on breadboards and on the many one sided PCBs that I make for these projects. It uses a typical RC Servo and commonly available inexpensive wire stripper, along with an extruder from a 3D printer and some Infrared sensors to automate this otherwise tedious process.
    • useless.ino - An Arduino Nano based Useless Box that I designed and implemented, that kids find really fun, and of which I have built 4 units, giving 3 away as gifts (or even selling one!).
    • ws2812bSwitchArray1 - a proof of concept project that shows how to 3D Print and attach these Buttons I designed to a ws2812B array (or light strip) and use the signals to the LEDs to drive an array of buttons using only a single wire (instead of the typical array of row and column wires arranged in a grid).

Popular repositories Loading

  1. Arduino-teensyExpression Arduino-teensyExpression Public

    A teensy3.6 based MIDI controller that accepts 4 expression pedals, and has a 5x5 button array with addressable LEDs, four rotary controllers, a USB host port, and a 3.5" touchscreen.

    C++ 30 1

  2. Arduino-cnc-cnc3018 Arduino-cnc-cnc3018 Public

    A FluidNC based implementation of a controller for a cheap cnc3028 machine

    C++ 12 1

  3. Arduino-libraries-FluidNC_UI Arduino-libraries-FluidNC_UI Public

    A minimal UI for machines built using the FluidNC library

    C 9 1

  4. circle-prh circle-prh Public

    my additions to circle (circle-squared)

    C++ 7 1

  5. circle-prh-apps-Looper circle-prh-apps-Looper Public

    an implementation of a 4 channel audio Looper for use in live looping, running in "bare metal" on an rPi, based on my fork of Circle and modifications to it

    G-code 5

  6. Arduino-libraries-FluidNC_Extensions Arduino-libraries-FluidNC_Extensions Public

    Functional addtions to FluidNC

    C++ 5