Creato da: DonnyLennon il 05/01/2011
esperienze, appunti e risorse di elettronica e robotica

Area personale

 

Contatta l'autore

Nickname: DonnyLennon
Se copi, violi le regole della Community Sesso: M
Età: 34
Prov: CL
 
 

Tag

 
RSS (Really simple syndication) Feed Atom
 

Ultimi commenti

Ultime visite al Blog

cicciociccioviperocelot1Antares1962NonnoRenzo0chernobyl0kappa41chief33francpierorsoyoghi63martano1979gianpaolomartyPeppe_DelPretefrak70xxiceJesGia
 

 

 

Allarme! Chiudere la porta!

Post n°5 pubblicato il 05 Luglio 2012 da DonnyLennon
 

Se vivi in campagna, soprattutto in estate, devi convivere con gli insetti. A partire dalle zanzare, le più fastidiose, continuando con moscerini, o scarafaggi, ragni. Per le finestre esistono le zanzariere, ma per le porte e i portoni può capitare di dimenticare la porta aperta, per qualche minuto, ma anche tutta la notte, risvegliandosi la mattina dopo con punture di insetti veramente spiacevoli.

Partendo da questo problema, per esercitarmi sull'utilizzo dei famosi microcontrollori PIC, ho sviluppato questo progetto:

Si tratta di un allarme, basato sul PIC 12F675. Lo schema è il seguente:

 

allarme_schema

Descrizione schema e funzionamento generale:

SW2 è un interruttore a pulsante che andrà installato sulla porta. Bisogna far si che quando la porta è chiusa, SW2 è premuto e i contatti sono aperti, ed a causa della resistenza interna di pull-up (da abilitare con i registri Option_reg e WPU) sul pin GP5 si legge lo stato logico 1. Quando invece la porta è aperta, SW2 è rilasciato e i contatti si chiudono portando il pin GP5 a massa (valore logico = 0).

Il pic all'accensione legge lo stato della porta GP5 e si comporta di conseguenza.

1 - Se GP5 = 1 (porta chiusa) Manda il pic in modalità Sleep. Cioè spegne i circuiti interni, per consumare poca energia, e sta in attensa di un interrupt che lo "svegli" da questa condizione

2 - Se Gp5 = 0 (porta aperta) Il pic dapprima fa un conteggio, tramite il registro TMR0, di circa 8 secondi, se dopo questi otto secondi la porta è ancora aperta allora inizia a far suonare l'allarme, mandando in uscita un onda quadra a circa 1000 Hz, con intervalli di 1 secondo di silenzio.

L'integrato 7805 serve a portare i 9 volt della batteria a 5 Volt per il PIC.

SW1 serve a scollegare l'alimentazione e quindi spegnere completamente il dispositivo.

 

Il codice che fa tutto ciò è il seguente:

unsigned short int contatore = 0;

void main () {

//inizializzazione
TRISIO = 0b00100000;
OPTION_REG = 0b00000110;
WPU = 0b00100000;
INTCON= 0b10101000;
IOC =   0b00100000;
GPIO = 0;
TMR0 = 0;

while (1) {

if (GPIO.GP5 == 0)
   { if (contatore == 255)
     {TMR0 = 0;
      contatore = 0;
      while (GPIO.GP5 == 0) {GPIO.GP0 = 0;
                             Delay_us (500);
                             GPIO.GP0 = 1;
                             Delay_us (500);
                             if (contatore == 30) {Delay_ms (1000); contatore = 0;} }}}

if (GPIO.GP5 == 1) {asm {sleep} ;}

}
}

void interrupt () {
if (INTCON.GPIF == 1) {GPIO.GP0 = 0; INTCON.GPIF = 0; contatore = 0; TMR0 = 0;}
if (INTCON.T0IF == 1) {INTCON.T0IF = 0; contatore ++;}
}

Per programmare il pic ho utilizzato il PICKIT2, e il software MicroC.

Ciò che mi piace di questo progetto è l'utilizzo di pochissimi componenti, di nessun resistore o condensatore, di nessun oscillatore esterno, poichè il PIC12f675 possiede un oscillatore interno a 4MHz.

 

 

 

Note importanti:

La CONFIGURATION WORD che ho utilizzato è: 0x0194

 

Per SW2 ho utilizzato un sensore di contatto, come quelli che si utilizzano per i robot: link. Essi hanno tre pin, in maniera tale da poter avere un apertura dei contatti quando viene premuto. Se non si dispone di un pulsante del genere, ma di quello classico, bisognerà modificare leggermente il codice.

Lo speaker è un piccolo altoparlante di 8 Ohm recuperato da un giocattolo.

GP3 si può settare o come Input o come reset (MCRL), agendo su la configuration word. In questo caso è un Input, quindi è buono portarlo a massa per evitare problemi dovuti al floating.

Questo è il circuito alloggiato in un case di plastica:

 

Per info TREVIS89@HOTMAIL.IT

BYE!

 

 

 
Condividi e segnala Condividi e segnala - permalink - Segnala abuso
 
 

Come riutilizzare un vecchio telecomando da tv?

Post n°4 pubblicato il 22 Maggio 2012 da DonnyLennon
 

Come riutilizzare un vecchio telecomando da tv, per pilotare due motori elettrici, e far muovere un piccolo robot? Basta un ricevitore IR, un driver per i motori, e ovviamente Arduino!

 

 

Lo schema a blocchi è semplice:

 

Il telecomando invia un codice binario al ricevitore Infrarossi. Arduino utilizzando la libreria IRremote converte questi codici in un segnale di comando per il driver L298 che pilota i moroti DC.

Il collegamento tra il driver L298, motori, arduino è il seguente:

Questo è il codice utilizzato:

 

 


 

#include

int RECV_PIN = 11;

int motore1 = 4;

int motore2 = 5;

int motore3 = 6;

int motore4 = 7;


int ledPin= 13;


IRrecv irrecv(RECV_PIN);

decode_results results;




void setup()

{

Serial.begin(9600);

irrecv.enableIRIn(); // Start the receiver


pinMode(motore1, OUTPUT);

pinMode(motore2, OUTPUT);

pinMode(motore3, OUTPUT);

pinMode(motore4, OUTPUT);

pinMode(ledPin, OUTPUT);

 

digitalWrite(motore1, LOW);

digitalWrite(motore2, LOW);

digitalWrite(motore3, LOW);

digitalWrite(motore4, LOW);

 

digitalWrite(ledPin, HIGH);

}



void loop() {



if (irrecv.decode(&results))

{Serial.println(results.value, DEC); //Restituisce il codice in esadecimale.

irrecv.resume();}

 


if (results.value == 1988706750) // VAI AVANTI

{digitalWrite(motore1, HIGH);

digitalWrite(motore2, LOW);

digitalWrite(motore3, HIGH);

digitalWrite(motore4, LOW);

delay(200);}

 

if (results.value == 1988727150) // VAI INDIETRO

{digitalWrite(motore1, LOW);

digitalWrite(motore2, HIGH);

digitalWrite(motore3, LOW);

digitalWrite(motore4, HIGH);

delay(200);}

 

if (results.value == 1988692470) //VAI A DX

{digitalWrite(motore1, HIGH);

digitalWrite(motore2, LOW);

digitalWrite(motore3, LOW);

digitalWrite(motore4, LOW);

delay(200);}

 

if (results.value == 1988739390) // VAI A SX

{digitalWrite(motore1, LOW);

digitalWrite(motore2, LOW);

digitalWrite(motore3, HIGH);

digitalWrite(motore4, LOW);

delay(200);}

 

if (results.value == 1988718990) // STAI FERMO

{digitalWrite(motore1, LOW);

digitalWrite(motore2, LOW);

digitalWrite(motore3, LOW);

digitalWrite(motore4, LOW);

delay(200);}

 

}

 

 
Condividi e segnala Condividi e segnala - permalink - Segnala abuso
 
 

Mini Gioco con Arduino e display LCD

Post n°3 pubblicato il 15 Aprile 2011 da DonnyLennon
 

 

Questo semplice progetto utilizza un display LCD di tipo alfanumerico 16X4, 16 colonne, 4 linee, con controller HD44780. E' il controller/driver per display lcd più utilizzato. Per vedere se il vostro LCD ha questo componente, controllate la sigla dell'integrato nel retro del disply, come in figura sotto:

retro lcd

 

Ovviamente Arduino ha delle librerie appostite per queste periferiche. La libreria da utilizzare è la LiquidCrystal. Fortunatamente è già presente nelle librerie varie di default che si trovano quando installi arduino.

Possiede pochi e semplici comandi. Ma veniamo prima al cablaggio dei componenti.

CABLAGGIO:

cablaggio

 

L'immagine è tratta dal sito di Arduino, e spiega con molta chiarezza i collegamenti da effettuare. Consiglio di utilizzare una breadboard, evitando di effettuare saldature.

In questo caso il display è a 16 pin. Alcuni sono a 14 pin. Gli ultimi due servono per il controllo della retro illuminazione, di cui per adesso non ce ne occupiamo.

NOTA BENE: Il pin 3 del display (chiamato Vb nell'immagine sopra) è per il controllo del contrasto. Nella figura mediante un potenziomentro gli viene data una tensione variabile da 0 a +5V. Variando il potenziometro si regola lo schermo finchè non si vedono i caratteri con chiarezza. Però in alcuni display (ed anche nel mio, lo STIM 212) bisogna collegare Vb ad una tensione negativa -5 Volt, mediante una resistenza. Il valore della resistenza adatta varia sempre a seconda dello schermo. Provate con qualche centinaia di Ohm, poi con qualche KiloOhm e così via... O utilizzate un potenziometro per trovarla con precisione.

 

CODICE:

Prima di programmare arduino con questo codice, consiglio di fare un pò di pratica e provare con codici più semplici come Hello World, che trovate QUI. In questo modo si imparano i semplici comandi di scrittura, e modifica dei caratteri.

Le istruzioni principali sono:

lcd.setCursor(x, y): sposta il cursore nella posizione colonna x, riga y.Vedi esempio sotto:

lcd.print("k"); stampa il carattere "k", nella casella indicata da setCursor

 

Veniamo al codice!

Il firmware realizza un semplice giochino. Come si vede dal video, una "palla" (che non è altro che il carattere ASCII "O"), cade dall'alto, e tramite un secchio (carattere "D") bisogna evitare che la palla cadi per terra. Il secchio si muove orizzontalmente e si sposta a sx e dx mediante due pulsanti esterni collegati ai pin 8 e 9 di arduino. Collegate i due pulsanti come mostra la figura sotto (il cavo "SEGNALE" va al pin 8 / 9 di arduino), con una resistenza da qualche KOhm. Normalmente SEGNALE è uguale a 0, premendo il pulsante SEGNALE = Vcc.

 

pulsante

 

 

#include <LiquidCrystal.h>

int n = 0;            //altezza palla
int m = 2;           //posizione orizzontale palla
int p = 1;          //posizione orizzontale secchio


boolean game = true;  //introduce una variabile booleana (vero/falso)
                      //true= gioco attivo, false= gioco disattivo

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);  //setta i pin del display                                                                          
void setup() {pinMode(8, INPUT);
             pinMode(9, INPUT);
             lcd.begin(16, 4);}        

//lcd.begin(16, 4) dichiara che il display è 16(colonne) per 4(righe)


void loop() {
if (game == true)             //gioco in stato ON
{lcd.setCursor(n, m);      
lcd.print("O");                 
lcd.setCursor(15, p);         
lcd.print("D");                     
delay(120);          
lcd.clear();      //effettua il refresh dello schermo
n++;              //incremento n. Per far scendere la palla

if(n==16) {if(m != p) {game= false;}  //CONDIZIONE DI GAME OVER
           n=0; m= random(4);}

if(digitalRead(9) == HIGH) {p++;}   //sposta il secchio a sx
if(digitalRead(8) == HIGH) {p--;}   //sposta il secchio a dx

if(p==-1) {p=0;}         //limiti dello schermo                       
if(p==4) {p=3;}                      
}

if (game == false)          //stato di gameover...
{lcd.setCursor( 3, 0);                          
lcd.print("HAI PERSO!");
lcd.setCursor(0, 2);
lcd.print("premi un tasto...");
if((digitalRead(8)==HIGH)||(digitalRead(9)==HIGH)) {game=true;}
}

}

 

NOTA BENE:

Sto utilizzando il display nella posizione verticale. Quindi la palla scendendo avanza di colonna! E' come se le righe fossero colonne e viceversa.

L'istruzione setCursor(m, n) inizialmente mi ha dato problemi. Mi pare di aver letto che sia presente un bug quando si utilizzano display 16X4. Quindi consiglio inizialmente di provare l'istruzione scrivendo un carattere in un punto fissato dello schermo con l'istruzione lcd.print(), preceduta da setCursor(m, n). Se riscontrate problemi andate nella cartella librerie e modificate il file "LiquidCrystal.cpp", modificando i valori assegnati a:

int row_offsets[]:

Io ho utilizzato questi, ed ho risolto il problema:

int row_offsets[] = { 0x00, 0x40, 0x10, 0x50 };

 

 

PER QUALSIASI DUBBIO, O SUGGERIMENTO O CRITICA, CONTATTATEMI!

trevis89@hotmail.it

ALLA PROSSIMA BYE!

 
Condividi e segnala Condividi e segnala - permalink - Segnala abuso
 
 

Arduino Drum Pad - Tutorial

Post n°2 pubblicato il 08 Gennaio 2011 da DonnyLennon
 

 

Questa estate ho provato un buon prodotto della Roland, l'Octopad, una specie di batteria elettronica. Mi sono innamorato al primo colpo di bacchetta. Peccato che i prezzi si aggirano sopra le 500 euro. Fu li che mi venne l'idea per questo progetto.

Questo strumento non è altro che un insieme di pad-sensori collegati ad una centralina, che rispondono alla pressioni di una bacchetta, o della mano del musicista, producendo in tempo reale suoni elettronici digitali, cioè campionati.

Per mia fortuna avevo da poco scoperto Arduino, e cercando in rete capii che arduino riesce a ricevere e inviare segnali MIDI.

Il segnale MIDI, e il protocollo MIDI in generale è un sistema di codifica, che ad uno specifico byte (8 bit), fa corrispondere una specifica azione. Ha le sue regole e la sua frequenza di trasmissione. Esso è utilizzato in campo musicale, ed è proprio li che è stato inventato, poichè permette di "descrivere" come sta suonando il musicista. Quando ad esempio un tastierista preme un tasto della sua tastiera MIDI muta, essa non manda in uscita un segnale audio, ma bensì un insieme di byte che informano "ho premuto il tasto Do", "sto tenendo premuto il tasto", "ho rilasciato il tasto", e così via... sarà poi un altro software a tradurre queste informazioni in segnali audio.

Per approfondimenti sul protocollo midi potete guardare questo SITO:

 

I SENSORI

La traduzione Meccanica->Elettrica è svolta in maniera efficace dai cosidetti "Buzzer Piezoelettrici". Essi sono dei sottili cerchi metallici aventi al centro un cristallo piezoelettrico, che produce una differenza di potenziale, quando è soggetto ad una deformazione meccanica.

Li potete trovare a pochi euro in questo NEGOZIO scrivendo nella casella cerca: "buzzer piezo". Io ho utilizzato quelli da 27mm.

 

CENTRALINA

E' costituita essenzialmente dalla piattaforma Arduino Uno e da pochi altri componenti.

Ho sfruttato i sei ingressi analogici di cui dispone. Questo è il motivo per cui il mio Arduino Drum Pad ha sei pad.

Collegando direttamente i sensori tra massa e ingresso analogico ho notato che appena sfioravo i pad avevo già una differenza di potenziale elevata in ingresso che non mi permetteva di ottenere una buona sensibilità di esecuzione. Per questo motivo ho inserito una resistenza di 100KOhm tra massa e ingresso analogico. Mi ha risolto il problema.

La centralina dispone di due switch che servono ad incrementare e decrementare l'ottava di esecuzione (più in la nel post spiegherò questo punto con più chiarezza), e di due led indicatori. Quello giallo, sempre acceso, indica che il programma su Arduino sta girando correttamente, il led Rosso serve a capire quale ottava stiamo suonando.

In corrispondenza di midi out dovete collegare una presa midi femmina connessa nel seguente modo:

 

IL FIRMWARE

Il firmware scaricabile qui, è relativamente semplice.

Il blocco più importante è il seguente:

lettoreSoglia0= analogRead(PAD0);
if (lettoreSoglia0 > soglia)
{
noteOn(0x90, nota0, 0x60);
delay(80);
}

AnalogRead è una funzione di Arduino che restituisce un numero compreso tra 0 e 1023 a seconda della tensione che legge sull'ingresso corrispondente, con una risoluzione di 4,9 mV.

Il programma legge la tensione presente sull'ingresso, analogRead restituisce un numero proporzionale alla tensione letta. Se questo numero è superiore al numero contenuto nella variabile "soglia" la condizione dentro If viene svolta e la funzione noteOn viene eseguita, cioè viene inviato un segnale midi. La variabile soglia puà essere modificata per modificare la sensibilità dell strumento. E' settata a 200.  Consiglio a chi vuole più sensibilità di diminuirla e portarla a 100 o 150.

 

void noteOn(int cmd, int pitch, int velocity)
{
  Serial.print(cmd, BYTE);
  Serial.print(pitch, BYTE);
  Serial.print(velocity, BYTE);
}

noteOn è la funzione deputata all'invio del segnale midi. Il segnale viene inviato in maniera seriale. I pin utilizzati per una trasmissione seriale su Arduino sono i pin digitali 1 (Tx) e 2 (Rx). Nel nostro caso si utilizza solo il pin 1 di trasmissione. La frequenza di trasmissione è specificata nell'istruzione: Serial.begin(31250).

cmd: è il byte che informa che è stato "premuto" un tasto, e specifica su quale "canale" inviarlo. Generalmente si dispone di 16 diversi canali. I sei pad inviano segnali in sei canali diversi.

pitch: specifica quale nota si sta premendo. Le note sono inizialmente impostate nella quarta ottava, a partire dal Do.

Tramite i due switch e con le istruzioni: 

if (digitalRead(sw1) == HIGH)
{nota0= nota0 + 12;}

if (digitalRead(sw2) == HIGH)
{nota0= nota0 - 12;}

si cambia l'ottava e quindi le note inviate.

velocity: specifica con quale intensità si preme il tasto. Nel firmware ho inserito un valore medio.

 

 

INTERFACCIA MIDI-USB

Questi segnali midi devono essere riconosciuti ed tradotti in segnali audio. Questo compito è svolto da un software in un personal computer. Per interfacciare arduino con il pc, si può utilizzare un convertitore midi-usb. Essi non hanno prezzi elevati. Con 50 euro si può prendere ad esempio gli m-audio midisport.

Sono di semplice utilizzo ed installazione. Hanno un ingresso midi, ed un uscita usb da collegare al pc.

 

IL SOFTWARE

Dopo miliardi di tentativi, il software migliore che ho trovato per far quello che mi serve è il SFZ della Cakewalk.

E' un lettore-riproduttore freeware di file Sound Font. I file sound font sono delle librerie di suoni campionati. Con questo programma potrete associare ad ogni pad dello strumento un diverso suono campionato. Per far ciò dovrete prima verificare che il programma riconosca l'interfaccia midi-usb, e poi caricare il file sound font.

I file sound font si trovano in rete liberamente scaricabili. Io ne ho trovati a centinaia. Sta a voi scegliere quale suono vi interessa.

 

RIASSUMENDO...

Il collegamento è: Piezo -> Arduino -> interfacciaMidi/USB -> PC
Non ti serve altro. Il suono esce dalle casse interne del pc, o dall'uscita cuffie del pc...
Consiglio:
Inanzitutto verifica che la periferica (interfaccia Midi/USB) funziona correttamente: pannello controllo/gestione dispositivi
Poi ti consiglio di scaricarti i driver audio chiamati ASIO 4 ALL.
Così quando apri il programma Sfz nelle impostazioni scegli questi driver.


REALIZZAZIONE DEI PAD E DEL SUPPORTO

Per creare qualcosa di esteticamente guardabile ho deciso di incollare i sei pad su di una base rettangolare di legno. Il problema che può sorgere è che le vibrazioni si possono trasmettere in tutto il supporto, e quando la bacchetta va a suonare uno specifico pad, anche gli altri sensori possono ricevere il "colpo" ed inviare messaggi sbagliati. Per questo motivo consiglio questo sistema da me collaudato:

consiste in uno strato di plastica rigida sottile che funge da base (può essere incollato al legno o attaccato tramite 4 viti), un pò di spugna o gomma piuma sottile che fa da cuscino al sensore appoggiato di sopra. Il tutto è chiuso da un quadrato di gomma dura sottile (acquistata dal ferramenta), che permette anche il rimbalzo della bacchetta.

A destra dei pad, ho attaccato una scatolina di plastica in cui ho inserito arduino, le resistenze (montate su una piastra millefori), gli interruttori, e i led.

 

 

 
Condividi e segnala Condividi e segnala - permalink - Segnala abuso
 
 

Il PERCHE' di questo blog

Post n°1 pubblicato il 06 Gennaio 2011 da DonnyLennon

Premessa: prima di iniziare a scrivere delle mie esperienze elettroniche premetto che non sono un professore o un grande esperto di elettronica. Sono ancora uno studente di ingegneria elettronica e come tale ho tante cose da apprendere e capire. Ma ho anche molta voglia di condividere e donare quello che giorno per giorno imparo. Questo è il perchè dell'esistenza di questo blog.

Questo è un blog per chi vuole iniziare a fare elettronica, per chi muove i primi passi, ma anche per chi già ha le sue esperienze ed ha fame di nuove informazioni. Perchè l'elettronica è così vasta che non si finisce mai di imparare. Ed anche quando sai tutto quello che c'è da sapere, nuove tecnologie spuntano nel mercato, e nuovi mondi si aprono davanti i tuoi occhi.

 

Contattatemi per qualsiasi informazione, domanda, critica!

 

BUONA LETTURA!

 
Condividi e segnala Condividi e segnala - permalink - Segnala abuso
 
 

© Italiaonline S.p.A. 2024Direzione e coordinamento di Libero Acquisition S.á r.l.P. IVA 03970540963