I – Iguana

4/25/2022 – 5/8/2022

Noise Toaster Demo Video: https://youtube.com/shorts/SvXzWK2Lwkw?feature=share

Summary: Lots of pretty pictures. Last time it was mostly text and a few pictures. This time it’s the opposite. Very productive two weeks. Learned about OOP. Then I repaired the 3D Printer from its continuously broken state long enough to produce some new best prints. Then I used it to design and print the housing for the Synth. Put together the front panel for the synth, and then buttoned the whole thing together and now the first synth is in business. Some redesigns to be had there, but huge milestone. The Prusa printer also showed up and that thing literally took me 2 days and around 15 hours to build. After spending about 2 months trying to get the other printer to work, I found myself appreciating all the little design decisions in the i3 MK3S+. It also works better and faster than anything I could squeeze out of the other one. It is retired now. Well worth the $800.

The synth panel design and the body it slots into both have issues. First, I want to embed the text into the print so I don’t have to use a label maker, because it’s ugly. Second, there’s no way to get into the case from the back to switch out a battery or fix a broken connection. I also forgot to add a slot for a power switch in the side of the case. The front panel itself is fine, but getting multicolor text will be a new task. I’ve been wanting two-tone embedded text for a while now though, so it’ll be worth the effort.

Felt out the prusa printer and the prusa slicer and came up with a new 3D printer setup that involves my laptop and a USB cable so I don’t have to run back and forth between my desk and my closet, crouch down on the floor, and hope the printer works. And hope the static electricity my chair produces doesn’t fry the SD card, either requiring a formatting or a new SD card… Or hope the printer doesn’t just stop working overnight and require a Z calibration that takes 2 hours. The prusa fixes literally all of these problems. The old printer did work better with a gluestick and the exposed glass bed though. I’m a big fan of bed adhesives now.

Next two weeks I’ll redesign the synth case, learn some new tricks on my new printer, and put together another Synth and start handing them out. Then it’s back to Breadnet and some C++/AoE work.

Iguana

  

  Iguana Mode

    3D Printer

      Still waiting on the Prusa printer

        Delivery date confirmed for Friday, May 6

        Showed up and built it. Took 2 days but its amazing

        honestly, the printer and the documentation are so high quality, it was a ton of fun putting together & got to appreciate a lot of little design decisions they made. the hardest part was fitting washers into tiny, breakable 3D printed parts that make up like half the printer. if you use too much force you can crack the part and then you have to get another printer to print a new one to keep building the other printer… but that wasn’t a huge issue. It works better than anything i’ve ever worked with out the box

      I guess I’ll have to name the printers soon to differentiate between them

      Bought a THIRD PEI SHEET, some bed clips, and some bed adhesive so I can see if it works better for me. Feeling like, I don’t want to just let this printer go away. But I did let it just rot for a month. It’s easy to get fed up with 3d printing

      If the printer works better than before, I might buy another noctua fan or two to get it to actually be quiet. That’ll require printing a new, different type of fan shroud that doesn’t use a centrifugal fan for part cooling. I’ve seen a few designs that use double axial fans

      New Upgrades

        If I decide to order another noctua fan and reprint the fan shroud, I’ll have to retune the Z Axis Offset and definitely redo the firmware with a new PID tune

        The first thing I should probably do is enclose the LCD, SD Card slot, and Motherboard in a more permanent way, because the interface to the printer as it is now is hot garbo

        and the USB slot can’t even be meaningfully accessed

        I might have to mutilate the frame a little bit

        I should also go buy a second paving stone I think, or at least a larger one

        Even just one inch larger on the square would be sufficient. It’s exactly the wrong size for this

        I don’t think it’s worthwhile to replace the PSU fan with a noctua, but it’s something I think about a lot

        Designing an enclosure for the mobo, lcd, and sd slot seems like a bit of a hassle

      New Calibration

        Removed PEI Sheet

        Z Axis Calibration: Borosilicate Glass Bed, No PEI, Textured Surface

          Current Ranking

            1

            -2.987

            2

            -3.000

            3

            -2.975

          Z Axis Offset: -2.70

            Some wobble on filament drop, so the probe needs to be lowered a bit

            Print head is too high, lines are bad

          Z Axis Offset: -2.75

            No apparent wobble, lines are slightly better, still too high

            Needs more Smush

          Z Axis Offset: -2.80

            Technically -2.801, for some reason you can only to 801 or 799

            Lines are much better for first layer filling, but experiencing some line interference as the print head lifts up older outlines. 

            Maybe this can be solved with the gluestick?

            Thankfully I’m not experiencing the firmware heat crash when i run a print cycle twice on one boot anymore… That was a pain

            Knock on wood

          Z Axis Offset: -2.85

            Getting closer…

            Infill looks better, still not Smushing though so each trace can flutter

            Slight outline interference

            Print adhesion generally seems pretty good on the textured surface of the BSG 

          Z Axis Offset: -2.90

            First config that is viable

            No outline interference

            Outline traces are smushing effectively

            some smushing on infill, but seems like it could be improved

            New reference point

          Z Axis Offset: -2.925

            Slowing the increment down

            Good outlining and good smush on outline

            infill lines are smushing very well now. Still some room for improvement. It seems worthwhile to overshoot from here and then dial it back.

            This is a better reference point

          Z Axis Offset: -2.950

            This one is the best so far by far

            Perfect smushing on outlines and on infill, no outline interference

            Bed adhesion significantly increased, partially due to infill smushing and outline smushing meeting

          Z Axis Offset: -2.975

            Might Overshoot it a little

            Some outline interference on one small corner, otherwise fine

            Infill looks well smushed

            Smushing is more thorough than -2.950 without spreading

            Surface sheet is SIGNIFICANTLY STRONGER than -2.950 as well. New standard

          Z Axis Offset: -3.000

            Very close in quality to -2.975, but the bed-side texture is perfectly smooth to the texture. It feels very satisfying.

            There is some ghosting in the outline traces, so I think -3.000 might be a little too far.

            There was also some biting into the same corner

            I suspect there’s an issue with the tightness in the vRollers and that specific turn causes the print head to rock

            Turning back to -2.987 now

          Z Axis Offset: -2.987

            Final

            The toughest, the smoothest

            Celeste and Angel reviewed and confirmed this chart

              Current Ranking

                1

                -2.987

                2

                -3.000

                3

                -2.975

        Adhesive Testing

          I’ve got a gluestick, and I also started using bed clips.

          So I can test both sides of the glass if I want, but I should probably re-level if I flip it

          I mainly want to be able to print the manticore and skullcup without issue. I usually experience a lot of lifting, cornering/biting, and outline interference because of the complex pattern on the base of the print

          With the Z Axis Offset calibrated to -2.9875, let’s see how precision prints come out

          Print Tests

            Test 1

              

                Manticore

                BSG Textured

                -2.9875

                No Adhesive

              Some ghosting due to the print head being low, but only in certain regions of the print bed, which makes me think I need to level it again.

              No outline interference, which is looking good

              Circular infill lines came out great

              Outline fidelity is very high. not much flow in the filament after drop or on second pass

              It passed the foot test! I’m thinking I don’t have much to worry about with this new config. We’ll see

              Let it ran for an hour. It did not spaghetti and came out great so far

              Some heavy stringing in areas, so some more config seems necessary, but so far so good

            Test 2

              

                Manticore

                BSG Textured

                -2.9875

                Glue Stick ~3 pass

              Same quality of outline but with less outline interference, which was already minimal

              The main issue with this setup will be retrieving the parts. I’m kind of hoping the gluestick will make it easier to retrieve prints by adding a material buffer between the filament and glass, while also improving first layer adhesion

              Testing skull next, aborting this early

            Test 3

              

                Skullcup (100%)

                BSG Textured

                -2.9875

                Glue Stick ~3 pass

              Glue stick results in phenomenal first layer adhesion + resistance to outline interference.

              The skull is at 100% (tiny) and the gridlines were constructed perfectly and without incident

              like literally no blemishes. I’m really impressed

              Not sure how this will hold up over time but for now it’s baller

              Hoping retrieval is easier because of the gluestick

              Retrieval was easy, grid came out fantastic

              Some stringing issues, I’ll have to do some more calibration tests again before I put it back

              It feels kind of silly doing the same runthrough of all this work over again for like the 4th time but its faster now and I know what I’m doing so

      You know what’s stupid

        The next day, the Z Offset was all wrong, and the print head was far too low

        after recalibrating it entirely, with the application of the new adhesive, the new best Z-Probe Offset is

          -2.787

        Super annoying

      Printer 1 is still working great after putting it on the tile in the closet. I definitely need a new tile though because it barely fits and it’s annoying.

      I also noticed that if I let the print bed cool off completely before extracting the part, the print pops off effortlessly. The special adhesive (not the gluestick) actually works very well

      Since this works now, I can move on to the Synth Panel

    Breadnet

      Pi ip got changed somehow, now 10.0.0.15 from 10.0.0.25

      MQTT Server: 10.0.0.15:1616

      Node-RED Server: 10.0.0.15:1880

      Can’t get WiFi.h to interface with PubSubClient.h

      WiFi and MQTT clients both initialize independently, but MQTT won’t accept the WiFi client instance and thinks it’s offline. returns an error claiming the host is unreachable

      FINALLY GOT IT

        https://www.survivingwithandroid.com/esp32-mqtt-client-publish-and-subscribe/

        MQTT and WiFi work now. Meaning the ESP32 can listen into the MQTT topic and print the topic messages over serial.

        The Node-RED and MQTT aren’t externally facing yet, so that’s next

        Once I get the port forwarding working, I’ll look into security and then a DNS

      Port Forwarding

        I set up the port forward for Node-RED and MQTT but the ports still return closed

        I found a useful website for checking Ports

        External IP

          75.38.106.136

        Port Checker

          https://portchecker.co/

        Router Login

          10.0.0.1

          admin

          supervolcano55

        Services

          Node-RED

          10.0.0.15

          1880

          MQTT

          10.0.0.15

          1616

          Minecraft

          10.0.0.2

          25565

      To Do List

        MQTT

          Confirm unprotected external network connection pubsub

          Configure for privacy, user auth, SSL

            MQTT Security Fundamentals

              https://www.hivemq.com/blog/mqtt-security-fundamentals-securing-mqtt-systems/

              https://bedrockautomation.com/securing-mqtt-absolutely-positively/

            Securing a MQTT Server

              https://dzone.com/articles/mqtt-security-securing-a-mosquitto-server

        Node-RED

          Confirm unprotected external network connection pubsub

          Configure for privacy, user auth, SSL

            Securing Node-RED

              https://nodered.org/docs/user-guide/runtime/securing-node-red

            Reddit Posts

              Reddit post

                Port forwarding is really the simplest way, and there are guidea available (including on NodeRed.org) for doing it more safely. You can secure your editor with username and password, disable terminal control of Node Red, etc., so that it becomes safer.

                However, even if you set that up, if you have a dynamic public IP address, it’ll eventually change and you’ll need to change the links you have on your phone or in your browser off-site.

                One way to work on this would be reverse proxy, which lets you assign a friendlier-looking address to your IP address and then change it, even pretty quickly. An even simpler way would be to just have a redirect html file somewhere on any website you own/manage, and have your Pi upload a new redirect html via FTP anytime it detects a change to its public IP.

                However, these more public methods are going to come with added probing by malicious bots, so you should probably have made all the security changes you can before you do that.

                Finally, IBM’s cloud offers free Node Red instances. It’s very difficult to get one set up and running if you don’t work in their cloud architecture every day (I just did this the other day). But, it can be done, and you could create a replica of your dashboard there, or actually build it there. The problem is that you’re still subject to the IP address change and port forwarding thing there, unless you can figure out how the hell a mere mortal can connect an MQTT broker to the instance through their cloud. Otherwise, you’re back to hosting the MQTT broker on your Pi, and back to port forwards, passwords, SSL, etc. etc.

              Reddit Post

                Set up a VPN, much safer option and should give you what you need.

                This. Note he means a vpn into your home, not out. I use a home vpn and dynamic dns to access home LAN resources anywhere.

              Reddit Post

                Yes you can, however as others said it depends on the risk you willing to take, exposing ANYTHING to the Internet has some risk, so up to you. If you do decide to do it, here are a few tips

                Do not use the default port for Nodered, use some random one

                in your router fwd that port to your nodered machine

                then from outside your house, all you need to do is http://YOUR_EXTERNAL_IP:PORT/ui

                I strongly recommend you setup SSL

                I strongly recommend you setup User/Pass for your dashboard

                Is there still a risk sure, but you at least tried to block some of them.

                Good luck.

          Design basic UI page to reflect current states

        ESP32

          Set up a small breadboard with LED assigned to subscribed topic

          Research connection hardening for ESP32

            Breakdown of ESP32 Security Features

              https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/wifi-security.html

              https://blog.espressif.com/understanding-esp32s-security-features-14483e465724

              https://blog.espressif.com/esp32-tls-transport-layer-security-and-iot-devices-3ac93511f6d8

          Experiment with OTA updates

            https://randomnerdtutorials.com/esp32-ota-over-the-air-arduino/

        VSCode

          Take some notes on how to manage github repo and PIO projects

        PlatformIO

          Create a Repo that contains multiple PIO projects

          Create PIO projects for the following functions in isolation

            ESP32 Blink

            ESP32 WiFi.h Connection

            ESP32 PubSubClient.h Connection

            ESP32 WiFi+PubSubClient Connection

            ESP32 Breadnet LED

            ESP32 Mega Lights 2 Test

            ESP32 Mega Lights 2 Final (own repo)

    Object Oriented Programming

      Object-oriented Programming in 7 Minutes | Mosh

        https://youtu.be/pTB0EiLXUC8

        OOP implementations of the same code ends up with functions with less or no parameters. 

        The four pillars of OOP

          Encapsulation

          Reduce Complexity, Increase Reusability

          Abstraction

          Reduce Complexity, Isolate impact of changes

          Inheritance

          Eliminate redundant code

          Polymorphism

          Refactor Ugly Switch Case Statements

        Before OOP, we had Procedural Programming

          A set of functions

          A set of data

          Functions operate on the data

          You end up with a bunch of functions that are all over the place

          You copy and paste them all over

          They become an interdependent mess of spaghetti code

        OOP solves this

          combine a group of related functions and variables

          Call that group an OBJECT

          refer to the variables as PROPERTIES

          refer to the functions as METHODS

        ENCAPSULATION – Lumping variables and functions together into objects

          The best functions have no parameters!

        ABSTRACTION – hiding some of the properties and methods from the interface of the object

          Makes it easier to understand, simpler interface

          Reduces the impact of changing the “PRIVATE” Methods

          If you make changes to the private methods, they won’t influence the external-facing object interface

        INHERITANCE – A mechanism to eliminate redundant code

          define parameters once in a generic object, and then have other instances of the object inherit those parameters. 

          this saves lines of code because you don’t have to declare the same properties multiple times

        POLYMORPHISM – multiple forms

          A function can behave differently depending on the type of object we are referencing

          Polymorphism is a method to eliminate branching if-else and switch statements

          You can have an element.render() function that can be used on multiple different types of objects

      Intro to Object Oriented Programming – Crash Course

        https://youtu.be/SiBw7os-_zI

        In order to understand Object Oriented Programming, you have to understand Objects

        To understand Objects, you need to understand Primitive Data Types

        Primitive Data Types

          Byte

          Int

          Float

          Bool

          Double

          Char

        These primitives were fine when programming was small and simple.

        Programmers began to group variables of similar types together

        If you were simulating a chess piece, like a knight, you would need

          Position Data

          Team Bool

          Captured Bool

        You would need a group of data like this for every single piece

        You might also want a group for both knights, since they’re similar

        You might also want a group for the entire white side, since they’re similar in behavior

        Grouping related variables together is necessary in complex programs

        This is where the structure aka struct comes in

        A structure is like an Array

          Stores many pieces of data

          Structures can store data of different types together

          Arrays can only hold all ints or all strings

          A Struct can hold multiple data types, including other structures

          Nested Structures

          Example

            struct Knight

              Position

              Color

              Captured

            struct Knights

              Knight 1

                struct Knight

                  Position

                  Color

                  Captured

              Knight 2

              Knight 3

              Knight 4

            struct whiteKnights

              Knight 1

              Knight 3

          The struct was the precursor to the Object

          Functions could not be defined within a structure. Objects fixed this. This was the main issue. Structures could only reference functions, not define them

          What is an Object? What is a Class? – Circular Definition

            Objects are instances of a Class

            A Class is a template for an Object

          Defining the Knight Class

            define move()

              takes the knight’s position and returns the available moves for the knight

            define position variable

            define color variable

            but DON’T INITIALIZE THEM

            Because each instance of the knight will obviously have different data

            So don’t pre-define it with a default value. Specify that value when you instantiate the class into an object

          It is better to define the move function in the class, rather than in each instance of the object

          When creating an object, you initalize its ATTRIBUTES aka variables and its METHODS aka functions, to contain info specific to that specific knight

          A Knight Class defines any given knight

          A Knight Object represents only one singular knight

          OOP is the best tool we have right now to create complex programs by grouping data and functions

          Four Main Principles

            Encapsulation

              bundling data and methods that can operate on that data within a class

              Hide data within a class. Anything outside that class cannot directly interact with it

              Members with other classes can only interact with the knight class’ data through the knight class’ pre-defined methods

              The class METHODS define the ways its data can be manipulated, either internally or externally

              There are GETTING and SETTING methods

                GETTING – retrieving values

                SETTING – defining values

              ex

                piece.getColor()

                  Checks the color of any given piece from anywhere in the program

                  You don’t have to access the internal attributes of the piece getting checked

              This makes it easier to keep track of attribute dependencies

                Player.maxHealth

                Player.currentHealth

                Player.levelUp()

                

                Setting Method: If Max Health Goes Up, Set Current Health to Max Health

                Setting Method: check if current health would be above max health. if so, set current health equal to max health instead. 

                Stuff like this defines the functional boundaries of an attribute

              Some attributes can be READ ONLY, meaning you would only define GETTING methods

              No SETTING methods. It’s predefined?

              Defining SETTING methods instead of updating values directly means you can add boundary checks. Like making sure the knight doesn’t move off the board

              Without boundary checks, you can create illegal moves

              GETTING methods with Validation can be very useful

              It’s best to not allow external classes directly edit an object’s attributes

              Each piece of code should not have access or dependencies on other sections of code

              Keep them, independent

              Encapsulation lets the programmer keep control over access to data, and prevents the program from ending up in strange or unwanted states

            Abstraction

              Abstraction refers to showing only essential details, and hiding everything else

              You don’t need to understand everything under the hood to know how to drive a car

              You just need to know how to handle the stick, pedals, and wheel

              Users of your classes need not worry about all the fine details of how your classes work

              Classes should not directly interact with other classes’ data.

              Instead, use the target class’ methods in order to access its data

              This helps you to work on programs incrementally. You can work on one class at a time and manage the project that way

              Multiple programmers tend to work on a single program. OOP helps this reality because your section of the code can function completely independently of the rest of the system

              Start to think in terms of INTERFACE and IMPLEMENTATION

              Interface – methods that define access to data that other classes can use

              Implementation – of these methods, and how they’re coded. These should be hidden.

              If you have a knight piece and a king piece, you want some interface to let the two objects interact

              The knight can’t move when the king’s in check

                Let the knight use the King’s GETTER METHOD (INTERFACE)

                The knight class retrieves information. If the king is in check, the knight cannot move unless to dispel the check.

                The knight class is not concerned with how the king determines that it is in check. It just accesses that data and that data’s fidelity is the responsibility of the king class.

                That is abstraction

              If the knight has to look INTO the king class to make a determination, then it’s dependent on the king class

                If the king class changes names, organization, etc. The knight will get corrupted

              If classes are entangled, then one change can create a ripple effect throughout the program

              Creating good interfaces ensures that each piece can be individually and independently developed

              Abstraction allows the program to be worked on incrementally, prevents entanglement, and reduces complexity

              It also lets the user predetermine specific points of contact (INTERFACE) and then worry separately about the implementation of the class

            Inheritance

              Allows you to derive classes from other classes

              Inherit methods and attributes from another class

              Game

                class Weapon

                contains methods and attributes common to all weapons in the game

                such as

                  Weapon.damage

                  Weapon.attack()

                More classes for specific weapons

                  class Sword

                    weapon.damageType = “sharp”

                  class Club

                    weapon.damageType = “blunt”

                The Weapon class is the SUPERCLASS

                the sword and club classes are SUBCLASSES

                SUBCLASSES inherit attributes and methods from the SUPERCLASS

                Class hierarchy can be extremely large

                The Weapons class can be a subclass of a broader Item SUPERCLASS

                And also unique types of swords can be their own type of class

                CLASS STRUCTURE

                  class ITEM

                    class TOOL

                    class WEAPON

                      class SWORD

                        class FIRESWORD

                        class ICESWORD

                      class CLUB

                Access Modifiers – Change which classes have access to other classes, methods, attributes

                Three main access modifiers

                  public

                    can be accessed from anywhere in your program

                    anywhere both inside and outside the class hierarchy

                  private

                    can only be accessed from within the SAME CLASS that the member is defined

                    best if the info does not need to be accessed from anywhere else in the program

                    Lets you create private members of the same name in different locations

                    A private member defined in the Fruit Class can only be accessed by another Fruit Class Object

                  protected

                    can be accessed from within the class it is defined in, as well as any SUBCLASSES

                    Private to the hierarchy

                    A protected fruit class object can be accessed by fruit subclasses such as APPLE and ORANGE

            Polymorphism

              methods that can take on multiple forms

              two types

                dynamic polymorphism

                  occurs during runtime

                  when a method signature is in both a subclass and a superclass

                  the methods share the same name but have different implementations

                  the implementation of the subclass overrides that of the superclass, because subclasses are more specific(?)

                  ex

                    class Car

                      .drive(miles)

                        {Car.gas -+ 0.04*miles}

                      class sportsCar

                        .drive(miles)

                          {Car.gas -= 0.02*miles}

                    >mySportsCar.drive()

                      will override the superclass Car.drive() function

                      But only if you specifically are using an instance of the sportscar class

                    “dynamic polymorphism is when methods share the name name but have different implementations at a superclass and subclass level, and the subclass implementation overrides”

                    i hate this geek speak

                    it’s just like, you made the class more specific and and the function also more specific

                    the form of the method is decided based on where in the class hierarchy it is called

                static polymorphism

                  occurs during compile-time rather than during runtime

                  refers to when multiple methods have the same name, but have different arguments, and are defined in the SAME class

                  Ways to differentiate between methods of the same name:

                    Different number of parameters

                    Different types of parameters

                    Different order of parameters

                  Known as METHOD OVERLOADING

                  they have the same name but different method signatures due to their different arguments

                  ex

                    class Car, has three different drive methods

                      1

                      .drive(int spd, string dest)

                      2

                      .drive(int spd, int dist)

                      3

                      .drive(string dest, int spd)

                    if I call 

                      myCar.drive(45, “work”)

                      then it will fetch drive method 1, because the arguments match that

                      

                      myCar.drive(15, 60)

                      fetches drive method 2, because the arguments match that

                    when implementing method overloading, the methods tend to have different implementations and achieve similar, but slightly different effects/outputs

                    if two methods always achieved the same result, there would be no need to have two of them

                    if you can’t keep the methods straight based on their arguments, you will get in trouble

                    If you pass the incorrect arguments, you won’t get an error, but you’ll use the wrong method, which can create issues down the line

                    polymorphism allows methods to take on many different forms

                    make sure you’re calling the right method

    Synth Panel

      R2 Print 

        Took 5h30m and hours of repairing the printer before it came out, but the pots fit into it pretty well. Time to button everything up for the first time and see how it looks

        Fit everything into the panel just fine and bolted it down. I had a wire break but it was easy to solder back together.

        Hot glued the button into place, and now everything’s where it should be

        I was having an issue getting the switches to tight and aligned, so I think I’ll just wait until the body is done so I can get a better grip on it

        I need to check for a good power switch, I don’t really want to loot breadbox but I might be inclined to

        I’m thinking on the top surface of the case, there will be a hole for the power switch, and then a speaker perforation. Then the speaker can just go into the top and that’s where the sound will come out

        The back will need a removable slot for a 9V battery

      SYNTH PANEL R2 LAYOUT

        F

        X

        8

        0

        B

        C

        7

        1

        E

        D

        5

        2

        9

        6

        4

        3

      Horizontally Mirrored Layout

        0

        8

        X

        F

        1

        7

        C

        B

        2

        5

        D

        E

        3

        4

        6

        9

      SYNTH PANEL REFDES TABLE

        Panel Label

        REFDES

        Code

        LFO FREQ

        RV4

        0

        VCO FREQ

        RV1

        1

        AREG MOD

        RV3

        2

        LFO MOD

        RV2

        3

        RESONANCE

        RV9

        4

        CUTOFF

        RV6

        5

        VCF MOD

        RV5

        6

        ATTACK

        RV7

        7

        RELEASE

        RV8

        8

        

        

        

        POWER

        SW1

        A

        LFO-1

        SW3

        B

        LFO-2

        SW4

        C

        VCF SRC

        SW6

        D

        VCF SEL

        SW5

        E

        AREG MAN

        SW7

        F

        

        

        

        AREG PUSH

        SW8A

        X

        

        

        

        AREG SEL

        SW2

        N/A

      Notes

        I printed out the old synth panel design I came up with previously.

        The 7mm and 6mm holes I put for the knobs and switches respectively don’t have any functional difference. You can tell visually if you look closely, but both threads fit into both holes so what’s the point.

        I can already tell that the panel surface needs to be a lot bigger though, otherwise this thing will be painfully cramped, and end up being less convenient to use anyway

        Labeling all the pots, they screw in just fine

        Turns out the pots have this little orientation tab that I have to account for. That’s kind of a pain and increases the complexity of the panel design by a lot

        I’ll have to create a rectangular recesssion offset for each pot

        switches bolt on just perfect

        Turns out the underwater effect is cutoff freq

        My headass forgot to model a hole for the LFO freq adjust, so now i REALLY have to redesign this thing

        Looks like I constrained both circles to 7mm. So I’m just tripping on the visual difference

        Either way, both pots and knobs seem to fit just fine if I bypass the metal tab by screwing on a second washer before inserting the knob. That means two washers per pot. Is it worth it? Probably. I can see those tabs becoming a headache on their own pretty quickly. I’ll still give them a quick try though

        

        Since I have 17 UI ports, I’m thinking of putting the power port in the top side of the box and not in the panel, and then doing a 4×4 square grid for the other 16 ports.

        I mapped them out on a paper with a layout

        I’m thinking a 16cm square, so that there can be 40mm spacing between the center point of each UI node

        This also gives me room for the 33-38mm x 12mm labels that the label maker produces. That way I can use the label maker instead of trying to 

          3d print text

          write on it

          laser etch?

        The primary drawback of the label maker (other than being plain black and white) is the fact that I have to trim the edges off. I can use the straight cut, but the labels generally aren’t long enough to do that twice with a firm hold on the paper. The other option is to use scissors

        the other final option is to use the exacto knife and pray

        It’s not that big of a deal though, since the labels are literally disposable and I can print more at my leasure

        I’ve mapped all the switches and knobs to alphanumeric indicators, and I’ll map those to the pcb refdes as well

        Found an issue, there’s a switch that turns off AREG modulation in the VCO. It also didn’t make it into my front panel sketch. I was suspicious it didn’t do anything, but I didn’t confirm that its very slight effect is present until after I soldered it together.

        I also confirmed that these 2xON switches contact on the opposite of the wires they’re leaning towards

          meaning, if the switch is leaning to the RIGHT NC lead, the contact is touching the LEFT NC lead, with a hinge in the middle of the switch.

          I learned this by soldering together all 3 pins of a JST connector -.-

        FreeCAD Note:

          When carving a shape into even segments, make sure the overlaid dividing lines are construction lines. Otherwise, the definition of the total shape’s outline will get confused and it won’t pad right

 

Leave a Comment

Your email address will not be published. Required fields are marked *