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:
/*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);
}
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...
ResponderExcluirNa 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.
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).
ExcluirBom, 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).
Este comentário foi removido pelo autor.
ResponderExcluirOlá Pequenos Cientistas,
ResponderExcluirSou 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!
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.
ResponderExcluirBom, 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.