Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Agradeça a todos os motoristas corteses

Componentes e suprimentos

Arduino MKR1000
× 1
SparkFun Bluetooth Modem - BlueSMiRF prata
× 1
Adafruit Conversor de nível lógico bidirecional seguro para I2C de 4 canais - BSS138
× 1
Adafruit Flexível Adafruit DotStar Matrix 8x32 - 256 RGB LED Pixels
× 1
Adafruit 4 pinos JST SM Plug + Conjunto de cabo de receptáculo
× 1
Conector DC 2,1 mm barrel
× 1
Adaptador de alimentação CA 5V @ 4A
× 1
Posição do cabeçalho 4 masculino (0,1 ")
× 1
Breadboard (genérico)
× 1
Caixa de projeto
Escolha um grande o suficiente para conter todas as coisas mais a altura do Bluetooth.
× 1
1/4 "x 4.5" x 15 "Contraplacado de bétula do Báltico
× 1
Fita para carpintaria, 1 "x 50 '
× 1

Ferramentas e máquinas necessárias

Ferro de soldar (genérico)
Pistola de cola quente (genérica)
Forestner bits
Drill
Lixa
Grit 120 para eliminar as arestas vivas.

Aplicativos e serviços online

Arduino IDE
Virtual Shield para Arduino
Adafruit DotStar

Sobre este projeto


Desde que estou dirigindo, quero ser capaz de me comunicar de uma forma mais significativa com os motoristas aleatórios ao meu redor. Pareceu-me que um flash de luz, um aceno de mão, um gesto envolvendo muito mais do que um aceno de mão, uma buzina ou uma batida no freio, tudo acabou sendo um mecanismo de comunicação muito grosseiro.

A inspiração para isso foi um filme de James Bond onde, na cena de abertura, ele teve um texto que ficou exposto na janela traseira de seu Austin Martin. Eu pensei, eu realmente poderia dizer (não apenas expressar com mãos onduladas) ao motorista do outro veículo exatamente o que eu estava pensando.

Aqui está uma demonstração de bancada:

E uma demonstração quase ao vivo:

Aqui está o esboço do conceito:

Este projeto teve um desafio adicional porque a MKR1000 é uma placa de pré-lançamento e não há documentação formal. Há um bom ponto de partida no Hackster:

https://www.hackster.io/charifmahmoudi/arduino-mkr1000-getting-started-08bb4a

Portanto, na primeira etapa do projeto:

Faça o MKR1000 falar

Tive a sorte de entrar no fórum patrocinado por http://arduino.cc, que tinha um fórum privado para nós, proprietários de placas por lançamento. Depois de um sábado sólido, consegui programar a placa e fazer todos os componentes funcionarem.

Minha configuração atual envolve a construção horária do Arduino IDE versão 1.6.9. Se você for como eu, usar compilações "por hora" em um projeto o deixará "desconfortável" no mínimo.

Depois de instalar o IDE, baixei os drivers da placa com o gerenciador de placas IDE. Também carreguei as seguintes bibliotecas usando o gerenciador de biblioteca IDE:Adafruit DotStar, Adafruit DotStarMatrix, Adafruit GFX, ArduinoJson e Windows Virtual Shields para Arduino.

Quando esta placa for lançada oficialmente, o processo será muito mais simples. Portanto, não vou detalhar aqui. Há uma referência a um projeto para ajudá-lo a fazer isso no final do artigo.

Regra número 1 para construir eletrônicos: nunca deixe a mágica sair do circuito!

O MKR100 é uma placa baseada em 3v3. Não tendo toda a documentação que gostaria, não sabia se eram tolerantes a 5 volts. Não só que alguns dos componentes realmente desejam ter 5 volts disponíveis para estabelecer a lógica adequada 1 e 0.

Isso trouxe à tona a necessidade de mudança de nível bidirecional de 4 canais por Adafruit. Tanto a placa bluetooth e especialmente a matriz DotStar realmente gostam de 5 volts. Portanto, tome cuidado ao conectar essas coisas.

Certifique-se de que os componentes funcionam

Antes de me preocupar em fazer tudo funcionar junto, quero ter certeza de que todos os componentes funcionaram.

Comecei com a matriz Adafruit 8x32 DotStar. Descobri que as conexões que eu tinha eram um pouco instáveis. Para fazer isso não ser um problema, usei alguns pinos de cabeçalho que eu tinha e apenas os soldei.

Com os pinos de cabeçalho firmemente presos. Eu encaminhei o Data and Clock In para os pinos SPI marcados como SDA e SCL no MKR1000.

Com os pinos de cabeçalho firmemente presos. Eu encaminhei o Data and Clock In para os pinos SPI marcados como SDA e SCL no MKR1000.

Carreguei o esboço de exemplo "Arquivo> Exemplos> Adafruit DotStarMatric> teste de matriz" no IDE. Ajustou DATAPIN para 11 e CLOCKPIN para 12 no código. Construiu e implantou a solução. Depois de um pouco com a opção da matriz acabei com um display funcionando.

O próximo passo foi fazer o Virtual Shield funcionar no adaptador Bluetooth. Foi realmente direto. Segui as instruções mencionadas no repositório github https://github.com/ms-iot/virtual-shields-arduino. A única alteração que tive de fazer foram os pinos TX e RX. Esses são os pinos 14 e 13 marcados na minha placa.

Eu observaria, porém, que em encarnações anteriores, tive que desconectar os pinos TX / RX para fazer o upload de novos esboços. Tenho o prazer de informar que não é mais o caso.

Percorra o código

Agora que tudo está funcionando, analisarei o código específico para este projeto.

Para acessar todas as funções, você precisa incluir o seguinte:
  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include   

As primeiras 5 inclusões devem ser bastante explicativas.

O VirtualShield.h contém a funcionalidade básica para comunicação por meio do adaptador bluetooth. Isso é necessário independentemente de qual sensor você deseja acessar.

O arquivo Text.h obtém seu melhor texto, ou seja, manipulação de strings.

Graphics.h, Recognition.h e Colors.h contêm a funcionalidade necessária para acessar a tela virtual e habilitar o reconhecimento de voz. Embora não tenha terminado para este desafio, irei codificar os recursos de voz no futuro.

Em seguida, na lista de linhas de código importantes, inicializando a matriz DotStar e inicializando o objeto Shield:
  Matriz Adafruit_DotStarMatrix =Adafruit_DotStarMatrix (32, 8, DATAPIN, CLOCKPIN, DS_MATRIX_TOP + DS_MATRIX_LEFT + DS_MATRIX_COLUMNS + DS_MATRIX_ZIGZAG, DOTSTAR_GBR_BR, cor de 255, 0 cores (0 cores, matriz u16_GBR) const. Cor (0, 255, 0), matriz.Cor (0, 0, 255), matriz.Cor (255, 0, 255), matriz.Cor (255, 0, 106), matriz.Cor (255, 255, 255)}; escudo VirtualShield; Tela gráfica =Gráfico (escudo); Fala de reconhecimento =Reconhecimento (escudo);  

A primeira linha informa à biblioteca DotStar o tamanho e o layout da matriz. Consulte o exemplo de teste de matriz ou o arquivo Adafruit_DotStarMatrix.h para as várias opções.

As cores são para a biblioteca DotStar.

As últimas 3 linhas disparam o escudo e inicializam os objetos para trabalhar com os sensores do telefone.

Em seguida, como todos os esboços do Arduino, precisamos lidar com o método setup ()
  void setup () {matrix.begin (); matrix.setTextWrap (false); matrix.setBrightness (40); matrix.setTextColor (colors [0]); DisplayText ("Inicializando ...", 4, 10); // configurar eventos de escudo virtual:shield.setOnRefresh (refresh); speech.setOnEvent (onSpeech); screen.setOnEvent (screenEvent); // inicia a comunicação do escudo (também chama refresh ()). escudo.begin (); // assume 115200 baudrate Bluetooth DisplayText ("Inicializando ... concluído", 3, 10);}  

As linhas da "matriz" são bastante autoexplicativas e, com essas linhas sendo executadas, agora tenho a capacidade de enviar algumas mensagens informativas para a matriz.

As linhas de "escudo" agora configuram métodos de retorno de chamada. Esses métodos serão chamados conforme necessário quando os eventos acontecerem.

Agora, para o método mais complicado de todo o esboço
  void loop () {// checkSensors () verifica os eventos de retorno e os trata (chamando callbacks). Este é o método loop () único do VirtualShield. shield.checkSensors ();}  

Sim, você entendeu. Verificamos continuamente se um dos sensores foi acionado e se é necessário lidar com o evento.

Ok, agora vamos realmente lidar com alguns eventos. O primeiro é o método refresh (). Ele será chamado quando vários eventos diferentes acontecerem. O único evento com que nos importamos no momento é quando o bluetooth está conectado. Precisamos de eventos para que possamos redesenhar a tela para que fique como deveria.
  void refresh (ShieldEvent * shieldEvent) {// coloque seu código de atualização aqui // é executado sempre que o Bluetooth se conecta, sempre que o shield.begin () é executado ou o botão 'atualizar' é pressionado no aplicativo:screen.clear (ARGB (123,86,204)); screen.drawAt (0,0, ""); thanksId =screen.addButton (10, 50, ". Obrigado."); welcomeId =screen.addButton (10, 100, ". Bem-vindo."); turnLeftId =screen.addButton (10, 150, ". Esquerda."); stoppingId =screen.addButton (175, 50, ". Parando."); startupId =screen.addButton (175, 100, ". Iniciando."); turnRightId =screen.addButton (175, 150, ". Certo."); backoffId =screen.addButton (10, 225, ". Back Off."); chamando911Id =screen.addButton (10, 290, ". Ligando para 911.");}  

Este método limpa a tela com um fundo roxo claro e coloca os vários botões na tela. Observe o espaçamento entre as palavras. Esta é uma limitação atual da funcionalidade do escudo virtual, pois eu realmente queria centralizar as coisas para torná-las bonitas.

Então, o que acontece quando eu toco um desses botões? Um evento é disparado e tratado no seguinte trecho de código.
  void screenEvent (ShieldEvent * shieldEvent) {if (screen.isPressed (thanksId)) {DisplayText ("Obrigado", 5, 100); } if (screen.isPressed (welcomeId)) {DisplayText ("De nada", 2, 100); } if (screen.isPressed (backoffId)) {DisplayText ("Por favor, recue", 4, 100); } if (screen.isPressed (stoppingId)) {DisplayText ("... parando ...", 0, 100); } if (screen.isPressed (initialId)) {DisplayText ("... começando ...", 1, 100); } if (screen.isPressed (turnLeftId)) {DisplayText ("Turning LEFT", 3, 100); } if (screen.isPressed (turnRightId)) {DisplayText ("Turning RIGHT", 3, 100); } if (screen.isPressed (call911Id)) {DisplayText ("Calling 911", 0, 100); }}  

Um evento chega, o código verifica qual botão está pressionado e chamamos o método DisplayText com o material a ser mostrado.

E, finalmente, como o texto chega à matriz? O método DisplayText cuidará disso para você.
  void DisplayText (String mensagem, int colorIndex, int currDelay) {int x =matrix.width (); int maxX =-1 * (message.length () * 5 + message.length ()); matrix.setTextColor (colors [colorIndex]); while (x> maxX) {matrix.fillScreen (0); matrix.setCursor (x, 0); matrix.print (mensagem); --x; matrix.show (); atraso (currDelay); }}  

Este método descobre a largura real dessa string. Precisamos saber, para que possamos ter certeza de que a string está totalmente rolada para dentro e fora de vista. As letras são 5 de largura + 1 para o espaço entre as letras.

Construir o gabinete

A construção foi bastante simples. Encontrei uma caixa de tamanho decente que era maior do que a pegada da matriz. Peguei um pedaço de bétula báltica de 1/4 "maior do que eu precisava e cortei no tamanho certo.

Usando a mesma técnica da serra de mesa. Comece colocando a matriz sobre o compensado. Depois de posicionada, marque os centros horizontal e vertical das conexões (incluindo a conexão de alimentação auxiliar). Tudo o que você precisa fazer agora é conectar as linhas para encontrar o centro dos buracos que você está prestes a perfurar.

Sim, eu disse 'furar', não 'perfurar. A última vez que eu estava "fazendo" furos em plástico, tive alguns resultados realmente insatisfatórios. Desta vez, usei bits Forestner . Eu tenho uma foto deles abaixo. Observe que a borda é para cortar e o centro tem um raspador para retirar a madeira indesejada. Faz um "buraco" muito mais agradável. Agora, vá para o ponto de “enfadonho” e provavelmente vai querer ir em frente e furar os orifícios da suspensão.

Pegue um pedaço de lixa 120 e lixe levemente toda a peça. Certifique-se de que a 'suavidade' das bordas da placa inclua todos os orifícios que acabaram de ser feitos. Certifique-se de limpar a placa para que não haja serragem de outras "coisas" na placa.

Agora é hora de trabalhar na caixa de plástico.

Faça dois furos em cada extremidade da caixa. Eles são para o conector de alimentação e a conexão com a matriz. Não perfure o orifício de alimentação auxiliar da matriz ainda.

Agora, aplique algumas tiras da fita dupla-face na parte de trás da caixa e prenda a caixa na madeira compensada. Como essa fita é "capaz de ser reposicionada", eu realmente queria que ela pegasse para sempre. Coloquei alguns livros pesados ​​em cima e deixei por 24 horas. Por que 24 horas? As instruções da fita dizem para não fazer isso. Essa foi uma razão boa o suficiente para mim.

É hora do último buraco. Agora você deve ter uma posição exata para o orifício de conexão de alimentação auxiliar. Enfie isso, aproveite o seu trabalho de aparência 'precisa'.

Coloque a inteligência na caixa

Parece que a placa de ensaio tinha o tamanho certo para a caixa, mas eu queria poder conectar / desconectar o conector USB do MKR1000. Então, eu tive que tornar a placa de ensaio mais curta.

Ok, depois desse trauma, descasque a parte de trás da placa de ensaio e fixe-a. Certifique-se de evitar o orifício de conexão de alimentação auxiliar.

Prenda a matriz na frente do compensado passando as conexões pelos orifícios. Prenda a matriz com um pouco de cola quente.

Vamos falar sobre poder

Mesmo que eu tenha o brilho definido para 40%, a corrente máxima se eu iluminar todos os 256 pixels é cerca de 7,5 Amps. Muito mais do que o MKR1000 poderia fornecer. Felizmente para mim, nenhuma tela está estática e não estou iluminando nenhum lugar perto da matriz completa. A conexão de alimentação auxiliar vem em socorro. Estou fornecendo até 4A. Eu acho que, uma vez que não é sustentado e nem estático, a fonte de alimentação deve ser boa.

Eu também tinha uma verruga sobressalente na parede que usei para fornecer energia ao MKR1000 ao ser ligado no veículo.

Eu estava pensando em construir um conversor de energia no projeto para pegar a energia de 12 V do carro e fornecer 5 V para o projeto. Depois de muito pensar, era melhor em todos os aspectos conseguir um adaptador CA 5V 4A por $ 5,00 e usar um conversor CA que já possuo. Simples geralmente é melhor quando se trata dessas coisas.

Pendurar a placa

Eu tinha planejado usar "cabos elásticos de bola" e algumas ventosas para prendê-los ao para-brisa traseiro. Digamos apenas que tenho mais trabalho a fazer na área.

Código

O código Diga Obrigado
https://github.com/pulcher/mkr1000_challenge

Esquemas

O MKR1000 é apenas um micro, já que o MKR1000 real ainda não foi lançado.

Processo de manufatura

  1. UnifiedWater v1
  2. Caixa de votação móvel
  3. Arduino101 / tinyTILE BLE:Óculos de sol que combinam
  4. Whac-A-Mole (Edição de botão)
  5. Jukebox moderna
  6. Arduino Apple Watch
  7. Caseiro Arduino, Si4730 All Band Receiver (LW, MW, SW, FM)
  8. Tudo sobre acabamentos de PCB, explicado
  9. EDM Spark Erosion:Do que se trata?
  10. Rolamentos de flange explicados em todas as suas variedades