Para realizar este proyecto lo primero que hay que tener en cuenta es el principio de funcinamiento que se basa en la colocación simétrica de 4 paneles fotovoltaicos y una "seta" colocada en el centro para generar una sombra.
Sigue sin funcionar. Se puede leer el estado tal y como lo hago?
este es el resulado. KM1 esta activado y ninguna de las variables Dif supera la tolerancia marcada en 150.
Vista serial:
-V1..703-V2..749-V3..730-V4...724..km1.1..km2.0..km2.0..km4.0..Diferencia V1 y V2: -46..Diferencia V3 y V4: 6..Diferencia V2 y V1: 46..Diferencia V4 y V3: -6..Diferencia V1 y V3: -27..Diferencia V2 y V4: 25..Diferencia V3 y V1: 27..Diferencia V4 y V2: -25
el código completo:
int Vplaca1 = A0;
int Vplaca2 = A1;
int Vplaca3 = A2;
int Vplaca4 = A3;
int km1 = 1;
int km2 = 2;
int km3 = 3;
int km4 = 4;
void setup() {
// initialize km as outputs:
pinMode(km1, OUTPUT) ;
pinMode(km2, OUTPUT) ;
pinMode(km3, OUTPUT) ;
pinMode(km4, OUTPUT) ;
Serial.begin(9600) ;
}
void loop() {
// read the values of the solar panels:
int V1 = analogRead(Vplaca1) ;
int V2 = analogRead(Vplaca2) ;
int V3 = analogRead(Vplaca3) ;
int V4 = analogRead(Vplaca4) ;
int Km1 = digitalRead(km1) ;
int Km2 = digitalRead(km2) ;
int Km3 = digitalRead(km3) ;
int Km4 = digitalRead(km4) ;
int Tolerancia = 150;
// left move:
int Dif12 = V1-V2 ;
int Dif34 = V3-V4 ;
// right move
int Dif21 = V2-V1 ;
int Dif43 = V4-V3 ;
//up move
int Dif13 = V1-V3 ;
int Dif24 = V2-V4 ;
//Down move
int Dif31 = V3-V1 ;
int Dif42 = V4-V2 ;
// Print voltage.
Serial.print("-V1.."); Serial.print(V1);
Serial.print("-V2.."); Serial.print(V2);
Serial.print("-V3.."); Serial.print(V3);
Serial.print("-V4..."); Serial.print(V4);
// estado de las salidas:
Serial.print("..km1."); Serial.print(Km1);
Serial.print("..km2."); Serial.print(Km2);
Serial.print("..km2."); Serial.print(Km3);
Serial.print("..km4."); Serial.print(Km4);
// estado de las restas de tensión:
Serial.print("..Diferencia V1 y V2: "); Serial.print(Dif12); Serial.print("..Diferencia V3 y V4: "); Serial.print(Dif34);
Serial.print("..Diferencia V2 y V1: "); Serial.print(Dif21); Serial.print("..Diferencia V4 y V3: "); Serial.print(Dif43);
Serial.print("..Diferencia V1 y V3: "); Serial.print(Dif13); Serial.print("..Diferencia V2 y V4: "); Serial.print(Dif24);
Serial.print("..Diferencia V3 y V1: "); Serial.print(Dif31); Serial.print("..Diferencia V4 y V2: "); Serial.print(Dif42);
Serial.println();
// left move:
if (((V1>V2) && (Dif12>Tolerancia)) || ((V3>V4) && (Dif34>Tolerancia) ))
{
digitalWrite(km1, HIGH) ;
}
else {
digitalWrite(km1,LOW) ;
}
// right move
if (( (V2>V1) && (Dif21>Tolerancia)) ||( (V4>V3) && (Dif43>Tolerancia) ))
{
digitalWrite(km2, HIGH) ;
}
else {
digitalWrite(km2,LOW) ;
}
//up move
if ( ( (V1>V3) && (Dif13>Tolerancia) ) || ((V2>V4) && (Dif24>Tolerancia)))
{
digitalWrite(km3, HIGH) ;
}
else {
digitalWrite(km3,LOW) ;
}
//Down move
if (((V3>V1) && (Dif31>Tolerancia)) || ((V4>V2) && (Dif42>Tolerancia)))
{
digitalWrite(km4, HIGH) ;
}
else {
digitalWrite(km4,LOW) ;
}
delay(1); // delay in between reads for stability
}
int km1 = 1; // dirección NO VALIDA => No puede usarse el 1 esta usado por Serial.
// usa el 5 o corre todos una unidad desde el 2 al 5
int km2 = 2; // direccion válida
int km3 = 3; // direccion valida
int km4 = 4; // dirección válida
int Km1 = digitalRead(km1) ;
int Km2 = digitalRead(km2) ;
int Km3 = digitalRead(km3) ;
int Km4 = digitalRead(km4) ;
Bua, despues de que se haya derramado la cerveza por encima del arduino y secarlo. Creo que ese era el Fallo, a ver si al poner los finales de carrera también funciona.
Os pongo un vídeo del seguidor funcionando con Unity.
Se puede poner que la tensión de salida sea menor a 5v? O tengo que hacer un divisor de tensión. Los motores van a 1v.
Estas definiendo dos veces las mismas variables Km1,Km2,Km3 y Km4 primero antes del setup y luego en el loop las vuelves a definir y les asignas valores que pueden ser 0 o 1 y ya no son el numero de pin que les asignaste antes.
int km1 = 1; // Defines los pines aqui
int km2 = 2;
int km3 = 3;
int km4 = 4;
void setup() {
Serial.begin(9600) ;
}
void loop() {
// read the values of the solar panels:
int V1 = analogRead(Vplaca1) ;
int V2 = analogRead(Vplaca2) ;
int V3 = analogRead(Vplaca3) ;
int V4 = analogRead(Vplaca4) ;
int Km1 = digitalRead(km1) ; // Y vuelves a definir la mismas variables y le asignas la lectura
int Km2 = digitalRead(km2) ; // de los pines
int Km3 = digitalRead(km3) ;
int Km4 = digitalRead(km4) ;
jose:
Estas definiendo dos veces las mismas variables Km1,Km2,Km3 y Km4 primero antes del setup y luego en el loop las vuelves a definir y les asignas valores que pueden ser 0 o 1 y ya no son el numero de pin que les asignaste antes.
int km1 = 1; // Defines los pines aqui
int km2 = 2;
int km3 = 3;
int km4 = 4;
void setup() {
Serial.begin(9600) ;
}
void loop() {
// read the values of the solar panels:
int V1 = analogRead(Vplaca1) ;
int V2 = analogRead(Vplaca2) ;
int V3 = analogRead(Vplaca3) ;
int V4 = analogRead(Vplaca4) ;
int Km1 = digitalRead(km1) ; // Y vuelves a definir la mismas variables y le asignas la lectura
int Km2 = digitalRead(km2) ; // de los pines
int Km3 = digitalRead(km3) ;
int Km4 = digitalRead(km4) ;
Gracias, pero un es k minúscula las que son el numero de pin y con K mayúscula, es el valor del pin.
ok no me habia dado cuenta,pero desde luego no son buenas practicas de programacion poner nombres tan parecidos.En cuanto al motor del video parece un servo de los de radiocontrol y me extraña muchisimo que funcione con 1v
goroldi:
Es posible reducir la tensión de salida del arduino? o lo tengo que hacer con un divisor de tensión?
Reducir QUE tensión de salida?
Las salidas del arduino son digitales TTL 0 a 5V.
Las salidas PWM con un filtro pueden tener todo el rango que se desee sin practicamente corriente.
No se que quieres hacer?
Pues na mi gozo en un pozo, he alimentado los motores con una pila de 1.5 v con el polímetro y cundo baja consume 40mA pero a la subida que es el máximo esfuerzo consume 78mA
Pd: pensaba que podría mover directamente el motor, ya que he movido servos directamente con el pin de salida del Arduino. (de manera inconsciente pero siguiendo los tutoriales)
goroldi:
surbyte Quiero mover directamente los motores. No creo que consuman mucho.
PD: Jose Efectivamente son servos modificados y funcionan como motores DC.
como te dicen los compañeros,el arduino no va poder con ese servo y aun menos con dos.para manejarlo desde arduino solo tendras que conectar el cable de señal y manejarlo con la libreria servo (suponiendo que la modificacion que has hecho sea para rotacion continua) y los otros dos de alimentacion a una fuente externa (conectando los gnd de la fuente y el arduino).
Hola, realmente no son servos. Son servos a los que se les ha quitado el potenciometro y drivers. Vamos que son motores de dc. Pueden llegar a 5v pero van muy rapido. Prefiero alimentarlos a 1.5 para que la orientación sea mas precisa.
Compre este pac de transistores. Cual creéis que es el mas idóneo para usar a modo de rele?
10 x S9012H
10 x S9013H
10 x S9014C
10 x S9015C
10 x S9018H
10 x S8050D
10 x S8550D
10 x A1015
10 x C1815
10 x A42
10 x A92
10 x 2N5401
10 x 2N5551
10 x A733
10 x C945
10 x 2N3904
10 x 2N3906
10 x SS8050D (current 1.5A)
10 x SS8550D (current 1.5A)
10 x TL431
goroldi:
Hola, realmente no son servos. Son servos a los que se les ha quitado el potenciometro y drivers. Vamos que son motores de dc. Pueden llegar a 5v pero van muy rapido. Prefiero alimentarlos a 1.5 para que la orientación sea mas precisa.
Compre este pac de transistores. Cual creéis que es el mas idóneo para usar a modo de rele?
10 x S9012H
10 x S9013H
10 x S9014C
10 x S9015C
10 x S9018H
10 x S8050D
10 x S8550D
10 x A1015
10 x C1815
10 x A42
10 x A92
10 x 2N5401
10 x 2N5551
10 x A733
10 x C945
10 x 2N3904
10 x 2N3906
10 x SS8050D (current 1.5A)
10 x SS8550D (current 1.5A)
10 x TL431
ojo con eso porque disminuyendo voltaje aumentas intensidad,ademas de restar potencia al motor (aunque veo que lleva reductores).Una duda que tengo,esa especie de paraguas encima de las placas sirve para crear una sombra que usas para saber cuando esta directamente enfocado ?
jose:
ojo con eso porque disminuyendo voltaje aumentas intensidad,ademas de restar potencia al motor (aunque veo que lleva reductores).
he provado con 1,5v y consume maximo 80mA y mueve perfectamente.
jose:
.Una duda que tengo,esa especie de paraguas encima de las placas sirve para crear una sombra que usas para saber cuando esta directamente enfocado ?
si el paraguas es el que crea sombra para disminuir la tensión en los paneles que no estén orientados al sol.
Ok asi que lo que se compara es el voltaje obtenido en las celulas y se reorienta en funcion de esas lecturas buscando la posicion en que el voltaje de todas es igual o similar y la tolerancia sera las diferencias que pueda haber entre celulas.?