Executando verificação de segurança...
10

Tentando recriar as pulseiras do Coldplay com um Jr. e JS

Oi, pessoal! Tudo bem?

Antes de entrar na parte técnica, deixa eu me apresentar rapidinho. Prazer, me chamo Tobias. Ainda estou nos primeiros passos da minha jornada na área tech, mas a vontade de criar e explorar soluções criativas me trouxe até aqui. Se você gostar desse post ou estiver trabalhando em algo interessante, ficarei feliz em trocar uma ideia!

Hoje quero dividir com vocês uma experiência de projeto que me levou do entusiasmo à frustração (e de volta ao entusiasmo algumas vezes). A ideia parecia genial na minha cabeça, mas a execução... bom, foi um pouco mais complicada. O projeto está aposentado (por enquanto), mas o que aprendi nesse processo fez cada minuto valer a pena.

Ah, se eu cometer algum equívoco técnico ou deixar passar algum detalhe, já peço desculpas! Estou em fase de aprendizado e ficaria muito grato se você puder me corrigir ou complementar nos comentários. Isso me ajuda a aprender e deixa o post ainda mais completo para todo mundo. 😁

Como tudo começou

Estava batendo papo com um amigo quando começamos a falar das Xylobands, aquelas pulseiras que brilham de forma sincronizada nos shows do Coldplay. A conversa estava tranquila até ele soltar uma frase que me deixou sem alternativa: "EU DUVIDO tu recriar isso".

Pronto. Agora era questão de honra.

A ideia? Transformar os celulares das pessoas em pulseiras de luz, sincronizando a lanterna ou a tela em tempo real. A execução, porém, revelou ser mais complexa do que eu imaginava.

Para quem não conhece as pulseiras, esse vídeo mostra o efeito que estamos tentamos replicar. Também existem diversos vídeos que mostram as pulseiras gerando desenhos como corações ou até palavras escritas na multidão.

Requisitos

Antes de sair escrevendo código, primeiro vamos definir nosso objetivo:

  • Compatibilidade
    Gostaria de abranger o maior número possível de smartphones, então deveria utilizar tecnologias amplamente difundidas;
  • Praticidade
    A simples presença de um grupo de pessoas em um local de forma completamente orgânica deveria permitir criar um evento;
  • Evitar equipamentos dedicados
    Deveria estruturar o projeto para evitar ao máximo hardwares dedicados, o objetivo é usar o máximo que um celular tem a oferecer.

Como eu achei que seria

A minha primeira ideia (e bem ingênua) foi usar GPS. O raciocínio era simples: como a galera vai estar em uma área pequena, posso tratar as coordenadas geográficas como pontos em um plano cartesiano, já que localmente a terra é quase plana. Trunco os valores para as primeiras N casas decimais, ordeno, posiciono em uma matriz e "TAM DAM" tenho basicamente uma tela com vários pixels na memória. Parece razoável, né? Só que não.

Nos testes, a precisão do GPS variava entre 8 e 9 metros (em dias bons). O problema? Para esse projeto, eu precisava de algo na casa dos decímetros. A diferença entre um show incrível e um desastre era, literalmente, uma questão de centímetros. Esse vídeo mostra um breve demo que construí. Aparentemente tudo está mais ou menos funcionando, porém a posição dos "cubinhos" não refletiria em nada as posições verdadeiras das pessoas devido a essa acurácia muito baixa do GPS.

Por mais que nada tenha dado certo, até aqui o saldo do projeto já havia sido positivo. Explorei tecnologias que nunca tinha utilizado, revisei conceitos sobre autenticação e realtime. Gostaria de ter a oportunidade de trocar uma ideia com alguém mais experiente sobre essa parte e entender se existem alternativas melhores do que as escolhi, mas isso é assunto para um outro momento.

Explorando opções

Como o GPS não foi uma solução viável, comecei a explorar outras alternativas. Comecei a pensar em formas de mapear os usuários. Três estratégias vieram à mente:

  • Vínculo manual
    As pessoas escaneariam QR codes ou digitariam IDs para informar quem estava ao seu lado. Funcionaria, mas é impraticável para grandes multidões, sem contar que tiraria toda a "beleza" do projeto.
  • Calibração coletiva
    Imagine um público inteiro balançando o celular sincronizadamente (tipo uma "ola" de um estádio). O uso de acelerômetro poderia permitir capturar o movimento e mapear as posições em uma matriz, mas a eficácia dependia da coordenação do público.
  • Distâncias relativas (minha favorita)
    Se eu conseguisse medir distâncias entre os celulares, poderia criar um grafo e triangular as posições. Mais dispositivos significariam maior precisão. Parecia promissor... até eu tentar descobrir como, de fato, medir essas distâncias e ainda depois reconstruir as posições com base nas distâncias relativas.

Descobrindo tecnologias

Bom, nesse caso o primeiro passo é descobrir como vamos medir as distâncias entre os usuários.

  • BLE (RSSI)
    O Bluetooth parecia uma ótima opção devido a alta compatibilidade. Existem diversos projetos onde Beacons são utilizados para medir distâncias usando a força do sinal (RSSI) e estimar distâncias. Porém, tudo que encontrei foram casos onde os Beacons estavam em posições fixas previamente definidas, algo incompatível para esse contexto.
  • Ultrassom
    Interessante, mas confesso que não senti muita confiança. Primeiramente seria necessário organizar os dispositivos para que eles funcionassem como emissores e receptores em intervalos de tempo definidos. Além disso, juntar muitas pessoas é sinônimo de barulho, então por mais que o ultrassom trabalhe em outra frequência, com certeza a interferência do ambiente prejudicará a medição.
  • UWB (Ultra Wideband)
    Preciso, confiável, e com margem de erro de poucos centímetros. A API Nearby Interaction da Apple parecia perfeita! Mas aí veio o balde de água fria: o UWB só é compatível com dispositivos lançados a partir da família do iPhone 11; e como eu preciso estimar distâncias, neste caso utilizando uma tecnologia chamada Extended Distance Measurement (EDM), nos restringimos a dispositivos lançados a partir do Iphone 15. Desta forma, rasgaríamos nosso requisito de compatibilidade.

Reconstruindo as posições

Para fins didáticos, digamos que eu tivesse conseguido medir as distâncias entre celulares. A próxima etapa seria reconstruir suas posições em um espaço tridimensional.

Um dos primeiros desafios que percebi foi o acúmulo de erros. Imagine um evento com milhares de pessoas: medir distâncias relativas envolve pequenos valores de erro. Utilizar algum método que simplesmente percorre os dispositivos, posicionando os que ainda não foram posicionados, acumularia um erro de vários metros, gerando uma reconstrução significativamente equivocada. Em grandes eventos, o erro acumulado poderia fazer com que metade do público fosse parar — virtualmente — do lado de fora do estádio.

Diante disso, resolvi pesquisar sobre algoritmos que pudessem me ajudar a reconstruir esse espaço. Pela primeira vez tive contato com técnicas como Gradiente Descendente, Mínimos Quadrados, Non-Metric Multidimensional Scaling, Filtro de Kalman… Esses métodos são utilizados justamente para minimizar erros acumulados e ajustar o posicionamento dos pontos, seja de forma iterativa ou analítica. São técnicas poderosas que utilizam abordagens diferentes, mas todas elas tem duas características em comum: complexidade computacional e uma matemática sólida por trás. Confesso que ainda não possuo a maturidade matemática e técnica necessária para avaliar se essas estratégias seriam boas opções (ou sequer se resolveriam o problema), mas de qualquer modo a leitura foi muito proveitosa.

Onde cheguei

Embora o projeto não tenha sido completamente implementado (ainda), o processo de pesquisa e desenvolvimento foi extremamente enriquecedor. Aprendi sobre tecnologias emergentes, limitações práticas e, principalmente, sobre a importância de manter os pés no chão — sem deixar de sonhar alto.

Esse projeto não saiu do papel, mas me abriu portas para áreas que eu nem sabia que existiam. Uma das lições mais valiosas que aprendi é que os maiores aprendizados surgem justamente ao enfrentar desafios que nos tiram da zona de conforto. Espero que essa experiência inspire você a encarar aquele projeto meio absurdo que está na sua cabeça. Porque, no fim das contas, é aí que a mágica acontece.

Se curtiu esse post ou quiser trocar uma ideia, estou sempre aberto para conversar!

Carregando publicação patrocinada...
4

Olá Tobias, muito legal a sua idea, li todo o seu post com brilho no olho, acredito que cada aprendizado é algo que enriquece nossos pensamentos

trabalho a algum tempo na area de desenvolvimento, e se puder fornecer meus 5 centavos, acredito que a forma mais factivel te atingir esse objetivo seria...

Primeiro torna-lo em um MVP, bom MVP é o caminho com menor esforço tanto financeiro quanto de tempo para atingir um objetivo.

E com isso responder a duas peguntas

A) como emitir o sinal

Um servidor dedicado na nuvem, com banda ilimitada para transmissão dos dados e recepção das posições dos celulares, com isso ele consegue pegar todas as posições recebidas do gps dos celulares fazer um calculo e criar um plano cartesiano

B) como receber o sinal

toda comunicação entre celulares e servidor é feita atraves de um aplicativo web, os celulares enviam sua posição no gps, e o servidor envia o sinal para o aparelho

e a linguagem usada a implementação disso fica na escolha da linguagem que leva menos tempo para ser implementada tanto backend como frontend.

bom é so uma ideia de um possível caminho, e uma coisa que aprendi, com esses anos de carreira é voce nunca vai saber tudo, e voce precisa de pessoas para atingir objetivos maiores, seja time grande ou pequeno, se tiver alguem que sonhe com você, você atingi seus objetivos mais rápidos

um grande abraço e boa sorte meu amigo!

4

Já vi um blog post de uma pessoa que fez engenharia reversa numa dessas pulseiras, pode te ajudar com algo. Não li todo o material, mas tem bastante coisa no GitHub.

Essa pulseira mencionada no blog funciona com sinal infravermelho:

Placa

On that board are two RGB LEDs, a little microcontroller, a little bit of EEPROM and an infrared diode to receive a signal. So, simply put, PixMob works by installed a really big (and moveable) IR remote control (you can read about this on their website here) and transmitting commands to the bracelets to produce colours, fades, flashes, etc. Cute.

There are a bunch of hardware details here.

Since they are projecting infrared with moveable projector they can sweep effects around the stadium, and cover the projector with cut outs to make things like hearts. It's simple technology that works very nicely. And, of course, there's a reverse engineering community built up around this.

1

Olá, Rafael! Tudo certo?

Sim, pesquisei um pouco sobre como elas funcionanvam antes de começar essa saga. Vou me aprofundar mais nesse material que você indicou também. Muito obrigado por compartilhar!

Gostei muito desse artigo do medium pois mostra com algumas ilustrações como o IV permite criar esses efeitos complexos!

2

Já pensou que a solução pode ser muito mais simples? Um sinal oculto dentro da musica que dá "play" numa sequência predefinida?

Basta um microfone para identificar um certo padrão.

O efeito de onda no estádio ficaria a cargo do atraso da entrega do sinal pela velocidade do som (uns 0.4 segundos de atraso de um ponto ao outro?)

1

Realmente não tinha pensando nessa ideia de "esconder" um comando dentro da própria música, muito interessante!

Posso não ter entendido completamente a ideia, mas como isso permitiria criar efeitos mais complexos? As pulseiras que estou utilizando como referência eram capazes de criar imagens como corações na arquibancada por meio de uma espécie de "canhão" de infravermelho. Realmente é uma meta um pouco ousada replicar isso sem um hardware dedicado, mas não vejo uma forma de fazer isso sem mapear os dispositivos para uma estrutura mais rígida, como uma matriz ou algo similar.

Além disso, limitar o uso junto a músicas previamente definidas e editadas acaba indo contra o requisito de "praticidade" que havia definido. Gostaria que as luzes fossem independestes neste sentido.

1

Realmente efeitos mais compkexos não funcionaria. E confiar no som com triangulação não é facil pois há muito eco, reverberação, isso poderia causar uma falha de sincronização.

Vi no outro comentário que a original funciona via IR com canhões de IR... É uma solução bem mais robusta.

1
1