Programação do Robô

Agora vamos programar o robô!

Código Bluetooth

Comece com um programa básico que detecta os três tipos de pacotes Bluetooth que usamos (ColorPacket, AccelerometerPacket, ButtonPacket) e imprime o conteúdo do pacote no console serial. Comece executando este programa e enviando cada um dos três tipos de pacotes do seu telefone, confirmando que eles foram impressos no console serial. Esta será a base do nosso programa de robô:

from adafruit_ble import BLERadio
from adafruit_ble.advertising.standard import ProvideServicesAdvertisement
from adafruit_ble.services.nordic import UARTService

from adafruit_bluefruit_connect.packet import Packet
from adafruit_bluefruit_connect.color_packet import ColorPacket
from adafruit_bluefruit_connect.accelerometer_packet import AccelerometerPacket
from adafruit_bluefruit_connect.button_packet import ButtonPacket

from adafruit_crickit import crickit

ble = BLERadio()
uart_service = UARTService()
advertisement = ProvideServicesAdvertisement(uart_service)

def handle_color_packet(packet):
    print(f"Color={packet.color}")

def handle_accelerometer_packet(packet):
    print(f"X={packet.x}, Y={packet.y}, Z={packet.z}")

def handle_button_packet(packet):
    print(f"Button={packet.button}, Pressed={packet.pressed}")

while True:
    # Continue anunciando até que outro dispositivo se conecte
    ble.start_advertising(advertisement)
    while not ble.connected:
        pass
    ble.stop_advertising()

    # Continue ouvindo por pacotes enquanto estiver conectado
    while ble.connected:
        if uart_service.in_waiting:
            packet = Packet.from_stream(uart_service)
            if isinstance(packet, ColorPacket):
                handle_color_packet(packet)
            if isinstance(packet, AccelerometerPacket):
                handle_accelerometer_packet(packet)
            if isinstance(packet, ButtonPacket):
                handle_button_packet(packet)

Acelerômetro: Frente/Trás

Usaremos a medição do acelerômetro ao longo do eixo Z para definir a velocidade do motor para frente/trás. Certifique-se de que o acelerador não ultrapasse 1,0 ou fique abaixo de -1,0, caso contrário, uma exceção será gerada:

def compute_throttle(value):
    if value > 1:
        return 1
    elif value < -1:
        return -1
    return value

def handle_accelerometer_packet(packet):
    print(f"X={packet.x}, Y={packet.y}, Z={packet.z}")
    throttle = compute_throttle(packet.z)
    crickit.dc_motor_1.throttle = throttle
    crickit.dc_motor_2.throttle = throttle

Tente usar seu celular para fazer o robô se mover para frente e para trás e observe como a velocidade muda com a inclinação do celular. Os suportes das rodas provavelmente não estarão perfeitamente retos, então é provável que você veja o robô se inclinar ligeiramente para a esquerda ou para a direita.

Acelerômetro: Esquerda/Direita

Agora vamos adicionar a capacidade de virar para a esquerda e para a direita alterando os aceleradores do motor para valores diferentes com base na medição do acelerômetro ao longo do eixo X:

def handle_accelerometer_packet(packet):
    print(f"X={packet.x}, Y={packet.y}, Z={packet.z}")
    throttle_1 = compute_throttle(packet.z + packet.x)
    throttle_2 = compute_throttle(packet.z - packet.x)
    crickit.dc_motor_1.throttle = throttle_1
    crickit.dc_motor_2.throttle = throttle_2

Servo: Virando a cabeça

Agora vamos anexar o servo da lição anterior e girar o braço do servo para frente e para trás usando o painel de controle do aplicativo do seu telefone:

# Comece com o braço na metade do caminho
angle = 90
crickit.servo_1.angle = angle

def adjust_angle(amount):
    global angle
    angle = angle + amount
    if angle > 180:
        angle = 180
    elif angle < 0:
        angle = 0
    crickit.servo_1.angle = angle

def handle_button_packet(packet):
    print(f"Button={packet.button}, Pressed={packet.pressed}")
    if packet.pressed:
        if packet.button == ButtonPacket.LEFT:
            adjust_angle(20)
        elif packet.button == ButtonPacket.RIGHT:
            adjust_angle(-20)

Podemos montar uma “cabeça” de copo de papel no braço do servo, permitindo girar a cabeça do robô para a esquerda e para a direita usando o painel de controle enquanto ele se move com base nas leituras do acelerômetro.

Personalize!

Agora que o robô está funcionando, vamos adicionar alguns recursos! Os botões esquerdo e direito do painel de controle são usados ​​para ajustar o ângulo do servo, mas atualmente os botões para cima e para baixo e os quatro botões numéricos não são usados. Aqui estão algumas ideias:

  • Toque uma música (volte à lição Sons para alguns exemplos musicais).
  • Pisque os LEDs em um padrão.
  • Programe o seletor de cores para permitir que você altere as cores dos LEDs.
Thanks! We hope you found what you are looking for. Please feel free to contribute via Github.