Bluetooth Nerf Turret
Komponenten und Verbrauchsmaterialien
 | | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| | × | 3 | |
| Typ 130 Gleichstrommotoren | | × | 2 | |
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| M2x10 selbstklebende Schrauben | | × | 30 | |
| | × | 4 | |
| | × | 15 | |
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| 9-V-Netzteil (mindestens 2,5 A) | | × | 1 | |
Über dieses Projekt
Vielen Dank für die Überprüfung meines Bluetooth-gesteuerten Nerf-Turmprojekts. Ich denke, hier gibt es nicht zu viel zu erklären, dies ist ein Nerf-Turm, der über Bluetooth entweder von einem Android-Gerät oder einem PC gesteuert wird.
....................https://www.littlefrenchkev.com/bluetooth-nerf-turret............... .....
WIE FUNKTIONIERT ES ?
Nichts super komplexes. Die Neige- und Schwenkbewegung wird von 2 Servos gesteuert, die von einem Arduino Nano angetrieben werden.
Die Dartpfeile werden mit 2 Walzen geschossen, die von 2 kleinen Gleichstrommotoren angetrieben werden. Ein Servo schiebt die Darts in die Rollen, wenn der Schießbefehl gesendet wird. Das Magazin kann 7 Darts aufnehmen.
Wie oben erwähnt, wird es über Bluetooth entweder von einem Android-Gerät oder einem PC gesteuert.
WIE MAN ES ERSTELLT ?
MONTAGE :
Stativ und Magazin gibt es in zwei verschiedenen Ausführungen. Einer für MG-90s-Servos und der andere für MG996r-Servos. MG996r-Servos können leistungshungrig sein. Stellen Sie sicher, dass Ihre Stromversorgung der Aufgabe gewachsen ist, wenn Sie sich entscheiden, sie zu verwenden.
Stativ :
Magazin :
VERKABELUNG :
SOFTWARE UND TEST !!!
EINIGE ZUSÄTZLICHE FOTOS, WEIL NICHT !!!
Code
Arduino-CodeArduino
Code zum Hochladen auf das Arduino. Der Code bleibt gleich, egal ob Sie den Turm über die Android-App oder einen PC steuern.#include //-----Servos und Variablen deklarierenServo 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 Rückstoß_Rest =180; // Winkel des Servos im Ruhezustandconst byte recoil_pushed =125; // Winkel, den das Servo erreichen muss, um den Dart zu drücken //-----Variablen im Zusammenhang mit der seriellen Datenverarbeitungbyte 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;//-----Variable in Bezug auf Motortiming und Zündungbool is_firing =false;bool can_fire =false;bool recoiling =false;unsigned longfire_start_time =0;unsigned longfire_current_time =0;const lange Zündzeit =150;ohne Vorzeichen lange Rückstoßzeit =0;ohne Vorzeichen lange Rückstoßzeit =0;const lange Rückstoßzeit =2 * Zündzeit;const Byte Motorpin =12;Boolesche Motoren_ON =false;//8===========================Dvoid setup () {//----- Motor-Pin-Modus definieren PinMode (motor_pin, OUTPUT); digitalWrite (motor_pin, LOW); //-----befestigt das Servo an den Pins recoil_servo.attach(9); pan_servo.attach(10); Tilt_servo.attach(11); //-----Startsequenz recoil_servo.write(recoil_rest); pan_servo.write(90); Verzögerung (1000); Tilt_servo.write(105); Serial.begin (9600); // serielle Kommunikation beginnen}//8===========================Dvoid loop () { getDataFromPC (); set_motor(); if (data_received) { move_servo(); set_recoil(); set_motor(); } fire();}//8===========================Dvoid getDataFromPC() { //erwartete Struktur der Daten [Startbyte , Pan-Betrag, Tilt-Betrag, Motor an, Auslösetaste gedrückt, End-Byte] //Startbyte =255 //Pan-Betrag =Byte zwischen 0 und 253 //Tilt-Betrag =Byte zwischen 0 und 253 //Motor an =0 for off - 1 on // Feuerknopf gedrückt =0 für nicht gedrückt - 1 für gedrückt // Endbyte =254 if (Serial.available ()) { // Wenn Daten in serieller Byte_from_app =Serial.read (); // das nächste verfügbare Zeichen lesen if (byte_from_app ==255) { // Suche nach Startbyte, falls gefunden:bytesRecvd =0; // das empfangene Byte auf 0 zurücksetzen (um den Eingabepuffer von Anfang an zu füllen) data_received =false; } else if (byte_from_app ==254) { // Suche nach Endbyte, falls gefunden:data_received =true; // setze data_received auf true, damit die Daten verwendet werden können } else { // füge empfangene Bytes zum Puffer hinzu inputBuffer[bytesRecvd] =byte_from_app; // Zeichen zum Eingabepuffer hinzufügen bytesRecvd++; // das empfangene Byte inkrementieren (dies dient als Index) if (bytesRecvd ==buffSize) { // nur eine Sicherheit für den Fall, dass der inputBuffer voll wird (sollte nicht passieren) bytesRecvd =buffSize - 1; // if bytesReceived> Puffergröße set bytesReceived kleiner als Puffergröße } } }}//8===========================Dvoid move_servo( ) { byte pan_servo_position =map(inputBuffer[0], 0, 253, pan_limit_2, pan_limit_1); // Eingangspufferwert in Servopositionswert umwandeln pan_servo.write (pan_servo_position); // Pan-Servopositionsbyte einstellen Tilt_servo_position =map (inputBuffer[1], 0, 253, Tilt_limit_2, Tilt_limit_1); // Eingangspufferwert in Servopositionswert umwandeln Tilt_servo.write (tilt_servo_position); // Pan-Servoposition einstellen}//8===========================Dvoid set_recoil() { if (inputBuffer [3] ==1) { //wenn der Feuerknopf gedrückt wurde if (!is_firing &&!recoiling) { //und nicht bereits feuern oder zurückspulen can_fire =true; // kann auf true gesetzt werden (siehe Effekt in void fire()) } } else { // wenn der Feuerknopf nicht gedrückt wird can_fire =false; //set kann auf false feuern (siehe Effekt in void fire())}}//8===========================Dvoid set_motor () {//-----Motoren mit MOSFET-Transistor starten und stoppen. if (inputBuffer [2] ==1) {// wenn der Bildschirm digitalWrite (motor_pin, HIGH) berührt hat; // Motor einschalten Motoren_ON =true; aufrechtzuerhalten. Sonst {// wenn der Bildschirm nicht berührt wurde digitalWrite (motor_pin, LOW); // Motor ausschalten Motoren_ON =false; }}//8==========================Dvoid Fire () {// wenn Motorbyte an, Motor einschalten und prüfen, ob Zeit war es an if (can_fire &&!is_firing &&motors_ON) { //if (can_fire &&!is_firing) { fire_start_time =millis(); recoil_start_time =millis(); is_firing =wahr; } fire_current_time =millis(); recoil_current_time =millis(); if (is_firing &&fire_current_time - fire_start_time recoil_time) { is_firing =false; }}
Python-Dateien
Die ausführbare und Android-App finden Sie hier:https://www.littlefrenchkev.com/bluetooth-nerf-turrethttps://github.com/LittleFrenchKev/Bluetooth_Nerf_turret Schaltpläne
Hier ist der Hauptschaltplan.
Die Verkabelung ist in kleine Abschnitte unterteilt, die mit Dupont-Steckverbindern miteinander verbunden sind. Dies dient der einfachen Montage.
Hier ist die HC-05 Bluetooth-Verkabelung.
Dieses Kabel enthält einen Spannungsteiler, damit die aus dem Arduino kommenden 5 V auf etwa 3,3 V für den HC-05-Empfängerstift abgesenkt werden können.