Semana 8 Unidad 3 - sensores y actuadores SPI

Trayecto de acciones, tiempos y formas de trabajo

Actividad 4

  • Fecha: agosto 26 de 2020 - 10 a.m.
  • Descripción: trabaja en el reto
  • Recursos: ingresa al grupo de Teams
  • Duración de la actividad: 1 hora 40 minutos.
  • Forma de trabajo: grupal

Para transmitir información de variables usando un protocolo binario necesitas obtener los bytes que componen una variable.

¿Cómo conseguir cada uno de los bytes que componen la variable?

  • Para responder esta pregunta usa el programa ScriptCommunicator.
  • Considera este código:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
void setup() {
  Serial.begin(115200);

}

void loop() {
  static uint16_t x = 0;

  if (Serial.available()) {
    if (Serial.read() == 0x73) {
      Serial.write((uint8_t)( x & 0x00FF ));
      Serial.write( (uint8_t)(x >> 8 ));
    }
  }
}

Nota cómo la operación (x >> 8 ) permite conseguir el byte de mayor peso del entero no signado de 16 bits x.

  • Ahora intentemos la misma técnica para conseguir los bytes de un número en punto flotante.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
void setup() {
    Serial.begin(115200);
}

void loop() {
    float num = 1.1;

    if (Serial.available()) {
        if (Serial.read() == 0x73) {
            Serial.write((uint8_t)( num ));
            Serial.write( (uint8_t)(num >> 8 ));
            Serial.write( (uint8_t)(num >> 16 ));
            Serial.write( (uint8_t)(num >> 32 ));
        }
    }
}

El 1.1 en punto flotante será el 3f 8c cc cd

  • ¿Pudiste compilar el programa?

Nota que al intentar compilar, el compilador te dirá que no es posible aplicar el operador >> al tipo float.

  • Debemos entonces aplicar una técnica diferente para obtener los bytes del float:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
void setup() {
    Serial.begin(115200);
}

void loop() {
    // 45 60 55 d5
    // https://www.h-schmidt.net/FloatConverter/IEEE754.html
    static float num = 3589.3645;

    static uint8_t arr[4] = {0};

    if(Serial.available()){
        if(Serial.read() == 0x73){
            memcpy(arr,(uint8_t *)&num,4);
            Serial.write(arr,4);
        }
    }
}

En este caso estamos guardando los 4 bytes que componen el float en un arreglo, arr, para luego transmitir dicho arreglo.

  • ¿En qué orden estamos transmitiendo los bytes, en bigEndian o en littleEndian?
  • Para leer los datos en la aplicación en Unity necesitaremos hacer la acción opuesta, es decir, a partir de los 4 bytes debemos construir el número en punto flotante. Para hacerlo investiga esta clase de C#.
  • En qué orden debemos organizar los bytes para poder hacer la conversión?

Actividad 5

  • Fecha: agosto 26 a agosto 28 de 2020
  • Descripción: experimentación para el reto
  • Recursos: mira el ejercicio
  • Duración de la actividad: 5 horas
  • Forma de trabajo: individual con solución de dudas en tiempo real

Ejercicio

Estudia la actividad anterior en detalle. Experimenta de la misma manera con Kodular. ¿Cómo puedes recibir bytes en kodular? y una vez tengas los bytes cómo haces para convertir a un número en punto flotante? DEBERÍAS resolver este problema antes de seguir. Ten presente que deberás ser ingenioso porque es posible que la solución no sea tan obvia.

Actividad 6

  • Fecha: agosto 28 de 2020 - 10 a.m.
  • Descripción: trabaja en el reto
  • Recursos: ingresa al grupo de Teams
  • Duración de la actividad: 1 hora 40 minutos.
  • Forma de trabajo: grupal

En esta sesión define cómo vas a realizar el RETO, plantea la arquitectura, experimenta con partes que aún no sabes cómo funcionan. RESUELVE tus dudas en tiempo real con el docente.