cambiar valores de un array

Hola a todos!

Me estoy volviendo loca con un array porque no encuentro cual es la sintaxis que hay que utilizar.
Declaro como variable global:

float posicion[3]; //contiene la posicion x,y,z

y luego dentro de una función quiero cambiar los tres valores. Yo creo que se tendria que hacer asi:

posicion={320, 0, 100};

y me sale este error.

Sweep17.ino: In function 'void loop()':
Sweep17:107: error: expected primary-expression before '{' token
Sweep17:107: error: expected `;' before '{' token

¿Alguien que me aclare como hay que tratar los arrays?
Gracias!

0.Saludos
La forma correcta de utilizar un arreglo es hacer puntero a la posicion del arreglo. Es decir si tienes float posicion[3], no tienes
ninguna variables llamada posicion asi que no puedes igualarla a nada. pero si tienes tres variables llamadas posicion[0], posicion[1] y posicion[2].

Por lo que debes hacer es:

posicion[0]= 320.0;
posicion[1]= 0.0;
posicion[2] = 100.0;

Mo olvides el ".0" ya asi le dices que es un valor long y evitas errores en el calculo.

¿Y de que manera puedo poner las tres posiciones en una sola linea de código?

Al declararla:

float posicion[]={320.0,0.0,100,0};

Y despues modificar cada una a medida que se necesite

Pero el problema es que voy a ir modificando los valores de la posicion... Pretendia usarlo como variable global y cambiarle cuando lo necesite.

¿De qué manera se hace utilizando referencias?

Muchas gracias

Si me explicas un poco que necesitas hacer puedo ayudarte,

por ejemplo para darles valor de una entrada analógica, puedes usar esto:

for (int i = 0; i <3; i++){
 posicion[i]=analogRead(i); //Si la lectura es de entradas continuas desde la primero  A0
 }
for (int i = 0; i <3; i++){
  posicion[i]=analogRead(i+4);//Si la primera entrada analógica es A4
}

Estoy haciendo un brazo robótico y tengo que estar manejando constantemente la posicion en la que se encuentra (x,y,z) y los angulos que se mueve cada servo (q1,q2,q3,q4,q5).
Entonces habia pensado declarar dos vectores que con contuvieran esa informacion y luego poder utilizarlo en las funciones modificando el valor. Se que se debería hacer por referencia pero tengo un poco oxidado estos temas.
De forma esquematica lo que estoy haciendo es algo asi:

//Declaradas como globales
//Ángulos que tiene que moverse cada servo:
float q[5];

//Posiciones de la cinemática ddirecta
float posicion[3]; //posicion x,y,z

//Dentro de void loop()
...
posicion[0]=320.0;
posicion[1]=0.0;
posicion[2]=100.0;

CinInversa(posicion,q); //Le pasas la posicion a la que quieres llegar y te devuelve los angulos (q)

CinDirecta(q,posicion); //Le pasas los angulos y te devuelve la posicion x,y,z

//funciones

void CinDirecta(float _q[], float _posicion[])
{....
Hace los calculos y deberia cambiar los valores de posicion
}

void CinInversa( float _posicion[], float _q[])
{
Lo contrario
}

Si me explicas como hacerlo con referencias seria genial

Hola

Quizá lo que necesitas son estructuras (struct) en lugar de arrays.

Mira: Arduino Playground - Struct Resource

También lo habia pensado.. Ahora me lo miro bien!

Otra pregunta!
Al hacer operaciones en concreto estas:

double A=(sq (hipotenusa)-sq(d2)-sq(d3))/(2d2d3); //A=cosq3

//modo vale o 1(q2 ang pequeño) o -1 (q2 ang mas grande)
double m=angle(modo*(sqrt(1-sq(A))); //m=senq3

_q[2]=atan2(m,A);

m sale un numero complejo y al hacer la arcotangente me sale NAN como resultado del ángulo.
Creo que debería sacar el ángulo del complejo que sale en 'm' para luego hacer la atan2.
¿Cómo se puede obtener el angulo de un complejo en Arduino?

Ya creaste otro post con este tema.
No entiendo porque asumes que tendrás que trabajar en el campo complejo? La solución de la funciones complejas te la dí en tu otro post.
Pero analicemos porque crees que esta bien que te de complejo?

Hola, perdón por el retraso.
La librería de complejos no he conseguido sabe usarla. Pero creo que he limitado un poco el problema. Estaba cometiendo el error de no tomar las distancias con valores absolutos.
Ahora mismo me siguen dando complejos en algunos puntos pero creo que tiene que ver con los puntos singulares del robot. Y estoy un poco perdida de como solucionarlo. Dejo el codigo completo de la cinemática para ver si le veis algun fallo.

//CINENMÁTICA INVERSA
void CinInversa(double x, double y, double z, double gamma, int modo, double _q[])
{
// Límites de los ángulos según CIN_DIRECTA y servos ideales
// q1=[0,pi]=[0,180]
// q2=[0,pi]=[0,180]
// q3=[-pi/2,pi/2]=[0,180]
// q4=[-pi/2,pi/2]=[0,180]
// q5=[-pi/2,pi/2]=[0,180]

//Primer angulo
_q[0]=arctg(y,x);

//Tercer ángulo
double r_p=sqrt(sq(x)+sq(y));

double y_p=abs(z);

double gamma_rad=gamma*(PI/180);

double Afr=abs((d4+d5)*cos(gamma_rad));
double val1=max(r_p,Afr);
double val2=min(r_p,Afr);
double LadoR=val1-val2;

double Afy=((d4+d5)*sin(gamma_rad));
double val3=max(y_p,Afy);
double val4=min(y_p,Afy);
double LadoY=val3-val4-d1;

double hipotenusa=abs(sqrt(sq(LadoR)+sq(LadoY)));
// if (hipotenusa>d2+d3) //Esta condición funciona a veces. En ocasiones sale que la hipotenusa es mayor de
// hipotenusa=d2+d3; // lo que fisicamente puede ser y es por lo que sale complejos

// hipotenusa^2= d2^2+d3^2+2d2d3*cos(180-q3) (Th.coseno)

double A=(sq(hipotenusa)-sq(d2)-sq(d3))/(2d2d3); //A=cosq3

//modo vale o 1(q2 ang pequeño) o -1 (q2 ang mas grande)
double m=(modo*(sqrt(1-sq(A)))); //m=senq3

_q[2]=arctg(m,A);

//Segundo ángulo
double beta=arctg(LadoY,LadoR);
double alpha=arctg(d3sin(_q[2]),d2+d3cos(_q[2]));
_q[1]=beta-alpha;

//Cuarto ángulo
_q[3]=-_q[1]-_q[2]+gamma_rad;

//Quinto ángulo
_q[5]=0;
//Resultado en grados
_q[0]=_q[0]*180/PI;
_q[1]=_q[1]*180/PI;
_q[2]=_q[2]*180/PI;
_q[3]=_q[3]*180/PI;
_q[4]=_q[4]*180/PI;

//Comprobación de que los ángulos están en el rango válido según D-H
double min[5]={0,0,-90,-90,-90};
double max[5]={180,180,90,90,90};
for (int i=0; i<5; i++){
if ((q<min)||(q_>max*))
{
Serial.print("q");Serial.print(i);Serial.print("=");Serial.println(q);
if (isinf(q)==1.0){
Serial.println(x); Serial.println(y);Serial.println(z); Serial.println(modo); Serial.println(q);_

CinInversa(x, y, z+0.1, gamma, modo, q);}*
* //Con esto intento evitar los complejos pero no funciona. Lo que pretendia era que al encontrar*
* //una posicion invalida cambiara un poco la posicion para evitarla*
* }*_

* }*

}
[/quote]

Dejo un pequeño esquema

Estuve leyendo y las situaciones que llevan a complejos deben evitarse.
ademas tienes limites en tus servos que restringen las situaciones.
seguro tienes mucha información pero mira esta para TU CASO

http://www.itson.mx/publicaciones/rieeyc/Documents/v4/art2junio08.pdf
aca otro ejemplo y de nuevo habla de angulos imposibles o sea restricciones

Gracias! Aunque ya habia visto esas páginas, es más me habia basado en el segundo link. El problema surge al pasar de cuadrante y no consigo que me funcionen las restricciones... Alguna sugerencia?

Me gusta tu proyecto para encararlo en un futuro. Acabo de leer por arriba el pdf del brazo de 6 grados de libertad que tiene un codigo C++ en Builder compiler. Muy interresante y complejo por la matemática. Digno de aquel que esta bien afilado en épocas de exámenes.
Vamos al punto. Hoy por hoy, soy mas práctico.
En tu caso te voy a pedir que compartas el programa completo para poder caer en las situaciones que explicas.
Danos un ejemplo justamente cuando el brazo debe cambiar de cuadrante para poder buscar una solución.
Lo que te comenté antes que claro ya sabías, habla de ignorar esas condiciones que llevan a soluciones complejas por lo que la solución compleja no me parece una solución. Hay que evitarla, pero la pregunta es que la reemplaza?
Lei algo al respecto pero debo repasar mi información para poder darte una orientación.

Si, tienes algo que nos permita seguirte de una solución aceptable, posicion 1 del brazo a una NO ACEPTABLE que justamente se sale de los límetes de los servos o de las condiciones permitidas entonces ahi podremos darte una mano.

Vamos por partes

  //Comprobación de que los ángulos están en el rango válido según D-H
    double min[5]={0,0,-90,-90,-90};
    double max[5]={180,180,90,90,90};
    for (int i=0; i<5; i++){
      if ((q<min)||(q>max))
      {
        Serial.print("q");Serial.print(i);Serial.print("=");Serial.println(q);
        if (isinf(q)==1.0){
          Serial.println(x); Serial.println(y);Serial.println(z); Serial.println(modo); Serial.println(q);
          CinInversa(x, y, z+0.1, gamma, modo,  _q);}
        //Con esto intento evitar los complejos pero no funciona. Lo que pretendia era que al encontrar
         //una posicion invalida cambiara un poco la posicion para evitarla
      }

porque no funciona esto, pues porque olvidaste usar los arrays min y max
*_ <em>*reemplaza     if ((q<min)||(q>max)) por     if ((q<min[i])||(q>max[i]))*</em> _*
ya es un avance

¿? min y max si se utilizan...
for (int i=0; i<5; i++)
{
if ((q<min)||(q_>max*))
{
Serial.print("q");Serial.print(i);Serial.print("=");Serial.println(q);
if (isinf(q)==1.0)
{
Serial.println(x); Serial.println(y);Serial.println(z); Serial.println(modo); Serial.println(q);_

CinInversa(x, (y), z+0.1, gamma, modo, q);*
* }*_

* Error();*
* }*

* }*
El problema no es que no entre en ese bucle. El problema es que cuando se encuentra un punto singular, por ejemplo cuando se alinean dos eslabones la variable hipotenusa da un valor mayor que d2+d3, lo cual es imposible, y por eso puse esto
// if (hipotenusa>d2+d3)//Hay veces que hipotenusa sale mayor que d2+d3 y por eso luego me salen complejos
// hipotenusa=d2+d3;
Pero esto lo que hace es que el angulo q3 sea 0 todo el rato.

reemplaza if ((q<min)||(q>max))
por if ((q<min)||(q>max))

hubo un error en la 2da linea, debiría haber salido if ((q<min_)||(q>max*)) porque solo repetí la línea._
tu me aseguras que usar if ((q<min)||(q>max)) funciona? yo digo que debería ser asi
_
*_ <em>* if ((q<min[i])||(q>max[i]))*</em> _**_
has una prueba, agrega Serial.print previamente y que el loop muestre los datos a tituto informativo y me cuentas.
Si eso funciona, es otra característica del compilador que desconocía. Yo creo que debes indexar el vector. Lo que me sorprende es que no te de error y no te indique que debes indexarlo lo que me hace dudar de mi comentario.

Estas escribiendo lo mismo...No se si es por la forma de copiarlo

ocurre que no toma el [i] que agrego, lo hizo las dos veces.

bueno edité mis respuestas. No sabía que todo lo que esta entre corchetes desaparece en el editor.
No habia visto tu código y si esta indexado cada vector asi que hace dias que estoy queriendote decir algo que ya sabias.
Ahora revisaré tu código a ver que encuentro.