Estimados soy nuevo en el foro, y me gustaría el apoyo de la comunidad en un problema técnico, que no logro ver.
Estoy realizando un programa que recibe señales de dos sensores FSR (A0, A1) y en base a estos valores activa un mensaje en pantalla, enciende led y asocia el movimiento de tres servos según valores dados.
Los servos son SG90 conectados a una fuente e poder externa de 5 volt regulada (GND compartido) , el problema es que cuando corro el programa la lectura de los sensores esta OK, los mensajes en pantalla funcionan OK, pero los servos suenan y no se mueven.
Cuando cargo un programa solo para los servos con rotación de 60 grados de 10° en 10° , funciona en todos los servos al mismo tiempo.
En el programa no uso delay para no parar el proceso de captura de datos , la pantalla y los mensajes de ella están siendo ejecutados por el protocolo I2C y arduino solo controla los servos por los puertos 9, 10 y 11.
La verdad he cambiado las líneas y he chequeado el voltaje en todos los componentes y todo esta OK.
el código es:
#include <Servo.h>
#include<Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2); // dependiendo del fabricante del LCD el codigo 0x27 puede cambiar
int fsrAnalog1 =A0;
int fsrAnalog2 =A1;
int fsrReading1;
int fsrReading2;
int rojo = 3;
int verde = 4;
int amarillo= 6;
int rojo2 = 5;
int ang;
Servo servo1;
Servo servo2;
Servo servo3;
/// declaración tipos de caras en pantalla ///
byte chartriste1 [8] = {
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000
};
byte chartriste2 [8] = {
B00000,
B01110,
B10111,
B10111,
B11111,
B11111,
B01110,
B00000
};
byte chartriste3 [8] = {
B00000,
B01110,
B10111,
B10111,
B11111,
B11111,
B01110,
B00000
};
byte chartriste4 [8] = {
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000
};
byte chartriste5 [8] = {
B00000,
B00000,
B00000,
B00000,
B00000,
B00001,
B00001,
B00000
};
byte chartriste6 [8] = {
B00000,
B00000,
B00111,
B01111,
B11000,
B10000,
B00000,
B00000
};
byte chartriste7 [8] = {
B00000,
B00000,
B11100,
B11110,
B00011,
B00001,
B00000,
B00000
};
byte chartriste8 [8] = {
B00000,
B00000,
B00000,
B00000,
B00000,
B10000,
B10000,
B00000
};
/// todo_bien///
byte charcara1 [8] = {
B00000,
B00000,
B00001,
B00000,
B00000,
B00000,
B00000,
B00000
};
byte charcara2 [8] = {
B00000,
B11110,
B00000,
B00000,
B00110,
B00110,
B00110,
B00000
};
byte charcara3 [8] = {
B00000,
B01111,
B00000,
B00000,
B01100,
B01100,
B01100,
B00000
};
byte charcara4 [8] = {
B00000,
B00000,
B10000,
B00000,
B00000,
B00000,
B00000,
B00000
};
byte charcara5 [8] = {
B00001,
B00001,
B00001,
B00000,
B00000,
B00000,
B00000,
B00000
};
byte charcara6 [8] = {
B00000,
B00000,
B10000,
B11111,
B00111,
B00000,
B00000,
B00000
};
byte charcara7 [8] = {
B00000,
B00000,
B00001,
B11111,
B11100,
B00000,
B00000,
B00000
};
byte charcara8 [8] = {
B10000,
B10000,
B10000,
B00000,
B00000,
B00000,
B00000,
B00000
};
//// inicio programa lectura , seteo de las condiciones ///
void setup() {
Serial.begin(9600);
servo1. attach(9);
servo2. attach(10);
servo3. attach(11);
pinMode(rojo, OUTPUT);
pinMode(verde, OUTPUT);
pinMode (amarillo, OUTPUT);
pinMode (rojo2, OUTPUT);
servo1.write(0);
servo2.write(0);
servo3.write(0);
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0,0);
lcd.begin(16,2); // configuramos el LCD de 16x2
for(int i = 0; i<4; i++){
}
}
/// PANTALLAS DE EXPRESIÓN
/// DOLOR ///
/// TODO BIEN ///
void me_duele(){ // f(x) expreión dolor //
for(int i = 0 ; i <= 8; i++ ){
lcd.createChar(1,chartriste1);
lcd.createChar(2,chartriste2);
lcd.createChar(3,chartriste3);
lcd.createChar(4,chartriste4);
lcd.createChar(5,chartriste5);
lcd.createChar(6,chartriste6);
lcd.createChar(7,chartriste7);
lcd.createChar(8,chartriste8);
lcd.setCursor(3,0);
lcd.write(1);
lcd.write(2);
lcd.write(3);
lcd.write(4);
lcd.setCursor(3,1);
lcd.write(5);
lcd.write(6);
lcd.write(7);
lcd.write(8);
lcd.setCursor(8,0);
lcd.print("ME");
lcd.setCursor(8,1);
lcd.print("DUELE"); }
}
void todo_bien(){ // f(x) PACIENTE NORMAL //
for(int i = 0 ; i <= 8; i++ ){
lcd.createChar(1,charcara1);
lcd.createChar(2,charcara2);
lcd.createChar(3,charcara3);
lcd.createChar(4,charcara4);
lcd.createChar(5,charcara5);
lcd.createChar(6,charcara6);
lcd.createChar(7,charcara7);
lcd.createChar(8,charcara8);
lcd.setCursor(3,0);
lcd.write(1);
lcd.write(2);
lcd.write(3);
lcd.write(4);
lcd.setCursor(3,1);
lcd.write(5);
lcd.write(6);
lcd.write(7);
lcd.write(8);
lcd.setCursor(8,0);
lcd.print("TODO ");
lcd.setCursor(8,1);
lcd.print("BIEN");
}
}
void dolor(){
servo1.write(120);
servo2.write(120);
servo3.write(120);
servo1.write(0);
servo2.write(0);
servo3.write(0);
}
void molesto(){
digitalWrite (amarillo, LOW);
digitalWrite (rojo2, HIGH);
servo1.write(45);
servo2.write(45);
servo3.write(45);
servo1.write(0);
servo2.write(0);
servo3.write(0);
}
void alerta(){
digitalWrite ( amarillo, HIGH);
digitalWrite (rojo2, LOW);
}
/// LECTURA DE PROCESADOR ///
void loop(){
fsrReading1 = analogRead(fsrAnalog1); // vena
fsrReading2 = analogRead(fsrAnalog2); // tacto
Serial.print("dato 1 = ");
Serial.println(fsrReading1 );
Serial.print("dato 2 = ");
Serial.println(fsrReading2);
/// CONDICONES ///
if (fsrReading1 > 200 && fsrReading1 < 500){
me_duele();
dolor();
digitalWrite (rojo, HIGH);
digitalWrite (verde, LOW);
}
else {
digitalWrite(rojo,LOW);
digitalWrite (verde, HIGH);
lcd.clear();
todo_bien();
}
if (fsrReading2 > 20 && fsrReading2 < 300 ){
alerta();
}
else{
digitalWrite( amarillo, LOW);
}
if (fsrReading2 > 300 && fsrReading2 <400 ){
molesto();
}
else {
digitalWrite (rojo2,LOW);
lcd.clear();
}
}
Si me puedan ayudar se los agradecería.
