Revisão do curso on-line sobre Arduino / Robótica do MIPT (segunda semana)


Continuamos publicando uma visão geral do curso on-line "Construindo robôs e outros dispositivos Arduino", começando aqui .


Então, quanto tempo foi curto, terminou a segunda semana do curso on-line de robótica do MIPT . Francamente, a semana foi muito cheia de vários tópicos.


Aqui está uma lista de exemplo que eu aloquei para mim:


  • Divisor de tensão. Usando um fotorresistor e um termistor
  • Sinal analógico. Largura do sinal
  • Comunicação via porta serial. Ambiente de Processamento
  • Sinal digital. Botões e opções de conexão. Resistor de pull-up
  • Expressões lógicas, declarações if e else
  • Campainha, barra LED, indicador de sete segmentos
  • Microcircuitos. Inversor lógico 74HC04, Shift Register 74HC595
  • Programas de depuração
  • Módulos externos
  • Uma variante de um sistema de monitoramento pronto que exibe a temperatura e o nível de luz na escala de LEDs, além de um alto-falante que funciona quando uma certa temperatura é excedida

Depois de passar no teste com sucesso e coletar os esquemas propostos das lições, pensei em como melhorar esse ou aquele esquema ou coletar algo de minha autoria.



A primeira coisa que veio à mente foi a modernização do sensor de luz. A implementação proposta na lição simplesmente pegou o valor do fotorresistor e o enviou para a porta serial.


A versão atualizada deve usar um indicador de sete segmentos para exibir números de 0 (iluminação mínima) a 9 (iluminação máxima). O indicador deve ser conectado através de um registro de turno. Dois botões devem ser usados ​​para definir os níveis mínimo e máximo de iluminação. O registro de deslocamento é necessário para não usar o pino do Arduino em cada segmento, mas usar menos pinos. De fato, o registrador de deslocamento converte a saída de dados seriais (um bit por unidade de tempo) em paralelo (vários bits por unidade de tempo). No nosso caso, em vez de sete pinos do Arduino, precisamos de apenas três.


No editor Fritzing, eu tenho esse dispositivo.



Desta forma, parece vivo.




As bases foram tomadas esquemas para trabalhar com um registro de turno e um fotorresistor.


Observe que, na placa, o fotorresistor está conectado de maneira um pouco diferente do tutorial em vídeo - pegamos o valor da tensão no fotorresistor em relação ao terra e, no circuito, removemos a queda de tensão em relação à fonte de alimentação. Isso é feito para simplificar um pouco o programa - com um aumento no nível de iluminação, a resistência do fotorresistor diminui. Portanto, na mesma corrente, a queda de tensão diminui. Portanto, na entrada analógica, quanto maior a tensão, maior o nível de iluminação e vice-versa.


Agora cabe a você finalizar o código fonte. O mesmo programa foi usado como base para exibir o valor em um indicador de sete segmentos.


Código do 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); } 

Das características - ao definir o nível máximo de iluminação, tivemos que subtrair alguma constante (max_light = valor - 10), selecionada empiricamente. Isso é necessário para evitar “chocalhar” no nível máximo de iluminação, uma vez que o valor da tensão retirado do fotorresistor é instável.


Compilamos o esboço, carregamos no Arduino e verificamos.


Primeiro no monitor da porta ...




E depois viver



Como você pode ver, o dispositivo funciona com êxito, conforme descrito. Obviamente, ainda há espaço para melhorias - por exemplo, você pode adicionar um sinal de áudio quando a iluminação cai abaixo de um certo nível - isso significa que você precisa ativar iluminação adicional no local de trabalho. Também no futuro será possível alterar o programa em si, usando matrizes e funções adicionais.


Concluindo, repito mais uma vez que a semana acabou sendo muito agitada em vários tópicos. Observe que desde a publicação do curso no Arduino IDE, a função Serial Plotter incorporada apareceu, que se sobrepõe parcialmente às funções do ambiente de processamento consideradas nas lições. Além disso, no final da semana, os autores tiveram a ideia de modularidade quando o dispositivo final é montado a partir de elementos prontos - módulos, por exemplo, botões com um resistor de pull-up já incorporado, um sensor de luz pronto, onde um fotorresistor e um resistor convencional já estão montados em um divisor de tensão e assim por diante. No entanto, o dispositivo pode ser facilmente montado em uma tábua de pão, o que foi feito. A questão é para os leitores, você já defendeu seus dispositivos? Quais materiais você usou para isso? Talvez papelão, madeira compensada, acrílico ou, o que não é incomum hoje, tenha sido impresso em uma impressora 3D?

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


All Articles