Introduction: The KaleidoPhoneScope: a Dance of Light, Sounds and Mathematics

About: I am a curious scientist and dedicated teacher, supported by my loving family assistants.

If a small mirror to the end of a bent wire is securely fixed to a stable platform and a laser beam from a laser pointer reflects off it, mesmerizing, intertwined spirals of light, the laser beam will appear dancing on the wall of your room. This enchanting display results from two mutually perpendicular harmonic oscillations generated by the vibrations of the elastic wire. These captivating patterns are known as Lissajous-Bowditch figures and named after the French physicist Jules Antoine Lissajous, who did a detailed study of them (published in his Mémoire sur l'étude optique des mouvements vibratoires, 1857). The American mathematician Nathaniel Bowditch (1773 - 1838) conducted earlier and independent studies on the same curves, and for this reason, the figures are also called Lissajous-Bowditch curves [2]. 

LB curves result from the combination of two harmonic motions, and therefore, they can be mathematically generated through a parametric representation involving two sinusoidal functions (see Figure and also here). Lissajous invented different mechanical devices reproducing these periodic oscillations consisting of two mirrors attached to two oriented diapasons (or other oscillators) by double reflecting a collimated ray of light on a screen, producing these figures upon oscillations of the diapasons. The diapason can be substituted with elastic wires, speakers, pendulum, or electronic circuits. In the last case, the light is the electron beam of a cathodic tube (or its digital equivalent) of an oscilloscope [3]. 

The simplest of these devices is the KaleidoPhone, invented (and named) by the British physicist Charles Wheatstone at the beginning of the 19th century [3,4]. The Kaleidophone creates stunning Lissajous patterns and is an excellent example of how science can also be an art form.  You can bring the mesmerizing dance of light to life with just a few simple materials and creativity. 

In this Instructable, a modern compact version of this device fabricated with the help of 3D printing technology is described. Moreover, by adding a digital camera, the evanescent dancing patterns of wire oscillations generated by the laser on the screen can be recorded and analyzed. We have called this enhanced Kaleidophone the KaleidoPhoneScope. The device is not meant to only paint evanescent dancing patterns of wire oscillations on the screen, but by adding a speaker, sound vibrations can also be visualized.


REFERENCES

  1. T. B. Greenslade Jr., "All about Lissajous figures," The Physics Teacher, 31, 364 (1993).
  2. T. B. Greenslade Jr., "Devices to Illustrate Lissajous Figures," *The Physics Teacher, 41, 351 (2003).
  3. C. Wheatstone, Description of the kaleidophone, or phonic kaleidoscope: A new philosophical toy, for the illustration of several interesting and amusing acoustical and optical phenomena, Quarterly Journal of Science, Literature and Art 23, 344 (1827).
  4. R. J. Whitaker, "The Wheatstone kaleidophone," American Journal of Physics, 61, 722 (1993).


Supplies

To build your own KaleidoPhoneScope, you'll need the following materials:

HARDWARE

  1. Two rectangular perforated metal plates measuring approximately 60x200 mm each. 
  2. A 3D-printed support structure for the iron wire.
  3. Elastic metal wires. This project used ductile metal PVC-coated wires of approximately 1 mm diameter for gardening. The gardening wire can be bent in different shapes, but its elastic capability for small displacement generates the vibrational motion necessary for the experiments.
  4. Circular mirrors that are commonly available at bricolage shops. Mirrors of approximately 20 and 35 mm in diameter were used for the project.
  5. A circular translucent plastic screen and its 3D printed support.
  6. A KY-008 5v Red Laser Head Transmitter Module for Arduino/Raspberry Pi.
  7. A Raspberry Pi Zero with a Pi Camera. We have used version 1.3 of the Pi Camera.
  8. 3D printed holder and support for the Pi camera.
  9. A cheap amplified portable mini speaker with an audio jack that can be connected to the Raspberry Pi (I bought the one used in this experiment in Poundland for a few pounds).
  10. An audio jack to USB-C converter.
  11. Screws


3D PRINTING

You need to use the OpenScad program and the module library provided to generate the STL file for 3D printing the parts required in this project. OpenSCAD is a script-based 3D CAD modeling software focusing on constructive solid geometry. Users create models through scripting, enabling parametric design and precise control. It is cross-platform, providing a text-based interface and 3D rendering. OpenSCAD is commonly used in the maker and 3D printing communities.

Website: https://openscad.org/

To print the different parts, copy the library provided in the OpenScad program below. Uncomment the various modules and generate the STL of each of them. You also can modify and adapt it if the hardware you dispose of differs slightly from the one I have used.

In this project, we have used PrusaSlicer and Cura to prepare the .gcode files and a Creality Ender Pro for 3D printing the parts with a 1.74 mm PLA filament at 0.2 mm vertical resolution.

$fn=100;

module PlateJoint(){
   cube([55,55,3],center=true);
   translate ([20,-22.5,0])cylinder(11,2.4,2.4);
   translate ([-20,-22.5,0])cylinder(11,2.4,2.4);
   translate ([20,22.5,0])cylinder(11,2.4,2.4);
   translate ([-20,22.5,0])cylinder(11,2.4,2.4);
   }


module PlatformLeg() {
   difference(){
     cylinder (30,5,5,$fn=6,center=true);  
     translate ([0,0,0]) cylinder (40,2.,2.,center=true);  
   }
}

module filamentHSquaredEx() { 
difference(){
        union() {
          cube([80,15,4],center=true); 
          translate ([0,0,7.5]) cube([10,10,15],center=true);   
          translate ([35,0,7.5]) cube([10,10,15],center=true); 
          translate ([-35,0,7.5]) cube([10,10,15],center=true);         
        } 
       translate ([0,0,-20]) cylinder(40,0.75,0.75); 
       translate ([35,0,-20]) cylinder(40,0.75,0.75); 
       translate ([-35,0,-20]) cylinder(40,0.75,0.75);    

       rotate ([90,0,0]) translate ([0,10,-1]) cylinder(20,1.35,1.35);  
       rotate ([90,0,0]) translate ([35,10,-1]) cylinder(20,1.35,1.35); 
       rotate ([90,0,0]) translate ([-35,10,-1]) cylinder(20,1.35,1.35);      

       translate ([16,0,2]) cube([12,3.8,10],center=true);      
       translate ([-16,0,2]) cube([12,3.8,10],center=true); 

       translate ([10,0,-5]) cylinder(20,1.9,1.9);  
       translate ([22,0,-5]) cylinder(20,1.9,1.9);

       translate ([-10,0,-5]) cylinder(20,1.9,1.9);  
       translate ([-22,0,-5]) cylinder(20,1.9,1.9);  

   }
}

module ScreenHolder() {

difference(){
      union() {
        cube([60,15,4],center=true); 
        translate ([0,0,7.5]) cube([10,10,15],center=true);   
      } 
      rotate ([0,0,0]) translate ([0,0,0]) cylinder(20,1.35,1.35);  

      translate ([16,0,2]) cube([12,3.8,10],center=true);      
      translate ([-16,0,2]) cube([12,3.8,10],center=true); 

      translate ([10,0,-5]) cylinder(20,1.9,1.9);  
      translate ([22,0,-5]) cylinder(20,1.9,1.9);

      translate ([-10,0,-5]) cylinder(20,1.9,1.9);  
      translate ([-22,0,-5]) cylinder(20,1.9,1.9);  
    }
}

module ScreenHRound() {
difference(){
     union(){ 
       translate ([0,0,-1])    cylinder(6,64,64,center=true);  
       rotate ([90,0,0]) translate ([0,0,62]) cylinder(4,7,7,center=true); 

       rotate ([90,0,0]) translate ([73.5,0,0]) cylinder(6,5,5,center=true); 
       rotate ([90,0,0]) translate ([67.5,0,0]) cube([20,4,6],center=true);   
       rotate ([90,0,0]) translate ([-73.5,0,0]) cylinder(6,5,5,center=true);  

       rotate ([90,0,0]) translate ([-67.5,0,0]) cube([20,4,6],center=true);  
     }
     translate ([0,0,0]) cylinder(10,60,60,center=true);
     translate ([0,0,-5])    cylinder(6,82,82,center=true); 
     rotate ([90,0,0]) translate ([0,3.5,57.5]) cylinder(40,1,1,center=true);  

     rotate ([90,0,0]) translate ([73.5,1,0]) cylinder(10,1,1,center=true); 
     rotate ([90,0,0]) translate ([-73.5,1,0]) cylinder(10,1,1,center=true); 

    }
}

module mirrorh() {
difference(){
  union(){
    cylinder(4,20,20);    
    rotate ([90,0,0]) translate ([0,-1,-4]) cylinder(10,4.5,4.5);  
  }  
    translate ([0,0,2]) cylinder(4,17.5,17.5);
    rotate ([90,0,0]) translate ([0,-1,-3]) cylinder(20,0.75,0.75);  
    rotate ([00,0,0]) translate ([0,-2,-20]) cylinder(20,1.3,1.3);     
  }
}

module ConnectorToLshapeNew() {

    difference(){
        union() {
       translate ([0,41,75]) cube([14,30,4],center=true); 
        translate ([0,48,78]) cube([10,15,10],center=true); 
    }  
        rotate ([90,0,0]) translate ([0,140,-50])    cylinder(4,64,64,center=true); 
                translate ([0,31,50.5]) cube([10,8,60],center=true);      
    }
}

module CameraHolderLshape() {
    difference(){
          translate ([0,15,15]) cube([10,40,4],center=true);       
          translate ([0,0,0]) cylinder(20,1.4,1.4);  
    }
    difference(){
     //  translate ([0,31,43.5]) cube([10,8,60],center=true); // 60 mm
         translate ([0,31,26.5]) cube([10,9.5,27],center=true); // 30 mm
        translate ([0,31,21]) cylinder(20,2,2);   

    }   
}


module ConnectorToLshape() {
    difference(){
        union() {
       translate ([0,41,75]) cube([10,28,4],center=true); 
        translate ([0,48,78]) cube([10,15,10],center=true); 
    }
        translate ([0,31,65]) cylinder(20,1.4,1.4);   
        rotate ([90,0,0]) translate ([0,140,-50])    cylinder(4,64,64,center=true);    
    }  
}

module cameraHolder(){
  difference(){
    union(){
       translate ([0.0,0,-0.5]) cube([25,26,2],center=true);
       translate ([-10,0,-0.5]) cube([40,4,2],center=true) ;        
       translate ([10.,10.5,-4.5]) cylinder(3.6,2.5,2.5); 
       translate ([10.,-10.5,-4.5]) cylinder(3.6,2.5,2.5); 
       translate ([-2.65,10.5,-4.5]) cylinder(3.6,2.5,2.5); 
       translate ([-2.65,-10.5,-4.5]) cylinder(3.6,2.5,2.5);  
       translate ([-25,0,0]) rotate ([90,0,0])  cylinder(4,8,8,center=true);      
    }   
    translate ([-1.3,0,-0.5]) cube([8,8,5],center=true); 
    translate ([10.,10.5,-8.5]) cylinder(20,0.7,0.7); 
    translate ([10.,-10.5,-8.5]) cylinder(20,0.7,0.7);
    translate ([-2.65,10.5,-8.5]) cylinder(20,0.7,0.7);
    translate ([-2.65,-10.5,-8.5]) cylinder(20,0.7,0.7);
    translate ([-25,0,0]) rotate ([90,0,0])  cylinder(5,2,2,center=true);  
  } 
}

module LaserAttachToWire () {
   difference(){
  union(){
    cylinder(10,4.5,4.5,center=true); 

     translate ([20,0,0]) cylinder(6,5,5,center=true); 
     translate ([10,0,0])  cube([20,4,6],center=true);   
  }  
    rotate ([0,0,0]) translate ([0,0,-3]) cylinder(20,0.75,0.75,center=true);  
      rotate ([90,0,0]) translate ([0,0,-4.5]) cylinder(15,1.3,1.3,center=true);  
translate ([20,0,-4]) cylinder(20,1.,1.,center=true);   
  }
}

// Uncomment the module that you want to print


//PlateJoint();
//PlatformLeg();
//filamentHSquaredEx();
//ScreenHolder() ;
//ScreenHRound();
//mirrorh();
//ConnectorToLshapeNew();
//ConnectorToLshape();
//cameraHolder();
//LaserAttachToWire ();

Step 1: Preparing the Metalic Breadboard Style Platform

The construction involves preparing a rectangular-shaped breadboard-style platform using two perforated metal plates measuring approximately 60x200 mm. The plates can be bought cheaply in a hardware shop. You can look for plates longer than 200 mm. I even found plates 900 mm long. If you have the shorter ones, you can connect the shorter ones with a 3D-printed connector (openSCAD module: PlateJoint).

Each plate is raised using eight 3D-printed support legs (openSCAD module: PlatformLeg). The legs are attached to the platform using M4 screws. The same screw is used to hold also the 3D-printed wire support part (openSCAD module: filamentHSquaredEx) in one of the metal plate ends. This part consists of three squared blocks with small holes for the wire and a perpendicular screw hole that is used to hold the wire in place with a M2 short screw.

As shown in the figure, at the other end of the first plate, you need to add the 3D-printed screen support (openSCAD module: ScreenHolder) to the other end of the same plate. Also, in this case, the two screws are used to attach the under legs.

At the same end of the second plate, you can also attach the raspPi camera support (openSCAD module: ScreenHolder) if you plan to use it.

Step 2: Prepare the Circular Screen

  • Print the screen holder ring (openSCAD module: ScreenHRound) and affix a circular cut translucent paper screen to the opposite end of the metal plate. This screen serves as the canvas for your Lissajous patterns.
  • Secure the ring to its support on the platform using an L-shaped holder (openSCAD module: ConnectorToLshapeNew).
  • Finally, attach the red laser module board to the support located on the screen ring (see Figures). The horizontal rotation of the laser board is utilized to focus the beam on the mirrors and adjust its reflection onto the screen, providing essential adjustability for creating various patterns.

Step 3: Adding the Metal Wire

  • The 3D-printed mirror support (openSCAD module: mirrorh) is designed to accommodate the 20 mm mirror in the circular holding depression.
  • Attach the mirror support to the metal wire and secure it with an M2 screw to prevent it from sliding along the wire (see Figure).
  • The metal wire can be either straight or bent into the desired shape, similar to the different models of Kaleidophone described by Wheatstone. This device allows experiments with multiple wires bent in various shapes to observe complex Lissajous patterns (see Figure).
  • Insert the end of the wire opposite the mirror attachment into the central wire support hole and secure it with a lateral M2 screw.

Step 4: Mount Pi Camera (Optional)

  • Begin by 3D printing the orientable L-shaped connector (openSCAD module: ConnectorToCamera) and fastening it to the support mounted in step 1 on the metallic plate using a short M2 screw.
  • Next, 3D print the horizontal support for the tiltable holder for the Pi camera (openSCAD module: CameraHolderLshape) and secure it on top of the L-shaped connector.
  • Then, 3D print the camera holder file (openSCAD module: cameraHolder) and use two small screws to attach the Pi Camera to the holder. Affix the holder with the camera to the horizontal support using a short screw and secure the other side with a nut. Finally, connect the L-shaped connector to the horizontal support using another screw. The final assembly is depicted in the figure.
  • Mount the entire assembly on the plate by screwing it to the camera support.


In the last Figure, the complete setup is shown. The laser module uses a 5V power bank, and the Raspberry Pi Zero is connected to the Pi Camera.

Two wires with mirrors on the left side are inserted in the wire holder. The two round magnets attached to the top of one of the wires vary the mass distribution and, hence the momentum of inertia of the wires that might affect the length of the oscillation period. This works well, in particular with the more complex bent wire.

Step 5: Exploring Lissajous Figures

To create Lissajous patterns on your KaleidophoneScope, follow these steps:


  1. Please turn on the red laser pointer and adjust its direction to shine the laser beam onto the circular mirror.
  2. Observe the reflected laser beam dancing on the circular screen. You'll notice intricate patterns forming as the mirror's position changes.
  3. Experiment with bending and reshaping the iron wire to alter the patterns. You can also adjust the laser pointer's angle to create various effects.
  4. Capture the mesmerising Lissajous patterns using a camera with shutter control or a smartphone with suitable apps. The attached video shows an example of pattern captures in slow motion using an iphone 6.

Step 6: Exploring Sound Pattern

  • The KaleidophoneScope can be used to visualize also sound vibrations. For this purpose, you need an inexpensive portable speaker.
  • First, open the speaker and remove the membrane speaker with its electronic component attached from the case.
  • Connect the speaker to the Raspberry Pi USB port using a jack-to-USB connector.
  • Secure with a thin tape ribbon, a 20 mm mirror on the top of the membrane microphone of the speaker, and position it on the first metallic plate, as shown in the figure.
  • 3D print the laser module support (openSCAD module: LaserAttachToWire).
  • Screw the lase module to the support.
  • Secure it to the metalling wire, as shown in the figure.
  • Bend the wire and rotate the module until the laser beam is reflected by the mirror on the speaker on a wall or large screen in front of the device. It is possible to use the small round screen, but using a farther screen enlarges the vibrations, allowing a better visualization.

Step 7: Generate and Visualize Sound Tone Using Raspberry Pi

The sound is generated by the simple Python program provided in the attachment. To use it, you need to install the sounddevice library.

sudo apt-get install portaudio19-dev
pip install sounddevice

You also need that the numpy and matplotlib libraries are installed. Then, you can run the code as

python PLayNoiseTKReduced.py

A simple Tk interface shown in Figure 1 will allow you to generate sounds of assigned frequency and duration. it is also possible to generate sine, square, triangular, and random waveforms. The program also allows one to plot 5 periods of the waveform.

I have added three examples produced using a frequency of 440 (the note A4) using all the waveforms.

Step 8: Conclusions

The KaleidophoneScope device presented in this Instructable exemplifies the captivating fusion of mathematics, science, and art. The enchanting world of oscillations, as showcased by Lissajous-Bowditch curves, invites us to appreciate the aesthetic allure embedded in scientific phenomena. Building your own KaleidophoneScope allows you to explore many physics and computer science areas, such as optics, electronics, and vibration phenomena. The device also offers the opportunity for further extension. For example, the red spot coordinates on the screen can extracted using a computer vision algorithm, and then the trajectory can be analyzed. For this purpose, it is possible to implement a program on Raspberry Pi that automatically captures and analyzes the position of the laser spot. If you are interested in these further developments, visit my website for updates.

Make Some Noise Contest

Participated in the
Make Some Noise Contest