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

Talking Portal 2 Turret Gun

Componentes e suprimentos

Arduino Nano R3
× 1

Ferramentas e máquinas necessárias

Impressora 3D (genérica)

Sobre este projeto









A história


Neste Natal, decidi projetar e construir uma arma de torre de portal funcional a partir do jogo Portal 2 . Para mim, este foi um exercício de modelar adequadamente a montagem inteira no Fusion 360 primeiro, antes de construir qualquer coisa. Este projeto usa um Arduino Nano, um chip de MP3 player, sensor de distância, servos, LEDs e peças impressas em 3D.

O objetivo aqui era fazê-lo mover-se em 3 "eixos", com som falado do jogo e leds para simular o disparo.
  • Abra as "asas" se sentir alguém na frente. Use um mecanismo de manivela com controles deslizantes, só porque.
  • Se a pessoa ainda estiver lá após a abertura, atire até cair. LEDs e som de metralhadora.
  • Se a pessoa não estiver mais lá, execute uma pequena verificação de rotina de pesquisa.
  • Feche a cama e durma até que outra pessoa apareça.
  • Use sons e vozes da torre do Portal do jogo.

Tomei algumas liberdades no design, tentando torná-lo sensivelmente igual ao visto no jogo, mas funcional e imprimível. Com alguns esboços básicos encontrados online, comecei a modelar e planejar ...

Os sons são armazenados em um cartão microSD, que pode ser acessado na parte de trás para que os sons possam ser atualizados ou alterados posteriormente. É alinhado com a faixa de preenchimento preta, tornando-o essencialmente invisível depois de instalado. 18 expressões individuais e sons usados ​​nesta rodada.

O sensor lidar (tempo de vôo) está em um chip com um perfil retangular. Este sensor é quase invisível de frente uma vez montado.





Etapa 1:Modelagem do Fusion 360


O design começou a partir de esboços encontrados online. Usando essas imagens como telas, comecei a esboçar os contornos das 3 vistas. Em seguida, foi uma questão de extrudá-los em 3D e, em seguida, descascar a forma geral e fazer os cortes. Todos os componentes eletrônicos foram construídos no Fusion como componentes que foram inseridos e colocados onde achei que faria sentido. Os parâmetros de condução foram:
  • O Arduino Nano precisava ter um conector acessível para atualização depois de totalmente montado
  • O cartão MicroSD deve ser acessível da mesma maneira e, de preferência, invisível depois de instalado
  • O sensor de tempo de voo também deve ser invisível
  • Um conector elétrico de 2,1 mm para alimentação na parte traseira
  • As peças impressas devem ser o maior possível (não muitas peças pequenas)
  • Imprimir sem suporte

Depois que os componentes (Nano, outros chips, servos) foram adicionados à forma básica, eles foram movidos e posicionados conforme necessário, e as estruturas de suporte foram construídas para suportá-los dentro da concha.

O mecanismo de abertura da asa era uma manivela e um mecanismo deslizante. Por quê? Porque eu queria usar um mecanismo de manivela, é por isso! Isso acrescentou algumas complicações, mas também teve um benefício; uma vez que a geometria fosse determinada, a repetibilidade operacional seria assegurada e os limites mínimo e máximo estavam praticamente garantidos.

Depois que todo o modelo foi construído e eu estava confiante de que funcionaria e poderia ser construído (impresso) e montado, fui em frente e imprimi as peças e construí um protótipo. Depois de dar certo, voltei ao modelo e fiz alguns ajustes para melhorar a aparência e a montagem (isso é uma palavra?). Esse modelo é o que veio dessas mudanças.

Isso foi muito cansativo, já que realmente não existem muitas formas quadradas nesta coisa, e fecha com bastante firmeza, sem nenhum acesso real para ajustes depois de montada. Aprendi um pouco neste projeto, como usar componentes incorporados em outros componentes. Isso tornava a manipulação e manutenção de subconjuntos vinculados para acesso rápido. No final, valeu a pena!





Etapa 2:peças impressas em 3D


A torre do portal v4.zip foi atualizada e deve conter todas as partes impressas necessárias para construir a torre mais recente.

--- nova "Perna de teste traseira". Não é fiel ao original, mas está na parte de trás e permite usar um conector mini-USB direto para cima. ---

Estes foram impressos em um Prusa Mk2, usando PLA para todas as peças. A orientação da impressão deve ser bastante evidente. O corpo foi impresso na posição vertical, sem suportes. Há uma grande lacuna nas laterais que precisa ser transposta, mas eu realmente não tive grandes problemas com as configurações padrão, além do relevo. O solavanco na frente e atrás pode ser virtualmente eliminado com um bom filamento e algumas boas configurações de impressão. Descobri que 0,2 mm funcionou bem no cortador e produziu um resultado decente. Quaisquer aberturas maiores começaram a aparecer no corpo perto da faixa de enchimento.

O projeto de canais e saliências foi feito com chanfros de 45 graus, portanto, os elementos "suspensos no espaço" serão mínimos.

Eu tinha pouca limpeza a fazer para montar a montagem. As tiras de preenchimento que deslizam nos canais agora são bem diretas, com largura reduzida e espessura consistente. Acho que se poderia usar um material preto fino cortado em tiras em vez de usar essas peças impressas (impressas nas bordas).

A única área que requer sutileza são os pinos deslizantes no quadro do pitch. Pinos retos (pregos) nos orifícios perfurados com uma broca de 1/8 "e um pouco de lubrificante irão percorrer um longo caminho.
Lente% 2Bv3b.stl Body-RHS% 2Bv4.stl Body-LHS% 2Bw% 2Bcomponents% 2Bv4.stl Wing% 2BRH% 2Bbottom% 2Bv4.stl Wing% 2BRH% 2Btop% 2Bv4.stl Wing% 2BLH% 2Bbottom% 2Bv4.stl Wing% 2BLH% 2Btop% 2Bv4.stl Pitch% 2BFrame% 2Bv4.stl Leg% 2B-% 2BREAR% 2Bv4.stl Preencher% 2Bstrips% 2Bv3.stl Leg% 2B-% 2BREAR% 2Btest.stl Pitch% 2BFrame% 2B-% 2Bmodified% 2B1.stl wings% 2Bv6.zip Arduino% 2BBase% 2Bw% 2BRadio.stl Portal% 2BTurret% 2Bv4.zip





Etapa 3:componentes


V4 (torre vermelha) tem ponte menor, exigindo asas v4 e estrutura de inclinação.

O v6 asas são um opção isso permite diferente cor "armas". Eu não fiz um como este pessoalmente, mas deve funcionar bem.

Assim que o modelo foi concluído e fiquei feliz com meu protótipo, imprimi o rev 2 com os componentes de plástico conforme mostrado. Tudo aqui é PLA, com preto e cor de design (azul neste caso), e um pouquinho de PLA translúcido para a "lente" central ou olho laser.

Esta foto captura muito bem os componentes, com exceção da fiação.





Etapa 4:Eletrônicos


A construção usa os seguintes componentes:
  • Arduino Nano (1)
  • DFPlayer Mini MP3 player (ou MP3-TF-16P) (1)
  • Sensor de alcance do tempo de voo VL53L0X (1)
  • Micro servos SG90 genérico (3)
  • LEDs vermelhos de 5 mm (5)
  • resistores de 220 Ohms para LEDs (5)
  • resistor de 1kOhm (1)
  • Alto-falante de 4 cm, 4 ohm, 3 watts (1)
  • conector de alimentação de 2,1 mm (1)
  • unhas de moldura comprida de 3 "(4)
  • parafusos M2 x 6 (8)
  • parafusos M2,5 x 8 (2)
  • Parafusos M3 x 8 (4)
  • parafusos M3 x 12 (4)
  • Parafusos M3 x 16 (2)
  • filme retrátil
  • gravatas pequenas

Todos os componentes estão disponíveis no Arduino, Amazon ou Banggood e em outras fontes.

Os parafusos foram obtidos de um kit de sortimento. É um pé no saco entendê-los de outra forma ...





Etapa 5:Montagem Mecânica


A maior parte da montagem mecânica é razoável. As peças impressas são impressas com os orifícios maiores rosqueados quando necessário, portanto, uma rápida busca com um parafuso antes da montagem final será útil e facilitou bastante a montagem dos componentes aparafusados.

O Arduino e o chip MP3 se encaixam na base sem hardware. O VL53LOX deslizará para dentro do revestimento frontal sem fixadores. Ajuste de teste primeiro, em seguida, remova e instale depois de conectado.

O conjunto deslizante usa 4 pregos de enquadramento como trilhos deslizantes. Eles têm cerca de 1/8 "de diâmetro, com as cabeças cortadas. Elas foram tiradas de uma tira de pregos de moldura DeWalt usada com seu pregador de moldura elétrica. Não é preciso dizer que pregos lisos são obrigatórios.

Os servos são montados conforme mostrado. A orientação é importante. O pitch e os servos de pivô são "centralizados" durante a instalação em suas peças. A manivela é instalada de forma que, na posição aberta, feche girando no sentido anti-horário, quando vista de frente. A posição aberta é as hastes e a manivela em linha reta, com mais 10 graus de rotação até o travamento.

A montagem da perna é a parte mais fácil. Parafusos de 2-2,5 mm, com as capas das pernas encaixando nos cotovelos de cada perna. Use fixadores que não ultrapassem o topo da placa da perna. Dessa forma, o corpo giratório não ficará preso se você ajustar a faixa de rotação.

Todas as conexões do servo às peças impressas são feitas usando a manivela curta branca que vem com os servos. Essas manivelas apenas pressionam as peças impressas. Tentei imprimir o furo estriado nas peças que se conectavam a cada servo, mas tive sucesso limitado e repetível. Muito mais fácil usando as manivelas que vêm com os servos.

O conjunto da manivela usa os parafusos mais longos de 2,5 mm. As hastes da manivela não devem ser pressionadas entre as metades da manivela. Na verdade, você pode tentar usar parafusos mais curtos sem a peça Crank2. Isso deve funcionar também (espero que nenhum torque apreciável aqui se as asas deslizarem livremente).

O alto-falante é capturado por uma montagem servo (2 peças) que captura o alto-falante. Alto-falante entre essas "pernas", e mantido na posição, prendendo-os ao servo de pitch. Esse servo então conectado ao conjunto de passo (controle deslizante), seguido pelo conjunto de manivela com hastes. Tudo isso é montado antes de ser instalado no corpo do LHS com 4 pequenos parafusos.

Depois que o intestino principal estiver instalado, com o Arduino e o MP3 player temporariamente localizados, a diversão começa - a fiação!





Etapa 6:Fiação


V5 - Opção de rádio (fotos da torre vermelha). Isso inclui um chip de rádio nRF24L01. Muda completamente a fiação do pino do Arduino para acomodar todas as conexões. Detalhes em breve ...

A embalagem final é justa, portanto, vale a pena passar algum tempo aqui descobrindo os comprimentos dos fios. A maioria dos fios de interconexão que acabei usando tinha entre 3 "- 4".

Os LEDs são conectados com os resistores de 220 Ohm diretamente, seguidos por algum envoltório termorretrátil e alguns fios torcidos, e então colocados de lado, após terem sido testados. Usei uma fiação de bitola leve aqui, pois tinha alguns espalhados (fiação de comunicação do tipo CAT5) e não queria que a fiação visível fosse intrusiva.

Os bits mecânicos são encaixados de forma simulada na concha, então o roteamento do fio é descoberto e, em seguida, corta e prepara os fios.

Eu construí os conectores de servo para que eu pudesse conectar e substituir os servos se alguma vez bagunçasse algo e tirasse as engrenagens. Isso foi definitivamente útil depois de bagunçar durante meu primeiro protótipo.

Uma vez satisfeito com o volume da fiação, os LEDs foram soldados na extremidade. Então é hora de colocar cuidadosamente o conjunto com fio em uma das metades da carcaça. A última etapa é soldar o conector de alimentação aos fios de alimentação assim que estiver tudo dentro.

- Nota importante:Certifique-se de que a fiação instalada atrás do Nano não esteja pressionando o botão de reset !! Obviamente, isso causará problemas e impedirá o funcionamento adequado da unidade. -

Neste ponto, toda a fiação está feita, mas antes da montagem final, é importante fazer o upload do código para o Nano e ligá-lo para garantir que os LEDs, servos e MP3 player funcionem como projetados. Depois disso, é hora de colocar o resto das peças mecânicas juntas.





Etapa 7:Código Arduino


Código atualizado! Limpei e fiz alguns ajustes.

O arquivo anexado é o que eu criei para conduzir a unidade, conforme mostrado nos vídeos. Continuarei fazendo ajustes para mudar o caráter da Torre e a maneira como ela se comporta. Muitas opções aqui.

Estruturei o código usando sub-rotinas que chamo conforme necessário. Ele mantém o corpo principal limpo e foi muito útil quando eu estava brincando com características diferentes. Isso me ajudou a manipular o código para diferentes comportamentos.

Também usei muitas variáveis ​​iniciais que me ajudaram a ajustar e ajustar as posições de estacionamento e os intervalos mínimo e máximo, por exemplo.

Usei a biblioteca DFMiniMP3 em meu código. Tentei outras bibliotecas, como a DFRobot, mas tive problemas, então voltei para esta. Isso significava que eu tinha que manter as peças do 'vazio estático' para mantê-lo funcional. Eles não são necessários para a operação, mas, ei, não sou um codificador mestre. Eu adoraria ouvir falar de outra biblioteca que seja tão simples e organizada quanto a biblioteca VL53LOX. Avise-me se encontrar uma maneira melhor de fazer isso!

Quanto aos sons, a implementação é feita de forma simples, tendo uma pasta chamada "mp3" no cartão SD, com os nomes dos arquivos 0001.mp3, 0002.mp3, etc. Os primeiros quatro dígitos devem estar neste formato, mas você pode adicionar qualquer sufixo depois disso para ajudar a identificar os sons específicos. Consulte https://www.dfrobot.com/blog-277.html para obter um exemplo. Incluí uma foto com os nomes dos meus arquivos usados ​​na pasta. Os números correspondem às chamadas no código.

Os arquivos de som que puxei da página da Wikipedia em sons do Portal Turret. O código captura um arquivo de som aleatório (1 de 2 ou 3 sons) para evitar que as coisas fiquem obsoletas.





Etapa 8:Montagem final do corpo


Esta parte é um pouco complicada por causa das faixas de preenchimento pretas. A escala da montagem final é pequena o suficiente para que as tiras e as ranhuras de recebimento sejam minúsculas. Para isso, era necessário seguir o canal com um apontador ou outro pequeno instrumento de raspagem para garantir que as tiras se encaixassem com pouca resistência antes de tentar colocar o outro lado.

Amarrar os fios ordenadamente e amarrar conforme necessário tornará isso muito mais fácil.

Eu juntei alguns deles agora e acho mais fácil juntar as duas metades primeiro e, em seguida, inserir as tiras de preenchimento. Insira um lado na metade com a "prateleira" que evita que a tira de preenchimento caia, então levante levemente e pressione suavemente para dentro. Nada mal agora.

Esta foi uma das partes mais complicadas. Talvez um dia eu repense essa montagem, mas eu gosto do jeito que fica quando feita, e é bem robusta.





Etapa 9:conjuntos de asas






Agora que o corpo está junto, com os LEDs das asas para fora, é hora de preparar as asas e montar.

É imperativo que os orifícios deslizantes sejam marcados com uma broca de 1/8 "e, em seguida, limpos. Corte as cabeças dos pregos usando um alicate de corte, morsa, serra ou ferramenta de corte de pregos favorita. Os pinos deslizantes (pregos cortados ) são instalados nas asas, encaixando-os por pressão em cada peça da asa. Pregos retos, sem rebarbas e alisados ​​são a chave para fazer este trabalho. Os cursores e orifícios das asas devem ser lubrificados e testados antes de conectar as hastes da manivela e operar. Seque Grafite ou outro lubrificante adequado para PLA é recomendado. Acho que um pequeno tubo de lubrificante pessoal funciona muito bem e é barato. É muito escorregadio. Também requer alguns 'splainin' quando seu parceiro ou pai chega e pergunta o que exatamente você precisa disso para a bancada !!

Comece descobrindo que parte da asa vai para onde e tente deslizar essa parte primeiro. Em seguida, encaixe as metades superior e inferior juntas depois que os pinos forem instalados, aplique um pouco de lubrificante (um cotonete funciona bem para isso) e certifique-se de que as asas deslizem bem. Isso pode ser complicado, mas sem ter certeza de que as asas deslizam sem esforço, sem emperrar, você terá um momento frustrante. Confie em mim...

Quando as asas estiverem prontas para uso, basta deslizá-las no lugar, posicionando a biela sobre o orifício na asa e montando com um único parafuso. Em seguida, os LEDs são inseridos nos orifícios da arma, os fios são colocados contra a asa e você está pronto para começar! Você também pode usar um pouco de cola quente para prendê-los no lugar depois que tudo for testado.





Etapa 10:assuste e choque seus amigos !!


A última pequena advertência sobre esse design é que um plugue em ângulo é uma ótima ideia, já que não interfere na perna de trás ao girar. A perna traseira revisada (v3) foi esticada para dar um pouco mais de espaço.

Uma vez construído e conectado (5V ou adequado para Nano), ele ficará quieto até que alguém seja detectado dentro da distância programada, então ganhará vida e matará qualquer um que entrar em seu domínio !!

Avise-me se você criar um (ou mais) e se apresentar novos recursos ou conceitos!

Código

  • Torre do portal com rádio (RED)
Torre do portal w Radio (RED) C / C ++
Código usado para torre. Isso inclui o código que habilitará o controle pelo Master Turret Control, apresentado em outra página.
Diferentes sabores requerem ajustes.
 /// * Torre do Portal - Opção com Rádio !! * Chris Nowak - fevereiro de 2019 * https://www.instructables.com/member/ChrisN219/ * https://create.arduino.cc/projecthub/Novachris/talking-portal-2-turret-gun-637bf3 * * Este o código inclui todos os recursos necessários para executar o Cara Mia Opera, * Chat Time e modo Manual, conforme controlado pelo Maseter Turret Control (MTC). * O MTC é um controlador separado apresentado em outra construção. A torre * irá operar de forma autônoma usando este código sem o MTC. * * O código foi criado para funcionar com três torres, mas cada uma funcionará de forma independente. * Muito código de depuração deixado. Use ou limpe conforme desejado. É quase todo depurado, * mas não é perfeito. Considerando o preço que você pagou, acho que está tudo bem!;) * =================VERMELHO ====================* / # inclui  #include  #include "Arduino.h" #include  #include  #include  #include  #include  # incluir classe  Mp3Notify {public:static void OnError (uint8_t errorCode) {// consulte DfMp3_Error para obter o código que significa Serial.println (); Serial.print ("Erro de comunicação"); Serial.println (errorCode); } static void OnPlayFinished (uint8_t globalTrack) {Serial.println (); Serial.print ("Reprodução concluída para #"); Serial.println (globalTrack); } estático void OnCardOnline (código uint8_t) {Serial.println (); Serial.print ("Cartão online"); Serial.println (código); } static void OnCardInserted (código uint8_t) {Serial.println (); Serial.print ("Cartão inserido"); Serial.println (código); } static void OnCardRemoved (código uint8_t) {Serial.println (); Serial.print ("Cartão removido"); Serial.println (código); }}; Servo servo_pivot; Servo servo_wings; Servo servo_pitch; Sensor VL53L0X; // Configuração para placa de somSoftwareSerial secondarySerial (4, 2); // RX, TXDFMiniMp3  mp3 (secondarySerial); // Configuração para radioRF24 radio (10, 9); // nRF24L01 (CE, CSN) Rede RF24Network (rádio); // Inclui o rádio na redeconst uint64_t this_node =01; // Esta torre - Vermelha - no formato Octal (04.031, etc) const uint64_t WHT =02; // Torre 02 - Whiteconst uint64_t BLU =03; // Torre 03 - Blueconst uint64_t MTC =00; // Controle mestre da torre sem sinalização long previousMillis1 =0; sem sinal longo previousMillis2 =0; sem sinal longo previousMillis3 =0; byte LED_LH_up =A1; byte LED_LH_down =A2; byte LED_CENTRE =A3; byte LED_RH_up =7; byte LED_RH_down =8; byte PIVOT =8; byte PIVOT 6; // whitebyte WINGS =3; // byte amarelo PITCH =5; // bluebyte parkPIVOT =96; // O número menor gira no sentido horário conforme visto do topbyte posPIVOT =96; byte maxPIVOT =116; byte minPIVOT =76; byte WINGclose =165; byte WINGopen =10; byte WINGpos =160; byte parkPITCH =86; byte posPITCH =86; byte maxPITCH =96; byte minPITCH =75; byte pos =90; byte pulso =20; byte pitchCW =1; byte pivotCW =1; byte randomWake; byte randomOpen; byte randomFalse; byte randomStart; byte randomDisengage; int triggerDistance =300; byte buttonStatus; byte busyRed =1; byte restModeWhite; byte goState; int x; int y; byte pb1State; // Firebyte pb2State; // diga o comentário aleatório pb3State; byte randomPic; // Carga útil do Master Turret Control (MTC) // carga útil int [] ={0, 1, 2, 3, 4, 5}; // carga útil int [] ={x , y, pb1State, pb2State, pb3State, goState}; int payload [6]; / * Este é o mapa de "conversa" para "Tempo de bate-papo". * 0-99 =Provérbios da torre vermelha * 100-199 =Provérbios da torre branca * 200-299 =Provérbios da torre azul * Os arquivos em todos os cartões SD são salvos como 0-100. * Adicione 100 ao número do arquivo aqui para Branco, 200 para Azul. * Arquivo 204 seria torre AZUL, número de arquivo 0004. * / int chatSayings [] ={0, // Iniciar pausa em i =0, seguido por "rodadas" ... 204, 164, 25, // 1 205, 127, 76, // 2 208, 162, 65, // 3 143, 230, 23, // 4 130, 41, 225, // 5 153, 31, 133, // 6 234, 49, 155, / / 7 229, 175, 74, // 8 231, 58, 226, // 9 161, 223, 59, // 10 227, 68, 236, // 11 136, 50, 224, // 12 34, 160 , 78, // 13 222, 42 // Fim}; / * Este é o mapa de tempo da torre VERMELHO e BRANCO. Eles compartilham provérbios. * Esses tempos correspondem ao tempo necessário * para reproduzir os ditos individuais, em milissegundos. * Altere as palavras acima conforme desejado, mas não altere esses tempos. * Por exemplo, i =2 levará 0,8 segundos (NormalTimings [2]) * para reproduzir o arquivo chatSayings [2]. * / int NormalTimings [] ={1000, // Iniciar pausa em i =0, seguido por "rodadas" ... 2600, 800, 2800, 900, 1700, 1600, 1300, 2500, 1400, 1900, // 1 - 101600, 2300, 800, 3000, 300, 100, 200, 0, 0, 300, // 11 - 20298000, 1300, 2600, 1300, 1400, 2100, 1900, 1600, 800, 1700, // 21 - 301100 , 1000, 1000, 2100, 1500, 1300, 1100, 800, 1200, 1000, // 31 - 402200, 1700, 1300, 1400, 1500, 1000, 2000, 500, 2700, 9000, // 41 - 501100, 1200 , 900, 2400, 1200, 1100, 2100, 2000, 2500, 1700, // 51 - 601100, 1000, 1100, 500, 1900, 0, 1300, 2100, 1700, 900, // 61 - 701100, 800, 1100 , 1700, 1100, 1100, 1500, 1500, 500, 900, // 71 - 802100 // 81}; / * Este é o mapa de tempo da torre AZUL. * Esses tempos correspondem ao tempo necessário * para tocar as frases individuais, em segundos. * Por exemplo, i =2 levará 0,9 segundos (DefectiveTimings [2]) * para reproduzir o arquivo chatSayings [2]. * / int DefectiveTimings [] ={1000, // Iniciar pausa em i =0, seguido por "rodadas" ... 1700, 900, 2000, 600, 1100, 1800, 1900, 3000, 1500, 800, // 1 - 102100, 800, 1900, 900, 3200, 2700, 0, 0, 0, 2000, // 11 - 204400, 800, 3200, 900, 1400, 2000, 2100, 1200, 1300, 1000, // 21 - 301100 , 1400, 2100, 1000, 1600, 1000, 1200 // 31 - 40}; ///////////////////////////////////// //////////////////////////////////////// // =======================CONFIGURAÇÃO =====================================///// //////////////////////////////////////////////////////// ////////////// void setup () {secondarySerial.begin (9600); // Serial.begin (9600); // mp3.begin (); mp3.setVolume (22); Wire.begin (); SPI.begin (); // Configuração do rádio radio.begin (); radio.setPALevel (RF24_PA_LOW); // define o rádio para baixa potência. Todos próximos uns dos outros radio.setDataRate (RF24_2MBPS); // Acho que isso funciona melhor com vários rádios network.begin (70, this_node); // (canal, endereço do nó) sensor_read (); pinMode (LED_LH_up, OUTPUT); pinMode (LED_LH_down, OUTPUT); pinMode (LED_CENTRE, OUTPUT); pinMode (LED_RH_up, OUTPUT); pinMode (LED_RH_down, OUTPUT); digitalWrite (LED_CENTRE, HIGH); activate_servos (); servo_wings.write (WINGopen); // abre as asas servo_pivot.write (parkPIVOT); // park pivot servo_pitch.write (parkPITCH); // park pitch randomWake =random (1, 3); mp3.playMp3FolderTrack (1); // reproduzir o atraso do comentário de despertar (2000); servo_wings.write (WINGclose); // fechar asas delay (1500); digitalWrite (LED_CENTRE, LOW); turn_off_servos (); busyRed =0;} /////////////////////////////////////////////// //////////////////////////// =========================PRINCIPAL LOOP =================================//////////////////////// /////////////////////////////////////////////////// void loop ( ) {while (sensor.readRangeSingleMillimeter ()> triggerDistance) {// nada na frente do sensor, não fazer nada ReadNet (); WriteNet (); output_sensor (); if (carga útil [5] ==1) {// Condições usadas com MTC. A torre funcionará automaticamente sem atraso MTC (500); WriteNet (); Cara_Mia (); // Hora da ópera !! } else if (carga útil [5] ==2) {atraso (500); WriteNet (); Chatty_time (); // Tempo chatty !!} ReadNet (); } else if (carga útil [5] ==3) {atraso (500); WriteNet (); Controle manual (); // Controle manual}} if (sensor.readRangeSingleMillimeter ()  triggerDistance) {// abriu e a pessoa desapareceu falseActivate (); // diga "onde você foi?" atraso de comentário e fechamento (2000); scanArea (); // execute a varredura da área} else {// alguém definitivamente está lá - abra fogo !! envolver(); atraso (2400); for (int j =0; j <=2; j ++) {if (sensor.readRangeSingleMillimeter ()  =maxPIVOT) pivotCW =0; if (posPIVOT <=minPIVOT) pivotCW =1; if (posPITCH> =maxPITCH) pitchCW =0; if (posPITCH <=minPITCH) pitchCW =1;} ////////////////////////////////////////// ///////////////////////////////////// =======================ATIVAR ================================/////////////////// //////////////////////////////////////////////////////// //// void activate () {// abre asas e diz algo busyRed =1; ReadNet (); WriteNet (); output_sensor (); digitalWrite (LED_CENTRE, HIGH); // LED olho em randomOpen =random (3, 6); // escolha o comentário de abertura aleatório mp3.playMp3FolderTrack (randomOpen); // reproduz o comentário "vejo você" aleatório servo_wings.write (WINGopen); // asas abertas output_sensor (); delay (3400);} ////////////////////////////////////////////// ///////////////////////////// ====================FALSE ACTIVATE ================================///////////////////////////// //////////////////////////////////////////////// void falseActivate () {/ / busyRed =1; ReadNet (); WriteNet (); output_sensor (); randomFalse =random (6, 9); // escolhe o comentário de abertura aleatório mp3.playMp3FolderTrack (randomFalse); // reproduz aleatoriamente "aonde você foi?" atraso de comentário (1800);} ///////////////////////////////////////////// ////////////////////////////// =========================SCAN AREA =================================////////////////////// /////////////////////////////////////////////////void scanArea(){ // continue scanning for a bit after falseActivate busyRed =1; ReadNet(); WriteNet(); output_sensor(); mp3.playMp3FolderTrack(2); // "searching..." servo_pitch.write(parkPITCH); delay(1600); servo_pitch.detach(); servo_wings.detach(); mp3.playMp3FolderTrack(21); for (int i=0; i <=220; i++){ //scan for a little bit... output_sensor(); if (pivotCW ==0) posPIVOT =posPIVOT - 1; // increment one step CW if CW =0 if (pivotCW ==1) posPIVOT =posPIVOT + 1; // otherwise go one step other direction if (posPIVOT>=maxPIVOT) pivotCW =0; // if max rotation clockwise, switch to counterclockwise if (posPIVOT <=minPIVOT) pivotCW =1; // if min rotation counterclockwise,switch to clockwise servo_pivot.write(posPIVOT); if (sensor.readRangeSingleMillimeters()=(850 + (i * 100))) { // 1050 randomWingPos =random(10 + (i*20), (60 + (i*20))); servo_wings.write(randomWingPos); previousMillis1 =millis(); } } } disengage(); busyRed =0; goState =0; mp3.stop(); ReadNet(); delay(1000);}/////////////////////////////////////////////////////////////////// //=======================CHATTY TIME ===========================/////////////////////////////////////////////////////////////////////void Chatty_time(){ busyRed =1; WriteNet(); int i =0; int talk; int saying; int timeadder =750; int talkTime =NormalTimings[i]; int randomPivotPos; activate_servos(); servo_wings.write(WINGopen); digitalWrite(LED_CENTRE, HIGH); do { ReadNet(); WriteNet(); //output_sensor(); // used for debugging... if (i>=43) { // end of sequence busyRed =0; WriteNet(); disengage(); Retorna; } unsigned long currentMillis =millis(); // grab current time if ((unsigned long)(currentMillis - previousMillis3)>=talkTime) { if (chatSayings[i] <100) { // RED Turret talking talk =chatSayings[i]; saying =chatSayings[i]; talkTime =(NormalTimings[saying] + timeadder); } else if ((chatSayings[i]> 99) &&(chatSayings[i] <200)) { // WHITE turret talking talk =0; saying =chatSayings[i] - 100; talkTime =(NormalTimings[saying] + timeadder); } else { // BLUE turret talking talk =0; saying =chatSayings[i] - 200; // sound file # of BLUE talkTime =(DefectiveTimings[saying] + timeadder); // Time for that saying } if (talk ==0) { digitalWrite(LED_CENTRE, LOW); } else { digitalWrite(LED_CENTRE, HIGH); mp3.playMp3FolderTrack(talk); } randomPivotPos =random(minPIVOT, maxPIVOT); servo_pivot.write(randomPivotPos); Serial.println (); Serial.print(F("i:")); Serial.print (i); Serial.print ("\t"); Serial.print(F("chatSayings[i] ")); Serial.print (chatSayings[i]); Serial.print ("\t"); Serial.print(F("Saying ")); Serial.print (saying); Serial.print ("\t"); Serial.print(F("talk ")); Serial.print (talk); Serial.print ("\t"); Serial.print(F("chat time ")); Serial.print (talkTime); Serial.print ("\t"); Serial.print(F("busyRed:"));Serial.print (busyRed); Serial.print (" "); previousMillis3 =millis(); i ++; } } while (payload[4] ==1); busyRed =0; WriteNet(); digitalWrite(LED_CENTRE, LOW); disengage();}/////////////////////////////////////////////////////////////////// //=======================MANUAL CONTROL =======================/////////////////////////////////////////////////////////////////////void ManualControl(){ int servoWings; int servoPitch; int servoPivot; activate_servos(); servo_wings.write(WINGopen); digitalWrite(LED_CENTRE, HIGH); ReadNet(); do { output_sensor(); ReadNet(); servoPivot =map(payload[0], 1023, 0, minPIVOT, maxPIVOT); servoPitch =map(payload[1], 1023, 0, minPITCH, maxPITCH); servo_pivot.write(servoPivot); servo_pitch.write(servoPitch); currentMillis longo sem sinal =millis (); // grab current time if (payload[3] ==0) { if ((unsigned long)(currentMillis - previousMillis1)>=2500) { randomPic =random(1, 20); mp3.playMp3FolderTrack(randomPic); previousMillis1 =millis(); } } if (payload[2] ==0){ fire(); } } while (payload[5] ==3); disengage(); busyRed =0; WriteNet(); digitalWrite(LED_CENTRE, LOW); }/////////////////////////////////////////////////////////////////////=========================RECEIVING ===========================/////////////////////////////////////////////////////////////////////void ReadNet(){ network.update(); if ( network.available() ) { RF24NetworkHeader header; network.peek(header); network.read(header, &payload, sizeof(payload));} // Read the package }/////////////////////////////////////////////////////////////////////=========================SENDING =============================/////////////////////////////////////////////////////////////////////void WriteNet(){ network.update(); RF24NetworkHeader header4(MTC); bool ok4 =network.write(header4, &busyRed, sizeof(busyRed));/* if (ok4) { // used for debugging... Serial.print("MTC ok4 ");} else { Serial.print("------- ");} */}

Peças personalizadas e gabinetes

Lens%2Bv3b.stl Body-RHS%2Bv4.stl Body-LHS%2Bw%2Bcomponents%2Bv4.stl Wing%2BRH%2Bbottom%2Bv4.stl Wing%2BRH%2Btop%2Bv4.stl Wing%2BLH%2Bbottom%2Bv4.stl Wing%2BLH%2Btop%2Bv4.stl Pitch%2BFrame%2Bv4.stl Leg%2B-%2BREAR%2Bv4.stl Infill%2Bstrips%2Bv3.stl Leg%2B-%2BREAR%2Btest.stl Pitch%2BFrame%2B-%2Bmodified%2B1.stl Arduino%2BBase%2Bw%2BRadio.stl

Esquemas

Schematic that I made for building the turret.

Processo de manufatura

  1. Âmbar
  2. Guilhotina
  3. Lápide
  4. Maiô
  5. Silício
  6. Vodka
  7. Carrossel
  8. Sofá
  9. Ferro
  10. Torre de trabalho final reduz o tempo de ciclo