Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //------------------------------------------------CONFIGURAÇOES INICIAIS------------------------------------------------
- #include <VarSpeedServo.h>
- #include <Ultrasonic.h>
- #include <Stepper.h>
- // CONFIGURAÇÃO ULTRASÔNICO
- #define pino_trigger 35
- #define pino_echo 34
- Ultrasonic ultrasonic(pino_trigger, pino_echo);
- // CONFIGURAÇAO STEPPER
- const int stepsPerRevolution = 500;
- Stepper myStepper(stepsPerRevolution,9,10,11,12);
- // CONFIGURAÇÃO SERVOS
- VarSpeedServo garra;
- VarSpeedServo base;
- VarSpeedServo frente;
- VarSpeedServo altura;
- const int basePin2 = 2;
- const int frentePin3 = 3;
- const int alturaPin7 = 7;
- const int garraPin8 = 8;
- struct ControleServo{
- int posicaoAtual;
- int posicaoInicial;
- int maximo;
- int minimo;
- };
- struct ControleUltrasonico{
- float posicaoAtual;
- float minimo;
- float maximo;
- };
- ControleUltrasonico ultrasonico ={3.5,3.5,15.2};
- ControleServo servoGarra ={15,15,20,2}; // Minimo e maximo definidos
- ControleServo servoBase ={120,120,140,0}; // Minimo e maximo nao definidos
- ControleServo servoAltura={120,120,150,30}; // Não foi definido o minimo e o máximo
- ControleServo servoFrente={110,110,20,150}; // Não foi definido o minimo e o máximo
- // FALTA CONTROLAR OS SERVOS PARA LIMITAR PARA SE MOVER AO MAXIMO E MINIMO , QUESTAO DE SEGURANÇA
- struct ControleCiclo{
- int X1;
- int Y1;
- int Z1;
- int X2;
- int Y2;
- int Z2;
- int X3;
- int Y3;
- int Z3;
- int X4;
- int Y4;
- int Z4;
- int tamanho; // Número de passos do Ciclo incluem passos de abrir garra e fechar garra
- };
- ControleCiclo ciclo1 ={120,40,30,0,0,0,0,0,0,0,0,0};
- char mydata = 0;
- bool direcao;
- unsigned long timeini,timefim;
- //------------------------------------------------SETUP------------------------------------------------
- void setup() {
- // initialize the digital pin as an output.
- myStepper.setSpeed(40);
- base.attach(basePin2);
- frente.attach(frentePin3);
- altura.attach(alturaPin7);
- garra.attach(garraPin8);
- altura.write(servoAltura.posicaoInicial,10);
- base.write(servoBase.posicaoInicial,10);
- garra.write(servoGarra.posicaoInicial,10);
- Serial.begin(9600);
- delay(500);
- }
- //-------------------------------------------FUNÇÕES UTILIZADAS NO LOOP-------------------------------
- //***********************************FUNÇÃO PARA LER PORTA SERIAL****************************************
- String leStringSerial() {
- String conteudo = "";
- char caractere;
- // Enquanto receber algo pela serial
- while (Serial.available() > 0) {
- // Lê byte da serial
- caractere = Serial.read();
- // Ignora caractere de quebra de linha
- if (caractere != '\n') {
- // Concatena valores
- conteudo.concat(caractere);
- }
- // Aguarda buffer serial ler próximo caractere
- delay(10);
- }
- return conteudo;
- }
- void leUltrasonico(ControleUltrasonico *ultra){
- long microsec = ultrasonic.timing();
- ultra->posicaoAtual = ultrasonic.convert(microsec, Ultrasonic::CM);
- Serial.print("U");
- Serial.println(ultra->posicaoAtual);
- }
- void escreveSerial(){
- Serial.print("B");
- Serial.println(servoBase.posicaoAtual);
- delay(50);
- Serial.print("G");
- Serial.println(servoGarra.posicaoAtual);
- delay(50);
- Serial.print("A");
- Serial.println(servoAltura.posicaoAtual);
- delay(50);
- Serial.print("F");
- Serial.println(servoFrente.posicaoAtual);
- delay(50);
- Serial.print("U");
- Serial.println(ultrasonico.posicaoAtual);
- }
- void escreveSerialOK(String letrasModoFim,long tempo){
- Serial.print(letrasModoFim);
- Serial.println(tempo);
- }
- //************************************ FUNÇÃO MOVE SERVO PARA O MODO MANUAL ********************************************************
- int moveServo(VarSpeedServo s, int graus, bool dir,ControleServo *servo) {
- if (dir==true){
- s.write(graus+servo->posicaoAtual,10);
- // servoBase.posicaoAtual=servoBase.posicaoAtual+graus;
- servo->posicaoAtual=servo->posicaoAtual+graus;
- }else {
- s.write(servo->posicaoAtual-graus,10); // Move o servo para posição atual mais o definido pela interface em py
- servo->posicaoAtual=servo->posicaoAtual-graus;
- }
- escreveSerial();
- delay(50);
- }
- int moveMotorDePasso(Stepper s,bool dir){
- if (dir==true){
- for(int i=0;i<10;i++){
- s.setSpeed(40);
- s.step(64);
- delay(1);
- // falta atualizar posicão atual to ultrasonico
- }
- }else {
- for(int i=0;i<10;i++){
- s.step(-64);
- s.setSpeed(-40);
- delay(1);
- }
- }
- }
- void moverAutomaticoMotorDePasso(Stepper s,bool dir){
- if(dir==true){
- while(ultrasonico.posicaoAtual<ultrasonico.maximo){
- moveMotorDePasso(myStepper,true);
- leUltrasonico(&ultrasonico);
- }
- // Move para o ponto máximo
- }else{
- // Move para o ponto minimo
- while(ultrasonico.posicaoAtual>ultrasonico.minimo){
- moveMotorDePasso(myStepper,false);
- leUltrasonico(&ultrasonico);
- }
- }
- }
- //********************************** FUNÇÃO PARA MOVER OS SERVOS DE COORDENADAS PREDEFINIDAS PARA OUTRAS - PARA CICLOS E MODO AUTOMÁTICO************
- void MoverCoordenadas(int iniX, int iniY, int iniZ, int fimX,int fimY, int fimZ,ControleServo *sFrente,ControleServo *sBase,ControleServo *sAltura)
- {
- int grauServo; //grau em que o servo deve estar (todos os servos usar esta variavel, um de cada vez)
- int varX = fimX-iniX; //variação entre o ponto inicial e ponto final que o servo responsavel em ir para frente e para traz tem
- int varY = fimY-iniY;
- int varZ = fimZ-iniZ;
- int deltaVar=0; // armazena a maior variacao
- // pega a maior variacao para garantir o tempo de execucao do processo
- if(abs(varX)>=abs(varZ))
- {
- deltaVar=abs(varX);
- } else
- {
- deltaVar=abs(varZ);
- }
- if(deltaVar<abs(varY))
- {
- deltaVar=abs(varY);
- }
- // movimentacao dos servos
- for(int i=0; i<deltaVar; i++)
- {
- grauServo = int(iniX+float(i*float(float(varX)/float(deltaVar))));
- frente.write(grauServo);
- grauServo = int(iniY+float(i*float(float(varY)/float(deltaVar))));
- base.write(grauServo);
- grauServo = int(iniZ+float(i*float(float(varZ)/float(deltaVar))));
- altura.write(grauServo);
- delay(15);
- }
- // Atualiza a posição atual de todos servos
- sFrente->posicaoAtual = sFrente->posicaoAtual+(fimX-iniX);
- sBase->posicaoAtual = sBase->posicaoAtual+(fimY-iniY);
- sAltura->posicaoAtual = sAltura->posicaoAtual+(fimZ-iniZ);
- }
- //************************************ FUNÇÃO FECHA/ABRE GARRA PARA MODO CICLOS ********************************************************
- void FechaAbreGarra(VarSpeedServo g,ControleServo *sGarra,bool dir){
- if (dir == false){
- g.write(sGarra->maximo,10);
- sGarra->posicaoAtual = sGarra->minimo;
- }else{
- //int graus1 =sGarra->posicaoAtual - sGarra->minimo;
- g.write(sGarra->minimo,10);
- sGarra->posicaoAtual=sGarra->minimo;
- }
- }
- void MoveCiclo1(){
- // BASE -> QUANTO MENOR,MAIS PRO LADO DA ESTEIRA
- // ALTURA -> QUANTO MAIOR, MAIS PRA BAIXO VAI
- // FRENTE -> QUANTO MENOR, MAIS PRA FRENTE VAI
- MoverCoordenadas(servoFrente.posicaoAtual,servoBase.posicaoAtual,servoAltura.posicaoAtual,ciclo1.X1,ciclo1.Y1,ciclo1.Z1,&servoFrente,&servoBase,&servoAltura);
- escreveSerial();
- delay(100);
- // MoverCoordenadas(servoFrente.posicaoAtual,servoBase.posicaoAtual,servoAltura.posicaoAtual,ciclo1.X2,ciclo1.Y2,ciclo1.Z2,&servoFrente,&servoBase,&servoAltura);
- // delay(100);
- FechaAbreGarra(garra,&servoGarra,true); // Fecha a gara
- escreveSerial();
- delay(100);
- FechaAbreGarra(garra,&servoGarra,false);
- escreveSerial();
- // MoverCoordenadas(servoFrente.posicaoAtual,servoBase.posicaoAtual,servoAltura.posicaoAtual,servoFrente.posicaoInicial,servoBase.posicaoAtual,servoAltura.posicaoAtual,&servoFrente,&servoBase,&servoAltura);
- // delay(100);
- // FechaAbreGarra(garra,&servoGarra,0); // Abre a garra
- }
- void MoveCiclo2(){
- // BASE -> QUANTO MENOR,MAIS PRO LADO DA ESTEIRA
- // ALTURA -> QUANTO MAIOR, MAIS PRA BAIXO VAI
- // FRENTE -> QUANTO MENOR, MAIS PRA FRENTE VAI
- MoverCoordenadas(servoFrente.posicaoAtual,servoBase.posicaoAtual,servoAltura.posicaoAtual,ciclo1.X1,ciclo1.Y1,ciclo1.Z1,&servoFrente,&servoBase,&servoAltura);
- escreveSerial();
- delay(100);
- // MoverCoordenadas(servoFrente.posicaoAtual,servoBase.posicaoAtual,servoAltura.posicaoAtual,ciclo1.X2,ciclo1.Y2,ciclo1.Z2,&servoFrente,&servoBase,&servoAltura);
- // delay(100);
- FechaAbreGarra(garra,&servoGarra,true); // Fecha a gara
- escreveSerial();
- delay(100);
- FechaAbreGarra(garra,&servoGarra,false);
- escreveSerial();
- // MoverCoordenadas(servoFrente.posicaoAtual,servoBase.posicaoAtual,servoAltura.posicaoAtual,servoFrente.posicaoInicial,servoBase.posicaoAtual,servoAltura.posicaoAtual,&servoFrente,&servoBase,&servoAltura);
- // delay(100);
- // FechaAbreGarra(garra,&servoGarra,0); // Abre a garra
- }
- void MoveCiclo3(){
- // BASE -> QUANTO MENOR,MAIS PRO LADO DA ESTEIRA
- // ALTURA -> QUANTO MAIOR, MAIS PRA BAIXO VAI
- // FRENTE -> QUANTO MENOR, MAIS PRA FRENTE VAI
- MoverCoordenadas(servoFrente.posicaoAtual,servoBase.posicaoAtual,servoAltura.posicaoAtual,ciclo1.X1,ciclo1.Y1,ciclo1.Z1,&servoFrente,&servoBase,&servoAltura);
- escreveSerial();
- delay(100);
- // MoverCoordenadas(servoFrente.posicaoAtual,servoBase.posicaoAtual,servoAltura.posicaoAtual,ciclo1.X2,ciclo1.Y2,ciclo1.Z2,&servoFrente,&servoBase,&servoAltura);
- // delay(100);
- FechaAbreGarra(garra,&servoGarra,true); // Fecha a gara
- escreveSerial();
- delay(100);
- FechaAbreGarra(garra,&servoGarra,false);
- escreveSerial();
- // MoverCoordenadas(servoFrente.posicaoAtual,servoBase.posicaoAtual,servoAltura.posicaoAtual,servoFrente.posicaoInicial,servoBase.posicaoAtual,servoAltura.posicaoAtual,&servoFrente,&servoBase,&servoAltura);
- // delay(100);
- // FechaAbreGarra(garra,&servoGarra,0); // Abre a garra
- }
- void MoveCiclo4(){
- // BASE -> QUANTO MENOR,MAIS PRO LADO DA ESTEIRA
- // ALTURA -> QUANTO MAIOR, MAIS PRA BAIXO VAI
- // FRENTE -> QUANTO MENOR, MAIS PRA FRENTE VAI
- MoverCoordenadas(servoFrente.posicaoAtual,servoBase.posicaoAtual,servoAltura.posicaoAtual,ciclo1.X1,ciclo1.Y1,ciclo1.Z1,&servoFrente,&servoBase,&servoAltura);
- escreveSerial();
- delay(100);
- // MoverCoordenadas(servoFrente.posicaoAtual,servoBase.posicaoAtual,servoAltura.posicaoAtual,ciclo1.X2,ciclo1.Y2,ciclo1.Z2,&servoFrente,&servoBase,&servoAltura);
- // delay(100);
- FechaAbreGarra(garra,&servoGarra,true); // Fecha a gara
- escreveSerial();
- delay(100);
- FechaAbreGarra(garra,&servoGarra,false);
- escreveSerial();
- // MoverCoordenadas(servoFrente.posicaoAtual,servoBase.posicaoAtual,servoAltura.posicaoAtual,servoFrente.posicaoInicial,servoBase.posicaoAtual,servoAltura.posicaoAtual,&servoFrente,&servoBase,&servoAltura);
- // delay(100);
- // FechaAbreGarra(garra,&servoGarra,0); // Abre a garra
- }
- //------------------------------------------------LOOP--------------------------------------------------------
- void loop(){
- // Vai ler o serial sempre!!!
- String mydata = leStringSerial();
- String mydata1,mydata2;
- String automaticoCil1,automaticoCil2,automaticoCil3,automaticoCil4;
- int graus;
- // Primeiro if : comando de operação mais graus entre 0 e 9
- // Segundo if : comando de operação mais graus a partir de 10
- // Terceiro else: comando de operação para automático mais Ciclos que irão executar no automático
- if(mydata.length()<=5){
- // Subdivide a sstring recebida pelo serial
- mydata1 = mydata.substring(0, 3);
- mydata2 = mydata.substring(3);
- graus = mydata2.toInt();
- }else if(mydata.length() == 6){
- mydata1 = mydata.substring(0,3);
- mydata2 = mydata.substring(3,5);
- graus = mydata2.toInt();
- }else{
- mydata1=mydata.substring(0,1);
- automaticoCil1=mydata.substring(1,3);
- automaticoCil2=mydata.substring(3,5);
- automaticoCil3=mydata.substring(5,7);
- automaticoCil4=mydata.substring(7,9);
- }
- delay(2);
- //------------------------------------------------ MODO MANUAL------------------------------------------------
- //*********************************** MODO MANUAL - M01-M02 - SERVO BASE****************************************
- if (mydata1 == "M00" || mydata1 == "M01" ) {
- if (mydata1 == "M00") {
- direcao = true;
- moveServo(base, graus, direcao,&servoBase);
- } else {
- direcao = false;
- moveServo(base, graus, direcao,&servoBase);
- }
- }
- //*********************************** MODO MANUAL - M10-M11 - SERVO FRENTE****************************************
- if (mydata1 == "M10" || mydata1 == "M11" ) {
- if (mydata1 == "M10") {
- direcao = false;
- moveServo(frente, graus, direcao,&servoFrente);
- } else {
- direcao = true;
- moveServo(frente, graus, direcao,&servoFrente);
- }
- }
- //*********************************** MODO MANUAL - M20-M21 - SERVO ALTURA****************************************
- if (mydata1 == "M20" || mydata1 == "M21" ) {
- if (mydata1 == "M20") {
- direcao = true;
- moveServo(altura, graus, direcao,&servoAltura);
- } else {
- direcao = false;
- moveServo(altura, graus, direcao,&servoAltura);
- }
- }
- //*********************************** MODO MANUAL - M30-M31 - SERVO GARRA****************************************
- // Direção = true Fecha a garra
- // Direção = false Abre a garra
- // Garra 0 graus aberta, 25 fechada
- if (mydata1 == "M30" || mydata1 == "M31" ) {
- if (mydata1 == "M30") {
- // Fecha a garra
- FechaAbreGarra(garra,&servoGarra,true);
- } else {
- FechaAbreGarra(garra,&servoGarra,false);
- }
- }
- //*********************************** MODO MANUAL - M40-M41 - MOTOR DE PASSO ESTEIRA****************************************
- // Preciso atualizar a distancia do pallet enquanto estiver movimentando
- if(mydata1=="M40" || mydata1=="M41"){
- if (mydata1 == "M40"){
- moveMotorDePasso(myStepper,true) ;
- }else{
- moveMotorDePasso(myStepper,false);
- }
- }
- //---------------------------------------------MODO CICLOS---------------------------------------------------------------
- //*********************************************MODO CICLOS - CICLO 1************************************************************
- // PARA EXECUTAR É PRECISO QUE O ROBÔ ESTEJA REPOSICIONADO PARA A ORIGEM, ESTÁ CONDIÇÃO SERÁ TESTADA PELA INTERFACE !!!
- if (mydata1 == "C10"){
- timeini=millis()/1000;
- MoveCiclo1();
- timefim=millis()/1000;
- escreveSerialOK("CK",timefim-timeini);
- delay(5);
- }
- //*********************************************MODO CICLOS - CICLO 2************************************************************
- // PARA EXECUTAR É PRECISO QUE O ROBÔ ESTEJA REPOSICIONADO PARA A ORIGEM, ESTÁ CONDIÇÃO SERÁ TESTADA PELA INTERFACE !!!
- if (mydata1 == "C20"){
- timeini=millis()/1000;
- MoveCiclo2();
- timefim=millis()/1000;
- escreveSerialOK("CK",timefim-timeini);
- delay(5);
- }
- //*********************************************MODO CICLOS - CICLO 3************************************************************
- // PARA EXECUTAR É PRECISO QUE O ROBÔ ESTEJA REPOSICIONADO PARA A ORIGEM, ESTÁ CONDIÇÃO SERÁ TESTADA PELA INTERFACE !!!
- if (mydata1 == "C30"){
- timeini=millis()/1000;
- MoveCiclo3();
- timefim=millis()/1000;
- escreveSerialOK("CK",timefim-timeini);
- delay(50);
- }
- //*********************************************MODO CICLOS - CICLO 4************************************************************
- // PARA EXECUTAR É PRECISO QUE O ROBÔ ESTEJA REPOSICIONADO PARA A ORIGEM, ESTÁ CONDIÇÃO SERÁ TESTADA PELA INTERFACE !!!
- if (mydata1 == "C40"){
- timeini=millis()/1000;
- MoveCiclo4();
- timefim=millis()/1000;
- escreveSerialOK("CK",timefim-timeini);
- delay(5);
- }
- ///-----------------------------------MODO REPOSICIONAR-----------------------------------------------------------
- if (mydata1 == "RE0"){
- garra.write(servoGarra.posicaoInicial,10);
- frente.write(servoFrente.posicaoInicial,10);
- altura.write(servoAltura.posicaoInicial,10);
- base.write(servoBase.posicaoInicial,10);
- moverAutomaticoMotorDePasso(myStepper,false);
- escreveSerialOK('R');
- }
- ///-----------------------------------MODO AUTOMÁTICO-----------------------------------------------------------
- // OS CICLOS QUE ENTRAM NO MODO AUTOMÁTICO SERÁ DE ACORDO COM O COMANDO ENVIADO PELA SERIAL PROVENIENTE DA INTERFACE.
- // É POSSIVEL OPTAR POR QUAIS CICLOS O USUÁRIO DESEJA QUE ENTRE EM AUTOMÁTICO
- // ANTES DE CHAMAR A FUNÇÃO PARA INICIAR O CICLO,DEVE-SE AVANÇAR A ESTEIRA ATÉ O SEU PONTO MÁXIMO.
- // APÓS O TERMÍNO DEVE-SE VOLTAR A ESTEIRA ATÉ O PONTO MÍNIMO
- if (mydata1 == "A"){
- timeini=millis()/1000;
- if(automaticoCil1=="C1"){
- moverAutomaticoMotorDePasso(myStepper,true);
- MoveCiclo1();
- moverAutomaticoMotorDePasso(myStepper,false);
- }
- if(automaticoCil2=="C2"){
- moverAutomaticoMotorDePasso(myStepper,true);
- MoveCiclo2();
- moverAutomaticoMotorDePasso(myStepper,false);
- }
- if(automaticoCil3=="C3"){
- moverAutomaticoMotorDePasso(myStepper,true);
- MoveCiclo3();
- moverAutomaticoMotorDePasso(myStepper,false);
- }
- if(automaticoCil4=="C4"){
- moverAutomaticoMotorDePasso(myStepper,true);
- MoveCiclo4();
- moverAutomaticoMotorDePasso(myStepper,false);
- }
- timefim=millis()/1000;
- escreveSerialOK("AK",timefim-timeini);
- }
- //------------------------------------------- LEITURA ULTRASÔNICO-----------------------------------------------------------
- leUltrasonico(&ultrasonico);
- //-------------------------------------------- ESCREVE SERIAL TODO LOOP-----------------------------------------------------
- escreveSerial();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement