Სარჩევი:

ავტომატური ბურთი Ruller ერთად Arduino და ერთი Servo: 3 ნაბიჯი
ავტომატური ბურთი Ruller ერთად Arduino და ერთი Servo: 3 ნაბიჯი

ვიდეო: ავტომატური ბურთი Ruller ერთად Arduino და ერთი Servo: 3 ნაბიჯი

ვიდეო: ავტომატური ბურთი Ruller ერთად Arduino და ერთი Servo: 3 ნაბიჯი
ვიდეო: SKR 1.3 - TFT35 V3 RepRap Discount Full Graphic Smart Controller Mode (1 of 3) 2024, ივლისი
Anonim
Image
Image

ეს არის მარტივი პატარა Arduino და servo პროექტი, რომლის დასრულებას დაახლოებით ორი საათი სჭირდება. ის იყენებს სერვოს, რომ აწიოს ქილის თავსახურის ერთი ბოლო ისე, რომ ფოლადის ბურთი დატრიალდეს შიდა წრეწირის გარშემო. ის თავისით იწყებს, შეუძლია შეცვალოს სიჩქარე და შეუძლია ერთდროულად ორი (ან მეტი?) ბურთის ტრიალი. სახალისოა მშენებლობა და მუშაობა. დროის პარამეტრების დაკვრა შესაძლებელია უფრო დიდი სიჩქარითაც კი. რამოდენიმე დარბაზული ეფექტის სენსორი მაგნიტური ბურთით შეიძლება გამოყენებულ იქნას, რომ გახადოს ის უფრო ჭკვიანი მანქანა, რომელსაც შეუძლია განსაზღვროს საუკეთესო პარამეტრები.

უნდა აღვნიშნო, რომ ვინმეს აქ instructables.com– ზე აქვს უფრო დახვეწილი ბურთიანი როლიკებით მანქანა:

საჭირო მასალები:

Arduino Uno (ან ნებისმიერი Arduino)

სერვო ფარი (სურვილისამებრ)

9 გრ სერვო

ქილა თავსახური

ფოლადის ბურთი

რაღაც ჯართი ხე

ნაბიჯი 1: გააკეთეთ ბაზა და ჩამოკიდებული თავსახური

ჩადება ბაზა და hinged Cap მფლობელი
ჩადება ბაზა და hinged Cap მფლობელი

ფუძე მხოლოდ ხის ნაჭერია, რომელზედაც დასაკიდებლად არის დამოკიდებული ხის ნაჭერი. ჩამოკიდებული ხე უნდა იყოს უფრო დიდი ვიდრე ქილის თავსახური, რომელსაც გამოიყენებთ და საკმარისი ადგილი ექნება დასაყენებლად და სერვოს დასამაგრებლად.

მე გამოვიყენე პატარა პლასტიკური rc თვითმფრინავების საკინძები და უბრალოდ გავამაგრე ისინი ჩამოკიდებულ ხეზე და ძირზე.

ნაბიჯი 2: გახადეთ უფრო გრძელი სერვო მკლავი და მიამაგრეთ სერვო

გააკეთეთ უფრო გრძელი სერვო მკლავი და მიამაგრეთ სერვო
გააკეთეთ უფრო გრძელი სერვო მკლავი და მიამაგრეთ სერვო
გააკეთეთ უფრო გრძელი სერვო მკლავი და მიამაგრეთ სერვო
გააკეთეთ უფრო გრძელი სერვო მკლავი და მიამაგრეთ სერვო

უფრო გრძელი სერვო მკლავის გასაკეთებლად მე მხოლოდ 5 სანტიმეტრიანი ხის ნაჭერი დავამატე სერვო მკლავზე რამდენიმე პატარა ხრახნით და თხილით. Servo arm უნდა იყოს 90 გრადუსზე servo როდესაც ის ჰორიზონტალურია ბაზაზე.

მე მხოლოდ ცხელი მიმაგრებული ვარ სერვოზე ჩამოკიდებული ხის დამჭერზე, მაგრამ აღმოვაჩინე, რომ თუ მას რამდენიმე წუთზე მეტხანს გაუშვებთ, სერვო გახურებს ცხელ წებოს და გაუშვებს ხედან. ასე რომ, დანართის უკეთესი მეთოდი გარანტირებულია.

ნაბიჯი 3: ჩატვირთეთ და გაუშვით ესკიზი

ჩატვირთეთ და გაუშვით ესკიზი
ჩატვირთეთ და გაუშვით ესკიზი

მე დავამატე ჩემი servo pin 7 -ზე ფარის გამოყენებით, რადგან ის უბრალოდ მოსახერხებელია და ისინი მხოლოდ რამდენიმე დოლარს ხარჯავენ. თუ თქვენ არ გაქვთ ფარი, მიამაგრეთ servo სიგნალის მავთული Arduino– ზე, pin 7 – ზე, Arduino– ზე წითელი მავთული 5v– ზე და Arduino– ზე GND– ზე. არდუინომ უნდა უზრუნველყოს საკმარისი დენი, რათა იმუშაოს სერვოზე. მე ვიყენებ ფარს, რადგან ადვილია გარე ძაბვის გამოყენება მხოლოდ სერვოსთვის.

აქ არის ესკიზი. მე დავწერე servo სიჩქარის კონტროლერის რუტინა, რათა შევცვალო servo– ს სიჩქარე, რადგან ის ალბათ კარგად არ იმუშავებს სრული სიჩქარით.

თქვენ შეგიძლიათ შეცვალოთ დროის დაგვიანება ბურთის მოძრაობის სხვადასხვა სიჩქარის მისაღებად. თქვენ ასევე შეგიძლიათ შეცვალოთ myServo () ფუნქციის მესამე პარამეტრი სიჩქარის შესაცვლელად.

///////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// /////////////// // შექმნილი ჯიმ დემელოს მიერ, შანგლუოს უნივერსიტეტი, 2017 წ

// თქვენ თავისუფლად შეგიძლიათ გამოიყენოთ, მოახდინოთ მანიპულირება, გააკეთოთ რაც გსურთ ამ კოდით, ჩემი სახელი არ არის საჭირო

// ეს რუტინა საშუალებას იძლევა ნებისმიერი რაოდენობის სერვისის ინტერპოლაცია, უბრალოდ დაამატეთ ახალი ხაზები, თუ სერვისების რაოდენობა აღემატება 4 -ს

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

#ჩართეთ

სერვო myservo1, myservo2; // servo ობიექტის შექმნა servo- ს გასაკონტროლებლად

int servoRead (int servoNumber) {

int servoCurrent;

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

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

დაბრუნების servoCurrent;

}

void servoWrite (int servoNumber, int offset) {

if (servoNumber == 1) {myservo1.write (ოფსეტური); }

if (servoNumber == 2) {myservo2.write (ოფსეტური); }

}

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

int curAngle;

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

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

if (curAngle <newAngle) {

for (int angle = curAngle; angle <newAngle; angle += angleInc) {

if (servoNum == 1) myservo1.write (კუთხე);

if (servoNum == 2) myservo2.write (კუთხე);

დაგვიანება (ჩათვლით დაგვიანებით); }

}

else if (curAngle> newAngle) {

for (int angle = curAngle; angle> newAngle; angle -= angleInc) {

if (servoNum == 1) myservo1.write (კუთხე);

if (servoNum == 2) myservo2.write (კუთხე);

დაგვიანება (ჩათვლით დაგვიანებით); }

}

}

void interpolate2Servos (int servo1, int servo1 პოზიცია, int servo2, int servo2 პოზიცია, int ნომერი ნაბიჯები, int დრო დაგვიანებით) {

int servo1Current, servo2Current;

servo1Current = servoRead (servo1);

servo2Current = servoRead (servo2);

// Serial.print ("Servo3Pos და მიმდინარე"); Serial.print (servo3Position); Serial.print (""); Serial.println (servo3Current);

// Serial.print ("Servo4Pos და მიმდინარე"); Serial.print (servo4Position); Serial.print (""); Serial.println (servo4Current);

// Serial.print ("Servo5Pos და მიმდინარე"); Serial.print (servo5Position); Serial.print (""); Serial.println (servo5Current);

// Serial.print ("Servo6Pos და მიმდინარე"); Serial.print (servo6Position); Serial.print (""); Serial.println (servo6Current);

// Serial.println ("");

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

int dOffset = (servo2Position - servo2Current); dOffset = abs (dOffset)/ნომერი ნაბიჯები;

int cOffsetTotal = 0, dOffsetTotal = 0;

cOffsetTotal = servo1Current;

dOffsetTotal = servo2Current;

for (int x = 0; x

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

else {cOffsetTotal = cOffsetTotal - cOffset; }

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

else {dOffsetTotal = dOffsetTotal - dOffset; }

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

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

// Serial.print ("a and b Offset"); Serial.print (aOffsetTotal); Serial.print (""); Serial.println (bOffsetTotal); დაგვიანება (10);

დაგვიანება (დროის დაყოვნება);

} // დასრულება for

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

// იზრუნე მოდულის ნარჩენებზე //

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

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

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

}

int timingDelay = 100;

int servoDelay = 100;

int degGap = 10;

// ეს არის საწყისი ხარისხი (უნდა იყოს ბოლო ხარისხზე ნაკლები)

int degStart = 0;

// ეს არის დამთავრების ხარისხი (უნდა იყოს უფრო დიდი ვიდრე საწყისი ხარისხი)

int degEnd = 360;

// ეს არის წრის რადიუსი

int რადიუსი = 8;

ბათილად დაყენება ()

{

სერიული.დაწყება (9600);

დაგვიანება (100);

myservo1.attach (7); // მიმაგრებს servo პინ 7 -ზე servo ობიექტს

myservo1. დაწერა (90);

myservo2.attach (8); // ანიჭებს servo პინ 8 -ს servo ობიექტს

myservo2.write (90);

დაგვიანება (1000); // ელოდება სერვოს იქ მისვლას

interpolate2Servos (1, 90, 2, 90, 10, 60); // ნეიტრალური

დაგვიანება (1000);

}

ბათილი მარყუჟი () {

დრო დაგვიანებით = 15; // მუშაობს 10 -ზე

servoDelay = 4;

spin4 ();

// interpolate2Servos (1, 90, 2, 90, 1, 60); // ნეიტრალური

// დაგვიანება (1000);

// გასვლა (0); // პაუზის პროგრამა - გასაგრძელებლად დააჭირეთ გადატვირთვას

}

void spin3 () {

interpolate2Servos (1, 90, 2, 110, 1, 60); // ნეიტრალური

შეფერხება (დრო დაგვიანებით);

interpolate2Servos (1, 90, 2, 80, 1, 60); // ნეიტრალური

შეფერხება (დრო დაგვიანებით);

}

void spin2 () {

// interpolate2Servos (1, 80, 2, 90, 1, 50); // ნეიტრალური

შეფერხება (დრო დაგვიანებით);

interpolate2Servos (1, 80, 2, 80, 1, 60); // ნეიტრალური

შეფერხება (დრო დაგვიანებით);

interpolate2Servos (1, 110, 2, 80, 1, 60); // ნეიტრალური

შეფერხება (დრო დაგვიანებით);

// interpolate2Servos (1, 110, 2, 110, 1, 60); // ნეიტრალური

შეფერხება (დრო დაგვიანებით);

}

void spin1 () {

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

float deg = (degStart * 3.141592 / 180); // გადააკეთეთ გრადუსი რადიანებად

float xPos = 90 + (cos (deg) * რადიუსი);

// xPos = მრგვალი (xPos);

float yPos = 90 + (sin (deg) * რადიუსი);

// yPos = მრგვალი (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 ="); სერიული println (yPos);

// interpolate2Servos (1, xPos, 2, yPos, 1, servoDelay); // ნეიტრალური

myservo1.write (xPos);

myservo2.write (yPos);

შეფერხება (დრო დაგვიანებით);

if (degStart> = degEnd) {

degStart = 0;

თუ (degGap> 180)

degGap = 180;

// degGap = 0;

სხვა

degGap = degGap + 2;

degGap = degGap - 2;

// degStart = degStart +degGap;

}

degStart = degStart + degGap;

}

void spin4 () {

for (int i = 0; i <= 360; i ++) {

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

float k = 20 * (ცოდვა ((3.14 * i)/180)) + 90;

myservo1. დაწერა (j);

myservo2. დაწერე (ლ);

სერიული. ბეჭდვა (j);

Serial.print (",");

სერიული. ბეჭდვა (კ);

დაგვიანება (100);

}

}

გირჩევთ: