Semana 10

Esta semana continuaremos con la exploración del API de arduino y algunas características de C/C++.

Ejercicio 1

Hasta ahora hemos explorado varias maneras de interactuar con dispositivos externos por medio de puertos de entrada salida usando:

  • Salidas digitales
  • Entradas digitales
  • Entradas analógicas

Ahora en este ejercicio vamos a explorar las salida analógicas. Dichas salidas, en principio son digitales pero moduladas en ancho de pulso o de PWM. Para ello usamos esta función:

1
 analogWrite(pin, value)

Que produce una señal cuadra en pin con un duty cycle dado por value, como se muestra en la figura de este sitio.

Analice el siguiente ejemplo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
 #define ledPin 3
 #define analogPin 0

 uint16_t counter = 0;
 int8_t direction = 1;

 void setup() {
     Serial.begin(115200);
     pinMode(ledPin, OUTPUT);
 }


 void loop() {
     analogWrite(ledPin, counter);
     counter = (counter + direction);
     if(counter == 0) direction = 1;
     if(counter == 129) direction = -1;

     Serial.println(counter);
     delay(20);

 }

Ejercicio 2: RETO 1

Monte un circuito (en tinkercad) y realice un programa que permita controlar el brillo de un LED mediante un potenciómetro.

Tenga que presente que el valor del potenciómetro va de 0 hasta 5V y este se convierte a un valor entre 0 y 1023, es decir, la conversión se realiza en 10 bits.

COnsidere que el valor del PWM puede ir de 0 a 255. Para garantizar que value estará en ese rango podemos emplear una de las funciones matemáticas que ofrece el API de arduino:

1
 map(value, fromLow, fromHigh, toLow, toHigh)

En este caso map toma fromLow y lo convierte a toLow y fromHigh y lo convierte a toHigh. Los valores intermedios son mapeados de manera lineal.

NOTA: para el ESP32 se debe usar una función diferente para el PWM. Ver el este enlace.

Ejercicio 3:

Analice el siguiente código:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
 void setup() {
    Serial.begin(115200);

 }


 void loop() {

   uint8_t counter = 20;

   counter++;

   Serial.println(counter);

   delay(100);

 }

Compare el código anterior con este:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
 void setup() {
    Serial.begin(115200);

 }


 void loop() {

   static uint8_t counter = 20;

   counter++;

   Serial.println(counter);

   delay(100);

 }

Ahora compare con este otro código:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
     uint8_t counter = 5;

 void setup() {
    Serial.begin(115200);

 }


 void incCounter() {
   static uint8_t counter = 10;
   counter++;
   Serial.print("Counter in incCounter: ");
   Serial.println(counter);

 }

 void loop() {
   static uint8_t counter = 20;
   counter++;
         Serial.print("Counter in loop: ");
   Serial.println(counter);
   incCounter();
   Serial.print("Counter outside loop: ");
   Serial.println(::counter);
   ::counter++;
   delay(500);
 }

¿Qué podemos concluir?

Ejercicio 4

Analizar el siguiente ejemplo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
 const uint8_t ledPin =  3;
 uint8_t ledState = LOW;
 uint32_t previousMillis = 0;
 const uint32_t interval = 1000;

 void setup() {
   // set the digital pin as output:
   pinMode(ledPin, OUTPUT);
 }

 void loop() {
   uint32_t currentMillis = millis();

   if (currentMillis - previousMillis >= interval) {
     previousMillis = currentMillis;
     if (ledState == LOW) {
       ledState = HIGH;
     } else {
       ledState = LOW;
     }´
 }

Ejercicio 5: RETO 2

Realice un programa que encienda y apague tres LEDs a 1 Hz, 5 Hz y 7 Hz respectivamente utilizando la técnica vista en el ejercicio 4.