Torre Nerf Bluetooth
Componentes e suprimentos
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| | × | 3 | |
| | × | 2 | |
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| Parafusos autorroscantes M2x10 | | × | 30 | |
| Parafuso escareado M5 * 20 | | × | 4 | |
| | × | 15 | |
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| Fonte de alimentação de 9 V (mínimo de 2,5 amps) | | × | 1 | |
Aplicativos e serviços online
Sobre este projeto
Obrigado por verificar meu projeto de torre Nerf controlado por Bluetooth. Não acho que haja muito o que explicar aqui, esta é uma torre Nerf controlada via Bluetooth a partir de um dispositivo Android ou PC.
.................... https://www.littlefrenchkev.com/bluetooth-nerf-turret ............... .....
COMO FUNCIONA?
Nada super complexo. O movimento de inclinação e panorâmica é controlado por 2 servos acionados por um Arduino Nano.
Os dardos são disparados usando 2 rolos girados por 2 pequenos motores DC. Um servo empurra os dardos para os rolos quando a ordem para atirar é enviada. O carregador pode conter 7 dardos.
Como mencionado acima, ele é controlado via Bluetooth a partir de um dispositivo Android ou de um PC.
COMO CONSTRUIR?
CONJUNTO :
O tripé e a revista vêm em duas versões diferentes. Um projetado para servos MG-90s e o outro para servos MG996r. Os servos MG996r podem consumir muita energia. Certifique-se de que sua fonte de alimentação estará à altura do trabalho se você decidir usá-la.
Tripé:
Revista :
FIAÇÃO :
SOFTWARE E TESTE !!!
Código
Código do Arduino Arduino
código para fazer upload para o arduino. O código permanece o mesmo se você optar por controlar a torre por meio do aplicativo Android ou de um PC. #include // ----- Declarar servos e variáveisServo recoil_servo; Servo pan_servo; Servo tilt_servo; const byte pan_limit_1 =0; const byte pan_limit_2 =180; const byte tilt_limit_1 =65; const byte tilt_limit_2 =180; const byte recoil_rest =180; // Ângulo do servo quando em repouso byte recoil_pushed =125; // Ângulo que o servo precisa alcançar para empurrar o dardo // ----- Variáveis relacionadas ao manuseio de dados seriais byte_from_app; const byte buffSize =30; byte inputBuffer [buffSize]; const byte startMarker =255; const byte endMarker =254; byte bytesRecvd =0; boolean data_received =false; // ----- Variável relacionada ao tempo do motor e firingbool is_firing =false; bool can_fire =false; bool recoiling =false; sem sinal longo firing_start_time =0; unsigned long firing_current_time =0; const long firing_time =150; unsigned long recoil_start_time =0; unsigned long recoil_current_time =0; const long recoil_time =2 * firing_time; const byte motor_pin =12; boolean motors_ON =false; // 8 ===========================Dvoid setup () {// ----- define o modo pin do motor pinMode (motor_pin, OUTPUT); digitalWrite (motor_pin, LOW); // ----- anexa o servo aos pinos recoil_servo.attach (9); pan_servo.attach (10); tilt_servo.attach (11); // ----- sequência de início recoil_servo.write (recoil_rest); pan_servo.write (90); atraso (1000); tilt_servo.write (105); Serial.begin (9600); // iniciar a comunicação serial} // 8 =============================Dvoid loop () {getDataFromPC (); set_motor (); if (dados_ecebidos) {move_servo (); set_recoil (); set_motor (); } fire ();} // 8 =============================Dvoid getDataFromPC () {// estrutura de dados esperada [byte inicial , quantidade de pan, quantidade de inclinação, motor ligado, botão de disparo pressionado, byte final] // byte inicial =255 // quantidade de pan =byte entre 0 e 253 // quantidade de inclinação =byte entre 0 e 253 // motor ligado =0 para off - 1 on // botão de disparo pressionado =0 para não pressionado - 1 para pressionado // fim do byte =254 if (Serial.available ()) {// Se os dados estiverem disponíveis em serial byte_from_app =Serial.read (); // ler o próximo caractere disponível if (byte_from_app ==255) {// procurar byte inicial, se encontrado:bytesRecvd =0; // redefine o byte recebido para 0 (para começar a preencher o inputBuffer desde o início) data_received =false; } else if (byte_from_app ==254) {// procura o byte final, se encontrado:data_received =true; // defina data_received como true para que os dados possam ser usados} else {// adiciona bytes recebidos ao buffer inputBuffer [bytesRecvd] =byte_from_app; // adiciona o caractere ao buffer de entrada bytesRecvd ++; // incrementa o byte recebido (isso age como um índice) if (bytesRecvd ==buffSize) {// apenas uma segurança no caso de o inputBuffer preencher (não deveria acontecer) bytesRecvd =buffSize - 1; // if bytesReceived> tamanho do buffer conjunto bytesReceived menor que o tamanho do buffer}}}} // 8 =============================Dvoid move_servo ( ) {byte pan_servo_position =map (inputBuffer [0], 0, 253, pan_limit_2, pan_limit_1); // converter valor inputbuffer para valor de posição servo pan_servo.write (pan_servo_position); // definir byte de posição do servo pan tilt_servo_position =map (inputBuffer [1], 0, 253, tilt_limit_2, tilt_limit_1); // converte o valor do inputbuffer para o valor da posição do servo tilt_servo.write (tilt_servo_position); // definir a posição do servo pan} // 8 =============================Dvoid set_recoil () {if (inputBuffer [3] ==1) {// se o botão de disparo for pressionado if (! Is_firing &&! Recuo) {// e ainda não disparando ou recuando can_fire =true; // set pode disparar para verdadeiro (veja o efeito em void fire ())}} else {// se o botão de disparo não for pressionado can_fire =false; // set pode disparar para falso (veja o efeito em void fire ())}} // 8 =================================Dvoid set_motor () {// ----- liga e desliga motores usando transisitor MOSFET. if (inputBuffer [2] ==1) {// se a tela tocou digitalWrite (motor_pin, HIGH); // liga o motor motors_ON =true; } else {// se a tela não for tocada digitalWrite (motor_pin, LOW); // DESLIGUE o motor motors_ON =false; }} // 8 =============================Dvoid fire () {// se o byte do motor estiver ligado, ligue o motor e verifique se há tempo que esteve ligado if (can_fire &&! is_firing &&motors_ON) {// if (can_fire &&! is_firing) {firing_start_time =millis (); recuo_início_tempo =millis (); is_firing =true; } firing_current_time =millis (); recuo_atual_tempo =millis (); if (is_firing &&firing_current_time - firing_start_time recoil_time) {is_firing =false; }}
arquivos python
O executável e o aplicativo Android podem ser encontrados aqui:https://www.littlefrenchkev.com/bluetooth-nerf-turrethttps://github.com/LittleFrenchKev/Bluetooth_Nerf_turret Esquemas
Aqui está o diagrama de fiação principal.
A fiação é dividida em pequenas seções interligadas por meio de conectores duplos. Isso é para facilitar a montagem. Aqui está a fiação Bluetooth HC-05.
Este pedaço de fiação inclui um divisor de tensão para permitir que os 5 V que saem do arduino sejam reduzidos a cerca de 3,3 V para o pino do receptor HC-05.