0 del 13/01/2019
N.B. La versione di questo documento si compone del numero di revisione (ad es. 2.0) e della data di
emissione.
*/
#include <HMI.h>
const int Q00 = 20; // alias per il numero del pin, corrisponde a Q0.0
const int tempoON = 500; // alias per il tempo
const int tempoOFF = 500;
void setup() {
/* senza di questa istruzione la libreria non riesce a mettere
in comunicazione Arduino con il programma grafico PC_SIMU */
Serial.begin(19200,SERIAL_8E1);
1
prof. Davide Ciacci a.s. 2018-2019
Programmazione Arduino Modulo 1 rev. 2.0 del 13/01/2019
void loop() {
synch();
digitalWrite(Q00,HIGH);
delay(tempoON);
digitalWrite(Q00,LOW);
delay(tempoOFF);
}
Versione dello stesso programma: senza alias per il numero dei pin, senza commenti, senza righe vuote
tra le istruzione, senza variabili di appoggio.
#include <HMI.h>
void setup() {
Serial.begin(19200,SERIAL_8E1);
}
void loop() {
synch();
digitalWrite(20,1);
delay(500);
digitalWrite(20,0);
delay(500);
}
Blink A partire dal programma Blink per la lampadina in Q0.0, si scriva un programma che
variabile permette di modificare il tempo TON con i pulsanti I0.0 e I0.1. Se I0.0 risulta
premuto, il tempo TON aumenta di 100 millisecondi, viceversa se I0.1 risulta
premuto, il tempo TON diminuisce di 100 millisecondi.
/*
Variante del programma Blink per la lampadina in Q00, permette di modificare
il tempo TON con i pulsanti I00 e I01. Se I00 risulta premuto, il tempo TON
aumenta di 100 millisecondi, viceversa se I01 risulta premuto, il tempo TON
diminuisce di 100 millisecondi;
*/
#include <HMI.h>
int tempoON ;
const int tempoOFF = 1000; // questo non cambia
// per chiarezza si da un nome preciso ai pin di comando
const int pinPiu = 0;
const int pinMeno = 1;
const int pinLuce = 20;
void setup() {
Serial.begin(19200, SERIAL_8E1);
tempoON =1000;
}
void loop() {
synch();
if (digitalRead(pinPiu) == HIGH) {
tempoON = tempoON + 500;
}
if (digitalRead(pinMeno) == HIGH) {
tempoON = tempoON - 500;
}
digitalWrite(pinLuce, HIGH);
delay(tempoON);
digitalWrite(pinLuce, LOW);
delay(tempoOFF);
}
Blink snello Realizza un blink per dimostrare che è possibile leggere lo stato di un piedino
impostato come uscita. Legge lo stato precedente dell'uscita e scrive nell'uscita il
valore opposto.
/*
Realizza un blink per dimostrare che è possibile
leggere lo stato di un piedino impostato come uscita.
#include <HMI.h>
void setup() {
Serial.begin(19200,SERIAL_8E1);
pinMode(pinLed, OUTPUT);
digitalWrite(pinLed, HIGH);
}
void loop() {
synch();
delay(2000);
if (digitalRead(pinLed) == HIGH)
digitalWrite(pinLed, LOW);
else
digitalWrite(pinLed, HIGH);
}
Blink hardware Realizza un blink hardware per dimostrare che è possibile leggere lo stato di un
piedino impostato come uscita.
/*
Realizza un blink Hardware per dimostrare che è possibile
leggere lo stato di un piedino impostato come uscita.
void setup() {
pinMode(pinLed, OUTPUT); // obbligatorio per l’hardware non simulato
digitalWrite(pinLed, HIGH);
}
void loop() {
delay(1000);
if (digitalRead(pinLed) == HIGH) // legge lo stato del pin di uscita
digitalWrite(pinLed, LOW);
else
digitalWrite(pinLed, HIGH);
}
Blink minimo Realizza un blink hardware utilizzando il minimo del codice possibile, non usa
variabili di appoggio, legge direttamente lo stato precedente dell'uscita all'interno
della istruzione di scrittura e ne complementa il valore.
// Davide Ciacci 18/12/18
3
prof. Davide Ciacci a.s. 2018-2019
Programmazione Arduino Modulo 1 rev. 2.0 del 13/01/2019
void setup() {
pinMode(13, OUTPUT);
}
void loop() {
delay(1000);
digitalWrite(13, !digitalRead(13));
}
Esercizio n.5 Si scriva un programma che, quando è premuto l’interruttore collegato con I0.2,
verifica 3 ATM ruota il nastro verso destra per 10 secondi e successivamente ruota il nastro verso
17-18 sinistra per 5 secondi.
/*
Si scriva un programma che, quando è premuto l’interruttore
collegato con I0.2, ruota il nastro verso destra per 10 secondi
e successivamente ruota il nastro verso sinistra per 5 secondi.
*/
#include <HMI.h>
void setup() {
Serial.begin(19200, SERIAL_8E1);
}
void loop() {
synch();
if (digitalRead(6) == HIGH) {
digitalWrite(Q14, HIGH);
delay(tempoDestra);
digitalWrite(Q14, LOW);
digitalWrite(Q15, HIGH);
delay(tempoSinistra);
digitalWrite(Q15, LOW);
}
}
And Frammento di programma che illustra la funzione AND: è NECESSARIO che i pulsanti
siano premuti contemporaneamente affinché la lampadina si accenda. Si deve usare
obbligatoriamente un pulsante ed un interruttore.
// se il quinto pulsante è premuto mentre il primo
// interruttore è ON, accende la quinta luce
if (digitalRead(I04) == HIGH && digitalRead(I06) == HIGH)
digitalWrite(Q04, HIGH);
else
digitalWrite(Q04, LOW);
Or Frammento di programma che illustra la funzione OR: è sufficiente che uno dei due
interruttori sia premuto affinché la lampadina si accenda.
// se il quarto oppure il quinto pulsante
// sono premuti accende la terza luce e spegne la quarta
if (digitalRead(I03) == HIGH || digitalRead(I04) == HIGH) {
digitalWrite(Q02, HIGH); // accende la luce
digitalWrite(Q03, LOW); // spegne
4
prof. Davide Ciacci a.s. 2018-2019
Programmazione Arduino Modulo 1 rev. 2.0 del 13/01/2019
}
else {
digitalWrite(Q03, HIGH); // accende la luce
digitalWrite(Q02, LOW); // spegne
}
Set-Reset se si preme il pulsante di Set la lampadina si accende e resta accesa finché non si preme il
pulsante di Reset. Si usa un pulsante verde per il set, il rosso per il reset. Si noti che il pin
corrispondente a Q0.6 è di uscita ma il suo stato (valore) può essere letto. La stessa cosa
vale per Arduino non simulato, un pin impostato come OUTPUT può essere letto,
viceversa un pin di INPUT non può essere scritto.
Sensori: Due Codice: M1_R2_Set_reset
pulsanti agli
indirizzi I0.0 e
I0.5
Attuatori: una
lampadina in Q06
/*
Set Reset
void setup() {
Serial.begin(19200, SERIAL_8E1);
digitalWrite(Q06, LOW); // stato iniziale
}
void loop() {
synch();
/*
la luce deve essere accesa se è stato premuto il pulsante SET
oppure se SET non è premuto ma la luce era già accesa in precedenza
e se non è stato premuto il pulsante RESET.
*/
if ((set == HIGH || luce == HIGH) && reset == LOW) {
luce = HIGH; // accende la luce
}
else {
luce = LOW; // spegne la luce
}
5
prof. Davide Ciacci a.s. 2018-2019
Programmazione Arduino Modulo 1 rev. 2.0 del 13/01/2019
}
void loop() {
synch();
if ((digitalRead(0) == HIGH || digitalRead(26) == HIGH) && digitalRead(5) == LOW)
digitalWrite(26,HIGH);
else
digitalWrite(26,LOW);
}
Mirror Il valore degli ingressi viene copiato sulle uscite, usa quattro modi diversi per fare la
stessa cosa.
Sensori: Tutti
quelli collegati
agli ingressi
I00-I07
Attuatori: Tutti
quelli collegati
alle uscite
Q00-Q07
/*
Mirror
Riflette lo stato degli ingressi sulle uscite
rev. 1 Davide Ciacci 9/12/18
*/
#include <HMI.h>
#define I04 4
#define I05 5
#define Q00 20
#define Q01 21
#define Q02 22
#define Q03 23
#define Q04 24
#define Q05 25
#define Q06 26
#define Q07 27
void setup() {
Serial.begin(19200, SERIAL_8E1);
}
void loop() {
synch();
6
prof. Davide Ciacci a.s. 2018-2019
Programmazione Arduino Modulo 1 rev. 2.0 del 13/01/2019
digitalWrite(Q01, valore1);
const int valore2 = digitalRead(I02);
digitalWrite(Q02, valore2);
#include <HMI.h>
void setup() {
Serial.begin(19200, SERIAL_8E1);
digitalWrite(20, HIGH);
}
void loop() {
synch();
if (digitalRead(0) == HIGH) {
digitalWrite(22, HIGH);
digitalWrite(23, HIGH);
digitalWrite(20, LOW);
}
else {
digitalWrite(22, LOW);
}
}
Pulsanti esercizio Se viene premuto il pulsante I0.0 si accendono le lampadine collegate a Q0.0, Q0.2 e
A Q0.3. Al rilascio del pulsante le lampadine si spengono
7
prof. Davide Ciacci a.s. 2018-2019
Programmazione Arduino Modulo 1 rev. 2.0 del 13/01/2019
/*
Se viene premuto il pulsante I00 si accendono le
lampadine collegate a Q00, Q02 e Q03. Al rilascio
del pulsante le lampadine si spengono.
rev. 1 Davide Ciacci 20/11/17
*/
#include <HMI.h>
void setup() {
Serial.begin(19200, SERIAL_8E1);
}
void loop() {
synch();
if (digitalRead(0) == HIGH) {
digitalWrite(20, HIGH);
digitalWrite(22, HIGH);
digitalWrite(23, HIGH);
}
else {
digitalWrite(20, LOW);
digitalWrite(22, LOW);
digitalWrite(23, LOW);
}
}
Pulsanti esercizio Se viene premuto il pulsante I0.0 si accendono e restano accese le lampadine in Q0.0
B e Q0.5. Se viene premuto il pulsante in I0.1 si accende e resta accesa la lampadina in
Q0.5. Se viene premuto il pulsante I0.2 tutte le lampadine si spengono e restano
spente.
/*
Se viene premuto il pulsante I00 si accendono e restano accese le lampadine
in Q00 e Q05.
Se viene premuto il pulsante in I01 si accende e resta accesa la lampadina in Q05.
Se viene premuto il pulsante I02 tutte le lampadine si spengono e restano spente.
#include <HMI.h>
void setup() {
Serial.begin(19200, SERIAL_8E1);
}
void loop() {
synch();
if (digitalRead(0) == HIGH) {
digitalWrite(20, HIGH);
digitalWrite(25, HIGH);
}
if (digitalRead(1) == HIGH) {
digitalWrite(25, HIGH);
}
if (digitalRead(2) == HIGH) {
digitalWrite(20, LOW);
digitalWrite(25, LOW);
}
}
Pulsanti esercizio Se viene premuto il pulsante I00 si accendono le lampadine in Q00, Q01 e Q05, al
C rilascio di I00 la lampadina in Q00 si spegne mentre quelle in Q01 e Q05 restano
8
prof. Davide Ciacci a.s. 2018-2019
Programmazione Arduino Modulo 1 rev. 2.0 del 13/01/2019
#include <HMI.h>
void setup() {
Serial.begin(19200, SERIAL_8E1);
}
void loop() {
synch();
if (digitalRead(0) == HIGH) {
digitalWrite(20, HIGH);
digitalWrite(21, HIGH);
digitalWrite(25, HIGH);
}
else {
digitalWrite(20, LOW);
}
if (digitalRead(1) == HIGH) {
digitalWrite(25, LOW);
}
if (digitalRead(5) == HIGH) {
digitalWrite(21, LOW);
}
}
Toggle Ogni volta che viene premuto il pulsante la lampadina cambia di stato, cioè se era accesa
prima della pressione del pulsante si spegne, viceversa si accende. La commutazione
avviene solo sul fronte di salita dell’ingresso, cioè solo alla pressione del pulsante, una
sola volta.
Ad ogni esecuzione della funzione “loop” legge lo stato del tasto di ingresso e lo
confronta con lo stato che aveva in precedenza, se lo stato non è cambiato esce dalla
funzione “loop” che verrà eseguita successivamente. Se viceversa lo stato del piedino di
ingresso è cambiato, anzitutto lo registra nello stato precedente, poi guarda se il nuovo
stato è uno stato alto. In questo caso si è verificato un fronte di salita dal valore basso al
valore alto e quindi modifica il valore dell'uscita. Se viceversa il valore corrente è basso
vuol dire che c'è stata una variazione dello stato dell’ingresso dall'alto al basso, cioè il
fronte di discesa che non ci interessa.
Sensori: Un
pulsante
Attuatori: una
lampadina
/*
Toggle
9
prof. Davide Ciacci a.s. 2018-2019
Programmazione Arduino Modulo 1 rev. 2.0 del 13/01/2019
#include <HMI.h>
void setup() {
Serial.begin(19200, SERIAL_8E1); // init librerie
tastoPrima = LOW; // init variabili globali
digitalWrite(20, LOW); // init hardware
}
void loop() {
synch();
Funzione Questa funzione permette di visualizzare sul pannello un numero decimale su due
“displayNum cifre. Ciascun display accetta un valore codificato BCD
”
Video prova funzione displayNum
#include <HMI.h>
int conteggio = 0;
//--------------------------------------
void setup() {
Serial.begin(19200, SERIAL_8E1);
}
10
prof. Davide Ciacci a.s. 2018-2019
Programmazione Arduino Modulo 1 rev. 2.0 del 13/01/2019
void loop() {
displayNum(conteggio);
conteggio = conteggio + 1;
delay(200);
}
//--------------------------------------------------------
void displayNum(const int val) {
// il valore di ingresso viene limitato a due cifre
int valore = val % 100;
// sul display di sinistra si visualizzano le decine
// in codice BCD sugli indirizzi Q0.3-Q0.0
const int sinistra = valore / 10;
}
Conteggio sul Ad ogni pressione del pulsante in I0.0 viene incrementata la variabile di conteggio.
fronte Viene utilizzato il meccanismo del fronte positivo in modo di contare una sola volta,
indipendentemente dalla durata della pressione.
Questo meccanismo è necessaria tutte le volte che l'azione di innesco del conteggio
(trigger) non ha valore istantaneo ma dura per un certo tempo, quindi l’evento
verrebbe contato più volte.
/*
ad ogni pressione del pulsante incrementa
la variabile di conteggio
rev. 2 Davide Ciacci 11/12/18
*/
#include <HMI.h>
void setup() {
Serial.begin(19200, SERIAL_8E1); // init librerie
void loop() {
synch();
11
prof. Davide Ciacci a.s. 2018-2019
Programmazione Arduino Modulo 1 rev. 2.0 del 13/01/2019
#include <HMI.h>
void setup() {
Serial.begin(19200, SERIAL_8E1); // init librerie
void loop() {
synch();
12
prof. Davide Ciacci a.s. 2018-2019
Programmazione Arduino Modulo 1 rev. 2.0 del 13/01/2019
poi si preme il tasto opposto, in questo caso l’incremento viene riportato al minimo
in quanto si cambia direzione.
Il conteggio non parte da zero, bensì da un valore intermedio.
Questo tipo di funzionalità può essere utilizzata anche per le operazioni di Jog in cui
una macchina, fatta funzionare in modalità manuale, viene posta manualmente in
posizione tramite un joystick.
/*
realizza la funzionalità del controllo del Volume
rev. 2 Davide Ciacci 13/01/19 introdotto incremento relativo per cambio direzione
rev. 1 Davide Ciacci 11/12/18
*/
#include <HMI.h>
void setup() {
Serial.begin(19200, SERIAL_8E1); // init librerie
volume = 20;
incremento = 1; // se si parte da zero una singola pressione non funziona
}
void loop() {
synch();
const int alza = digitalRead(0); // Q0.0
const int abbassa = digitalRead(1); // Q0.1
if (alza == HIGH) {
if (incremento < 0) // cambio di verso
incremento = 1;
volume = volume + incremento;
incremento = incremento + 1;
if (volume > 99)
volume = 99;
delay(500); // per il display del numero
}
else{ // è sicuramente l'altro
if (incremento > 0) // cambio di verso
incremento = -1;
Ping-pong. All'avvio del programma il nastro trasportatore si avvia immediatamente verso destra.
Alla pressione del pulsante di avvio il distributore di bottiglie rilascia una bottiglia che
cade sul nastro trasportatore.
Quando la bottiglia ingaggia il finecorsa a sinistra il verso di rotazione del motore va
13
prof. Davide Ciacci a.s. 2018-2019
Programmazione Arduino Modulo 1 rev. 2.0 del 13/01/2019
un distributore di
bottiglie in Q1.7
un motore per la
rotazione del
nastro verso
destra in Q1.4.
un motore per la
rotazione del
nastro verso
sinistra in Q1.5
/*
Pingpong
#include <HMI.h>
void setup() {
Serial.begin(19200, SERIAL_8E1);
digitalWrite(Q14, HIGH); // avvia motore
}
void loop() {
synch();
// ----------- elaborazione
// rilascia la bottiglia
if (start == HIGH)
digitalWrite(Q17, HIGH);
else
14
prof. Davide Ciacci a.s. 2018-2019
Programmazione Arduino Modulo 1 rev. 2.0 del 13/01/2019
digitalWrite(Q17, LOW);
#include <HMI.h>
void setup() {
15
prof. Davide Ciacci a.s. 2018-2019
Programmazione Arduino Modulo 1 rev. 2.0 del 13/01/2019
void loop() {
synch();
// gestisce nastro
const int versoDestra = digitalRead(Q14);
const int versoSinistra = digitalRead(Q15);
const int limiteDestro = digitalRead(I15);
const int limiteSinistro = digitalRead(I14);
// gestisce conteggio
const int sensoreAdesso = digitalRead(I16); // legge il sensore
16
prof. Davide Ciacci a.s. 2018-2019
Programmazione Arduino Modulo 1 rev. 2.0 del 13/01/2019
Ad ogni esecuzione della funzione “loop” esiste al massimo una fase che è attiva, cioè la
sua equazione univoca è verificata.
Sensori:
un pulsante di
avvio, due
finecorsa per il
primo cilindro,
due finecorsa per
il secondo
cilindro.
Attuatori:
due cilindri
bistabili, ciascuno
possiede una
valvola di uscita
ed una valvola di
rientro.
/*
rev. 2 Davide Ciacci 12/12/18
*/
#include <HMI.h>
void setup() {
Serial.begin(19200, SERIAL_8E1);
}
void loop() {
synch();
// Fase B+
if ((a1 == HIGH || Bpiu == HIGH) && b1 == LOW)
Bpiu = HIGH; // cilindro esce
else
Bpiu = LOW; // cilindro fermo
// Fase A-
17
prof. Davide Ciacci a.s. 2018-2019
Programmazione Arduino Modulo 1 rev. 2.0 del 13/01/2019
// Fase B-
if ((a0 == HIGH || Bmeno == HIGH) && b0 == LOW)
Bmeno = HIGH; // cilindro rientra
else
Bmeno = LOW; // cilindro fermo
}
Ciclo quadro in linguaggio LD (Ladder)
18
prof. Davide Ciacci a.s. 2018-2019
Programmazione Arduino Modulo 1 rev. 2.0 del 13/01/2019
19
prof. Davide Ciacci a.s. 2018-2019
Programmazione Arduino Modulo 1 rev. 2.0 del 13/01/2019
diventa alta, nessuna fase del ciclo viene eseguita e la macchina è completamente
ferma, sino alla pressione del pulsante di avvio in I0.0.
/*
rev. 2 Davide Ciacci 12/12/18
*/
#include <HMI.h>
void setup() {
Serial.begin(19200, SERIAL_8E1);
marcia = LOW;
emergenza = LOW;
}
void loop() {
synch();
if (emergenza == LOW)
emergenza = digitalRead(I05);
if (emergenza == LOW) {
// in ogni istante solo una delle fasi è attiva
// Fase A+
if ((((marcia == HIGH || semi == HIGH) && b0 == HIGH) || Apiu == HIGH) && a1 ==
LOW)
Apiu = HIGH; // cilindro esce
else
Apiu = LOW; // cilindro fermo
20
prof. Davide Ciacci a.s. 2018-2019
Programmazione Arduino Modulo 1 rev. 2.0 del 13/01/2019
// Fase B+
if ((a1 == HIGH || Bpiu == HIGH) && b1 == LOW)
Bpiu = HIGH; // cilindro esce
else
Bpiu = LOW; // cilindro fermo
// Fase A-
if ((b1 == HIGH || Ameno == HIGH) && a0 == LOW)
Ameno = HIGH ; // cilindro rientra
else
Ameno = LOW; // cilindro fermo
// Fase B-
if ((a0 == HIGH || Bmeno == HIGH) && b0 == LOW)
Bmeno = HIGH; // cilindro rientra
else
Bmeno = LOW; // cilindro fermo
if (jogPiu == HIGH)
digitalWrite(cilindroPiu, HIGH);
else
digitalWrite(cilindroPiu, LOW);
if (jogMeno == HIGH)
digitalWrite(cilindroMeno, HIGH);
else
digitalWrite(cilindroMeno, LOW);
}
//---------------------------- segnalazioni
digitalWrite(Lmarcia, marcia);
digitalWrite(Lemergenza, emergenza);
}
Esercizio ciclo Realizza il ciclo ordinato semiautomatico A-/B+/A+/B-. La posizione di partenza, con
con fase di con il cilindro A estratto, viene realizzata all'interno del setup.
inizializzazione Poiché la funzione setup viene eseguita una sola volta, si aspetta che il cilindro sia
uscito sino ad ingaggiare il finecorsa a1. Per attendere il completamento dell'uscita
del cilindro si utilizza l’istruzione do-while, all’interno del ciclo do-while si ripete
l’istruzione synch per comunicare con l’interfaccia grafica.
/*
rev. 2 Davide Ciacci 16/12/18
Realizza il ciclo ordinato semiautomatico A-/B+/A+/B-
Variante con setup che prepara il cilindro A.
*/
#include <HMI.h>
21
prof. Davide Ciacci a.s. 2018-2019
Programmazione Arduino Modulo 1 rev. 2.0 del 13/01/2019
void setup() {
int a1 ;
Serial.begin(19200, SERIAL_8E1);
do {
synch();
digitalWrite(Q10, HIGH); // cilindro esce
a1 = digitalRead(I11);
} while (a1 == LOW);
digitalWrite(Q10, LOW); // cilindro fermo
}
void loop() {
synch();
int a0 = digitalRead(I10);
int a1 = digitalRead(I11);
int b0 = digitalRead(I12);
int b1 = digitalRead(I13);
int Apiu = digitalRead(Q10);
int Ameno = digitalRead(Q11);
int Bpiu = digitalRead(Q12);
int Bmeno = digitalRead(Q13);
int start = digitalRead(I00);
if (start == HIGH)
digitalWrite(Q00, HIGH); // indica l'inizio dell'esecuzione del ciclo
if (b0 == HIGH && Bmeno == HIGH)
digitalWrite(Q00, LOW); // indica la fine dell'esecuzione del ciclo
// Fase A-
if (((start == HIGH && b0 == HIGH) || Ameno == HIGH) && a0 == LOW) {
digitalWrite(Q11, HIGH); // cilindro rientra
}
else {
digitalWrite(Q11, LOW); // cilindro fermo
}
// Fase B+
if ((a0 == HIGH || Bpiu == HIGH) && b1 == LOW) {
digitalWrite(Q12, HIGH); // cilindro esce
}
else {
digitalWrite(Q12, LOW); // cilindro fermo
}
// Fase A+
if ((b1 == HIGH || Apiu == HIGH) && a1 == LOW) {
digitalWrite(Q10, HIGH); // cilindro esce
}
else {
digitalWrite(Q10, LOW); // cilindro fermo
}
// Fase B-
if ((a1 == HIGH || Bmeno == HIGH) && b0 == LOW) {
digitalWrite(Q13, HIGH); // cilindro rientra
}
else {
digitalWrite(Q13, LOW); // cilindro fermo
}
}
Esercizio ciclo Realizza il ciclo non ordinato semiautomatico A+/B+/B-/A-.
sequenziale
22
prof. Davide Ciacci a.s. 2018-2019
Programmazione Arduino Modulo 1 rev. 2.0 del 13/01/2019
/*
rev. 2 Davide Ciacci 17/12/18
Realizza il ciclo non ordinato semiautomatico A+/B+/B-/A-
*/
#include <HMI.h>
void setup() {
Serial.begin(19200, SERIAL_8E1);
Memoria = LOW;
}
void loop() {
synch();
int a0 = digitalRead(I10);
int a1 = digitalRead(I11);
int b0 = digitalRead(I12);
int b1 = digitalRead(I13);
int Apiu = digitalRead(Q10);
int Ameno = digitalRead(Q11);
int Bpiu = digitalRead(Q12);
int Bmeno = digitalRead(Q13);
int start = digitalRead(I00);
// Fase A+
if (((start == HIGH && Memoria == LOW) || Apiu == HIGH) && a1 == LOW)
digitalWrite(Q10, HIGH); // cilindro esce
else
digitalWrite(Q10, LOW); // cilindro fermo
// Fase B+
if (((a1 == HIGH && Memoria == LOW) || Bpiu == HIGH) && b1 == LOW)
digitalWrite(Q12, HIGH); // cilindro esce
else
digitalWrite(Q12, LOW); // cilindro fermo
// Fase M+
if (b1 == HIGH)
Memoria = HIGH;
// Fase B-
if ((Memoria == HIGH || Bmeno == HIGH) && b0 == LOW)
digitalWrite(Q13, HIGH); // cilindro rientra
else
digitalWrite(Q13, LOW); // cilindro fermo
// Fase A-
if (((b0 == HIGH && Memoria == HIGH) || Ameno == HIGH) && a0 == LOW)
digitalWrite(Q11, HIGH); // cilindro rientra
else
digitalWrite(Q11, LOW); // cilindro fermo
// Fase M-
if (a0 == HIGH)
Memoria = LOW;
}
23
prof. Davide Ciacci a.s. 2018-2019