Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos » Arduino y Raspberry Pi
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

25/04/2016 #1


No Puedo Crear Programa De Arduino uno
Que Tal Buenas Tardes Estoy Desarrollando Un Proyecto Para Enrollar Cable...

Tengo 2 Proyectos En Mente Que Por Separado Funcionan Muy Bien Pero Quiero Juntar los En Una Sola Tarjeta De Arduino...

El Primero Es De Control De Velocidad Y Sentido De Un motor DC
El Segundo Es De Aplicación de las interrupciones externas con Arduino

La Respuesta Es Abrir 2 Bits, Uno Para Añadirlo Al Motor Y Controlar El Sentido Y La Velocidad De Motor
El otro es Para La Entrada Del Potencio metro Y Así Dar La Velocidad Al Motor


Pero AL Intentar Abrir Los Bits No Logro Y Que Me Manda Error Y No Logro Crear EL Programa Necesito De Su Ayuda Para Poder Lograrlo ...
25/04/2016 #2

Avatar de Nuyel

con "Abrir 2 Bits" a que te refieres?

PD: no tiene nada que ver pero eso de cada palabra con mayúscula me pesa para leer, no se por que.
25/04/2016 #3


que tal pues... pues mas que nada es añadir 2 bits uno que se dirija a el puente en H junto con uno que ya esta abierto y el otro seria para el potencio metro para regular la inteccidad de giro y el sentido de giro.

Para poder tener los todo en una sola tarjeta de arduino
25/04/2016 #4

Avatar de Scooter

Pues huele a que estás usando delays o bucles vacíos para esperar a que pasen cosas...

Publica el código.
25/04/2016 #5


Pues tengo poco conocimiento en electrónica, pero me interesa desarrollar proyectos...

adjunto el archivo .ino y el proyecto en proteus esperando sirva de algo y e puedan corregir o ayudar lo mas posible
Prueba.zip
bobinador_usando_IRQ.zip
25/04/2016 #6

Avatar de Nuyel

Estas asignaciones son conflictivas
Código:
  attachInterrupt(0, contar, FALLING); // IRQ 0 = pin 2 , saltará a la función " contar "  , cuando la señal " caiga "  ( pase de 1 a 0 ). Lo he puesto así para que hubiese un poco más de variedad :P
  attachInterrupt(1, encender_apagar, RISING); // IRQ 1 = pin3, saltará a la función " encender_apagar" cuando la señal " suba " ( pase de 0 a 1 )
...
  Serial.begin(9600);
el pin 0 = RX y pin 1 = TX, tienes que cambiar de pines tu interrupción si planeas usar el serial.
Además, según la pagina de Arduino para el Arduino UNO solo los pines 2 y 3 son capaces de usar esa interrupción. Por otra parte la sintaxis era attachInterrupt(digitalPinToInterrupt(pin), ISR, mode);

Creo que me confundí por ver números pero por favor agrega el diagrama como imagen o PDF, no uso proteus.
25/04/2016 #7


si es correcto por eso en el pin 2 y 3 es donde se encuentran las interrupciones.

Perdón ya esta el pdf pues como dice en el pdf ya se encuentra una salida en le pin 6 y quiero también agrgar otra salida al pin 6 para que las 2 vayasn ala pin 2 y 7 de el L293D y así poder controlar su giro como en la primer tarjeta arduino.

y a su ves en el pin A2 colocar el potenciometro

Prueba.PDF
27/04/2016 #8

Avatar de Scooter

Un led con una resistencia de 1k no se ve bien mas o menos necesitas 220 Ohm, puede que menos.
Los botones ponlos sin resistencia y entre el pin y negativo, luego activas por software la resistencia interna que es gratis
No me se de memoria el datasheet del L293 pero sin conectar los enable no irá, sin diodos volantes se quemará, el SW1 sobra porque para eso ya tienes el L293, la conexión de Vs y Vss me resulta extraña, lo mismo está bien pero no me cuadra, yo diría que una va a 5V u otra a 12V.

Seguimos sin saber el código, no hay motivo para que una cosa tan sencilla no la pueda hacer un solo arduino.
27/04/2016 #9


Que tal mi amigo si efectivamente en estos días tuve la oportunidad de revisar y corregir el circuito para las simulación y efectivamente encontré esos detalles aun sigo trabajando en eso, disculpa en la especificación de arduino viene que los timers y PWM son en los pares:

Timer0 5 y 6
Timer1 9 y 10
Timer2 3 y 11

En estos tiene que ir conectada la salida a el L293D verdad?

Porque cuando corro la simulación el motor gira y cuando doy en el botón de inicio se detiene, el potencio metro no regula giro, ni velocidad, espero puedan ayudarme ya corregí un poco el circuito se los dejo de nuevo y el codigo
Prueba.PDF

Código:
// contador usando IRQ de Arduino para contar las vueltas de un bobinador

#include <LiquidCrystal.h>
               /* RS, E,  D4, D5,  D6,  D7 */
LiquidCrystal lcd(7,  8,  9, 10,  11,  12);

int variable = 0;  // usadas para el sistema anti-rebote
int variable2 = 0;

unsigned long contadorVueltas = 0; // las que lleva hechas
unsigned long vueltas_a_hacer = 1; // las vueltas que hará, definidas por el usuario
unsigned long numeroMaximoVueltas = 4294967295;  // 2 ^32 , el tamaño máximo de un unsigned long ( del 0 al 4294967295)
int sensibilidad = 20;    // sensibilidad para el contador de vueltas. A menor número, más sensible
int sensibilidad2 = 80; // sensibilidad para el marcha/paro. A menor número, más sensible

int marcha = 0; // el estado del botón marcha/paro
int delay_anti_rebote = 80;

int vueltasHechas = 0;
int piloto = 4;
int luzFinalizado = 5;
int motor = 6;
int sensorContador = 2;
int marchaParo = 3;
int motor2 = 13;
int botonSubirVueltas = A0;
int botonBajarVueltas = A1;
int pote = A2;

int valorpote;
int pwm1;
int pwm2;

void setup()
{
  attachInterrupt(0, contar, FALLING); // IRQ 0 = pin 2 , saltará a la función " contar "  , cuando la señal " caiga "  ( pase de 1 a 0 ). Lo he puesto así para que hubiese un poco más de variedad :P
  attachInterrupt(1, encender_apagar, RISING); // IRQ 1 = pin3, saltará a la función " encender_apagar" cuando la señal " suba " ( pase de 0 a 1 )
  pinMode( sensorContador,INPUT); // IRQ 0 
  pinMode( marchaParo,INPUT); // IRQ 1
  pinMode(motor,OUTPUT);
  pinMode(motor2,OUTPUT);
  pinMode(luzFinalizado,OUTPUT); // cuando llegue a las vueltas indicadas, se pondrá a parpadear
  lcd.begin(16,2);
  Serial.begin(9600);
}


  void loop()
  {
    lcd.setCursor(0,0);
    lcd.print("A hacer: ");
    lcd.setCursor(0,1);
    lcd.print(" Hechas: ");

    lcd.setCursor(10,0);
    lcd.print(vueltas_a_hacer);

    lcd.setCursor(10,1);
    lcd.print(contadorVueltas);
 
        
    int sensor_subir_vueltas = digitalRead(botonSubirVueltas);
    int sensor_bajar_vueltas = digitalRead(botonBajarVueltas);
    
   if(sensor_subir_vueltas == 1)      // incrementamos vueltas
    {
      delay(delay_anti_rebote); // anti-rebote
      int sensor_subir_vueltas = digitalRead(botonSubirVueltas);
       
       if(sensor_subir_vueltas == 1)   
       {
         vueltas_a_hacer++;
       }
    }
    
    if(sensor_bajar_vueltas == 1 && (vueltas_a_hacer  > contadorVueltas)) // decrementamos vueltas 
    {
      delay(delay_anti_rebote);
      int sensor_bajar_vueltas = digitalRead(botonBajarVueltas);
      
        if(sensor_bajar_vueltas == 1 && (vueltas_a_hacer  > contadorVueltas ) && (vueltas_a_hacer > 1))
        {
          vueltas_a_hacer--;
          lcd.setCursor(10,0);
          lcd.print("     ");
        }  
    }

    if(vueltas_a_hacer == contadorVueltas && marcha == 1) // hacemos el efecto de aviso
    {
      vueltasHechas= 1;  // ya se han hecho todas las vueltas
      digitalWrite(motor,LOW); // paramos el motor
      digitalWrite(luzFinalizado,HIGH);
      delay(400);
      digitalWrite(luzFinalizado,LOW);
      delay(400); 
    }
    
    else if(vueltas_a_hacer != contadorVueltas) // limpiamos la variable que avisa que se han hecho las vueltas en caso de que no se hagan, así podremos incrementar el sistema y seguir usándola
    {
     vueltasHechas = 0;
    }
 
 
 
    if(contadorVueltas >= numeroMaximoVueltas)
    {
      Serial.println("Desbordamiento");
    }
    
   if(variable < sensibilidad) // sistema anti-rebote para interrupción del contador de vueltas ( así no hace falta tiempo )
    { 
      variable++; 
    }  
    
    if(variable2 < sensibilidad2) // sisema anti-rebote para la interrupción de marcha/paro
     { 
      variable2++;

    valorpote=analogRead(pote);

    pwm1 = map(valorpote, 0, 1023, 0, 255);
    pwm2 = map(valorpote, 0, 1023, 255, 0);

    analogWrite(motor,pwm1);
    analogWrite(motor2,pwm2);
    }  
  }


//************************************************************************* ISR ***************************************************************************************************************************



void contar()  // esta es la función a la que saltará nuestro Arduino cuando se active la interrupción en el pin 2 de nuestro Arduino
{
  if((variable >= sensibilidad) && (contadorVueltas < numeroMaximoVueltas) && marcha == 1 && vueltasHechas == 0)  
  {
    contadorVueltas++;
    variable = 0;
  }
}


void encender_apagar()  // esta es la función a la que saltará nuestro Arduino cuando se active la interrupción en el pin 3 de nuestro Arduino
{
  if(variable2 >= sensibilidad2)
  {
    if(marcha == 1)
      {
        marcha = 0;
        digitalWrite(motor,LOW);
      } 
    else if(marcha == 0)
      {
        marcha = 1;
        digitalWrite(motor,HIGH);
      }
      
       variable2 = 0;
  }
}
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Buscar más temas sobre:
Lupa Arduino y Raspberry Pi

Cerrar
Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos » Arduino y Raspberry Pi

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.