More selected projects

Moving in Spaces

Elliot Brown

Moving in Spaces is a mirrored apparatus that allows viewers to evaluate their movements in relation to the space around them. Viewers see how their movements correspond to others within the space. The reflections from the apparatus allow the space to be seen in alternative ways. The arrangement of the apparatus corresponds to the slight unpredictability of the reflections, however, this allows the viewer to understand how their configuration within the space has created consequences. As a result, this changes the viewers understanding of how the space operates. 

Audience engagement

I wanted the viewer to be able to consider the space around them and understand their relationship to their situation. Through the piece being interactive, I wanted the mirrors to change based on how the viewer is situated in the space. This aimed to allow them to see how their movements have consequences in the space leading to a greater comprehension of their spatial situation. By allowing viewers to realise that their actions in the space have consequences, allowed connections between different elements of the space. The fragmented structure allows for different perspectives to come about. 

I think it was important for the viewer to be able to focus on the reflections presented in the mirrors rather than the fact that they moved. This is to try and highlight my ideas about people understanding their situation in the space rather than having animatronic mirrors that follow people through the space. When setting out to create my piece I hadn't fully grasped the importance of how the mirrors moved in response to motion in order to portray my ideas. It was through tests and experimentation that allowed me to find a balance to help guide my viewer into a more considered interaction based on the speed of the mirrors. 

  • gallery-image
  • gallery-image
  • gallery-image
  • gallery-image
  • gallery-image
  • gallery-image
  • gallery-image
  • gallery-image
  • gallery-image
  • gallery-image
  • gallery-image
  • gallery-image
  • gallery-image
  • gallery-image

Background

I was particularly inspired by the writings of Manuel Castells and the work of Olaf Ellison [1] [2]. Both of these were useful in helping me explore my ideas with the understanding of perspective and space. I wanted to further this with ideas around how people understand themselves in relation to other elements within the space. With Ellison's work, New York City Waterfalls' scaffolding was used to give a sense of familiarity, and the flow of water gave a sense of time passing [3]. This allowed a viewer to understand their situation within the environment. Also, Marry Martin's piece Inversions and Anish Kapoor's mirrored pieces both show how the space around the object is altered based on the sculpture being there [13] [7]. These are the sorts of ideas I wanted to explore, but based on using the flows within the space to try and reflect this composition. With it being an interactive piece, I wanted to demonstrate how the flows within the space could allow viewers to understand they have created consequences within the space. These consequences were to allow for a different understanding about their spatial situation.

Working with motors

In order for me to carry out this project, I had to go through a number of processes and iterations in order to get to my final result. I started the production process by knowing that I needed to create a mechanical device that could turn a mirror 180 degrees, in response to motion. I quickly created a prototype with a servo and an openFrameworks app that made a piece of cardboard move from 0 to 180 degrees.

From this, I discovered that a stepper motor would be a better approach in order for me to move a greater amount of weight. It also allowed me to move a mirror a precise number of steps and have more flexibility in the speed. I started using a stepper motor controlled with A4988 stepper driver. This was required to give the motor the power from the power supply and the driver power from the 5v power from the microcontroller and help specify the direction and steps. I found a useful guide online to help me with this process using my Arduino [4]. With this driver I could limit the current, this was important in using my motors correctly. I had to make sure I was using enough current to move the weight of the mirrors but not too much so the driver or the motor would be damaged.

I did go through some tests and noticed that my motors got very hot and would almost burn if touched. This was a combination of my current being too high and using a high voltage. My motors were rated for 0.4 Amps and a voltage between  12v - 24v [8]. I took the decision to use the minimum voltage to reduce heat concerns and never exceed 0.4 Amps. It was important that I used drivers that could handle more than 0.4 Amps so as not to work with them at their capacity or exceed it resulting in breaking the drivers. I also had issues with current dropping as it gets used up in the circuit. I discovered the importance of using capacitors to help even the flow of current which helped this issue. But I also needed to increase the current limiting as the current would be reduced over the circuit. In the end, I knew with 6 motors on each board and the weight from the mirrors I had to up the current limiting to 0.35 Amps for each driver to allow the mirrors to move smoothly. Though, if I was just moving one mirror on a motor the current limiting only needed to be 0.14 Amps, but this was depended on the weight of the mirrors. This process of getting my motors working in the correct configuration took a lot of tests. I learned about the relationship between current, voltage and other electrical issues I had. 

Using the stepper motor driver also allowed me to use micro stepping with the motor. This increases the resolution of each step, therefore requiring more steps to complete a full rotation. This provided smoother movement of the motor and allowed me to create ramping of my motors to provide a more natural movement for when the mirrors were interacted with. I found this based on tests and feedback that this was a better way to see the mirrors as they moved more slowly, guiding my viewers to a slower interaction, allowing them to see more of what was reflected.

Controlling the mirrors

I started with controlling my stepper motor from an Arduino. I communicated with the motor using serial with my openFrameworks app. This is the system I presented in my work in process.

From doing this I realised the difficulty I would have in scaling up the motors as I couldn't really use more than 4 motors on one Arduino. There would also be difficulties in addressing all the motors I needed to from one computer using serial. Using the feedback from the work in progress I found that using a Raspberry Pi Zero would be a better approach as I could network with a pi to address a lot of motors. There was also more flexibility with the GPIO ports on the Raspberry Pi [11]. Initially, I attempted to use a PWM board to connect my stepper motors, but I realised this wasn't the correct approach. From this, I did some research with communicating with a pi via ssh in the command line and I then worked on creating a python script to interface directly with the GPIO ports to be able to control the steps and direction of my stepper motors.

I then incorporated PyOSC to create an OSC server within my python script which allowed me to send OSC messages from my openFrameworks app to my raspberry pi over localhost OSC [12]. This set up worked really well in being able to communicate with multiple Raspberry Pi's and multiple stepper motors all at the same time by sending one value to all of them. I had tested sending different values over OSC based on the address but this isn't what I wanted in my piece as I wanted all the mirrors to show the average motion within the space. 

Making the Metal Attachments

After my tests with a ball and socket attached to a servo, I realised I needed a better approach. I needed to create an attachment to place on top of my stepper motor which I could attach a mirror too. I quickly excluded 3d printing due to being concerned about weight that may be applied on the plastic. Also, I wanted to ensure I had a strong grip on the shaft of the stepper motor to prevent mirrors coming off the motors. Therefore, decided metal would be the best option. My first design was to get a long metal rod, extending the shaft of the motor and welding it to the back of a metal sheet. After some iteration and talking to people at the metal workshop I created an attachment with a short rod welded to the bottom of a metal sheet. I then created a side hole with a grub screw to grip onto the shaft of the stepper motor. The grub screw worked best on a flat or depressed surface, so therefore the stepper motors I ended up using had one flat side on the shaft of the motor. This allowed for a good grip on my motor from the grub screw. By going through tests with the original metal attachment I realised that the weight meant that the motor would run inefficiently. Far too much current was used to move the attachment alone not even including the mirror. Therefore, I created more attachments with a much smaller welded sheet that I could still stick a mirror to which improved its efficiency. 

Making of the boxes and boards

After my work in progress exhibit, where I showed one mirror responding to motion, I was keen to test multiple mirrors at once. I therefore, wanted to create a boxed shelf to house 4 stepper motors and use the attachments I had created, to attach the mirrors to. I initially tried to make the box manually by cutting different bits of wood to create the design but realised this could be done on the laser cutter. This gave me the advantage of creating precise holes for the shaft of my stepper motor and the screw holes. I used the data sheet to get the values and created an Illustrator file to make the holes in the correct places and the box with the square patterned edges and I glued this box with clamps. This was a very useful box for testing the movements of my mirrors and to think about the configuration of the mirrors being mounted. But from these tests with the 4 mirrors housed this way I decided to create individual boxes. This aesthetic decision was to allow me to create a more scattered and fragmented distribution of mirrors to allow the viewers to see the space in different perspectives.  The individual boxes were created with t-slot joint made from designs on makercase [5]. The t-slot allowed me to construct the boxes with as screw and nut. This made the boxes easy to construct and take apart if required. It also allowed me to access my stepper motor and driver from the front if anything needed replacing. I also improved the hole for the shaft of the motor. This was so I could slot in the small rod on the metal attachment into the hole to allow for a more secure connection. With this new design I was concerned that the boxes may distract viewers away from the mirrors. I therefore, decided to sand the boxes which gave the boxes a cleaner appearance and took away the darkened edges. I had to design a custom back piece for one end of the box to slot into, so the boxes could be mounted against the board. This process allowed me to create a prototype of how the box would be mounted. I had to sand the top and bottom set of screws on the back of the box and had to create holes to fit into the board. This was so the motor box would sit flush against the back board. 

After making this prototype I went on to create the final large 2.4x1.2 boards. I created a laser cut template indicating where I needed the holes so I could slot in and screw in my box to the correct location. I used my layouts that I created in InDesign to get real world measurements of where the template would need to be placed on the board. I had chosen to arrange the boxes for the mirrors so they wouldn't be at head height. This was to try and focus the viewers attention on how individuals could interpret the space differently, based on the flows within the space rather than just an individual viewer being reflected.

I had considered the possibility of painting the two boards and that introduced various possibilities from blending in with the surrounding wall or highlighting the panels as panels in a different colour or texture. In the end, I decided not to paint them because I wanted to separate them from the wall and to create natural reflections of the wooden panel rather than seeing a lot of the same colour being reflected. I think painting it white for instance would have just made the piece an extension of the wall and other neutral colours like grey or black would have created darker reflections that may have clashed with the wooden boxes that housed the motors. I think if the tone of the wood for the back board had matched the tone of the boxes this would have appeared more consistent and yet allowed for separation away from the wall. But unfortunately, this wasn't quite the case but I still think this lead to interesting affects allowing different contrasts to occur. The arrangement with having the boards separated with a gap in between was intentional to create two vertical strips rather than joining them which would have created a square from the two boards that would have been at odds with the rectangular shape of the back white wall and this was more consistent with portrait shape. I feel that the framing of the work within the wooden panels asserted the identity of the piece, whilst punctuating the sensation of walking in front of the panels. Incidentally, I had also considered included a third panel but felt that created unnecessary complexity with little gain in terms of aesthetic effect. I think another approach could have been to add more mirrors to the two boards, but I was conscious of not wanting to reduce the fragmented effect. If I were to explore this further I think I would have experimented more with different finishing techniques and look at alternatives to create a separation from the wall it is presented on while giving a clean unobtrusive look. 

OpenCV code

I originally started to try and find the right approach to track movement along the x-axis of a camera feed. I thought I would use this to map this to the motions of my stepper motor. I  originally had decided that I needed to be able to track specific features of motion. I thought at the time not having the ability to track specific features with optical flow was a disadvantage. I had thought I needed to track motion based on it being a person. Optical flow only gave me the ability to see generic motion in the video frame. I looked at using full body, and face haarcascades to track motion but I found this quite unreliable to keep track of motion. I also looked at using blob detection. But I found this unreliable because it wasn't always able to pick up a consistent blob of motion. 

From these experiments, I thought the best approach would be to use optical flow to find the areas of motion but then convert that calculation to an absolute IplImage. I then was able to create a new image from this data, and then run this through blob detection. This resulted in creating a rather overcomplicated program.

When I went through tests with multiple people I quickly realised that the mirrors would be quite sensitive and move in quite unpredictable ways. I resolved some of this by thresholding some of the values.

However, I still had issues when there were multiple people moving as the mirrors moved erratically. I tried to combat this by trying to track blobs of motion over successive frames so I knew that when movement was found it would only track a couple of blobs and therefore the motion would be consistent. But I realised through this system, complications would emerge. In the gallery setting there would be more than a couple of people in front of the mirrors. Therefore, it wouldn't be clear how the interaction worked. I had thought I could map certain blobs to different segments of mirrors, but also realised this wouldn't be clear to a viewer with how this relationship had occurred. This also didn't match up to my original intentions with my piece. I wanted to create an apparatus to track the flows within the space and the consequences of movement within the space. By segmenting the motion in the space it becomes closed off from flows in the space and is too specific. 

I therefore, decided I needed to use average motion in the space to make my idea more clear. With this in mind, I reverted back to using generic average optical flow with ofxCV [9]. This allowed me to take all the motion in from a camera and process the direction from a negative or positive value. I could also get the amount of motion from the magnitude of the value. I mapped these values to the number of steps required for my stepper motor to turn the amount I needed. As I was tracking motion, I only wanted the value the motion ended up at, not all the motion in-between. Having all the values resulted in too many values being sent to the motors, and created a backlog of values for the motor to move. I therefore, created a system to gather motion values into a vector as values remained higher than the previous motion value. As soon as values became lower than the previous motion value the system knew that the motion had reached its final position so therefore it would get the last value added to the vector and return only that value. I also filtered these values with a one pole filter to reduce fluctuations in values. This resulted in a delay in the movement of my mirrors which worked well when there were many people in front of the mirrors as there wasn't a backlog of values for the motors. This also worked well with the ramping up and down of the motors. This type of motion allowed viewers to be more considered when moving through the space as the mirrors moved more slowly and naturally. I had attempted some experiments with splitting the video in half and processing the average motion on both sections, but I had decided this wasn't useful as it resulted in more complicated movements that were harder for a viewer to understand how they had been created. In the end I think the motion processing worked well with the mirrors, however, I think the response was slightly too slow. This was more noticeable with fewer people in the space but worked well when there was more motion within the space.

Wiring of the boards and physical computing

I had to go through different processes in order to transfer my prototypes for my motors from a bread board to a system that was modular but had secure connections. Initially, I thought it was important to crimp female connectors to my stepper motors. This was to allow me to slot my stepper motor securely on to some male headers. This gave me the ability of having a secure, reliable connection while also being easy to disconnect and reconnect. I had the idea of connecting my stepper motor directly to my driver. However, realised that the other wires I needed to add were not as secure as the stepper motor connection. I therefore, decided to use strip board and solder a set of female headers to the board. This was so I could connect and disconnect my driver. I also added 4 male headers in order for me to connect my stepper motor to. Initially, in my small tests of this system I found it didn't work. This was because I shorted the driver because I connected both parts of the driver together. I resolved this by using a Dremel to break the conductivity between both sides of the board. With these tests I realised the importance of a multimeter in testing my circuits. This is something I carried on using throughout to ensure connections were good for individual parts of my circuit. These small tests also demonstrate the issues I had with lots of wires, in terms of me getting confused by them and the wires getting tangled. With this in mind, I decided to colour code wires for their specific purpose so I could identify the purpose of the connection quickly, allowing for faster debugging of issues. It also told me that I needed to use connectors in order to be able to disconnect areas of the circuit, therefore, allowing me to test individual parts allowing me to know what areas were known good so they were unlikely to be the factor if they didn’t work in the rest of the circuit.

Using connectors was a very time-consuming process. I crimped well over 200 individual wires. The black connectors also required me to solder a part of the wire to the metal part of the connector to ensure the connection was solid as the crimp was designed for a slightly thicker wire. But when I got to a stage where I was having to debug 6 stepper motors at a time it was incredibly useful being able to disconnect and reconnect several wires at a time. I was also able to set up parts of the circuit on their own to ensure that that part was known to be good. 

During the creation of the second board I used chock block which was also very useful. This is a  simple screw connection where you put a bit of wire through one end and then another bit of wire through the other. By screwing each end tight it connected both wires and kept them secure. This made separating bits of the circuit easier to manage and made debugging easier as the circuit could become more modular and was more serviceable. Using chock block everywhere instead would have been a quicker process to install, but where the connectors came in useful was in connecting and disconnecting. In the future, I would think about the amount of times wires would be connected and disconnected in order to decide between connectors or chock block. Certainly, the strip board for the stepper drivers and the stepper motors was really useful to have a connector as they were disconnected and reconnected a large number of times. Whereas chock block was really useful in areas like in the strip board for the 5v power for the raspberry pis and the power supply as they didn't need to be disconnected as frequently but allowed me to create a more tidy wire distribution, rather than the tangles I had in my tests. 

Throughout the process of my project I built it up in stages and ran different test to understand the problems I may face when it would be a much larger system. This was a really important approach as I could solve some of my issues before hand and make plans for them, such as using connectors and in carrying out tests with individual boxes to create templates.  ​

Evaluation 

I had to respond to different feedback that I had throughout the process. With the comments from work in progress I wanted to more clearly show the intentions of my idea. Particularly with how my piece wasn't about tracking people through the space and more a reflection of the flows within the space and how people moving through a space creates consequences in the space and allow for a different understanding about how they relate to the space. From this I chose to arrange the mirrors on different angles to allow them to reflect different perspectives simultaneously, creating a fragmented composition of the space. When deciding the layout of my mirrors for the final build I also chose to scatter my mirrors to allow for different perspectives to occur. With the arrangement of the scattering I tried to arrange them so they were unlikely to be at head height because I wanted to reflect the flows within the space rather than an individual person. The arrangement of the mirrors I found gave a different perspective to different people depending on their situation, I think this enforced the idea of the piece giving you a different apprehensions of the space based on your situation in the space. 

I think it was good to see how viewers were mostly considered when interacting with my piece. As viewers saw that the mirrors moved smoothly and not particularly fast, there attention was more concerned with the reflections on the mirrors and how that came about. While I don't think everyone who viewed my piece understood it exactly as I intended it, I think most understood the relationship between movement in the space and a change in perspective presented by the mirrors. 

As the mirrors were not at head height it was difficult for the viewer to see themselves in the mirrors. It was interesting to see some viewers try and force themselves to be reflected in the mirrors, and lead to interesting engagement with the piece as they had to play with their placement within the space.

In some cases, I think the mirrors reacted too slowly. It was relatively good in most cases but when viewers moved quickly through the space a viewer may have already passed the mirrors completely before the mirrors moved to show that change in the space. This lead to there not always being a direct relationship between someones movements and the mirrors moving. I think it was important that there was a small delay, as it lead to viewers interactions being more considered. The viewer was able to see the consequences they had caused in the new reflections. This also allowed the mirrors to move more smoothly and they were less jerky in their response. But I think in order to create a better relationship between movement and the response of the mirrors I could improve it by reducing the delay between the movement occurring and that being represented by the mirrors. Storing the values of motion in a vector and then taking the last motion value caused this delay. A better solution may have been to get every 10th value and then calculate the difference between the current and the previous value so the motor only moved that difference. This may have lead to a more responsive interaction. However, the reason I didn't go for that approach during the project is that through tests I found that this introduced an issue with too many values being sent to the motors creating a backlog of movements to be outputted and making the piece appear chaotic. But perhaps more experimentation was needed in finding the correct amount of delay but also a good response time. 

Overall, I was pleased with how my piece turned out and was perceived. I had to learn a lot and develop my existing knowledge significantly to achieve my end result. This can be seen in areas like transitioning from using and Arduino to control my stepper motors, to leaning how to use a Raspberry Pi to interface with my openFrameworks program and my motors correctly. Also with my scaling up of my project and having to debug a lot of new electrical issues that I hadn’t come across before. I also believe that I worked well to make different aesthetic decisions in order to communicate my ideas from my proposal. I acted based on feedback on the work in progress along with small tests that I conducted to find the correct arrangement of the mirrors as well as the motion of the mirrors. ​

References and bibliography

[1] Castells, M. (2005). Space of Flows, Space of Places: Materials for a Theory of Urbanism in the Information Age. [online] Design.epfl.ch. Available at: http://design.epfl.ch/wiki/tiki-download_file.php?fileId=502 [Accessed 11 May 2017].

[2] Eliasson, O. (2009). Playing with space and light. [online] Ted.com. Available at: https://www.ted.com/talks/olafur_eliasson_playing_with_space_and_light [Accessed 11 May 2017].

[3] Eliasson, O. (2008). The New York City Waterfalls. [online] Vimeo. Available at: https://vimeo.com/64185833 [Accessed 11 May 2017].

[4] HowToMechatronics. (2015). How To Control Stepper Motor with A4988 Driver and Arduino. [online] Available at: http://howtomechatronics.com/tutorials/arduino/how-to-control-stepper-motor-with-a4988-driver-and-arduino/ [Accessed 11 May 2017].

[5] Labs, J. (2017). MakerCase - Easy Laser Cut Case Design. [online] Makercase.com. Available at: http://makercase.com [Accessed 11 May 2017].

[6] Learn.adafruit.com (2017). Turning your Raspberry PI Zero into a USB Gadget. [online] Available at: https://learn.adafruit.com/turning-your-raspberry-pi-zero-into-a-usb-gadget/overview [Accessed 11 May 2017].

[7] Lisson Gallery. (2017). Anish Kapoor | Artists | Lisson Gallery. [online] Available at: http://www.lissongallery.com/artists/anish-kapoor [Accessed 11 May 2017].

[8] Nema 17 Stepper Motor Datasheet. [online] Available at: http://uk.stepperonline.com/download/pdf/17HS13-0404S.pdf [Accessed 11 May 2017].

[9] ofxCv - GitHub. (2017). kylemcdonald/ofxCv. [online] Available at: https://github.com/kylemcdonald/ofxCv [Accessed 11 May 2017].

[10] Osxfuse.github.io. (2017). FUSE for macOS. [online] Available at: https://osxfuse.github.io [Accessed 11 May 2017].

[11] Pinout.xyz. (2017). Raspberry Pi GPIO Pinout. [online] Available at: https://pinout.xyz [Accessed 11 May 2017].

[12] Pyosc GitHub. (2017). ptone/pyosc. [online] Available at: https://github.com/ptone/pyosc [Accessed 11 May 2017].

[13] Tate. (2017). ‘Inversions’, Mary Martin, 1966. [online] Available at: http://www.tate.org.uk/art/artworks/martin-inversions-t01198 [Accessed 11 May 2017].

Gitlab and other links

A link to my Gitlab repository can be found here

Links to some specific areas:

CV code (used in piece)

Python code for stepper motor control via Raspberry Pi

My Raspberry Pi set up guide

Notebook scans

Project log

My blog that I updated throughout the project can be found at movinginspaces.tumblr.com