This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm whether you accept or reject these cookies being set.

A cookie will be stored in your browser regardless of choice to prevent you being asked this question again. You will be able to change your cookie settings at any time using the link in the footer.

  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
problemas PWM, y comunicación I2C
#1
Hola muy buenas, me estoy volviendo loco, tengo un sistema "servo" para mover un sensor de 0º a 180º, con un pequeño motor eléctrico. Lo controlo con un  driver l298n alimentado a 12v, pero lo reduzco a 2v con software desde Arduino con el PWM desde la salida 9, la referencia de posición  me la proporciona un potenciómetro solidario con el eje de salida del sistema, bueno cuando controlo el sistema desde el monitor serial conectado directo al arduino todo va bien, le introduzco 90 y busca la posición de 90º, pero el problema comienza cuando conecto conecto el arduino nano como esclavo al arduino uno que realiza la función de maestro, desde el monitor serial mando al maestro, por ejemplo, el 90 el nano lo recibe, pero el motor no se mueve, no sé si es que hay problemas entre la comunicación I2C y el pwm. la librería que utilizo es la  WireData.h.

Éste es el master
Código:
#include <Wire.h>
#include <WireData.h>

int VALOR_INTERNO_2 = 0;   
int INT_DATO;     
String STRING_DATO;
volatile float DATO_FLOAT_1;
void setup()
{
  Wire.begin();
  Serial.begin(9600);

}

void loop()
{

//------------------------------------------------------------
  while  (Serial.available() > 0)
  {
  //************RECEPCIÓN_DATOS_MONITOR_SERIAL******** 
    STRING_DATO =Serial.readStringUntil('\n');
    Serial.println(STRING_DATO );//MMMMMMMMMMMMMMMMMMMMMMMMMM
   
    delay(10); 
  }

  //****************** _TRANSFORMAR_VARIABLES_ ****************
INT_DATO = String(STRING_DATO).toInt();//transforma un String en int.
DATO_FLOAT_1 = atof(STRING_DATO.c_str());//transforma un String en float.
//-----------------------------------------------------------
Wire.beginTransmission(1);
  wireWriteData(DATO_FLOAT_1);
  Wire.endTransmission();
  delay(30);
//Serial.println(DATO_FLOAT_1 );//MMMMMMMMMMMMMMMMMMMMMMMMMM
//------------------------------------------------------------
}

y este es el esclavo
Código:
#include <WireData.h>
//#include <Wire.h>


const int ENTRADA_ANALOGICA = A0; 
int VALOR_SENSOR = 0;       
int VALOR_INTERNO = 0;
int VALOR_INTERNO_2 = 0;   
  String STRING_DATO;
volatile float DATO_RECIBIDO_FLOAT =0.00;
volatile int INT_DATO= 0;
int IN3 = 7;
int IN4 = 8;
int PWM = 9;
int POWER= 0;
void setup()
{
  // initialize serial communications at 9600 bps:
  Serial.begin(9600);
  Wire.begin(1); //Empezamos la comunicación I2C con dirección 4 (dispositivo slave)
  Wire.onReceive(RECIBO_DATO_DEL_MAESTRO); //
  pinMode(IN3,OUTPUT);
  pinMode(IN4,OUTPUT);
  pinMode(PWM,OUTPUT);
}

void loop()
{
/*
  while  (Serial.available() > 0)
  {
  //************RECEPCIÓN_DATOS_MONITOR_SERIAL******** 
    STRING_DATO =Serial.readStringUntil('\n');
    Serial.println(STRING_DATO );//MMMMMMMMMMMMMMMMMMMMMMMMMM
    POWER= 22;
    delay(10); 
  }
  //****************** _TRANSFORMAR_VARIABLES_ ****************
  INT_DATO = String(STRING_DATO).toInt();//transforma un String en int.
//FLOAT_DATO = atof(STRING_DATO.c_str());//transforma un String en float.
//-----------------------------------------------------------
*/
  VALOR_SENSOR = analogRead(ENTRADA_ANALOGICA);
  VALOR_INTERNO = map(VALOR_SENSOR, 0, 1023, 0, 255);//VALOR_INTERNO_2 
  VALOR_INTERNO_2 = map(VALOR_INTERNO, 0, 230, 0, 180);//VALOR_INTERNO_2   
  delay(1);


  Serial.print("\tVALOR_INTERNO_2= ");//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
  Serial.print(VALOR_INTERNO_2);//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
 
  Serial.print("\tVALOR_INTERNO= ");//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
  Serial.print(VALOR_INTERNO);//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM

Serial.print("\tINT_DATO= ");
Serial.println(INT_DATO);//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM

//------------------------------------------------------------------------

INT_DATO = (int)DATO_RECIBIDO_FLOAT;
//-------------------------------------------------------------------------------
if (INT_DATO < VALOR_INTERNO_2 && VALOR_INTERNO > 6 && INT_DATO !=0 && POWER ==22 )//A BAJO
{
  Serial.print("\tVALOR_INTERNO_2= ");//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
  Serial.print(VALOR_INTERNO_2);//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
 
  Serial.print("\tVALOR_INTERNO= ");//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
  Serial.print(VALOR_INTERNO);//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM

  Serial.print("\tINT_DATO= ");
Serial.println(INT_DATO);//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
 
  VALOR_SENSOR = analogRead(ENTRADA_ANALOGICA);
  VALOR_INTERNO = map(VALOR_SENSOR, 0, 1023, 0, 255);//
  VALOR_INTERNO_2 = map(VALOR_INTERNO, 0, 230, 0, 180);//VALOR_INTERNO_2 
  //Serial.println("VALOR_INTERNO");//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
  digitalWrite(IN3,HIGH);//  LOW
  digitalWrite(IN4,LOW);//  HIGH
  analogWrite(PWM,POWER);
}
if(INT_DATO == VALOR_INTERNO_2)
{
  VALOR_SENSOR = analogRead(ENTRADA_ANALOGICA);
  VALOR_INTERNO = map(VALOR_SENSOR, 0, 1023, 0, 255);//0, 1023, 0, 255
  VALOR_INTERNO_2 = map(VALOR_INTERNO, 0, 230, 0, 180);//VALOR_INTERNO_2 
  digitalWrite(IN3,HIGH);//  LOW
  digitalWrite(IN4,HIGH);//  HIGH
  analogWrite(PWM,100);
  POWER =0;
  IGUALDAD();
}
//-------------------------------------------------------------------------------


//--------------------------------------------------------------------------------
if (INT_DATO > VALOR_INTERNO_2 && VALOR_INTERNO < 234 && INT_DATO !=0 && POWER ==22)// A ARRIBA
{
  VALOR_SENSOR = analogRead(ENTRADA_ANALOGICA);
  VALOR_INTERNO = map(VALOR_SENSOR, 0, 1023, 0, 255);//
  VALOR_INTERNO_2 = map(VALOR_INTERNO, 0, 230, 0, 180);//VALOR_INTERNO_2 
  //Serial.println("VALOR_INTERNO");//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
  digitalWrite(IN3,LOW);//  LOW
  digitalWrite(IN4,HIGH);//  HIGH
  analogWrite(PWM,POWER);
}
if (INT_DATO == VALOR_INTERNO_2)
{
  VALOR_SENSOR = analogRead(ENTRADA_ANALOGICA);
  VALOR_INTERNO = map(VALOR_SENSOR, 0, 1023, 0, 255);//
  VALOR_INTERNO_2 = map(VALOR_INTERNO, 0, 230, 0, 180);//1, 223, 0, 180)
  digitalWrite(IN3,HIGH);//  LOW
  digitalWrite(IN4,HIGH);//  HIGH
  analogWrite(PWM,100);
  POWER =0;
  //delay(1000);
  IGUALDAD();
}
//---------------------------------------------------------------------------------
}

//************************_COMUNICACION_I2C_ ************************
void RECIBO_DATO_DEL_MAESTRO(int byteCount)
{
wireReadData(DATO_RECIBIDO_FLOAT);
delay(5);
//INT_DATO = (int)DATO_RECIBIDO_FLOAT;
}
//--------------------------------------------------------------------

void  IGUALDAD()
{
 
  VALOR_SENSOR = analogRead(ENTRADA_ANALOGICA);
  VALOR_INTERNO = map(VALOR_SENSOR, 0, 1023, 0, 255);//
  VALOR_INTERNO_2 = map(VALOR_INTERNO, 0, 230, 0, 180);//VALOR_INTERNO_2 
  POWER =0;
  digitalWrite(IN3,HIGH);//  LOW
  digitalWrite(IN4,HIGH);//  HIGH
  POWER =0;
  //delay(20);
 
  loop();
}
  Responder


Posibles temas similares…
Tema Autor Respuestas Vistas Último mensaje
  CONSULTA Problema con display I2C AcoranTf 2 1,577 16-04-2020, 06:05 PM
Último mensaje: AcoranTf
  problemas salida PWM arduino UNO homer32 11 4,290 26-08-2018, 06:10 PM
Último mensaje: homer32
  Problema de parpadeo: Control de luz LED usando PWM lloyder 5 4,590 16-09-2015, 10:50 AM
Último mensaje: WeSo
  Problema LCD 20x4 conectado por I2C jukillo 46 24,578 12-08-2015, 12:12 AM
Último mensaje: chicaenproblema
  [AYUDA]Arduino comunicación Serial silth 2 1,872 02-02-2015, 09:59 PM
Último mensaje: silth