collapse

* Posts Recentes

O que é isto ? por SerraCabo
[12 de Abril de 2024, 14:20]


Amplificador - Rockboard HA 1 In-Ear por almamater
[11 de Abril de 2024, 20:46]


Emulador NES em ESP32 por dropes
[10 de Abril de 2024, 15:30]


Meu novo robô por josecarlos
[29 de Março de 2024, 18:30]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: Como dividir um código grande na IDE do Arduino  (Lida 7113 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline megamartinelle

  • Mini Robot
  • *
  • Mensagens: 101
Como dividir um código grande na IDE do Arduino
« em: 01 de Abril de 2018, 08:21 »
Pessoal, boa noite! Eu tenho uma duvida bem de iniciante mesmo. Como eu posso dividir meu código em parte na IDE do arduino? Usando novas abas.

Desejo adicionar várias outras posições para meu servo motor, e vou trabalhar com 6 servos motores. Então, teria como eu separar uma aba para ficar dedicada para cada ser motor? Eu tentei fazer isso copiando e colocar e só mudando a variável do objeto do servo motor e não deu certo. Eu fiz assim:

Aba 01 - Controle de Servo Motor 01


#include <Servo.h>

Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards

int pos = 0;    // variable to store the servo position

void setup() {

  Serial.begin (9600);
 
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
 
}

void loop() {
  for (pos = 0; pos <= 90; pos += 1) { // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position

    Serial.println("Servo Motor em 90 graus");
  }

delay(2000); 
   
  for (pos = 90; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position

    Serial.println("Servo Motor em 180 graus");
  }
  for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position

    Serial.println("Servo Motor em 0 graus");
  } 
}


E adicionei logo em seguida uma outra aba com o mesmo código mas mudando o objeto servo. Ficou dessa forma:



Aba 02 - Controle de Servo Motor 02



#include <Servo.h>

Servo myservo1;  // create servo object to control a servo
// twelve servo objects can be created on most boards

int pos = 0;    // variable to store the servo position

void setup() {

  Serial.begin (9600);
 
  myservo1.attach(8);  // attaches the servo on pin 9 to the servo object
 
}

void loop() {
  for (pos = 0; pos <= 90; pos += 1) { // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    myservo1.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position

    Serial.println("Servo Motor em 90 graus");
  }

delay(2000); 
   
  for (pos = 90; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    myservo1.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position

    Serial.println("Servo Motor em 180 graus");
  }
  for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
    myservo1.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position

    Serial.println("Servo Motor em 0 graus");
  } 
}



Quando vou compilar para fazer o teste, ele apresenta esse seguinte erro:


Arduino: 1.8.5 (Windows 7), Placa:"Arduino/Genuino Uno"

Controle_De_ServoMotor02:6: error: redefinition of 'int pos'

 int pos = 0;    // variable to store the servo position

     ^

C:\Users\Bruno Martinelle\Desktop\Teste_de_controle_de_varais_posi__es\Teste_de_controle_de_varais_posi__es.ino:6:5: note: 'int pos' previously defined here

 int pos = 0;    // variable to store the servo position

     ^

C:\Users\Bruno Martinelle\Desktop\Teste_de_controle_de_varais_posi__es\Controle_De_ServoMotor02.ino: In function 'void setup()':

Controle_De_ServoMotor02:8: error: redefinition of 'void setup()'

 void setup() {

      ^

C:\Users\Bruno Martinelle\Desktop\Teste_de_controle_de_varais_posi__es\Teste_de_controle_de_varais_posi__es.ino:8:6: note: 'void setup()' previously defined here

 void setup() {

      ^

C:\Users\Bruno Martinelle\Desktop\Teste_de_controle_de_varais_posi__es\Controle_De_ServoMotor02.ino: In function 'void loop()':

Controle_De_ServoMotor02:16: error: redefinition of 'void loop()'

 void loop() {

      ^

C:\Users\Bruno Martinelle\Desktop\Teste_de_controle_de_varais_posi__es\Teste_de_controle_de_varais_posi__es.ino:16:6: note: 'void loop()' previously defined here

 void loop() {

      ^

exit status 1
redefinition of 'int pos'

Este relatório teria mais informações com
"Mostrar a saida detalhada durante a compilação"
opção pode ser ativada em "Arquivo -> Preferências"
« Última modificação: 01 de Abril de 2018, 08:23 por megamartinelle »

Offline dio123

  • Mini Robot
  • *
  • Mensagens: 1.032
Re: Como dividir um código grande na IDE do Arduino
« Responder #1 em: 01 de Abril de 2018, 09:36 »
Por abas não dá como queres.
O que queres fazer e sub programas, mas  não dá para por por abas.
Abas e para as bibliotecas.

Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.948
  • NERD!
Re: Como dividir um código grande na IDE do Arduino
« Responder #2 em: 01 de Abril de 2018, 09:49 »
Dá para por nas abas sim.senhor. O programa principal tem de.estar.num ficheiro ".ino" com o mesmo nome da pasta onde está guardado. Depois podes criar outros ficheiros ".c", ".h" ou ".cpp" onde defines funções que vão ter de ser chamadas pelo ".ino" principal. Agora não me lembro bem (estou no telemóvel), mas acho que basta estarem na mesma pasta que ao abrir o.projeto o Arduíno abre-os logo todos em abas.

Como disse, agora estou no telemóvel, mas se quiseres mais tarde posso criar um exemplo.

Mas na verdade fica um salgalhada e mais te vale aprender C  e mudar para um IDE a sério.

Offline vasco

  • Mini Robot
  • *
  • Mensagens: 444
Re: Como dividir um código grande na IDE do Arduino
« Responder #3 em: 01 de Abril de 2018, 23:38 »
Para fazer as divisões que queres vais ter que aprender um bocado de c e/ou c++ para além da simples linguagem. O Arduino IDE esconde bastante mas quando se quer fazer coisas mais complexas não há outra saida, tem que se escavar mais fundo.
Pessoalmente nunca me entendi muito bem com o conceito de projetos, quer seja usando vários .c e .h e juntando tudo com um makefile ou usando um IDE que esconde essa complexidade toda. Mas por alguma razão a minha profissão não é programador.
Para já a coisa básica que tens que perceber é que todo o código que fazes vai dar origem apenas a um executável (neste caso um .hex) que é depois carregado para o Arduino.
Ora no mesmo executável só pode haver uma função main() uma função setup(), etc.
A ideia de ter vários ficheiros .c é na compilação criar vários ficheiros .o (object code) que são depois juntos num só executável. Mas as funções definidas em cada .c têm que ter todas um nome diferente.

A situação que queres simplificar não se resolve dividindo o código em vários ficheiros, mas sim escrevendo uma função que tem como parâmetro o objeto que representa cada um dos servos.

Os meus extremamente reduzidos conhecimentos de C++ não me dizem como é que se escreve uma função com um objeto como parâmetro mas é essa a ideia.
Defines à cabeça os vários objetos Servo1, Servo2, etc...
Depois tens uma função xpto que faz o que queres para cada servo
E no loop() tens a chamada da função para cada servo.
Nota1: que vais ter que ver como é que se define a função para aceitar um objeto como parâmetro, se fosse uma variável normal (um int por exemplo) seria assim que se faria.
Nota2: Imagino que os vários servos estejam ligados a pinos diferentes, meti 9, 10 e 11, podes ter isso ligado nostros pinos.

Código: [Seleccione]
#define s1PIN 9
#define s2PIN 10
#define s3PIN 11

Servo myservo1;
Servo myservo2;
Servo myservo3;

void xpto(Servo s) // corrigir definição
{
    int pos;
    for (pos = 0; pos <= 90; pos += 1)
    {
       s.write(pos);
       delay(15);
       Serial.println("Servo Motor em 90 graus");
    }
    // etc... por o resto dos movimentos a seguir
}

setup()
{
    Serial.begin(9600);
    myservo1.attach(s1PIN);
    myservo2.attach(s2PIN);
    myservo3.attach(s3PIN);
}

loop()
{
    xpto(myservo1);
    delay(2000);
    xpto(myservo2);
    delay(2000);
    xpto(myservo3);
    delay(2000);
}
« Última modificação: 01 de Abril de 2018, 23:53 por vasco »
Stupid men are often capable of things the clever wouldn't dare to contemplate.

Offline megamartinelle

  • Mini Robot
  • *
  • Mensagens: 101
Re: Como dividir um código grande na IDE do Arduino
« Responder #4 em: 02 de Abril de 2018, 06:37 »
Obrigado pelas respostas pessoas!

jm_araujo, poderia enviar o seu exemplo?

Offline megamartinelle

  • Mini Robot
  • *
  • Mensagens: 101
Re: Como dividir um código grande na IDE do Arduino
« Responder #5 em: 02 de Abril de 2018, 06:44 »
Olá @vasco, tudo bom? Eu estou ciente que a IDE do arduino esconde muito de toda a complexidade de um código. Estou estudando no momento C# e em C# com código grande eu coloco algumas partes em janelas, para deixar tudo mais organizado. Porém na IDE do arduino não se tem como aplicar esse mesmo conceito como no C#.

C/C++ irei estudar logo depois de já ter uma boa base em C#. Espero conseguir resolver esse problema por enquanto na IDE do arduino. Mas obrigado pela resposta!

Offline vasco

  • Mini Robot
  • *
  • Mensagens: 444
Re: Como dividir um código grande na IDE do Arduino
« Responder #6 em: 02 de Abril de 2018, 09:13 »
C/C++ irei estudar logo depois de já ter uma boa base em C#. Espero conseguir resolver esse problema por enquanto na IDE do arduino. Mas obrigado pela resposta!

Tudo o que sei de C# aprendi agora na wikipedia ;-)
Tenho algumas duvidas que seja o melhor caminho para aprender a programar um MCU, mas tem que se começar por algum lado. No entanto, julgo que não é separando o código em vários tabs que vais simplificar o programa.

boa sorte...
Stupid men are often capable of things the clever wouldn't dare to contemplate.

Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.948
  • NERD!
Re: Como dividir um código grande na IDE do Arduino
« Responder #7 em: 02 de Abril de 2018, 12:11 »
jm_araujo, poderia enviar o seu exemplo?

Junto envio o Blink (exemplo de origem) partido às postas.


Internamente os ficheiros são depois todos juntos. Primeiro o com o nome do projeto, e depois os outros por ordem alfabética. As variáveis globais devem ser adicionadas na aba com o nome do projeto, senão podem não ser vistas pelas outras abas por causa dessa concatenação.


Offline megamartinelle

  • Mini Robot
  • *
  • Mensagens: 101
Re: Como dividir um código grande na IDE do Arduino
« Responder #8 em: 05 de Abril de 2018, 16:52 »
Muito obrigado jm_araujo! Me ajudou muito. Conseguir entender todo o principio do que você quis me dizer. Obrigado mesmo!