Realizzazione movimento statuina

Ciao a tutti.

Ho in mente di realizzare una statuina con 3 movimenti:
-Alza busto (servo 1)
-Alza braccio (servo 2)
-Accendi led

Tutti questi movimenti sono controllati/alternati in base alla lettura dei valori da una fotoresistenza secondo la seguente logica:

Se il valore indica luce intensa (simula il giorno)
allora il servo 1 si muove di X gradi a destra e poi ritorna nella posizione originale, e ripete questo movimento finchè viene letto dal sensore luce scarsa (simula la notte)

Se il valore indica luce scarsa (simula la notte)
allora il servo 1 si muove di XN gradi a destra e rimane sempre in quella posizione
il servo 2 si muove di XN2 gradi e rimane in quella posizione
il led si accende
tutto finchè non viene letto dal sensore luce intensa (simula il giorno)

Pensate sia fattibile la cosa?

Non ho mai usato arduino (ma programmo in altri linguaggi da moltissimi anni).
Potrebbe andare bene questo pseudocodice:

loop(){
  if(luce intensa){
    predisponiGiorno()
    loop servo 1  
 }
 if (luce scarsa){
    predisponiNotte()
    setta servo 1
    setta servo 2
    accendi led 
 }
}

potete darmi delle dritte su quali problemi posso andare incontro? quello che mi preoccupa è il loop servo 1 nel primo if....come lo gestisco?

grazie

Ciao ... intanto, non puoi mettere due loop uno dento l'altro, ma neppure ti serve ... il "corpo" del programma e' gia un loop che si ripete in continuazione, ti basta sfruttarlo per fare chiamate "condizionate" (i vari if, else, ecc) ... poi in base al valore di determinate variabili, potrai richiamare una o piu funzioni quante volte ti servono ... le funzioni ovviamente le puoi scrivere con dentro quello che vuoi, oppure, dato che li hai solo due "stati" definiti (tanta luce e poca luce), puoi mettere nel loop una lettura della fotocellula, che in base al valore impostera' una variabile ad uno o a zero (con dell'isteres per evitare sfarfallii, ma e' semplice), e poi una cosa tipo if (variabile alta) fai questo, else fai quello ...

Per la ripetizione del movimento, puoi usare due sistemi ... se ti serve reattivita', usa millis() per contare gli intervalli fra le varie azioni ... se non ti serve reattivita' (cioe' puoi anche aspettare un po prima di eseguire) e gli intervalli sono brevi, potresti usare dei delay(), la cosa e' piu semplice, ma tieni presente che durante il tempo impostato nei delay, il micro non fa assolutamente nulla tranne aspettare, quindi non legge la fotocellula, non pilota nulla, non sente alcun ingresso (tranne gli interrupt), aspetta e basta ...

Grazie per la spiegazione.

Ho iniziato a rendere il pseudocodice più vicino al linguaggio arduino. Tralasciando errori di sintassi, l'idea è buona o posso ottimizzare quanto scritto?

#define intervalServo1 1500 //tempo max del servo 1 per passare dalla posizione 1 alla posizione 2
#define pos1Servo1 0
#define pos2Servo1 20

long previousMills = 0;
boolean primaEsecuzioneLuceIntensa = true;
int step = 4;
int cont = 0;

setup(){
 servo1 = pos1Servo1
 servo1.writeMicroseconds(1500);
 servo 2 = posizione iniziale
 led = spento

}


loop(){

 if(luce intensa){
   predisponiGiorno();
	
   if(millis() - previousMills < intervalServo1){
     servo1.write(posizione vecchia + pos2Servo1);
     ..altre operazioni... 
     //devo attendere che servo1 arrivi alla posizione finale
     delay(X)
   }
   else{
     servo1.write(posizione vecchia - pos2Servo1);
     ..altre operazioni... 
     //devo attendere che servo1 arrivi alla posizione iniziale
     delay(X)	
     cont++:
   }	
   
   if(cont == step){
    previousMills = millis();
	cont = 0;
   }
   
 }
 .......
}


predisponiGiorno(){

  if(primaEsecuzioneLuceIntensa){
	servo 1 = pos1Servo1;
	servo 2 = posizione iniziale giorno
	led = spento 
    primaEsecuzioneLuceIntensa = false;
  }

}

I servo sono piuttosto veloci, non ti dovrebbe servire attendere che arrivino con dei delay ... se invece li vuoi far muovere tu lentamente, forse conviene un ciclo for in cui sommi (o sottrai) alla posizione una frazione del movimento per "tot" volte finche' lo completa ... oppure, di non usare servo, ma motoriduttori lenti con finecorsa ...

Sto seguendo per curiosità, ma... insomma... mi chiedo, a che serve?
Sai, una statuina che si muove ed alza il braccio la notte mi farebbe venire gli incubi (con Mussolini che mi insegue...)! :smiley:

docdoc:
... (con Mussolini che mi insegue...)! :smiley:

Be', ma se ti meriti di essere inseguito, che colpa ne ha lui ? ... :stuck_out_tongue: :smiley:

Scherzi a parte, mi viene il dubbio (ma solo l'OP puo confermare o smentire), che voglia fare una cosa del genere ... di giorno, continua a girarsi ad intervalli, come se stesse sorvegliando, di notte, si ferma, alza un braccio ed accende un led, magari tipo lanterna, come luce notturna ... pero' e' solo un'idea che e' venuta a me, magari lui vuole farci altro :smiley:

EDIT: magari sta cercando di costruire una Hoihoi-san ... :smiley: :smiley: :smiley: (scusa, non ho resistito :P)

ahahahah ci hai azzeccato (più o meno) @Etemenanki

Il giorno si alza e si siede mentre la notte rimane alzato, alza il braccio e accende la lanterne che tiene in mano nel braccio alzato.

...inserendo un ciclo for le cose si semplifcano...

void loop()
{
  Serial.println(analogRead(A0));
  Serial.println(servo_9.read());
  if (analogRead(A0) > X) {
    
       //si alza
	for 1 to N{
	  servo_0.write(timespostamento);
	  timespostamento = (timespostamento + 10);
	}
	 //si siede
	for 1 to N{
	  servo_0.write(timespostamento);
          timespostamento = (timespostamento - 10);
	}
  } 
  else{ 
  ...buio....
  } 
}

penso sia la strada corretta...