Go Down

Topic: Problema sketch servo controllato da sensore movimento---Risolto (Read 166 times) previous topic - next topic

Goblin72it

Ciao a tutti,
sono riuscito con il mio primo arduino e dopo vari tutorial a realizzare alcune cose basilari, ora sto cercando di unire alcune di queste per realizzare un semplice servo e un led che vengano attivati da un movimento rilevato da un sensore sr-04 e che poi si fermino e restino in attesa.
Qui quello che ho messo insieme:

Code: [Select]
// Servo - Version: Latest
#include <Servo.h>

#include <Servo.h> // include la Libreria Servo.h

Servo myServo;
  
int pos = 0;    

const int myServo = 11;
const int trigPin = 9;
const int echoPin = 10;
const int ledPin = 13;
long duration;
int distance;
int safetyDistance;


void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(myServo, OUTPUT);
pinMode(ledPin, OUTPUT);

Serial.begin(9600);


 
}
void loop() {
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance= duration*0.034/2;
safetyDistance = distance;
if (safetyDistance <= 10){
digitalWrite(myservo, HIGH);
digitalWrite(ledPin, HIGH);
}
else{
digitalWrite(myservo, LOW);
digitalWrite(ledPin, LOW);
}
Serial.print("Distance: ");
Serial.println(distance);
}
 


Ovviamente non funziona e magari è una cosa stupidissima, ho provato a cambiare, spostare, dichiarare qualsiasi cosa mi venisse in mente ma niente, dovevo studiare di più.


Grazie per le premesse e si, riguardo la carbonara volevo vincere facile :-)
Si lo sto usando così #include


Code: [Select]
<Servo.h> // include la Libreria Servo.h

  
  
int pos = 0;    

const int myservo = 11;
const int trigPin = 9;
const int echoPin = 10;

const int ledPin = 13;
long duration;
int distance;
int safetyDistance;
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(myservo, OUTPUT);
pinMode(ledPin, OUTPUT);
Serial.begin(9600);


 
}
void loop() {
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance= duration*0.034/2;
safetyDistance = distance;
if (safetyDistance <= 30){
digitalWrite(myservo, HIGH);
digitalWrite(ledPin, HIGH);
}
else{
digitalWrite(myservo, LOW);
digitalWrite(ledPin, LOW);
}
Serial.print("Distance: ");
Serial.println(distance);
}



mi legge i dati del sensore e accende il led quando mi avvicino, anche se non è proprio preciso a seriale vedo tutto ma non manda impulso al servo, anche se a volte piccoli segnali di vita li da, quando si accende il led.

L'idea è creare appunto un Micro servo gg sg-90  che si attiva e ruota di 90/180 gradi quando qualcuno si avvicina.

Da montare sulla testa di una bambola e far crepare i passanti, per l'esattezza, e poi cercherò di attaccarci anche il sonoro (ma questa altra storia).

Ora, non ho scritto tutto io, ho preso da diversi sorgenti e per quel che ho capito li sto accrocchiando cercando di fargli fare quel che dovrebbero, anche perché proprio così non ne ho trovati.

Ho trovato il radar che mi sono ripromesso di usare poi per fargli seguire la gente con testa o occhi, ho trovato anche sensore e basta che attivava il servo e funzionava ma non riuscivo a fermare il loop o metterlo in attesa.

Questo mi sembra un buon compromesso su tutto, ho provato a modificarlo così, e non compila ma da pochi errori a differenza di prima (grazie)

Code: [Select]


#include <Servo.h> // include la Libreria Servo.h

Servo myservo;
  
int pos = 0;    

const int myServo = 11;
const int trigPin = 9;
const int echoPin = 10;
const int ledPin = 13;
long duration;
int distance;
int safetyDistance;


void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(myServo, OUTPUT);
pinMode(ledPin, OUTPUT);
myservo.attach(11);
Serial.begin(9600);

}

void loop() {
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance= duration*0.034/2;
safetyDistance = distance;
if (safetyDistance <= 30){
digitalWrite(myservo, HIGH);
digitalWrite(ledPin, HIGH);
}
else{
digitalWrite(myservo, LOW);
digitalWrite(ledPin, LOW);
}
Serial.print("Distance: ");
Serial.println(distance);
}
 


Ecco perchè non trovavo il bottone code, scusata, piano piano arrivo, comunque fatte altre modifiche ancora, corretto graffe che mi dice ma bho....nessun risultato, non compila e da questo errore:

./opt/arduino-builder/arduino-builder -compile -core-api-version 10611 -hardware opt/arduino-builder/hardware -hardware ./opt/cores -tools opt/arduino-builder/tools -tools ./opt/tools -built-in-libraries opt/libraries/latest -logger humantags -fqbn arduino:avr:uno -build-cache /tmp -build-path /tmp/385019048/build -verbose -libraries /tmp/385019048/custom -libraries /tmp/385019048/pinned /tmp/385019048/sensorealarmprovaservo1_quasi_funge

Multiple libraries were found for "Servo.h"

Used: /home/ubuntu/opt/libraries/latest/servo_1_1_2

Not used: /home/ubuntu/opt/libraries/latest/rokitsmart_1_0_9

Not used: /home/ubuntu/opt/libraries/latest/printoo_library_1_0_2

Using library servo_1_1_2 at version 1.1.2 in folder: /home/ubuntu/opt/libraries/latest/servo_1_1_2

/tmp/385019048/sensorealarmprovaservo1_quasi_funge/sensorealarmprovaservo1_quasi_funge.ino: In function 'void loop()':

/tmp/385019048/sensorealarmprovaservo1_quasi_funge/sensorealarmprovaservo1_quasi_funge.ino:37:27: error: cannot convert 'Servo' to 'uint8_t {aka unsigned char}' for argument '1' to 'void digitalWrite(uint8_t, uint8_t)'

/tmp/385019048/sensorealarmprovaservo1_quasi_funge/sensorealarmprovaservo1_quasi_funge.ino:41:26: error: cannot convert 'Servo' to 'uint8_t {aka unsigned char}' for argument '1' to 'void digitalWrite(uint8_t, uint8_t)'

exit status 1

Quasi funge :-)
:o

ORSO2001

due premesse...1) qui nel forum stiamo cercando di "eliminare" il termine sketch sostituendolo con "programma" e/o "sorgente"...in quanto sketch è un termine poco corretto.
2) a chi, non vegano o vegetariano, non piace la carbonara!?  :D

detto questo...il codice postato è quello che stai realmente utilizzando o l'hai scritto al volo per il forum?...se fosse la prima..ma ti compila!?
ci sono un po' di errori...hai creato un Oggetto Servo e l'hai chiamato myServo e hai creato una const int myServo...c'è conflitto; una delle due deve essere diversa.
poi nelle varie digitalWrite() usi, al posto di myServo, myservo...l'IDE di arduino è key sensitive...quindi c'è differenza tra le due.
poi non vedo il myServo.attach().
poi hai incluso due volte la libreria (non è un grosso problema).
sistema questo e facci sapere.

docdoc

Oltre alle giustissime indicazioni di Orso, aggiungo anche una cosa: quando qualcosa non funziona, non è che basti dire "non funziona". In che senso "non funziona"? Generalmente oltre a spiegare il proprio obiettivo (e lo hai fatto, anche se non proprio del tutto) sarebbe utile sapere cosa il programma fa che non dovrebbe fare, o cosa non fa che dovrebbe invece fare. Inoltre sarebbe anche interessante sapere di quale modello di servo parli e come è collegato (non è che magari è uno stepper?)

Quindi quel programma, in che senso "non funziona"?
Non compila (come dice Orso)? Se non compila che errori ottieni? Hai cercato di comprenderli?
Se compila, descrivi bene cosa ti aspetti che faccia esattamente, e cosa fa o non fa...
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

gpb01

>Goblin72it :  ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.

Guglielmo
Search is Your friend ... or I am Your enemy !

docdoc

Da montare sulla testa di una bambola e far crepare i passanti, per l'esattezza, e poi cercherò di attaccarci anche il sonoro (ma questa altra storia).
Beh, per prima cosa modifica il tuo post come ti ha chiesto il moderatore (i tag "code").
Poi prova a dare un'occhiata a questo mio Instructable di Halloween... ;)
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

Goblin72it

Beh, per prima cosa modifica il tuo post come ti ha chiesto il moderatore (i tag "code").
Poi prova a dare un'occhiata a questo mio Instructable di Halloween... ;)

Quidi il quick reply usato così va bene??? Hoooo confused un tot, scusate.

Comunque ero certo che qualcuno lo avesse fatto, è proprio lui :-)  ora lo provo e vi faccio sapere, anche se a questo punto vorrei capire del mio accrocchio cosa non "quasifunge"

p.s. ultimo tentativo uso quick reply sperando che non apra nuovi indesiderati post

Goblin72it

Yeeee grazie, funziona perfettamente, ho eliminato un servo e un led e va da dio, grazie ancora.
Se qualcuno ha comunque indicazioni sul perchè non fungeva il mio sono superbene accette.
grazie davvero, anche se mi sa che durante il mio percorso da superpippa a pippa ci vedremo spesso

docdoc

Se qualcuno ha comunque indicazioni sul perchè non fungeva il mio sono superbene accette.
Beh direi perché non usavi il servo come si dovrebbe...
Tu hai inizializzato l'oggetto "myservo" ("Servo myservo;") ma poi dato che hai creato anche una costante con un nome quasi identico ("const int myServo = 11;") per indicare un pin, per cui hai fatto confusione da solo perché poi "myservo" lo usavi come se fosse il pin:

digitalWrite(myservo, HIGH);

Un servo una volta inizializzato (".attach()") lo devi gestire tramite l'oggetto, non più col pin. Quindi fare:

digitalWrite(myservo, HIGH);

non significa nulla, si deve chiamare il metodo write() con i gradi della posizione desiderata:

myservo.write(90);
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

Go Up