Ed eccoci arrivati all’implementazione vera e propria su Arduino del progetto finale.
Il design fisico del progetto prevedeva alcuni vincoli formali interessanti:
- uso esclusivo e tassativo di carta/cartoncino
- uso esclusivo e tassativo del colore bianco (si eccettuavano casi particolari in cui il colore fosse necessario e giustificato, e in ogni caso usato con parsimonia e in forme piatte e monocromatiche)
Seguendo questi principi ecco la (già preannunciata due post fa) forma del personaggio. Un superminimal parallelepipedico robottino con un paio di occhi luminosi e una bocca “della verità” che mostra una lettera dell’alfabeto.
Comportamento del personaggio:
Ogni volta che mi metterò a sedere davanti al computer, il mio sorvegliante accenderà gli occhi come a dire “ti sto osservando, fai il bravo”. Dopo un tot. di tempo che sono seduta (da definire, ma suppongo all’incirca 30 minuti), il mio personaggio inizierà a blinkare gli occhi per avvertirmi che è tempo di alzarmi, prendere un po’ d’aria e in generale cambiare attività per far respirare il cervello: “Forza forza scanzafatiche, alzati e fai due passi!”. E se proprio non sai cosa fare, il motivatore ti suggerirà una lettera randomicamente uscita dalla sua bocca. Una lettera che rappresenterà l’iniziale della parola relativa alla nuova attività da compiere…”S? Staccarsi dal computer!”.
Hardware
Per quanto riguarda le componenti elettroniche utilizzate per lo sviluppo del progetto, ecco di seguito la lista:
SENSORI:
- pushbotton implementato su supporto di gommapiuma e cartoncino e applicato sulla superficie superiore di una seduta (si ottiene così uno spartano ma funzionale sensore di pressione, o anche meno finemente da me rinominato “culometro”)
ATTUATORI
- 2 LED dello stesso colore a costituire gli occhi del personaggio
- 1 LED ad alta intensità interno ad illuminare le lettere del rullo rotante
- servomotore da me hackerato seguendo un tutorial on-line affinché il movimento fisicamente obbligato di 180 gradi fosse sbloccato ai 360 gradi -> al servomotore è stato applicato una scatola cilindrica con sopra applicata un’etichetta su cui è stampato l’intero alfabeto.
Software:
#include
Servo myservo; // create servo object to control a servo
int buttonPin = 2; //pin position of pushbotton/culometro
int ledint = 4; //pin for led1
int led1 = 13; //pin for led1
int led2 = 8; //pin for led2
int buttonState = 0; // variable to read the pushbutton status
int lastButtonState = 0; // variable to store the last pushbutton status
long duration = 15000; // duration of time sitting on a chair
long startTime; // start time from Arduino powering moment
int activated = 0; // variable to store if someone is sitting on a chair
int luckyLetter = 1;
void holdServo(long tempo){
myservo.detach();
delay(tempo);
myservo.attach(9); //power servomotor
}
void setup() {
Serial.begin(9600);
pinMode(led1,OUTPUT);
pinMode(led2,OUTPUT);
pinMode(ledint,OUTPUT);
pinMode(buttonPin,INPUT);
}
void loop(){
buttonState=digitalRead(buttonPin);
if (buttonState != lastButtonState) { //if no one has sat on the chair turn leds off
if(buttonState==LOW){
// nessuno sulla sedia
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(ledint, LOW);
activated = 0;
Serial.println("alzata");
myservo.detach(); // stop servomotor
}
else if(buttonState==HIGH){ //if someone has sat on the chair turn leds on
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(ledint, HIGH);
activated = 1;
luckyLetter = 1;
Serial.println(luckyLetter, DEC);
startTime = millis();
Serial.println("seduta");
myservo.detach(); // stop servomotor
}
}
lastButtonState = buttonState; //change button State
if ( ((millis()-startTime) > duration) && activated ==1){ //conditions in which duration of the tolerated sitting time has been overpassed
Serial.println("tempo di alzarsi");
Serial.println(luckyLetter, DEC);
int var = 0;
while(var < 20){
digitalWrite(led1,LOW); //blink both LEDs 50 cycles
digitalWrite(led2,LOW);
delay(50);
digitalWrite(led1,HIGH);
digitalWrite(led2,HIGH);
delay(50);
var++;
}
if(luckyLetter==1){
myservo.attach(9); // power servomotor
luckyLetter = 0;
holdServo(5);
long rnd = random(0, 180);
int r = int(rnd);
myservo.write(r);
delay(200+(r*10));
}
myservo.detach(); // stop servomotor
}
}
Ed ecco come funziona il mio personaggio.
NB.: trattandosi di un videoscenario di pochi minuti, il tempo considerato prima che il personaggio inizi a blinkare gli occhi e´stato di 15 secondi. Nella realta´si trattera´di un lasso di tempo ben piu´lungo (es.:30 minuti).
































