Оглавление:

Робот-рука играет плиткой пианино: 5 шагов
Робот-рука играет плиткой пианино: 5 шагов

Видео: Робот-рука играет плиткой пианино: 5 шагов

Видео: Робот-рука играет плиткой пианино: 5 шагов
Видео: РАСКРЫТ ГЛАВНЫЙ СЕКРЕТ ПИАНИСТОВ😨😈 #пианино #пианист #музыкант 2024, Июль
Anonim
Плитка пианино играет рука робота
Плитка пианино играет рука робота

Группа состоит из 2 инженеров по автоматизации из UCN, которые придумали блестящую идею, которую мы заинтересованы в реализации и развитии. Идея основана на плате Arduino, управляющей роботизированной рукой. Плата Arduino - это мозг операции, а затем исполнительный механизм операции, роботизированная рука, будет делать то, что ей нужно. Более подробное объяснение будет позже.

Шаг 1: оборудование

Оборудование
Оборудование

Рука робота:

Робот-манипулятор Phantomx Pincher 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 "poses.h" #include // Библиотека Pixy #include

#define POSECOUNT 5

BioloidController bioloid = BioloidController (1000000);

const int SERVOCOUNT = 5; int id; int pos; логический IDCheck; boolean RunCheck;

void setup () {pinMode (0, ВЫХОД); ax12SetRegister2 (1, 32, 50); // установить регистр 32 номера соединения 1 на скорость 50. ax12SetRegister2 (2, 32, 50); // установить регистр 32 номера соединения 2 на скорость 50. ax12SetRegister2 (3, 32, 50); // устанавливаем регистр 32 соединения 3 на скорость 50. ax12SetRegister2 (4, 32, 50); // устанавливаем регистр 32 номера соединения 4 на скорость 50. ax12SetRegister2 (5, 32, 100); // устанавливаем регистр номера соединения 5 32 на скорость 100. // инициализируем переменные id = 1; pos = 0; IDCheck = 1; RunCheck = 0; // открываем последовательный порт Serial.begin (9600); задержка (500); Serial.println ("##########################"); Serial.println («Последовательная связь установлена»);

// Проверяем напряжение аккумулятора Lipo CheckVoltage ();

// Сканируем сервоприводы, возвращаем позицию MoveTest (); MoveHome (); MenuOptions (); RunCheck = 1; }

void loop () {// считываем датчик: int inByte = Serial.read ();

switch (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) float Voltage = (ax12GetRegister (1, AX_PRESENT_VOLTAGE, 1)) / 10.0; Serial.println ("##########################"); Serial.print («Системное напряжение:»); Serial.print (напряжение); Serial.println («вольт»); if (Voltage 10.0) {Serial.println («Номинальные уровни напряжения»); } если (RunCheck == 1) {MenuOptions (); } Serial.println ("##########################"); }

void MoveHome () {задержка (100); // рекомендуемая пауза bioloid.loadPose (Home); // загружаем позу из FLASH в буфер nextPose bioloid.readPose (); // считываем текущие позиции сервопривода в буфер curPose Serial.println ("##########################"); Serial.println («Перевод сервоприводов в исходное положение»); Serial.println ("##########################"); задержка (1000); bioloid.interpolateSetup (1000); // настраиваем интерполяцию от текущей до следующей более 1/2 секунды while (bioloid.interpolating> 0) {// делаем это, пока мы не достигли нашей новой позы bioloid.interpolateStep (); // при необходимости перемещаем сервоприводы. задержка (3); } если (RunCheck == 1) {MenuOptions (); }}

void MovePose1 () {задержка (100); // рекомендуемая пауза bioloid.loadPose (Pose1); // загружаем позу из FLASH в буфер nextPose bioloid.readPose (); // считываем текущие позиции сервопривода в буфер curPose Serial.println ("##########################"); Serial.println («Перемещение сервоприводов в 1-е положение»); Serial.println ("##########################"); задержка (1000); bioloid.interpolateSetup (1000); // настраиваем интерполяцию от текущей до следующей более 1/2 секунды while (bioloid.interpolating> 0) {// делаем это, пока мы не достигли нашей новой позы bioloid.interpolateStep (); // при необходимости перемещаем сервоприводы. задержка (3); } SetPosition (3, 291); // устанавливаем положение сочленения 3 на «0» delay (100); // ждем, пока сочленение переместится if (RunCheck == 1) {MenuOptions (); }}

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

void MovePose4 () {задержка (100); // рекомендуемая пауза bioloid.loadPose (Pose4); // загружаем позу из FLASH в буфер nextPose bioloid.readPose (); // считываем текущие позиции сервопривода в буфер curPose Serial.println ("##########################"); Serial.println («Перемещение сервоприводов в 4-ю позицию»); Serial.println ("##########################"); задержка (1000); bioloid.interpolateSetup (1000); // настраиваем интерполяцию от текущей до следующей более 1/2 секунды while (bioloid.interpolating> 0) {// делаем это, пока мы не достигли нашей новой позы bioloid.interpolateStep (); // при необходимости перемещаем сервоприводы. задержка (3); } SetPosition (3, 291); // устанавливаем положение сочленения 3 на «0» delay (100); // ждем, пока сочленение переместится if (RunCheck == 1) {MenuOptions (); }}

void MoveTest () {Serial.println ("###########################"); Serial.println («Инициализация теста движения знака»); Serial.println ("##########################"); задержка (500); id = 1; pos = 512; while (id <= SERVOCOUNT) {Serial.print ("Идентификатор движущегося сервопривода:"); Serial.println (id);

в то время как (позиция> = 312) {SetPosition (id, pos); pos = pos--; задержка (10); }

в то время как (позиция <= 512) {SetPosition (id, pos); pos = pos ++; задержка (10); }

// переходим к следующему идентификатору сервопривода id = id ++;

} если (RunCheck == 1) {MenuOptions (); }}

void MenuOptions () {Serial.println ("###########################"); Serial.println («Пожалуйста, введите опцию 1-5, чтобы снова запустить отдельные тесты.»); Serial.println ("1) 1-я позиция"); Serial.println ("2) 2-я позиция"); Serial.println ("3) 3-я позиция"); Serial.println («4) 4-я позиция»); Serial.println ("5) Исходное положение"); Serial.println («6) Проверить напряжение в системе»); Serial.println («7) Выполнить тест светодиода»); Serial.println ("8) Relax Servos"); Serial.println ("##########################"); }

void RelaxServos () {id = 1; Serial.println ("##########################"); Serial.println («Расслабляющие сервоприводы»); Serial.println ("##########################"); в то время как (id <= SERVOCOUNT) {Relax (id); id = (id ++)% SERVOCOUNT; задержка (50); } если (RunCheck == 1) {MenuOptions (); }}

void LEDTest () {id = 1; Serial.println ("##########################"); Serial.println («Запуск теста светодиодов»); Serial.println ("##########################"); в то время как (id <= SERVOCOUNT) {ax12SetRegister (id, 25, 1); Serial.print («Светодиод горит - ID сервопривода:»); Serial.println (id); задержка (3000); ax12SetRegister (id, 25, 0); Serial.print («Светодиод не горит - ID сервопривода:»); Serial.println (id); задержка (3000); id = id ++; } если (RunCheck == 1) {MenuOptions (); }}

void Grab () {SetPosition (5, 800); // устанавливаем положение сочленения 1 на '0' delay (100); // ждем, пока сочленение переместится

}

Мы основали нашу программу на программе производителя PincherTest с некоторыми существенными изменениями в позиционировании. Мы использовали poses.h, чтобы робот сохранял позиции в памяти. Сначала мы попытались сделать нашу игровую руку с Pixycam автоматической, но из-за проблем со светом и маленьким экраном этого не произошло. Робот имеет базовое исходное положение, после загрузки программы он проверит все сервоприводы, найденные в роботе. Мы установили позы для кнопок 1-4, так что их будет легко запомнить. Не стесняйтесь пользоваться программой.

Шаг 4. Видеогид

Шаг 5: Заключение

В заключение хочу сказать, что робот - это для нас забавный маленький проект, в котором можно поиграть и поэкспериментировать. Я рекомендую вам попробовать и настроить его.

Рекомендуемые: