MakerFaire: Ardufonino 1.0 il cellulare italiano Open Source

MakerFaire ardufonino

Introduzione

Ardufonino è il primo cellulare opensource creato con Arduino, capace di effettuare e ricevere chiamate e di inviare e ricevere messaggi. Inoltre con la realizzazione di questo progetto ho voluto gettare le basi per la costruzione di un sistema telefonico elementare.

L’idea mi è venuta per semplice curiosità, perchè volevo fare qualcosa che nessuno avesse mai fatto, dimostrando a tutti che volere è potere.

[youtube http://www.youtube.com/watch?v=5Kopyrwn_Oo]

Ardufonino 1.0

L’Ardufonino è composto da 3 parti:

  • Shield di interfacciamento, è la parte con la quale controlliamo il telefono, è costituita da una tastiera di 11 pulsanti, da un display LCD retroilluminato, da un microfono, da un altoparlante e da 14 resistenze. La disposizione dei componenti è quasi uguale a quella dei vecchi cellulari con tastiera, per via della sua enorme comodità, inoltre questa interfaccia può essere collegata sia ad un arduino UNO e ad un arduino MEGA.
Ardufonino shield
  • Shield GSM, un circuito che ci permette appunto di ricevere ed inviare chiamate e messaggi, per pilotarlo utilizzeremo dei comandi AT che arduino invierà tramite una comunicazione seriale creata da me. Questa shield ha integrata l’uscita e l’ingresso audio tramite un jack, l’antenna ed il modulino GSM.
Ardufonino shieldGSM
  • Arduino UNO, un microcontrollore che funziona a 16MHz, con 13 pin digitali e 6 analogici è il componente più importante del progetto, perchè permette, la realizzazione vera e propria del cellulare, dato che fa da tramite tra le due shield.
Ardufonino Arduino

Per ulteriori informazioni e per scaricare il software andate su questo link:

http://www.davidealoisi.it/ardufonino/

Controllo Alimentazione

Per visualizzare il livello della batteria sul display ho creato la funzione Livello_batteria( ), che ci permette di vedere sulla parte alta a destra dello schermo lo stato dell’alimentazione.

Ho creato 9 array, chiamati: batteria_1, batteria_2, batteria_3, batteria_4, batteria_5, batteria_6, batteria_7, batteria_8 e simbolo_USB, ognuno dei quali rappresenta un livello di carica della batteria.

Ardufonino - Schematica

Per poter leggere il voltaggio della pila ho dovuto utilizzare un partitore di tensione, che fornisce al pin analogico di arduino una tensione apri alla metà dell’alimentazione.

La formula per il calcolo è molto semplice:

A1 = [ R2 / (R1 + R2) ] * Vcc

Nel nostro caso avremo

A1 = [ 82000 / (82000 + 82000)]*9 = 4.5V

Per poter sapere la tensione, sono stato obbligato ad utilizzare questo circuito, perchè i pin analogici di arduino sopportano al massimo 5V, e collegandone 9 avrei probabilmente bruciato il microcontroìllore.

Ardufonino - battery

Una volta finito il circuito ho potuto completare la funzione, nella quale, mi leggo il valore della tensione compreso tra 0-1023 e tramite una proporzione (map) converto questo risultato in valori compresi tra 0-8 (variabile batteria), successivamente mi basterà assegnare ad ognuno di essi uno degli array precedenti.

Ardufonino - plug

Questa funzione ci permette di capire se il cellulare è alimentato tramite USB, mostrandoci quest’icona, in alto a destra del display. Sapendo quanto valevano 5V (più o meno 530-541), ho messo un if, che fa comparire quest’immagine solamente quando collego l’USB.

Chiamata

Il programma inizia con una conversione da variabile a stringa del numero da chiamare, permettendoci, tramite il comando ATD di effettuare la chiamata. Dopo di che ci sarà un ciclo do che avrà due compiti: quello di mostrare la scritta “CALLING” sul display LCD e quello di concludere la telefonata con il comando ATH, solamente se spingeremo il pulsante al lato del telefono.

Controllo Tastiera

La tastiera in questo progetto è fondamentale, perchè è l’unico modo per potersi interfacciare al dispositivo (l’alternativa è usare il Serial Monitor).

Ardufonino - Schematica 2

L’immagine sopra rappresenta la schematizzazione circuitale della tastiera, che ci permette di leggere, con un solo pin analogico, ben 10 pulsanti. La logica di funzionamento è sempre quella del partitore di tensione, infatti, non faccio altro che assegnare ad ogni resistenza il valore di 0.5V e quando un pulsante viene premuto chiude il contatto, restituendo al pin A5 una tensione pari al numero di resistenze nel ramo per 0.5. La resistenza per fare la partizione è molto grande perchè così non avremo grandi perdite.

Ipotizziamo che venga chiuso il contatto J3, la tensione ai capi di A5 sarà uguale a:

Rs = R0 + R1 + R2 = 5100 ohm

Vpuls = [ Rpartitore/ (Rs + Rpartitore)] * 0.5 * Nresistenze =

Vpuls = [ 1000000/ (5100 + 1000000)] * 0.5 * 3 = 0.99 * 0.5 * 3 = 1.5V

Una volta realizzato il circuito sono passato alla scrittura del programma, che inizia con un ciclo do, nel quale leggo ogni 10mS il pin A5 e per uscirne basterà premere: o un tasto della tastiera o il tasto chiamata.

Successivamente quando usciremo dal ciclo il valore analogico del pulsante premuto sarà convertito nel valore effettivo del tasto, tramite una proporzione (map) ed infine, la funzione ci restituirà questo risultato.

Il problema dell’antirimbalzo è stato risolto non via hardware, ma via software mettendo un ritardo all’interno della funzione.

Inserimento numero

Questa funzione ci permette di scrivere, tramite la tastiera il numero che vorremo chiamare. All’inizio troviamo delle variabili che verranno incrementate ogni volta che digiteremo qualcosa, facendo scorrere verso destra il numero successivo. Successivamente troveremo un if che, se vero, azzererò tutte le variabili, altrimenti svolgerà questi due calcoli:

numero_da_chiamare = numero_da_chiamare + ((numero_digitato) * potenza_posizione_numero);

potenza_posizione_numero = potenza_posizione_numero / 10;

La logica della formula è molto semplice, se per esempio volessimo scrivere il seguente numero

3286773254

la formula lo calcolerà cosi:

3*1000000000+2*100000000+8*10000000+6*1000000+7*100000+7*10000+3*1000+2*100+5*10+4*1 = 3286773254

Naturalmente il numero precedente si sommerà con quello successivo ad ogni ciclo.

Schermata d’avvio

Questa funzione è la più semplice del programma, infatti, il suo compito è quello di mostrare una scritta durante l’accensione del cellulare, per poter dare a quest’ultimo il tempo di connettersi alla rete.

Risposta Chiamata

Questa funzione ci permette appunto di rispondere ad un eventuale chiamata, tramite il pulsante di chiamata, che una volta premuto farà inviare al GSM il comando ATA, permettendoci di rispondere. Durante la conversazione il programma entrerà in un ciclo do che mostrerà sul display LCD la scritta “CONVERSATION”, per concludere la chiacchierata basterà premere di nuovo il pulsante laterale dell’Ardufonino.

Funzioni Pagine

Le funzioni delle pagine sono quelle che fanno visualizzare sul display LCD le possibili azioni da compiere, mostrandoci anche quali pulsanti premere.

Scelta dei numeri nella rubrica per poterli chiamare, oppure inviargli un messaggio.
Decisione se prendere un numero dalla rubrica oppure scriverlo a mano.
Scelta se entrare nella modalità CHIAMATA, oppure se entrare nella modalità MESSAGGISTICA.
Si presenta così l’interfaccia per poter scrivere un numero, in alto a destra abbiamo il conteggio dei numeri digitali.
Scelta del messaggio da inviare tramite SMS.

Rubriche

I numeri di cellulare sono salvati in variabili unsigned long globali, e non è possibile immetterli tramite tastiera.

In questo programma abbiamo due tipi di rubrica:

  • La rubrica riservata alle chiamate: al suo interno troviamo una variabile che aumenterà di 1 se verrà premuto il tasto 8 e diminuirà di 1 se verrà premuto 2, questa variazione ci permetterà di scorrere i numeri di telefono, che si troveranno all’interno di uno switch. Una volta scelto il numero basterà premere il tasto laterale per effettuare la chiamata.
  • La rubrica riservata ai messaggi: questa funzione è identica alla prima l’unica differenza è che premendo il tasto laterale si invia il messaggio scelto.

Ho deciso di fare due rubriche perchè avendo un unico pulsante di invio avrei avuto problemi a fare un’unica funzione.

Invio Messaggi

Quando viene chiamata in causa questa funzione, il GSM riceve il seguente comando AT + CMGS, che serve a decidere a quale numero inviare il messaggio, successivamente viene preso il testo da inviare (scelto precedentemente) , e tramite il rigo “mySerial.println((char)26;”, viene inviato.

Ho deciso di inserire nel programma messaggi già caricati per comodità, così non ho dovuto creare una funzione per la scrittura del messaggio stesso.

Lettura Messaggi

Per leggere i messaggi che mi vengono inviati, controllo semplicemente se la seriale del GSM ha in uscita dati disponibili tramite la funzione available, e se così fosse la funzione farà comparire il messaggio sul display.

Pulsante Chiamata

Il pulsante chiamata ci permette di:

  • chiamare
  • rispondere
  • inviare SMS

Ho deciso di farlo funzionare a logica positiva ovvero:

  • Quando è premuto restituisce 1
  • Quando non è premuto restituisce 0

La lettura del pulsante avviene tramite l’istruzione digitalRead del pin digitale 6.

Loop

Nel ciclo loop troviamo degli if con gli appositi else, che ci permettono di sfruttare tutte le funzioni descritte precedentemente, tramite la tastiera.

Riferimenti

Tutte le informazioni aggiuntive le potete trovare sul mio sito www.davidealoisi.it.

Lascia un commento

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.