Mündəricat:

Robot qolu çalan fortepiano plitələri: 5 addım
Robot qolu çalan fortepiano plitələri: 5 addım

Video: Robot qolu çalan fortepiano plitələri: 5 addım

Video: Robot qolu çalan fortepiano plitələri: 5 addım
Video: Почему здесь остались миллионы? ~ Благородный заброшенный замок 1600-х годов 2024, Noyabr
Anonim
Robot qolunu ifa edən fortepiano plitələri
Robot qolunu ifa edən fortepiano plitələri

Qrup, UCN -dən 2 Avtomatika Mühəndisindən ibarətdir ki, bizim etməyimizə və inkişaf etməyimizə həvəsli olduğumuz parlaq bir fikir ortaya qoydu. Fikir, robot qolu idarə edən bir Arduino lövhəsinə əsaslanır. Arduino lövhəsi əməliyyatın beyinləridir və sonra əməliyyatın aktuatoru olan Robotik qol, lazım olanı edəcək. Daha dərin izah daha sonra gələcək.

Addım 1: Avadanlıq

Avadanlıq
Avadanlıq

Robot qolu:

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

Robot üçün proqram təminatı- https://www.arduino.cc/en/Main/OldSoftwareRelease… Rəng aşkarlama kamerası:

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

Proqram təminatı - PixyMon (https://cmucam.org/projects/cmucam5/wiki/Install_PixyMon_on_Windows_Vista_7_8)

Addım 2: Arduino Quraşdırması

Arduino Quraşdırması
Arduino Quraşdırması

Lövhədə quraşdırmanı burada görə bilərsiniz, bu çox asandır.

Solda Güc Təchizatı var.

Orta, sonradan digər servolara servo ilə bağlanan ilk servo üçündür.

Ən alt tərəfi, lövhəni digər ucunda USB girişi olan bir PC və ya Laptopdan idarə etdiyimiz yerdir.

Addım 3: Son Proqram

||| PROQRAM |||

#daxil edin

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

#TƏQDİM OLUN 5

BioloidController bioloid = BioloidController (1000000);

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

void setup () {pinMode (0, ÇIXIŞ); ax12SetRegister2 (1, 32, 50); // birləşmə nömrəsi 1 registrini 32 sürətini 50 -yə təyin edin. ax12SetRegister2 (2, 32, 50); // birləşmə nömrəsi 2 qeydini 32 sürətini 50 -yə təyin edin. ax12SetRegister2 (3, 32, 50); // birləşmə nömrəsi 3 reyestrini 32 sürətini 50 -yə təyin edin. ax12SetRegister2 (4, 32, 50); // birləşmə nömrəsi 4 qeydini 32 sürətini 50 -yə təyin edin. ax12SetRegister2 (5, 32, 100); 32 sürəti 100 -ə çatdırmaq üçün. // dəyişənləri başlatmaq id = 1; pos = 0; IDCheck = 1; RunCheck = 0; // açıq seriyalı port Serial.begin (9600); gecikmə (500); Serial.println ("############################"); Serial.println ("Serial Rabitə Quruldu.");

// Lipo Batareya Gərginliyinin yoxlanılması CheckVoltage ();

// Servosları tarayın, MoveTest () mövqeyini qaytarın; MoveHome (); MenuOptions (); RunCheck = 1; }

void loop () {// sensoru oxuyun: int inByte = Serial.read ();

keçid (inBayt) {

hal '1': MovePose1 (); fasilə;

hal '2': MovePose2 (); fasilə; hal '3': MovePose3 (); fasilə;

hal '4': MovePose4 (); fasilə;

hal '5': MoveHome (); fasilə; hal '6': Grab (); fasilə;

hal '7': LEDTest (); fasilə;

hal '8': RelaxServos (); fasilə; }}

void CheckVoltage () {// gözləyin, sonra gərginliyi yoxlayın (LiPO təhlükəsizliyi) float gərginliyi = (ax12GetRegister (1, AX_PRESENT_VOLTAGE, 1)) / 10.0; Serial.println ("############################"); Serial.print ("Sistem Gerilimi:"); Serial çap (gərginlik); Serial.println ("volt."); if (gərginlik 10.0) {Serial.println ("Gərginlik səviyyələri nominal."); } if (RunCheck == 1) {MenuOptions (); } Serial.println ("############################"); }

etibarsız MoveHome () {gecikmə (100); // tövsiyə olunan fasilə bioloid.loadPose (Ev); // pozanı FLASH -dan nextPose buferinə yükləyin bioloid.readPose (); // cari servo mövqelərində curPose buferinə oxuyun Serial.println ("##########################"); Serial.println ("Servoları Ev mövqeyinə keçir"); Serial.println ("############################"); gecikmə (1000); bioloid.interpolateSetup (1000); // cari-> sonrakı 1/2 saniyədən çox müddət ərzində (bioloid.interpolating> 0) interpolasiya üçün qurma {// yeni vəziyyətimiz bioloid.interpolateStep () ə çatmamış ikən bunu edin; // lazım gələrsə servoları hərəkət etdirin. gecikmə (3); } if (RunCheck == 1) {MenuOptions (); }}

etibarsız MovePose1 () {gecikmə (100); // tövsiyə olunan fasilə bioloid.loadPose (Poz1); // pozanı FLASH -dan nextPose buferinə yükləyin bioloid.readPose (); // cari servo mövqelərində curPose buferinə oxuyun Serial.println ("###########################"); Serial.println ("Servoları 1 -ci yerə köçürür"); Serial.println ("############################"); gecikmə (1000); bioloid.interpolateSetup (1000); // cari-> saniyədə 1/2 saniyədən çox müddət ərzində (bioloid.interpolating> 0) interpolasiya üçün qurma {// yeni poza bioloid.interpolateStep () çatmamışkən bunu edin; // lazım gələrsə servoları hərəkət etdirin. gecikmə (3); } SetPosition (3, 291); // 3 -cü qovşağın mövqeyini '0' gecikməsinə təyin edin (100); // oynağın hərəkət etməsini gözləyin, əgər (RunCheck == 1) {MenuOptions (); }}

etibarsız MovePose2 () {gecikmə (100); // tövsiyə olunan fasilə bioloid.loadPose (Pose2); // pozanı FLASH -dan nextPose buferinə yükləyin bioloid.readPose (); // cari servo mövqelərində curPose buferinə oxuyun Serial.println ("##########################"); Serial.println ("Servoları 2 -ci yerə köçürür"); Serial.println ("############################"); gecikmə (1000); bioloid.interpolateSetup (1000); // cari-> sonrakı 1/2 saniyədən çox müddət ərzində (bioloid.interpolating> 0) interpolasiya üçün qurma {// yeni vəziyyətimiz bioloid.interpolateStep () ə çatmamış ikən bunu edin; // lazım gələrsə servoları hərəkət etdirin. gecikmə (3); } SetPosition (3, 291); // 3 -cü qovşağın mövqeyini '0' gecikməsinə təyin edin (100); // oynağın hərəkət etməsini gözləyin, əgər (RunCheck == 1) {MenuOptions (); }} etibarsız MovePose3 () {gecikmə (100); // tövsiyə olunan fasilə bioloid.loadPose (Pose3); // pozanı FLASH -dan nextPose buferinə yükləyin bioloid.readPose (); // cari servo mövqelərində curPose buferinə oxuyun Serial.println ("##########################"); Serial.println ("Servoları 3 -cü yerə köçürür"); Serial.println ("############################"); gecikmə (1000); bioloid.interpolateSetup (1000); // cari-> sonrakı 1/2 saniyədən çox müddət ərzində (bioloid.interpolating> 0) interpolasiya üçün qurma {// yeni vəziyyətimiz bioloid.interpolateStep () ə çatmamış ikən bunu edin; // lazım gələrsə servoları hərəkət etdirin. gecikmə (3); } SetPosition (3, 291); // 3 -cü qovşağın mövqeyini '0' gecikməsinə təyin edin (100); // oynağın hərəkət etməsini gözləyin, əgər (RunCheck == 1) {MenuOptions (); }}

etibarsız MovePose4 () {gecikmə (100); // tövsiyə olunan fasilə bioloid.loadPose (Pose4); // pozanı FLASH -dan nextPose buferinə yükləyin bioloid.readPose (); // cari servo mövqelərində curPose buferinə oxuyun Serial.println ("##########################"); Serial.println ("Servoları 4 -cü mövqeyə keçir"); Serial.println ("############################"); gecikmə (1000); bioloid.interpolateSetup (1000); // cari-> sonrakı 1/2 saniyədən çox müddət ərzində (bioloid.interpolating> 0) interpolasiya üçün qurma {// yeni vəziyyətimiz bioloid.interpolateStep () ə çatmamış ikən bunu edin; // lazım gələrsə servoları hərəkət etdirin. gecikmə (3); } SetPosition (3, 291); // 3 -cü qovşağın mövqeyini '0' gecikməsinə təyin edin (100); // oynağın hərəkət etməsini gözləyin, əgər (RunCheck == 1) {MenuOptions (); }}

etibarsız MoveTest () {Serial.println ("###########################"); Serial.println ("Hərəkət İşarəsi Testini Başlatmaq"); Serial.println ("############################"); gecikmə (500); id = 1; pos = 512; while (id <= SERVOCOUNT) {Serial.print ("Daşınan Servo ID:"); Serial.println (id);

while (pos> = 312) {SetPosition (id, pos); pos = pos--; gecikmə (10); }

while (pos <= 512) {SetPosition (id, pos); pos = pos ++; gecikmə (10); }

// növbəti servo ID -yə təkrarlayın id = id ++;

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

etibarsız MenuOptions () {Serial.println ("###########################"); Serial.println ("Yenidən fərdi testlər aparmaq üçün 1-5 seçimini daxil edin."); Serial.println ("1) 1 -ci Mövqe"); Serial.println ("2) 2 -ci Mövqe"); Serial.println ("3) 3 -cü Mövqe"); Serial.println ("4) 4 -cü Mövqe"); Serial.println ("5) Ev Vəzifəsi"); Serial.println ("6) Sistem Gerilimini yoxlayın"); Serial.println ("7) LED Testini həyata keçirin"); Serial.println ("8) Relax Servos"); Serial.println ("############################"); }

boş RelaxServos () {id = 1; Serial.println ("############################"); Serial.println ("Rahatlatıcı xidmətlər."); Serial.println ("############################"); while (id <= SERVOCOUNT) {Relax (id); id = (id ++)%SERVOCOUNT; gecikmə (50); } if (RunCheck == 1) {MenuOptions (); }}

boş LEDTest () {id = 1; Serial.println ("############################"); Serial.println ("LED Testi İşləyir"); Serial.println ("############################"); while (id <= SERVOCOUNT) {ax12SetRegister (id, 25, 1); Serial.print ("LED ON - Servo ID:"); Serial.println (id); gecikmə (3000); ax12SetRegister (id, 25, 0); Serial.print ("LED OFF - Servo ID:"); Serial.println (id); gecikmə (3000); id = id ++; } if (RunCheck == 1) {MenuOptions (); }}

void Grab () {SetPosition (5, 800); // birləşmə 1 -in mövqeyini '0' gecikməsinə təyin edin (100); // oynağın hərəkət etməsini gözləyin

}

Proqramımızı istehsalçıların PincherTest proqramına əsaslanaraq mövqeləşdirmə halında bəzi əsas dəyişikliklər etdik. Robotun yaddaşdakı mövqelərinə sahib olması üçün poz.h istifadə etdik. Əvvəlcə Pixycam ilə oyun kolumuzu avtomatik olaraq yaratmağa çalışdıq, ancaq işıq və kiçik ekran problemləri səbəbindən bu baş vermədi. Robotun əsas ev mövqeyi var, proqramı yüklədikdən sonra robotda olan bütün servoları sınayacaq. 1-4 düymələri üçün pozalar qoyduq, buna görə yadda saxlamaq asan olacaq. Proqramdan istifadə etməkdən çekinmeyin.

Addım 4: Video Bələdçisi

Addım 5: Nəticə

Nəticə olaraq, robot bizim üçün əyləncəli kiçik bir layihədir və ətrafında oynamaq və təcrübə etmək üçün əyləncəli bir əyləncədir. Sizi də sınamağa və özəlləşdirməyə dəvət edirəm.

Tövsiyə: