Calcolatrice RPN con Arduino -
- RPN Calculator with Arduino-
- 28/08/2017-
Questo progetto utilizza 48 tasti per l'input ed un display a 4 righe x 20 in questo modo è più facile e divertente utilizzare la calcolatrice.
Il prototipo da me realizzato è molto spartano ma ognuno di Voi potrà realizzare un contenitore migliore. E' possibile alimentazione con batteria.
Questo progetto è interessante per la sua possibilità di personalizzazione ed utilizzo di quasi tutte le schede della famiglia "Arduino".
Potrete personalizzare sia il contenitore che lo sketch aggiungendo funzioni e programmi .
Materiale occorrente:
Arduino UNO oppure altre schede come Mega 2560 ed altre.
3 tastierini da 16 tasti per formare una tastiera di 4 righe x 12 colonne
Display 4 righe 20 caratteri I2C
Si può collegare anche un display 4x20 non I2C ( ma in questo caso bisogna usare il Mega perché su Arduino UNO non sarebbero sufficienti i pin)
Cambiando la scheda si dovranno fare poche modifiche allo schema ed allo sketch.
Caratteristiche di questa versione:
A _ Con la tastiera a 48 tasti molte funzioni sono eseguibili con la pressione di un tasto.
B _ Rimangono disponibili molti tasti con la possibilità di assegnare loro una SECONDA FUNZIONE.
C_ Il display con 4 righe permette di visualizzare i registri X, Y, Z e quindi maggior facilità dell'uso della catasta operativa.
D_ Lo sketch è predisposto per inserire nuove funzioni ed assegnarle ai tasti disponibili come seconda funzione.
E_ Possibilità d'integrare funzioni o programmi da richiamare con XEQ nn, questi programmi o funzioni possono essere integrati e richiamabili come le funzioni della calcolatrice facendo uso della catasta o dei registri di memoria.
F_ Possibilità di alimentazione a batteria diventando portatile.
Questa versione NON supporta la programmazione (diretta).*
Non supporta le funzioni rivolte ai pin di Arduino presenti nel progetto "ArduinoQuadro".
Ho quindi semplificato l'uso e reso semplice l'integrazione e l'aggiunta di programmi o funzioni per una personalizzazione completa.
Manca si la possibilità di programmarla direttamente ma vedremo come sia semplice preparare dei programmi da integrare nella calcolatrice, e richiamabili con XEQnn.
Qui sotto trovate due schemi di collegamento :
Schema con Arduino UNO
Schema con ATmega 2560
Come si vede lo schema di collegamento è molto semplice.
I tastierini hanno 8 pin ciascuno i 4 a sinistra identificano la colonna ed i 4 a destra identificano le righe.
Si collegano insieme le 4 righe di ogni tastierino e queste le mandiamo a 4 pin di Arduino
Nello schema righe (verde, blu, grigio, marrone).
Ogni colonna (12) invece la colleghiamo ad un pin di Arduino (colori rosa, porpora, arancione, giallo)
La pressione di un tasto individua la chiusura dell'incrocio RigaX, e ColonnaY, la libreria Keypad.h provvede a restituire nella variabile key il codice del tasto premuto.
Lo sketch è molto commentato e si possono comprendere i vari passaggi.
Si possono realizzare con altre schede della famiglia Arduino cambiando i collegamenti dei tastierini (righe e colonne), e cambiare nello sketch la sola parte che riguarda i pin a cui sono collegati i tastierini.
Qui sotto la porzione di sketch da modificare.
//-----------------------------------------------------------------------------
// pin assegnati al tastierino per ARDUINO UNO
//-----------------------------------------------------------------------------
byte pinrighe[righe] = {14, 15, 16, 17}; // pin analogici A0, A1, A2, A3
byte pincolonne[colonne] = {13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2};
//------------------------------------------------------------------------------
// pin assegnati al tastierino per ATMEGA 2560
//------------------------------------------------------------------------------
byte pinrighe[righe] = {23, 25, 27, 29};
byte pincolonne[colonne] = {53, 51, 49, 47, 45, 43, 41, 39, 37, 35, 33, 31};
//------------------------------------------------------------------------------
Se utilizzate Arduino MEGA con lo schema sopra indicato sono valide le righe in rosso
e quindi potete commentare le altre.
Se utilizzate Arduino UNO sono valide le righe blu e commentate le righe rosse.
In ogni caso per qualsiasi altra scheda utilizzata seguite questo metodo.
ATTENZIONE il mio display ha questo indirizzo
LiquidCrystal_PCF8574 lcd(0x27);
Il Vostro LCD potrebbe avere altro indirizzo, controllate anche di includere la libreria del vostro lettore LCD, in qualche caso potrebbero essere necessarie delle modifiche nello sketch alle istruzioni che mostrano i dati.
Uso della calcolatrice.
Su questo stesso blog trovate alcune prime indicazioni nel post
Calcolatrice RPN con Arduino
Calcolatrice RPN
Sul Web trovate anche i manuali della HP41 a cui mi sono ispirato.
Qui trovate lo sketch ( riferito allo schema MEGA) ma contiene anche le righe per Arduino uno come indicato sopra da modificare.
Questo il risultato verifica con IDE 2 di Arduino per il Mega:
Lo sketch usa 22272 byte (8%) dello spazio disponibile per i programmi. Il massimo è 253952 byte.
Le variabili globali usano 962 byte (11%) di memoria dinamica, lasciando altri 7230 byte liberi per le variabili locali. Il massimo è 8192 byte.
Come potete vedere c'è spazio per modifiche ed aggiunte di funzioni.
Lo sketch v506-48-v109.ino
Lo sketch si compone di più schede per poterlo leggere più agevolmente.
Scheda principale con il LOOP
Qui ci sono le dichiarazioni, il setup, i pin utilizzati per il tastierino, le sub per l'inserimento dei dati e la chiamata alle funzioni.
SCHEDA FUNZIONI DIRETTE E SECONDE
Qui trovate tutte le funzioni della calcolatrice dirette e con tasto 2F
SCHEDA XEQ-STO-RCL
dedicata alle funzioni che vengono chiamate con indirizzo nn
SCHEDA PROG
Per i programmi da chiamare con XEQ (nn) numero programma, che potete integrare con i vostri programmi.
SCHEDA NOMI FUNZIONI
In questa trovate tutti i nomi funzioni che vengono visualizzati a destra sulla prima riga del LCD
In questo sketch ho dato un tempo di 300 ms, potete cambiarlo o non visualizzare il nome funzione.
Indice delle funzioni e loro uso:
----------------------------------------------------------------------
Funzioni dirette
----------------------------------------------------------------------
Somma, sottrazione, moltiplicazione, divisione :
Si introduce il primo operando, poi il secondo e si preme il tasto operatore il risultato viene posto in X.
Enter: Introduce in x quanto è contenuto sul "visore" e fa salire il resto della catasta, quello che era in x sale in y, il contenuto di y sale in z, il contenuto di z sale in t.
Del : Cancella il contenuto del visore.
F2 Tasto seconda funzione abilita e disabilita la seconda funzione.
Sin, Tan, Cos : Restituiscono in X, il valore seno, tangente, coseno
dell'angolo in Radianti contenuto in X .
Sqrt : Esegue la radice quadrata del contenuto in X , pone il risultato in X.
Y^x : Eleva a potenza , introdurre in Y il valore, in X l'esponente, il risultato è posto in X.
CHS : Cambio segno, cambia il segno ad X.
STO: Memorizza in un registro utente ( da 1 a 19) il contenuto di X, immettere in X il valore da memorizzare ( potrebbe anche essere il risultato di precedenti operazioni) poi nel visore scrivere il registro dove si vuole memorizzare (01-19) quindi premere il tasto funzione STO. Il contenuto di x rimane in x e viene duplicato nel registro indicato.
RCL: Richiama in X il contenuto del registro ( da 01 a 19), immettere nel visore il numero del registro e premere il tasto funzione RCL, in X avremo il contenuto del registro richiesto, il registro rimane invariato, nel registro lastx viene prima salvato il contenuto precedente di X.
FIX: Si possono impostare il numero dei decimali visualizzati ( da 0 a 5 ), scrivere in visore il numero da 0 a 5 e premere il tasto funzione FIX. Di default ho posto a 4 i decimali.
lastx: Recupera in X il contenuto precedente ad una operazione, il contenuto di X viene spostato in Y.Utile per recuperare in caso di operazioni errate.
X<>Y: Scambio X con Y, Insieme alla rotazione della catasta si può cambiare l'ordine degli operandi in catasta.
R! : Ruota giù, la catasta viene fatta ruotare y in x, z in y, t in z, x in t. Ad ogni pressione ruota fino a tornare nella situazione iniziale, utile per rivedere tutto il contenuto della catasta, ed eventualmente utilizzando lo scambio cambiarne la disposizione.
XEQ : Questa funzione richiama ed esegue funzioni o programmi, si scrive nel visore il numero della funzione e si preme il tasto XEQ, prima si dovrà immettere in catasta i valori richiesti dalla funzione e o programma rispettandone anche l'ordine. In uscita avremo la catasta aggiornata con i risultati.
Possono essere usati anche i registri utente che la funzione e/o programma possono utilizzare come input e/o come output.
arco seno di x, arco tangente di x, arcoseno di x, restituiscono in x l'angolo
relativo al valore trovato in x l'angolo è espresso in RADIANTI.
In Lastx si conserva il valore di partenza.
costante PI (pigreco) in x.
CLST cancella i registri catasta e visore, cancella anche lastx.
Altre funzioni che usano due registi per input e output ( x , y).
R>P : Da coordinate rettangolari a polari, x,y inserire le due coorinate e premere il tasto R>P restituisce in y la distanza in x l'angolo in radianti.
P>R : da polari a rettangolari inserire in x l'angolo alfa in RADIANTI
inserire in y la magnitudine o distanza. restituisce le coordinate in x e y.
Log : logaritmo in base 10.
LN : logaritmo in base e.
R^ : Rsu ruota la catasta regx sale in regy , regy sale in regz e così via.
Aggiornamento 18/02/23 lo sketch aggiornato è v506-48-v109
Questa è la tabella di corrispondenza dei tasti e del codice.
Ho aggiunto alcune funzioni e programmi da chiamare con la XEQnn
--------------------------------------------------------------------------------
Funzioni seconde ( prima premere il tasto 2F)
appare sulla linea del visore il 2, per togliere la 2F premere ancora il tasto,
sul visore appare 1.
--------------------------------------------------------------------------------
FACT : calcola il fattoriale di x
xSQRy : calcola radice x del registro y
% : calcola la percentuale x del registro y
FRC : parte frazionaria di x ( elimina la parte intera di x)
INT : parte intera di un numero ( elimina la parte decimale senza arrotondamento).
%D : calcola pa differenza percentuale fra Y ed X
MOD : resto della divisione Y / X
Ho aggiunto solo 8 seconde funzioni dalla tabella sopra potete vedere che sono disponibili molti altri tasti da usare come seconda funzione (d nella tabella).
E' possibile aggiungere altre seconde funzioni per farlo occorre seguire questi passi:
1) nella sub void funzioni() - scheda principale-
aggiungere nello spazio dedicato alle seconde funzioni ( vedi qui sotto)
//--------------------------------------------------
//end funzioni_dirette
//--------------------------------------------------
//***************************
//
// SECONDE FUNZIONI
//
//**************************-
if (codice == 112) //fact() // funzione fattoriale max 30
{
nome_funzione(codice);
if (visore != 0)enter();
fact();
}
una porzione di codice che richiami la nostra nuova funzione
si può copiare questa cambiare il codice del tasto e il nome della nuova funzione .
2) nella scheda :
FUNZIONI DIRETTE E SECONDE CON 2F
scrivere una void con nome funzione che esegua il calcolo.
3) aggiornare la scheda " NOMI FUNZIONI "
basterà indicare il nome scelto e sostituirlo al posto del codice
//*********************************************
// seconde funzioni + 50 da 93 a 140
//*********************************************
if (codice == 93)nomeFunzione = "093";// tasto piu
if (codice == 94)nomeFunzione = "094";// tasto per
if (codice == 95)nomeFunzione = "095";// tasto meno
if (codice == 96)nomeFunzione = "097";// tasto diviso
if (codice == 108)nomeFunzione = "108";//
if (codice == 109)nomeFunzione = "109";//
if (codice == 110)nomeFunzione = "110";//
if (codice == 111)nomeFunzione = "111";//
if (codice == 112)nomeFunzione = "FACT";// FATTORIALE DI X
if (codice == 113)nomeFunzione = "Rx-Y";// RADICE x DI Y
if (codice == 114)nomeFunzione = " % ";// PERCENTUALE x DI Y
if (codice == 115)nomeFunzione = "115";// 2F
if (codice == 116)nomeFunzione = "116";//
if (codice == 117)nomeFunzione = "117";//
if (codice == 118)nomeFunzione = "118";//
if (codice == 119)nomeFunzione = "119";//
if (codice == 120)nomeFunzione = "FRC";// PARTE FRAZIONARIA DI X
if (codice == 121)nomeFunzione = "INT";// PARTE INTERA DI X
if (codice == 122)nomeFunzione = "% DI";// DIFFERENZA PERCENTUALE FRA X ED Y
if (codice == 123)nomeFunzione = "MOD";// MODULO DIVISIONE Y MOD X IL RESTO è IN X
if (codice == 124)nomeFunzione = "124";//
per esempio se abbiamo scelto il tasto relativo al codice 116 basterà inserire il nome della funzione abbreviato vedi esempi.( questa operazione serve solo a visualizzare il nome della funzione eseguita ma non influisce sul calcolo )
------------------------------------
Programmi aggiuntivi
--------------------------------------
Con questo aggiornamento ho aggiunto anche alcuni programmi di esempio richiamabili con la XEQ nn
Questi programmi sono realizzabili scrivendoli con l'IDE Arduino nella scheda PROG-DI-XEQnn
Se si vuole aggiungere un programma si
// dovrà modificare queste parti:
// 1) aggiungere in questa scheda il programma con suo nome
// 2) modificare in questa scheda il prog catalog aggiungendolo
// 3) modificare la scheda XEQ-STO-RCL nella parte relativa
// alla chiamata XEQnn inserendo nel ciclo case
// il nome del nuovo programma
Ho aggiunto il programma (1) void catalog()
questo programma visualizza il numero ed il nome dei programmi contenuti nella scheda quindi se aggiungete programmi aggiornate anche il catalog con il nome del nuovo programma.
programma (2) carnot()
void carnot() // funzione 02 ****
{
// angolo in x in RADIANTI
double latoa = regz; // uno dei lati conosciuti
double latob = regy; // il secondo lato conosciuto
double angolo = regx;// angolo compreso fra i due lati
// si cerca il terzo lato
// gli angoli sono inseriti in RADIANTI INPUT
// gli angoli saranno in RADIANTI
//***********************************
// due lati ed angolo compreso
double latoc = sqrt(pow(latoa,2)+ pow(latob,2)-(2*latoa*latob)*cos(angolo));
regx = latoc; // in x troviamo il lato cercato opposto all'anglo compreso
regy = latob; // lato noto
regz = latoa; // lato noto
regt = angolo; // angolo noto in radianti
//**************************************************
} // fine carnot
Si calcola il terzo lato del triangolo, conoscendo i due lati e l'angolo compreso, angoli in radianti.
programma (3) parallelo() resistori inserire in x ed in y i valore di due resistenze.
( valori espressi nella stessa unità di misura ) in x ritroviamo il valore del parallelo.
void parallelo() // prog 03
{
//*************************************************************
// PARALLELO RESISTORI
//
// // r1 -r2
//*************************************************************
// si inseriscono in x ed in y i valori di due resistori.
//
// questo programma modifica tutto lo stak
// in uscita avremo in x la resistenza parallelo
//
double resp = 0;
resp = 1/ ((1/regx)+ (1/regy));
regx = resp;
regy = 0;
regz = 0;
regt = 0;
}
// fine parallelo
//******************************************************************
programma (4) erone() Calcolo superfice triangolo noti i tre lati.
si inseriscono i tre lati in x,y,z e si ottiene la superficie in x.
//************************************************************
// superficie triangolo con Erone
// noti i tre lati in x lato a, in y lato b, in z lato c
// restituisce in x la superficie, in y,z, t i lati a,b,c.
//*************************************************************
//
void erone() // fuzione 04 ****
{
double latoa = regx;
double latob = regy;
double latoc = regz;
if (latoa >= (latob+latoc)|| latob >= (latoc + latoa)|| latoc >=(latob+latoa)) return;
else {
double perimetro = latoa + latob + latoc;
double per2 = perimetro/2;
double super = sqrt(per2*((per2-latoa)*(per2-latob)*(per2-latoc)));
regx = super;
regy = latoa;
regz = latob;
regt = latoc;
}
}// fine erone
programma (5) partitore() Inserire Vin in x, e i valori delle resistenze in serie
Vedi listato qui sotto
//*******************************************************
// partitore di tensione
//*******************************************************
void partitore() // funzione 05
{
//Vn= VIN(Rn/(R1 + R2 + R3)
double r1 = regy; // inserire valore R1 in omm
double r2 = regz; // inserire valore R2 in omm
double r3 = regt; // inserire valore R3 se non serve inserire 0
double vin = regx;// inserire Vin in Volt
double v1 = vin * ( r1 / ( r1+r2+r3));
double v2 = vin * ( r2 / ( r1+r2+r3));
double v3 = vin * ( r3 / ( r1+r2+r3));
regx = v1; // Volt in v1
regy = v2; // Volt in v2
regz = v3; // Volt in v3
regt = 0;
} // fine partitore
programma (6) sco_iva() Scorporo iva inserire in y l'aliquota, ed in x il totale con iva.
avremo in x iva, in y l'imponibile, in z il totale ed in t l'aliquota.
//*****************************************************************
// SCORPORO IVA impostare in Y l'aliquota
// impostare in X il totale compreso IVA
// in OUTPUT avremo:
// x = IVA, y = imponibile, z = il totale, t = aliquota.
// *****************************************************************
//
void sco_iva()// funzione 06 ****
{
//****************************************
double aliq = regy;
double total = regx;
double imponibile = (total*100)/(100+aliq);
//*****************************************
//output
regx = (total - imponibile); // IVA
regy = imponibile;
regz = total;
regt = aliq;
//*****************************************
} // fine scorporo iva
//---------------------------------------------------------------------------------------
Si possono realizzare programmi richiamabili utilizzando la stessa struttura.
Lasciate un commento se avete domande o riscontrate errori.
Grazie!!
Qui sopra la foto con le funzioni 2F aggiunte ( vedi tasti sulla destra con due funzioni).
Per utilizzarle premere il tasto 2F, per uscire dalle seconde funzioni premere ancora il tasto 2F.
Nessun commento:
Posta un commento
Vi ringrazio per la lettura e vi invito al prossimo post.
Se il post vi è stato utile, vi è piaciuto oppure no, scrivete un commento.
Un saluto a tutti.
Sergio
Copyright - Condizioni d’uso - Disclaimer
http://avventurarduino.blogspot.it/2012/10/inizia-lavventura-arduino-12-settembre.html