Introduction: Fazendo Uma Grua De Stop-Motion (com Sucata)
Atividade aconteceu em 3 dias no mês de Outubro/2013, Alejandro Messias (do Laboratório Hacker de Campinas) e Antonio Celso (Instrutor SESC/Campinas) coordenaram o Lab.
Bom pessoal o que nos propomos a construir é esse instrumento (que aí é comercial, proprietário e manual):
http://stopmotionmagazine.com/?p=358
http://stopmotionmagazine.com/?cat=16
O desafio é: usando coisas de baixo custo e/ou sucatas construir um aparelho que tenha a mesma funcionalidade que o comercial.
A proposta em geral foi usar uma impressora sucata, e seus próprios motores, e para controlar o Arduíno.
Bom pessoal o que nos propomos a construir é esse instrumento (que aí é comercial, proprietário e manual):
http://stopmotionmagazine.com/?p=358
http://stopmotionmagazine.com/?cat=16
O desafio é: usando coisas de baixo custo e/ou sucatas construir um aparelho que tenha a mesma funcionalidade que o comercial.
A proposta em geral foi usar uma impressora sucata, e seus próprios motores, e para controlar o Arduíno.
Step 1: Material
Pra montagem usamos:
- Impressora 710C;
- Circuito integrado L293D;
- Sensor Ultrassônico HC-SR04;
- ProtoBoard;
- Fonte AT/ATX;
- Fios.
- Impressora 710C;
- Circuito integrado L293D;
- Sensor Ultrassônico HC-SR04;
- ProtoBoard;
- Fonte AT/ATX;
- Fios.
Step 2: Desmontando a Impressora 710C
Desmontando a impressora
Ferramentas:
Torx (T10);
2 chaves de fenda.
Segui esse passos, que está em inglês e sem fotos:
http://www.fixyourownprinter.com/forums/inkjet/13265
1 - Tirar a tampa que dá acesso ao carrinho;
2- Soltar os parafusos Torx;
Agora teremos que destravar a caixa plástica, o esquema é usar duas chaves de fenda, uma na frente e outra atrás, forçando as travas, ai está, puxe a carcaça pro lado, ela deve sair facilmente (acredite ela sai fácil!rere).
Usamos da impressora a estrutura, e os motores, só ligamos o arduíno ao motor do carrinho (motor de corrente contínua), depois faremos testes com motor de passo.
Ferramentas:
Torx (T10);
2 chaves de fenda.
Segui esse passos, que está em inglês e sem fotos:
http://www.fixyourownprinter.com/forums/inkjet/13265
1 - Tirar a tampa que dá acesso ao carrinho;
2- Soltar os parafusos Torx;
Agora teremos que destravar a caixa plástica, o esquema é usar duas chaves de fenda, uma na frente e outra atrás, forçando as travas, ai está, puxe a carcaça pro lado, ela deve sair facilmente (acredite ela sai fácil!rere).
Usamos da impressora a estrutura, e os motores, só ligamos o arduíno ao motor do carrinho (motor de corrente contínua), depois faremos testes com motor de passo.
Step 3: Ligando O Motor CC
Esse é motor que usamos ele tem uma boa potência (movimenta o carrinho dos cartuchos). Ligamos ele ao Arduíno.
Usamos um L293D que é um CI com 4 ponte-H, a ligação foi feita usando o seguinte tutorial:
http://labdegaragem.com/profiles/blogs/tutorial-de-como-utilizar-motor-dc-com-l293d-ponte-h-e-arduino
Esse circuito tem suas portas exatamente iguais ao SN754410ne ( que é muito usado em outras montagens de exemplos do Arduíno).
Usamos um L293D que é um CI com 4 ponte-H, a ligação foi feita usando o seguinte tutorial:
http://labdegaragem.com/profiles/blogs/tutorial-de-como-utilizar-motor-dc-com-l293d-ponte-h-e-arduino
Esse circuito tem suas portas exatamente iguais ao SN754410ne ( que é muito usado em outras montagens de exemplos do Arduíno).
Step 4: Ligando O Sensor De Posição
Usamos o HC-SR04 para saber a posição do carrinho, é bem simples o uso desse componente, essas referências ajudaram:
http://blog.repeatdomiau.com.br/miadas/arduino-com-ultrassom-hcsr04
http://elecfreaks.com/store/download/HC-SR04.pdf
http://blog.repeatdomiau.com.br/miadas/arduino-com-ultrassom-hcsr04
http://elecfreaks.com/store/download/HC-SR04.pdf
Step 5: Referência
http://arduino.cc/en/Tutorial/MotorKnob
http://www.ti.com/lit/ds/symlink/uln2803a.pdf
http://www.stepperworld.com/Tutorials/pgBipolarTutorial.htm
http://www.nmbtc.com/pdf/motors/PM42M048.pdf
http://arduino.cc/en/Tutorial/StepperBipolar
http://homepage.cs.uiowa.edu/~jones/step/example.html
http://www.precisionroller.com/instructions/hp-designjet-printhead-belt-replacement/
http://www.fixyourownprinter.com/forums/inkjet/13265
http://www.ti.com/lit/ds/symlink/uln2803a.pdf
http://www.stepperworld.com/Tutorials/pgBipolarTutorial.htm
http://www.nmbtc.com/pdf/motors/PM42M048.pdf
http://arduino.cc/en/Tutorial/StepperBipolar
http://homepage.cs.uiowa.edu/~jones/step/example.html
http://www.precisionroller.com/instructions/hp-designjet-printhead-belt-replacement/
http://www.fixyourownprinter.com/forums/inkjet/13265
Step 6: O Código-fonte
Grua
/*
This example code is in the public domain.
*/
#define LEFT 9 // Passa o sinal para o L293D (esquerda)
#define RIGHT 10 // Passa o sinal para o L293D (direita)
#define echoPin 13 //Pino 13 recebe o pulso do echo
#define trigPin 12 //Pino 12 envia o pulso para gerar o echo
#define TEMPOS 2
void setup() {
pinMode(LEFT, OUTPUT);
pinMode(RIGHT, OUTPUT);
pinMode(echoPin, INPUT); // define o pino 13 como entrada (recebe)
pinMode(trigPin, OUTPUT); // define o pino 12 como saida (envia)
Serial.begin(9600);
long v = lerDistancia();
Serial.println(v);
mover(250);
v = lerDistancia();
Serial.println(v);
}
void mover(int pos){ // funça que movimento o carrinho
long v = lerDistancia();
while(v > 20000){
v = lerDistancia();
}
int new_pos = pos - v;
Serial.println(new_pos);
if(new_pos < 0){
// Esquerda
Serial.println("Left");
digitalWrite(LEFT, HIGH);
long last = v;
while(true){
long vl = lerDistancia();
Serial.print(":"); Serial.print(
vl); Serial.pr
int("."); Serial.print(vl - last);
if(vl <= pos && vl < 20000){
break;
}
last = vl;
delay(60);
}
digitalWrite(LEFT, LOW);
Serial.println(":");
} else {
// Direita
digitalWrite(RIGHT, HIGH);
Serial.println("Right");
long last = v;
while(true){
long vr = lerDistancia();
Serial.print(":"); Serial.print(vr);Serial.print("."); Serial.print(last - vr);
if(vr >= pos && vr < 20000){
break;
}
last = vr;
delay(60);
}
Serial.println(":");
digitalWrite(RIGHT, LOW);
}
}
long lerDistancia(){
digitalWrite(trigPin, LOW); //seta o pino de trigger com um pulso baixo "LOW"
delayMicroseconds(15); // delay de 15 microssegundos
digitalWrite(trigPin, HIGH); //seta o pino de trigger com pulso alto "HIGH"
delayMicroseconds(10); //delay de 10 microssegundos
digitalWrite(trigPin, LOW); //seta o pino 12 com pulso baixo novamente
long duration = pulseIn(echoPin,HIGH); //pulseInt lê o tempo entre a chamada e o pino entrar em high
long distancia = (duration * 337) / 2000; //Dessa forma temos a nossa precisão em milimetros
//Esse calculo é baseado em s = v . t, lembrando que o tempo vem dobrado
//porque é o tempo de ida e volta do ultrassom
return distancia;
}
void lerDistancia(int tempo){
int it = tempo / TEMPOS;
for(int i=0;i<it;i++){
long t = lerDistancia();
Serial.print("T:");
Serial.print(t);
delay(TEMPOS);
}
}
void loop() {
int red = Serial.parseInt();
if(red){
long v = lerDistancia();
Serial.println(v);
mover(red);
v = lerDistancia();
Serial.println(v);
}
}
/*
This example code is in the public domain.
*/
#define LEFT 9 // Passa o sinal para o L293D (esquerda)
#define RIGHT 10 // Passa o sinal para o L293D (direita)
#define echoPin 13 //Pino 13 recebe o pulso do echo
#define trigPin 12 //Pino 12 envia o pulso para gerar o echo
#define TEMPOS 2
void setup() {
pinMode(LEFT, OUTPUT);
pinMode(RIGHT, OUTPUT);
pinMode(echoPin, INPUT); // define o pino 13 como entrada (recebe)
pinMode(trigPin, OUTPUT); // define o pino 12 como saida (envia)
Serial.begin(9600);
long v = lerDistancia();
Serial.println(v);
mover(250);
v = lerDistancia();
Serial.println(v);
}
void mover(int pos){ // funça que movimento o carrinho
long v = lerDistancia();
while(v > 20000){
v = lerDistancia();
}
int new_pos = pos - v;
Serial.println(new_pos);
if(new_pos < 0){
// Esquerda
Serial.println("Left");
digitalWrite(LEFT, HIGH);
long last = v;
while(true){
long vl = lerDistancia();
Serial.print(":"); Serial.print(
vl); Serial.pr
int("."); Serial.print(vl - last);
if(vl <= pos && vl < 20000){
break;
}
last = vl;
delay(60);
}
digitalWrite(LEFT, LOW);
Serial.println(":");
} else {
// Direita
digitalWrite(RIGHT, HIGH);
Serial.println("Right");
long last = v;
while(true){
long vr = lerDistancia();
Serial.print(":"); Serial.print(vr);Serial.print("."); Serial.print(last - vr);
if(vr >= pos && vr < 20000){
break;
}
last = vr;
delay(60);
}
Serial.println(":");
digitalWrite(RIGHT, LOW);
}
}
long lerDistancia(){
digitalWrite(trigPin, LOW); //seta o pino de trigger com um pulso baixo "LOW"
delayMicroseconds(15); // delay de 15 microssegundos
digitalWrite(trigPin, HIGH); //seta o pino de trigger com pulso alto "HIGH"
delayMicroseconds(10); //delay de 10 microssegundos
digitalWrite(trigPin, LOW); //seta o pino 12 com pulso baixo novamente
long duration = pulseIn(echoPin,HIGH); //pulseInt lê o tempo entre a chamada e o pino entrar em high
long distancia = (duration * 337) / 2000; //Dessa forma temos a nossa precisão em milimetros
//Esse calculo é baseado em s = v . t, lembrando que o tempo vem dobrado
//porque é o tempo de ida e volta do ultrassom
return distancia;
}
void lerDistancia(int tempo){
int it = tempo / TEMPOS;
for(int i=0;i<it;i++){
long t = lerDistancia();
Serial.print("T:");
Serial.print(t);
delay(TEMPOS);
}
}
void loop() {
int red = Serial.parseInt();
if(red){
long v = lerDistancia();
Serial.println(v);
mover(red);
v = lerDistancia();
Serial.println(v);
}
}