Dania González Sanabria: Difference between revisions

From Medien Wiki
(text)
mNo edit summary
 
(82 intermediate revisions by the same user not shown)
Line 1: Line 1:
This project fuses nature, technology, and music into a unique blend. Six plants, equipped with gas sensors, guide motors that pluck guitar strings, each producing an individual tone. The result is a living symphony, where the natural signals of plants shape a new fusion of nature, sound and the digital world.
[[File:DSC05528 a.jpg|thumb|800x800px|<small>“''Y de mortales engaños, Y de sublimes dolores''”, exhibition “The Plant Plant” Winterwerkschau Bauhaus University Weimar. 2025.</small>]]''<small>'''...'''</small>''


===== ... =====
''<small>'''Yo sé de nombres extraños'''</small>''


===== Yo sé de de nombres extraños =====
''<small>'''De las plantas y las flores,'''</small>''


===== De las plantas y las flores, =====
''<small>'''Y de mortales engaños'''</small>''


===== Y de mortales engaños =====
''<small>'''Y de sublimes dolores.'''</small>''


===== Y de sublimes dolores. =====
<small>'''''…'''''</small>


===== … =====
<small>''(I know strange names''</small>


===== (I know strange names =====
<small>''Of plants and flowers,''</small>


===== Of plants and flowers, =====
<small>''And of deadly cheatings''</small>


===== And of deadly cheatings =====
<small>''And of sublime pains.)''</small>


===== And of sublime pains.) =====
José Martí. “Versos Sencillos”. Fragment.
José Julián Martí Pérez (Havana, 1853 - Dos Ríos, 1895) was a Cuban politician, diplomat, poet, essayist, journalist and philosopher, founder of the Cuban Revolutionary Party and organizer of the Cuban War of Independence, during which he died in combat. He is considered the initiator of literary modernism in Latin America. He is considered the national hero of the Republic of Cuba, and his ideals of independence and anti-colonialism have been used by the Cuban regime to politically indoctrinate the Cuban people. But these same ideals of nationalism and independence also serve as a guide and inspiration to the opposition that desires a Cuba without repression, a just country and a republic “with everyone and for the good of everyone”.




<small>José Martí. “Versos Sencillos”, Fragment.</small>


<small>(José Julián Martí Pérez (Havana, 1853 - Dos Ríos, 1895) was a Cuban politician, diplomat, poet, essayist, journalist and philosopher, founder of the Cuban Revolutionary Party and organizer of the Cuban War of Independence, during which he died in combat. He is considered the initiator of literary modernism in Latin America. He is considered the national hero of the Republic of Cuba, and his ideals of independence and anti-colonialism have been used by the Cuban regime to politically indoctrinate the Cuban people. But these same ideals of nationalism and independence also serve as a guide and inspiration to the opposition that desires a Cuba without repression, a just country and a republic “with everyone and for the good of everyone”).</small>


Concept development


Inspired by some exemplary works presented during the first two seminar sessions, Hanna quickly came up with the idea of having plants play the guitar together. I was immediately fascinated by this idea and very grateful that Hanna wanted to collaborate with me. Together, we developed the concept further week by week. I documented and organized this thought process and the resulting ideas on a Miro board:


<small>Miro Board</small>
====== '''Concept''' ======
'''The lemon tree is a resilient plant that bears fruit even when it is dying.''' In this project, the lemon tree is a symbol of the members and generations of my Cuban family, it is also an inheritance of sentimental and moral values in it.


Initially, the plan was for two plants to interact and control the guitar. Later, we considered having a guitar and a computer-generated voice play music together, but we eventually abandoned this idea. In the end, we settled on the concept of six plants, each playing a single guitar string, controlled by the gas emissions of the respective plant. This idea was then presented during the midterm presentation. Hanna had created an initial version of the code, while I had already started working on the structural implementation of a mount for the motors and had designed a construction plan for it.
This piece is inspired by my grandfather, Justo Manuel González. The last words he wrote, when he was losing his faculties, were an autobiography recounting the enormous work he did, mostly linked to the Cuban revolutionary process social and economic tasks. Abuelo Justo, who was a “national vanguard” of the Cuban Revolution, worked with honesty, sacrifice, and faith, to create a good society for his family, his community, and his country. He died in 2021 in Cuba after several months of being a victim of medical abandonment and negligence since his country became corrupted and neglectful of its people. He never lived the system and country he dreamed of, even when he worked and fought for it his whole life.  


== Technical implementation ==
The death of the old lemon tree also speaks about the Cuban context, its history, and its current sociopolitical crisis that generates physical and sentimental ruptures of its most vulnerable families. It has affected especially the humble elderly people who were the hardworking generations who created and supported the revolutionary Cuban process that became corrupted. Now, those persons are the most abandoned by the same social system to which they gave their faith and the effort of their lives. This piece is a tribute to them.
[[File:DSC05527 abc.jpg|center|thumb|1080x1080px]]


=== Embedded systems development ===
====== Description ======
During our project, we used Visual Studio Code and Arduino to program and control motors based on sensor data. Our first challenge was to determine how the motor should move. We aimed to ensure that the motors moved only once per activation, producing a single tone. To achieve this, I created an initial test code to establish how to instruct the motor to move right when it was on the left and vice versa.
The project is an archive of three generations of lemon trees in my family, using photos, writings, sketches, dried branches and fruits, and new plants.  


Next, we needed to develop a pattern to simulate incoming sensor data. The second test code introduced random numbers to help us simulate a trigger value for the motors. This was combined with our previous motor movement code to create a preliminary response system.
The archive starts with the death of the old lemon tree in my parents’ home in Cuba, depicting its analogy with my grandfather´s death and life. I decided to show a photo of the still-full-of-lemon branch of the dead old tree and also a photo of when that tree completely fell down.  


I then worked on enabling two motors to move independently. To accomplish this, I implemented two different random numbers so that each motor would move at a different "trigger value". Adjustments were made to delay times to introduce a more natural, randomized effect.
I used the branches collected from that tree, making them move when the visitor approached close to them. It was also shown a dried lemon from that tree.


To acquire real sensor data, we opted for an MQ-2 gas sensor, which detects combustible gases. We initially attempted to retrieve analog output values from one sensor. Since the raw sensor data wasn’t as representative as we needed, I decided to convert the readings into ppm (parts per million) for more meaningful analysis.
The archive also shows how my parents in Cuba, after the death of the old lemon tree, planted a new lemon tree in their yard. It also shows how I, a few years after escaping from Cuba, decided to start planting new lemon trees, as a way of approach to my family and roots despite distance and exile.


The next step was to replace our previously used random numbers with actual gas concentration values measured by the sensor. I then expanded the system to incorporate six sensors and six motors, which required multiple iterations to perfect. A major challenge was implementing all sensor values, motors, and their corresponding variables into a function that allowed each sensor-motor pair to operate independently. We replaced the general delay time in the loop with millis() to enhance achieve that.
In the installation, I also set up a house-shaped terrarium with the new lemon tree plants.


After measuring the gas concentrations produced by plants over time, I made several adjustments to optimize the installation. Each motor was assigned an individual trigger value based on the gas readings from its respective sensor. Since sensor readings were taken at short intervals and did not fluctuate significantly, motors would have been triggered too frequently, leading to excessive noise. To mitigate this, I introduced individual delay times for each motor before they could be triggered again. To create a more natural and less predictable sound pattern, I introduced a "random factor". The motor's delay time was then multiplied by this factor which was recalculated with each sensor reading, ensuring a more varied and pleasant auditory experience.
[[File:Dania González Sanabria sketch 1.jpg|thumb|1116x1116px|<small>Sketch 1, Lemon tree archive, Dania González Sanabria</small> ]]


Debugging print commands were added to the code to help monitor sensor functionality when connected to a computer. These were primarily for troubleshooting and not necessary for the final public installation. Although the code could have been optimized for brevity, I chose to keep it more detailed to maintain a clear overview of all sensors, motors, and timing adjustments. In the end, our system successfully produced tones in a random frequency, creating a dynamic and immersive experience.


=== Technology ===


* ESP32
* MQ-2 sensor for combustible gas
* SG90 9g Micro Servo


*
*
*
*


=== Code ===


===== For the platformio.ini: =====
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
lib_deps = roboticsbrno/ServoESP32@1.0.3
monitor_speed = 9600


===== Fort he main.cpp: =====
 
#include <Arduino.h>
 
// include the servo library
 
  #include <Servo.h>
 
 
 
====== Embedded systems ======
In the project, were implemented two systems of sensors and actuators controlled by Arduino boards, and programmed in Visual Studio Code and Arduino programs.   
   
   
//  timing
[[File:Imagen de WhatsApp 2025-01-09 a las 12.58.12 ce313d3b.jpg|alt=Sketch 2, Lemon tree archive, Dania González Sanabria|thumb|685x685px|<small>Sketch 2, Moving Branches, 1rst system. Lemon tree archive, Dania González Sanabria</small>]]
  unsigned long currentTime = 0;
 
 
 
<u>1rst System:</u>
 
For the <u>moving branch</u>, it was set a system with an HC-SR04 Ultrasonic Distance Sensor controlling a 15 kg Digital Servo Motor, through an Arduino Nano and a connective board.  
 
When the spectator approaches 60 cm of the branches, the servo motor starts to turn from 0 to 18 degrees, making the branches, attached to it, start to move. If the spectator approaches at a closer distance (40 cm), the servo motor turns from 0 to 58 degrees, making the branches move a little bit more, and slower.  
 
The Servo Motor received an extra supply of energy from an MB-102 3.3V/5V Power Module plugged into electricity and connected to the board of the 2nd System.
   
   
  unsigned long lastTimeA = 0;
 
unsigned long lastTimeB = 0;
           
unsigned long lastTimeC = 0;
 
unsigned long lastTimeD = 0;
     
unsigned long lastTimeE = 0;
[[File:DSC05550 a.jpg|alt=“Y de mortales engaños, Y de sublimes dolores”. Dania González Sanabria.“The Plant Plant” exhibition. Winterwerkschau Bauhaus University. 2025.|thumb|477x477px]]
unsigned long lastTimeF = 0;
[[File:Imagen de WhatsApp 2025-02-22 a las 18.10.54 bab076a4.jpg|left|thumb|435x435px|<small>1st System board setting</small>]]
 
 
 
1rst System
 
Devices:
 
* Arduino Nano
* Connective board
* HC-SR04 Ultrasonic Distance Sensor
* Miuzei 15 kg Digital Servo Motor
* Connection cables
 
 
 
 
 
(The written code is at the end of the page)
 
 
 
 
 
 
 
<u>2nd System:</u>  
 
The <u>terrarium</u> had a <u>humidifier system</u> inside. It was made with a Capacitive Soil Moisture Sensor connected to an Arduino Nano and a connective board. When the soil got drier (over value 400 read by that sensor, whose values are approximately this: wet is < 400, dry is > 400), a 5V Relay Module also connected to the board, activated a 5V Humidifier made with a piezoelectric. When the soil got humid again (under value 400) the humidifier stopped until the soil got dry again. The relay and humidifier received an extra supply of energy from an MB-102 3.3V/5V Power Module plugged into electricity. [[File:Imagen de WhatsApp 2025-02-22 a las 03.09.15 5fec5717.jpg|alt=Sketch 3, Lemon tree archive, Dania González Sanabria|thumb|1095x1095px|<small>Sketch 3, Terrarium,  2nd System, Lemon tree archive, Dania González Sanabria</small>]]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
[[File:Imagen de WhatsApp 2025-02-22 a las 18.10.54 b6eb9130.jpg|thumb|397x397px|<small>2nd System board setting</small>|left]]
[[File:CD 08636 raw.jpg|alt=Photo: Christian Doeller. “Y de mortales engaños, Y de sublimes dolores”. Dania González Sanabria.“The Plant Plant” exhibition. Winterwerkschau Bauhaus University. 2025.|thumb|390x390px|<small>Photo: Christian Doeller</small>]]
 
 
 
2nd System
 
Devices:
 
* Arduino Nano
* Connective board
* Capacitive Soil Moisture Sensor
* 5V Relay Module
* 5V Humidifier made with a piezoelectric
* MB-102 3.3V/5V Power Module
* Connection cables
 
 
 
(The written code is at the end of the page)
 
 
 
 
 
====== '''Exhibition''' ======
The installation was displayed with a set of mini LED spotlights. Those were connected to a timer that switched the lights on during the daytime and switched the lights off during the nighttime. That created a proper light environment for the tiny lemon trees during the days of the exhibition.
 
[[File:CD 08765 raw.jpg|thumb|1110x1110px|<small>Photo: Christian Doeller</small>[[File:CD 08618 raw.jpg|alt=Photo: Christian Doeller. “Y de mortales engaños, Y de sublimes dolores”. Dania González Sanabria.“The Plant Plant” exhibition. Winterwerkschau Bauhaus University. 2025.|thumb|1121x1121px|<small>Photo: Christian Doeller</small>|center]]|center]]
[[File:CD 08622 raw.jpg|alt=Photo: Christian Doeller. “Y de mortales engaños, Y de sublimes dolores”. Dania González Sanabria.“The Plant Plant” exhibition. Winterwerkschau Bauhaus University. 2025.|thumb|<small>Photo: Christian Doeller</small>|745x745px|center]]
[[File:CD 08874 raw.jpg|alt=Photo: Christian Doeller. “Y de mortales engaños, Y de sublimes dolores”. Dania González Sanabria.“The Plant Plant” exhibition. Winterwerkschau Bauhaus University. 2025.|thumb|<small>Photo: Christian Doeller</small>|693x693px]]
 
 
 
 
   
   
const int baseServoDelayTimeA = 17300;
const int baseServoDelayTimeB = 11020;
const int baseServoDelayTimeC = 15400;
const int baseServoDelayTimeD = 12800;
const int baseServoDelayTimeE = 8400;
const int baseServoDelayTimeF = 6300;
float randMultiplier = 1.0;
long randNumber;
//sensors
const float sensorTriggerValueA = 700;
const float sensorTriggerValueB = 520;
const float sensorTriggerValueC = 650;
const float sensorTriggerValueD = 880;
const float sensorTriggerValueE = 950;
const float sensorTriggerValueF = 1100;
float getSensorValuePpm (int sensorPin);
const int sensorA = 36;
const int sensorB = 39;
const int sensorC = 34;
const int sensorD = 35;
const int sensorE = 32;
const int sensorF = 33;
float gasValueSensorA = getSensorValuePpm (sensorA);
float gasValueSensorB = getSensorValuePpm (sensorB);
float gasValueSensorC = getSensorValuePpm (sensorC);
float gasValueSensorD = getSensorValuePpm (sensorD);
float gasValueSensorE = getSensorValuePpm (sensorE);
float gasValueSensorF = getSensorValuePpm (sensorF);
//servos
const int servoPinA = 19;
const int servoPinB = 18;
const int servoPinC = 05;
const int servoPinD = 17;
const int servoPinE = 16;
const int servoPinF = 04;
Servo servoA;
Servo servoB;
Servo servoC;
Servo servoD;
Servo servoE;
Servo servoF;
boolean isLeftA;
boolean isLeftB;
boolean isLeftC;
boolean isLeftD;
boolean isLeftE;
boolean isLeftF;
//function declarations
void playSound(unsigned long &lastTime, int sensorPin, Servo &servo, float &gasValueSensor, boolean &isLeft, int baseServoDelayTime, float sensorTriggerValue);
float getSensorValuePpm (int sensorPin);
void setup() {
  analogSetAttenuation(ADC_11db);
  Serial.begin(9600);
  servoA.attach(servoPinA);
  servoA.write(30);
  isLeftA = true;
  servoB.attach(servoPinB);
  servoB.write(30);
  isLeftB = true;
  servoC.attach(servoPinC);
  servoC.write(30);
  isLeftC = true;
  servoD.attach(servoPinD);
  servoD.write(30);
  isLeftD = true;
  servoE.attach(servoPinE);
  servoE.write(30);
  isLeftE = true;
  servoF.attach(servoPinF);
  servoF.write(30);
  isLeftF = true;
}
void loop() {
  currentTime = millis();
  playSound(lastTimeA, sensorA, servoA, gasValueSensorA, isLeftA, baseServoDelayTimeA, sensorTriggerValueA);
  playSound(lastTimeB, sensorB, servoB, gasValueSensorB, isLeftB, baseServoDelayTimeB, sensorTriggerValueB);
  playSound(lastTimeC, sensorC, servoC, gasValueSensorC, isLeftC, baseServoDelayTimeC, sensorTriggerValueC);
  playSound(lastTimeD, sensorD, servoD, gasValueSensorD, isLeftD, baseServoDelayTimeD, sensorTriggerValueD);
  playSound(lastTimeE, sensorE, servoE, gasValueSensorE, isLeftE, baseServoDelayTimeE, sensorTriggerValueE);
  playSound(lastTimeF, sensorF, servoF, gasValueSensorF, isLeftF, baseServoDelayTimeF, sensorTriggerValueF);
}
//functions
void playSound(unsigned long &lastTime, int sensorPin, Servo &servo, float &gasValueSensor, boolean &isLeft, int baseServoDelayTime, float sensorTriggerValue){
 
  //generate multiplier and adjust delaytime
  randMultiplier = 0.7 + (random(0, 341) / 100.0);
  int adjustedDelayTime = baseServoDelayTime * randMultiplier;
  if (currentTime - lastTime >= adjustedDelayTime){
      // check if timing works
      Serial.print("Random delayTime");
      Serial.println(adjustedDelayTime);
      Serial.println("Triggering sensor reaading");
      gasValueSensor = getSensorValuePpm(sensorPin);
      // check sensor value
      Serial.print("Sensor Value: ");
      Serial.println(gasValueSensor);
        if (gasValueSensor > sensorTriggerValue){
          Serial.println("Triggering servo");
          // move servo to play sound
            if (isLeft == true){
              servo.write(0);
              isLeft = false;
              Serial.println("right");
            }
            else{
              servo.write(30);
              isLeft = true;
              Serial.println("left");
            }
            Serial.println("Servo moved. Last Time updated.");
          }
          // update lastTime
          lastTime = currentTime;
        }
}
float getSensorValuePpm (int sensorPin) {
  float voltage = analogRead(sensorPin) * (5.0 / 1023.0);
  float RS_air = 10.0;
  float RL = 2.0;
  float ratio = RL / RS_air;
  float RS = ((5.0 / voltage) - 1.0) * RL;
  float ppm = 1000.0 * pow((RS / RS_air), ratio);
  return ppm;
}


== Manual construction ==
I was responsible for the structural and mechanical implementation of the project since my strengths lie far more in this area than in writing computer code. Additionally, unlike Hanna, I have the necessary resources at home to craft.


We needed a mount that would allow the servo motors to hover above the guitar strings so they could pluck them individually. The servo motors had to be positioned at a certain distance from each other to avoid interfering with one another when striking the strings. We had already identified this issue through a cardboard prototype. Since guitar picks were to be attached to the motors, increasing the radius of the strike, it made sense to always leave two strings between those being played.


I decided to attach two motors to one bar. The construction sketch can be seen here:


Since I couldn’t guarantee millimeter-precise construction, and factors like the surface, variations in the way the picks were attached, or different motor models could create height differences, it was necessary to allow for fine adjustments to the height of the mount. For this, I used special adjustment screws that allow the height of the mounting beams to be individually adjusted on both sides. Unlike regular screws, these have two types of threads: the upper thread remains fixed in the wood, while the lower thread can be screwed in and out like a standard screw. This enables precise millimeter-level height adjustments to fit the conditions.


Additionally, the sensors had to be connected to the breadboard. To do this, I soldered cables—each consisting of three wires—of sufficient length to each of the six sensors. I then soldered a connector to each wire to facilitate easy attachment to the breadboard.


*
*
*
*


== The Plants ==


* Hyacinth
* Euphorbia
* Fern
* Begonia
* Peperomia
* Alocasia


== '''Exhibition''' ==


=== Concept ===
The idea was to place the guitar on a table, with a clothing rack positioned behind it, from which the six plants would hang. These included a hyacinth and an alocasia in bags, a fern and a pepper plant in small greenhouses, as well as a begonia and a moldy euphorbia in screw-top jars.


The cables and the breadboard were intentionally installed with minimal cable management, keeping them clearly visible to emphasize the DIY aesthetic.


The lighting needed to be bright enough to provide sufficient light for the plants without being too harsh. Hanna brought her grow lights, which perfectly illuminated the exhibition niche where our work was displayed.


We chose the niche as our exhibition space because it allowed us to maintain a necessary distance from other sound-based projects. Additionally, this setup ensured that the work could only be viewed from the front, preventing visitors from accidentally bumping into it and disturbing any components.


=== Preparations and setup ===
“''Y de mortales engaños, Y de sublimes dolores''” was displayed in the exhibition of the class “The Plant Plant” during the Winterwerkschau of the Bauhaus University Weimar, Germany. Winter Semester 2024 – 2025.
Hanna and I met in Weimar on the Saturday before the exhibition to attach the picks to the motors and test the interaction of all components. This allowed us to check the overall functionality of both the code and the construction. Fortunately, everything worked as intended, with only a few minor tasks remaining.
 
 
 
 
 
 
 
 
====== Code ======
<u>1rts Board:</u>
 
<u>main.cpp:</u>
 
<small><code>#include <Servo.h></code></small>
 
<small><code>#define TRIG_PIN 2 // Pin Trig ultrasonic sensor</code></small>
 
<small><code>#define ECHO_PIN 3 // Pin Echo ultrasonic sensor</code></small>
 
<small><code>Servo myservo;  </code></small>
 
<small><code>float ang = 18; // Oscilation basic angle</code></small>
 
<small><code>int distanciaPersona = 60;  // first umbral</code></small>
 
<small><code>int distanciaCercana = 40;  // second umbral</code></small>
 
<small><code>void setup() {</code></small>
 
<small><code>Serial.begin(9600);</code></small>
 
<small><code>pinMode(TRIG_PIN, OUTPUT);</code></small>
 
<small><code>pinMode(ECHO_PIN, INPUT);</code></small>
 
<small><code>myservo.attach(9);</code></small>
 
<small><code>}</code></small>
 
<small><code>void loop() {</code></small>
 
<small><code>long duration;</code></small>
 
<small><code>int distance;</code></small>
 
<small><code>// send ultrasonic pulse</code></small>
 
<small><code>digitalWrite(TRIG_PIN, LOW);</code></small>
 
<small><code>delayMicroseconds(2);</code></small>
 
<small><code>digitalWrite(TRIG_PIN, HIGH);</code></small>
 
<small><code>delayMicroseconds(10);</code></small>
 
<small><code>digitalWrite(TRIG_PIN, LOW);</code></small>
 
<small><code>// Read time of reply of eco and calculate distance</code></small>
 
<small><code>duration = pulseIn(ECHO_PIN, HIGH);</code></small>
 
<small><code>distance = duration * 0.034 / 2;  </code></small>
 
<small><code>Serial.print("Distancia: ");</code></small>
 
<small><code>Serial.print(distance);</code></small>
 
<small><code>Serial.println(" cm");</code></small>
 
<small><code>// Event 2: if distance is less than 30 cm, move</code></small>
 
<small><code>if (distance < distanciaCercana) {</code></small>
 
<small><code>  int maxAngulo = ang + 40;  // Increase oscilation range</code></small>
 
<small><code>  if (maxAngulo > 180) maxAngulo = 180; // Limit angle to 180°</code></small>
 
<small><code>  for (int pos = 0; pos <= maxAngulo; pos += 1) {</code></small>
 
<small><code>    myservo.write(pos);</code></small>
 
<small><code>    delay(15);</code></small>
 
<small><code>  }</code></small>
 
<small><code>  for (int pos = maxAngulo; pos >= 0; pos -= 1) {</code></small>
 
<small><code>    myservo.write(pos);</code></small>
 
<small><code>    delay(15);</code></small>
 
<small><code>  }</code></small>
 
<small><code>}</code></small>
 
<small><code>// Evento 1: if distancia is less than 60 cm but more or igual 40 cm</code></small>
 
<small><code>else if (distance < distanciaPersona) {</code></small>
 
<small><code>  for (int pos = 0; pos <= ang; pos += 1) {</code></small>
 
<small><code>    myservo.write(pos);</code></small>
 
<small><code>    delay(15);</code></small>
 
<small><code>  }</code></small>
 
<small><code>  for (int pos = ang; pos >= 0; pos -= 1) {</code></small>
 
<small><code>    myservo.write(pos);</code></small>
 
<small><code>    delay(15);</code></small>
 
<small><code>  }</code></small>
 
<small><code>}</code></small>
 
<small><code>// if no object, set the servo at 0°</code></small>
 
<small><code>else {</code></small>
 
<small><code>  myservo.write(0);</code></small>
 
<small><code>}</code></small>
 
<small><code>delay(500); // Tiny delay before next event</code></small>
 
<small><code>}</code></small>
 
<code><br /></code>
 
<u>2nd Board:</u>
 
<u>main.cpp:</u>
 
<code><small>#include <Arduino.h></small></code>
 
<code><small>int relay = 2;</small></code>
 
<code><small>void setup() {</small></code>
 
<code><small>  Serial.begin(9600);</small></code>
 
<code><small>  pinMode(relay, OUTPUT);      </small></code>
 
<code><small>  //digitalWrite(2,LOW);      </small></code>
 
<code><small>}</small></code>
 
<code><small>void loop() {</small></code>
 
<code><small>  int val;</small></code>
 
<code><small>  val = analogRead(A0); //CONECT sensor AL Analog 0</small></code>
 
<code><small>Serial.println(val); //print the value to serial port</small></code>
 
<code><small>if (val<400)</small></code>


Our plan was to hang the plants from a clothing rack. However, since two of the plants were potted in jars, suspending them proved to be a challenge. To solve this, I crafted wooden discs with holes through which we could thread wire, ensuring that the jars could be securely hung. Hanna also made some minor adjustments to our code.
<code><small>{</small></code>


On the Thursday before the exhibition, we finalized our setup. We darkened the window, adjusted the lighting, secured all components to the table to prevent any shifting during the exhibition, connected the sensors and motors, plugged in the power supply, set the timers, and fine-tuned the height of the mounting structure to ensure that each pick could strike its string and produce a pleasant sound.
<code><small>  Serial.println("desactivado");</small></code>


<small>(written by Fiene)</small>
<code><small>   digitalWrite(relay,HIGH);</small></code>  


*
<code><small>  } else {</small></code>
*
*


=== Winterwerkschau ===
<code><small>    Serial.println("activado");</small></code>
The Winterwerkschau was a great success for our project. Contrary to our initial concerns, the adhesive held up perfectly, keeping the picks securely attached to the motors for both days of the exhibition. As a result, all the strings could be continuously played without any issues.


When Hanna and I took our turn overseeing the exhibition, we were met with an incredible amount of interest and enthusiasm. Visitors were fascinated by our work, showering us with questions and curiosity. It was an incredibly rewarding experience that filled us with pride and reinforced our excitement about what we had created.
<code><small>    digitalWrite(relay,LOW);</small></code>


All the hard work had truly paid off, and seeing our project resonate with others made the effort even more worthwhile.
<code><small>}</small></code> 


<small>(written by Fiene)</small>
<code><small>  delay(500);</small></code>


*
<code><small>}</small></code>
*
*
*
*
*
*

Latest revision as of 12:55, 24 February 2025

...

Y de mortales engaños, Y de sublimes dolores”, exhibition “The Plant Plant” Winterwerkschau Bauhaus University Weimar. 2025.

Yo sé de nombres extraños

De las plantas y las flores,

Y de mortales engaños

Y de sublimes dolores.

(I know strange names

Of plants and flowers,

And of deadly cheatings

And of sublime pains.)


José Martí. “Versos Sencillos”, Fragment.

(José Julián Martí Pérez (Havana, 1853 - Dos Ríos, 1895) was a Cuban politician, diplomat, poet, essayist, journalist and philosopher, founder of the Cuban Revolutionary Party and organizer of the Cuban War of Independence, during which he died in combat. He is considered the initiator of literary modernism in Latin America. He is considered the national hero of the Republic of Cuba, and his ideals of independence and anti-colonialism have been used by the Cuban regime to politically indoctrinate the Cuban people. But these same ideals of nationalism and independence also serve as a guide and inspiration to the opposition that desires a Cuba without repression, a just country and a republic “with everyone and for the good of everyone”).


Concept

The lemon tree is a resilient plant that bears fruit even when it is dying. In this project, the lemon tree is a symbol of the members and generations of my Cuban family, it is also an inheritance of sentimental and moral values in it.

This piece is inspired by my grandfather, Justo Manuel González. The last words he wrote, when he was losing his faculties, were an autobiography recounting the enormous work he did, mostly linked to the Cuban revolutionary process social and economic tasks. Abuelo Justo, who was a “national vanguard” of the Cuban Revolution, worked with honesty, sacrifice, and faith, to create a good society for his family, his community, and his country. He died in 2021 in Cuba after several months of being a victim of medical abandonment and negligence since his country became corrupted and neglectful of its people. He never lived the system and country he dreamed of, even when he worked and fought for it his whole life.

The death of the old lemon tree also speaks about the Cuban context, its history, and its current sociopolitical crisis that generates physical and sentimental ruptures of its most vulnerable families. It has affected especially the humble elderly people who were the hardworking generations who created and supported the revolutionary Cuban process that became corrupted. Now, those persons are the most abandoned by the same social system to which they gave their faith and the effort of their lives. This piece is a tribute to them.

Description

The project is an archive of three generations of lemon trees in my family, using photos, writings, sketches, dried branches and fruits, and new plants.

The archive starts with the death of the old lemon tree in my parents’ home in Cuba, depicting its analogy with my grandfather´s death and life. I decided to show a photo of the still-full-of-lemon branch of the dead old tree and also a photo of when that tree completely fell down.

I used the branches collected from that tree, making them move when the visitor approached close to them. It was also shown a dried lemon from that tree.

The archive also shows how my parents in Cuba, after the death of the old lemon tree, planted a new lemon tree in their yard. It also shows how I, a few years after escaping from Cuba, decided to start planting new lemon trees, as a way of approach to my family and roots despite distance and exile.

In the installation, I also set up a house-shaped terrarium with the new lemon tree plants.

 
Sketch 1, Lemon tree archive, Dania González Sanabria







Embedded systems

In the project, were implemented two systems of sensors and actuators controlled by Arduino boards, and programmed in Visual Studio Code and Arduino programs.

 
Sketch 2, Moving Branches, 1rst system. Lemon tree archive, Dania González Sanabria


1rst System:

For the moving branch, it was set a system with an HC-SR04 Ultrasonic Distance Sensor controlling a 15 kg Digital Servo Motor, through an Arduino Nano and a connective board.

When the spectator approaches 60 cm of the branches, the servo motor starts to turn from 0 to 18 degrees, making the branches, attached to it, start to move. If the spectator approaches at a closer distance (40 cm), the servo motor turns from 0 to 58 degrees, making the branches move a little bit more, and slower.

The Servo Motor received an extra supply of energy from an MB-102 3.3V/5V Power Module plugged into electricity and connected to the board of the 2nd System.



 
1st System board setting


1rst System

Devices:

  • Arduino Nano
  • Connective board
  • HC-SR04 Ultrasonic Distance Sensor
  • Miuzei 15 kg Digital Servo Motor
  • Connection cables



(The written code is at the end of the page)




2nd System:

The terrarium had a humidifier system inside. It was made with a Capacitive Soil Moisture Sensor connected to an Arduino Nano and a connective board. When the soil got drier (over value 400 read by that sensor, whose values are approximately this: wet is < 400, dry is > 400), a 5V Relay Module also connected to the board, activated a 5V Humidifier made with a piezoelectric. When the soil got humid again (under value 400) the humidifier stopped until the soil got dry again. The relay and humidifier received an extra supply of energy from an MB-102 3.3V/5V Power Module plugged into electricity.

 
Sketch 3, Terrarium, 2nd System, Lemon tree archive, Dania González Sanabria












 
2nd System board setting
 
Photo: Christian Doeller


2nd System

Devices:

  • Arduino Nano
  • Connective board
  • Capacitive Soil Moisture Sensor
  • 5V Relay Module
  • 5V Humidifier made with a piezoelectric
  • MB-102 3.3V/5V Power Module
  • Connection cables


(The written code is at the end of the page)



Exhibition

The installation was displayed with a set of mini LED spotlights. Those were connected to a timer that switched the lights on during the daytime and switched the lights off during the nighttime. That created a proper light environment for the tiny lemon trees during the days of the exhibition.

 
Photo: Christian Doeller
 
Photo: Christian Doeller
 
Photo: Christian Doeller
 
Photo: Christian Doeller










Y de mortales engaños, Y de sublimes dolores” was displayed in the exhibition of the class “The Plant Plant” during the Winterwerkschau of the Bauhaus University Weimar, Germany. Winter Semester 2024 – 2025.





Code

1rts Board:

main.cpp:

#include <Servo.h>

#define TRIG_PIN 2 // Pin Trig ultrasonic sensor

#define ECHO_PIN 3 // Pin Echo ultrasonic sensor

Servo myservo;  

float ang = 18; // Oscilation basic angle

int distanciaPersona = 60;  // first umbral

int distanciaCercana = 40;  // second umbral

void setup() {

Serial.begin(9600);

pinMode(TRIG_PIN, OUTPUT);

pinMode(ECHO_PIN, INPUT);

myservo.attach(9);

}

void loop() {

long duration;

int distance;

// send ultrasonic pulse

digitalWrite(TRIG_PIN, LOW);

delayMicroseconds(2);

digitalWrite(TRIG_PIN, HIGH);

delayMicroseconds(10);

digitalWrite(TRIG_PIN, LOW);

// Read time of reply of eco and calculate distance

duration = pulseIn(ECHO_PIN, HIGH);

distance = duration * 0.034 / 2;  

Serial.print("Distancia: ");

Serial.print(distance);

Serial.println(" cm");

// Event 2: if distance is less than 30 cm, move

if (distance < distanciaCercana) {

  int maxAngulo = ang + 40;  // Increase oscilation range

  if (maxAngulo > 180) maxAngulo = 180; // Limit angle to 180°

  for (int pos = 0; pos <= maxAngulo; pos += 1) {

    myservo.write(pos);

    delay(15);

  }

  for (int pos = maxAngulo; pos >= 0; pos -= 1) {

    myservo.write(pos);

    delay(15);

  }

}

// Evento 1: if distancia is less than 60 cm but more or igual 40 cm

else if (distance < distanciaPersona) {

  for (int pos = 0; pos <= ang; pos += 1) {

    myservo.write(pos);

    delay(15);

  }

  for (int pos = ang; pos >= 0; pos -= 1) {

    myservo.write(pos);

    delay(15);

  }

}

// if no object, set the servo at 0°

else {

  myservo.write(0);

}

delay(500); // Tiny delay before next event

}


2nd Board:

main.cpp:

#include <Arduino.h>

int relay = 2;

void setup() {

  Serial.begin(9600);

  pinMode(relay, OUTPUT);      

  //digitalWrite(2,LOW);      

}

void loop() {

  int val;

  val = analogRead(A0); //CONECT sensor AL Analog 0

Serial.println(val); //print the value to serial port

if (val<400)

{

  Serial.println("desactivado");

   digitalWrite(relay,HIGH);

  } else {

    Serial.println("activado");

    digitalWrite(relay,LOW);

}

  delay(500);

}