Índice:

Programando um Micro: Robô de Bit e Joystick: Controlador de Bit com MicroPython: 11 Passos
Programando um Micro: Robô de Bit e Joystick: Controlador de Bit com MicroPython: 11 Passos

Vídeo: Programando um Micro: Robô de Bit e Joystick: Controlador de Bit com MicroPython: 11 Passos

Vídeo: Programando um Micro: Robô de Bit e Joystick: Controlador de Bit com MicroPython: 11 Passos
Vídeo: NR-12 Acidente em torno 2024, Novembro
Anonim
Programando um Micro: Robô de Bit e Joystick: Controlador de Bit com MicroPython
Programando um Micro: Robô de Bit e Joystick: Controlador de Bit com MicroPython

Para o Robocamp 2019, nosso acampamento de robótica de verão, jovens de 10 a 13 anos estão soldando, programando e construindo um 'robô antweight' baseado em micro: bit da BBC, bem como programando um micro: bit para usar como controle remoto.

Se você está atualmente no Robocamp, pule para a Etapa 3, pois realizamos as duas primeiras etapas como um grupo

Este é um guia passo a passo para fazer um robô micro: bit se comunicar com um joystick: controlador de bit.

Não é o caminho mais rápido para fazer tudo funcionar, mas tenta coisas em pequenos pedaços para que você possa testar o código à medida que avança, colocar sua própria marca nele e entender por que estamos fazendo as coisas que estamos fazendo !

Para esta atividade, estamos usando nosso próprio robô personalizado, mas ele funcionará com qualquer robô que use um driver de motor semelhante, como um L9110s.

Arquivos de design para nosso robô podem ser encontrados aqui:

Este guia foi escrito para iniciantes, mas se você nunca usou um micro: bit com MicroPython antes, recomendamos que você tente um programa mais simples primeiro, como nosso crachá Instructable: https://www.instructables.com/id/Felt -Microbit-Nam…

Suprimentos

2x BBC micro: bit

Robô que funciona com um micro: bit BBC (ver explicação acima)

joystick: controlador de bits (adquirimos o nosso na Cool Components)

Etapa 1: configuração do robô

Você tem algumas opções para escrever código MicroPython para seu micro: bit:

  • Mu, que você pode baixar e instalar aqui:
  • O editor online, que você pode encontrar aqui:

Estas instruções presumem que você está usando Mu

Abra o Mu e conecte o micro: bit ao computador. Mu deve reconhecer que você está usando um micro: bit e selecionar 'Modo' micro: bit, mas se não estiver, altere-o manualmente.

escolha o modo
escolha o modo

Obtenha uma cópia do código de teste do motor do robô aqui:

Se você não está acostumado com o Github, pode não ser intuitivo! Duas maneiras fáceis de obter este código são:

  1. Salve o arquivo Raw no seu computador e carregue-o no Mu:
  2. Copie e cole todo o código fornecido em um novo arquivo em Mu.
salvar arquivo bruto
salvar arquivo bruto

Agora clique no botão 'Flash' da barra de ferramentas do Mu, para enviar seu novo código para o micro: bit.

Isso não funcionará a menos que o micro: bit esteja conectado

A luz amarela na parte traseira do micro: bit começará a piscar. Quando terminar, seu código foi transferido.

CONFIGURANDO AS DIREÇÕES DO MOTOR

Este programa irá ligar os motores em diferentes direções quando você pressiona o botão 'A' no micro: bit.

O que você quer que aconteça é:

  • Quando 'A' é exibido, o motor esquerdo avança
  • Quando 'B' é exibido, motor esquerdo para trás
  • Quando 'C' é exibido, o motor direito avança
  • Quando 'D' é exibido, motor direito para trás

Provavelmente não será o caso, pois depende de como você conectou seu robô!

No topo do código, você encontrará uma lista de variáveis, que determinam qual pino no micro: bit controla qual direção do motor.

Se você estiver usando um de nossos robôs (arquivos), troque os nomes das variáveis para fazer o robô se mover nas direções corretas:

variáveis de troca de pinos
variáveis de troca de pinos

Se você estiver usando um robô próprio, verifique a quais pinos o driver do motor está conectado antes de editar o código.

TESTANDO A UNIDADE

Agora verifique como seu robô dirige substituindo o código de teste no loop principal por algum código de sua preferência.

Você diz ao robô para dirigir chamando a função drive (). Isso leva dois argumentos - um valor para o motor esquerdo e um valor para os motores direitos, entre 0 (desligado) e 1023 (velocidade máxima).

Ao chamar o drive (500, 500), por exemplo, você está dizendo a ambos os motores para ligarem, na direção para frente, em cerca de metade da velocidade.

Experimente algumas opções para ter uma ideia de como ele dirige em linha reta e como ele gira.

Dica: os testes do motor estavam dentro de um loop True while e de uma instrução if - os motores não girariam até que você pressionasse o botão A no micro: bit, e ele está sempre verificando se você pressionou o botão A.

Dica: os motores não desligarão até que você mande! Eles sempre continuarão a fazer sua última instrução.

OPCIONAL: MELHORANDO A CONDUÇÃO EM LINHA RETA

Se o seu robô não dirigir em linha reta, um de seus motores pode estar girando mais rápido do que o outro.

Depois de verificar se não há nada que impeça fisicamente a roda de girar livremente, você pode editar o código na função de movimento para reduzir a velocidade do motor mais rápido.

Role para cima para encontrar a definição da função de drive e veja as duas principais instruções:

unidade def (L, R):

# Abaixo está um ajuste para corrigir a discrepância de velocidade do motor L = int (L * 1) R = int (R * 1)

Essas duas linhas atualmente pegam o valor de L e R, multiplique-os por 1 e certifique-se de que ainda sejam números inteiros (int).

Por exemplo, se o seu motor esquerdo é mais rápido, altere * 1 em sua linha para * 0,9 e veja se isso melhora as coisas.

Você não será capaz de torná-lo perfeito, mas pode continuar ajustando até que fique mais reto.

CONFIGURANDO O RÁDIO

Agora configure o rádio, adicionando as seguintes linhas no topo do seu código:

rádio de importação

radio.config (channel = 7, group = 0, queue = 1) radio.on ()

Isso permitirá que seu robô receba instruções de outro micro: bit, mas no momento receberá instruções de qualquer outro micro: bit.

Isso ocorre porque o canal 7 e o grupo 0 são os canais padrão.

Altere esses números, escolhendo um canal entre 0-82 e um grupo entre 0-255. Agora o seu micro: bit receberá apenas instruções de outras pessoas com as mesmas informações de configuração.

queue = 1 significa que o micro: bit manterá apenas uma mensagem de entrada por vez - isso dá um tempo de resposta um pouco mais rápido do que o padrão, que é 3.

Agora você precisa editar seu código de loop principal para, em vez de executar as instruções ao pressionar um botão, esperar por uma mensagem de rádio recebida e responder apropriadamente.

Tente o seguinte código como um teste (ele não fará nada até que você configure o joystick na Etapa 2):

enquanto verdadeiro:

mensagem = radio.receive () se mensagem == 'encaminhar': unidade (500, 500)

Etapa 2: configuração do joystick

Desconecte o micro: bit do seu robô e, em vez disso, conecte o micro: bit do joystick

Obtenha uma cópia do código de configuração do joystick aqui:

Configure o rádio usando a mesma configuração (canal e número do grupo) que você fez para o robô - isso permitirá que os dois se comuniquem.

No final do programa, inicie seu loop principal:

enquanto verdadeiro:

if button_a.was_pressed (): radio.send ('encaminhar')

Este código ainda não usa joystick: bit. Ele usa o botão A no micro: bit para enviar uma mensagem.

Certifique-se de que seu robô e seu controlador micro: bits tenham energia e pressione o botão para enviar sua mensagem.

Se a mensagem for recebida com sucesso e seu robô se mover … muito bem! Você concluiu as instruções de configuração.

DICAS DE SOLUÇÕES DE PROBLEMAS

Se você receber uma mensagem de erro no seu controlador micro: bit … depure o código do controlador

Se você receber uma mensagem de erro no seu robô micro: bit… sua mensagem de rádio foi enviada com sucesso! Mas o robô não consegue entender, então verifique se a mensagem que você enviou e a mensagem que você disse ao robô para escutar correspondem.

Se nada acontecer

  • Certifique-se de ter mostrado o código correto para cada micro: bit - é fácil acender o código errado acidentalmente!
  • Certifique-se de que seus números de canal e grupo correspondam em cada micro: bit

Etapa 3: Verificar os valores do joystick

As próximas etapas usam o código do controlador

Antes de usar o joystick em seu controlador, você precisa saber quais tipos de valores você obtém quando empurra o manche.

Substitua seu loop principal pelo seguinte código:

enquanto verdadeiro:

joystick = joystick_push () imprimir (joystick) dormir (500)

Flash este código para o seu micro: bit e, em seguida, clique no botão REPL na barra de ferramentas de Mu. Isso abrirá um terminal na parte inferior do editor, que fornece um link em tempo real para o micro: bit.

abra o REPL
abra o REPL

Isso não funcionará a menos que o micro: bit esteja conectado

Com o REPL aberto, pressione o botão reset na parte de trás do micro: bit.

Imagem
Imagem

Você deverá ver alguns valores trazendo 'impresso' para sua tela:

valores no terminal
valores no terminal

Empurre o manche do joystick e veja o que acontece com os números.

Anote os valores fornecidos quando o joystick está na posição central - no meu caso (518, 523).

Clique no botão REPL na barra de ferramentas de Mu novamente para fechá-lo - você não poderá enviar um novo código para o micro: bit enquanto ele estiver aberto.

Etapa 4: Ajustando as Variáveis X e Y

Você deseja alterar os valores fornecidos pela função do joystick, de modo que:

  • no centro é zero
  • para cima é positivo
  • para baixo é negativo.

Isso corresponde às instruções de que o robô precisa - um número positivo para avançar e um número negativo para retroceder.

Veja os números que você obteve na última etapa. O primeiro número é x e o segundo número é y.

Edite a definição joystick_push () que já está no programa, para menos seus valores do original:

def joystick_push ():

x = pin0.read_analog () - 518 y = pin1.read_analog () - 523 retornar x, y

Use seus próprios números, eles podem ser diferentes dos meus

Atualize seu novo código, abra o REPL, pressione o botão de reset do micro: bit e verifique seus valores.

Você está recebendo (0, 0)?

Etapa 5: convertendo X e Y em valores para os motores esquerdo e direito

No momento, este joystick não será muito útil para dirigir um robô. Empurrado para a frente até o fim, você obterá um valor como (0, 500).

Se você desse esses números ao robô, ele ligaria o motor direito, mas não o esquerdo, que não é o que você quer que aconteça!

Este diagrama mostra o que acontece com os valores xey quando você move o joystick e o que queremos que o robô faça quando você move o joystick.

diagrama
diagrama

Você precisa usar um pouco de matemática para misturar os valores xey, para lhe dar algo mais útil.

n

AS MATEMÁTICAS

Vamos começar empurrando o joystick totalmente para a frente.

Um exemplo dos valores que você pode obter é:

x = 0

y = 500

Para ser útil ao robô, você deseja obter valores como estes:

esquerda = 500

direita = 500

Vamos tentar adicionar xey de maneiras diferentes para ver quais números obtemos:

x + y = 0 + 500 = 500

x - y = 0 - 500 = -500 y + x = 500 + 0 = 500 y - x = 500 - 0 = 500

Agora vamos ver o que acontece se empurrarmos o joystick totalmente para a direita.

Um exemplo dos valores que você pode obter é:

x = 500

y = 0

Para fazer o robô virar à direita, você deseja que o motor esquerdo mova para frente e o motor direito mova para trás:

esquerda = 500

direita = -500

Vamos experimentar nossa fórmula novamente:

x + y = 500 + 0 = 500

x - y = 500 - 0 = 500 y + x = 0 + 500 = 500 y - x = 0 - 500 = -500

Compare os dois conjuntos de fórmulas para descobrir qual opção fornecerá o valor correto à esquerda e qual opção fornecerá o valor correto à direita.

Experimente com alguns dos valores que você obtém de seu próprio joystick, para garantir que a fórmula escolhida funcione o tempo todo.

n

EXPANSÃO DA FUNÇÃO DO JOYSTICK

Expanda e edite a função do joystick para criar duas novas variáveis para esquerda e direita e para retornar esses valores em vez de x e y:

def joystick_push ():

x = pin0.read_analog () - 518 y = pin1.read_analog () - 523 left = right = return left, right

Atualize seu novo código, abra o REPL, pressione o botão de reset do micro: bit e verifique seus valores.

Você está obtendo os valores que espera?

Se precisar de mais ajuda, verifique nosso código de exemplo aqui:

Etapa 6: envio de valores como mensagens de rádio

Agora você tem alguns valores prontos para enviar ao seu robô.

Edite seu loop principal, para que ele verifique os valores do joystick, mas em vez de imprimir os valores, ele os deixa prontos para serem enviados como uma mensagem de rádio.

enquanto verdadeiro:

joystick = joystick_push () mensagem = str (joystick [0]) + "" + str (joystick [1])

Isso não enviará a mensagem ainda!

O que está acontecendo nesta nova linha de código?

  • joystick [0] significa o primeiro bit de informação que sai da função do joystick (esquerda)
  • joystick [1] é o próximo bit de informação (direita)
  • str () converte esses dois números em formato de string (texto em vez de números) - isso é necessário para enviar as informações pelo rádio.

Você estará acostumado a ver + como significando adição - ele pode somar números e concatenar strings, o que significa que unirá os dois bits de informação.

Exemplo:

150 + 100 = 250

str (150) + str (100) = 150100

Portanto, a concatenação manterá seus valores esquerdo e direito juntos.

Para forçar uma separação entre os dois bits de informação (para que o robô saiba que são dois bits de informação), concatene uma string extra entre eles usando "". As marcas de fala ao redor do espaço significam que já é uma corda.

Por fim, estenda seu código para enviar esta mensagem recém-criada pelo rádio:

radio.send (mensagem)

dormir (10)

O sono retarda o envio de mensagens para que o micro: bit receptor não fique sobrecarregado com muita informação!

Atualize este código para o micro: bit do controlador e depure quaisquer erros antes de passar para a próxima etapa

Etapa 7: Recebendo as mensagens em seu robô

Volte ao código do robô desde o início - lembre-se de desconectar o controlador micro: bit para que você não acidentalmente envie o código do robô para ele

Role para baixo até o seu loop principal - remova o código de teste e adicione este:

enquanto verdadeiro:

mensagem = radio.receive () imprimir (mensagem) dormir (100)

Isso define uma variável igual à mensagem de entrada e imprime a mensagem para o REPL - para verificar se as mensagens estão chegando conforme o esperado.

Atualize seu novo código, conectado ao REPL, e empurre o joystick.

Você deve obter algo assim:

Valores REPL
Valores REPL

DICAS DE SOLUÇÕES DE PROBLEMAS

Se você receber uma mensagem de erro no seu controlador micro: bit … depure o código do controlador

Se você receber uma mensagem de erro no seu robô micro: bit… sua mensagem de rádio foi enviada com sucesso! Mas o robô não consegue entender, então verifique se a mensagem que você enviou e a mensagem que você disse ao robô para escutar correspondem.

Se nada acontecer

  • Certifique-se de ter mostrado o código correto para cada micro: bit - é fácil acender o código errado acidentalmente!
  • Certifique-se de que seus números de canal e grupo correspondam em cada micro: bit

Etapa 8: Usando as mensagens de entrada para controlar os motores do robô

Você agora está recebendo dois números sendo enviados pelo rádio como uma string.

Você precisa dividir essa mensagem em duas strings, depois converter as strings de volta em números e passar isso para a função de unidade. Muita coisa acontecendo ao mesmo tempo!

Antes de fazer isso, você precisa verificar se a mensagem que está recebendo está no formato correto.

Se nenhuma mensagem estiver sendo enviada, você receberá 'Nenhum'. Se você tentar dividir isso, receberá uma mensagem de erro.

enquanto verdadeiro:

mensagem = radio.receive () se a mensagem não for Nenhum: mensagem = mensagem.split () unidade (int (mensagem [0]), int (mensagem [1]))

O que esta acontecendo aqui?

  • O novo código será executado se a mensagem for diferente de 'Nenhum'.
  • message.split () verifica se há um espaço na mensagem (que adicionamos na última etapa) e usa isso para dividir a mensagem em duas.
  • int (mensagem [0]), int (mensagem [1]) faz o oposto do que fizemos na etapa anterior - obtém cada informação individualmente e a converte em um inteiro (um número inteiro).
  • int (mensagem [0]) é usado como o valor para o motor esquerdo na função de drive e int (mensagem [1]) é usado como o valor para o motor direito.

Verifique se funciona - os motores giram quando você empurra o joystick?

Se não - hora de alguma depuração!

Se sim, fantástico! Você tem um robô de controle remoto funcionando!

Passe algum tempo praticando com seu robô antes de passar para a próxima etapa. Ele dirige da maneira que você espera?

As próximas etapas mostrarão como usar os botões do joystick para adicionar funcionalidades extras ao seu robô

Se você deseja ver nossa versão deste código até agora:

  • Robô:
  • Controlador:

Etapa 9: Usando os botões - recebendo mensagens adicionais

No momento, seu código tentará dividir qualquer mensagem que não seja Nenhuma. Isso significa que se ele receber, por exemplo, 'olá', você receberá uma mensagem de erro.

Para permitir que seu micro: bit interprete outras mensagens, ele precisará verificar cada mensagem esperada primeiro e, em seguida, dividir a mensagem apenas se não tiver sido instruído a fazer mais nada com ela.

Expanda seu código da seguinte forma:

se a mensagem não for Nenhum:

if message == 'hello': display.show (Image. HAPPY) mensagem elif == 'duck': display.show (Image. DUCK) else: message = message.split () drive (int (message [0]), int (mensagem [1]))

Em primeiro lugar, irá verificar se recebeu a mensagem 'alô'. Em caso afirmativo, ele exibirá uma imagem feliz e, em seguida, volte ao topo do loop e verifique a próxima mensagem.

Se a mensagem não for olá, ele verificará em seguida se a mensagem é 'pato'.

Se a mensagem não for 'alô' OU 'pato, ele fará a última coisa da lista, que é dividir a mensagem e ligar os motores. Ele não tentará dividir a mensagem se tiver recebido 'hello' ou 'duck', o que significa que você não receberá uma mensagem de erro de nenhuma dessas duas mensagens.

O sinal de igual duplo é importante - significa 'é igual a', em comparação com um único sinal de igual, que está configurando algo (então mensagem = 'olá' significa que estamos configurando a variável para 'olá', mensagem == 'olá' significa que estamos perguntando se mensagem é igual a 'olá').

Experimente com apenas duas opções por agora, para testá-lo - você pode adicionar quantas outras mensagens quiser mais tarde.

Link para o código de trabalho:

Etapa 10: Envio de mensagens adicionais usando os botões do controlador

Desconecte o micro: bit do seu robô e, em vez disso, conecte o micro: bit do joystick

Volte para o código do controlador para editar.

Semelhante ao código do robô, queremos que o controlador verifique se você está tentando enviar alguma outra mensagem, antes de enviar os valores do joystick.

No topo do loop, ainda queremos que ele verifique os valores atuais do joystick, mas também queremos que ele verifique se um botão está sendo pressionado no momento:

enquanto verdadeiro:

joystick = joystick_push () button = button_press ()

button_press () retorna um valor A, B, C, D, E ou F dependendo de qual botão está sendo pressionado no momento (se nada estiver sendo pressionado, ele retorna Nenhum).

Agora podemos fazer uma instrução if-elif-else, como fizemos para o código do robô - usando dois botões e enviando o valor do joystick se nenhum botão estiver sendo pressionado.

if button == 'A':

radio.send ('hello') sleep (500) botão elif == 'B': radio.send ('duck') sleep (500) else: message = str (joystick [0]) + "" + str (joystick [1]) radio.send (mensagem) sleep (10)

Quando um botão for pressionado, envie uma das mensagens que você disse ao robô para procurar na etapa anterior.

A mensagem será enviada sempre que o botão for pressionado e os computadores são muito mais rápidos do que as pessoas! Portanto, ele pode enviar a mensagem muitas vezes antes de você conseguir tirar o dedo do botão.

O hibernar após o envio da mensagem diminui a velocidade, de modo que não será verificado o botão novamente tão rapidamente - tente alguns números aqui para obter o tempo perfeito para você - muito devagar e não responderá também rapidamente e seu robô receberá tantas mensagens de botão que pode parar de responder ao joystick!

Funciona?

Se estiver recebendo mensagens de erro, pense cuidadosamente sobre o que acabou de alterar e o que está acontecendo.

Se você obtiver um erro no robô ao pressionar um botão em seu controlador - você sabe que a mensagem está sendo transmitida, mas está confundindo o robô. Verifique se a mensagem que você enviou e a mensagem que você disse ao robô para procurar são as mesmas.

Link para o código de trabalho:

Etapa 11: Próximas etapas

Agora você tem o conhecimento de que precisa para trabalhar com os motores do seu robô e com o seu joystick: controlador de bits

Use esse conhecimento para melhorar os dois programas e torná-los seus. Algumas ideias abaixo!

Você tem seis botões em seu controlador! O que você quer que eles façam?

  • Que tal programar uma rotina de dança para o seu robô fazer sob comando? Escreva um algoritmo de comandos drive (), separados por comandos sleep ()!
  • Você quer mudar a direção em que o robô se move para que ele possa dirigir facilmente de cabeça para baixo? Pense nos valores xey do seu joystick. O que eles representam e como você pode manipulá-los?
  • O seu robô tem (ou você poderia adicionar!) Recursos extras, como LEDs, alto-falante ou sensores?

Ideias para melhorar o código

  • Você poderia ajudar seu robô a lidar com mensagens desconhecidas usando o código try / except?
  • A matemática usada para calcular os valores esquerdo e direito do joystick não nos fornece toda a gama de valores (o acionamento do robô pode aceitar um número de até 1023). Você pode editar este código para obter um intervalo melhor?
  • Existem outros métodos de misturar os valores do joystick - você pode descobrir uma maneira melhor de fazer isso?

Recomendado: