Indholdsfortegnelse:

Klaverfliser, der spiller robotarm: 5 trin
Klaverfliser, der spiller robotarm: 5 trin

Video: Klaverfliser, der spiller robotarm: 5 trin

Video: Klaverfliser, der spiller robotarm: 5 trin
Video: Вебинар KUKA GripperSpotTech 2024, November
Anonim
Klaverfliser, der spiller robotarm
Klaverfliser, der spiller robotarm

Gruppen består af 2 automationsingeniører fra UCN, der kom med en genial idé, som vi er motiverede til at gøre og udvikle. Ideen er baseret på et Arduino -kort, der styrer en robotarm. Arduino -tavlen er hjernen i operationen, og derefter vil aktuatoren for operationen, den robotiske arm, gøre hvad den har brug for. Den mere detaljerede forklaring kommer senere.

Trin 1: Udstyr

Udstyr
Udstyr

Robotarm:

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

Software til robotten- https://www.arduino.cc/en/Main/OldSoftwareRelease… Farvedetekteringskamera:

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

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

Trin 2: Arduino -opsætning

Opsætning af Arduino
Opsætning af Arduino

Du kan se opsætningen på tavlen her, hvilket er meget let.

Til venstre er strømforsyningen.

Den midterste er til den første servo, som senere tilsluttes de andre servoer, servo for servo.

Den nederste er, hvor vi styrer kortet fra en pc eller bærbar computer, der har en USB -indgang i den anden ende.

Trin 3: Endeligt program

||| PROGRAM |||

#omfatte

#include #include "poses.h" #include // Pixy Library #include

#define POSECOUNT 5

BioloidController bioloid = BioloidController (1000000);

const int SERVOCOUNT = 5; int id; int pos; boolsk IDCheck; boolsk RunCheck;

ugyldig opsætning () {pinMode (0, OUTPUT); ax12SetRegister2 (1, 32, 50); // indstil fælles nummer 1 register 32 til hastighed 50. ax12SetRegister2 (2, 32, 50); // indstil fælles nummer 2 register 32 til hastighed 50. ax12SetRegister2 (3, 32, 50); // indstil fælles nummer 3 -register 32 til hastighed 50. ax12SetRegister2 (4, 32, 50); // indstil fællesnummer 4 -register 32 til hastighed 50. ax12SetRegister2 (5, 32, 100); // indstil fælles nummer 5 -register 32 til hastighed 100. // initialiser variabler id = 1; pos = 0; IDCheck = 1; RunCheck = 0; // åben seriel port Serial.begin (9600); forsinkelse (500); Serial.println ("############################"); Serial.println ("Seriel kommunikation etableret.");

// Kontroller Lipo batterispænding CheckVoltage ();

// Scan servoer, returner position MoveTest (); MoveHome (); MenuOptions (); RunCheck = 1; }

void loop () {// læs sensoren: int inByte = Serial.read ();

switch (inByte) {

sag '1': MovePose1 (); pause;

sag '2': MovePose2 (); pause; case '3': MovePose3 (); pause;

sag '4': MovePose4 (); pause;

sag '5': MoveHome (); pause; sag '6': Grib (); pause;

sag '7': LEDTest (); pause;

case '8': RelaxServos (); pause; }}

ugyldig CheckVoltage () {// vent, kontroller derefter spændingen (LiPO -sikkerhed) flydespænding = (ax12GetRegister (1, AX_PRESENT_VOLTAGE, 1)) / 10,0; Serial.println ("############################"); Serial.print ("Systemspænding:"); Seriel.print (spænding); Serial.println ("volt."); if (spænding 10.0) {Serial.println ("Nominelt spændingsniveau"); } hvis (RunCheck == 1) {MenuOptions (); } Serial.println ("#############################"); }

ugyldig MoveHome () {forsinkelse (100); // anbefalet pause bioloid.loadPose (Home); // indlæs posen fra FLASH i bioloid nextPose buffer.readPose (); // læses i aktuelle servopositioner til curPose -bufferen Serial.println ("############################"); Serial.println ("Flytning af servoer til udgangsposition"); Serial.println ("############################"); forsinkelse (1000); bioloid.interpolateSetup (1000); // opsætning til interpolation fra nuværende-> næste over 1/2 sekund, mens (bioloid.interpolering> 0) {// gør dette, mens vi ikke har nået vores nye pose bioloid.interpolateStep (); // flyt servoer, hvis det er nødvendigt. forsinkelse (3); } hvis (RunCheck == 1) {MenuOptions (); }}

ugyldig MovePose1 () {forsinkelse (100); // anbefalet pause bioloid.loadPose (Pose1); // indlæs posen fra FLASH i bioloid nextPose buffer.readPose (); // læses i aktuelle servopositioner til curPose -bufferen Serial.println ("############################"); Serial.println ("Flytning af servoer til 1. position"); Serial.println ("############################"); forsinkelse (1000); bioloid.interpolateSetup (1000); // opsætning til interpolation fra nuværende-> næste over 1/2 sekund, mens (bioloid.interpolering> 0) {// gør dette, mens vi ikke har nået vores nye pose bioloid.interpolateStep (); // flyt servoer, hvis det er nødvendigt. forsinkelse (3); } SetPosition (3, 291); // indstil leddet 3's position til '0' forsinkelse (100); // vent på, at leddet flyttes, hvis (RunCheck == 1) {MenuOptions (); }}

ugyldig MovePose2 () {forsinkelse (100); // anbefalet pause bioloid.loadPose (Pose2); // indlæs posen fra FLASH i bioloid nextPose buffer.readPose (); // læses i aktuelle servopositioner til curPose -bufferen Serial.println ("############################"); Serial.println ("Flytning af servoer til 2. position"); Serial.println ("############################"); forsinkelse (1000); bioloid.interpolateSetup (1000); // opsætning til interpolation fra nuværende-> næste over 1/2 sekund, mens (bioloid.interpolering> 0) {// gør dette, mens vi ikke har nået vores nye pose bioloid.interpolateStep (); // flyt servoer, hvis det er nødvendigt. forsinkelse (3); } SetPosition (3, 291); // indstil leddet 3's position til '0' forsinkelse (100); // vent på, at leddet flyttes, hvis (RunCheck == 1) {MenuOptions (); }} ugyldig MovePose3 () {forsinkelse (100); // anbefalet pause bioloid.loadPose (Pose3); // indlæs posen fra FLASH i bioloid nextPose buffer.readPose (); // læses i aktuelle servopositioner til curPose -bufferen Serial.println ("############################"); Serial.println ("Flytter servoer til 3. position"); Serial.println ("############################"); forsinkelse (1000); bioloid.interpolateSetup (1000); // opsætning til interpolering fra nuværende-> næste over 1/2 sekund mens (bioloid.interpolering> 0) {// gør dette, mens vi ikke har nået vores nye pose bioloid.interpolateStep (); // flyt servoer, hvis det er nødvendigt. forsinkelse (3); } SetPosition (3, 291); // indstil leddet 3's position til '0' forsinkelse (100); // vent på, at leddet flyttes, hvis (RunCheck == 1) {MenuOptions (); }}

ugyldig MovePose4 () {forsinkelse (100); // anbefalet pause bioloid.loadPose (Pose4); // indlæs posen fra FLASH i bioloid nextPose buffer.readPose (); // læses i aktuelle servopositioner til curPose -bufferen Serial.println ("############################"); Serial.println ("Flytter servoer til 4. position"); Serial.println ("############################"); forsinkelse (1000); bioloid.interpolateSetup (1000); // opsætning til interpolation fra nuværende-> næste over 1/2 sekund, mens (bioloid.interpolering> 0) {// gør dette, mens vi ikke har nået vores nye pose bioloid.interpolateStep (); // flyt servoer, hvis det er nødvendigt. forsinkelse (3); } SetPosition (3, 291); // indstil leddet 3's position til '0' forsinkelse (100); // vent på, at leddet flyttes, hvis (RunCheck == 1) {MenuOptions (); }}

void MoveTest () {Serial.println ("############################"); Serial.println ("Initialisering af bevægelsessignaltest"); Serial.println ("############################"); forsinkelse (500); id = 1; pos = 512; while (id <= SERVOCOUNT) {Serial.print ("Moving Servo ID:"); Serial.println (id);

mens (pos> = 312) {SetPosition (id, pos); pos = pos--; forsinkelse (10); }

mens (pos <= 512) {SetPosition (id, pos); pos = pos ++; forsinkelse (10); }

// gentag det næste servo -id id = id ++;

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

void MenuOptions () {Serial.println ("############################"); Serial.println ("Angiv mulighed 1-5 for at køre individuelle tests igen."); Serial.println ("1) 1. position"); Serial.println ("2) 2. position"); Serial.println ("3) 3. position"); Serial.println ("4) 4. position"); Serial.println ("5) Hjemmeposition"); Serial.println ("6) Kontroller systemspænding"); Serial.println ("7) Udfør LED -test"); Serial.println ("8) Relax Servos"); Serial.println ("############################"); }

void RelaxServos () {id = 1; Serial.println ("############################"); Serial.println ("Afslappende servoer."); Serial.println ("############################"); while (id <= SERVOCOUNT) {Relax (id); id = (id ++)%SERVOCOUNT; forsinkelse (50); } hvis (RunCheck == 1) {MenuOptions (); }}

void LEDTest () {id = 1; Serial.println ("############################"); Serial.println ("Kørende LED -test"); Serial.println ("############################"); mens (id <= SERVOCOUNT) {ax12SetRegister (id, 25, 1); Serial.print ("LED ON - Servo ID:"); Serial.println (id); forsinkelse (3000); ax12SetRegister (id, 25, 0); Serial.print ("LED OFF - Servo ID:"); Serial.println (id); forsinkelse (3000); id = id ++; } hvis (RunCheck == 1) {MenuOptions (); }}

void Grab () {SetPosition (5, 800); // indstil leddet 1's position til '0' forsinkelse (100); // vent på, at leddet flyttes

}

Vi har baseret vores program på producenternes PincherTest -program med nogle store tweaks i tilfælde af positionering. Vi brugte poserne. H for robotten til at have positionerne i hukommelsen. For det første forsøgte vi at skabe vores spillearm med Pixycam til at være automatisk, men på grund af lys og små skærmproblemer kunne det ikke ske. Robotten har en grundlæggende hjemmeposition, efter at have uploadet programmet, vil den teste alle de servoer, der findes i robotten. Vi har indstillet poserne til 1-4 knapperne, så det vil være let at huske. Brug gerne programmet.

Trin 4: Videoguide

Trin 5: Konklusion

Afslutningsvis er robotten et sjovt lille projekt for os og en sjov ting at lege med og eksperimentere med. Jeg opfordrer dig til også at prøve det og tilpasse det.

Anbefalede: