Prima applicazione Android – Richard Benson

Riprendo il blog per pubblicare il mio primo esperimento di programmazione Android.

L’app consiste principalmente in una soundboard di frasi di Richard Benson, che è possibile salvare come suonerie (premendo il tasto associato alla frase per alcuni secondi). Inoltre è presente una lista di link che rimandano ai video presenti su youtube


Android app on Google Play

Sviluppi

Per rendere più interessante il progetto, in futuro cercherò di migliorare il lato dell’output sonoro – che per ora si limita alla variazione di frequenze del piezo buzzer – innanzitutto rendendo il suono più gradevole e magari integrandolo con un synth o con un pc (in questo modo potrei sia inserire suoni diversi che inserire il controller del volume).

Final Release: Arduino Theremin

L’ultimo passo del progetto il rilascio finale del theremin, in seguito descriverò tutti gli step necessari per la costruzione.

Prima parte: il design fisico

per la costruzione del mio animaletto ho stampato il modello trovato all’indirizzo  http://www.bentheillustrator.com/speakerdog_index.html

Qui è possibile scaricare il modello in PDF

Seconda parte: Arduino e la board

Qui sotto trovate lo schema dei collegamenti che ho effettuato.

Lo schema è ben descritto nelle immagini sopra, cmq il  sensore è collegato ad un analog in mentre il buzzer al pin 9 PWM.

Il led inserito nel pin 13 sta ad indicare il tempo in cui è possibile calibrare il sensore.

Parte Terza: il codice

Infine pubblico il codice per far funzionare arduino come un theremin.

int sensorTone = 5;
int buzz = 9;
int sensorMax=0;
int sensorMin=1023;
int tone;

void setup() {
 Serial.begin(9600); // il led segnala che si deve inserire i valori massimo minimo che si vogliono impostare come limite
 pinMode(13, OUTPUT);
 pinMode(buzz, OUTPUT);
 digitalWrite(13, HIGH); // 2 secondi per impostare i valori
 while (millis() < 2000) { //cambiando questo valore è possibile variare la durata del calibratore
 tone = analogRead(sensorTone);
 if (tone > sensorMax) {
 sensorMax = tone;
 }
 if (tone < sensorMin) {
 sensorMin = tone;
 }
 }

 digitalWrite(13, LOW);
}
void loop() {

 digitalWrite (buzz, HIGH);
 delayMicroseconds (tone / 2);
 digitalWrite (buzz, LOW);
 delayMicroseconds (tone / 2);
 tone = analogRead(sensorTone); //legge il valore del fotoresistore
 tone = map(tone, sensorMin, sensorMax, 1000, 5000); // associa il valore letto al tono del buzzer

Serial.println(tone); // nel serial monitor è possibile leggere i valori assunti dal fotoresistore

}

Va fatta una precisazione il progetto avrebbe previsto anche il controllo del volume del buzzer tramite sensore fotosensibile (in modo simile al controller del tono), in realtà ho trovato difficoltà a integrare nello stesso codice due input per un solo output. Solo dopo vari tentativi ho scoperto che la cosa è possibile solo con l’integrazione di altro hardware.

Questo potrebbe essere un interessante sviluppo futuro del progetto.

Software alpha

Dopo aver sviluppato hardware e software sia per il controller volume che per il controller del tono, ho incontrato difficoltà a integrare le due parti di codice. Per questo motivo ho deciso di limitare il prototipo al solo controllo del tono.

Il codice seguente integra, un calibratore del fotoresistore (per adattarsi in ogni luogo e ad ogni persona) e il programma che permette di modificare la frequenza del buzzer.

int sensorTone = 5;
int buzz = 9;
int sensorMax=0;// = 190;
int sensorMin=1023;// = 86;
int tone;

void setup() {
 Serial.begin(9600); // il led segnala che si deve inserire i valori massimo minimo che si vogliono impostare come limite
 pinMode(13, OUTPUT);
 pinMode(buzz, OUTPUT);
 digitalWrite(13, HIGH); // 2 secondi per impostare i valori
 while (millis() < 2000) {
 tone = analogRead(sensorTone);
 if (tone > sensorMax) {
 sensorMax = tone;
 }
 if (tone < sensorMin) {
 sensorMin = tone;
 }
 }

 digitalWrite(13, LOW);
}
void loop() {

 digitalWrite (buzz, HIGH);
 delayMicroseconds (tone / 2);
 digitalWrite (buzz, LOW);
 delayMicroseconds (tone / 2);
 tone = analogRead(sensorTone); //legge il valore del fotoresistore
 tone = map(tone, sensorMin, sensorMax, 1000, 5000); // associa il valore letto al tono del buzzer

Serial.println(tone); // nel serial monitor è possibile leggere i valori assunti dal fotoresistore

}

Adesso non rimane che riprogettare il toy (alla luce delle nuove potenzialità) realizzare il prototipo look&feel, implementare e testare

Inizio fase di Coding

Come da roadmap il pomeriggio è stato dedicato alla ricerca materiali (e soprattutto sensori) e lo sviluppo hardware.

Nel tempo rimanente ho iniziato a cercare di sviluppare la parte software riuscendo a far funzionare il controller del volume del futuro theremin. La giornata di domani sarà dedicata al controller delle frequenze e al testing pre implementazione.

Sotto la prima bozza di codice (si tratta di una pre-alpha) ; )

int sensorVol = 2;
int volume = 0;
int buzz = 9;
int sensorMax=0;// = 190;
int sensorMin=1023;// = 86;

void setup() {
 Serial.begin(9600);
 // il led segnala che si deve inserire i valori massimo minimo che si vogliono impostare come limite
 pinMode(13, OUTPUT);
 digitalWrite(13, HIGH);
 // 2 secondi per impostare i valori
 while (millis() < 2000) {
 volume = analogRead(sensorVol);

 if (volume > sensorMax) {
 sensorMax = volume;

 }

 if (volume < sensorMin ) {
 sensorMin = volume;

 }
 }

 digitalWrite(13, LOW);
}

void loop() {

 volume = analogRead(sensorVol); //viene letto il valore della luce
 volume = map(volume, sensorMin, sensorMax, 0, 255); //e viene associato il valore di luce massima con il valore di suono massimo, e viceversa
 volume = constrain(volume, 0, 255);
 analogWrite(buzz, volume); //emette il suono

Serial.println(volume,DEC);
;
}

Prototipo Cartaceo

In mattinata ho ricercato la forma che deve avere l’oggetto e ho deciso che utilizzerò il seguente modello

Ho scelto la seguente forma per inserire i due fotoresistori nelle mani della marionetta

Roadmap di sviluppo

Ho deciso di sviluppare il concept marionetta sonora o Theremin.

Ma che cos’è un Theremin?

Questo strumento è composto fondamentalmente da due antenne poste sopra e a lato di un contenitore nel quale è alloggiata tutta l’elettronica. Il controllo avviene allontanando e avvicinando le mani alle antenne, mediante quella superiore (posizionata verticalmente) si controlla l’altezza del suono, quella laterale (posta orizzontalmente) permette di regolarne l’ampiezza. Il suono può variare tra quello di un violino e quello vocale. Lo strumento è considerato molto difficile da suonare proprio perché lo si suona senza toccarlo. (http://it.wikipedia.org/wiki/Theremin)

La roadmap di sviluppo prevede la creazione di prototipi dal lato visivo (look&feel), hardware (role) e software; per poi integrarli e testarli.

Roadmap:

  • Martedì mattina – prototipo cartaceo;
  • Martedì pomeriggio – prototipazione hardware;
  • Mercoledì mattina – sviluppo software;
  • Mercoledì pomeriggio – testing e bugfix;
  • Giovedì mattina – RC1;
  • Giovedì pomeriggio – Release

Selezione concepts

Dalla prima selezione dei concepts sono stati estratti i 10 più interessanti e realizzabili.

  • Suicida;
  • Golem;
  • Bilbo;
  • Maestro di musica;
  • Musa;
  • Gandalf;
  • Dottore;
  • Fisioterapista;
  • Batteria luminosa;
  • Marionetta sonora;

In seguito, è stata effettuata un’ulteriore selezione che ha portato alla scelta di 2 concepts vincenti:

  • Maestro di musica; (più complesso)
  • Marionetta sonora; (più semplice e più di impatto)

Per domani mattina deciderò quale sarà il caso sviluppare.

ColorChooser Alpha 0.2

Some changes



/* This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
int x= 10;
int y=10;
int w=20; //rect width
int h=10; //rect height
boolean button = false;

void setup (){
size (275,100);
background (240, 240, 240);
}
void draw (){
stroke (0);
fill (255,0,0);
rect (x,y,w,h); // red button
fill (0,255,0);
rect (40,y,w,h); //green button
fill (0,0,255);
rect (70,y,w,h); //blue button
noFill();
stroke (0);

if (button){
fill (255, 0,0);
}else{
fill (255, 0,0);
}
stroke (0);
}

void mousePressed (){
if (mouseX>x && mouseX<x+w && mouseY>y &&mouseY<y+h && mousePressed){
println ("RGB color 255,0,0"); // RGB code for the red button
noStroke();
colorMode(RGB, 255);
for (int i=0; i < 255; i++) {
fill(i, 0, 0);
rect(i+10, y+y+y,1, 50); //black to red
}
} else if(mouseX>40 && mouseX<60 && mouseY>y &&mouseY<y+h && mousePressed){
println ("RGB color 0,255,0"); //RGB code for the green button
noStroke();
colorMode(RGB, 255);
for (int i = 0; i < 255; i++) {
fill(0, i, 0);
rect(i+10, y+y+y,1, 50); //black to green
}
} else if (mouseX>70 && mouseX<90 && mouseY>y &&mouseY<y+h && mousePressed){
println ("RGB color 0,0,255"); //RGB code for the blue button
noStroke();
colorMode(RGB, 255);
for (int i = 0; i < 255; i++) {
fill(0, 0, i);
rect(i+10, y+y+y,1, 50); //black to blue
}
}
}

Testing Arduino servo motor