Olá amigos do LDG,

Preciso de ajuda, para adaptar um dos códigos abaixo, para que eu possa fazer para e rodar o motor, ate um numero especifico de voltas,no caso, 700 voltas.

Estou usando um encode, um modulo, que esta ligado ao motor.


O Primeiro código, é apenas um contador, que se der para adaptar esse, eu não precisaria mudar os outros abaixo.

Esse código abaixo, ele apresenta apenas no monitor serial, o numero de pulsos, que no meu caso, ( mas vou modificar para apenas um pulso por volta ) são 4 pulsos, se eu puder modificar esse código, para que o motor pare em 700 voltas, ele teria que parar o motor, 2800 pulsos.( sendo 4 pulsos ) é isso que eu preciso fazer, como faze-lo parar, quando o monitor serial apresentar 2800 pulsos?


CODIGO 1 - contador de pulsos

boolean anterior = 0;
boolean actual = 0;
int contador = 0;


void setup()
{
Serial.begin(9600);
pinMode(2,INPUT);
}

boolean debounce(boolean dato_anterior)
{

boolean dato_actual = digitalRead(2);
if (dato_anterior != dato_actual)
{
delay(10);
dato_actual = digitalRead(2);
}
return dato_actual;
}

void loop()
{

actual = debounce(anterior);


if ( anterior == 0 && actual == 1)
{
contador++;

delay (100);
Serial.println(contador);
}

anterior = actual;
}



Esse código abaixo, é do Rui, daqui do fórum, ele foi muito gentil e o fez para mim, mas tenho que acrescentar o relé. O motor vai diminuindo aos poucos a velocidade ate parar, mas tenho duvidas.

Onde conectar o Relé? e testei o código sem o rele, e era para o motor ir diminuindo a velocidade, mas isso não aconteceu,


CODIGO 2 - do Rui com Relé


//Programa: Sensor de velocidade Arduino LM393
//http://www.arduinoecia.com.br/2016/02/sensor-de-velocidade-lm393-ar...
//Autor: Arduino e Cia Modificado por Rui

#define sensor 2 //Pino ligado ao pino D0 do sensor
#define motor 6 //Pino de saída para controle do motor ( nao ligar ditero no motor, use driver)
#define rele 7 //Pino de saída para o rele
volatile byte pulsos = 0;
unsigned int pulsos_por_volta = 63; //Altere o numero abaixo de acordo com o seu disco encoder
unsigned int voltas = 12; //Numero de voltas
unsigned int Fase = 0;
//------------------------------
void contador()
{
pulsos++; //Incrementa contador
}
//------------------------------
void setup()
{
Serial.begin(9600);
pinMode(motor, OUTPUT); //Pino do motor como saida (PWM)
pinMode(rele, OUTPUT); //Pino do rele HIGH desligado LOW ligado
pinMode(sensor, INPUT); //Pino do sensor como entrada
attachInterrupt(0, contador, FALLING); //Interrupcao 0 - pino digital 2 Aciona o contador a cada pulso
}
//------------------------------
void loop()
{
Fase = (pulsos / pulsos_por_volta); //Calculo de voltas
if (Fase >= 6) //Se faltam + q 6 voltas
{
digitalWrite(rele, HIGH); //Libera o motor
analogWrite(motor, 255); //Velocidade máxima
}
if (Fase < 6 & Fase > 3) //Se faltam 6 voltas
{
digitalWrite(rele, HIGH); //Libera o motor
analogWrite(motor, 127); //Reduz Velocidade para 1/2
}
if (Fase < 3) //Se faltam 3 voltas
{
digitalWrite(rele, HIGH); //Libera o motor
analogWrite(motor, 63); //Reduz Velocidade para 1/4
}
if (F
ase = 0) //Se terminaram as voltas
{
digitalWrite(rele, LOW); //Freia o motor
}
}


E Por fim, vem o código 3, que peguei de um tutorial de uma Bobinadora, no tutorial, ele dá poucas explicações,


#include AQUI eu preciso mudar para i2c, isso eu fiz
#include Esse LCDKeypad é um modulo, e eu tenho que trocar por um LCD que ja vem com o i2c, tenho que trocar os nomes? mas esse modulo vem com botões, ai preciso implementar os botões separados, como?

#define MODE_MENU 0 - Aqui o 0 é a porta A0 ? seria um botão?
#define MODE_WIND 1 - Aqui, é mais um botão que eu teria que implementar? como localizar e ele no restante do programa.?

#define PIN_MOTOR 2 - Aqui o A2 é a porta? seria + um botão?
#define PIN_SENSOR 3 - Aqui o A3 + um botão? esse é do ENCODER
#define INTER_SENSOR 1 - E esse, é mais um encoder, pois ele colocou dois, um do lado do outro.

MAS, não adianta aquele amigo daqui, me diga, faça isso ou aquilo, eu preciso que alguem modifique o codigo e me entregue ele pronto, talvez eu saiba modificar, talvez não.

CODIGO 3 - Bobinadora

#include
#include

#define MODE_MENU 0
#define MODE_WIND 1
#define PIN_MOTOR 2
#define PIN_SENSOR 3
#define INTER_SENSOR 1

#define MAX_SPEED 255
#define MIN_SPEED 127
#define SPEED_RANGE (MAX_SPEED - MIN_SPEED)
/** should have been 8 but 3 works ?? **/
#define TICKS_PER_REV 3

LCDKeypad lcd;
int numberOfWindings = 100;
int windingsLeft = 0;
int decimal = 1;
int ticks = 0;
char speed = 125;

int mode = MODE_MENU;


/**
* react on coil revolution
*/
void pinChangeInt() {
if (mode == MODE_WIND) {
ticks++;
if (ticks == TICKS_PER_REV) {
windingsLeft--;
ticks = 0;
if (windingsLeft == 0) {
lcd.clear();
digitalWrite(PIN_MOTOR, LOW);
mode = MODE_MENU;

speed = 0;
}
}
}
}

/**
* wait until button has been pressed
* returns the button number
*/
int waitButton(){
int buttonPressed;
lcd.blink();

while(lcd.button()!=KEYPAD_NONE); // wait for button release
delay(50);

while((buttonPressed=lcd.button())==KEYPAD_NONE); // wait for button hit
delay(50);
lcd.noBlink();

while(lcd.button()!=KEYPAD_NONE); // and wait until released again
return buttonPressed;
}

/**
* make digits from decimal places
*/
void makeDigits(int number, int *m, int *c, int *x, int *i) {
int a = number;
(*m) = a / 1000;
a = a % 1000;
(*c) = a / 100;
a = a % 100;
(*x) = a / 10;
a = a % 10;
(*i) = a;
}

/**
* fazer uma série de quatro casas decimais
*/
void makeNumber(int *number, int m, int c, int x, int i) {
(*number) = 1000 * m + 100 * c + 10 * x + i;
}

/**
* increment a digit until it's zero
*/
void incDigit(int *x, int max) {
int m = *x;
m ++;
if (m > max) {
m = max;
}
(*x) = m;
}

/**
* decrement a digit until it's zero
*/
void decDigit(int *x) {
int m = *x;
m --;
if (m < 0) {
m = 0;
}
(*x) = m;
}

/**
* increment the number at position "decimals"
*/
void incWindings(int decimals) {
int m, c, x, i;
makeDigits(numberOfWindings, &m, &c, &x, &i);

switch (decimals) {
case 3:
incDigit(&m, 9);
break;
case 2:
incDigit(&c, 9);
break;
case 1:
incDigit(&x, 9);
break;
case 0:
incDigit(&i, 9);
break;
default:
break;
}
makeNumber(&numberOfWindings, m, c, x, i);
}

/**
* decrement the number at position "decimals"
*/
void decWindings(int decimals) {
int m, c, x, i;
makeDigits(numberOfWindings, &m, &c, &x, &i);

switch (decimals) {
case 3:
decDigit(&m);
break;
case 2:
decDigit(&c);
break;
case 1:
decDigit(&x);
break;
case 0:
decDigit(&i);
break;
default:
break;
}
makeNumber(&numberOfWindings, m, c, x, i);
}

/*
* setup the system
*/
void setup() {
// show splash
lcd.begin(16,2);
lcd.clear();
lcd.print("TecDroiD's");
lcd.setCursor(0,1);
lcd.print(" Coil Winder");

// setup sensor pin
pinMode(PIN_SENSOR, INPUT);
attachInterrupt(INTER_SENSOR, pinChangeInt, RISING);

// setup motor pin
pinMode(PIN_MOTOR, OUTPUT);
//analogWrite(PIN_MOTOR,0);
digitalWrite(PIN_MOTOR, LOW);

// delay splash and clear
delay(1000);
lcd.clear();

}

void show_number(int number) {
int m,c,x,i;
makeDigits(number, &m, &c, &x, &i);
lcd.print(m,DEC);
lcd.print(c,DEC);
lcd.print(x,DEC);
lcd.print(i,DEC);

}
/**
* menu para selecionar os enrolamentos da bobina
*/
void loop_menu() {
// int m,c,x,i;
int buttonPressed;

/* show text */
lcd.setCursor(0,0);
lcd.print("Windings: ");

/* show number of windings */
lcd.setCursor(0,1);
show_number(numberOfWindings);
lcd.setCursor(3-decimal,1);
lcd.cursor();

buttonPressed = waitButton();

switch(buttonPressed) {
case KEYPAD_SELECT:
windingsLeft = numberOfWindings;
mode = MODE_WIND;
lcd.clear();
break;
case KEYPAD_LEFT:
incDigit(&decimal, 3);
break;
case KEYPAD_RIGHT:
decDigit(&decimal);
break;

case KEYPAD_UP:
/* number increase */
incWindings(decimal);
break;

case KEYPAD_DOWN:
decWindings(decimal);
break;
default:
break;
}
}

/**
* wind the coil - enrolar a bobina
*/
void loop_wind() {
int buttonPressed;

/* set motor speed */
//analogWrite(PIN_MOTOR, speed);
digitalWrite(PIN_MOTOR,HIGH);

lcd.setCursor(0,0);
lcd.print("Windings: ");
lcd.print(numberOfWindings, DEC);
lcd.setCursor(0,1);
lcd.print("To Do: ");
show_number(windingsLeft);
//lcd.print(windingsLeft, DEC);


buttonPressed = lcd.button();
if (buttonPressed == KEYPAD_SELECT) {
lcd.clear();
digitalWrite(PIN_MOTOR, LOW);
mode = MODE_MENU;
}
}


/**
* Select looping mode
*/
void loop() {
switch(mode) {
case MODE_MENU:
loop_menu();
break;
case MODE_WIND:
loop_wind();
break;
default:
lcd.print("Mode ERROR!? ");
lcd.print(mode, DEC);
break;
}
}


enrolador de bobina automática - Abaixo, tem o link dos arquivos. Esse é o de cima.
por tecdroid , publicada 21 de março de 2016

http://www.thingiverse.com/thing:1431330


Muito obrigado

Exibições: 416

Responder esta

Respostas a este tópico

Oi EC, bom dia.

Primeiramente sugiro que você post estes code na forma de arquivo anexado ao tópico, pois desta forma 

(colando na área de texto), perde formatação, perde caractere, e além do que a pagina do post fica muito

grande e mais difícil de ser lida.  (Você pode modificar a sua pagina inicial postada).

Em segundo lugar, sobre os códigos.

Não analisei ainda nem o primeiro e nem o terceiro, ,mas como você disse, o segundo foi

adaptado por mim.

Sobre suas dúvidas:  

O rele deverá ser ligado no port 7, conforme descrito nas primeiras linhas do code.

 " #define rele 7  //Pino de saída para o rele ".

Você disse que motor não está reduzindo a velocidade nas fases intermediarias até parar.

Então por favor poste um esquema de como todo o seu sistema, (e nomeie os componentes), para que 

possamos ter uma visão melhor do seu sistema.

Rui

 

ok
ok


Mas esta ruim abri o LDG, não sei se é problema do servidor, ou meu
ok


Mas esta ruim abri o LDG, não sei se é problema do servidor, ou meu

RSS

Destaques

Registre-se no
Lab de Garagem
Clicando aqui

Convide um
amigo para fazer
parte

curso gratis de arduino

© 2019   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço