Índice:
- Suprimentos
- Etapa 1: configuração do robô
- Etapa 2: configuração do joystick
- Etapa 3: Verificar os valores do joystick
- Etapa 4: Ajustando as Variáveis X e Y
- Etapa 5: convertendo X e Y em valores para os motores esquerdo e direito
- Etapa 6: envio de valores como mensagens de rádio
- Etapa 7: Recebendo as mensagens em seu robô
- Etapa 8: Usando as mensagens de entrada para controlar os motores do robô
- Etapa 9: Usando os botões - recebendo mensagens adicionais
- Etapa 10: Envio de mensagens adicionais usando os botões do controlador
- Etapa 11: Próximas etapas
Vídeo: Programando um Micro: Robô de Bit e Joystick: Controlador de Bit com MicroPython: 11 Passos
2024 Autor: John Day | [email protected]. Última modificação: 2024-01-30 11:36
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.
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:
- Salve o arquivo Raw no seu computador e carregue-o no Mu:
- Copie e cole todo o código fornecido em um novo arquivo em Mu.
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:
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.
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.
Você deverá ver alguns valores trazendo 'impresso' para sua tela:
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.
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:
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:
Z80-MBC2 Programando o Atmega32a: 6 etapas
Z80-MBC2 Programando o Atmega32a: Antes de usar o z80-MBC2, depois de construí-lo, você precisa programar o Atmeg32. Estas instruções mostram como usar um arduino mini barato como um programador para fazer o upload do código
Primeiros passos com Esp 8266 Esp-01 com Arduino IDE - Instalando Placas Esp no Arduino Ide e Programando Esp: 4 Passos
Primeiros passos com Esp 8266 Esp-01 com Arduino IDE | Instalando placas Esp no Arduino Ide e programando Esp: Neste instructables, vamos aprender como instalar placas esp8266 no IDE Arduino e como programar esp-01 e fazer upload de código nele. Como as placas esp são tão populares, então pensei em corrigir um instructablesfor isso e a maioria das pessoas enfrentam problemas
Robô de equilíbrio / Robô de 3 rodas / Robô STEM: 8 etapas
Robô de balanceamento / Robô de 3 rodas / Robô STEM: Construímos um robô de balanceamento combinado e de 3 rodas para uso educacional em escolas e programas educacionais após as aulas. O robô é baseado em um Arduino Uno, um escudo personalizado (todos os detalhes de construção fornecidos), um pacote de bateria Li Ion (todos constr
COMO MONTAR UM BRAÇO DE ROBÔ DE MADEIRA IMPRESSIONANTE (PARTE 3: BRAÇO DE ROBÔ) - COM BASE NO MICRO: BITN: 8 Passos
COMO MONTAR UM BRAÇO DE ROBÔ DE MADEIRA IMPRESSIONANTE (PARTE 3: BRAÇO DE ROBÔ) - COM BASE NO MICRO: BITN: O próximo processo de instalação é baseado na conclusão do modo de evitar obstáculos. O processo de instalação na seção anterior é igual ao processo de instalação no modo de rastreamento de linha. Então, vamos dar uma olhada na forma final de A
COMO MONTAR UM BRAÇO DE ROBÔ DE MADEIRA IMPRESSIONANTE (PARTE 2: ROBÔ PARA Evitar Obstáculos) - COM BASE NO MICRO: BIT: 3 etapas
COMO MONTAR UM ARM DE ROBÔ DE MADEIRA IMPRESSIONANTE (PARTE 2: ROBÔ PARA Evitar Obstáculos) - COM BASE NO MICRO: BIT: Anteriormente, introduzimos o Armbit no modo de rastreamento de linha. A seguir, apresentamos como instalar o Armbit evitando o modo de obstáculo