Índice:

Ladrilhos de piano tocando braço de robô: 5 etapas
Ladrilhos de piano tocando braço de robô: 5 etapas

Vídeo: Ladrilhos de piano tocando braço de robô: 5 etapas

Vídeo: Ladrilhos de piano tocando braço de robô: 5 etapas
Vídeo: Expectativa VS Realidade ao aprender teclado sozinho #shorts 2024, Novembro
Anonim
Ladrilhos de piano tocando braço de robô
Ladrilhos de piano tocando braço de robô

O grupo é formado por 2 Engenheiros de Automação da UCN, que tiveram uma ideia brilhante que estamos motivados a fazer e desenvolver. A ideia é baseada em uma placa Arduino controlando um braço robótico. A placa Arduino é o cérebro da operação e, em seguida, o atuador da operação, o braço robótico, fará o que for necessário. A explicação mais detalhada virá mais tarde.

Etapa 1: Equipamento

Equipamento
Equipamento

Braço do robô:

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

Software para o robô- https://www.arduino.cc/en/Main/OldSoftwareRelease… Câmera de detecção de cores:

Câmera CMUcam5 Pixy - (https://charmedlabs.com/default/pixy-cmucam5/)

Software - PixyMon (https://cmucam.org/projects/cmucam5/wiki/Install_PixyMon_on_Windows_Vista_7_8)

Etapa 2: configuração do Arduino

Arduino Setup
Arduino Setup

Você pode ver a configuração na placa aqui, o que é muito fácil.

À esquerda está a fonte de alimentação.

O do meio é para o primeiro servo, que mais tarde é conectado aos outros servos, servo por servo.

O inferior é onde controlamos a placa de um PC ou laptop, que possui uma entrada USB na outra extremidade.

Etapa 3: Programa Final

||| PROGRAMA |||

#incluir

#include #include "poses.h" #include // Biblioteca Pixy #include

#define POSECOUNT 5

BioloidController bioloid = BioloidController (1000000);

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

void setup () {pinMode (0, OUTPUT); ax12SetRegister2 (1, 32, 50); // define o registro 32 do número da junta para a velocidade 50. ax12SetRegister2 (2, 32, 50); // define o registro 32 do número da junta 2 para a velocidade 50. ax12SetRegister2 (3, 32, 50); // define o registro 32 do número da junta 3 para a velocidade 50. ax12SetRegister2 (4, 32, 50); // define o registro 32 do número da junta 4 para a velocidade 50. ax12SetRegister2 (5, 32, 100); // define o registro do número 5 da junta 32 para velocidade 100. // inicializar variáveis id = 1; pos = 0; IDCheck = 1; RunCheck = 0; // abre a porta serial Serial.begin (9600); atraso (500); Serial.println ("###################################"); Serial.println ("Comunicação serial estabelecida.");

// Verifique a tensão da bateria Lipo CheckVoltage ();

// Varre os Servos, retorna a posição MoveTest (); MoveHome (); Opções do menu(); RunCheck = 1; }

void loop () {// lê o sensor: int inByte = Serial.read ();

switch (inByte) {

case '1': MovePose1 (); pausa;

caso '2': MovePose2 (); pausa; case '3': MovePose3 (); pausa;

caso '4': MovePose4 (); pausa;

caso '5': MoveHome (); pausa; caso '6': Grab (); pausa;

caso '7': LEDTest (); pausa;

caso '8': RelaxServos (); pausa; }}

void CheckVoltage () {// aguarde e verifique a tensão (segurança LiPO) float voltage = (ax12GetRegister (1, AX_PRESENT_VOLTAGE, 1)) / 10.0; Serial.println ("###################################"); Serial.print ("Tensão do sistema:"); Serial.print (voltagem); Serial.println ("volts."); if (voltagem 10.0) {Serial.println ("Níveis de voltagem nominais."); } if (RunCheck == 1) {MenuOptions (); } Serial.println ("##################################"); }

void MoveHome () {atraso (100); // pausa recomendada bioloid.loadPose (Home); // carrega a pose do FLASH, no buffer nextPose bioloid.readPose (); // lê nas posições servo atuais para o buffer curPose Serial.println ("##################################"); Serial.println ("Movendo servos para a posição inicial"); Serial.println ("###################################"); atraso (1000); bioloid.interpolateSetup (1000); // configuração para interpolação de current-> next sobre 1/2 segundo while (bioloid.interpolating> 0) {// faça isso enquanto não alcançamos nossa nova pose bioloid.interpolateStep (); // mova servos, se necessário. atraso (3); } if (RunCheck == 1) {MenuOptions (); }}

void MovePose1 () {delay (100); // pausa recomendada bioloid.loadPose (Pose1); // carrega a pose do FLASH, no buffer nextPose bioloid.readPose (); // ler as posições servo atuais para o buffer curPose Serial.println ("##################################"); Serial.println ("Movendo servos para a 1ª posição"); Serial.println ("###################################"); atraso (1000); bioloid.interpolateSetup (1000); // configuração para interpolação de current-> next em 1/2 segundo while (bioloid.interpolating> 0) {// faça isso enquanto não alcançamos nossa nova pose bioloid.interpolateStep (); // mova servos, se necessário. atraso (3); } SetPosition (3, 291); // define a posição da junta 3 para '0' delay (100); // espera que a junta se mova if (RunCheck == 1) {MenuOptions (); }}

void MovePose2 () {delay (100); // pausa recomendada bioloid.loadPose (Pose2); // carrega a pose do FLASH, no buffer nextPose bioloid.readPose (); // ler as posições servo atuais para o buffer curPose Serial.println ("##################################"); Serial.println ("Movendo servos para a 2ª posição"); Serial.println ("###################################"); atraso (1000); bioloid.interpolateSetup (1000); // configuração para interpolação de current-> next sobre 1/2 segundo while (bioloid.interpolating> 0) {// faça isso enquanto não alcançamos nossa nova pose bioloid.interpolateStep (); // mova servos, se necessário. atraso (3); } SetPosition (3, 291); // define a posição da junta 3 para '0' delay (100); // espera que a junta se mova if (RunCheck == 1) {MenuOptions (); }} void MovePose3 () {delay (100); // pausa recomendada bioloid.loadPose (Pose3); // carrega a pose do FLASH, no buffer nextPose bioloid.readPose (); // lê nas posições servo atuais para o buffer curPose Serial.println ("##################################"); Serial.println ("Movendo servos para a 3ª posição"); Serial.println ("###################################"); atraso (1000); bioloid.interpolateSetup (1000); // configuração para interpolação de current-> next sobre 1/2 segundo while (bioloid.interpolating> 0) {// faça isso enquanto não alcançamos nossa nova pose bioloid.interpolateStep (); // mova servos, se necessário. atraso (3); } SetPosition (3, 291); // define a posição da junta 3 para '0' delay (100); // espera que a junta se mova if (RunCheck == 1) {MenuOptions (); }}

void MovePose4 () {delay (100); // pausa recomendada bioloid.loadPose (Pose4); // carrega a pose do FLASH, no buffer nextPose bioloid.readPose (); // lê nas posições servo atuais para o buffer curPose Serial.println ("##################################"); Serial.println ("Movendo servos para a 4ª posição"); Serial.println ("###################################"); atraso (1000); bioloid.interpolateSetup (1000); // configuração para interpolação de current-> next em 1/2 segundo while (bioloid.interpolating> 0) {// faça isso enquanto não alcançamos nossa nova pose bioloid.interpolateStep (); // mova servos, se necessário. atraso (3); } SetPosition (3, 291); // define a posição da junta 3 para '0' delay (100); // espera que a junta se mova if (RunCheck == 1) {MenuOptions (); }}

void MoveTest () {Serial.println ("################################"); Serial.println ("Teste de sinal de movimento de inicialização"); Serial.println ("###################################"); atraso (500); id = 1; pos = 512; while (id <= SERVOCOUNT) {Serial.print ("Moving Servo ID:"); Serial.println (id);

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

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

// itera para o próximo servo ID id = id ++;

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

void MenuOptions () {Serial.println ("###############################"); Serial.println ("Insira a opção 1-5 para executar testes individuais novamente."); Serial.println ("1) 1ª posição"); Serial.println ("2) 2ª posição"); Serial.println ("3) 3ª posição"); Serial.println ("4) 4ª posição"); Serial.println ("5) Posição inicial"); Serial.println ("6) Verifique a tensão do sistema"); Serial.println ("7) Executar teste de LED"); Serial.println ("8) Relax Servos"); Serial.println ("###################################"); }

vazio RelaxServos () {id = 1; Serial.println ("###################################"); Serial.println ("Relaxing Servos."); Serial.println ("###################################"); enquanto (id <= SERVOCOUNT) {Relax (id); id = (id ++)% SERVOCOUNT; atraso (50); } if (RunCheck == 1) {MenuOptions (); }}

void LEDTest () {id = 1; Serial.println ("###################################"); Serial.println ("Executando teste de LED"); Serial.println ("###################################"); while (id <= SERVOCOUNT) {ax12SetRegister (id, 25, 1); Serial.print ("LED LIGADO - ID do Servo:"); Serial.println (id); atraso (3000); ax12SetRegister (id, 25, 0); Serial.print ("LED apagado - ID do servo:"); Serial.println (id); atraso (3000); id = id ++; } if (RunCheck == 1) {MenuOptions (); }}

void Grab () {SetPosition (5, 800); // definir a posição da junta 1 para '0' delay (100); // esperar que a junta se mova

}

Baseamos nosso programa no programa PincherTest do fabricante, com alguns ajustes importantes no caso de posicionamento. Usamos o poses.h para o robô ter as posições na memória. Em primeiro lugar, tentamos criar o nosso braço de jogo com Pixycam para ser automático, mas devido a problemas de luz e tela pequena, isso não pôde acontecer. O robô tem uma posição inicial básica, após carregar o programa, ele testará todos os servos encontrados no robô. Definimos as poses para os botões de 1 a 4, para que sejam fáceis de lembrar. Sinta-se à vontade para usar o programa.

Etapa 4: guia de vídeo

Etapa 5: Conclusão

Concluindo, o robô é um pequeno projeto divertido para nós e uma coisa divertida de brincar e experimentar. Eu encorajo você a experimentá-lo e personalizá-lo também.

Recomendado: