Talaan ng mga Nilalaman:

Automated Ball Roller Sa Arduino at Isang Servo: 3 Hakbang
Automated Ball Roller Sa Arduino at Isang Servo: 3 Hakbang

Video: Automated Ball Roller Sa Arduino at Isang Servo: 3 Hakbang

Video: Automated Ball Roller Sa Arduino at Isang Servo: 3 Hakbang
Video: ADVANCED ANIMAL ROBOTS YOU NEED TO SEE 2024, Hulyo
Anonim
Image
Image

Ito ay isang simpleng maliit na proyekto ng Arduino at servo na tumatagal ng halos dalawang oras upang makumpleto. Gumagamit ito ng isang servo upang maiangat ang isang dulo ng isang takip ng garapon upang paikutin ang isang bola na bakal sa paligid ng bilog sa loob. Nagsisimula ito sa sarili, maaaring baguhin ang bilis at maaaring paikutin ang dalawa (o higit pa?) Na mga bola nang sabay-sabay. Masaya magtayo at makapagtrabaho. Ang mga parameter ng tiyempo ay maaaring i-play para sa marahil kahit na mas mabilis na bilis. Ang ilang mga sensor ng hall effect na may isang magnetikong bola ay maaaring magamit upang gawin itong isang mas matalinong makina na maaaring malaman ang pinakamahusay na mga parameter.

Dapat kong banggitin na ang isang tao dito sa instructables.com ay may isang mas sopistikadong ball roller machine:

Mga materyal na kinakailangan:

Arduino Uno (o anumang Arduino)

Servo Shield (opsyonal)

9g servo

takip ng garapon

metal na bola

ilang mga scrap kahoy

Hakbang 1: Gumawa ng Base at Hinged Cap Holder

Gumawa ng Base at Hinged Cap Holder
Gumawa ng Base at Hinged Cap Holder

Ang base ay isang piraso lamang ng kahoy upang mai-mount ang hinged na piraso ng kahoy. Ang hinged na kahoy ay dapat na mas malaki kaysa sa isang takip ng garapon na gagamitin mo at magkaroon ng sapat na silid para sa mga bisagra at mai-mount ang servo.

Gumamit ako ng maliliit na plastik na rc na mga bisagra ng sasakyang panghimpapawid at ipinatong lamang ito sa hinged na kahoy at sa base.

Hakbang 2: Gumawa ng Mas Mahabang Servo Arm at Maglakip ng Servo

Gumawa ng Mas Mahabang Servo Arm at Ilakip ang Servo
Gumawa ng Mas Mahabang Servo Arm at Ilakip ang Servo
Gumawa ng Mas Mahabang Servo Arm at Ilakip ang Servo
Gumawa ng Mas Mahabang Servo Arm at Ilakip ang Servo

Upang makagawa ng isang mas mahabang braso ng servo ay inilakip ko lamang ang isang 5 sentimetong piraso ng kahoy sa braso ng servo na may isang pares ng maliliit na turnilyo at mani. Ang braso ng servo ay dapat na nasa 90 degree sa servo kapag ito ay pahalang sa base.

Inidikit ko lamang ang servo sa may bisagra na kahoy ngunit nalaman ko na kung hahayaan mo itong tumakbo nang mas mahaba sa ilang minuto, maiinit ng servo ang mainit na pandikit at bitawan mula sa kahoy. Kaya't ang isang mas mahusay na pamamaraan ng pagkakabit ay ginagarantiyahan.

Hakbang 3: I-load at Patakbuhin ang Sketch

Mag-load at Patakbuhin ang Sketch
Mag-load at Patakbuhin ang Sketch

Inilagay ko ang aking servo sa pin 7 gamit ang isang kalasag dahil maginhawa lamang ito at kaunting pera lamang ang gastos nila. Kung wala kang isang kalasag pagkatapos ikabit ang servo signal wire upang i-pin ang 7 sa Arduino, ang pulang wire sa 5v sa Arduino at ang ground wire sa GND sa Arduino. Ang arduino ay dapat magbigay ng sapat na kasalukuyang upang mapatakbo ang servo. Gumagamit ako ng kalasag sapagkat madaling gamitin ang isang panlabas na boltahe para lamang sa servo.

Narito ang sketch. Sumulat ako ng isang gawain ng servo speed controller upang mabago ang bilis ng servo dahil malamang na hindi ito gagana nang maayos sa buong bilis.

Maaari mong baguhin ang tiyempoDelay upang makakuha ng iba't ibang mga bilis ng pagliligid ng bola. Maaari mo ring baguhin ang pangatlong parameter ng myServo () na pag-andar upang mabago din ang bilis.

// ///. // ///. // ///

// malaya kang magamit, manipulahin, gawin ang nais mo sa code na ito, hindi kinakailangan ang aking pangalan

// Pinapayagan ng routine na ito ang anumang bilang ng mga servo na ma-interpolate, magdagdag lamang ng mga bagong linya kung ang bilang ng mga servos ay lumampas sa 4

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

# isama

Servo MyServer1, MyServo2; // create servo object upang makontrol ang isang servo

int servoRead (int servoNumber) {

int servoCurrent;

kung (servoNumber == 1) {servoCurrent = myservo1.read (); }

kung (servoNumber == 2) {servoCurrent = myservo2.read (); }

ibalik ang servoCurrent;

}

void servoWrite (int servoNumber, int offset) {

kung (servoNumber == 1) {myservo1.write (offset); }

kung (servoNumber == 2) {myservo2.write (offset); }

}

void myServo (int newAngle, int angleInc, int incDelay, int servoNum) {

int curAngle;

kung (servoNum == 1) {curAngle = myservo1.read (); }

kung (servoNum == 2) {curAngle = myservo2.read (); }

kung (curAngle <newAngle) {

para sa (int anggulo = curAngle; anggulo <newAngle; anggulo + = angguloInc) {

kung (servoNum == 1) myservo1.write (anggulo);

kung (servoNum == 2) myservo2.write (anggulo);

antala (incDelay); }

}

kung hindi man (curAngle> newAngle) {

para sa (int anggulo = curAngle; anggulo> newAngle; anggulo - = angguloInc) {

kung (servoNum == 1) myservo1.write (anggulo);

kung (servoNum == 2) myservo2.write (anggulo);

antala (incDelay); }

}

}

walang bisa interpolate2Servos (int servo1, int servo1Position, int servo2, int servo2Position, int numberStep, int timeDelay) {

int servo1Current, servo2Current;

servo1Current = servoRead (servo1);

servo2Current = servoRead (servo2);

// Serial.print ("Servo3Pos at Kasalukuyan"); Serial.print (servo3Position); Serial.print (""); Serial.println (servo3Current);

// Serial.print ("Servo4Pos at Kasalukuyan"); Serial.print (servo4Position); Serial.print (""); Serial.println (servo4Current);

// Serial.print ("Servo5Pos at Kasalukuyan"); Serial.print (servo5Position); Serial.print (""); Serial.println (servo5Current);

// Serial.print ("Servo6Pos at Kasalukuyan"); Serial.print (servo6Position); Serial.print (""); Serial.println (servo6Current);

// Serial.println ("");

int cOffset = (servo1Position - servo1Current); cOffset = abs (cOffset) / numberStep;

int dOffset = (servo2Position - servo2Current); dOffset = abs (dOffset) / numberStep;

int cOffsetTotal = 0, dOffsetTotal = 0;

cOffsetTotal = servo1Current;

dOffsetTotal = servo2Current;

para sa (int x = 0; x

kung (servo1Position> servo1Current) {cOffsetTotal = cOffsetTotal + cOffset; }

iba pa {cOffsetTotal = cOffsetTotal - cOffset; }

kung (servo2Position> servo2Current) {dOffsetTotal = dOffsetTotal + dOffset; }

iba pa {dOffsetTotal = dOffsetTotal - dOffset; }

kung (servo1Position! = servo1Current) servoWrite (servo1, cOffsetTotal);

kung (servo2Position! = servo2Current) servoWrite (servo2, dOffsetTotal);

// Serial.print ("a at b Offset"); Serial.print (aOffsetTotal); Serial.print (""); Serial.println (bOffsetTotal); antala (10);

antala (timeDelay);

} // pagtatapos para sa

//////////////////////////////////////

// alagaan ang mga natitirang modulo //

/////////////////////////////////////

kung (servo1Position! = servo1Current) servoWrite (servo1, servo1Position);

kung (servo2Position! = servo2Current) servoWrite (servo2, servo2Position);

}

int timingDelay = 100;

int servoDelay = 100;

int degGap = 10;

// Ito ang panimulang degree (dapat mas mababa sa end degree)

int degStart = 0;

// Ito ang mga nagtatapos na degree (dapat mas malaki kaysa sa pagsisimula ng degree)

int degEnd = 360;

// Ito ang bilog na radius

int radius = 8;

walang bisa ang pag-setup ()

{

Serial.begin (9600);

pagkaantala (100);

myservo1.attach (7); // nakakabit ang servo sa pin 7 sa object ng servo

myservo1.write (90);

myservo2.attach (8); // nakakabit ang servo sa pin 8 sa object ng servo

myservo2.write (90);

pagkaantala (1000); // naghihintay para sa servo na makarating doon

interpolate2Servos (1, 90, 2, 90, 10, 60); // walang kinikilingan

pagkaantala (1000);

}

void loop () {

tiyempoDelay = 15; // gumagana sa 10

servoDelay = 4;

paikutin4 ();

// interpolate2Servos (1, 90, 2, 90, 1, 60); // walang kinikilingan

// pagkaantala (1000);

// exit (0); // pause program - hit reset upang magpatuloy

}

walang bisa spin3 () {

interpolate2Servos (1, 90, 2, 110, 1, 60); // walang kinikilingan

antala (tiyempoDelay);

interpolate2Servos (1, 90, 2, 80, 1, 60); // walang kinikilingan

antala (tiyempoDelay);

}

walang bisa spin2 () {

// interpolate2Servos (1, 80, 2, 90, 1, 50); // walang kinikilingan

antala (tiyempoDelay);

interpolate2Servos (1, 80, 2, 80, 1, 60); // walang kinikilingan

antala (tiyempoDelay);

interpolate2Servos (1, 110, 2, 80, 1, 60); // walang kinikilingan

antala (tiyempoDelay);

// interpolate2Servos (1, 110, 2, 110, 1, 60); // walang kinikilingan

antala (tiyempoDelay);

}

walang bisa spin1 () {

// int deg = (degStart / (180 / 3.14));

float deg = (degStart * 3.141592 / 180); // convert degree to radian

float xPos = 90 + (cos (deg) * radius);

// xPos = bilog (xPos);

float yPos = 90 + (sin (deg) * radius);

// yPos = bilog (yPos);

Serial.print ("degGap ="); Serial.print (degGap); Serial.print ("deg ="); Serial.print (deg); Serial.print ("cos ="); Serial.print (cos (deg)); Serial.print ("degStart ="); Serial.print (degStart); Serial.print ("x ="); Serial.print (xPos); Serial.print ("y ="); Serial. println (yPos);

// interpolate2Servos (1, xPos, 2, yPos, 1, servoDelay); // walang kinikilingan

myservo1.write (xPos);

myservo2.write (yPos);

antala (tiyempoDelay);

kung (degStart> = degEnd) {

degStart = 0;

kung (degGap> 180)

degGap = 180;

// degGap = 0;

iba pa

degGap = degGap + 2;

degGap = degGap - 2;

// degStart = degStart + degGap;

}

degStart = degStart + degGap;

}

walang bisa spin4 () {

para sa (int i = 0; i <= 360; i ++) {

float j = 20 * (cos ((3.14 * i) / 180)) + 90;

lumutang k = 20 * (kasalanan ((3.14 * i) / 180)) + 90;

myservo1.write (j);

myservo2.write (k);

Serial.print (j);

Serial.print (",");

Serial.println (k);

pagkaantala (100);

}

}

Inirerekumendang: