giovedì 31 luglio 2014

Parcheggio: Aggancio/Sgancio

Carroponte su casella x=F; y=6
Centralina MZ1= ON; pistoni Giù.
I pistoni ruotano su se stessi.
4 microswitch PZ2, normalmente aperti ed in serie segnalano la corretta rotazione dei quattro pistoni.
Centralina MZ1= OFF; pistoni su.

SICUREZZA:
1- se i quattro pulsanti normalmenti aperti PZ2 sono chiusi tutti i perni dei pistoni sono ruotati all'esterno.La macchina non è agganciata.
2- Se i quattro pulsanti normalmenti aperti PZ1 sono chiusi tutti i perni dei pistoni sono ruotati all'interno(sotto l'auto).La macchina è agganciata.
Quindi:


Parcheggio:Prelievo auto.




Il tagliando viene inserito in un lettore di codice a barra.

mercoledì 30 luglio 2014

Parcheggio: Deposito auto

Un parcheggio sotterraneo con alcuni posti auto ancora liberi. Si accede dalla rampa a destra e si posiziona l'auto nella casella F6.
Il carroponte è fermo nella pozione M6.

La pedana, ruotando su se stessa, posizione l'auto pronta per essere imbragata.
L'operatore individua un parcheggio vuoto sul monitor touch screen.
I parcheggi vuoti hanno la fotoresistenza (a pavimento)illuminata dalla luce del garage. Quelle occupate sono oscurate dall'auto.
L'operatore preme il pulsante sul monitor touch screen di una casella vuota seguita dalla pressione del pulsante START

Il carroponte si posiziona in M6.
Dei pistoni abbassano delle leve a forma di T rovesciata.
I pistoni ruotano, le quattro T rovesciate si trovano ora sotto la carrozzeria.
Dei microswitch segnalano l'avvenuta rotazione.

.

I pistoni si abbassano, ruotano, si risollevano.
Il carroponte torna nella casella iniziale M6.
E'stata stampata




Telecomando IR parte 2



Arduino legge il valore del treno di impulsi del tasto premuto sul pin 7. Se il valore corrisponede a quello del tasto 1 eccita un relè, se al tasto 2 lo diseccita.
Perchè si antepone 0x prima della cifra decimale non lo so.

    /* Si sottopone a condizione if la lettura
       esadecimale dei tasti anteponendo al valore
       HEX il valore 0x. Nello sketch:
       Relè = OFF
       Tasto 1 premuto FF30CF = Relè ON
       Tasto 2 premuto FF18E7= Relè OFF      */
     
       #include <IRremote.h> 
       
       # define RELE 6
       
       int receiver = 7; 
      
       IRrecv irrecv(receiver); 
      
      decode_results results;
    
      void setup()
          { Serial.begin(9600); 
            irrecv.enableIRIn(); 
            pinMode(RELE, OUTPUT);
            digitalWrite(RELE,LOW); }
          
          
      void loop(){
      
         if ( irrecv.decode(&results)) 
            { Serial.println(results.value, HEX); 
              irrecv.resume();                  } 
         
         if ( results.value == 0xFF30CF)
            { digitalWrite(RELE, HIGH);    } 
            
         if ( results.value == 0xFF18E7)
            { digitalWrite(RELE, LOW);    } 
               
    }





Telecomando IR parte 1



La pressione di uno dei tanti tasti di un telecomando cra un treno di impulsi unico. Arduino rileva questi dati attraverso un fotodiodo ricevente ad infrarossi,lo elabora
con una apposita libreria e ne stampa il valore in formato HEX sull'IDE di Arduino.
Gli impulsi vengono rilevati dal pin 7

     
       #include <IRremote.h> 
      
       int receiver = 7; 
      
       IRrecv irrecv(receiver); 
      
      decode_results results;
    
    void setup()
       
        { Serial.begin(9600); 
          irrecv.enableIRIn(); }
          
          
    void loop(){
         if (irrecv.decode(&results)) 
            { Serial.println(results.value, HEX); 
              irrecv.resume();                   } }



Si riporta il valore esadecimale in una tabella.Del telecomando in figura ho rilevato e riportato solo i tasti da 0 a 9.

sabato 26 luglio 2014

Termostato con LM335


Il datasheet del LM335 da cui sono state estratte le immagini, riporta una tensione di alimentazione compresa fra +5V e +40V.
Usando il sensore con Arduino tanto la tensione di alimentazioni quanto il valore della resistenza e del potenziometro si riducono di 1/3: Vcc= +5V; R= 4 Kohm (valore standard 3,9 Kohm; potenziometro = 3,3 Kohm o valori simili.


In questa tabella è evidenziato che a 25°C la tensione di uscita è di 2,98 V e che in assenza del potenziometro di taratura l'errore di lettura può oscillare fra i 2 ed i 4 gradi.



A 25°C la tensione analogica di A0 è di 2,98V con un rapporto di 2,98 / 25 = 0,1192.
Tale rapporto, essendo il dispositivo lineare, è uguale per tutti i valori di tensione.
Alla tensione di ingresso di 2,98V corrisponde, posto 0V = 0 bit e 5V=1023bit, un valore di 610 bit ed il valore 610 è ciò che si legge su display LCD o sull'IDE di Arduino. Il rapporto

C° = 25
Vin = 2,98 V
Vin / °C = 0,1192
bit = (+Vin * 1023) / +Vcc
bit = 2,98 * 1023 / 5 = 2,98 * 204,6 = 610

Il valore su seriale, espresso in bit, può quindi essere semplificato con la formula:

b>bit = +Vin * 204,6

Il rapporto gradi °C / bit, uguale per tutti i valori di tensione (il dispositivo è lineare) è:

25 : 204,6 = 0,040983606

La formula diretta da inserie nello sketch sarà sunque semplificata a:

°C= +Vin * 0,040983606



Con le formule inverse si costruisce la seconda tabella dove viene evidenziato che il valore massimo di temperatura è poco meno di 42°C.

Lo scketch che segue permette, con il raffronto con un sensore DHT11 la taratura del LM335

 /* Si confrantano fra loro tre sensori di
    temperatura.
    Il sensore DHT11  pin 2
    Il sensore LM335  pin A0 */
 
    #include <dht11.h>
   
    #define DHT11        2
    #define LM335       A0
   
    dht11 ValoreDHT11; 
  
     
    float clsiusLM335      =0;
    
   void setup()
         { pinMode(LM335, INPUT);    
           Serial.begin(9600);    }
 
   void loop(){
 
       ValoreDHT11.read(DHT11);
       float celsiusDHT =ValoreDHT11.temperature;
      
       clsiusLM335 = analogRead(LM335) *0.040983606 ;    
       
       Serial.println("\n");
       Serial.print("DHT11 Celsius  ");
       Serial.println(celsiusDHT);
       Serial.print("LM335 Celsius: ");
       Serial.println(clsiusLM335);

        
     delay(5000); }




domenica 20 luglio 2014

Pulsantiera su un solo ingresso.


NOTA
Nel listato che segue le resistenze non hanno il valore di cui sopra. Esso si riferisce alla shield LCD della DFRobat con pulsanti.

/*
Una serie di 5 resistenze fanno capo al pin A0.
5 Pulsanti, ciascuno ad ogni pressione cortocircuita una o
più resistenze variando il valore di tensione su A0.

*/
    #include <LiquidCrystal.h>
    
    LiquidCrystal lcd(8, 9, 10, 11, 12, 13);
    
    # define Pulsanti  A0  
    
    long Value=   0;
 
    
    void setup()  
    {  pinMode(Pulsanti, INPUT);    
       lcd.begin(16, 2);       
       Serial.begin(9600);      } 
       
    void loop() {
      
      Value = analogRead(Pulsanti);
       
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("VALUE");
        lcd.setCursor(12, 0);
        lcd.print(Value);
        Serial.print("VALUE  ");
        Serial.println(Value);
    
      if (Value >1020) 
           {lcd.setCursor(13, 0);
            lcd.setCursor(0, 1);
            lcd.print("TASTI OFF "); 
            Serial.print("TASTI OFF  ");  }
      
      if (Value >=0 && Value <=20) 
           {lcd.setCursor(13, 0);
            lcd.setCursor(0, 1);
            lcd.print("TASTI UNO"); 
            Serial.print("TASTI UNO");  }  
            
       if (Value >=90 && Value <=110) 
           {lcd.setCursor(13, 0);
            lcd.setCursor(0, 1);
            lcd.print("TASTO DUE"); 
            Serial.print("TASTO DUE");  }    
   
        if (Value >=240 && Value <=265) 
           {lcd.setCursor(13, 0);
            lcd.setCursor(0, 1);
            lcd.print("TASTO TRE"); 
            Serial.print("TASTO TRE");  }
            
        if (Value >=390 && Value <=415) 
           {lcd.setCursor(13, 0);
            lcd.setCursor(0, 1);
            lcd.print("TASTO QUATTRO"); 
            Serial.print("TASTO QUATTRO");  } 
            
        if (Value >=600 && Value <=700) 
           {lcd.setCursor(13, 0);
            lcd.setCursor(0, 1);
            lcd.print("TASTO CINQUE"); 
            Serial.print("TASTO CINQUE");  }             
            
    delay(300);
    
    }

Breve commento:La pressione di un pulsante varia il valore di una 
delle due resistenze del partitore, non rimane quindi che leggere
 il valore analogico e porre le condizioni "if" se il valore è 
compreso fra -10% e +10% (o altra tolleranza).

sabato 5 luglio 2014

Sezione di blocco ferroviario.


http://it.wikipedia.org/wiki/Sezione_di_blocco

Lo sketch è uguale a "Passaggio a livello1".
Un pulsante conta gli assi del convolgio ferroviario all'ingresso di una tratta mentre un secondo pulsante li conta dopo 2 km. Se il conteggio è lo stesso il semaforo da via libera al convolgio che segue.

Passaggio a livello 2.


Se i binari sono due i pulsanti saranno 4, 2 per binario, uno prima ed uno dopo il passaggio a livello.
Lo sketch è quello del post "Passaggio a livello Uno" ma doppio.

Primo binario
P1 incrementa Value1
P2 incrementa Value2

Secondo binario
P3 incrementa Value3
P4 incrementa value4

Se (if) Value1 = Value2 AND Value3 = Value4 ---> la barra è alzata.
Altrimenti (else) ---> la barra si abbassa.

mercoledì 2 luglio 2014

Passaggio a livello 1


Il pulsante P1 viene posizionato a debita distanza a nord del passaggio a livello.
Esso incrementerà la variabile value1.
Il pulsante P2 a sud del passaggio a livello ed incrementerà la variabile value2.
Se value1= value2 la barra è alzata.
Se value1 diverso da value2 la barra è abbassata.
Lo sketch visualizza, inultimente,il conteggio degli assi del treno prima e dopo il suo passaggio, serve solo come controllo dello sketch.

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 10, 11, 12, 13);

 # define TASTO1   2
 # define TASTO2   3
 # define RELE     6
 int  Value1     = 0;
 int  Value2     = 0;
 long Tempo1     = 0;
 long Tempo11    = 50; 

 void setup() 
     { pinMode(TASTO1,INPUT );
       pinMode(TASTO2,INPUT );
       pinMode(RELE,  OUTPUT); 
       lcd.begin(16, 2);
       lcd.setCursor(0,0);
       lcd.print ("Valore1");
       lcd.setCursor(0,1);
       lcd.print ("Valore2");
       Serial.begin(9600);    }

 void loop() {
    
   //********** TASTO 1  ***************** 
  int StatoTasto1;             
  int StatoTasto1a = LOW;  
  int valoreTasto1 = digitalRead(TASTO1);
//-------- antirimbalzo1  --------------
  if (valoreTasto1 != StatoTasto1a)
     {Tempo1 = millis();} 
  if ((millis() - Tempo1) > Tempo11)
      {StatoTasto1 = valoreTasto1;}
             StatoTasto1a = valoreTasto1;
//------------esecuzione1 ------------  
  if (valoreTasto1 == HIGH)
       { Value1 = (Value1 + 1);
         Serial.println(Value1);
         lcd.setCursor(10,0);
         lcd.print(Value1);
         delay(500);         }
  
 //********** TASTO 2  ***************** 
  int StatoTasto2;             
  int StatoTasto2a = LOW;  
  int valoreTasto2 = digitalRead(TASTO2);
//-------- antirimbalzo2-----------
  if (valoreTasto2 != StatoTasto2a)
     {Tempo1 = millis();} 
  if ((millis() - Tempo1) > Tempo11)
      {StatoTasto2 = valoreTasto2;}
             StatoTasto2a = valoreTasto2;
//-------- esecuzione2 ------------  
  if (valoreTasto2 == HIGH)
       { Value2 = (Value2 + 1);
         Serial.println(Value2);
         lcd.setCursor(10,1);
         lcd.print(Value2);
         delay(500);         }
 
//---- CONFRONTO FRA I DUE DATI -------- 
  if (Value1 == Value2)
          { digitalWrite(RELE, LOW);
            Serial.println("RELE OFF");
            delay(350);          }
  else    {digitalWrite(RELE, HIGH);
            Serial.println("RELE OFF"); 
          delay (100);  } 
}