Go Down

Topic: Problema di programmazione. (Read 2320 times) previous topic - next topic

ho tentato le vostre soluzioni e non mi funzionava nulla, così mi sono chiesta se il problema non fosse all'origine..
ho provato ad alimentare il sensore da solo e a misurarne l'uscita con un voltimetro, non si muove una mazza! Quindi ora mi sorge il dubbio, era rotto fin dall'inizio?.. ammetto che comunque sia il programma avrà anche i suoi problemi di funzionamento, ma se il sensore non va grazie tante!
che si possa essere rotto durante la saldatura? con un'elevata temperatura? ho letto nel datasheet che può raggiungere i 60°C senza subire danni, e non penso che un saldatore possa far raggiungere tale temperatura se tenuto per pochi secondi sul pin.
devo comprarne uno nuovo!
http://www.sparkfun.com/datasheets/Sensors/Infrared/GP2D120XJ00F_SS.pdf
Neglected emotions lead to catastrophic voyage on the other side.
Gojira

PaoloP

#16
Jan 28, 2013, 10:17 pm Last Edit: Jan 28, 2013, 10:33 pm by PaoloP Reason: 1

non penso che un saldatore possa far raggiungere tale temperatura se tenuto per pochi secondi sul pin.

Ho qualche dubbio in proposito.  :smiley-sweat:

Il sensore funziona a riflessione e ha una distanza massima di 40cm circa.
In base alla superficie riflettente posta a distanza di 30 cm dal sensore dovresti misurare tra i 250 e i 550 mV.

Per il tuo progetto non credo sia il sensore più indicato, sarebbe meglio una barriera a infrarossi, altrimenti devi vestire le persone con strisce rifrangenti.  :smiley-mr-green:



non penso che un saldatore possa far raggiungere tale temperatura se tenuto per pochi secondi sul pin.

Ho qualche dubbio in proposito.  :smiley-sweat:

Il sensore funziona a riflessione e ha una distanza massima di 40cm circa.
In base alla superficie riflettente posta a distanza di 30 cm dal sensore dovresti misurare tra i 250 e i 550 mV.

Per il tuo progetto non credo sia il sensore più indicato, sarebbe meglio una barriera a infrarossi, altrimenti devi vestire le persone con strisce rifrangenti.  :smiley-mr-green:


^^" dafaq....


okok allora, ho trovato un altro sensore uguale nei meandri della mia casa, e ho fatto più attenzione al momento "saldatura" (devo ancora diventarne pratica.. =( )
collegato a basetta e tutto e provato il programma modificato.
FUNZIONA!
e non serve nulla di rifrangente! ^^ ho provato con una mano, una persona, un modellino di macchina (mustang '74 (dettagli a parte)), un foglio di carta, un bicchiere e una macchinetta fotografica...insomma di prove ne ho fatte e funziona
XD
questo è il listato che mi è risultato infine grazie anche ai Serial.println() che ringrazio infinitamente di aver conisgliato, dato che non mi era passato per la testa  :smiley-fat:

Code: [Select]
//APERTURA A PULSANTE E CHIUSURA CON IR

#include <Servo.h>
//#include <DistanceGP2Y0A21YK.h>

//variabili per sensore IR
int pinIR=A1;
int dafaq;

//variabili servo
Servo gate;
int pinGate=3;
int pos=0;

//variabili pulsante
int pinPul=A0;

//settaggi dei pin e de componenti
void setup(){
  pinMode(pinPul, INPUT);//sceglie il pulsante come input nell'uscita A0
  pinMode(pinIR,INPUT);//attacca l'IR al pin A5 in input
}
//disattiva il servo
void detachGate(){
    gate.detach();
}
//setta la posizione inizaile del gate a 90°
void setGatePos(){
    gate.attach(pinGate);
    gate.write(pos);
    delay(1000);
    detachGate();
}
//apre il gate di 90°
void openGate(){
   gate.attach(pinGate);
    for(pos=0;pos<=90;pos++){
     gate.write(pos);
     delay(15);
    }
   detachGate();
}
//chiude il gate facendolo tornare alla posizione di partenza
void closeGate(){
  gate.attach(pinGate);
   for(pos=90;pos>=0;pos--){
    gate.write(pos);
    delay(15);
   }
  detachGate();
}

void loop(){
      setGatePos();

      if (analogRead(pinPul)>900){
openGate();
delay(1000);
        dafaq=analogRead(pinIR);
while(dafaq>3){
  delay(500);
          dafaq=analogRead(pinIR);
    if(dafaq<=3){
               delay(3000);
               closeGate();
    }
}
} //valore max del pulsante = 1023 in attivazione
}


GRAZIE MILLE A TUTTI!!!!!!!!!! ^^ AVETE CONTRIBUITO AD AVANZARE LA MIA MATURITA'.. :smiley-red:  ;)
Neglected emotions lead to catastrophic voyage on the other side.
Gojira

nid69ita

MI piace anche come hai indentato il codice. Ed hai messo un pò di commenti.
Brava. Il codice scritto così è ben leggibile.

my name is IGOR, not AIGOR


MI piace anche come hai indentato il codice. Ed hai messo un pò di commenti.
Brava. Il codice scritto così è ben leggibile.




ti ringrazio!! ^^

si, in effetti al primo postaggio l'ho scopiazzato male (a pezzi per cercare di metterlo apposto) e me lo hanno corretto i moderatori perchè avevo dimenticato il [code/] e l'indentazione è andata un po' a cercare sassi nei campi.. :smiley-roll:
Neglected emotions lead to catastrophic voyage on the other side.
Gojira

PaoloP

Per correggere l'indentazione nell'IDE di Arduino puoi premere CTRL + T.

Riguardo al codice.... ci sono ancora un pò di cose orripilanti.  :smiley-eek-blue:


Per correggere l'indentazione nell'IDE di Arduino puoi premere CTRL + T.

Riguardo al codice.... ci sono ancora un pò di cose orripilanti.  :smiley-eek-blue:


hehehehehe, ok non sarà il masterpiece della programmazione..ma per lo meno so come l'ho fatto dato che sono partita da zero, ed è questo l'importante se me lo chiedono all'esame.
ma cosa c'è di così atroce a tal punto da orripilarti???? D:  :smiley-eek:  :smiley-sad-blue:
Neglected emotions lead to catastrophic voyage on the other side.
Gojira

PaoloP

Il delay dentro il ciclo while.
L'Attach e il Detach continuo del servo.
L'uso di analogRead per la lettura di un pulsante digitale.
Il richiamo nel loop della funzione setGatePos()
La logica un po' contorta del programma. Più lo leggo e meno lo capisco.  :smiley-mr-green: :smiley-mr-green:


Il delay dentro il ciclo while.
L'Attach e il Detach continuo del servo.
L'uso di analogRead per la lettura di un pulsante digitale.
Il richiamo nel loop della funzione setGatePos()
La logica un po' contorta del programma. Più lo leggo e meno lo capisco.  :smiley-mr-green: :smiley-mr-green:



:smiley-roll-sweat: vedrò di correggerlo..
Neglected emotions lead to catastrophic voyage on the other side.
Gojira

La prima cosa che farei e quella di rivedere i tipi delle variabili. Se la variabile conterrà il valore massimo di 255 si usa il tipo byte che è una ridefinizione del tipo char. Se non si prevede che la variabile conterrà valori negativi il tipo deve essere "unsigned", quindi "unsigned byte" indica una variabile di 8 bit senza segno che può contenere il valore massimo 255, se mancasse "unsigned" il massimo valore positivo contenibile sarebbe 127 e 128 negativo. Stessa cosa per int il quale è grande 16 bit.

Il fatto di richiamare una funzione continuamente non è sbagliato, ma se è possibile evitare che venga eseguita anche quando non c'è ne bisogno è meglio.

Facciamo finta che sia io a dover andare dal punto di chiamata fino alla funzione, io devo caricarmi gli argomenti che pesano, entrare nella funzione eseguire codice per accorgermi poi che "pos" vale sempre 100. Se mi costasse così tanto dovere andare io a piedi nella funzione con il carico di argomenti sulle spalle, ci andrei solo se c'è veramente necessità. Putroppo alle volte non c'è alternativo o magari non la si trova, ma quanto meno la si è cercata. :P

Per il discorso del pulsante acquisito tramite un'ingresso analogico anziche digitale il problema non sussiste, l'importante è sapere cosa comporta l'uso di un ingresso digitale (debounce) e come risolvere. Tra le altre cose l'uso di un ingresso analogico permette di collegare più pulsanti usando un solo ingresso, ma se gli ingressi digitali non sono impegnati di solito si usano questi anche per più di un pulsante.

PS: una chiamata a funzione richiede risorse, e queste sono limitate. Di contro l'uso di funzioni rende il codice più leggibile e più semplice da modificare.

Ciao.

AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

leo72


La prima cosa che farei e quella di rivedere i tipi delle variabili. Se la variabile conterrà il valore massimo di 255 si usa il tipo byte che è una ridefinizione del tipo char. Se non si prevede che la variabile conterrà valori negativi il tipo deve essere "unsigned", quindi "unsigned byte" indica una variabile di 8 bit senza segno che può contenere il valore massimo 255, se mancasse "unsigned" il massimo valore positivo contenibile sarebbe 127 e 128 negativo. Stessa cosa per int il quale è grande 16 bit.

Attento Mauro, che su Arduino "byte" è un alias per unsigned char. Quindi con byte già si dichiara un char di tipo senza segno capace di memorizzare un valore da 0 a 255.
Invece per int (e long) vale il dover usare unsigned se non si vogliono i valori negativi.




La prima cosa che farei e quella di rivedere i tipi delle variabili. Se la variabile conterrà il valore massimo di 255 si usa il tipo byte che è una ridefinizione del tipo char. Se non si prevede che la variabile conterrà valori negativi il tipo deve essere "unsigned", quindi "unsigned byte" indica una variabile di 8 bit senza segno che può contenere il valore massimo 255, se mancasse "unsigned" il massimo valore positivo contenibile sarebbe 127 e 128 negativo. Stessa cosa per int il quale è grande 16 bit.

Attento Mauro, che su Arduino "byte" è un alias per unsigned char. Quindi con byte già si dichiara un char di tipo senza segno capace di memorizzare un valore da 0 a 255.
Invece per int (e long) vale il dover usare unsigned se non si vogliono i valori negativi.




Verissimo, errore mio derivato dal fatto che da tanto tempo non uso più il core arduino, ma solo avr-libc e compilo sorgete C, anziché C++.

Visto che ci siamo, quello che segue è un estratto del file header Arduino.h:

Code: [Select]

typedef unsigned int word;

#define bit(b) (1UL << (b))

typedef uint8_t boolean;
typedef uint8_t byte;


Dove si vede che il tipo word in realtà è unsigned int, e byte usa un altro tipo ridefinito "uint8_t" al posto di "unsigned char", quindi scrivere "word parola;", "uint16_t parola;" ha lo stesso risultato di scrivere "unsigned int parola;"

Ciao.
AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

Go Up