Endstop ottico cavo lungo

Salve a tutti,
ho aperto un nuovo topic in quanto malgrado molti parlino di endstop, io ho bisogno di un consiglio per un endstop situato a circa 8/9 metri dalla scheda Arduino. Si tratta di un endstop ottico su un rotore d'antenna. Il cavo che porta alimentazione e segnale é un buon cavo schermato.
I motori non hanno problemi, mentre i due endstop quando passa la linguetta che interrompe il fascio di luce, ha il led che non si spegne completamente ma rimane fioco. L'Arduino non lo sente malgrado arrivino 4,9V invece dei canonici 5V.... C'é modo di far bastare il voltaggio? Il pin é impostato come INPUT, PULLUP. Oppure devo per forza mettere un transistor o un piccolo relé?
Grazie mille per ogni info

No scusa fammi capire ... tu vuoi rilevare un livello HIGH (parli di 4.9V che sono più che sufficienti), ma imposti il pin INPUT_PULLUP ? ? ?

Con INPUT_PULLUP il pin è SEMPRE a livello HIGH e quindi NON lo sentirà mai ... se vuoi rilevare un livello HIGH devi tenere normalmente il pin normalmente a LOW, con una resistenza esterna di pull-down e dichiarare il pin solo INPUT.

Piuttosto sei sicuro che devi vedere quando il segnale è HIGH e non quando il segnale va LOW ? Perché, in tal caso, andrebbe bene INPUT_PULLUP che tiene il pin sempre HIGH sino a quando qualcuno da fuori lo porta LOW.

Guglielmo

Grazie Guglielmo per la risposta.
Allora, lo sketch ha, nelle impostazioni, la possibilitá di selezionare se considerare punto 0 quando il pin é LOW, o quando é HIGH. Io ho dovuto selezionare HIGH in quanto l'endstop ottico quando il fascio é interrotto dal pin Signal da fuori 5V. La cosa strana é che se collego l'endostop alla scheda con il suo cavetto corto, funziona tutto, ma con in mezzo il cavo lungo, oltre a non funzionare, il led onboard all'endstop non si spegne ma rimane fioco... mentre invece dovrebbe spegnersi. Col cavetto corto tutto funziona.
Grazie

... perdona, ma come la descrivi NON è possibile!

Un pin dichiarato INPUT_PULLUP è per definizione a livello HIGH e quindi, capisci da solo, NON può rilevare un livello HIGH dato che sta già in HIGH, quindi, se tu hai selezionato che il sensore da HIGH ... qualcuno questo pin lo deve tenere LOW quando non c'è il segnale.

Io credo che NON serva imporre INPUT_PULLUP, ma solo INPUT e che il sensore sia lui a dare LOW ed HIGH, ma, se così non fosse e quel sensore da solo HIGH o alta impedenza, qualcuno deve tenere il pin normalmente LOW e quindi occorre una resistenza, diciamo da 10K, verso GND.

Di che sensore ottico stiamo parlando e fai uno schema di come lo hai connesso ...

Guglielmo

La stessa cosa che ho pensato io... non sono certo un esperto di Arduino peró ho fatto molti progetti in cui su un pin impostato come INPUT quando arrivano i 5V vengono rivelati e parte il processo... Il sensore é il solito cinese che si monta dappertutto, nelle stampanti 3d per eccellenza. Ha tre pin, VCC, GND e SIGNAL, quando si interrompe il flusso ottico sul pin SIGNAL ci sono 5V. Ma quello che non capisco é perché col cavo corto va e con quello lungo no... I collegamenti sono giusti. Ho due di questi rotori autocostruiti ed entrambi hanno questo problema....
Grazie

Se vuoi posso allegare lo sketch... non voglio che mi risolvi tu il problema ma magari capisci sicuramente qualcosa che a me sfugge.....

Programma e schema elettrico esatto dei collegamenti :wink:

Guglielmo

Il problema è che con il cavo lungo o corto devi usare INPUT e collegare una R10k tra il pin e GND e questo è certo e insindacabile. Il resto è solo di impiccio. Prova lo schema con un pulsante collegato tra 5V e pin e tra pin e GND una R10k con pinMode INPUT e potrai constatare di persona.

Ciao,

Grazie Maurotec, avevo letto qualcosa del genere..... Mi ricordate come inserire lo sketch per piacere? Frequento alcuni forum e ognuno ha il suo modo...... Grazie mille

stepper_motor_controllerNANO.zip (14.6 KB)
Ecco qua lo sketch completo mi scuso ma non avevo winzip e il forum non vede 7zip.


Ho inserito le due resistenze ma non cambia nulla.... Se avete modo di dare un'occhiata allo sketch mi fareste un favore. Grazie

Il codice è molto complesso. Hai scritto tu il codice o esiste un link al progetto.
La classe endstop è ambigua e la posto così che altri possano commentare.

/*!
* @file endstop.h
*
* It is a driver for end-stops, mechanical, optical, magnetic etc.
*
* Licensed under the GPLv3
*
*/

#ifndef ENDSTOP_H_
#define ENDSTOP_H_

/**************************************************************************/
/*!
    @brief    Class that functions for interacting with end-stop.
    @param    pin
              Set the arduino pin
    @param    default_state
              Set the default state of end-stop HIGH or LOW
*/
/**************************************************************************/
class endstop {
public:

    endstop(uint8_t pin, bool default_state) {
        _pin = pin;
        _default_state = default_state;
    }

    /**************************************************************************/
    /*!
        @brief    Initialize the Input pin for end-stop
    */
    /**************************************************************************/
    void init() {
        pinMode(_pin, INPUT_PULLUP);
    }

    /**************************************************************************/
    /*!
        @brief    Get the state of end-stop
        @return   True if end-stop is triggered
    */
    /**************************************************************************/
    bool get_state() {
        if (digitalRead(_pin) == _default_state)
            return true;
        else
            return false;
    }

private:
    uint8_t _pin;
    bool _default_state;
};

#endif /* ENDSTOP_H_ */

potrebbe bastare questa modifca nel metodo getState():

 if (digitalRead(_pin) != _default_state)

C'è da capire cosa intende per DEFAULT_HOME_STATE; per me home sta per casa e potrebbe indicare lo stato del sensore quando è interrotto il "flusso". Da capire se home è riferito alla posizione del rotore?

#define DEFAULT_HOME_STATE HIGH  ///< Change to LOW according to Home sensor

Ma come vedi anche il metodi init() non è flessibile in quanto configura il pin con la pull-up.

Ciao.

Grazie mille... No, non l'ho scritto io. Io l'ho solo modificato sui pin dei motori per adattarlo all'Arduino Nano, ma il problema lo avevo anche sull'Arduino Uno per il quale é stato scritto lo sketch.
Questo sketch viene dal sito ufficiale della Satnogs.
https://wiki.satnogs.org/SatNOGS_Arduino_Uno/CNC_Shield_Based_Rotator_Controller
Vorrei peró insistere sul fatto che se collego i due sensori ottici alla scheda con i fili corti, funziona tutto.

Mi scuso maurotec e spiego lo scopo dell'endstop....
Si tratta di un rotore d'antenna azimuth/elevazione che "insegue" i satelliti selezionati.
Gli endstop servono per posizionare il rotore a 0 gradi di elevazione e Nord (o Sud a scelta) di azimuth all'avvio dell'Arduino. Quando Arduino parte, i motori si muovono cercando lo zero oppure stanno fermi se il rotore é giá a zero "ascoltando" i due pin ai quali sono collegati i due sensori.... un po come gli endstop delle stampanti 3d o delle macchine cnc.

ma gli endstop quali sono ?


Sono questi.
Grazie

gli endstop in genere funzionano al contrario di quello che dici. Ovvero quando il contatto è chiuso l'uscita va a GND

Quindi le resistenze vanno collegate al +5V

Non in questo caso. Quando il fascio di luce viene interrotto, dal pin Signal dell'endstop escono 5V. Poi data la lunghezza del cavo all'Arduino ne arrivano 4,9.

... che NON ha alcuna importanza, sempre HIGH viene letto. Fai riferimento a QUESTO mio post per capire che valore è LOW e che valore è HIGH.

Guglielmo