Neste artigo temos um passo a passo de como acionar um servomotor conectado numa Raspberry Pi Pico W e 2W via Bluetooth usando o App Inventor.
O aplicativo
Utilizamos neste projeto o App Inventor da MIT que é gratuito ( appinventor.mit.edu )
Primeiro vamos trabalhar no aplicativo que será responsável em conectar e enviar os comandos para a Pi Pico W. Na figura 1 temos a disposição dos itens que teremos no aplicativo – botões, legendas, status, o módulo Bluetooth e o temporizador. Na composição temos um texto para exibir as mensagens que nos ajudarão a visualizar os comandos enviados. O botão de escaneamento para ativar a busca por dispositivos próximos, uma lista para visualizar e escolher o dispositivo (Pi Pico), um botão de desconectar, um botão subir e outro descer e finalmente um deslizador para movimentarmos o servo.
Vale a pena ressaltar aqui que não precisamos ter os botões subir e descer, mais o deslizador na mesma aplicação, o motivo aqui é apenas mostrar as duas possibilidades de acionamento.

Arraste para a tela estes itens e na lateral direita configure cada um dos objetos conforme o seu gosto visual. Porém um item interessante aqui em nosso caso é ajustar os passos do deslizador, pois como exemplo, usei um servo de 180° graus, e para facilitar nas propriedades do deslizador, colocamos no campo “ValorMáximo” 180 e no “ValorMínimo” 0, e o campo “NumberOfSteps” de 180, pois a cada passo no deslizador é um passo do servo. No campo “PosiçãoDoIndicador” coloque o valor que pretende colocar o botão quando o aplicativo começar a funcionar.

Agora precisamos fazer o código em si, e aqui a programação é em blocos. Na figura 3 temos os blocos responsáveis para a conexão do aplicativo com a Pi Pico W e 2W. Temos um vídeo onde explico como fazer a conexão entre o aplicativo e a Raspberry Pi Pico – https://youtu.be/Ydu4agq3koA?si=8njOcmo2BeVATXaN .
Os blocos da figura 4 temos os botões que enviarão os comandos (letras) via Bluetooth para a Pi Pico W.
No caso do deslizador (deslServo), coloquei o bloco de “PosiçãoAlterada” que é executada quando o botão é deslizado para qualquer um dos lados, executando o conteúdo interno que é uma chamada do módulo Bluetooth, onde ele escreve uma string (.WriteString). Os parâmetros passados são as variáveis de “service_Uuid”, “characteristicsUuid”, colocando em “Falso” o utf16 – pois estamos enviando em utf8, e no campo “values”, juntamos um campo de texto vazio e um arredondamento do valor em que o deslizador está (posiçãoDoIdentificador).
Para sabermos o que está sendo passado para a Pi Pico, colocamos o valor da posição do deslizador na tela através do Status. O mesmo acontece com os botões subir e descer, porém enviamos simplesmente as letras “S” e “A”
Com o App Inventor instalado no aparelho de celular ou tablet é possível testar o aplicativo, onde na barra de menu temos o botão “Conectar” e utilizar o “Assistente de IA”, quando o projeto estiver pronto é só compilar e gravar no aparelho de celular ou tablet.
O código da Raspberry Pi Pico W e 2W
Agora vamos criar todo o projeto de controle da Pi Pico W, onde deverá estabelecer a conexão e receber os dados para executar as ações com servo.
Precisaremos de uma biblioteca chamada BLESimplePeripheral, que deverá estar gravada na Pi Pico W e o código principal. Abaixo temos o código comentado.
from machine import Pin, PWM
import bluetooth
from ble_simple_peripheral import BLESimplePeripheral
import time
pino_servo = machine.Pin(16, machine.Pin.OUT)
servo = machine.PWM(pino_servo)
servo.freq(50)
# Criando um objeto BLE (Bluetooth Low Energy)
ble = bluetooth.BLE()
# Criando uma instancia da classe BLESimplePeripheral com o Objeto ble
sp = BLESimplePeripheral(ble,"Mooca")
led = Pin("LED", Pin.OUT)
def definir_angulo(angulo):
"""
Converte o ângulo (0 a 180) para o ciclo de trabalho do PWM (duty cycle).
Na Pico, o duty_u16 vai de 0 a 65535.
Geralmente:
- 0 graus corresponde a ~1638 (0.5ms)
- 180 graus corresponde a ~7864 (2.4ms)
"""
# Mapeamento matemático simples de 0-180 para 1638-7864
duty = int(1638 + (angulo / 180) * (7864 - 1638))
servo.duty_u16(duty)
print("duty: ", duty) #exibe no sheel o valor recebido
def update_traffic(data):
decoded_data = data.decode('utf-8').rstrip('\r\n') #Limpamos os retornos de linha
decoded_data = decoded_data.rstrip('\x00') #limpamos os dados adicionados no app
if decoded_data == "S":
definir_angulo(90)
elif decoded_data == "A":
definir_angulo(0)
else:
graus = float(decoded_data) #converte o texto em float.
definir_angulo(graus)
# Define a função callback para o recebimento de dados
def on_rx(data):
decoded = data.decode('utf-8').rstrip('\x00')
print("Valor recebido: ",decoded) # Mostra no shell o valor recebido
update_traffic(data)
# Começa o Loop
while True:
if sp.is_connected(): # Verifica se foi estabelecida a conexão BLE
sp.on_write(on_rx) # Configura a função callback para a recepção de dados
Em resumo o código faz a conexão com o aplicativo utilizando a “BLESimplePeripheral”, uma vez a conexão estabelecida ele fica lendo os dados recebidos pela função on_write(on_rx), que trata os dados recebidos e chama outra função, a update_traffic(data), onde temos a verificação se o valor recebido é um “S” ou um “A”, ou se não for, ele move o servo com o número obtido.
Conclusão
É possível ver aqui uma simples ação de acionamento de um servo conectado numa Pi Pico W através de um aplicativo no aparelho celular ou tablet via Bluetooth. Note que aqui colocamos apenas os blocos e códigos necessários para o entendimento do funcionamento do sistema, pois é preciso adicionar algumas funções extras de segurança em caso de envios errados de valores ou de desconexão.
No link abaixo temos um vídeo onde explico passo a passo este procedimento.
https://www.youtube.com/watch?v=yQfgUhWZ9go

















