Como fazer o robô se mover com precisão? Visão geral e recursos da robótica da plataforma Studuino

imagem

Foi solicitado à organização em que trabalho que organizasse um pequeno webinar sobre robótica para o Salão Internacional de Educação de Moscou 2020, realizado em formato online. O tópico da apresentação foi deixado para mim em aberto e recebeu um conjunto educacional sobre robótica. Então, eu me familiarizei com os produtos da empresa japonesa ArTeC (isso não é publicidade e eu não sou funcionário da ArTeC - é apenas minha experiência pessoal ao me comunicar com seus produtos). Após o webinar, decidi escrever este artigo, já que na Rússia os kits da Lego Education eram bastante populares, e foi a primeira vez que me deparei com esse designer japonês.

O artigo está dividido em duas partes. A primeira parte será útil para quem escolher um kit de robótica educacional. Na segunda parte, examinei o uso de um kit para resolver um problema aplicado que pode ocorrer na vida.

Então, se alguém estiver interessado em que tipo de kit robótico é e o que pode ser feito com ele, peço um gato. Então vamos!

Como base de construção, o designer usa apenas algumas peças básicas das quais é possível montar estruturas bastante complexas. Modelos de exemplo de

Blocos base do ArTeC Designer
blocos de base do ArTeC Designer a

imagem
partir de peças de designer

Devido às especificidades das peças - a ordem escalonada dos orifícios e pontas para a conexão, nem sempre é rápido encontrar a combinação certa de peças para alcançar o resultado. Das vantagens, ao contrário da Lego: todas as peças são grandes o suficiente, perdendo muito mais difícil. A segunda vantagem é que você não precisa vasculhar em busca da peça necessária por um longo tempo, porque existem apenas 5-6 peças de peças básicas (a diferença na cor das peças não conta). Há um sinal de menos - desde que as peças sejam completamente novas, sua separação às vezes se torne atormentadora -, então elas se apegam firmemente uma à outra. Para ajudar a desengatá-los, vem uma ferramenta especial que está no kit.

Além dos blocos básicos do conjunto, existem algumas variedades de rodas e engrenagens, além de uma cremalheira.

Agora, sobre o que está incluído na parte eletrônica deste kit robótico. O site japonês possui um número bastante grande de diferentes sensores e módulos. Claro, eu tinha muito menos deles, mas aqueles que já tinham uma certa margem de criatividade.

Para o preenchimento da unidade de controle principal, os japoneses fizeram sua versão do quadro Arduino, finalizando-o, e o chamaram de Studuino. Eles adicionaram um driver de controle de motor DC e trouxeram uma linha para conectores de 3 pinos (padrão BLS-3, estes são colocados em servos). Em cada um desses conectores, há energia: mais e menos, além de um dos pinos da placa Arduino. Todos os conectores são assinados, por isso é difícil cometer um erro ao se conectar a eles.

Studuino Platform
Studuino Platform

Para compatibilidade com as blindagens padrão do Arduino em locais padrão, existem conectores semelhantes ao Arduino.

A principal diferença da placa Arduino é que a tensão do controlador é de 3,3V. Isso é explicado pelo fato de o módulo de controle central ser alimentado através do compartimento de bateria fornecido para 3 pilhas AA (4,5 V no total). Infelizmente, a bateria não é fornecida, nem pode ser comprada no site do fabricante como uma opção adicional.

A placa está localizada em uma caixa de plástico, na qual é possível conectar as partes básicas do designer e outros elementos.

Unidade Central da ArTeC
Unidade Central da ArTeC

Como atuadores, o fabricante oferece dois motores CC com caixas de engrenagens e até 8 servoconversores de seu próprio projeto (seu número pode variar dependendo da configuração do kit). Os motores são conectados através de conectores especiais que estão na placa.

Motores de corrente contínua com engrenagens e sua conexão
Motores de corrente contínua com caixas de engrenagens e sua conexão

É possível montar com facilidade e rapidez a construção mais simples que se lembre: uma máquina robô com dois motores, controlando o que você pode fazer na direção certa.

Máquina robô simples com dois motores DC
Máquina robótica simples com dois motores DC

Os motores são controlados definindo os estados lógicos dos terminais D2, D4, D3 para o motor, que são conectados aos conectores M1 e D7, D8, D5 do motor conectado ao conector M2 na placa Studuino. É a essas conclusões que os desenvolvedores da placa Studuino conectaram em paralelo um chip de driver de driver de motor. Usar essas conclusões conectando seu circuito lá e, ao mesmo tempo, usando os motores ao mesmo tempo, falhará.

Considere como controlar um mecanismo conectado ao conector M1. Ao definir um estado lógico diferente dos terminais D2 e ​​D4, é possível obter a rotação do motor na direção desejada. Por exemplo: com D2 - 1 e D4 - 0, o motor gira no sentido horário e, se D2 - 0 e D4 - 1, o motor gira no sentido anti - horário. Também é necessário definir a velocidade de rotação do motor, definindo o valor de PWM no pino D3 - pode estar na faixa de 0 a 255. Se o valor for 0, o motor não girará e, se o valor for 255, obteremos a velocidade máxima de rotação. O motorista do motor também permite uma mudança instantânea no sentido de rotação do motor e suporta o modo de frenagem do motor. Para desacelerar o motor, o mesmo estado lógico igual a 1 deve ser definido nos terminais D2 e ​​D4.

A propósito, não há pinos D3 e D5 nos conectores que possuem 3 pinos (GND, VCC, SIG) na placa Studuino, mas eles estão no conector Arduino padrão, que os desenvolvedores deixaram para manter a compatibilidade da plataforma.

Da mesma forma, o motor é controlado, o qual está conectado ao conector M2. Para ele, o sentido de rotação é especificado através do estado dos terminais D7 e D8, e a velocidade de rotação pelo terminal D5.

O programa mais simples que escrevi fez a máquina do robô se mover assim:


Os servos podem ser conectados aos conectores destacados em vermelho na placa: D2, D4, D7, D8, D9, D10, D11, D12.

Conexão servo
Conexão de servoconversores

É nesses pinos que o microcontrolador AtMega168 possui um PWM, necessário para controlar os servoconversores. Se você conectar o número máximo de servos, poderá obter um design interessante. Para fins de demonstração, montei um simples análogo de um robô ambulante e tentei programá-lo um pouco. O resultado pode ser visto no vídeo:


A única coisa a lembrar é que, se você planeja usar motores e servos CC ao mesmo tempo, não poderá usar 2 motores CC e 8 servos ao mesmo tempo, pois eles têm saídas comuns controladas pelo microcontrolador. Você pode fazer as seguintes configurações: 2 motores CC + 4 servos, 1 motor CC + 6 servos ou usar apenas 8 servos.

Em qualquer kit robótico, além dos atuadores, deve haver sensores que são os "olhos" e "ouvidos" de qualquer robô. Eles também estão aqui. No meu aparelho, havia os seguintes sensores: um sensor de luz, um sensor de som, um sensor de aceleração, dois sensores de infravermelho, um sensor de toque, além de LEDs (verde, vermelho, azul, branco) e um piezodinâmico.

Sensores em um conjunto
Sensores em um conjunto

Os sensores são conectados à unidade central usando os cabos que acompanham o kit. Para fixar os sensores no modelo do robô nos alojamentos, eles têm espinhos nos quais podem ser conectados à estrutura. Montei e programei alguns projetos simples para examinar a operação dos sensores.

É assim que o sensor de toque funciona:


E assim o sensor de luz funciona:


Se não houver sensores padrão suficientes no conjunto e você desejar expandir sua funcionalidade, poderá usar facilmente a placa de ensaio sem solda e conectar os circuitos a ele, como em uma placa Arduino padrão.

Recursos aprimorados de recrutamento
Discagem aprimorada

O próximo ponto importante para qualquer kit robótico é a disponibilidade de um ambiente de programação conveniente. Aqui, o fabricante oferece três opções de programação diferentes.

Nível básico - projetado para os menores usuários, aqueles que ainda não sabem ler, mas que já estão dando seus primeiros passos no mundo adulto da robótica. Para eles, o ambiente de programação mais simples é oferecido - o pictograma.

Programação de ícones
Programação de ícones

Aqui você pode extrair pictogramas com ações básicas no programa (avançar, ligar, ligar o LED, etc.) e configurar seus parâmetros básicos.

Quando esse nível é dominado ou seus recursos se tornam insuficientes para resolver as tarefas, você pode ir para a próxima etapa e começar a usar o ambiente de programação Scratch para a plataforma Studuino.

Programação de rascunho para o Studuino
Programação de rascunho para o Studuino

Já existem mais opções de programação: você pode usar variáveis ​​e matrizes, expressões lógicas e aritméticas, sub-rotinas, além de configurar com mais flexibilidade vários blocos para execução.

Quando esses recursos não são suficientes, você pode prosseguir com a programação no Arduino IDE e obter controle total sobre todos os recursos de hardware da plataforma Studuino. Para usar a placa Studuino no Arduino IDE, você deve configurar o ambiente de acordo com as instruções do site do fabricante (para que o ambiente veja a plataforma Studuino na lista de placas suportadas).

Completo com o software de programação, o fabricante fornece um conjunto de instruções para montar diferentes modelos e programá-los. O software em si está disponível gratuitamente no site do fabricante.

Agora vamos tentar resolver um pequeno problema prático usando este conjunto.

Imagine que temos um robô que deve avançar e retroceder no armazém e precisamos fazê-lo parar nos locais indicados. Se o robô não for controlado, ocorrerá um acidente. Um exemplo desse acidente é mostrado aqui:


Mover o robô para frente e para trás pode ser feito usando motores de corrente contínua ou servos. Os servoconversores resolvem o problema de como parar o robô no lugar certo (você pode definir com precisão o ângulo de rotação do servo). Essa solução tem uma limitação (usaremos um servo de um conjunto com uma roda fixa) - os servos não podem girar em um ângulo de mais de 180 graus e, portanto, o movimento do nosso robô será limitado a metade do comprimento da rotação da roda no servo, mas geralmente você deseja mais.

Usaremos um motor DC com um redutor do aparelho para avançar e retroceder. Esses motores não têm feedback. Depois de dar partida no motor, não podemos dizer até onde o robô viajou. Você pode detectar o tempo durante o qual o robô percorre a distância necessária durante a operação do motor e usar esses atrasos no programa para parar o robô no lugar certo. Esse método tem uma desvantagem significativa - a velocidade do motor depende da tensão que é fornecida e do esforço necessário. Como as baterias são usadas no robô, que depois de um tempo será levemente descarregada e sua voltagem se tornará menor, ao mesmo tempo, o robô começará a percorrer uma distância mais curta e será necessário selecionar o tempo novamente.

A opção mais simples que você pode usar é um robô, passando o ponto desejado, toca no sensor de toque, que será um sinal de parada no lugar certo.

Fiz alterações no meu design adicionando sensores de toque no robô e coloquei elementos ao longo do caminho do robô para que o robô os tocasse com sensores de toque ao se mover.


O vídeo mostra que o robô chega ao final do “armazém” e toca a “parede” com o sensor, depois volta para a “parede” oposta do armazém e lá também toca. Depois disso, o processo é repetido. Portanto, há dois pontos que o robô “sabe” com certeza - esses são os pontos em que o sensor de toque é acionado.

Programa de toque zero para Studuino
Um programa com sensores de toque na linguagem Scratch para o Studuino

Às vezes isso é suficiente para resolver a tarefa. Mas nós queremos mais!

Fiz alterações no design e no programa do robô e foi isso que consegui:


Vamos considerar com mais detalhes o que decidi exigir muito do robô. Decidi que dois pontos de interrupção não são suficientes para mim e quero mais. Para isso, usei um sensor de infravermelho, incluído no kit. Fixei-o em uma plataforma móvel e embaixo arrumei uma tira de papel com linhas pretas desenhadas pelo marcador, nas quais o robô teria que parar. Também removi um dos sensores de toque do robô (no lado direito).

Robô de IR
Robô com sensor de infravermelho

Como resultado, obtive um diagrama clássico do dispositivo de um dos eixos de uma impressora 3D ou de uma máquina CNC. Quando ligada, a impressora não sabe onde está e vai até o lado (até ser tocada pelo interruptor de limite); depois disso, considera esse ponto como zero e começa a contar sua posição nesse eixo.

Nesse design, a contagem regressiva ocorre em listras pretas no papel. O número dessas bandas é conhecido antecipadamente; portanto, quando você alcança a última banda, pode retornar ao ponto de referência zero. O programa Scratch para Studuino é apresentado abaixo.

Programa Scratch IR Robot para Studuino
Programa Scratch IR Robot para Studuino

Se você observar atentamente o programa, poderá ver valores incompreensíveis de 40 e 50, com os quais o valor do sensor IR é comparado. Para entender esses números, você precisa se lembrar um pouco sobre quais sinais podem ser lidos em diferentes sensores. Existem sensores digitais e analógicos. Os sensores digitais têm um número fixo de posições e movem-se de uma posição para outra bruscamente e sem valores intermediários. Sensores usados ​​principalmente com duas posições. Sensores de toque é o exemplo mais impressionante de um sensor digital: até que o sensor seja pressionado, ele fornece um valor lógico de 1 e, quando pressionado - um valor lógico de 0 (neste construtor e com esses sensores, esse é o esquema, mas existem esquemas nos quais isso é feito ao contrário: pressionado - 1, não pressionado - 0).Os sensores analógicos descrevem uma relação inextricável entre o sinal e a tensão ou corrente na saída e não possuem valores fixos. O sensor IR emite um sinal de luz analógico, que pode depender de vários fatores, como luz ambiente, tensão da bateria e até temperatura ambiente.

O sinal analógico é convertido linearmente em um número, para o Scratch for Studuino - na faixa de 0 a 100. Isso é feito para simplificar o trabalho com eles para os usuários finais (esse ambiente de programação foi desenvolvido para ensinar crianças). No IDE do Arduino, é emitido um intervalo "honesto" de valores de 0 a 1023, que corresponde ao conversor ADC de 10 bits que está presente no controlador Atmega168. Se você observar as diferenças nos gráficos entre o sinal digital e o analógico, fica claro por que o sinal analógico é uma faixa de valores.

Sinal analógico (esquerdo) e digital (direito)
Sinal analógico (esquerdo) e digital (direito) O

sensor infravermelho, usado para determinar a linha de etiqueta preta, funciona pelo princípio de capturar o sinal refletido. Dois elementos podem ser vistos claramente na figura: LED IR e fotodetector IR.

Sensor IR
Sensor de infravermelho

Se você colocar um obstáculo na frente do sensor do qual os raios infravermelhos serão refletidos, melhor eles serão refletidos no obstáculo (dependendo da distância do obstáculo ou do tipo de obstáculo), mais serão captados pelo fotodetector de infravermelho e o sensor retornará mais valor ao usuário durante sua pesquisa.

Os números 40 e 50 são selecionados empiricamente. No meu caso, o sensor mostrou, estando acima de uma superfície branca, valores de cerca de 65-75. Acima da superfície preta, o sensor retornou valores na faixa de 18 a 25. O número 40 é o momento em que o sensor começa a mudar de uma superfície branca para preta, e o número 50 é o momento de transição de uma superfície preta para branca. Essas figuras são tiradas com uma pequena margem para bloquear o erro na medição do sensor. Ao desenvolver um projeto real, é necessário levar em consideração as condições sob as quais o sensor fará leituras (iluminação externa, a localização do sensor etc.), porque todos esses fatores afetarão as leituras do sensor. Pode ser necessário desenvolver um algoritmo para ajustar constantemente esses valores, dependendo das condições externas.

Vou resumir um pequeno resultado. Duas soluções possíveis para o problema de mover o robô pelo armazém foram consideradas. Ambas as opções exigiam "tags" externas adicionais, que guiavam o robô. Existe alguma maneira de fazer sem eles? Para que o robô, por exemplo, saiba em que ângulo o eixo do motor girou e, dependendo do valor do ângulo, decidiu parar ou seguir em frente. Existe uma solução simples para esse problema - o uso de um motor com um codificador (sensor de ângulo).

O conjunto possui motores de corrente contínua com engrenagem, mas eles não têm um codificador. A ideia veio à minha mente: talvez eu pudesse tentar criar um codificador simples das partes do designer, especialmente porque as engrenagens do conjunto possuem um módulo bastante grande (tamanho do dente)?

Os principais elementos do codificador
Os principais elementos do codificador

O principal problema era escolher o local e consertar o sensor de infravermelho para que ele cruzasse o dente da engrenagem quando ele girasse. Como resultado, recebi um design de teste, que é mostrado na figura abaixo.

Modelo de Teste do Codificador
Modelo de teste do codificador

Como você pode ver na imagem acima, o sensor infravermelho é fixo para que a engrenagem cruze sua área de medição de trabalho com os dentes durante a rotação. Em frente (do outro lado da engrenagem) do sensor de infravermelho, coloquei um obstáculo trabalhando na reflexão dos raios infravermelhos para obter dados mais corretos do sensor. Quando a engrenagem gira e o sensor de infravermelho mede a reflexão do sinal, haverá grandes valores quando houver um dente na frente do sensor e menores quando houver um "orifício" entre os dentes da engrenagem.

O programa para trabalhar com o codificador é desenvolvido no IDE do Arduino. Para testar a eficiência da minha ideia, escrevi um programa simples que ligava o motor a uma velocidade constante e produzia valores continuamente do sensor de infravermelho para o console de depuração.

Texto do programa
#define M1_A        2       //   1   1
#define M1_B        4       //   2   1
#define M1_PWM      3       //       1
#define SENSOR_PIN  A4      //     IR-sensor

void setup() {
  Serial.begin(9600);       //      
  pinMode(M1_A, OUTPUT);    //       " "
  pinMode(M1_B, OUTPUT);    
  analogWrite(M1_PWM, 100); //    
  digitalWrite(M1_A, HIGH); //    
  for (int i=0; i < 2000; i++) {    //   2000    -
    Serial.println(analogRead(SENSOR_PIN));   //      
  }
  digitalWrite(M1_A, LOW);  //   
}

void loop() {
}


De acordo com os dados que o programa exibia no console, obtive o seguinte gráfico:

Gráfico dos valores do sensor IR durante a rotação da engrenagem
Gráfico de alterações nos valores do sensor de infravermelho durante a rotação da engrenagem

A natureza do gráfico se assemelha à forma dos dentes de uma engrenagem, o que sugere que, de fato, esses dados podem ser usados ​​para controlar a rotação do motor usando a engrenagem do conjunto projetado como um disco codificador. Para eliminar a histerese de “rejeição”, que é implementada da seguinte forma (símbolos no gráfico): MIDDLE é o valor médio entre os valores máximo e mínimo das leituras do sensor IR, WIDTH é o desvio de MIDDLE para um valor maior ou menor para criar uma certa “banda de erro” »Medições de sinal (a largura total desta banda é 2 * LARGURA). MIDDLE e WIDTH serão usados ​​no algoritmo de controle de rotação do motor. O algoritmo para contar os dentes na engrenagem durante a rotação do motor pode ser representado da seguinte maneira:

Algoritmo para contar dentes na engrenagem durante a rotação do motor
Algoritmo para contar dentes na engrenagem durante a rotação do motor

, usando a seguinte notação:

  • prev_state - estado anterior da engrenagem;
  • cur_state - estado atual da engrenagem;
  • count - o número de dentes da engrenagem contados;
  • tmp - leituras do sensor IR.

O princípio de contar os dentes da engrenagem neste algoritmo é baseado em uma leitura constante das leituras do sensor de infravermelho e uma alteração no valor da variável cur_state quando o nível do sinal ultrapassa a linha superior ou inferior da "faixa de erro". Se o valor ultrapassar o limite superior, a variável cur_state se tornará igual a 1, o que significa um dente de engrenagem e, ao ultrapassar o limite inferior, a variável cur_state se torna igual a 0, o que significa uma falha entre os dentes da engrenagem. A adição da variável count ocorre apenas quando o estado da variável cur_state é alterado.

Um programa que usa esse algoritmo é apresentado abaixo. Nele, descrevi uma sub-rotina que espera até que o motor gire a engrenagem por um número predeterminado de dentes e depois transfira o controle para o programa principal.

Texto do programa
#define M1_A        2       //   1   1
#define M1_B        4       //   2   1
#define M1_PWM      3       //       1
#define SENSOR_PIN  A4      //     IR-sensor

#define MIDDLE      550     //         
                            // ""
#define WIDTH       50      //      ,   
      //    -     
      // 

int enc_tooth = 0;          // ,    
int cur_state = 0;          //   :  (1)  "" (0)
int prev_state = 0;         //   
int tmp;                    //      

void init_enc() {
  enc_tooth = 0;
  cur_state = 0;
  prev_state = 0;

  //         cur_state
  //    ,   = 1,    ""      
  //   0      
  if (analogRead(SENSOR_PIN)>MIDDLE) {
    prev_state = 1;
    cur_state = 1;
    enc_tooth++;
  }  
}

void wait_by_count(int count) {
  //       count,       IR 
  //           ""
  while (enc_tooth <= count) {
    //    IR-    
    tmp = analogRead(SENSOR_PIN);

    //       +  ,    
    if ((tmp + WIDTH) > MIDDLE) {
      cur_state = 1;
    } else {
    //       -  ,    ""
      if ((tmp - WIDTH) < MIDDLE) {
        cur_state = 0;
      }
    }

    //       ,      
    // ,     ""   -  ""  
    if (cur_state != prev_state) {
    //   ,   0  - ,     
    // 
      enc_tooth += cur_state;
    
    //        
      prev_state = cur_state;
    }
  }
}

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

  //        ""
  pinMode(M1_A, OUTPUT);
  pinMode(M1_B, OUTPUT);

  //   
  init_enc();

  //    
  analogWrite(M1_PWM, 100);
 
  //    ,      1 (    
  //  0)
  digitalWrite(M1_A, 1);

  // ,    30  
  wait_by_count(30);
  
  //   
  digitalWrite(M1_B, 1);

  Serial.print("  = ");
  Serial.println(enc_tooth);

}

void loop() {
}


O programa liga o motor e aguarda até que a engrenagem gire em 30 dentes - exatamente um número de dentes na engrenagem e, depois disso, para o motor. Abaixo está um vídeo que demonstra o funcionamento do programa:


Em um pedaço de papel branco colado na engrenagem, você pode acompanhar sua rotação em 360 graus.

Sobre isso, quero terminar este artigo. Em conclusão, posso dizer que não parei apenas no modelo do codificador. Uma plataforma robótica de pleno direito foi montada com dois motores e dois codificadores (um para cada roda) e foi feito um programa para sincronizar a rotação da roda de acordo com os codificadores, mas este é um tópico para outro artigo ... Uma

Plataforma de robô com codificadores baseados em sensores IR
plataforma de robô com codificadores baseados em sensores de infravermelho

Como projetista educacional em robótica, essa é uma boa opção para as crianças (bem, adultos) que desejam participar dessas classes, principalmente porque o fabricante fez de tudo para maximizar a faixa etária daqueles que podem usar este produto (presença de diferentes ambientes de programação) ) Você pode começar com os elementos mais simples e elementares e, após obter o conhecimento básico, passar para outro nível de desenvolvimento de robótica e eletrônica.

All Articles