Posts Tagged ‘ Processing

4WOC : Week 1

I’d heard of ’30 days of creativity’ before:  Sort of a forcing function to get the creative juices flowing.  I thought I’d try my hand at it, but instead, I’ll call it “Four Weeks Of Creativity”.  I’ve done plenty of 3d printing since my last post… I’m just a lazy blog poster.

Starting Nov 11th, I will BE CREATIVE!  This one post will hold an overview of what ‘creative’ thing I did each day for the first week.

Forward to Week 2

Week 1

Week 1 is now complete!  See notes for individual days below.  The final result is…..:

Day 7 : Sunday, Nov 17th, 2013

I’ve spent the past week working on the above Processing sketch I’ve coined ‘Orbital’.  It started out as just an idea of some floating cubes, and has turned into this:  A particle\physics sim.  Multiple light sources orbit around a central sun, colliding into multiple other bodies.  I wrote all the particle physics and collision, was fun to remember how to do all that.

My hope was to replace the light sources with some fancy-rendered OpenGL sprites with glow.  It appears that on my version of the mac (10.8.2) doesn’t recognize their OpenGL libraries properly… so no dice there.

Today I tidied up the code, created the above movie, an generated the below executables.

Download:

  • Processing source here.
  • Mac App here. (bigger than it needs to be based on its inclusion of Java)
  • Windows exe here.
  • Linux here. (untested)
Directions:
  • Use mouse + wheel to orbit camera.
  • “s” : save an image
  • “r” (toggle) : Start recording an image per frame.
Time today:  about 2 hours.
Total time on this project over the past week:  Roughly 12 hours.

(and now for the previous days…)

Day 1 : Monday, Nov 11th, 2013

I haven’t done any work with Processing for a long time.  Thought I’d get back into it for a bit.  Today I:

  • Installed Processing 2.1
  • Wrote simple sketch with camera control, and 3d mesh rendering.  Download the sketch here.
  • Total Time:  About 1:45

Day 2 : Tuesday, Nov 12th, 2013

Continued to work on sketch from yesterday.

  • Now have mobile light source.
  • Cubes have random rotation, opacity based on distance to center.
  • Download the sketch here.
  • Total Time: About 1:00

Day 3 : Wed, Nov 13th

More sketch work:

  • Adding a trail to the lightsource. Remembering about Arrays in Processing. Cubes no longer delete and rebuild: stay persistent and rotate. Adding a top-down directional light, making background slightly brighter.
  • Download the sketch here.
  • Total time:  Just over an hour.

 Day 4, Thurs Nov 14th

  • Sad day:  Internet problems coupled with my boys homework really cut into creative time.  Only got half an hour in.  Started to turn the light source into a physics sim to collide with the cubes (now spheres for easy of collision).  Hopefully more to show tomorrow!

Day 5 : Fri Nov 15th:

  • Re-wrote the camera system to use the PeasyCam Processing library. Makes using the camera really easy, and resolves some issues with the new physics system:  The light source is now a dynamic body orbiting the center of the world.  It lost its trails, but they’ll come back.
  • Download the sketch here.
  • Total time:  1:30.

Day 6, Sat Nov 16th:

  • Good progress today:  Have physics fully working.  Light now collides with the balls, and the balls all collide with each other.  Changed the drawing style on the light-trail to look better.  Created LOD system on the balls for better performance.
  • Download the sketch here.
  • Total time: about 4 hours.

B-day & xmas loot

Scored quite a few cool books this year for the birthday\Christmas season:

Books include:

In addition to the books, I got a Microrax starter set, which I built the above book-holder with.

Time to start reading!

3D Printing, step one…

Back in March I received my Makerbot Replicator after a two month wait (new product, backordered).  I’ve been trying to get around to post about it, but the (first) Replicator was fraught with multiple problems.  I won’t get into the specifics, but I will say that the Makerbot support personal were very accommodating with helping me resolve the issues, and last week my replacement arrived, fully functional.  The original one I received was a “dual extrusion” model, meaning it could print two alternating colors.  But many of the problems I encountered stemmed from this tech, so I ultimately decided to get the single-extrusion (single color) model.

The Replicator doing it's thing: I covered it in plastic-wrap to help cut down on drafts, that can have an effect on print quality. It's print volume is 8.9" x 5.7" x 5.9", or just under 300 cubic inches.

—-

The first thing I get asked is “what are you going to do with it?”, which is still a question I ask myself.  I think back to two points in my past, and how they changed my future:

The first was in the mid 80’s when my family purchased an Apple ][c.  Up until that decade, computers weren’t popularized in the home, and I feel that was a major turning point for many people:  You survived just fine without one, but once you started using one you couldn’t imagine life without it.  Extrapolate forward to the internet and I think anyone would have a hard time disagreeing with it.

The second was when I finally wrapped my head around ‘Object Oriented Programming‘ while learning Python & Processing:  Up until that point, all my programming had been ‘functional‘.  I’d always heard about this ‘OOP’ stuff, but couldn’t grasp how it would help me.  But just like the old Apple, once I started using it not only I couldn’t imagine programming without it, but I was able to program much more complex systems.

I see 3D printing possibly falling into this category:  I currently don’t envision a wide-spread practical use for it in my daily life, but I have a strong inclination that once I understand the technology and integrate it into my routine, it will find a home among those concepts of the past that have shaped my future.  Or, it will be a very expensive door-stop.

The second thing I get asked is ‘how does it print?’.  There is a variety of 3d printing tech out here, and this style of printer does what’s called ‘extrusion’:  It squeezes a line of 1.8mm ABS filament (ABS is the same plastic Lego’s are made out of) down through a heated nozzle (220 deg C) out of a .4mm tip onto a ‘heated build platform’ (HBP, at 110 deg C).  Before the print started, a 3d model was ‘sliced up’ into individual layers, and the printer will print each layer, one on top of the next by extruding down lines of this filament.  Each layer sticks to the one below it.  When you’re done, you have a physically modeled 3d object in ABS plastic.

Three rolls of different colored 1.8mm ABS filament.

—-

To start learning the system, I’ve been printing designs that came with the printer, and interesting items I’ve found on Thingiverse.  If you want to keep track of the things make\like\design, you can checkout my profile there.  Or, you can just look at this current picture:

Successes include: Big squirrel, tiny squirrel, revolver pencil-holder, 'Minecraft Creeper', 3d printer, iPhone case, whistle (very loud), shark, twisted shot glass (with calibration cube inside).

I’ve also had a lot of failures, mainly based on the two color printing.  Below is an informative pic.  What it does show off however, is the hexagonal ‘infill’ pattern that is automatically generated by the software.  This both provides support for the item, and helps when printing the ‘tops’ of things:

Failures include a robot, a checkered ball, multiple cupcakes, shark, 3d printer.

—-

The next step is to make my own items to print, and there is a lot of software is needed to pull it all together (going in reverse order of usage):

To generate the ‘G-code‘ files the 3d-printer will access to create the print, I use ReplicatorG:  This tool only officially opens stl files, so I have to make sure whatever model-generating solution I use can export to the stl format, or I need mesh conversion software.  ReplicatorG can be used to do simple transformations to the mesh to fit the print volume:  Translate, rotate, scale, and adjusts the print settings:  what percentage of  ‘infill’ the object has (how solid it is), filament feedrate settings, etc.

To deal with mesh file format conversion from the source data to stl for ReplicatorG, I use MeshLab:  It seems very capable in converting one file format to another, and can help ‘clean up’ holes in the mesh.

To modify mesh I didn’t create, I’m starting to use MeshMixer:  Most commonly it’s used to help generate a flat base on the mesh for printing.  There is a good tutorial video on this here.

Finally, you need software that will generate the thing you want to print.  You can design 3d items two main ways:  One is to model it in 3d, the other is to procedurally program the model.  I want to do both actually:

The 3d modeling approach:  I’ve been using Maya (at work) since it was released, and am very comfortable modeling in it.  However, it’s a $5k piece of software, so some other home solution is needed.  The Makerbot page “3D Design Software 101” does a good job of providing an overview of which (affordable) software one can choose, and where to go from there.  I have experience with SketchUp, so that’s the software I’m current investing my modeling mindshare in.

On the procedurally modeled approach, my current plan is to use Processing extended with the libraries HE_mesh and/or toxiclibs:  They are both add-on libraries for Processing to make dealing with mesh a lot easier, and can export to the stl file format.  I’d love to do all this with a Python implementation instead, simply because I like the language more, but it’s hard to beat Processing for its ease of use.  Another option would be OpenSCAD, but I don’t know if I’m up for learning another language right at this moment.

—-

So to date, what have I learned?

  • Large items with a flat base don’t need to have a ‘raft’ printed first.  But if the item is small, or the base is some crazy shape, a raft really helps.
  • Always set the HBP (heated build platform) to 110 deg (Celsius):  ReplicatorG likes to set it to 100 deg by default.  If you don’t, you could get print edge curling.
  • Knock off any hanging filament before the print starts:  It can screw up the initial extrusion and cause it not to stick to the HBP.
  • Print directly from the SD card, not over usb:  I’ve had usb ‘screw up’ a couple times, canceling the print.

—-

What is next?  Modeling in 3d, printing my own designs.  My ultimate goal is to cast these in aluminum via sand-casting (see my previous post on melting metal).  Honestly however, the hardest thing is just figuring out what to make… when you can make anything.

Ostrich-Egg Bot and Processing

One of the main goals I have with using the Ostrich-Egg Bot is to generate art for it via Processing.  I’ve successfully drawn and etched a variety of random svg graphics onto a variety of surfaces.  Next step was to get that art from Processing.

Turned out to be a bit more difficult than I expected:  Processing has no native API call for exporting svg’s (that I can find).  But I finally grasped the fact that it can export pdf files via its pdf library.  And these, when imported into Inkscape, have the exact paths you need to plot.  Here’s a vid of the etcher in action based on a Processing-generated image:

And here’s the source for a simple Processing sketch that makes use of this:  The sketch draws a bunch of overlapping circles, larger on the bottom, smaller on the top, and makes sure there is no seam on the edge:

// eggbot_circles01

import processing.pdf.*;

int eggWidth = 3200;
int eggHeight = 800;
int minSize = 32;
int maxSize = 256;

void setup() {
  size(eggWidth, eggHeight);
  smooth();
  background(255);
  frame.setTitle("Eggbot: Circles01");
  noFill();
  beginRecord(PDF, "processingCircles.pdf");
}

void draw() {
  float[] pos = {
    random(width), random(minSize/2, height-maxSize/2)
  };
  float eSize = map(pos[1], minSize/2, height-maxSize/2, minSize, maxSize);
  ellipse(pos[0], pos[1], eSize, eSize);

  // Tile the circles on the x axis:
  if (pos[0] < eSize/2) {     
    ellipse(pos[0]+width, pos[1], eSize, eSize);   
  }   
  else if (pos[0] > width-eSize/2) {
    ellipse(pos[0]-width, pos[1], eSize, eSize);
  }
}

void keyPressed()
{
  if (key == 's') {
    endRecord();
    exit();
  }
}

When the sketch is going, press ‘s’ to save an image, and quit. It actually raises an exception, but the image saves… not sure what’s going on…

From there it’s a simple matter of importing the pdf into Inkscape. I discovered however that its size was bigger than what was defined in the sketch, so I had to resize it to fit the Ostrich-Egg Bot’s drawing area. Here is a close-up of the etcher in action:

And here’s a shot of the final product:

So, not the most amazing thing, but one step closer…

Ponar

While at the last Maker Faire, I picked up a 4wd robot kit.

My thought is to hook an ultrasonic sensor to it, to do some simple obstacle avoidance.  Since I’ve never worked with any of these components before (servo’s, ultrasonic sensors, motor-drivers, etc), I want to break down each step so I can really grasp how this stuff works.

I was looking at my bucket of parts and it dawned on me:  I have a servo, I have a Ping))) sensor, a spare Arduino Uno, a bunch of Erector Set parts, and knowledge of Processing programming:  I could (should!) make a simple sonar system.  So the “Ponar” was born:  Ping))) + Arduino + Servo + Processing = Ponar.

How it works:

The Arduino program sweeps the servo back and forth over a 90deg arc.  At each degree, the Ping))) sensor returns back a distance reading.  The degrees and distance values are passed over the serial port to the PC, where the Processing application turns them into a ‘traditional looking’ (in my head at least) sonar read-out.

See it in action:

Want to make one too?  Here’s the steps I went through:

Parts List:

Software List:

Hardware setup:

  • Assemble the servo, bracket, ping, and erector set into a pleasing arrangement.
  • Connect the Arduino’s 5v and ground pins to the mini beadboard with the jumpers.
  • Use jumpers to connect the Vin of the Ping))) and the servo to the Arduino powered row on the mini breadboard.
  • Use jumpers to connect the ground of the Ping))) and the servo to the Arduino grounded row on the mini breadboard.
  • Use a jumper to connect the signal line of the Ping))) to the Arduino’s digital pin 7.
  • Use a jumper to connect the signal line of the servo to the Arduino’s digital pin 9.
  • Connect the Arduino to the PC with the usb cable.
  • Upload the Arduino sketch to the Arduino:  It should start sweeping left and right.
  • Run the Processing sketch:  It should sample the serial stream being passed from the Arduino, and display the sonar view on-screen.

For a couple days work, it was really informative, and actually pretty fun.

Ponar sees beer