Controllo Bluetooth col Nano



Con un po’ di tempo a disposizione ho pensato di mettere su un controllo tramite bluetooth. La cosa è alquanto semplice usando quei moduli disponibili sul mercato. Io ho preso un HC-06, che permette la semplice comunicazione di dati via seriale. Il progetto non è recente, perdonate qualche difetto di inesperienza.

Ho provato anche con un PIC 16F84A, con discreto successo, ma per problemi di programmazione del microcontrollore ho sospeso il progetto. Un micro piuttosto obsoleto, ma credo che potrei farlo con un 16F628A o 16F182x, che sono pin compatibili. Anche perché ormai non ho più quei microcontrollori nei cassettini.

È una semplice operazione di collegare le uscite dell’ Arduino con i seguenti moduli e una manciata di componenti discreti per pilotare un altoparlante e quella di togliere l’ alimentazione al modulo Bluetooth per poter disconnettere da dispositivi quando si dimentica connessi.

Descrizione

Un progetto composto da Arduino Nano, un modulo Bluetooth e uno di rele’ opto-isolati.

Il progetto include alcune peculiarità :

  • Il numero di uscite e le porte sono configurabili tramite firmware. Bisogna aggiustare 2 variabili [1].

  • Le uscite sono configurabili attive alte oppure basse. Nel programma per difetto si è assunto uscite attive basse.

  • Le uscite possono essere configurate sia come fisse che come temporizzate. L’ Arduino si prende cura di tenere il conteggio, anche se chi ha invito il comando non è più presente. Faccio presente perché ho notato programmi di temporizzazione con lo smartphone, che deve tenere il conteggio del periodo impostato. Quello implica una costante connessione con il telefono.

  • I comandi [2] si inviano con un comando che termina tramite carattere spazio oppure uno di ritorno-a-capo, al limite quando sono stati inviati 6 caratteri si conclude da solo. Perchè questo, per il semplice fatto che molti programmi, per Android, non danno la possibilità di aggiungere caratteri non stampabili come il ritorno-a-capo.
    Io ho scelto il programma
    DCmote. Alquanto spartano per la configurazione, ma del resto semplice da capire. Soprattutto per quelli che non sanno tanto l’ uso di funzioni complicate dello smartphone. L’ intefaccia e semplificata al massimo e permette di accedere velocemente ai comandi, dopo aver connesso al controllo.

  • Il controllo disconnette l’ utente inattivo (senza invio caratteri) dopo 30 secondi. Questo permette ad altri utenti di poter accedere al controllo. Forse è più una lacuna del ricevitore bluetooth, che piuttosto una miglioria. In tal modo se uno dimentica la connessione attiva, viene disconnesso e gli altri membri (della mia famiglia) potranno accedere ai comandi.

  • Il lampeggio, tanto per vedere che il sistema è attivo e funzionante.

  • Un comando per suonare un allarme o un altro suono.

    Le postille [1] e [2] vedasi più in basso.

Schema Elettrico

Ovviamente i transistor non sono critici, qualsiasi tipo NPN e PNP fanno il lavoro. La R2 è un valore di 330 Ohm, tanto da pilotare un led da mettere sul pannello del contenitore.


I jumpers serviranno per la programmazione in loco, togliendoli si potrebbe programmare l’ Arduino, senza interferenze, ma lo sconsiglierei tanto che io ho previsto degli zoccoli per accomodare il Nano. Si eviteranno possibili fughe di tensione verso l’ alimentatore.

L’ alimentatore deve essere da 5 Volt stabilizzato e alquanto robusto per alimentare i relé, se alimentati dalla scheda. Meglio che sia da un Ampere.

L’ Arduino non e’ incluso nello stampato. Nello schema si denota una serie di connettori (4 da 8 poli) per alloggiare l’ Arduino.

Circuiti Stampati

SOTTO SOPRA      

 

ATTENZIONE !

Lo stampato di sotto è corretto, per metterlo sulla faccia ramata.

 

Funzionalità del programma

Come definito dalle peculiarità si può anche modificare il firmware per ottenere la flessibilità voluta.

[1] Le variabili che permettono di configurare sono le seguenti:

#define ACTIVE_LOW se viene venisse commentata la linea, le uscite diventano attiva alte. I rele’ che ho usato invece funzionano in logica negata.

#define BUFLEN se viene alterato si può usare una diversa capacità di input dalla seriale. Solo per coloro che intendono modificare il firmware per diversi scopi.

#define OUTPUTMASK si definisce quelle uscite che non saranno influenzate da una accensione generale. Nel mio caso specifico, non posso tenere il contatto chiuso per il comando definito ad uso ad impulso per muovere il cancello. Il sistema del cancello ha già le sue sicurezze, ovviamente.

#define NUMTIMER se viene alterato si può stabilire quante uscite si vuole impegnare. Io ho un modulo a 4 relè, perciò c’è messo quattro. Ma si può aumentare sino ad otto tenendo conto che gli assegnamenti definiti dal programma sono i piedini 12,11,10,9,A0,A1,A2,A3. Anche questi facilmente modificabili, vedi sotto.

#define INPUT_TMO una definizione di quanto aspettare prima di sconnettere un utente inattivo. Il valore è in mezzi secondi. Il valore massimo è si 255 (oltre 4 minuti), senza alterare altre parti del programma.

array port_pin[] si può definire quali piedini assegnare. A partire da sinistra come primo assegnato.

Come si potrebbe intuire i valori sono stati messi in una lista all’ inizio del firmware. Per coloro che capiscono la programmazione sarà facile da individuare.

[2] I comandi da inviare al controllo sono siffatti:

  1. Per accensione fissa di una uscita si comanda con una lettera maiuscola da A a H. Interverra’ il limite imposto da quante uscite s’è configurato con NUMTIMER.

  2. Per avviare una melodia si usa la lettera p, indifferentemente se maiuscola o miniscola. Le melodie sono eseguite in sequenza. Per i più esperti si potrà configurare per suonare anche una sorta di sirena o altro. Basta mettere nella lista const uint16_t melody e modificare TUNENUM che stabilisce quante sono. C’è un limite nella lun-ghezza di un array che è 127. Per sicurezza la funzione carica solo i primi 126 valori oppure si ferma con due zeri conseguitivi. Per chiarire, la funzione si aspetta una coppia di valori che sono la frequenza e la durata.

  3. Per lo spegnimento di tutte le uscite si usa la lettera x minuscola incluse le uscite temporizzate.

  4. Per l’ accensione di tutte le uscite, si usa la lettera X maiuscola. Saranno escluse quelle definite non accessibili dalla maschera di output.

  5. Per i comandi con i temporizzatori si usa la seguente stringa:


    t (carattere iniziale)
    definizione per indicare un timer, non importa se maiuscola o minuscola.

    una cifra da 0 al numero dei timer
    definiti dal firmware. ATTENZIONE che l’ HEX carica per 4 uscite. (secondo carattere). Ora ne conta solo 4. Se ci fosse abilitata la comunicazione seriale, si vedono i messaggi di errore. Quindi per esempio da 0 a 3. L’indicizzazione parte da zero.

    s o m oppure h
    definizione della unita’ misura da impostare. Con s si indica i secondi, m si indicano i minuti e h le ore.

    da una a tre cifre
    il valore da impostare al timer con la grandezza precedente voluta. Per le ore c’è il limite fissato a 9 ore. Potrebbe esserci un problema ad impostare 999 minuti. Credo che aggiornerò il programma presto.

    uno spazio
    conclude la stringa ricevuto. quindi con il programma DCmote si dovrà impostare i comandi con una terminazione con lo spazio. Anche il ritorno-a-capo conclude.

    Per esempio t3s45, si traduce con l’ uscita 4 attiva per 45 secondi.

Caso limite, inviando un valore zero ad un timer, questo viene concluso.

Il pacchetto è sempre disponibile nella sua completezza compreso lo sketch per Arduino. Se ci fosse qualche difficoltà a compilarlo, fatemelo sapere.

 

 

Ho fatto anche il programma che converte RTTTL in valori da caricare in C. Come si può notate dal listato ci sono diverse melodie che ho convertito con il mio programma. Incluso nel pacchetto. Per funzionare serve python versione 3.5 .

 

VOTO
1 commento
  1. Amilcare
    Amilcare dice:

    Sei sicuro che non si possa ottenere uno stampato in unica faccia estremamente più semplice da realizzare per un hobbista, mi ripropongo di realizzarlo per il mio garage/laboratorio appena avrò creato una rete wifi affidabile
    Per il momento riesco ad avere internet lì solo trasportando la linea sovrapposta ai cavi della alimentazione 230V e decodificare in loco. Pur raggiungendo lo scopo ho forte limitazione nella quantità di dati che riesco a veicolare ma, altre soluzioni si sono rivelate più costose e meno efficienti o meno affidabili.

    Approvazioni

Lascia un Commento

Vuoi partecipare alla discussione?
Fornisci il tuo contributo!

Lascia un commento