Simulino: simulando Arduino

Vamos simular o Arduino?

Essa ideia não é nova, existem vários tutoriais por aí de como utilizar o Proteus ISIS para simular um Arduino, mas aqui vai um projeto mais organizado, com aparência e funcionalidade mais fiéis possíveis às queridas plaquinhas.
O apelido proposto para esse projeto é o "Simulino".

Simulino Uno no Proteus ISIS

O primeiro projeto é baseado no Arduino Uno R3, e tentei deixar com a mesma "cara" da placa, como mostra a figura acima.
No pacote de download, está disponível uma demostração simples, utilizando um LCD, teclas, LEDs e um terminal serial.


Para testar esta demostração, apenas abra o arquivo "SimulinoUno_Demo.DSN" e selecionar "PLAY".
Enviem suas alterações e melhorias! Espero que isso ajude os iniciantes, principalmente quando temos dificuldades de conseguir componentes para testar junto com nossos Arduinos.

8 comentários:

  1. Nota 10. Excelente Projeto !!!

    ResponderExcluir
  2. Obrigado Romulo!
    Está conseguindo utilizar facilmente?
    Logo liberaremos a versão 0.0002.
    Um abraço!

    ResponderExcluir
  3. Em primeiro lugar, parabéns pelo trabalho no Simulino. Sem ele, por nossos problemas de material, não poderíamos testar nossos programas (sketchs) do Arduino e obter o bom resultado no Torneio Juvenil de Robótica.
    Bom, em relação as melhorias, a primeira coisa que observamos foi que, quando usamos motores, o programa trava por conta dos transientes. Mesmo instalando filtros com capacitores e diodos e, mesmo assim trava.
    Outro problema: dependendo do número de saídas digitais que você usa, o Simulino não funciona. Mais de 6 portas digitais ao mesmo tempo, mais as entradas analógicas, algumas das portas não funcionam. A impressão que dá é que o sistema está limitado a 8 entradas no máximo funcionando junto.
    O último problema refere-se ao uso de funções: no programa quando usamos funções o Simulino não fuciona. Um exemplo de sketch que não funciona seria esse:
    // Comando de motores usando ponte H
    // ————————————————————————— Motores
    int motor_esquerdo[] = {2, 3}; //pinos do motor1
    int motor_direito[] = {7, 8}; //pinos do motor2
    //-------------------------------------------- sensores
    int IR1 = 0;
    int IR2 = 1;
    int IR3 = 2;
    int IR4 = 3;
    int IR5 = 4;
    int IR6 = 5;
    // ————————————————————————— Setup
    void setup() {
    Serial.begin(9600);
    // Seleciona motores
    int i;
    for(i = 0; i < 2; i++){
    pinMode(motor_esquerdo[i], OUTPUT);
    pinMode(motor_direito[i], OUTPUT);
    //seleciona sensores na porta analógica
    pinMode(IR1, INPUT);
    pinMode(IR2, INPUT);
    pinMode(IR3, INPUT);
    pinMode(IR4, INPUT);
    pinMode(IR5, INPUT);
    pinMode(IR6, INPUT);
    }
    }
    // ————————————————————————— Loop
    void loop() {
    // le o estado do botao
    IR1 = analogRead(IR1);
    // verifica se botao foi pressionado
    if (IR1 <= 400) {
    // se sim, acende o LED
    motor_re();
    }
    if (IR2 >= 400) {
    motor_frente();
    }
    if (IR3 >= 400) {
    motor_parar();
    vire_esquerda();
    delay (200);
    motor_frente();
    }
    if (IR4 >= 400) {
    motor_parar();
    vire_direita();
    delay (200);
    motor_frente();
    }
    if (IR5 >= 400) {
    motor_emergencia();
    motor_frente();
    }
    }
    // ————————————————————————— Drive do motor: coordena as funções de parada, frente, direita e esquerda
    void motor_parar(){
    digitalWrite(motor_esquerdo[0], LOW);
    digitalWrite(motor_esquerdo[1], LOW);
    digitalWrite(motor_direito[0], LOW);
    digitalWrite(motor_direito[1], LOW);
    delay(25);
    }
    void motor_frente(){
    digitalWrite(motor_esquerdo[0], HIGH);
    digitalWrite(motor_esquerdo[1], LOW);
    digitalWrite(motor_direito[0], HIGH);
    digitalWrite(motor_direito[1], LOW);
    }
    void motor_re(){
    digitalWrite(motor_esquerdo[0], LOW);
    digitalWrite(motor_esquerdo[1], HIGH);
    digitalWrite(motor_direito[0], LOW);
    digitalWrite(motor_direito[1], HIGH);
    }
    void vire_esquerda(){
    digitalWrite(motor_esquerdo[0], LOW);
    digitalWrite(motor_esquerdo[1], HIGH);
    digitalWrite(motor_direito[0], HIGH);
    digitalWrite(motor_direito[1], LOW);
    }
    void vire_direita(){
    digitalWrite(motor_esquerdo[0], HIGH);
    digitalWrite(motor_esquerdo[1], LOW);
    digitalWrite(motor_direito[0], LOW);
    digitalWrite(motor_direito[1], HIGH);
    }
    void motor_emergencia(){
    digitalWrite(motor_esquerdo[0], HIGH);
    digitalWrite(motor_esquerdo[1], LOW);
    digitalWrite(motor_direito[0], LOW);
    digitalWrite(motor_direito[1], LOW);
    }

    Como sugestão para melhoria acho interessante um Simulino que use 2 arduinos> tenho notado alguns colegas fazendo comunicação entre arduinos e usando 2 e, montaremos um novo robô que usará 2 arduinos - 1 para sensores e outro para motores.
    Outra sugestão é um simulino que consiga simular o funcionamento de sensores IR e de ultrassom. Tive que adaptar para conseguir simular a situação.
    Bom, fora isso, usar o Simulino foi muto fácil e, espero em breve, formar uma equipe de alunos com autonomia para desenvolver projetos baseados nele. Por enquanto eu faço os testes e passo os resultados para os alunos.
    Logo que terminar as versões nos avise para testarmos, apesar do nosso foco ser robôs de competição talvez possamos ajudar com informações.

    ResponderExcluir
  4. Preciso da sua ajuda. Estou tentando emular um sensor de ultrassom no simulino mas não estou conseguindo. Segui as orientações do circuito deste site : http://www.micro-examples.com/public/microex-navig/doc/090-ultrasonic-ranger.html e este vídeo mostra a montagem e execução, usando este código:
    /* Código adaptado do sensor PING */

    // configura os pinos de sáida
    const int emissor = 7;
    const int receptor = 8;


    void setup() {
    // initialize serial communication:
    Serial.begin(9600);
    pinMode(emissor, OUTPUT);
    pinMode(receptor, INPUT);

    }

    void loop()
    {
    // establish variables for duration of the ping,
    // and the distance result in inches and centimeters:
    long duration, cm;

    // The PING))) is triggered by a HIGH pulse of 2 or more microseconds.
    // Give a short LOW pulse beforehand to ensure a clean HIGH pulse:

    digitalWrite(emissor, LOW);
    delayMicroseconds(2);
    digitalWrite(emissor, HIGH);
    delayMicroseconds(5);
    digitalWrite(emissor, LOW);
    //o receptor faz a leitura do estado do pino e se retorna HIGH ele informa
    duration = pulseIn(receptor, HIGH);
    cm = duration/58;//converte o valor do sensor1 em cm


    Serial.print(cm);
    Serial.println("cm");
    delay(100);


    }

    O vídeo da execução no simulino está aqui:
    http://www.youtube.com/watch?v=iqRuHhJ0X-k&feature=youtu.be

    ResponderExcluir
  5. Nao consigo usar da mensagem de erro e não carrega

    ResponderExcluir
  6. Do not analog pins work?

    I tested this simple sketch

    int analogpin = A1;
    int val = 0;
    void setup() {
    // put your setup code here, to run once:
    Serial.begin(9600);
    }

    void loop() {
    // put your main code here, to run repeatedly:
    val = analogRead (analogpin);
    Serial.println(val);

    }

    but it read 1023 for all value of input voltage

    ResponderExcluir
    Respostas
    1. Hello Mauro, how are you?
      What version of the Simulino did you use in your project?
      If you prefer, send to us your project. We can help you with debug this issue.
      Thanks. Regards.
      Daniel.

      Excluir
  7. quando vai sair novas versoes do simulino?

    ResponderExcluir