Innholdsfortegnelse:

Pianofliser som spiller robotarm: 5 trinn
Pianofliser som spiller robotarm: 5 trinn

Video: Pianofliser som spiller robotarm: 5 trinn

Video: Pianofliser som spiller robotarm: 5 trinn
Video: Премия KUKA за инновации _Artificial Intelligence Challenge 2024, Juli
Anonim
Pianofliser som spiller robotarm
Pianofliser som spiller robotarm

Gruppen består av 2 automatiseringsingeniører fra UCN, som kom med en strålende idé som vi er motiverte til å gjøre og utvikle. Ideen er basert på et Arduino -bord som styrer en robotarm. Arduino -brettet er hjernen til operasjonen, og deretter vil aktuatoren for operasjonen, robotarmen, gjøre det den trenger. Den mer grundige forklaringen kommer senere.

Trinn 1: Utstyr

Utstyr
Utstyr

Robotarm:

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

Programvare for roboten- https://www.arduino.cc/en/Main/OldSoftwareRelease… Fargedetekteringskamera:

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

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

Trinn 2: Arduino -oppsett

Oppsett av Arduino
Oppsett av Arduino

Du kan se oppsettet på brettet her, noe som er veldig enkelt.

Til venstre er strømforsyningen.

Den midterste er for den første servoen, som senere kobles til de andre servoene, servo for servo.

Den nederste er hvor vi styrer brettet fra en PC eller bærbar datamaskin, som har en USB -inngang i den andre enden.

Trinn 3: Sluttprogram

||| PROGRAM |||

#inkludere

#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 oppsett () {pinMode (0, OUTPUT); ax12SetRegister2 (1, 32, 50); // sett felles nummer 1 register 32 til hastighet 50. ax12SetRegister2 (2, 32, 50); // sett felles nummer 2 register 32 til hastighet 50. ax12SetRegister2 (3, 32, 50); // sett felles nummer 3 register 32 til hastighet 50. ax12SetRegister2 (4, 32, 50); // sett felles nummer 4 register 32 til hastighet 50. ax12SetRegister2 (5, 32, 100); // sett felles nummer 5 register 32 til hastighet 100. // initialiser variabler id = 1; pos = 0; IDCheck = 1; RunCheck = 0; // åpen serieport Serial.begin (9600); forsinkelse (500); Serial.println ("############################"); Serial.println ("Seriell kommunikasjon etablert.");

// Sjekk Lipo batterispenning CheckVoltage ();

// Skann servoer, returposisjon MoveTest (); MoveHome (); Menyvalg (); RunCheck = 1; }

void loop () {// les sensoren: int inByte = Serial.read ();

bytte (inByte) {

sak '1': MovePose1 (); gå i stykker;

sak '2': MovePose2 (); gå i stykker; sak '3': MovePose3 (); gå i stykker;

sak '4': MovePose4 (); gå i stykker;

sak '5': MoveHome (); gå i stykker; sak '6': Grab (); gå i stykker;

sak '7': LEDTest (); gå i stykker;

sak '8': RelaxServos (); gå i stykker; }}

ugyldig CheckVoltage () {// vent, kontroller deretter spenningen (LiPO -sikkerhet) flytespenning = (ax12GetRegister (1, AX_PRESENT_VOLTAGE, 1)) / 10.0; Serial.println ("############################"); Serial.print ("Systemspenning:"); Serial.print (spenning); Serial.println ("volt."); if (spenning 10.0) {Serial.println ("Nominell spenningsnivå."); } if (RunCheck == 1) {MenuOptions (); } Serial.println ("############################"); }

ugyldig MoveHome () {forsinkelse (100); // anbefalt pause bioloid.loadPose (Home); // last posen fra FLASH, inn i nextPose buffer bioloid.readPose (); // les i nåværende servoposisjoner til curPose -bufferen Serial.println ("############################"); Serial.println ("Flytter servoer til hjemmeposisjon"); Serial.println ("############################"); forsinkelse (1000); bioloid.interpolateSetup (1000); // oppsett for interpolasjon fra nåværende-> neste over 1/2 sekund mens (bioloid.interpolering> 0) {// gjør dette mens vi ikke har nådd vår nye pose bioloid.interpolateStep (); // flytt servoer, om nødvendig. forsinkelse (3); } if (RunCheck == 1) {MenuOptions (); }}

ugyldig MovePose1 () {forsinkelse (100); // anbefalt pause bioloid.loadPose (Pose1); // last posen fra FLASH, inn i nextPose buffer bioloid.readPose (); // les i nåværende servoposisjoner til curPose -bufferen Serial.println ("############################"); Serial.println ("Flytter servoer til 1. posisjon"); Serial.println ("############################"); forsinkelse (1000); bioloid.interpolateSetup (1000); // oppsett for interpolasjon fra nåværende-> neste over 1/2 sekund mens (bioloid.interpolering> 0) {// gjør dette mens vi ikke har nådd vår nye pose bioloid.interpolateStep (); // flytt servoer, om nødvendig. forsinkelse (3); } SetPosition (3, 291); // sett posisjonen til leddet 3 til '0' forsinkelse (100); // vent på at leddet skal flyttes hvis (RunCheck == 1) {MenuOptions (); }}

ugyldig MovePose2 () {forsinkelse (100); // anbefalt pause bioloid.loadPose (Pose2); // last posen fra FLASH, inn i nextPose buffer bioloid.readPose (); // les i nåværende servoposisjoner til curPose -bufferen Serial.println ("############################"); Serial.println ("Flytter servoer til 2. posisjon"); Serial.println ("############################"); forsinkelse (1000); bioloid.interpolateSetup (1000); // oppsett for interpolasjon fra nåværende-> neste over 1/2 sekund mens (bioloid.interpolering> 0) {// gjør dette mens vi ikke har nådd vår nye pose bioloid.interpolateStep (); // flytt servoer, om nødvendig. forsinkelse (3); } SetPosition (3, 291); // sett posisjonen til leddet 3 til '0' forsinkelse (100); // vent på at leddet skal flyttes hvis (RunCheck == 1) {MenuOptions (); }} ugyldig MovePose3 () {forsinkelse (100); // anbefalt pause bioloid.loadPose (Pose3); // last posen fra FLASH, inn i nextPose buffer bioloid.readPose (); // les i nåværende servoposisjoner til curPose -bufferen Serial.println ("############################"); Serial.println ("Flytter servoer til 3. posisjon"); Serial.println ("############################"); forsinkelse (1000); bioloid.interpolateSetup (1000); // oppsett for interpolasjon fra nåværende-> neste over 1/2 sekund mens (bioloid.interpolering> 0) {// gjør dette mens vi ikke har nådd vår nye pose bioloid.interpolateStep (); // flytt servoer, om nødvendig. forsinkelse (3); } SetPosition (3, 291); // sett posisjonen til leddet 3 til '0' forsinkelse (100); // vent på at leddet skal flyttes hvis (RunCheck == 1) {MenuOptions (); }}

ugyldig MovePose4 () {forsinkelse (100); // anbefalt pause bioloid.loadPose (Pose4); // last posen fra FLASH, inn i nextPose buffer bioloid.readPose (); // les i nåværende servoposisjoner til curPose -bufferen Serial.println ("############################"); Serial.println ("Flytter servoer til 4. posisjon"); Serial.println ("############################"); forsinkelse (1000); bioloid.interpolateSetup (1000); // oppsett for interpolasjon fra nåværende-> neste over 1/2 sekund mens (bioloid.interpolering> 0) {// gjør dette mens vi ikke har nådd vår nye pose bioloid.interpolateStep (); // flytt servoer, om nødvendig. forsinkelse (3); } SetPosition (3, 291); // sett posisjonen til leddet 3 til '0' forsinkelse (100); // vent på at leddet skal flyttes hvis (RunCheck == 1) {MenuOptions (); }}

void MoveTest () {Serial.println ("############################"); Serial.println ("Initialiserer bevegelsessignaltest"); 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); }

// iterere til neste servo ID id = id ++;

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

void MenuOptions () {Serial.println ("############################"); Serial.println ("Skriv inn alternativ 1-5 for å kjøre individuelle tester igjen."); Serial.println ("1) 1. posisjon"); Serial.println ("2) 2. posisjon"); Serial.println ("3) 3. posisjon"); Serial.println ("4) 4. posisjon"); Serial.println ("5) Hjemmeposisjon"); Serial.println ("6) Kontroller systemspenning"); Serial.println ("7) Utfør LED -test"); Serial.println ("8) Relax Servos"); Serial.println ("############################"); }

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

void LEDTest () {id = 1; Serial.println ("############################"); Serial.println ("Kjører LED -test"); Serial.println ("############################"); while (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 ++; } if (RunCheck == 1) {MenuOptions (); }}

void Grab () {SetPosition (5, 800); // sett posisjonen til leddet 1 til '0' forsinkelse (100); // vent på at leddet skal bevege seg

}

Vi har basert vårt program på produsentene PincherTest -programmet med noen store tilpasninger ved posisjonering. Vi brukte poses.h for roboten for å ha posisjonene i minnet. For det første prøvde vi å lage vår spillarm med Pixycam til å være automatisk, men på grunn av lys og små skjermproblemer kunne det ikke skje. Roboten har en grunnleggende hjemmeposisjon, etter å ha lastet opp programmet, vil den teste alle servoene som finnes i roboten. Vi har angitt posene for 1-4 knappene, så det blir lett å huske. Bruk gjerne programmet.

Trinn 4: Videoveiledning

Trinn 5: Konklusjon

Avslutningsvis er roboten et morsomt lite prosjekt for oss og en morsom ting å leke og eksperimentere med. Jeg oppfordrer deg til å prøve det og tilpasse det også.

Anbefalt: