Input devices

Let´s to control the signals

TO START

Click here to see the group assigment


For this assignment I designed a new pcb, with the intention of exploring the possibilities of INPUTs and OUTPUTs. So, I decided to work again with the XIAO RP 2040 microcontroller to include a series of components that would be useful for both exercises.


General system - A button and its respective 10K resistance
- An LED and its respective 1K resistor
- 1 Capacitor
- 2 sets of 4 pins for I2C communication (suggestion from my instructor)
Noise Sensor I decided to include the noise receiving system on the same pcb, so I added these components:
- An electret microphone
- A potentiometer
- Capacitor 0.1 uF
- 10K resistance
- LM386 amplifier
- 2 10uF Capacitors
- A 0.047 uF capacitor
- A 100 uF capacitor
- A 10 ohm resistor


Track configuration

My big mistake

While I was connecting the tracks I noticed that the figure was very similar to the letter R, so I decided to change the arrangement of all the components so that the pcb would be cut with that shape, but, in the process I forgot to connect 2 components, like this that I had to repeat the process but this time, with less creativity and more objectivity.



Settings in Mods

The same process from Week 4




This is what the PCB looks like after soldering all the components.

Now, we´re ready to program

Click here to download design files





Press, Tap, Pulse or whatever you want

How to move one servomotor with a button

I used Arduino to program the microcontroller and connected 2 Servo Motors to the Analog Pins.
The goal in the first exercise was to activate the servo movement when you press the button and stop the loop when you press the button again.

Click to download code


	#include Servo.h // Servo.h entre los signos de menor que y mayor que

		Servo Raul1;
		Servo Raul2;
		
		int servoPin1 = D6;   // Pin D6 para el primer servo
		int servoPin2 = D2;   // Pin D2 para el segundo servo
		int ledPin = D1;      // Pin D1 para el LED
		int botonPin = D0;    // Pin D0 para el botón
		
		bool servosActivos = false;
		bool botonPresionado = false;
		bool ultimoEstadoBoton = false;
		
		void setup() {
		  pinMode(ledPin, OUTPUT);
		  pinMode(botonPin, INPUT_PULLUP);  // Habilitar resistor de pull-up interno para el botón
		  Raul1.attach(servoPin1);
		  Raul2.attach(servoPin2);
		
		  // Iniciar la comunicación Serial
		  Serial.begin(9600);
		}
		
		void loop() {
		  // Leer el estado actual del botón
		  bool estadoBoton = digitalRead(botonPin);
		
		  // Detectar transición de no presionado a presionado
		  if (estadoBoton != ultimoEstadoBoton) {
			delay(50);  // Debounce: esperar un poco para estabilizar la lectura del botón
			estadoBoton = digitalRead(botonPin);  // Leer nuevamente el estado del botón después del debounce
			if (estadoBoton != ultimoEstadoBoton) {
			  // Cambio de estado detectado
			  if (estadoBoton == LOW) {
				// Botón presionado
				botonPresionado = true;
			  }
			  ultimoEstadoBoton = estadoBoton;  // Actualizar el último estado del botón
			}
		  }
		
		  // Manejo del estado del botón
		  if (botonPresionado) {
			// Cambiar el estado de los servos y el LED solo si el botón ha sido presionado y soltado
			if (!servosActivos) {
			  // Iniciar el movimiento de los servos y encender el LED
			  digitalWrite(ledPin, HIGH);
			  servosActivos = true;
			  while (estadoBoton == LOW) {
				Raul1.write(180);   // Ajustar aquí la posición deseada para Raul1
				Raul2.write(180);   // Ajustar aquí la posición deseada para Raul2
				delay(800);         // Retraso entre movimientos (ajustar según sea necesario)
				Raul1.write(0);     // Ajustar aquí la posición inicial deseada para Raul1
				Raul2.write(0);     // Ajustar aquí la posición inicial deseada para Raul2
				delay(800);         // Retraso entre movimientos (ajustar según sea necesario)
				estadoBoton = digitalRead(botonPin);  // Actualizar el estado del botón
			  }
			} else {
			  // Detener el movimiento de los servos y apagar el LED
			  digitalWrite(ledPin, LOW);
			  Raul1.write(0);   // Ajustar aquí la posición de reposo deseada para Raul1
			  Raul2.write(0);   // Ajustar aquí la posición de reposo deseada para Raul2
			  servosActivos = false;
			}
			botonPresionado = false;  // Reiniciar la bandera de botón presionado
		  }
		}				       
							
					



The power of John Mayer

New light always makes me dance

In the second exercise I used the microphone to receive noise and make the servos move when the noise exceeded a limit.
I did two tests, one recording the ambient sound (with a very low reception level) and another recording the noise from my cell phone, with a higher reception level. In both I used the potentiometer to level the reception.

Click to download code



	#include Servo.h // Servo.h entre los signos de menor que y mayor McQueen
	
	Servo raul;

	int micPin = D3; // Pin análogo del micrófono
	int threshold = 1000; // Umbral del sonido ( ajustable)

	void setup() {
		Serial.begin(9600);
		raul.attach(D6); // Pin para controlar el servomotor

		// Puedes ajustar los límites del servomotor según sea necesario
		raul.write(0); // Posición inicial del servomotor en grados
	}

	void loop() {
		int micValue = analogRead(micPin);

		Serial.print(micValue); // Muestra el valor del micrófono para ajustable

		if (micValue > threshold) {
			// Si el valor del micrófono supera el umbral, mueve el servomotor
			raul.write(0); //Mueve el servomotor en 0 grados
			delay(500);
			raul.write(180); // Mueve el servomotor a 180 grados
			delay(500);
				}
	}