Concept

For our project, our intention was to create an ambient flower that slowly moved when it was in its peaceful state. We decided to keep the background and the back of the petals the same so that the focus was on the reveal of the flower. We included tulle in the center to add to that surprise and painted the metal to blend in the non-organic parts. When disturbed, the flower ‘closes up’ and plays a high-pitched noise to relate to the partner that the peace has been disturbed.

The Outcome

Elise’s Flower Proxy Body (close-up)
Full Enclosed View of Elise’s Flower Proxy Body with Suspension Vine and Bluefruit
Kanvi’s Flower Proxy Body Responding to Elise’s Loud Noise

In the video, we can see the red light light behind Kanvi’s flower when Elise makes a loud noise and hear the tones play in reaction.

As it can be seen, our flowers emerged differently as we worked independently to build them. Elise’s flower lived inside an enclosure, with a vine leading up and out, and lights reflecting on the green fabric. Kanvi’s grew out of the enclosure, with a suspended servo and flower, with the lights shining through the green fabric.

The Code

import time
import sys
import math
import board
import pwmio
from adafruit_circuitplayground import cp
from adafruit_motor import servo

import supervisor

pwm = pwmio.PWMOut(board.A5, duty_cycle=0, frequency=50)
actuator = servo.Servo(pwm, min_pulse=1000, max_pulse=2000)

cp.pixels.brightness = 0.3

noiseDetectedPhrase = "bang!"

def check_noise():
    if cp.sound_level >= 300:
            print(noiseDetectedPhrase)

def react():
    cp.pixels.fill((255, 0, 0))
    cp.play_tone(2000,.5)
    cp.play_tone(1950, .1)
    cp.play_tone(1875, .07)
    cp.play_tone(1900, .3)
    time.sleep(10)

while True:

    for angle in range(90, 135, 1):
        cp.pixels.fill((0, 255, 0))
        actuator.angle = angle
        time.sleep(0.02)

        check_noise()

        if supervisor.runtime.serial_bytes_available:
            line = sys.stdin.readline()
            if line.contains(noiseDetectedPhrase):
                react()

    for angle in range(135, 90, -1):
        cp.pixels.fill((0, 255, 0))
        actuator.angle = angle
        time.sleep(0.02)

        check_noise()

        if supervisor.runtime.serial_bytes_available:
            line = sys.stdin.readline()
            if line.contains(noiseDetectedPhrase):
                react()

Issues

Some issues we encountered included the bridge not sending messages from Kanvi’s to Elise’s flower as well as having the metals tendons staying in place, which really only worked well with one for Elise’s side. There was also the change from an opening and closing flower to just a subtly moving and shifting flower, almost as if it was moving in the wind.

Conclusion

For the fact that it mostly worked, the flowers looked beautiful and the movement was peaceful. The dynamic of having a “bang!” translate across the bridge was also fun. When we heard it work, we both were very excited. We also really enjoyed the beauty of having different flowers and enclosures, because this brought character to each of our proxy bodies. Ways to improve would be to have fully functional flowers, with an improved open-close mechanism, and be able to have the response go both ways.