Cabine de pintura automatizada

Olá Pessoal!!

Peço a ajuda de vocês para tentar encontrar uma solução para um problema que tenho. Porém, vou explicar o projeto e depois o problema que tenho.

O projeto é o seguinte:
Quero montar uma cabine de pintura automatizada aqui em casa. Ela terá uma esteira que comportará 5 suportes e em cada suporte há uma peça encaixada que deve ser pintada.

Forma de como o sistema deve operar:
1 - O sistema é ligado e a esteira começa a se movimentar
2 - um micro switch será acionado pelo suporte que esta preso a esteira. Tal micro, fará com que o motor da esteira seja desligado e tudo fique imóvel.
3 - um sensor infra-vermelho deve ser ativado logo que o sensor da esteira é acionado. Este verifica se há ou não uma peça inserida no suporte. Se houver, ele aciona o sistema de pintura. Caso não exista peça, ele informa ao sistema para que libere o suporte e verifique o próximo.

O motor da esteira será um com voltagem de 220volts e para acioná-lo, usarei um relé de estado sólido ou aquelas placas prontas com relé que se usam no arduino.
A parte do infra-vermelho: Também utilizarei daquelas placas prontas que tem as saídas 5V, GND, OUT e regulagem de distância na prórpia placa.

Eis a dificuldade que tenho: (estou usando o proteus e a simulação do arduino - Também gero os hexa via IDE)
Ao criar o código (já tentei uns 10), coloco por exemplo:

pino 5 - botão de liga/desliga
pino 6 - alimentar Led (simulando como se fosse o rele do motor)
pino 7 - Infra-vermelho com a opção de IF. Se existe peça, fica e inicia a pintura, se não existir, faz a esteira se movimentar.

Coloco o botão de liga/desliga no loop. Daí tenho o 1º problema: O motor até inicia quando aperto o botão. Mas não desliga por nada!!!!
O 2º problema é quando aperto o botão do infra-vermelho, simulando o sinal de que não existe peça a ser pintada. O led do motor fica maluco e não para de piscar.

A rotina completa é +/- assim: Liga a máquina e roda a esteira mesmo que já exista um suporte apertando o micro switch de parada (isso acontecerá, pois a máquina já foi utilizada, por exemplo, o dia de ontem!!!), próximo suporte chega ao micro switch e para a esteira, o Infra-vermelho checa se há ou não peça se sim: mantém o suporte parado na esteira e aciona o motor de passo com os bicos de pintura que irão ligar de forma independnete ao arduino, terminado o processo de pintura, liga a esteira e espera pelo próximo suporte. se não: liga a esteira e espera pelo próximo suporte.

Espero haver explicado de forma clara a situação.

Tenho a alternativa de criar tudo isso com peças de automação. Mas é muito $$$$$$$$ e com o arduino é muito mais em conta, vi projetos na web que o arduino foi utilizado para criar um tiptronic para carro automático!!! Talvez, o meu problema seja bobo.. mas não consigo resolvê-lo :frowning:

Podem me ajudar?!?!?!?

Obrigado,

Godoy

Explicaste tudo isto de forma clara... mas falhaste em explicar qual é o teu problema em concreto.

Bubulindo,

O meu problema esta em escrever o código de sincronia dos sinais do micro switch e do infra-vermelho. Dá conflito e o led que simula o motor fica louco e não para de piscar. Ambos os códigos (do micro e do infra) mandam sinais ao mesmo tempo para o motor. onde um diz para desligar e o outro diz para ligar. Por isso não para de piscar!!
Como os códigos que escrevi não servem para nada. Pq de qualquer forma que faço chego ao mesmo problema de pisca-pisca.. Queria a ajuda de vocês para umas dicas de como posso fazer. Que funções devo utilizar ou de que forma devo colocar.

Obrigado!

Acho que te estás a rebaixar demais...

Coloca aqui o código que fizeste e a gente vê o que pode ser melhorado.

Uma coisa que fiquei com dúvidas, as peças que vais pintar são todas iguais?

Bubulindo,

Este é o melhor dos códigos que criei. Talvez, esteja um pouco confuso para que é da área.

O único botão que funciona no momento é o START ( é o que liga o motor). O restante dos botões só servem para fazer com que o led que simula o led do motor pisque sem parar. O botão do infra, sequer dá sinais de vida :~

const int MOTOR = 2; // Pino que ligará o rele
const int botao1 = 3; // micro switch de parada da esteira
const int botao2 = 4; // sensor infra-vermelho
const int led_vermelho = 5; // indica sistema ligado
const int botao_start = 6; // sensor infra-vermelho
const int botao_stop = 7; // sensor infra-vermelho

int estado_1 = 0;
int estado_2 = 0;
int estado_3 = 0;
int estado_4 = 0;

void setup(){
pinMode(MOTOR, OUTPUT);
pinMode(botao1, INPUT);
pinMode(botao2, INPUT);
pinMode(botao_start, INPUT);
pinMode(botao_stop, INPUT);
pinMode(led_vermelho, OUTPUT);
}

void loop(){
estado_1 = digitalRead(botao1);
estado_2 = digitalRead(botao2);
estado_3 = digitalRead(botao_start);
estado_4 = digitalRead(botao_stop);
{
led_(); // chama função led
funcao_parar();
}
}

void funcao_parar() {
if (estado_4 == HIGH) { //botão stop acionado - Para tudo
digitalWrite(MOTOR, LOW); // motor desligado
// entram mais funções para parar todo o que estiver funcionando
}
}

void led_() {
digitalWrite(led_vermelho, HIGH); //liga led vermelho
{
}
start(); //chama função
}

void start() {
if (estado_3 == LOW) { //botão de start do sistema - move esteira
digitalWrite(MOTOR, LOW); // motor desligado
}
else
{
if (estado_1 == HIGH) {
digitalWrite(MOTOR, HIGH); // motor ligado
}{
inicio(); // chama função
}
}
}

void inicio() {
if (estado_1 == HIGH) { //se o micro switch receber sinal - desliga motor esteira
digitalWrite(MOTOR, LOW); // motor desliga
infrared(); // chama função - Esta só deve funcionar se o motor for parado pelo micro switch
}
else
{
if (estado_1 == LOW) { // se o micro switch estiver sem ação alguma - o motor permanece ligado
digitalWrite(MOTOR, HIGH); // motor ligado
}
}
}

void infrared() { // função do infra-vermelho
if (estado_2 == HIGH) { // se há sinal do infra-vermelho (detectou peça no suporte), inicia pintura e chama função do motor de pintura
digitalWrite(MOTOR, LOW); // esteira permanece com motor desligado - acho que este não precisa!!!!
}
else
{
if (estado_2 == LOW) {
digitalWrite(MOTOR, HIGH); // não há peça no suporte, esteira liga e chama próximo suporte
}
}
}

As peças serão sempre iguais!!!!

É um milagre que isto liga luzes...

O primeiro passo para se conseguir programar seja o que for é fazer um esquema de como vai funcionar e definir as entradas e saídas. No teu caso, as entradas e saídas não condizem com a definicão... Isso é um problema.
O outro problema é que os teus nomes das variáveis são extremamente confusos. Lá porque estás a simular, não deves colocar botão x ou y, mas o nome da variável relativa ao sistema final...
Apesar do meu tom, aceita isto de forma construtiva, pois ajuda imenso quando precisas de fazer o resto do programa.

Deixa-me dar uma vista de olhos ao programa e meto aqui algo que deve funcionar (mais ou menos)...

Algo assim deve funcionar melhor...

const int MOTOR = 2; // Pino que ligará o rele
const int _sensorparagem = 3; // micro switch de parada da esteira
const int _sensorIV = 4; // sensor infra-vermelho
const int OnStatus = 5; // indica sistema ligado
const int _botao_start = 6; // Botão que liga todo o sistema... 
const int _botao_stop = 7; // sensor infra-vermelho
const int Motor = 8;
const int Pintura = 9; 

unsigned char SensorParagem = 0;
unsigned char SensorParagemAnterior = 0;
unsigned char SensorIV = 0;
unsigned char Start  = 0;

unsigned char StopFlag = 0; //usada para parar o motor... 

void setup(){
  pinMode(MOTOR, OUTPUT);
  pinMode(_sensorparagem, INPUT_PULLUP);
  pinMode(_sensorIV, INPUT_PULLUP);
  pinMode(_botao_start, INPUT_PULLUP);
  pinMode(_botao_stop, INPUT_PULLUP);
  pinMode(OnStatus, OUTPUT);
}

void loop(){

//Lê entradas 
  SensorParagem = digitalRead(_sensorparagem);
  SensorIV = digitalRead(_sensorIV);
  Start = digitalRead(_botao_start);
  //Stop = digitalRead(_botao_stop);

if (Start == LOW) { // para comecar o sistema, tens de colocar o botão em low (nota que a entrada tem o pullup activado. 
//inicia o ciclo. 
  digitalWrite(Motor, HIGH);
  
  if ((SensorParagemAnterior != SensorParagem) && (SensorParagem == LOW)) { //o switch foi activado
     StopFlag = 1; 
     digitalWrite(Motor, LOW);
     delay(100); //espera um bocado para a esteira parar... 
     if (SensorIV == LOW) { //existe uma peca... 
       digitalWrite(Pintura, HIGH);
       delay(3000); //pinta a peca durante 3 segundos. Isto não é ideal ou correcto... mas funciona por agora. 
       digitalWrite(Pintura, LOW);
     }
     //acabada a pintura... comeca a mexer o tapete. 
     digitalWrite(Motor, HIGH);
     while(digitalRead(_sensorparagem) == LOW);
  }
}  

SensorParagemAnterior = SensorParagem; //para fazer deteccão de flanco. 
}

Eu te disse que não entendia muito da coisa!!! hehehe

Como estou nos primeiros passos do arduino, não sei bem dar nome as coisas ou usar suas funções. Vi que você acabou refazendo praticamente tudo.. Estava ruinzinho mesmo o que havia feito :blush:
Muito obrigado pela ajuda. Te devo uma breja/mini !!

Tentei simular no isis com o HEX gerado pelo IDE. Apenas o botão START funcionou e ligou o motor. Para o restante das funções nada acontece. (segue attachment)

Há alguma outra forma de simular sem ser pelo isis ?

O esquema parece correcto... no entanto, eu não sei como o proteus simula os tempos do Arduino... se o faz em "real time" ou se existe uma opcão de correr mais lento.

Repara que quando o microswitch é activado, ele espera 100 milisegundos para a esteira parar e depois analiza se realmente existe alguma coisa no sensor de infra vermelhos. Se não houver nada, ele liga logo o motor.

Isto infelizmente tem de ser ajustado na instalacão... mas para teste agora, o ideal é aumentar para um intervalo que consigas ver. Tipo isto...

const int MOTOR = 2; // Pino que ligará o rele
const int _sensorparagem = 3; // micro switch de parada da esteira
const int _sensorIV = 4; // sensor infra-vermelho
const int OnStatus = 5; // indica sistema ligado
const int _botao_start = 6; // Botão que liga todo o sistema... 
const int _botao_stop = 7; // sensor infra-vermelho
const int Motor = 8;
const int Pintura = 9; 

unsigned char SensorParagem = 0;
unsigned char SensorParagemAnterior = 0;
unsigned char SensorIV = 0;
unsigned char Start  = 0;

unsigned char StopFlag = 0; //usada para parar o motor... 

void setup(){
  pinMode(MOTOR, OUTPUT);
  pinMode(_sensorparagem, INPUT_PULLUP);
  pinMode(_sensorIV, INPUT_PULLUP);
  pinMode(_botao_start, INPUT_PULLUP);
  pinMode(_botao_stop, INPUT_PULLUP);
  pinMode(OnStatus, OUTPUT);
}

void loop(){

//Lê entradas 
  SensorParagem = digitalRead(_sensorparagem);
  SensorIV = digitalRead(_sensorIV);
  Start = digitalRead(_botao_start);
  //Stop = digitalRead(_botao_stop);

if (Start == LOW) { // para comecar o sistema, tens de colocar o botão em low (nota que a entrada tem o pullup activado. 
//inicia o ciclo. 
  digitalWrite(Motor, HIGH);
  
  if ((SensorParagemAnterior != SensorParagem) && (SensorParagem == LOW)) { //o switch foi activado
     StopFlag = 1; 
     digitalWrite(Motor, LOW);
     delay(5000); //espera um bocado para a esteira parar... Passei de 100 para 5000. Se vires a esteira a parar então é sinal que o programa chegou aqui...  
     if (SensorIV == LOW) { //existe uma peca... 
       digitalWrite(Pintura, HIGH);
       delay(3000); //pinta a peca durante 3 segundos. Isto não é ideal ou correcto... mas funciona por agora. 
       digitalWrite(Pintura, LOW);
     }
     //acabada a pintura... comeca a mexer o tapete. 
     digitalWrite(Motor, HIGH);
     while(digitalRead(_sensorparagem) == LOW);
  }
}  else {
       digitalWrite(Motor, LOW);
}

SensorParagemAnterior = SensorParagem; //para fazer deteccão de flanco. 
}

Também adicionei uma condicão que se o botão de Start não estiver em LOW, o motor fica parado. Então não podes meter um botão momentâneo, mas sim um interruptor.

Nota que fazer simulacões com temporizacões é extremamente dificil... existe uma outra maneira de codificar isto, mas para uma sequência relativamente simples, não é necessário.

Boas Bubulindo!

Depois que você alterou o tempo de 0.1seg para 5seg, pude ver o micro atuando.

O botão on/off ficou bom. Desta forma, posso instalar daquelas botoeiras com botão vermelho e preto... onde o botão preto destrava o vermelho e assim desliga a bagaça! ehhehe

Com que comando posso transformar o STOP em PAUSE ? Se é que isso existe no arduino

Dei vida ao led OnStatus. (pelo menos os led's sei fazer com que funcionem.. XD)

Pq quando se utiliza IF. a primeira ação é LOW e não HIGH ?? Saberia me dizer ?
E agora pude ver que há um IF dentro de outro IF. isso faz com que o IF de 'dentro' seja executado com o IF 'de fora' esperando pela solução ??

O sistema não me chamou o sensor de infra. Passado os 5seg. o motor voltou a funcionar e o led de pintura permaneceu apagado. Descrevi o 'Pintura' em SETUP como
pinMode(Pintura, INPUT_PULLUP);
Na verdade, nem sei se era preciso. Mas continua sem vida!

As instruções para os 2 motores de passo que pretendo utilizar para movimentar o carro da pintura (um será eixo X e o outro Y)... podem entrar no lugar da linha DELAY ?

if (SensorIV == LOW) { //existe uma peca...
digitalWrite(Pintura, HIGH);
delay(10000); //pinta a peca durante 3 segundos. Isto não é ideal ou correcto... mas funciona por agora.
digitalWrite(Pintura, LOW);

Obrigado e me desculpa por te encher de perguntas.

O if olha para o estado low porque é assim que tens ligados os teus botões.

Repara que tu ligas o botão para o GND, correcto? Então ao activar o pull up fazes com que o pino esteja sempre em high, até que alguém carregue no botão e mude o estado para LOW.
Daí que todos os inputs são considerados activos como low e os outputs meti como HIGH.

O caso do sensor IV podia ter sido feito doutra forma... Mas para funcionar tens de activar o botão antes que o delay dos 10 segundos (lembra-te que é apenas para poderes visualizar) acabe. Isto porque eu estou a supôr que quando o tapete parar a peça já activou o sensor. Não tentes sincronizar o final dos 10 segundos para activar o sensor. Alternativamente, podemos fazer um loop durante algum tempo para analisar o sensor. Experimenta como disse... quando vires os 10 segundos a começar, carrega no botão do IV e deixa lá ficar até ele começar o ciclo de pintura.

Sim... a activação do conjunto de pintura terá de ser feito no lugar do delay. Eu hoje posso tentar ver se tenho tempo e alterar o programa para não bloquear (como está a fazer agora) e assim poderes ver como criar delays (que vais precisar para a pintura) sem parar o processamento.

Bubulindo!

Coloquei o item 'Pintura' no setup

pinMode(Pintura, OUTPUT);

E a pintura funcionou! O sensor logo que termina a pintura, já chama o motor de volta!! Só colocar um delay ai e pronto!!! Agora vou fazer a parte dos motores de passo! vamos ver no que vai dar.

Muitíssimo obrigado pela ajuda.. Ainda te devo uma breja/Mini

Abraço,

Godoy

Quando parar pelo Brasil, tomamos uma. :slight_smile:

Os motores de passo serão relativamente simples e podes depois fazer ainda melhor... porque podes contar passos e ter menos problemas com a posicão das pecas. :slight_smile: