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