Sommario:

Piastrelle per pianoforte che suonano il braccio robotico: 5 passaggi
Piastrelle per pianoforte che suonano il braccio robotico: 5 passaggi

Video: Piastrelle per pianoforte che suonano il braccio robotico: 5 passaggi

Video: Piastrelle per pianoforte che suonano il braccio robotico: 5 passaggi
Video: Che fortuna 2024, Dicembre
Anonim
Piastrelle per pianoforte che suonano un braccio robotico
Piastrelle per pianoforte che suonano un braccio robotico

Il gruppo è composto da 2 Automation Engineer di UCN, che hanno avuto un'idea brillante che siamo motivati a realizzare e sviluppare. L'idea si basa su una scheda Arduino che controlla un braccio robotico. La scheda Arduino è il cervello dell'operazione e quindi l'attuatore dell'operazione, il braccio robotico, farà ciò di cui ha bisogno. La spiegazione più approfondita verrà in seguito.

Passaggio 1: attrezzatura

Attrezzatura
Attrezzatura

Braccio robotico:

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

Software per il robot- https://www.arduino.cc/en/Main/OldSoftwareRelease… Telecamera rilevamento colore:

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

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

Passaggio 2: configurazione di Arduino

Configurazione Arduino
Configurazione Arduino

Puoi vedere la configurazione sulla scheda qui, che è molto semplice.

Sulla sinistra c'è l'alimentatore.

Quello centrale è per il primo servo, che viene poi collegato agli altri servi, servo per servo.

Quello in basso è dove controlliamo la scheda da un PC o laptop, che ha un ingresso USB dall'altra parte.

Passaggio 3: programma finale

||| PROGRAMMA |||

#includere

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

#define POSECOUNT 5

BioloidController bioloid = BioloidController(1000000);

const int SERVOCOUNT = 5; int id; posizione int; IDCheck booleano; RunCheck booleano;

void setup(){ pinMode(0, OUTPUT); ax12SetRegister2(1, 32, 50);//imposta il numero di giunto 1 registro 32 alla velocità 50. ax12SetRegister2(2, 32, 50);//imposta il numero di giunto 2 registro 32 alla velocità 50. ax12SetRegister2(3, 32, 50);//imposta il numero di giunto 3 registro 32 alla velocità 50. ax12SetRegister2(4, 32, 50);//imposta il numero di giunto 4 registro 32 alla velocità 50. ax12SetRegister2(5, 32, 100);//imposta il registro numero 5 di giunto 32 alla velocità 100. //inizializza le variabili id = 1; posizione = 0; IDCheck = 1; RunCheck = 0; //apri la porta seriale Serial.begin(9600); ritardo (500); Serial.println("###########################"); Serial.println("Comunicazione seriale stabilita.");

//Controlla la tensione della batteria Lipo CheckVoltage();

//Scansione servi, ritorno posizione MoveTest(); SpostaCasa(); MenuOpzioni(); RunCheck = 1; }

void loop(){ // legge il sensore: int inByte = Serial.read();

switch (in Byte) {

caso '1': MovePose1(); rottura;

caso '2': MovePose2(); rottura; caso '3': MovePose3(); rottura;

caso '4': MovePose4(); rottura;

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

caso '7': LEDTest(); rottura;

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

void CheckVoltage(){ // attendere, quindi controllare la tensione (sicurezza LiPO) float voltage = (ax12GetRegister (1, AX_PRESENT_VOLTAGE, 1)) / 10.0; Serial.println("###########################"); Serial.print ("Tensione di sistema: "); Serial.print (tensione); Serial.println (" volt."); if (tensione 10.0){ Serial.println("Livelli di tensione nominali."); } if (RunCheck == 1){ MenuOptions(); } Serial.println("###########################"); }

void MoveHome(){ delay(100); // pausa consigliata bioloid.loadPose(Home); // carica la posa da FLASH, nel buffer nextPose bioloid.readPose(); // legge le posizioni dei servo correnti nel buffer curPose Serial.println("###########################"); Serial.println("Spostare i servi in posizione Home"); Serial.println("###########################"); ritardo(1000); bioloid.interpolateSetup(1000); // imposta l'interpolazione dalla corrente->prossima oltre 1/2 secondo while(bioloid.interpolating > 0){ // fallo finché non abbiamo raggiunto la nostra nuova posa bioloid.interpolateStep(); // sposta i servi, se necessario. ritardo (3); } if (RunCheck == 1){ MenuOptions(); } }

void MovePose1(){ delay(100); // pausa consigliata bioloid.loadPose(Pose1); // carica la posa da FLASH, nel buffer nextPose bioloid.readPose(); // legge le posizioni dei servo correnti nel buffer curPose Serial.println("###########################"); Serial.println("Spostare i servi in prima posizione"); Serial.println("###########################"); ritardo(1000); bioloid.interpolateSetup(1000); // imposta l'interpolazione dalla corrente->prossima oltre 1/2 secondo while(bioloid.interpolating > 0){ // fallo finché non abbiamo raggiunto la nostra nuova posa bioloid.interpolateStep(); // sposta i servi, se necessario. ritardo (3); } ImpostaPosizione(3, 291); //imposta la posizione del giunto 3 su '0' delay(100);//aspetta che il giunto si muova if (RunCheck == 1){ MenuOptions(); } }

void MovePose2(){ delay(100); // pausa consigliata bioloid.loadPose(Pose2); // carica la posa da FLASH, nel buffer nextPose bioloid.readPose(); // legge le posizioni dei servo correnti nel buffer curPose Serial.println("###########################"); Serial.println("Spostare i servi in 2a posizione"); Serial.println("###########################"); ritardo(1000); bioloid.interpolateSetup(1000); // imposta l'interpolazione dalla corrente->prossima oltre 1/2 secondo while(bioloid.interpolating > 0){ // fallo finché non abbiamo raggiunto la nostra nuova posa bioloid.interpolateStep(); // sposta i servi, se necessario. ritardo (3); } ImpostaPosizione(3, 291); //imposta la posizione del giunto 3 su '0' delay(100);//aspetta che il giunto si muova if (RunCheck == 1){ MenuOptions(); } } void MovePose3(){ delay(100); // pausa consigliata bioloid.loadPose(Pose3); // carica la posa da FLASH, nel buffer nextPose bioloid.readPose(); // legge le posizioni dei servo correnti nel buffer curPose Serial.println("###########################"); Serial.println("Spostare i servi in terza posizione"); Serial.println("###########################"); ritardo(1000); bioloid.interpolateSetup(1000); // imposta l'interpolazione dalla corrente->prossima oltre 1/2 secondo while(bioloid.interpolating > 0){ // fallo finché non abbiamo raggiunto la nostra nuova posa bioloid.interpolateStep(); // sposta i servi, se necessario. ritardo (3); } ImpostaPosizione(3, 291); //imposta la posizione del giunto 3 su '0' delay(100);//aspetta che il giunto si muova if (RunCheck == 1){ MenuOptions(); } }

void MovePose4(){ delay(100); // pausa consigliata bioloid.loadPose(Pose4); // carica la posa da FLASH, nel buffer nextPose bioloid.readPose(); // legge le posizioni dei servi correnti nel buffer curPose Serial.println("###########################"); Serial.println("Spostare i servi in 4a posizione"); Serial.println("###########################"); ritardo(1000); bioloid.interpolateSetup(1000); // imposta l'interpolazione dalla corrente->prossima oltre 1/2 secondo while(bioloid.interpolating > 0){ // fallo finché non abbiamo raggiunto la nostra nuova posa bioloid.interpolateStep(); // sposta i servi, se necessario. ritardo (3); } ImpostaPosizione(3, 291); //imposta la posizione del giunto 3 su '0' delay(100);//aspetta che il giunto si muova if (RunCheck == 1){ MenuOptions(); } }

void MoveTest(){ Serial.println("###########################"); Serial.println("Inizializzazione del test del segno di movimento"); Serial.println("###########################"); ritardo (500); ID = 1; posizione = 512; while(id <= SERVOCOUNT){ Serial.print("Moving Servo ID: "); Serial.println(id);

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

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

//itera all'ID servo successivo id = id++;

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

void MenuOptions(){ Serial.println("###########################"); Serial.println("Inserire l'opzione 1-5 per eseguire nuovamente i singoli test."); Serial.println("1) Prima posizione"); Serial.println("2) Seconda posizione"); Serial.println("3) Terza posizione"); Serial.println("4) Quarta posizione"); Serial.println("5) Posizione iniziale"); Serial.println("6) Verifica tensione di sistema"); Serial.println("7) Esegui test LED"); Serial.println("8) Rilassa i servi"); Serial.println("###########################"); }

void RelaxServos(){ id = 1; Serial.println("###########################"); Serial.println("Servizi rilassanti."); Serial.println("###########################"); while(id <= SERVOCOUNT){ Relax(id); id = (id++)%SERVOCOUNT; ritardo(50); } if (RunCheck == 1){ MenuOptions(); } }

void LEDTest(){ id = 1; Serial.println("###########################"); Serial.println("Test LED in esecuzione"); Serial.println("###########################"); while(id <= SERVOCOUNT){ ax12SetRegister(id, 25, 1); Serial.print("LED ACCESO - ID servo: "); Serial.println(id); ritardo (3000); ax12SetRegister(id, 25, 0); Serial.print("LED spento - ID servo: "); Serial.println(id); ritardo (3000); ID = ID++; } if (RunCheck == 1){ MenuOptions(); } }

void Grab(){ SetPosition(5, 800); //imposta la posizione del giunto 1 su '0' delay(100);//aspetta che il giunto si muova

}

Abbiamo basato il nostro programma sul programma PincherTest del produttore con alcune importanti modifiche in caso di posizionamento. Abbiamo usato poses.h affinché il robot avesse le posizioni in memoria. Per prima cosa abbiamo cercato di creare il nostro braccio di gioco con Pixycam in modo che fosse automatico, ma a causa di problemi di luce e schermo piccolo, ciò non è potuto accadere. Il robot ha una posizione iniziale di base, dopo aver caricato il programma, testerà tutti i servi trovati nel robot. Abbiamo impostato le pose per i pulsanti 1-4, quindi sarà facile da ricordare. Sentiti libero di usare il programma.

Passaggio 4: guida video

Passaggio 5: conclusione

In conclusione, il robot è un piccolo progetto divertente per noi e una cosa divertente con cui giocare e sperimentare. Vi incoraggio a provarlo e personalizzarlo pure.

Consigliato: