INHOUDSOPGAWE:

Klavierteëls speel robotarm: 5 stappe
Klavierteëls speel robotarm: 5 stappe

Video: Klavierteëls speel robotarm: 5 stappe

Video: Klavierteëls speel robotarm: 5 stappe
Video: Робот-ячейка сваривает гигантские вентиляторы 2024, November
Anonim
Klavierteëls speel robotarm
Klavierteëls speel robotarm

Die groep bestaan uit 2 outomatiseringsingenieurs van UCN, wat 'n briljante idee gekry het wat ons gemotiveerd is om te doen en te ontwikkel. Die idee is gebaseer op 'n Arduino -bord wat 'n robotarm beheer. Die Arduino -bord is die brein van die operasie en dan sal die aktuator van die operasie, die robotarm, doen wat nodig is. Die meer diepgaande verduideliking sal later kom.

Stap 1: Toerusting

Toerusting
Toerusting

Robotarm:

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

Sagteware vir die robot- https://www.arduino.cc/en/Main/OldSoftwareRelease… Kleuropsporingskamera:

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

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

Stap 2: Arduino -opstelling

Opstel van Arduino
Opstel van Arduino

U kan die opstelling hier op die bord sien, wat baie maklik is.

Links is die kragtoevoer.

Die middelste is vir die eerste servo, wat later met die ander servo's verbind word, servo per servo.

Die onderste is waar ons die bord vanaf 'n rekenaar of skootrekenaar beheer, met 'n USB -ingang aan die ander kant.

Stap 3: Finale program

||| PROGRAM |||

#insluit

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

#definieer POSECOUNT 5

BioloidController bioloid = BioloidController (1000000);

const int SERVOCOUNT = 5; int id; int pos; boolean IDCheck; booleaanse RunCheck;

ongeldige opstelling () {pinMode (0, OUTPUT); ax12SetRegister2 (1, 32, 50); // stel gesamentlike nommer 1 register 32 op spoed 50. ax12SetRegister2 (2, 32, 50); // stel gesamentlike nommer 2 register 32 op spoed 50. ax12SetRegister2 (3, 32, 50); // stel gesamentlike nommer 3 register 32 op spoed 50. ax12SetRegister2 (4, 32, 50); // stel gesamentlike nommer 4 register 32 op spoed 50. ax12SetRegister2 (5, 32, 100); // stel gesamentlike nommer 5 register 32 om 100 te versnel. // initialiseer veranderlikes id = 1; pos = 0; IDCheck = 1; RunCheck = 0; // oop seriële poort Serial.begin (9600); vertraging (500); Serial.println ("############################"); Serial.println ("Serial Communication Gevestig.");

// Kontroleer Lipo -batteryspanning CheckVoltage ();

// Skandeer servo's, gee posisie terug MoveTest (); MoveHome (); MenuOptions (); RunCheck = 1; }

leemte -lus () {// lees die sensor: int inByte = Serial.read ();

skakelaar (inByte) {

geval '1': MovePose1 (); breek;

geval '2': MovePose2 (); breek; geval '3': MovePose3 (); breek;

geval '4': MovePose4 (); breek;

geval '5': MoveHome (); breek; geval '6': Gryp (); breek;

geval '7': LEDTest (); breek;

geval '8': RelaxServos (); breek; }}

ongeldig CheckVoltage () {// wag, kyk dan na die spanning (LiPO -veiligheid) vlotspanning = (ax12GetRegister (1, AX_PRESENT_VOLTAGE, 1)) / 10.0; Serial.println ("############################"); Serial.print ("Stelselspanning:"); Reeks.afdruk (spanning); Serial.println ("volts."); if (spanning 10.0) {Serial.println ("Spanningsvlakke nominaal."); } as (RunCheck == 1) {MenuOptions (); } Serial.println ("############################"); }

nietig MoveHome () {vertraging (100); // aanbevole pouse bioloid.loadPose (Home); // laai die pose van FLASH af in die nextPose buffer bioloid.readPose (); // lees in huidige servoposisies na die curPose buffer Serial.println ("############################"); Serial.println ("Skuif servo's na tuisposisie"); Serial.println ("############################"); vertraging (1000); bioloid.interpolateSetup (1000); // opstel vir interpolasie vanaf huidige-> volgende meer as 1/2 sekonde (bioloid.interpolating> 0) {// doen dit terwyl ons nie ons nuwe pose bioloid.interpolateStep () bereik het nie; // skuif servo's, indien nodig. vertraging (3); } as (RunCheck == 1) {MenuOptions (); }}

nietig MovePose1 () {vertraging (100); // aanbevole pouse bioloid.loadPose (Pose1); // laai die pose van FLASH af in die nextPose buffer bioloid.readPose (); // lees in huidige servoposisies na die curPose buffer Serial.println ("############################"); Serial.println ("Skuif servo's na 1ste posisie"); Serial.println ("############################"); vertraging (1000); bioloid.interpolateSetup (1000); // opstel vir interpolasie vanaf huidige-> volgende meer as 1/2 sekonde (bioloid.interpolating> 0) {// doen dit terwyl ons nie ons nuwe pose bioloid.interpolateStep () bereik het nie; // skuif servo's, indien nodig. vertraging (3); } SetPosition (3, 291); // stel die posisie van gewrig 3 op '0' vertraging (100); // wag tot gewrig beweeg om te (ifCheck == 1) {MenuOptions (); }}

nietig MovePose2 () {vertraging (100); // aanbevole pouse bioloid.loadPose (Pose2); // laai die pose van FLASH af in die nextPose buffer bioloid.readPose (); // lees in huidige servoposisies na die curPose buffer Serial.println ("############################"); Serial.println ("Skuif servo's na 2de posisie"); Serial.println ("############################"); vertraging (1000); bioloid.interpolateSetup (1000); // opstel vir interpolasie vanaf huidige-> volgende meer as 1/2 sekonde (bioloid.interpolating> 0) {// doen dit terwyl ons nie ons nuwe pose bioloid.interpolateStep () bereik het nie; // skuif servo's, indien nodig. vertraging (3); } SetPosition (3, 291); // stel die posisie van gewrig 3 op '0' vertraging (100); // wag tot gewrig beweeg om te (ifCheck == 1) {MenuOptions (); }} ongeldig MovePose3 () {vertraging (100); // aanbevole pouse bioloid.loadPose (Pose3); // laai die pose van FLASH af in die nextPose buffer bioloid.readPose (); // lees in huidige servoposisies na die curPose buffer Serial.println ("############################"); Serial.println ("Skuif servo's na die derde posisie"); Serial.println ("############################"); vertraging (1000); bioloid.interpolateSetup (1000); // opstel vir interpolasie vanaf huidige-> volgende meer as 1/2 sekonde (bioloid.interpolating> 0) {// doen dit terwyl ons nie ons nuwe pose bioloid.interpolateStep () bereik het nie; // skuif servo's, indien nodig. vertraging (3); } SetPosition (3, 291); // stel die posisie van gewrig 3 op '0' vertraging (100); // wag tot gewrig beweeg om te (ifCheck == 1) {MenuOptions (); }}

nietig MovePose4 () {vertraging (100); // aanbevole pouse bioloid.loadPose (Pose4); // laai die pose van FLASH af in die nextPose buffer bioloid.readPose (); // lees in huidige servoposisies na die curPose buffer Serial.println ("############################"); Serial.println ("Skuif servo's na die vierde posisie"); Serial.println ("############################"); vertraging (1000); bioloid.interpolateSetup (1000); // opstel vir interpolasie vanaf huidige-> volgende meer as 1/2 sekonde (bioloid.interpolating> 0) {// doen dit terwyl ons nie ons nuwe pose bioloid.interpolateStep () bereik het nie; // skuif servo's, indien nodig. vertraging (3); } SetPosition (3, 291); // stel die posisie van gewrig 3 op '0' vertraging (100); // wag totdat die gewrig beweeg as (RunCheck == 1) {MenuOptions (); }}

void MoveTest () {Serial.println ("############################"); Serial.println ("Initialisering van bewegingstekentoets"); Serial.println ("############################"); vertraging (500); id = 1; pos = 512; while (id <= SERVOCOUNT) {Serial.print ("Moving Servo ID:"); Serial.println (id);

terwyl (pos> = 312) {SetPosition (id, pos); pos = pos--; vertraging (10); }

terwyl (pos <= 512) {SetPosition (id, pos); pos = pos ++; vertraging (10); }

// herhaal na die volgende servo ID id = id ++;

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

void MenuOptions () {Serial.println ("############################"); Serial.println ("Voer asseblief opsie 1-5 in om individuele toetse weer uit te voer."); Serial.println ("1) 1ste posisie"); Serial.println ("2) 2de posisie"); Serial.println ("3) 3de posisie"); Serial.println ("4) 4de posisie"); Serial.println ("5) tuisposisie"); Serial.println ("6) Kontroleer stelsel spanning"); Serial.println ("7) Voer LED -toets uit"); Serial.println ("8) Relax Servos"); Serial.println ("############################"); }

leegte RelaxServos () {id = 1; Serial.println ("############################"); Serial.println ("Ontspannende servo's."); Serial.println ("############################"); terwyl (id <= SERVOCOUNT) {Ontspan (id); id = (id ++)%SERVOCOUNT; vertraging (50); } as (RunCheck == 1) {MenuOptions (); }}

leegte LEDTest () {id = 1; Serial.println ("############################"); Serial.println ("Lopende LED -toets"); Serial.println ("############################"); terwyl (id <= SERVOCOUNT) {ax12SetRegister (id, 25, 1); Serial.print ("LED ON - Servo ID:"); Serial.println (id); vertraging (3000); ax12SetRegister (id, 25, 0); Serial.print ("LED OFF - Servo ID:"); Serial.println (id); vertraging (3000); id = id ++; } as (RunCheck == 1) {MenuOptions (); }}

leegte Gryp () {SetPosition (5, 800); // stel die posisie van gewrig 1 op '0' vertraging (100); // wag totdat die gewrig beweeg

}

Ons het ons program gebaseer op die PincherTest -program van die vervaardiger, met 'n paar belangrike aanpassings in die geval van posisionering. Ons gebruik die poses.h vir die robot om die posisies in die geheue te hê. Eerstens het ons probeer om ons speelarm met Pixycam outomaties te maak, maar weens ligte en klein skermprobleme kon dit nie gebeur nie. Die robot het 'n basiese tuisposisie, nadat hy die program opgelaai het, sal hy al die servo's in die robot toets. Ons het die posisies vir die 1-4 knoppies gestel, so dit is maklik om te onthou. Gebruik die program gerus.

Stap 4: Videogids

Stap 5: Gevolgtrekking

Ten slotte, die robot is 'n prettige klein projek vir ons en 'n lekker ding om mee rond te speel en mee te eksperimenteer. Ek moedig u aan om dit ook te probeer en aan te pas.

Aanbeveel: