segunda-feira, 23 de julho de 2012

Simulino - Simulador de Arduino

23/07/2013
Saiu a nova versão do Simulino - 2.0, com  muito mais funcionalidades e com novo design (rsrsrsrs). Além disso, esta nova versão você pode simular o sensor de ultrassom. Ou seja, agora é possível testar o programa do robô antes de construí-lo. Baixar leva alguns segundos e, ainda não testamos todas as funcionalidades mas damos os parabéns a equipe do Blog. Embarcado:
Link para baixar o simulino 2.0:
 http://blogembarcado.blogspot.com.br/2013/06/simulino-v20-biblioteca-para-proteus.html#comment-form

Link para o projeto de sensor de ultrassom:
http://blogembarcado.blogspot.com.br/2013/06/sensor-ultrassonico-v2.html

07/2012
Procurando um emulador de Arduino na Internet encontrei o Simulino - um simulador que utiliza o Proteus para agir como se fosse um Arduino UNO funcionando. Apanhei um pouco mas consegui testar o primeiro código - um programa para rodar um motor de passo bipolar com l298 (sem diodos de proteção). O bom é que não tem risco de queimar o Arduino.
Links para quem se interessar:
http://labdegaragem.com/profiles/blog/show?id=6223006%3ABlogPost%3A116712&commentId=6223006%3AComment%3A119207&xg_source=activity
http://blogembarcado.blogspot.com.br/2012/02/simulino-simulando-arduino.html

Proteus 7.7 Completo:
http://mecatronicadegaragem.blogspot.com.br/2010/09/proteus-77-pro-completo.html

Vídeo do Primeiro Teste com Simulino:
Código fonte utilizado:

/*Exemplo 1: exemplo simples
 *Motor de passo Copal
 * --------------------
 *
 * Programa para acionar um motor de passo proveniente de
 * um drive de disquete de 5'25
 * De acordo com a documentação encontrada, este motor:
 * "[...] motor
 * made by Copal Electronics, with 1.8 degrees per step and 96 ohms
 * per winding, with center taps brought out to separate leads [...]"
 * [http://www.cs.uiowa.edu/~jones/step/example.html]
 *
 * Trata-se de um motor de passo unipolar com 5 fios:
 *
 * - vermelho: alimentação, 5V pareceu-me bem
 * - laranja e preto: bobina 1
 * - marrom e amarelo: bobina 2
 *
 * (cleft) 2005 DojoDave para o K3
 * http://www.0j0.org | http://arduino.berlios.de
 *
 * @author: David Cuartielles
 * @date: 20 Out 2005
 */

int motorPin1 = 8;
int motorPin2 = 9;
int motorPin3 = 10;
int motorPin4 = 11;
int delayTime = 500;

void setup() {
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
}

void loop() {
  digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  delay(delayTime);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  delay(delayTime);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin4, LOW);
  delay(delayTime);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, HIGH);
  delay(delayTime);
}

5 comentários:

  1. Preciso controlar um motor de passo com duas partes distintas: primeiro, o motor procura a posição de uma fenda. Nesta parte, como faço uma programação para o programa procurar a posição da fenda? Tenho um Ultrassom acoplado ao motor, para tanto...
    Na segunda parte da programação, encontrada a fenda, a ideia é apertar uma tecla ('l' por exemplo), o motor varre cerca de 5cm para frente e volta a posição da fenda (projeção de fenda de um espectro luminoso projetado em anteparo). O que quero saber é como fazer dentro da programação um comando que se possa apertar uma tecla e dar o comando para o motor ir para frente?
    Este é meu TCC, e sou o José Neres da Física da PUC-SP.

    ResponderExcluir
    Respostas
    1. Bom vão as minhas sugestões: use um sensor IR para detectar a fenda: o motor gira até o sensor para de refletir (como o exemplo aqui descrito: http://lusorobotica.com/index.php/topic,837.0.html).
      Bom, quanto a apertar uma tecla sugiro esta atividade:
      //Código de controle de motor com teclado
      //inserir variáveis de controle de motor de passo
      char leitura; //define a variável leitura que corresponde a uma letra o teclado
      //definido por char
      void setup() {
      //setup para ligar motor de passo
      Serial.begin(9600);
      }
      void loop() {
      leitura = Serial.read(); // a variável leitura será obtida através do teclado
      if (leitura == 'L') {
      //comando para mandar o motor de passo funcionar
      //delay de tempo ou número de passos
      }
      }
      //fim

      Se precisar mais detalhado me manda a parte de como você controla o passo (se usa o motor knob da biblioteca do Arduino ou se usa o passo manual - tem no blog um post sobre o tema) e, aí eu detalho melhor o programa.
      Acho um gasto meio alto usar um ultrassom pois ele é melhor para detectar objetos, o infravermelho é mais barato (dá pra fazer um reciclado) e fica mais preciso (estado alto e baixo).

      Excluir
  2. Este comentário foi removido pelo autor.

    ResponderExcluir
  3. Olá Pequenos Cientistas,
    Sou o autor do Blog Embarcado e do Simulino.
    Muito obrigado por postar sobre o projeto e, principalmente, por colocar a fonte.
    O projeto ficou meio parado mas vou retomá-lo para publicar novas versões.
    Para ajudar, você pode comentar um pouco sobre quais dificuldades você encontrou, para que possamos melhorar o projeto e torná-lo mais amigável?
    Muito obrigado!

    ResponderExcluir
  4. 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