Revisión del curso en línea sobre Arduino / Robótica de MIPT (segunda semana)


Continuamos publicando una descripción general del curso en línea "Construyendo robots y otros dispositivos Arduino", comenzando aquí .


Entonces, cuánto tiempo fue corto, terminó la segunda semana del curso en línea de robótica de MIPT . Francamente, la semana estuvo llena de varios temas.


Aquí hay una lista de muestra que me he asignado:


  • Divisor de voltaje. Usando un fotoresistor y un termistor
  • Señal analógica. Ancho de señal
  • Comunicación a través del puerto serie. Entorno de procesamiento
  • Señal digital. Botones y opciones de conexión. Resistencia pull-up
  • Expresiones lógicas, declaraciones if y else
  • Zumbador, barra LED, indicador de siete segmentos
  • Microcircuitos Inversor lógico 74HC04, Registro de desplazamiento 74HC595
  • Programas de depuración
  • Módulos externos
  • Una variante de un sistema de monitoreo listo para usar que muestra la temperatura y el nivel de luz en la escala LED, así como un altavoz que funciona cuando se excede cierta temperatura

Después de pasar con éxito la prueba y recopilar los esquemas propuestos de las lecciones, pensé en cómo mejorar este o aquel esquema o recopilar algo propio.



Lo primero que me vino a la mente fue la modernización del sensor de luz. La implementación propuesta en la lección simplemente tomó el valor del fotorresistor y lo envió al puerto serie.


La versión mejorada debe usar un indicador de siete segmentos para mostrar números del 0 (iluminación mínima) al 9 (iluminación máxima). El indicador debe estar conectado a través de un registro de desplazamiento. Deben usarse dos botones para establecer los niveles mínimo y máximo de iluminación. El registro de desplazamiento es necesario para no usar el pin Arduino en cada segmento, sino usar menos pines. De hecho, el registro de desplazamiento convierte la salida de datos en serie (un bit por unidad de tiempo) en paralelo (varios bits por unidad de tiempo). En nuestro caso, en lugar de siete pines Arduino, solo necesitamos tres.


En el editor de Fritzing, obtuve ese dispositivo.



De esta manera se ve en vivo.




Se tomaron como base esquemas para trabajar con un registro de desplazamiento y una fotorresistencia.


Tenga en cuenta que en el tablero, el fotorresistor está conectado de manera algo diferente que en el video tutorial: allí medimos el voltaje en el fotorresistor en relación con el suelo, y en el circuito eliminamos la caída de voltaje en relación con la fuente de alimentación. Esto se hace para simplificar un poco el programa: con un aumento en el nivel de iluminación, la resistencia de la fotorresistencia disminuye. Por lo tanto, a la misma corriente, la caída de voltaje disminuye. Por lo tanto, en la entrada analógica, cuanto mayor sea el voltaje, mayor será el nivel de iluminación y viceversa.


Ahora depende de usted finalizar el código fuente. Se utilizó el mismo programa como base para mostrar el valor en un indicador de siete segmentos.


Código del programa
// ,      #define DATA_PIN 13 #define LATCH_PIN 12 #define CLOCK_PIN 11 //  ,        #define BTN_MIN 3 #define BTN_MAX 2 // ,       #define SENS_PIN A5 //     ,   byte d0 = 0b01111101; byte d1 = 0b00100100; byte d2 = 0b01111010; byte d3 = 0b01110110; byte d4 = 0b00100111; byte d5 = 0b01010111; byte d6 = 0b01011111; byte d7 = 0b01100100; byte d8 = 0b01111111; byte d9 = 0b01110111; //        int min_light = 0; int max_light = 1023; //    int value; // ,  .  .  int output; //   int digit; void setup() { //     pinMode(DATA_PIN, OUTPUT); pinMode(CLOCK_PIN, OUTPUT); pinMode(LATCH_PIN, OUTPUT); //       Serial.begin(9600); //     pinMode(BTN_MIN, INPUT_PULLUP); pinMode(BTN_MAX, INPUT_PULLUP); } void loop() { //     value = analogRead(SENS_PIN); output = value; //    -    if (!digitalRead(BTN_MIN)) min_light = value; if (!digitalRead(BTN_MAX)) max_light = value - 10; //      if (value < min_light) output = min_light; if (value > max_light) output = max_light; //  ,      digit = map(value, min_light, max_light, 0, 9); //   Serial.println("Value: " + String(value) + " Output: " + String(output) + " Min: " + String(min_light) + " Max: " + String(max_light) + " Current : " + String(value) + " Digit: " + String(digit)); //      if (digit == 0) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d0); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 1) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d1); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 2) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d2); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 3) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d3); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 4) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d4); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 5) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d5); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 6) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d6); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 7) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d7); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 8) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d8); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 9) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d9); digitalWrite(LATCH_PIN, HIGH); } //       delay(10); } 

De las características, al establecer el nivel máximo de iluminación, tuvimos que restar alguna constante (max_light = value - 10), seleccionada empíricamente. Esto es necesario para evitar "vibraciones" en el nivel máximo de iluminación, ya que el valor de voltaje tomado del fotorresistor es inestable.


Compilamos el boceto, lo cargamos en el Arduino y lo verificamos.


Primero en el monitor de puerto ...




Y luego vivir



Como puede ver, el dispositivo funciona correctamente como se describe. Por supuesto, todavía hay margen de mejora, por ejemplo, puede agregar una señal de audio cuando la iluminación cae por debajo de un cierto nivel, lo que significa que debe encender iluminación adicional en el lugar de trabajo. También en el futuro será posible cambiar el programa en sí, utilizando matrices y funciones adicionales.


En conclusión, repito una vez más que la semana resultó ser muy agitada en varios temas. Tenga en cuenta que desde la publicación del curso en Arduino IDE, ha aparecido la función de trazador de serie incorporado, que se superpone parcialmente a las funciones del entorno de procesamiento consideradas en las lecciones. Además, al final de la semana, a los autores se les ocurrió la idea de modularidad cuando el dispositivo final se ensambla a partir de elementos listos para usar: módulos, por ejemplo, botones con una resistencia pull-up ya incorporada, un sensor de luz listo para usar, donde el fotorresistor y una resistencia convencional ya se ensamblan en un divisor de voltaje, y similares. Sin embargo, el dispositivo se puede ensamblar fácilmente en una placa de prueba, lo que se hizo. La pregunta es para los lectores, ¿alguna vez has hecho un caso para tus dispositivos? ¿Qué materiales usaste para esto? ¿Tal vez el cartón, el contrachapado, el plexiglás o, lo que no es raro hoy, se imprimieron en una impresora 3D?

Source: https://habr.com/ru/post/es403029/


All Articles