Category: Uncategorized

  • Evelynestallation Blog Post 6!

    Hello, friends! This was a huge week for the project- Cartland and I installed the lights on Saturday, October 19! We completely changed the plan while doing the installation because Cartland realized the lights fit perfectly within little grooves in the wall the media wall is mounted on. It’s going to look so cool!

    I also coded a loop that cycles for the day and one that cycles through the night. I’ll add my code to the bottom of this post!

    I had a few difficulties with the amount of voltage going into the lights, so I adjusted the code to be less bright and added a second voltage input for the lights on floor 2. I did accidentally fry the board on the 3rd floor, but we’re getting new ones, so hopefully they’ll work well. Quick tip: when you’re wiring a digital pin, don’t forget to also connect a ground wire to your microcontroller from your lights. Otherwise, you will probably fry your board.

    All we have left to do now is fix the 3rd floor board, check the timing of the code so it works well together, and figure out what we’re putting on the media wall! Come to the HCC on Friday, October 25 to see the lights in action!

    #include <Adafruit_NeoPixel.h>
    #ifdef __AVR__
      #include <avr/power.h>
    #endif
    #define PIN      5
    #define PIN2     7
    #define NUMPIXELS 300
    #define NUMPIXELS2 178
    
    Adafruit_NeoPixel pixels2(NUMPIXELS2, PIN2, NEO_GRB + NEO_KHZ800);
    
    Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
    
    #define DELAYVAL 15
    #define DELAYVAL2 50
    #define DELAYVAL300 10 
    #define BIGDELAYLOOP  15400
    
    
    void setup() {
    #if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
      clock_prescale_set(clock_div_1);
    #endif
    
      pixels.begin(); 
        pixels2.begin();
     
    
    
    }
    
    void loop() {
      for (int g=0; g<12; g++)
    {
      for(int i=0; i<NUMPIXELS; i++) {
    
    
        pixels.setPixelColor(i, pixels.Color(0, 0, 0));
         pixels.show();
       
        }
        for(int i=0; i<NUMPIXELS2; i++) {
    
    
        pixels2.setPixelColor(i, pixels2.Color(0, 0, 0));
         pixels2.show();
       
        }
      //rainbows comet loop
      
        for(int i=NUMPIXELS; i>71; i--) {
     
       pixels.setPixelColor(i, pixels.Color(255, 0, 0));
       pixels.setPixelColor(i+1, pixels.Color(255, 62.5, 0));
       pixels.setPixelColor(i+2, pixels.Color(255, 127.5, 0));
       pixels.setPixelColor(i+3, pixels.Color(0, 255, 0));
       pixels.setPixelColor(i+4, pixels.Color(0, 127.5, 255));
       pixels.setPixelColor(i+5, pixels.Color(0, 0, 255));
       pixels.setPixelColor(i+6, pixels.Color(255, 0, 255));
       pixels.setPixelColor(i+7, pixels.Color(0, 0, 0));
     
        
       
       pixels.show();
       delay(DELAYVAL300*4);
        }
        
        for(int i=0; i<NUMPIXELS; i++) {
    
    
        pixels.setPixelColor(i, pixels.Color(0, 0, 0));
         pixels.show();
       
        }
        for(int i=22; i<NUMPIXELS2; i++) {
     
       pixels2.setPixelColor(i, pixels2.Color(255, 0, 0));
       pixels2.setPixelColor(i-1, pixels2.Color(255, 62.5, 0));
       pixels2.setPixelColor(i-2, pixels2.Color(255, 127.5, 0));
       pixels2.setPixelColor(i-3, pixels2.Color(0, 255, 0));
       pixels2.setPixelColor(i-4, pixels2.Color(0, 127.5, 255));
       pixels2.setPixelColor(i-5, pixels2.Color(0, 0, 255));
       pixels2.setPixelColor(i-6, pixels2.Color(255, 0, 255));
       pixels2.setPixelColor(i-7, pixels2.Color(0, 0, 0));
     
        
       
       pixels2.show();
       delay(DELAYVAL300*4);
        }
        
        for(int i=0; i<NUMPIXELS2; i++) {
    
    
        pixels2.setPixelColor(i, pixels2.Color(0, 0, 0));
         pixels2.show();
       
        }
         delay(BIGDELAYLOOP);
        
        
        //triple sparkle
    
         for (int a=0; a<100; a++)
    {
    long w= random(0,NUMPIXELS);
    long p= random(0,NUMPIXELS);
    long q= random(0,NUMPIXELS);
    long ww= random(0,NUMPIXELS2);
    long pp= random(0,NUMPIXELS2);
    long qq= random(0,NUMPIXELS2);
    
        pixels.setPixelColor(w, pixels.Color(255, 255, 255));
        pixels.show();
        pixels.setPixelColor(p, pixels.Color(255, 255, 255));
        pixels.show();
        pixels.setPixelColor(q, pixels.Color(255, 255, 255));
        pixels.show();
       
        pixels2.setPixelColor(ww, pixels2.Color(255, 255, 255));
        pixels2.show();
        pixels2.setPixelColor(pp, pixels2.Color(255, 255, 255));
        pixels2.show();
        pixels2.setPixelColor(qq, pixels2.Color(255, 255, 255));
        pixels2.show();
    
       delay(200);
    
       pixels.setPixelColor(w, pixels.Color(0, 0, 0));
       pixels.setPixelColor(p, pixels.Color(0, 0, 0));
       pixels.setPixelColor(q, pixels.Color(0, 0, 0));
       pixels.show();
    
       pixels2.setPixelColor(ww, pixels2.Color(0, 0, 0));
       pixels2.setPixelColor(pp, pixels2.Color(0, 0, 0));
       pixels2.setPixelColor(qq, pixels2.Color(0, 0, 0));
       pixels2.show();
    }
    for(int i=NUMPIXELS; i>0; i--) {
    
    
        pixels.setPixelColor(i, pixels.Color(0, 0, 0));
         pixels.show();
       
        }
    
        for(int i=NUMPIXELS2; i>0; i--) {
    
    
        pixels2.setPixelColor(i, pixels2.Color(0, 0, 0));
         pixels2.show();
       
        }
    //rainbow wash
    
    for (int s=0; s<NUMPIXELS; s++){
     pixels.setPixelColor(s+51, pixels.Color(125, 0, 0));
    pixels.show();
    pixels2.setPixelColor(s, pixels2.Color(125, 0, 0));
    pixels2.show();
       delay(DELAYVAL300*2);
    
        }
        
    
     for(int i=0; i<NUMPIXELS; i++) {
       pixels.setPixelColor(i+51, pixels.Color(125, 62.5, 0));
      
       pixels.show();
       pixels2.setPixelColor(i, pixels2.Color(125, 62.5, 0));
    pixels2.show();
       delay(DELAYVAL300*2);
        }
           
    
        for(int i=0; i<NUMPIXELS; i++) {
       pixels.setPixelColor(i+51, pixels.Color(127.5, 127.5, 0));
      
       pixels.show();
       pixels2.setPixelColor(i, pixels2.Color(127.5, 127.5, 0));
    pixels2.show();
       delay(DELAYVAL300*2);
        }
       
        
         for(int i=0; i<NUMPIXELS; i++) {
       pixels.setPixelColor(i+51, pixels.Color(0, 127.5, 0));
      
       pixels.show();
       pixels2.setPixelColor(i, pixels2.Color(0, 127.5, 0));
    pixels2.show();
       delay(DELAYVAL300*2);
        }
         
    
        for(int i=0; i<NUMPIXELS; i++) {
       pixels.setPixelColor(i+51, pixels.Color(0, 0, 127.5));
       pixels.show();
       pixels2.setPixelColor(i, pixels2.Color(0, 0, 127.5));
    pixels2.show();
       delay(DELAYVAL300*2);
        }
        
         
    
         for(int i=0; i<NUMPIXELS; i++) {
       pixels.setPixelColor(i+51, pixels.Color(75, 0, 100));
       pixels.show();
       pixels2.setPixelColor(i, pixels2.Color (75, 0, 100));
    pixels2.show();
       delay(DELAYVAL300*2);
        }
            
    
    
    
    for(int i=0; i<NUMPIXELS; i++) {
    
    
        pixels.setPixelColor(i, pixels.Color(0, 0, 0));
         pixels.show();
         pixels2.setPixelColor(i, pixels2.Color(0, 0, 0));
    pixels2.show();
       
        }
    
        //rainbow sparkle
    
     for (int a=0; a<200; a++)
    {
    long w= random(0,NUMPIXELS);
    long p= random(0,NUMPIXELS);
    long q= random(0,NUMPIXELS);
    long ww= random(0,NUMPIXELS2);
    long pp= random(0,NUMPIXELS2);
    long qq= random(0,NUMPIXELS2);
    long x= random(0,255);
    long y= random(0,255);
    long z= random(0,255);
    long xx= random(0,255);
    long yy= random(0,255);
    long zz= random(0,255);
    long xxx= random(0,255);
    long yyy= random(0,255);
    long zzz= random(0,255);
        pixels.setPixelColor(w, pixels.Color(x, y, z));
        pixels.show();
        pixels.setPixelColor(p, pixels.Color(xx, yy, zz));
        pixels.show();
        pixels.setPixelColor(q, pixels.Color(xxx, yyy, zzz));
        pixels.show();
         pixels2.setPixelColor(ww, pixels2.Color(x, y, z));
        pixels2.show();
        pixels2.setPixelColor(pp, pixels2.Color(xx, yy, zz));
        pixels2.show();
        pixels2.setPixelColor(qq, pixels2.Color(xxx, yyy, zzz));
        pixels2.show();
       delay(200);
        pixels.setPixelColor(w, pixels.Color(0, 0, 0));
        pixels.show();
        pixels.setPixelColor(p, pixels.Color(0, 0, 0));
        pixels.show();
        pixels.setPixelColor(q, pixels.Color(0, 0, 0));
        pixels.show();
         pixels2.setPixelColor(ww, pixels2.Color(0, 0, 0));
        pixels2.show();
        pixels2.setPixelColor(pp, pixels2.Color(0, 0, 0));
        pixels2.show();
        pixels2.setPixelColor(qq, pixels2.Color(0, 0, 0));
        pixels2.show();
    
    }
    
        //fade into blue
    
    
    for (int s=0; s<125; s++){
      for(int i=0; i<NUMPIXELS; i++) {
       
     pixels.setPixelColor(i, pixels.Color(0, 0, s));
    pixels.show();
     pixels2.setPixelColor(i, pixels2.Color(0, 0, s));
    pixels.show();
    for (int f=0; f<5; f++)
    {
      s++;
    }
       
      }
    
        }
        //fade every other to pink
    
      for (int r=0; r<125; r++) {
        for(int i=0; i<NUMPIXELS; i++) {
       if (i % 2 == 0) {
    pixels.setPixelColor(i, pixels.Color(r, 0, 125));
    pixels.show();
     pixels2.setPixelColor(i, pixels2.Color(r, 0, 125));
    pixels2.show();
    for (int f=0; f<5; f++)
    {
      r++;
    }
       
       }
       
       
      }
      }
    
    
      //blue/pink marquee
    
      for (int f=0; f<5; f++){
        for(int i=0; i<NUMPIXELS; i++) {
       if (i % 2 == 0) {
    pixels.setPixelColor(i, pixels.Color(0, 0, 125));
    pixels.show();
     pixels2.setPixelColor(i, pixels2.Color(0, 0, 125));
    pixels2.show();
       }
       else {
        pixels.setPixelColor(i, pixels.Color(63, 0, 63));
    pixels.show();
     pixels2.setPixelColor(i, pixels2.Color(63, 0, 63));
    pixels2.show();
       }
       
      }
      delay (100);
    
     for(int i=0; i<NUMPIXELS; i++) {
       if (i % 2 == 0) {
    pixels.setPixelColor(i, pixels.Color(63, 0, 63));
    pixels.show();
    pixels2.setPixelColor(i, pixels2.Color(63, 0, 63));
    pixels2.show();
       }
       else {
        pixels.setPixelColor(i, pixels.Color(0, 0, 125));
    pixels.show();
    pixels2.setPixelColor(i, pixels2.Color(0, 0, 125));
    pixels2.show();
       }
       
      }
    
    delay (100);
      } 
    
    //fade all to pink 
    
    for (int r=0; r<63; r++) {
        for(int i=0; i<NUMPIXELS; i++) {
       if (i % 2 ==! 0) {
    pixels.setPixelColor(i, pixels.Color(r, 0, 63));
    pixels.show();
    pixels2.setPixelColor(i, pixels2.Color(r, 0, 63));
    pixels2.show();
    r++;
    
       }
       
      }
      }
      //reverse wash out 
    for (int s=NUMPIXELS; s>0; s--){
     pixels.setPixelColor(s, pixels.Color(0, 0, 0));
    pixels.show();
    pixels2.setPixelColor(s-122, pixels2.Color(0, 0, 0));
    pixels2.show();
       delay(DELAYVAL300);
    
        }
    
    
    //end of 5 minute code
        for (int p = 0; p<55; p++)
      {
    int x=0;
    
    int y = 50;
    
    //blue set and sparkle
      for(int i=0; i<NUMPIXELS; i++) {
    pixels.setPixelColor(i, pixels.Color(0, 0, y));
    pixels.show();
    pixels2.setPixelColor(i, pixels2.Color(0, 0, y));
    pixels2.show();
      }
    
    for (int a=0; a<60; a++)
    {
    long w= random(0,NUMPIXELS);
        pixels.setPixelColor(w, pixels.Color(255, 255, 255));
        pixels.show();
        pixels2.setPixelColor(w, pixels2.Color(255, 255, 255));
    pixels2.show();
       delay(225);
       pixels.setPixelColor(w, pixels.Color(0, x, y));
       pixels2.setPixelColor(w, pixels2.Color(0, x, y));
    pixels2.show();
    }
    
      //green shift, 225 delayvals
    
    for (int z = 0; z<50; z++){
    
    for(int i=0; i<NUMPIXELS; i++) {
    
    pixels.setPixelColor(i, pixels.Color(0, x, y));
    
    pixels.show();
    
    pixels2.setPixelColor(i, pixels2.Color(0, x, y));
    pixels2.show();
    
    }
    
    delay(DELAYVAL);
    
    y--;
    
    x++; }
    
    
    
    //sparkle, 450 delayvals
    
    for (int a=0; a<60; a++)
    {
    long w= random(0,NUMPIXELS);
        pixels.setPixelColor(w, pixels.Color(255, 255, 255));
        pixels.show();
        pixels2.setPixelColor(w, pixels2.Color(255, 255, 255));
    pixels2.show();
       delay(225);
       pixels.setPixelColor(w, pixels.Color(0, x, y));
       pixels.show();
       pixels2.setPixelColor(w, pixels2.Color(0, x, y));
    pixels2.show();
    }
    
    
    
    //shift to blue, 255 delayvals
    
    for (int p = 0; p<50; p++){
    
    for(int i=0; i<NUMPIXELS; i++) {
    
    pixels.setPixelColor(i, pixels.Color(0, x, y));
    
    pixels.show();
    pixels2.setPixelColor(i, pixels2.Color(0, x, y));
    pixels2.show();
    
    }
    
    delay(DELAYVAL);
    
    y++;
    
    x--; }
    
    
    }
      //end of 12 hour daytime loop
    
      //begin 12 hour nighttime loop-- 2400 repetitions of 30-second loop
    
      for (int q=0; q<2400; q++)
      {
      int x=0;
      int y=0;
      int z=120;
    
    for (int t=0; t<50; t++) //red to green
    {
    for(int i=0; i<NUMPIXELS; i++) {
    
    pixels.setPixelColor(i, pixels.Color(z, x, y));
    
    pixels.show();
    pixels2.setPixelColor(i, pixels2.Color(z, x, y));
    pixels2.show();
    
    }
    
    delay(DELAYVAL2);
    
    z--;
    x++;
    }
    
    for (int t=0; t<50; t++) //green to blue
    {
    for(int i=0; i<NUMPIXELS; i++) {
    
    pixels.setPixelColor(i, pixels.Color(z, x, y));
    
    pixels.show();
    pixels2.setPixelColor(i, pixels2.Color(z, x, y));
    pixels2.show();
    
    }
    
    delay(DELAYVAL2);
    
    y++;
    x--;
    }
    
    for (int t=0; t<50; t++) //blue to red
    {
    for(int i=0; i<NUMPIXELS; i++) {
    
    pixels.setPixelColor(i, pixels.Color(z, x, y));
    
    pixels.show();
    pixels2.setPixelColor(i, pixels2.Color(z, x, y));
    pixels2.show();
    
    }
    
    delay(DELAYVAL2);
    
    y--;
    z++;
    } 
     
      }
        
    }
    }
    
  • Third Steps: 3D Molecular Representations

    Image of the hemoglobin molecule described in a previous blog post.

    Good evening, everyone, I am back once again with another update on my “3D Molecular Representations” project. Since my last post I have been working in CAD and trying my hardest to get this MMU printer to work. In this blog post I will mostly be talking about what I have been up to in CAD as I did not make much progress on fixing the printer issues. Also, the image above shows the print that was running in my last blog post. I personally think the white appears to have a pinkish shade to it as a result of red and white filament being dispensed through the same extruder. I would have expected the wipe tower would completely negate this effect but it that does not seem to be the case.

    Designing a Molecule Stand!

    Since my goal is to print models of molecular structures, I thought I might want to have a nice figure stand. This was a simple task and I’m pretty proud with how it looks.

    Image of the simple base and peg design.

    How It’s Made…

    Image of the first step which is a drawing of a rectangle and triangle.

    First start with a thin rectangle with a triangular top using the sketch tool.

    Image showing how the extrude function is used.

    Then using the extrude tool, extend both shapes symmetrically to the distance that you desire.

    Image showing placement of next triangle.

    Then flip your object 90 degrees and use the sketch tool to draw another triangle.

    Image showing how to extrude using special tools to create the pyramid shape.

    Then extend the new shape but make sure you change “cut” to “intersect” in order to create the pyramid like shape.

    Image showing how fillets are made.

    Then to create fillets, select each of the corner edges and use the fillet tool (or press f) to create fillets.

    Image showing how Chamfers are made.

    To add Chamfers, select each of the top edges and press the modify tab to select “chamfer.”

    Image of the final baseplate.

    I was also thinking it might be super simple to make a little “design” in the base of the stand that displays the name of the figure. I think next for the next iteration I’ll make an effort to include this detail.


    Making Pegs for the Stand!

    The Issue…

    My goal in this step is to make a peg attached to the stand which matches up perfectly to a hole in the model itself. This step took me a bit of time since I was not familiar with mesh objects vs model objects. Model objects are basic structures that can be easily made in CAD with a sketch and extrude tool, whereas mesh objects are complex structures constructed by connecting varied sizes of triangles to order to replicate the shape a desired object. When I tried to use both mesh and model objects in Fusion360, the two would not interact with each other and could not act as a single piece but would instead operate as two separate entities. When working with STL files (the files used for 3D printing) it will almost always contain mesh objects.

    The Solution…

    Now on the surface this is not an issue since the stand and the peg are to be printed separately. However, in order to make a peg hole in the model the mesh and model objects must be able to interact with each other. A model object, in this case a tube, is used to delete a “tube shaped” section of the mesh object to replicate a peg hole. Shown below are a series of images that outline how this is done.

    Image showing how the cylinder can be made.

    First upload the STL file of choice and then create a circle using the sketch tool and extend it to the desired length. The diameter of the circle dictates the size of the peg hole, and the length will dictate how deep the peg hole will be.

    Image showing placement of cylinder.

    Drag the cylinder into the STL model and position it in the location of the peg hole.

    Image showing how to use tessellate.

    Use the tessellate function on the cylinder.

    Image showing where the combine tool is.

    Use the combine tool on the cylinder and the STL model ensuring to select the settings shown below.

    Image showing how to use the combine tool.

    Ensure the “target body” is the STL object and the “tool body” is the cylinder. Select the cut option and press ok.

    Image showing the STL after being cut.

    The Result…

    Image of STL with stand design.

    The BIG BAD…

    The Great Multi-Extruder Printing Problem

    In my last blog post I discussed a big issue I have been running into with multi-extruder printing which is… well working with multiple extruders. I have found that using any filament other than PLA in the MMU results in clogging, jamming, misprints, filament oozing, and print crashes. I seriously cannot think of a solution to this issue and will be trying my best to address the issue next time.

    Sneak Peak

    For the sake of progress, I decided use PETG filament with PLA filament instead of PVA/PLA. This is because the two filaments are heated at different temperatures and would therefore cool at different times, causing the bond between them to be weaker.

    -PLA recommends a nozzle temperature of around 215°C and a heat-bed temperature of 60°C.

    -PETG recommends a nozzle temperature of around 250°C and a heat-bed temperature of 70-80°C.

    Now after all that good idea talk… ruined because once again the MMU struggled to dispense two different forms of filament without clogging and canceling the print. Instead, I started a print using only PETG using the non-MMU printer just to test the fit of the peg in the hole. My guess is the hole on the model needs to be just slightly wider in diameter to the peg and will also require a deeper hole. Regardless, see you next time!

  • Andrew’s Video Essay #3

    It has genuinely been a while since I talked about this project and where I am at with this project. A note to any students reading this: October is one of the hardest months to exist as a senior. Even though I took a week off from posting anything, I still have updates about my project.

    I took a trip to DC the other weekend with my friend– and a huge feature on the video essay– Billie. We met in Theatre History and ended up bonding over performance art, so of course I asked her to see a weird stage play with me. We ended up seeing Dracula: A Comedy of Terrors at the Workhouse Arts Center. I was not allowed to take any photos of the show or inside of the theatre, so trust me when I say it was like nothing I have seen before. Turns out the night we came, we ran into two of our former classmates who were in the audience, and two UMW alums were involved in the production.

    Billie and I walked around DC and talked about theatre all day and how we’ve seen each other grow inside and outside of theatre. We ended up having to shut up about that because it was a good topic to talk about in this video essay. Our conversation really tied the vision I had of the project together, and we will record the rest whenever we both have free time. We both have plans to see more art in general with the Hirshhorn releasing a new exhibit entitled Basquiat x Bansky.

    My next post will only be a week away! That post will focus more on research and how I put my thoughts together in the form of a script. Look forward to that when you have the chance.

  • Evelynestallation Blog Post #5!

    Hey everyone! Thanks for reading today’s blog post! For the past two weeks, I’ve looked at several big questions that will dictate the course of this entire project. The first question is how to power the lights. They run off of 5 volt energy, and a typical wall socket puts out 240 volts. That’s a huge difference. Fortunately, Amazon sells a product that steps down the voltage from a wall socket to 5 volts. Here’s the link- it even comes with a little piece that lets me attach wires to the positive and negative outputs!

    Amazon link DC power converter

    However, the next big question doesn’t have a quick Amazon fix. We want to sync these lights up to the HCC media wall, which would be insanely cool. I met with Josiah, who runs the Media Wall, on Monday. He told me that the media wall is controlled by a Macbook and is connected via cables that run from the projector to a closet on the second floor of the HCC. The projector itself can’t connect to WiFi or Bluetooth. Upon further reflection, the best way to sync the lights with an ethernet-controlled projector is probably… massive amounts of code that time the lights really specifically. Oh, and turning everything on at the exact same time.

    Trying to brute-force the project presents another difficulty: that of timing. Arduino coding can do almost anything, but what it can’t do is magically know the time. In order to set the lights on a cycle that matches the media wall during the day and shifts to something soothing at night, I have to program the Arduino to count every second and add it all up.

    I visited my favorite Internet forum (Arduino Project Hub) to find out more about counting seconds and found some handy open-source code made for a clock. I’m attaching the link below as this blog post’s code. Of course, it’ll take modification, but there is potential within this code for a 24-hour system that controls sparkly lights and changes vibes completely during the night. I hope you have fun with this code, and I can’t wait to include my version of it!

    Arduino Clock Project

  • Second Steps: 3D Molecular Representations

    Generic picture of a molecular model in CAD software.

    3D Printing

    Hello everyone! Its been a little too long since my first post but I am back and with a lovely mess of problems. Over the last few weeks, I have been looking into how to use a 3D printer. More specifically, I am trying to learn how to use a multi-extruder printer. The two major benefits of a multi extruder printer are utilizing multiple colors for a single print and utilizing soluble supports. The image below shows a 3D print that uses PLA filament as structural support. Specifically in rainbow print of the protein “Seipin” you can see the rough surface where the structural supports were pulled. Let me just say it is not fun trying to pick these models apart without breaking something along with it.

    Sepin Protein 3D Print (rainbow colored)
    tRNA 3D print (red)

    The idea behind using soluble supports is that simply submerging the model in water after printing dissolves supports, leaving just the model behind. The specific filament I am going to be using is Polydissolve S1 from Polymaker which is a PVA filament that is soluble in water and compatible with PLA filament as well.

    The Issue…

    I am currently unable to print using soluble filament at all. This issue has presented itself in many forms. I’ll start with the simplest mistakes and move to the mistakes that are currently unsolved.

    The image below is not a soluble filament print, but it does show THE ISSUE… with non-soluble support prints.

    Image of a non-scientifically accurate Bacteriophage that broke after printing.

    The Simplest: The Wipe Tower

    If you are familiar with multi-extruder 3D printing, there is a function called the “Wipe Tower.” The Wipe Tower is a structure that is printed in association to your model in order to allow for smooth transitions between the different color/type of filament. An example of what I mean is shown in the video below.

    The issue is PrusaSlicer, the software I use, does not “allow” soluble material to be printed with a wipe tower. This is not true and can be bypassed by following these steps:

    Print Settings (Top Tab) –>Support Material (Left Side Tab) –> Top Contact Z Distance set to “0 (soluble)”

    This allows for the wipe tower to be enabled in the “Multiple Extruders” side tab by checking the box. Subsequently the options “support material/raft/skirt extruder” and “support material/raft interface extruder” can be set to the extruder of your choice containing the soluble material (Mine was 2 but it does not matter as long as it is the same as the extruder the material is loaded in).

    Picture showing where to change the Z-distance.
    Picture showing how to assign extruders to supports only.

    The Annoying but Simple: Loading/Unloading Errors

    A very frustrating, but simple, issue I run into is the loading and unloading errors that can sometimes occur multiple times in a single print. My current guess into why this is happening so much is due to PVA material being much softer than PLA and the material does not guide as nicely as the PLA. I think this because I only have consistent errors when trying the PVA material and almost never have the issue using only PLA material. If you are reading and have a better suggestion for a different brand of PVA filament let me know!!

    Also, I am sorry I forgot to take a video of this event but I’m sure it’ll happen again so look forward to that.

    The Most Complex: INFINITE LOADING..

    The biggest, and most frustrating, issue is after everything is set up and the print is started. During this time the MMU (Multi-Material Unit) would endlessly load and unload the filament. Occasionally I would have issue with the 3D printer just going to the corner of the baseplate and unloading filament endlessly which is not good. This leads me to believe this is a program/machine error and not due to the PVA material. There are many different ways to approach this problem and based on my initial research on Reddit, some others found a similar issue and it was a hardware problem. After ensuring there are no clogs or any too loose/tight screws we can ensure sensors are working properly. The filament sensor may be my issue here however I have yet to check.

    Image of a labeled MMU Prusa Printer filament module. Includes filament sensor label.

    Again, I forgot to video this issue but trust me it’ll happen again so stay tuned.

    Moving Forwards: Multi-Color Print

    Instead of never using this multi-extruder 3D printer due to the issues with soluble support I decided to just print with multiple colors of PLA material. To show off the multi-color print best I decided to print a representation of Hemoglobin from the protein database (code: 3PEL). Strangely enough without any troubleshooting this print test started immediately without any issues at all. As much as I wish I could show the final product right away at the time of writing this it has yet to be completed (It takes 13 hours for a 2in x 2in model).

    Image of the Hemoglobin model including structural supports and the wipe tower.
    The hemoglobin model without structural supports or wipe tower. Red and orange highlight different subunits.

    Next Steps: More Work in 3D Printing

    The plan for my next blog post will be to move past the issues I ran into over the last few weeks and actually get even the simplest model printed. If that does not go to plan, then I might start designing a mini-final project. My vision for this includes a model that can be stuck together with pegs that were added using AutoDesk Fusion.

  • Andrew’s Video Essay #2

    Okay, I have to go back in time to talk about this moment.

    It’s April 2024. I am feeling generally horrible. Five months before this, I was told I would never be able to do something I am getting my degree in. Instead of creating art, I start writing a senior proposal with the basic in a published paper titled “Nightmares and Dreams on Progesterone: Trans* Embodiment and Intermedia.” The published paper was essentially an autobiography/instruction guide for art from a creative named Lorelei d’Andriole, and her work in performance art. I fell in love with this particular paper, and emailed the author immediately. Once I figured out that I was heading in this direction with my video essay, I emailed Lorelei again, and we set up a Zoom meeting from her home in Lansing, Michigan.

    Lorelei was an absolute joy to talk with. She gave me honest, thoughtful answers about the work I am going to produce, and she even gave me advice about the future in an interview about her work. We talked about the struggles of practicing art as transsexuals, what the transition period looks like for artists, and some of the topics mentioned in her work. I won’t spoil the whole interview– because some of it is for the video essay– but meeting and talking to Lorelei was the first step I needed in order to take this project from point A to point B.

    This project was stagnant the past few weeks. There is not much to do when you are working with nothing, but I do see the vision of this project getting clearer, which is something I could not say two weeks ago. Now, time for more research and scripting.

  • Evelynestallation Blog Post #4!

    It’s been such a busy few weeks that I haven’t made it into the DKC! However, I do have more fun code! This one is a variation of the code I used in blog post #2, but this time it has sparkles added in. See if you can spot the difference! When I think about coding lights, adding sparkles is both one of my favorite things to do and one of the most difficult because it requires the inclusion of random selection. If I end up hard coding the lights, which I’m leaning towards, I’d definitely include this code!

    Also, depending on the lights you get, this code may make your lights different colors. It’s set for RGB lights, which means that red is the first number in the “pixels.Color(x, 0, y)” command. However, some lights are GRB lights and would interpret the first number, or x, as the color green. If that’s the case, you can switch the x value and the 0!

    If you want to choose your own colors, you can reference the chart on this website!

    Rapid Tables RGB Color Chart

    Happy coding!

    #include <Adafruit_NeoPixel.h>
    #ifdef __AVR__
      #include <avr/power.h>
    #endif
    #define PIN       5
    #define NUMPIXELS 60
    
    Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
    #define DELAYVAL 30
    
    void setup() {
    #if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
      clock_prescale_set(clock_div_1);
    #endif
    
      pixels.begin(); 
    
    }
    
    void loop() {
    
     int x=255;
      int y = 0; 
      for (int z = 0; z<255; z++){
       
         for(int i=0; i<NUMPIXELS; i++) {
          
       pixels.setPixelColor(i, pixels.Color(x, 0, y));
       pixels.show(); 
       
       
       }
       long w= random(0,NUMPIXELS);
        pixels.setPixelColor(w, pixels.Color(255, 255, 255));
        pixels.show();
       delay(DELAYVAL);
       x--;
       y++; }
    
       for (int p = 0; p<255; p++){
       
         for(int i=0; i<NUMPIXELS; i++) {
          
       pixels.setPixelColor(i, pixels.Color(x, 0, y));
       pixels.show(); 
       
       
       }
       long w= random(0,NUMPIXELS);
        pixels.setPixelColor(w, pixels.Color(255, 255, 255));
        pixels.show();
       delay(DELAYVAL);
       x++;
       y--; }
       
     } 
  • First Steps: 3D Molecular Representations

    Good morning everyone, this is my first of many posts in which I will be learning how to utilize CAD software in order to edit 3D molecular structures for 3D-printing. My first step was to find a good CAD software that was both cheap (or free) and had enough processing power to edit extremely complex protein structures. After doing some research and speaking with my father I was able to find the software called Autodesk Fusion, which excels in 3D-pritnting related CAD work. Also, Autodesk Fusion is completely free for college students and if it wasn’t it would be like 85$/month which is crazy. Regardless, instead of jumping straight to the end goal I decided it would be good to spend my first couple of hours working with the built in introductory files which help new users to familiarize themselves with the program.

    Also, a quick note, working with complex CAD files requires a pretty substantial computer (a good GPU) and I will be doing most of my work with a desktop gaming PC (GTX 2070).

    After exploring the introductory files, I found that I still had no idea what was going on and decided to consult YouTube where I found a series of videos from a channel called “The Fusion Essentials” (links below). I basically watched each of these videos and made a few designs (shown below). I think this was a perfect practice exercise because creating the dowel of the toolbox is going to be a similar process to making pegs for my models.

    Note: I haven’t made it to part 4 of the video series yet..
    (156) Getting Started with Fusion 360 Part 1 – BEGINNERS START HERE! – YouTube
    Getting Started with Fusion 360 Part 3 – Modeling with SOLID TOOLS! (youtube.com)
    Getting Started with Fusion 360 Part 4 – Modeling Tools, Cutting Holes, and Removing Material! (youtube.com)

    I was a few hours into doing this post and realized that this software needs to support the .STL files created by PDB (Protein Data Base) where I will be obtaining most of the molecular structures. Good thing Autodesk Fusion supports these file types as I would have had to restart and choose another program.

    Well, that’s that for this week. UMW just bought a multi-extruder printer over the summer so next time I hope to include a picture of a test print using soluble support material. Also, should I make a google doc showing off some of the key skills I learn in Autodesk Fusion? Did I blog properly? Also, I’m starting to really get a good idea of what my end project will look like and wow I think it’ll come out good.

  • Andrew’s Video Essay #1

    Hi all. Writing blog posts on the internet is a new experience for me, so I will try my best to make this a cool and casual experience for both the reader and myself.

    First off, my name is Andrew Lee. I am a senior here at UMW studying geography. I know everyone was expecting communications or theatre from my topic, but really, I am just a theory-ridden senior spending most of his time somewhere between the HCC and Jepson (RIP Monroe). I do, however, have my foot in the door in Theatre, as I was a theatre major for most of my time at UMW and I am on Studio 115’s committee. We’re a fun, student run theatre on the first floor of duPont. 

    I am so proud of my accomplishments here at UMW that I wanted to expand my work, and dive into this passion project of mine. All theatre students are required to take Theatre History, and in that class is where I learned my passion was still in research and theory. I was introduced to so many cool artforms that I ended up reading tons of books and articles about avant-garde theatre. This is where the project stems from.

    Another cool thing about me is I am trans. I started my transition at UMW, and during the time I learned about cool theatre history, I was finally wrapping my head around my own gender, and seeing my gender performed live in front of me. I sadly did not see any trans artists performing in front of me, and it felt lonely for a bit. I searched on academic sites and my own personal social media, and I started to surround myself with trans performing artists.

    I am creating and featuring the work of people I adore in the most professional way. In this video essay, with a working title of Funky Men, I tell the story of trans performing artists, how they got to the position they are in, and what their work means to them.

    I hope you all enjoy the more technical posts later on, as I am in the rough draft section of my project now.

  • Evelynestallation Blog Post #3!

    Guess what- the sparkle lights came in this week! I tested the 5 volt LED strip with both the ESP8266 chip and the hard-coded Arduino Uno. The 5 volt strip lit up extremely well. I didn’t see any signs of voltage drop in the 60 light strip. Hopefully that means I can use the light strips instead of the strands for this project. The strips come with an adhesive backing, and as such, they’re far easier to install in any given location.

    However, this week wasn’t perfect. I tried to set up the WiFi connection with the ESP8266 chip and it didn’t work. In fact, I tried on two different days, and I even tried to use the Apogee WiFi system instead of the UMW one. I think that it’s going to be impossible to set up something reliable on UMW WiFi. Too many people log on and off of the system in the HCC every day.

    Here’s a helpful hint if you’re using a WiFi connectable chip: check the IP address on the computer you’re controlling it from and see if the first two sections match. That means you’re on the same network as your chip and you’re able to send data to it! For some versions of the IP address, you might need to check the first three sections. The last section is always specific to your device. It’s like a name for your computer (or chip) that the network can reference!

    I’ve attached yet another set of code, this one for a 60 light strand. I hope you have fun trying this out, because it’s my favorite code yet! It’s called the Rainbow Comet!

    #include <Adafruit_NeoPixel.h>
    #ifdef __AVR__
      #include <avr/power.h>
    #endif
    #define PIN       5
    #define NUMPIXELS 60
    
    Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
    #define DELAYVAL 30
    
    void setup() {
    #if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
      clock_prescale_set(clock_div_1);
    #endif
    
      pixels.begin(); 
    
    }
    
    void loop() {
    
      for(int i=0; i<NUMPIXELS; i++) {
    
        pixels.setPixelColor(i, pixels.Color(0, 0, 0));
         pixels.show();
       
        }
       for(int i=0; i<NUMPIXELS; i++) {
     
       pixels.setPixelColor(i, pixels.Color(255, 0, 0));
       pixels.setPixelColor(i-1, pixels.Color(255, 62.5, 0));
       pixels.setPixelColor(i-2, pixels.Color(255, 127.5, 0));
       pixels.setPixelColor(i-3, pixels.Color(0, 255, 0));
       pixels.setPixelColor(i-4, pixels.Color(0, 127.5, 255));
       pixels.setPixelColor(i-5, pixels.Color(0, 0, 255));
       pixels.setPixelColor(i-6, pixels.Color(255, 0, 255));
       pixels.setPixelColor(i-7, pixels.Color(0, 0, 0));
     
        
       
       pixels.show();
       delay(DELAYVAL);
        }
    }