Мазмуну:

Робот колун ойногон пианино плиткалары: 5 кадам
Робот колун ойногон пианино плиткалары: 5 кадам

Video: Робот колун ойногон пианино плиткалары: 5 кадам

Video: Робот колун ойногон пианино плиткалары: 5 кадам
Video: Миллионы остались позади! ~ Заброшенный викторианский замок английской семьи Веллингтон 2024, Июль
Anonim
Пианино плиткалары робот колунда ойнойт
Пианино плиткалары робот колунда ойнойт

Топ UCNден 2 автоматика инженерлеринен турат, алар бизди өнүктүрүүгө түрткү болгон сонун идея менен келишкен. Идея робот колун башкарган Arduino тактасына негизделген. Arduino тактасы - бул операциянын мээси, андан кийин операциянын аткаруучусу - Робот колу эмне керек болсо ошону кылат. Кененирээк түшүндүрмө кийинчерээк келет.

1 -кадам: жабдуулар

Жабдуулар
Жабдуулар

Робот колу:

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

Робот үчүн программалык камсыздоо- https://www.arduino.cc/en/Main/OldSoftwareRelease… Түстү аныктоочу камера:

CMUcam5 Pixy камерасы - (https://charmedlabs.com/default/pixy-cmucam5/)

Программалык камсыздоо - PixyMon (https://cmucam.org/projects/cmucam5/wiki/Install_PixyMon_on_Windows_Vista_7_8)

2 -кадам: Arduino орнотуу

Arduino орнотуу
Arduino орнотуу

Тактадагы орнотууну бул жерден көрө аласыз, бул абдан оңой.

Сол жакта - Электр энергиясы менен камсыздоо.

Ортоңку серво биринчи серво үчүн, кийинчерээк башка серволорго туташтырылган, серво менен.

Экинчи жагы - биз тактайды компьютерден же ноутбуктан башкарабыз, анын экинчи учунда USB кириши бар.

3 -кадам: Финалдык программа

||| ПРОГРАММА |||

#кошуу

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

#аныктоо МҮМКҮНЧҮЛҮГҮ 5

BioloidController bioloid = BioloidController (1000000);

const int SERVOCOUNT = 5; int id; int pos; логикалык IDCheck; логикалык RunCheck;

void setup () {pinMode (0, OUTPUT); ax12SetRegister2 (1, 32, 50); // биргелешкен номер 1 регистрин 32 ылдамдыгын 50. ax12SetRegister2 (2, 32, 50);; // биргелешкен номер 3 регистрин 32 ылдамдыгын 50гө коюңуз. ax12SetRegister2 (4, 32, 50); 32 ылдамдыкка 100. // өзгөрмөлөрдү инициализациялоо id = 1; pos = 0; IDCheck = 1; RunCheck = 0; // ачык сериялык порт Serial.begin (9600); кечигүү (500); Serial.println ("#############################"); Serial.println ("Сериялык байланыш түзүлдү.");

// Lipo Battery Voltage CheckVoltage текшерүү ();

// Серверлерди сканерлөө, позицияны кайтаруу MoveTest (); MoveHome (); MenuOptions (); RunCheck = 1; }

void loop () {// сенсорду окуңуз: int inByte = Serial.read ();

которуу (inByte) {

case '1': MovePose1 (); тыныгуу;

case '2': MovePose2 (); тыныгуу; case '3': MovePose3 (); тыныгуу;

case '4': MovePose4 (); тыныгуу;

case '5': MoveHome (); тыныгуу; case '6': Grab (); тыныгуу;

case '7': LEDTest (); тыныгуу;

case '8': RelaxServos (); тыныгуу; }}

void CheckVoltage () {// күтө туруңуз, андан кийин чыңалууну текшериңиз (LiPO коопсуздугу) калкыма чыңалуу = (ax12GetRegister (1, AX_PRESENT_VOLTAGE, 1)) / 10.0; Serial.println ("#############################"); Serial.print ("Системдик чыңалуу:"); Serial.print (чыңалуу); Serial.println ("вольт."); if (Voltage 10.0) {Serial.println ("Чыңалуу деңгээлдери номиналдуу."); } if (RunCheck == 1) {MenuOptions (); } Serial.println ("#############################"); }

void MoveHome () {delay (100); // сунушталган тыныгуу bioloid.loadPose (Башкы бет); // позаны FLASHтен кийинкиPose буферине жүктө bioloid.readPose (); // curPose буферине Servo.println ("##########################") учурдагы серво позицияларда окуу; Serial.println ("Серволорду Башкы позицияга жылдыруу"); Serial.println ("#############################"); кечигүү (1000); bioloid.interpolateSetup (1000); // учурдан тартып> секундасына 1/2дан ашыгыраак убакытка чейин интерполяциялоону орнотуу (bioloid.interpolating> 0) {// муну биз жаңы позага жете элек кезде жасаңыз bioloid.interpolateStep (); // эгер керек болсо, серверлерди жылдырыңыз. кечигүү (3); } if (RunCheck == 1) {MenuOptions (); }}

жараксыз MovePose1 () {кечиктирүү (100); // сунушталган тыныгуу bioloid.loadPose (Pose1); // позаны FLASHтен кийинкиPose буферине жүктө bioloid.readPose (); // curPose буферине Servo.println ("##########################") учурдагы серво позицияларда окуу; Serial.println ("Серваларды 1 -позицияга жылдыруу"); Serial.println ("#############################"); кечигүү (1000); bioloid.interpolateSetup (1000); // учурдан тартып> секундасына 1/2дан ашыгыраак убакытка чейин интерполяциялоону орнотуу (bioloid.interpolating> 0) {// муну биз жаңы позага жете элек кезде жасаңыз bioloid.interpolateStep (); // эгер керек болсо, серверлерди жылдырыңыз. кечигүү (3); } SetPosition (3, 291); // 3 муунунун абалын '0' кечигүүсүнө (100) коюңуз; // эгерде (RunCheck == 1) {MenuOptions (); }}

жараксыз MovePose2 () {кечиктирүү (100); // сунушталган тыныгуу bioloid.loadPose (Pose2); // позаны FLASHтен кийинкиPose буферине жүктө bioloid.readPose (); // curPose буферине Servo.println ("##########################") учурдагы серво позицияларда окуу; Serial.println ("Серволорду 2 -позицияга жылдыруу"); Serial.println ("#############################"); кечигүү (1000); bioloid.interpolateSetup (1000); // учурдан тартып> секундасына 1/2дан ашыгыраак убакытка чейин интерполяциялоону орнотуу (bioloid.interpolating> 0) {// муну биз жаңы позага жете элек кезде жасаңыз bioloid.interpolateStep (); // керек болсо, серверлерди жылдырыңыз. кечигүү (3); } SetPosition (3, 291); // 3 муунунун позициясын '0' кечигүүсүнө (100) коюңуз; // эгерде (RunCheck == 1) {MenuOptions (); }} void MovePose3 () {delay (100); // сунушталган тыныгуу bioloid.loadPose (Pose3); // позаны FLASHтен кийинкиPose буферине жүктө bioloid.readPose (); // curPose буферине Servo.println ("##########################") учурдагы серво позицияларда окуу; Serial.println ("Серваларды 3 -позицияга жылдыруу"); Serial.println ("#############################"); кечигүү (1000); bioloid.interpolateSetup (1000); // учурдан тартып> секундасына 1/2 секундадан (bioloid.interpolating> 0) интерполяциялоо үчүн орнотуу {bioloid.interpolateStep () жаңы позабызга жете элек кезде муну жасаңыз; // эгер керек болсо, серверлерди жылдырыңыз. кечигүү (3); } SetPosition (3, 291); // 3 муунунун позициясын '0' кечигүүсүнө (100) коюңуз; // эгерде (RunCheck == 1) {MenuOptions (); }}

жараксыз MovePose4 () {кечиктирүү (100); // сунушталган тыныгуу bioloid.loadPose (Pose4); // позаны FLASHтен кийинкиPose буферине жүктө bioloid.readPose (); // curPose буферине Servo.println ("##########################") учурдагы серво позицияларда окуу; Serial.println ("Серволорду 4 -позицияга жылдыруу"); Serial.println ("#############################"); кечигүү (1000); bioloid.interpolateSetup (1000); // учурдан тартып> секундасына 1/2дан ашыгыраак убакытка чейин интерполяциялоону орнотуу (bioloid.interpolating> 0) {// муну биз жаңы позага жете элек кезде жасаңыз bioloid.interpolateStep (); // эгер керек болсо, серверлерди жылдырыңыз. кечигүү (3); } SetPosition (3, 291); // 3 муунунун позициясын '0' кечигүүсүнө (100) коюңуз; // эгерде (RunCheck == 1) {MenuOptions (); }}

жараксыз MoveTest () {Serial.println ("###########################"); Serial.println ("Initializing Movement Sign Test"); Serial.println ("#############################"); кечигүү (500); id = 1; pos = 512; while (id <= SERVOCOUNT) {Serial.print ("Жылдырылуучу Servo ID:"); Serial.println (id);

while (pos> = 312) {SetPosition (id, pos); pos = pos--; кечигүү (10); }

while (pos <= 512) {SetPosition (id, pos); pos = pos ++; кечигүү (10); }

// кийинки servo IDге кайталоо id = id ++;

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

void MenuOptions () {Serial.println ("###########################"); Serial.println ("Жеке тесттерди кайра иштетүү үчүн 1-5 вариантты киргизиңиз."); Serial.println ("1) 1 -орун"); Serial.println ("2) 2nd Position"); Serial.println ("3) 3rd Position"); Serial.println ("4) 4 -позиция"); Serial.println ("5) Башкы позиция"); Serial.println ("6) Системанын чыңалуусун текшерүү"); Serial.println ("7) LED тестин аткаруу"); Serial.println ("8) Relax Servos"); Serial.println ("#############################"); }

боштук RelaxServos () {id = 1; Serial.println ("#############################"); Serial.println ("Эс алдыруучу кызматтар."); Serial.println ("#############################"); while (id <= SERVOCOUNT) {Relax (id); id = (id ++)%SERVOCOUNT; кечиктирүү (50); } if (RunCheck == 1) {MenuOptions (); }}

жараксыз LEDTest () {id = 1; Serial.println ("#############################"); Serial.println ("LED тестин иштетүү"); Serial.println ("#############################"); while (id <= SERVOCOUNT) {ax12SetRegister (id, 25, 1); Serial.print ("LED ON - Servo ID:"); Serial.println (id); кечигүү (3000); ax12SetRegister (id, 25, 0); Serial.print ("LED OFF - Servo ID:"); Serial.println (id); кечигүү (3000); id = id ++; } if (RunCheck == 1) {MenuOptions (); }}

void Grab () {SetPosition (5, 800); // 1 муунунун позициясын '0' кечигүүсүнө (100) коюңуз; // муун кыймылын күтүңүз

}

Биз өзүбүздүн программабызды өндүрүүчүлөрдүн PincherTest программасына негиздеп койдук. Биз роботтун эс тутумундагы орундарга ээ болушу үчүн pozes.h колдондук. Биринчиден, биз Pixycam менен ойноочу колубузду автоматтык түрдө түзүүгө аракет кылдык, бирок жарык жана кичинекей экран көйгөйлөрүнөн улам андай боло алган жок. Роботтун негизги үй позициясы бар, программаны жүктөгөндөн кийин роботтон табылган баардык серволорду текшерет. Биз 1-4 кнопкалары үчүн позаларды койдук, ошондуктан аны эстөө оңой болот. Программаны колдонуудан тартынбаңыз.

4 -кадам: Video Guide

5 -кадам: Жыйынтык

Жыйынтыктап айтканда, робот биз үчүн кызыктуу кичинекей долбоор жана айланып ойноо жана эксперимент жасоо үчүн кызыктуу. Мен аны сынап көрүүгө жана аны ыңгайлаштырууга чакырам.

Сунушталууда: