Inhaltsverzeichnis:

Klavierfliesen, die Roboterarm spielen - Gunook
Klavierfliesen, die Roboterarm spielen - Gunook

Video: Klavierfliesen, die Roboterarm spielen - Gunook

Video: Klavierfliesen, die Roboterarm spielen - Gunook
Video: AUTOMATICA - Robots Vs. Music - Nigel Stanford 2024, November
Anonim
Klavierfliesen, die Roboterarm spielen
Klavierfliesen, die Roboterarm spielen

Die Gruppe besteht aus 2 Automatisierungsingenieuren von UCN, die eine brillante Idee hatten, zu deren Umsetzung und Entwicklung wir motiviert sind. Die Idee basiert auf einem Arduino-Board, das einen Roboterarm steuert. Das Arduino-Board ist das Gehirn der Operation und dann wird der Aktor der Operation, der Roboterarm, tun, was er muss. Die ausführlichere Erklärung folgt später.

Schritt 1: Ausrüstung

Ausrüstung
Ausrüstung

Roboterarm:

Phantomx Pincher Roboterarm-Kit Maek II (https://learn.trossenrobotics.com/38-interbotix-ro…)

Software für den Roboter- https://www.arduino.cc/en/Main/OldSoftwareRelease… Farberkennungskamera:

CMUcam5 Pixy-Kamera - (https://charmedlabs.com/default/pixy-cmucam5/)

Software - PixyMon (https://cmucam.org/projects/cmucam5/wiki/Install_PixyMon_on_Windows_Vista_7_8)

Schritt 2: Arduino-Setup

Arduino-Setup
Arduino-Setup

Sie können das Setup auf der Platine hier sehen, was sehr einfach ist.

Auf der linken Seite befindet sich das Netzteil.

Das mittlere ist für das erste Servo, das später Servo für Servo mit den anderen Servos verbunden wird.

Der untere ist der Ort, an dem wir das Board von einem PC oder Laptop aus steuern, der am anderen Ende einen USB-Eingang hat.

Schritt 3: Endgültiges Programm

||| PROGRAMM |||

#enthalten

#include #include "poses.h" #include //Pixy-Bibliothek #include

#define POSECOUNT 5

BioloidController bioloid = BioloidController(1000000);

const int SERVOCOUNT = 5; int-ID; int-Position; boolesche IDCheck; boolescher RunCheck;

Void setup () { PinMode (0, AUSGANG); ax12SetRegister2(1, 32, 50); // Gelenknummer 1 Register 32 auf Geschwindigkeit 50 setzen. ax12SetRegister2 (2, 32, 50); // Gelenknummer 2 Register 32 auf Geschwindigkeit 50 setzen. ax12SetRegister2 (3, 32, 50);//setze Gelenknummer 3 Register 32 auf Geschwindigkeit 50. ax12SetRegister2 (4, 32, 50); // Setze Gelenknummer 4 Register 32 auf Geschwindigkeit 50. ax12SetRegister2(5, 32, 100); // Setze Gelenknummer 5 Register 32 bis 100. // Variablen initialisieren id = 1; pos = 0; IDCheck = 1; RunCheck = 0; // serielle Schnittstelle öffnen Serial.begin (9600); Verzögerung (500); Serial.println("###########################"); Serial.println ("Serielle Kommunikation hergestellt.");

// Überprüfen Sie die Lipo-Batteriespannung CheckVoltage ();

// Servos scannen, Position zurückgeben MoveTest (); Nach Hause ziehen(); Menüpunkte(); RunCheck = 1; }

Void loop () {// den Sensor lesen: Int inByte = Serial.read ();

Schalter (inByte) {

Fall '1': MovePose1(); brechen;

Fall '2': MovePose2(); brechen; Fall '3': MovePose3(); brechen;

Fall '4': MovePose4(); brechen;

Fall '5': MoveHome(); brechen; Fall '6': Grab(); brechen;

Fall '7': LEDTest(); brechen;

Fall '8': RelaxServos(); brechen; } }

Void CheckVoltage () {// warten, dann überprüfen Sie die Spannung (LiPO-Sicherheit) float voltage = (ax12GetRegister (1, AX_PRESENT_VOLTAGE, 1)) / 10.0; Serial.println("###########################"); Serial.print ("Systemspannung: "); Seriendruck (Spannung); Serial.println ("Volt."); if (Spannung 10.0) {Serial.println ("Spannungspegel nominal."); } if (RunCheck == 1){ MenuOptions(); } Serial.println("##########################"); }

Void MoveHome () { Verzögerung (100); // empfohlene Pause bioloid.loadPose(Home); // Laden Sie die Pose von FLASH in den nextPose-Puffer bioloid.readPose(); // aktuelle Servopositionen in den curPose-Puffer einlesen Serial.println ("############################"); Serial.println ("Servos in Ausgangsposition bewegen"); Serial.println("###########################"); Verzögerung (1000); bioloid.interpolateSetup(1000); // Setup für Interpolation von Current->Next über 1/2 Sekunde while(bioloid.interpolating > 0){ // Tun Sie dies, während wir unsere neue Pose noch nicht erreicht haben bioloid.interpolateStep(); // Servos bewegen, wenn nötig. Verzögerung(3); } if (RunCheck == 1){ MenuOptions(); } }

Void MovePose1 () { Verzögerung (100); // empfohlene Pause bioloid.loadPose(Pose1); // Laden Sie die Pose von FLASH in den nextPose-Puffer bioloid.readPose(); // aktuelle Servopositionen in den curPose-Puffer einlesen Serial.println ("############################"); Serial.println ("Servos in die 1. Position bewegen"); Serial.println("###########################"); Verzögerung (1000); bioloid.interpolateSetup(1000); // Setup für Interpolation von Current->Next über 1/2 Sekunde while(bioloid.interpolating > 0){ // Tun Sie dies, während wir unsere neue Pose noch nicht erreicht haben bioloid.interpolateStep(); // Servos bewegen, wenn nötig. Verzögerung(3); } SetPosition(3, 291); // die Position von Gelenk 3 auf '0' setzen delay (100); // warten, bis sich das Gelenk bewegt, wenn (RunCheck == 1) { MenuOptions (); } }

Void MovePose2 () { Verzögerung (100); // empfohlene Pause bioloid.loadPose (Pose2); // Laden Sie die Pose von FLASH in den nextPose-Puffer bioloid.readPose(); // aktuelle Servopositionen in den curPose-Puffer einlesen Serial.println ("############################"); Serial.println ("Servos in die 2. Position bewegen"); Serial.println("###########################"); Verzögerung (1000); bioloid.interpolateSetup(1000); // Setup für Interpolation von Current->Next über 1/2 Sekunde while(bioloid.interpolating > 0){ // Tun Sie dies, während wir unsere neue Pose noch nicht erreicht haben bioloid.interpolateStep(); // Servos bewegen, wenn nötig. Verzögerung(3); } SetPosition(3, 291); // die Position von Gelenk 3 auf '0' setzen delay (100); // warten, bis sich das Gelenk bewegt, wenn (RunCheck == 1) { MenuOptions (); aufrechtzuerhalten. aufrechtzuerhalten. Void MovePose3 () { Verzögerung (100); // empfohlene Pause bioloid.loadPose(Pose3); // Laden Sie die Pose von FLASH in den nextPose-Puffer bioloid.readPose(); // aktuelle Servopositionen in den curPose-Puffer einlesen Serial.println ("############################"); Serial.println ("Servos in die 3. Position verschieben"); Serial.println("###########################"); Verzögerung (1000); bioloid.interpolateSetup(1000); // Setup für Interpolation von Current->Next über 1/2 Sekunde while(bioloid.interpolating > 0){ // Tun Sie dies, während wir unsere neue Pose noch nicht erreicht haben bioloid.interpolateStep(); // Servos bewegen, wenn nötig. Verzögerung(3); } SetPosition(3, 291); // die Position von Gelenk 3 auf '0' setzen delay (100); // warten, bis sich das Gelenk bewegt, wenn (RunCheck == 1) { MenuOptions (); } }

Void MovePose4 () { Verzögerung (100); // empfohlene Pause bioloid.loadPose(Pose4); // Laden Sie die Pose von FLASH in den nextPose-Puffer bioloid.readPose(); // aktuelle Servopositionen in den curPose-Puffer einlesen Serial.println ("############################"); Serial.println ("Servos in die 4. Position verschieben"); Serial.println("###########################"); Verzögerung (1000); bioloid.interpolateSetup(1000); // Setup für Interpolation von Current->Next über 1/2 Sekunde while(bioloid.interpolating > 0){ // Tun Sie dies, während wir unsere neue Pose noch nicht erreicht haben bioloid.interpolateStep(); // Servos bewegen, wenn nötig. Verzögerung(3); } SetPosition(3, 291); // die Position von Gelenk 3 auf '0' setzen delay (100); // warten, bis sich das Gelenk bewegt, wenn (RunCheck == 1) { MenuOptions (); } }

Void MoveTest () { Serial.println ("##########################"); Serial.println ("Initializing Movement Sign Test"); Serial.println("###########################"); Verzögerung (500); id = 1; pos = 512; Während (id <= SERVOCOUNT) {Serial.print ("Moving Servo ID:"); Serial.println (id);

while(pos>= 312){ SetPosition(id, pos); pos = pos--; Verzögerung(10); }

while (pos <= 512) { SetPosition (id, pos); pos = pos++; Verzögerung(10); }

// zur nächsten Servo-ID iterieren id = id++;

} if (RunCheck == 1){ MenuOptions(); } }

void MenuOptions () { Serial.println ("##########################"); Serial.println ("Bitte geben Sie Option 1-5 ein, um einzelne Tests erneut auszuführen."); Serial.println ("1) 1. Position"); Serial.println ("2) 2. Position"); Serial.println ("3) 3. Position"); Serial.println ("4) 4. Position"); Serial.println ("5) Ausgangsposition"); Serial.println("6) Systemspannung prüfen"); Serial.println("7) LED-Test durchführen"); Serial.println ("8) Relax-Servos"); Serial.println("###########################"); }

Void RelaxServos () { id = 1; Serial.println("###########################"); Serial.println ("Entspannende Servos."); Serial.println("###########################"); while(id <= SERVOCOUNT){ Relax(id); id = (id++)%SERVOCOUNT; Verzögerung (50); } if (RunCheck == 1){ MenuOptions(); } }

Void LEDTest () { id = 1; Serial.println("###########################"); Serial.println ("Laufender LED-Test"); Serial.println("###########################"); while (id <= SERVOCOUNT) { ax12SetRegister (id, 25, 1); Serial.print ("LED EIN - Servo-ID: "); Serial.println (id); Verzögerung (3000); ax12SetRegister(id, 25, 0); Serial.print ("LED AUS - Servo-ID: "); Serial.println (id); Verzögerung (3000); ID = ID++; } if (RunCheck == 1){ MenuOptions(); } }

Void Grab () { SetPosition (5, 800); // die Position von Gelenk 1 auf '0' setzen Verzögerung (100); // warten, bis sich das Gelenk bewegt

}

Wir haben unser Programm an das PincherTest-Programm des Herstellers angelehnt mit einigen großen Optimierungen bei der Positionierung. Wir haben die Poses.h verwendet, damit der Roboter die Positionen im Speicher hat. Zuerst haben wir versucht, unseren Spielarm mit Pixycam automatisch zu gestalten, aber aufgrund von Licht- und kleinen Bildschirmproblemen konnte das nicht passieren. Der Roboter hat eine grundlegende Ausgangsposition, nach dem Hochladen des Programms werden alle im Roboter gefundenen Servos getestet. Wir haben die Posen für die Tasten 1-4 festgelegt, damit Sie sie sich leicht merken können. Fühlen Sie sich frei, das Programm zu verwenden.

Schritt 4: Videoanleitung

Schritt 5: Fazit

Zusammenfassend ist der Roboter für uns ein lustiges kleines Projekt und eine lustige Sache zum Herumspielen und Experimentieren. Ich ermutige Sie, es auszuprobieren und es auch anzupassen.

Empfohlen: