Meccanismo apertura e chiusura casco iron man

buongiorno a tutti, sono nuovo e a digiuno di arduino, ho realizzato il casco di iron man con arduino nano every, premetto che trovato lo schema e il codice già fatti in rete.
funziona tutto bene, si apre e si chiude, ho solo un problema, quando do alimentazione alla scheda i servocomandi fanno un mezzo giro, si può evitare modificando il codice?
Grazie mille a chi mi aiuterà!
Questo è il codice:

#include "ServoEasing.hpp"
ServoEasing servoDx;
ServoEasing servoSx;
const int action_pin = 2;
const int ledPin = 6;
const int potPin = A0;
int location = 31;
int Sx_closed = 170;
int Dx_closed = 15;
int Sx_open = 10;
int Dx_open = 190;
int value;
int maxBrightness;
void setup()
{
pinMode(action_pin, INPUT_PULLUP);
pinMode(potPin, INPUT);
servoDx.attach(9);
servoSx.attach(10);
setSpeedForAllServos(170);
servoDx.setEasingType(EASE_CUBIC_IN_OUT);
servoSx.setEasingType(EASE_CUBIC_IN_OUT);
synchronizeAllServosStartAndWaitForAllServosToStop();
}
void loop()
{
value = analogRead(potPin);
maxBrightness = map(value, 250, 750, 0, 255);
int proximity = digitalRead(action_pin);
if (proximity == LOW)
{
if (location > Sx_open) {
servoDx.setEaseTo(Dx_open);
servoSx.setEaseTo(Sx_open);
synchronizeAllServosStartAndWaitForAllServosToStop();
location = Sx_open;
delay(5);
analogWrite(ledPin, 0);
} else {
servoDx.setEaseTo(Dx_closed);
servoSx.setEaseTo(Sx_closed);
synchronizeAllServosStartAndWaitForAllServosToStop();
location = Sx_closed;
delay(50);
analogWrite(ledPin, maxBrightness / 3);
delay(100);
analogWrite(ledPin, maxBrightness / 5);
delay(100);
analogWrite(ledPin, maxBrightness / 2);
delay(100);
analogWrite(ledPin, maxBrightness / 3);
delay(100);
analogWrite(ledPin, maxBrightness);
delay(100);
}
}
}

Devi tenere traccia della posizione attuale dei servo salvandola in una memoria non volatile (nel caso della Every potrebbe essere l'EEPROM ad esempio).

All'accensione del micro, ci sarà da evitare che i servo vadano nella posizione di default (dovrebbe essere a 90°) e dovrai fare in modo invece che vadano nell'ultima salvata e quindi se non ci sono stai spostamenti "manuali", di fatto dovrebbero rimanere fermi.

Dovrebbe bastare la chiamata alla funzione nel setup() prima di attivare il movimento.

servoDx.setEaseTo(Dx_open);
servoSx.setEaseTo(Sx_open);

Grazie mille per l'aiuto,ma scusami,come si fa quello che hai descritto,io non ne capisco quasi niente

Te lo ha scritto

Perdonatemi,ma sono ignorante in materia,mi spiegate meglio che scritte e a quale riga devo aggiungere al codice? Grazie ancora per la pazienza

Emmm ... però debbo ricordarti il REGOLAMENTO, punto 16.1 ... :roll_eyes:

Guglielmo

Te lo ha scritto. Inoltre ti dice dovrebbe funzionare, non ne è certo.
Fai delle prove. Su dai... buttati... provaci.

Buongiorno e buon anno, eccomi ancora quà, abbiate pazienza
Ho modificato il codice come mi avete consigliato ma mi da errore, è Usa i tags code per formattare il codice per il forumgiusto come ho fatto?

#include "ServoEasing.hpp"
ServoEasing servoDx;
ServoEasing servoSx;
const int action_pin = 2;
const int ledPin = 6;
const int potPin = A0;
int location = 31;
int Sx_closed = 170;
int Dx_closed = 15;
int Sx_open = 10;
int Dx_open = 190;
int value;
int maxBrightness;
void setup()
{
servoDx.setEaseTo(Dx_open)
servoSx.setEaseTo(Sx_open)
pinMode(action_pin, INPUT_PULLUP);
pinMode(potPin, INPUT);
servoDx.attach(9);
servoSx.attach(10);
setSpeedForAllServos(170);
servoDx.setEasingType(EASE_CUBIC_IN_OUT);
servoSx.setEasingType(EASE_CUBIC_IN_OUT);
synchronizeAllServosStartAndWaitForAllServosToStop();
}
void loop()
{
value = analogRead(potPin);
maxBrightness = map(value, 250, 750, 0, 255);
int proximity = digitalRead(action_pin);
if (proximity == LOW)
{
if (location > Sx_open) {
servoDx.setEaseTo(Dx_open);
servoSx.setEaseTo(Sx_open);
synchronizeAllServosStartAndWaitForAllServosToStop();
location = Sx_open;
delay(5);
analogWrite(ledPin, 0);
} else {
servoDx.setEaseTo(Dx_closed);
servoSx.setEaseTo(Sx_closed);
synchronizeAllServosStartAndWaitForAllServosToStop();
location = Sx_closed;
delay(50);
analogWrite(ledPin, maxBrightness / 3);
delay(100);
analogWrite(ledPin, maxBrightness / 5);
delay(100);
analogWrite(ledPin, maxBrightness / 2);
delay(100);
analogWrite(ledPin, maxBrightness / 3);
delay(100);
analogWrite(ledPin, maxBrightness);
delay(100);
}
}
}

Se non riporti in dettagli CHE errore ti da come si fa a risponderti ???

NI ... come vedi il codice NON è indentato ed è poco leggibile ... io scrivo sempre:

nel post seleziona la parte di codice e premi l'icona <code/> nella barra degli strumenti per contrassegnarla come codice. Inoltre, così com'è, non è molto leggibile ... assicurati di averlo correttamente indentato nell'IDE prima di inserirlo (questo lo si fa premendo ctrlT su un PC o cmd T su un Mac, sempre all'interno del IDE).

... se fai così sei sicuro che il codice sarà ben indentato e lo avrai messo nei giusti tag CODE :wink:

Guglielmo

Spero che così vada bene

#include "ServoEasing.hpp"
ServoEasing servoDx;
ServoEasing servoSx;
const int action_pin = 2;
const int ledPin = 6;
const int potPin = A0;
int location = 31;
int Sx_closed = 170;
int Dx_closed = 15;
int Sx_open = 10;
int Dx_open = 190;
int value;
int maxBrightness;
void setup()
{
servoDx.setEaseTo(Dx_open)
servoSx.setEaseTo(Sx_open)
pinMode(action_pin, INPUT_PULLUP);
pinMode(potPin, INPUT);
servoDx.attach(9);
servoSx.attach(10);
setSpeedForAllServos(170);
servoDx.setEasingType(EASE_CUBIC_IN_OUT);
servoSx.setEasingType(EASE_CUBIC_IN_OUT);
synchronizeAllServosStartAndWaitForAllServosToStop();
}
void loop()
{
value = analogRead(potPin);
maxBrightness = map(value, 250, 750, 0, 255);
int proximity = digitalRead(action_pin);
if (proximity == LOW)
{
if (location > Sx_open) {
servoDx.setEaseTo(Dx_open);
servoSx.setEaseTo(Sx_open);
synchronizeAllServosStartAndWaitForAllServosToStop();
location = Sx_open;
delay(5);
analogWrite(ledPin, 0);
} else {
servoDx.setEaseTo(Dx_closed);
servoSx.setEaseTo(Sx_closed);
synchronizeAllServosStartAndWaitForAllServosToStop();
location = Sx_closed;
delay(50);
analogWrite(ledPin, maxBrightness / 3);
delay(100);
analogWrite(ledPin, maxBrightness / 5);
delay(100);
analogWrite(ledPin, maxBrightness / 2);
delay(100);
analogWrite(ledPin, maxBrightness / 3);
delay(100);
analogWrite(ledPin, maxBrightness);
delay(100);
}
}
}

No! Il secondo if non può essere allineato con quello che lo contiene!

}
}
}

Tre graffe chiuse non possono essere allineate fra loro!
Fai CTRL+T nell'IDE e poi copia qui il codice.

Ciao, ho seguito il tuo consiglio ma così facendo quando premo il pulsante non si muove più niente, sbaglio qualcosa?

#include "ServoEasing.hpp"
ServoEasing servoDx;
ServoEasing servoSx;
const int action_pin = 2;
const int ledPin = 6;
const int potPin = A0;
int location = 31;
int Sx_closed = 160;
int Dx_closed = 25;
int Sx_open = 10;
int Dx_open = 190;
int value;
int maxBrightness;
void setup()
{
servoDx.setEaseTo(Dx_open);
servoSx.setEaseTo(Sx_open);
pinMode(action_pin, INPUT_PULLUP);
pinMode(potPin, INPUT);
servoDx.attach(9);
servoSx.attach(10);
setSpeedForAllServos(170);
servoDx.setEasingType(EASE_CUBIC_IN_OUT);
servoSx.setEasingType(EASE_CUBIC_IN_OUT);
synchronizeAllServosStartAndWaitForAllServosToStop();
}
void loop()
{
value = analogRead(potPin);
maxBrightness = map(value, 250, 750, 0, 255);
int proximity = digitalRead(action_pin);
if (proximity == LOW)
{
if (location > Sx_open) {
servoDx.setEaseTo(Dx_open);
servoSx.setEaseTo(Sx_open);
synchronizeAllServosStartAndWaitForAllServosToStop();
location = Sx_open;
delay(10);
analogWrite(ledPin, 0);
} else {
servoDx.setEaseTo(Dx_closed);
servoSx.setEaseTo(Sx_closed);
synchronizeAllServosStartAndWaitForAllServosToStop();
location = Sx_closed;
delay(50);
analogWrite(ledPin, maxBrightness / 3);
delay(100);
analogWrite(ledPin, maxBrightness / 5);
delay(100);
analogWrite(ledPin, maxBrightness / 2);
delay(100);
analogWrite(ledPin, maxBrightness / 3);
delay(100);
analogWrite(ledPin, maxBrightness);
delay(100);
}
}
}

Potete chiudere l'argomento, ho risolto il problema!

ciao scusami ho lo stesso problema, potresti incollarmi il tuo codice. Inoltre vedo che il servo che va sulla faccia ruota di molto, non collide la faccia col casco in questo modo ? Grazie

Buongiorno, peppe29

Benvenuto nella sezione Italiana del forum :slight_smile:

Cortesemente, leggi attentamente il REGOLAMENTO di detta sezione:
[REGOLAMENTO] Come usare questa sezione del forum
(... e, per evitare future possibili discussioni/incomprensioni, prestando molta attenzione al punto 15)
e poi, come da suddetto regolamento (punto 16.7), fai la tua presentazione IN CODA ALL'APPOSITA DISCUSSIONE:
Presentazioni nuovi iscritti: fatevi conoscere da tutti! (Part 2)
spiegando bene quali esperienze hai in elettronica e in programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.

Grazie
Gianluca

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione, nel rispetto del succitato regolamento, nessuno ti risponderà (eventuali risposte, o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto. :wink:

P.P.S.: Evitate di utilizzare la traduzione automatica fatta dal browser ... vi impedisce di capire la lingua della sezione dove andate a scrivere ...

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.