Pages: [1] 2 3 ... 5   Go Down
Author Topic: pinMode IN/OUT  (Read 2341 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 72
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Buonasera a tutti,
ho una piccola domanda, ho messo su un piccolo progetto con dei sensori capacitivi che attivano e disattivano dei relè. Gli stessi relè possono essere attivati anche via software, attraverso la seriale, con un client in java che comunica quale relè attivare e disattivare. A questo punto, tutte le volte che interagisco con un relè via software, vorrei poter cambiare anche lo stato del sensore capacitivo.
Per intenderci:

1. Tocco il sensore (toggle): lo stato del sensore capacitivo è in HIGH, lo stato del relè è in HIGH
2. Disattivo il medesimo relè via software: lo stato del sensore capacitivo è in HIGH, lo stato del relè è in LOW

Io vorrei poter impostare anche il sensore capacitivo in LOW.

 Purtroppo, considerando che in setup() stabilisco che il sensore capacitivo è di INPUT, questo non mi permette di cambiare stato al sensore via software.
Esiste una sorta di dichiarazione IN/OUT per i pin digitali? oppure cosa mi consigliate? non so dove sbattere la testa

grazie sempre
Logged

Switzerland
Online Online
Faraday Member
**
Karma: 114
Posts: 5986
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Scusa che senso ha "cambiare lo stato del sensore capacitivo" ???  smiley-eek smiley-eek smiley-eek

Non stai mica parlando di un interruttore bistabile ...  smiley-roll

Il sensore capacitivo ti dice solo che qualcuno ha toccato il sensore e che tu devi commutare il relè, ma lo stato del relè tu lo conserverai in una variabile ... quindi aggiorna quella e basta no ?

Guglielmo
Logged

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

Offline Offline
Jr. Member
**
Karma: 0
Posts: 72
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Scusa che senso ha "cambiare lo stato del sensore capacitivo" ???  smiley-eek smiley-eek smiley-eek

Non stai mica parlando di un interruttore bistabile ...  smiley-roll

Il sensore capacitivo ti dice solo che qualcuno ha toccato il sensore e che tu devi commutare il relè, ma lo stato del relè tu lo conserverai in una variabile ... quindi aggiorna quella e basta no ?

Guglielmo

Proprio perché è bistabile il problema si presenta (http://www.robot-italy.com/it/standalone-toggle-capacitive-touch-sensor-breakout-at42qt1012.html)
Logged

Switzerland
Online Online
Faraday Member
**
Karma: 114
Posts: 5986
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ma quello è un interruttore bistabile ... indipendentemente che sia capacitivo o meccanico ...
... per come avevi posto la domanda uno pensava che tu avessi un capacitivo collegato ad Arduino !!!

Con quello credo che hai poco da fare non mi sembra abbia "ingressi di comando da SW" ... è come chiedere come da software spostare un interruttore meccanico ...  smiley-roll

Guglielmo

P.S. : Se dovevi fare una cosa come quella che descrivi, perdona, ma ... hai sbagliato progetto e scelto i sensori errati !
I relè li dovevi gestire sempre e solo da SW e da SW dovevi leggere dei veri sensori capacitivi ...
Logged

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

italy
Offline Offline
Sr. Member
****
Karma: 6
Posts: 313
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Rispondo da profano, visto che quello che hai è, come dice Guglielmo, un switch bistabile alla fine, e visto che ormai c'è l'hai, perchè non trattarlo come se fosse un normale pulsante e lavorare con una variabile che cambia stato, 1 tocco, accende, 1 tocco spegne, da seriale la stessa cosa.  Unico neo, credo, il led del pulsante che resta acceso magari mentre lo fai spegnere da seriale e questo non è molto bello (più per altro, perché potrebbe trarre in inganno dello stato del switch rispetto a quello del Relè).
E se usassi un normale pulsante ? (se il led è necessario, lo attivi mediante lo stesso pin del relè con le dovute protezioni per le correnti di ritorno (diodo e resistenza se non ricordo male )...
Logged

"The only way to do great work is to love what you do. If you haven’t found it yet, keep looking. Don’t settle" - Steve Jobs

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 271
Posts: 21871
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Saebbe piú semplice usare un pulsatnte capacitivo e un un sensore capacitivo con funzionalitá di interuttore bistabile.
Definisci una variabile che quando é HIGH inverte la lettura del interuttore capacitivo. Questa variabile la setti im modo da avere il settaggio voluto del relé quandi lo comandi via Software.

Interuttore a LOW. Setti via PC il relé  attivi la negazione del input Interuttore.

Code:
boolean interuttore = 0;  // stato interuttore capacitivo
boolean inverti =0;   
boolean Rele =0;   // stato relé ; uscita
boolean software =0; // stato del comando Software.
boolean softwareold =0; // variabile per reagire solo ai cambi di stato del Interuttore e del comando Software.
boolean interuttoreold = 0;  // variabile per reagire solo ai cambi di stato del Interuttore e del comando Software.
boolean modificamanuale=0; // variabile per segnare

loop() {
interuttore = digitalread(pinInteruttore);
leggi comando da software;

if(software != softwareold)     // solo in caso di cambiament stato ; accende o spegne il rele
{
if (software ==HIGH && Rele ==HIGH) inverti =0;  // non invertire
if (software ==LOW && Rele ==LOW) inverti =0;  // non invertire
if (software ==HIGH && Rele ==LOW) inverti =1;  //  invertire
if (software ==LOW && Rele ==HIGH) inverti =1;  //  invertire
}

if(interuttore != interuttoreold || software != softwareold)
{
if (interuttore ==HIGH && inverti ==0)
   {
   digitalWrite( pinRele, HIGH );
   Rele =HIGH;
   }
if (interuttore ==LOW && inverti ==0)
   {
   digitalWrite( pinRele, LOW );
   Rele =LOW;
   }
if (interuttore ==HIGH && inverti ==1)
   {
   digitalWrite( pinRele, LOW );
   Rele =LOW;
   }

if (interuttore ==LOW && inverti ==1)   
   {
   digitalWrite( pinRele, HIGH );
   Rele =HIGH;
   }
softwareold = software;
interuttoreold = interuttore;
}
}

Si puó facilmente condensare il codice ma ho voluto scriverlo cosí esteso per far capire il funzionamento.

Ciao Uwe
Logged

Switzerland
Online Online
Faraday Member
**
Karma: 114
Posts: 5986
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hiper, Uwe ... sento da qui lo stridio delle vostre unghie sul vetro mentre cercate di arrampicarvi sugli specchi ...  smiley-mr-green smiley-lol smiley-mr-green smiley-lol smiley-mr-green

Che a questo mondo qualsiasi porcheria si possa fare, va bene, ma di base c'è ... che NON è quello il sensore capacitivo che andava usato ... la stessa robot-italy ne vende uno identico ma monostrabile ... lo tocchi, commuta, lo lasci ricommuta, il che sarebbe l'ideale per dire al SW che vuoi cambiare stato ... smiley-wink

Poi, ripeto ... tutto si può usare ... MALE ...  smiley-razz smiley-razz smiley-razz

Guglielmo
Logged

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

italy
Offline Offline
Sr. Member
****
Karma: 6
Posts: 313
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Non vi scaldate per favore!! smiley-sweat  io da profano in materia mi arrangio con quello che ho, se poi non è quello che mi serve e serve BENE, allora accantono tutto e riparto da capo e prendo quello che mi serve, purtroppo senza una scuola dietro (essendo autodidatta in tutto, elettronica e programmazione) mi baso molto sul Try & Error.  Come si dice, di necessità virtù.  Ovviamente ,poi, mi escono delle C£$&!!te pazzesche! come diceva un noto comico smiley-mr-green

io avrei usato un volgare  e silvestre pulsante dal valore di 20 Centesimi (se lo tocchi con un guanto alle dita funziona, con un capacitivo lo dubito e poi, il costo fa il resto...)
« Last Edit: April 06, 2014, 03:45:32 am by hiperformance71 » Logged

"The only way to do great work is to love what you do. If you haven’t found it yet, keep looking. Don’t settle" - Steve Jobs

Offline Offline
Jr. Member
**
Karma: 0
Posts: 72
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie ragazzi per i vostri consigli...

@hiperformance71
Volendo potrei anche usare il toggle come un pulsante monostabile e per quanto riguarda il LED si può anche disattivare tagliando un jumper, perciò il problema non si pone. Però non mi piace dover usare qualcosa che lavora in un certo modo e adattarlo per un altro scopo.
gpb01 ha ragione

@gpb01
Per quanto riguarda il monostabile, ho comprato anche quello su robot-italy e li ho entrambi, sia i bistabili che monostabili. Preferivo i bistabili perché mi risparmiavano un po di codice, sopratutto se i pulsanti da gestire sono 8.
Ma considerando che sn ancora all'inizio del progetto, posso ancora cambiare le carte in tavola.
Nella documentazione ufficiale ho trovato un codice che potrebbe fare al caso mio http://arduino.cc/en/Tutorial/Debounce. Il problema, ripeto, è che dovrei gestire 8 pulsanti.
Ho replicato il codice del link convertendo tutte le variabili in array e mettendo tutto su un ciclo for ma ho dei problemi:
Toccando un sensore monostabile si accende sia il relè associato che anche un'altro relè al quale non è collegato alcun sensore.
Come potete vedere dal codice, dal 22 al 29 sono i pin dedicati ai relè, dal 32 al 39 sono i pin dedicati ai sensori.
Ad esempio... se tocco il sensore 32 si accende il relè 22 e anche il 23 se al 23 non è collegato un sensore.
Non riesco a capire dove sbaglio.

Grazie sempre per il vostro prezioso aiuto

Code:
const int nPin = 8;

int LEDstate[100];
int buttonState[100];
int lastButtonState[100];

long lastDebounceTime[100];
long debounceDelay[100];
 
void setup()
{
  Serial.begin(9600);
  for(int x=22; x<22+nPin; x++){
    pinMode(x, OUTPUT);
    digitalWrite(x, HIGH);
    pinMode(x+10, INPUT);
  }
 
  for(int j=32; j<32+nPin; j++){
    LEDstate[j]         = HIGH;
    lastButtonState[j]  = LOW;
    lastDebounceTime[j] = 0;
    debounceDelay[j]    = 50;
  }
 
}
 
void loop()
{
 
  for(int x=22; x<22+nPin; x++){

    int inX = 10+x;
   
    // read the state of the switch into a local variable:
    int reading = digitalRead(inX);
 
    // check to see if you just pressed the button
    // (i.e. the input went from LOW to HIGH),  and you've waited
    // long enough since the last press to ignore any noise: 
 
    // If the switch changed, due to noise or pressing:
    if (reading != lastButtonState[inX]) {
      // reset the debouncing timer
      lastDebounceTime[inX] = millis();
    }
   
    if ((millis() - lastDebounceTime[inX]) > debounceDelay[inX]) {
      // whatever the reading is at, it's been there for longer
      // than the debounce delay, so take it as the actual current state:
 
      // if the button state has changed:
      if (reading != buttonState[inX]) {
        buttonState[inX] = reading;
 
        // only toggle the LED if the new button state is HIGH
        if (buttonState[inX] == HIGH) {
          LEDstate[inX] = !LEDstate[inX];
        }
      }
    }
    // set the LED:
    digitalWrite(x, LEDstate[inX]);
 
    // save the reading.  Next time through the loop,
    // it'll be the lastButtonState:
    lastButtonState[inX] = reading;
   
  }
 
}
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 72
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

avete mai provato librerie come questa https://github.com/c9jester/ToggleButton? che dite, vale la pena utilizzare soluzioni simili?
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 72
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ho creato anche una libreria basata sull'esempio http://arduino.cc/en/Tutorial/Debounce, in questo modo mi viene più semplice tenere pulito il codice creando un istanza della classe per pin che voglio utilizzare.

ne posto il codice che può essere utile anche a qualcun altro:

ClickButton.h
Code:
#ifndef ClickButton_H
#define ClickButton_H

#if (ARDUINO <  100)
#include <WProgram.h>
#else
#include <Arduino.h>
#endif


#define CLICKBTN_PULLUP HIGH


class ClickButton
{
  public:
    ClickButton();
    void setPin(uint8_t buttonPin, uint8_t ledPin);
    void Update();
    int buttonPin;    // the number of the pushbutton pin
    int ledPin;      // the number of the LED pin

    int ledState;         // the current state of the output pin
    int buttonState;             // the current reading from the input pin
    int lastButtonState;   // the previous reading from the input pin

    // the following variables are long's because the time, measured in miliseconds,
    // will quickly become a bigger number than can be stored in an int.
    long lastDebounceTime;  // the last time the output pin was toggled
    long debounceDelay;    // the debounce time; increase if the output flickers
};

#endif



ClickButton.cpp
Code:
#include "ClickButton.h"

ClickButton::ClickButton()
{
  ledState = HIGH;         // the current state of the output pin
  buttonState;             // the current reading from the input pin
  lastButtonState = LOW;   // the previous reading from the input pin

  // the following variables are long's because the time, measured in miliseconds,
  // will quickly become a bigger number than can be stored in an int.
  lastDebounceTime = 0;  // the last time the output pin was toggled
  debounceDelay = 50;    // the debounce time; increase if the output flickers
  buttonPin;
  ledPin;
}

void ClickButton::setPin(uint8_t buttonPini, uint8_t ledPini)
{
  buttonPin = buttonPini;
  ledPin = ledPini;
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);

  // set initial LED state
  digitalWrite(ledPin, ledState);
}

void ClickButton::Update()
{

// read the state of the switch into a local variable:
  int reading = digitalRead(buttonPin);
  Serial.println(reading);
  // check to see if you just pressed the button
  // (i.e. the input went from LOW to HIGH),  and you've waited
  // long enough since the last press to ignore any noise: 

  // If the switch changed, due to noise or pressing:
  if (reading != lastButtonState) {
    // reset the debouncing timer
    lastDebounceTime = millis();
  }
 
  if ((millis() - lastDebounceTime) > debounceDelay) {
    // whatever the reading is at, it's been there for longer
    // than the debounce delay, so take it as the actual current state:

    // if the button state has changed:
    if (reading != buttonState) {
      buttonState = reading;

      // only toggle the LED if the new button state is HIGH
      if (buttonState == HIGH) {
        ledState = !ledState;
      }
    }
  }
 
  // set the LED:
  digitalWrite(ledPin, ledState);

  // save the reading.  Next time through the loop,
  // it'll be the lastButtonState:
  lastButtonState = reading;

}

Come richiamare le istanze
Code:
#include "ClickButton.h"
ClickButton button1;
ClickButton button2;

void setup()
{
 
  button1.setPin(32, 22); //primo pin è quello del pulsante (INPUT), il secondo è quello del relè (OUPUT)
  button2.setPin(38, 28);

}

void loop()
{
  // Update button state 
  button1.Update();
  button2.Update();
}

Il problema che si presenta, comunque, è sempre lo stesso dell'esempio precendente:

Toccando un sensore monostabile si accende sia il relè associato che anche un'altro relè al quale non è collegato alcun sensore.  non riesco a capire per quale motivo.
Qualcuno che abbia idea di quale possa essere il problema?
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 72
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Nessuno che possa aiutarmi?
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 72
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho eseguito un paio di test e sembrerebbe che ci sia una sorta di ritorno di corrente verso i sensori monostabili quando i relè sono collegati ad arduino. Per fare un semplice test, ho inizializzato 4 relè e 4 sensori monostabili

Code:
void setup(){
 //Relè
  pinMode(22, OUTPUT);
  digitalWrite(22, LOW);
  pinMode(23, OUTPUT);
  digitalWrite(23, LOW);
  pinMode(24, OUTPUT);
  digitalWrite(24, LOW);
  pinMode(25, OUTPUT);
  digitalWrite(25, LOW);

  //Sensori
  pinMode(32, INPUT);
  digitalWrite(32, LOW);
  pinMode(33, INPUT);
  digitalWrite(33, LOW);
  pinMode(34, INPUT);
  digitalWrite(34, LOW);
  pinMode(35, INPUT);
  digitalWrite(35, LOW);

}

Inizializzando Arduino soltanto con il codice che ho postato, i relè si eccitano (relè a logica negata) e, molto spesso, si accendono anche i LED dei sensori monostabili (Generalmente il LED del monostabile si accende soltanto se viene toccato). I sensori sono collegati a dei PIN che ho dichiarato di INPUT e ciò non dovrebbe accadere... inoltre, nelle volte in cui non si accendono da soli, se tocco i sensori è come se si incantassero, cioè toccandoli restano accesi e ci rimangono oppure altri si spengono dopo qualche secondo.
Se rilancio il tutto senza relè collegati i sensori funzionano regolarmente e non si incantano mai. Quello che penso è che ci sia una specie di ritorno di corrente sui sensori da parte dei relè o qualcosa di simile.
Ho provato anche a mettere, sul pin di ogni sensori, una resistenza da 10kohm per evitare che ci sia corrente in entrata sul sensore ma il problema si presenta comunque.

Secondo voi cosa potrebbe essere.


Logged

italy
Offline Offline
Sr. Member
****
Karma: 6
Posts: 313
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ma i relè come li attivi? direttamente da arduino no! meglio farlo attraverso un Mosfet o anche un darlington tipo UNL2003, se usi un Mosfet, devi anche collegare un diodo per eliminare le correnti di flyback del relè quando viene diseccitato.
Logged

"The only way to do great work is to love what you do. If you haven’t found it yet, keep looking. Don’t settle" - Steve Jobs

Offline Offline
Jr. Member
**
Karma: 0
Posts: 72
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

grazie mille per il tuo aiuto smiley, purtroppo non sono molto ferrato in elettronica e mi sto arrangiando documentandomi in rete... Per un niubbo, quando nascono intoppi di questo tipo, non si sa cosa cercare nello specifico e ci si ferma spiazzati... Anche un piccolo consiglio, come quello che mi hai dato, può essere di grande aiuto per avere qualcosa da cui ripartire e potersi documentare smiley. Ritornando al problema....  Si in effetti al momento li attivo tramite arduino ma avevo in mente di alimentarli esternamente ad arduino... Scusa l'ignoranza della domanda, come dovrei collegare i MOSFET? Ti sarei grato se riuscissi a darmi una mano con delle piccole indicazioni o qualche link da seguire, mi sono bloccato su questo problema e non ho la più pallida idea di come procedere
Io ho un alimentatore da 5v 3A che avevo pensato di utilizzare per alimentare sensori e relè (e successivamente anche altro), in modo da renderli indipendenti da arcuino.

grazie ancora per il tuo aiuto
Logged

Pages: [1] 2 3 ... 5   Go Up
Jump to: