Xfox
Mi chiamo Antonio, sono un ragazzo diciassettenne appassionato di computer, elettronica, musica e sport. Ho aperto questo blog per avere uno spazio dedicato al mio pensiero, uno spazio dove poter pubblicare i miei “esperimenti” di elettronica, i miei video musicali o semplicemente i miei pensieri. Frequento il 4° anno di un istituto tecnico industriale nella specializzazione di Elettronica e Telecomunicazioni e ho tanta ma tanta voglia di studiare, di andare avanti e di poter trarre qualche profitto dalle mie passioni. Frequento da 12 anni una palestra di arti marziali (Kung Fu) e devo dire che mi piace molto; come diceva un’antico detto, “Mente sana in corpo sano”. Anno: 2011
Home page: http://www.xfox.it
Posts by Xfox
Arduino & GLCD, grafico di lettura analogica
0
Come ho già detto nell’articolo precedente, ieri mi son finalmente arrivati i componenti che avevo ordinato dalla SparkFun Electronics, fra questi c’era un display grafico 128 x 64 (http://www.sparkfun.com/products/710).
Ho così realizzato un semplice programmino che effettua una lettura analogica sul pin A5 e mostra il risultato su un grafico. Tutto questo è stato possibile grazie alla libreria grafica KS0108 (http://www.arduino.cc/playground/Code/GLCDks0108).
Di seguito il video:
Come al solito il video non è dei migliori, prima o poi mi deciderò a comprare una videocamera come si deve.
Ecco il codice sorgente:
#include <ks0108.h> // library header
#include <ks0108_Arduino.h>
#include <Arial14.h> // font definition for 14 point Arial font.
#include "SystemFont5x7.h" // system font
void setup(){
GLCD.Init(NON_INVERTED);
GLCD.ClearScreen();
GLCD.SelectFont(System5x7);
pinMode(A5, INPUT);
splashscreen();
delay(1000);
drawaxis();
}
long wait = 0;
int x = 1; //Parte da uno perchè il primo pixel è occupato dall'asse orizzontale
int y = 0;
int ar = 0;
void loop(){
if(wait < millis()){
wait = millis() + 100;
ar = analogRead(A5);
y = map(ar, 0, 1023, 49, 0);
GLCD.SetDot(x,y,BLACK);
x++;
GLCD.FillRect(1,51,125,14, WHITE);
GLCD.GotoXY(1,61);
GLCD.Puts("Y: ");
GLCD.PrintNumber(y);
}
if (x > 127){
x = 1;
drawaxis();
}
}
void splashscreen(){
//SplashScreen iniziale
GLCD.DrawRoundRect(0,0,127,63,5,BLACK);
GLCD.GotoXY(30,2);
GLCD.Puts("Xfox's Blog");
GLCD.GotoXY(32,22);
GLCD.Puts("www.xfox.it");
}
void drawaxis(){
GLCD.ClearScreen();
GLCD.DrawVertLine(0,0,63,BLACK); //Disegno linea verticale
GLCD.DrawHoriLine(0,50,128,BLACK); //Disegno linea orizzontale
}
In totale vengono effettuate 126 letture (una ogni 100ms) prima che il grafico si resetti.
Si può notare che poco prima del pezzo ove viene comandato di scrivere il valore di Y c’è un comando che disegna un rettangolo bianco.
GLCD.FillRect(1,51,125,14, WHITE);
In sostanza ogni volta prima di riscrivere la stringa “Y: n” quella zona viene “imbiancata”, ovvero tutti i pixel vengono spenti per essere riscritti senza sovrascrivere la stringa scritta nel ciclo precedente.
Per quanto riguarda i collegamenti, sono molto semplici, basta seguire la guida della libreria KS0108 (http://www.arduino.cc/playground/Code/GLCDks0108) e il datasheet del display (http://www.sparkfun.com/datasheets/LCD/GDM12864H.pdf).
Arrivo pacco dalla SparkFun Electronics
0E’ oggi finalmente arrivato dopo 21 giorni di attesa l’ordine dalla SparkFun Electronics.
Ho subito provato il display grafico, ed ecco una banalissima foto:

Sono munito di un paio di processori ATMega328 e ATTyny85, qualche telecomando/ricevitore IR e un paio di EEPROM.
Chissà che progetto mi verrà in mente prossimamente!
Secondo ordine dalla SparkFun Electronics
1Verso marzo avevo fatto il mio primo ordine sul sito della SparkFun Electronics per un totale di 108,40€ + 32€ di dogana (Ordine moduli xBee e varie), oggi ho effettuato il secondo per un totale di 76,45€ ordinando un display grafico LCD, qualche ATMega328 e ATtiny85, un padio di EEPROM I2C e altre cosuccie.
Ecco uno stamp dell’ordine:

Inizialmente ero partito con l’idea di ordinare semplicemente il display grafico ed il display 16×2 (dopo aver bruciato quello che ho già), ma si sa, la fame vien mangiando, allora gironzolando per il sito mi son detto, ma perchè non ordinare qualche ATMega328 (dato che uno costa circa 3€ mentre in italia costa circa 7€), poi ho visto anche questi ATtiny85 che sono dei piccoli microcontrollori prodotti dall’ATMel che costano davvero pochissimi e sono programmabili tramite la board e l’ide Arduino.
Sempre gironzolando ho trovato anche un piccolo telecomandino ad infrarossi che costa poco meno di 3€ e così mi sono detto, “Ma si! Prendiamo anche questo!” e di conseguenza anche i due ricevitori ad infrarossi!
Poi ho sempre desiderato creare una specie di barriera laser e così ho ordinato anche il modulo laser.
Per quanto riguarda le EEPROM, beh, fa sempre comodo averne qualcuna a portata di mano!
Ecco tutto, adesso non rimane che attendere per realizzare qualche nuovo progetto!
Arduino & C#, letture analogiche
3
Ultimamente ho rivisto alcuni programmini in processing che feci per far comunicare l’arduino al pc tramite porta seriale, l’interfaccia grafica si presentava un po scarna, ed io essendo un utente windows preferisco avere un interfaccia grafica in stile windows, così ho rispolverato un vecchio libro di C# (esattamente Visual C# 2005 Passo per Passo – John Sharp) e ho deciso di cominciare a lavorare un pochino.
Come primo programma ho realizzato un controllo per un servomotore, ma non è di questo che parleremo, come secondo progetto ho invece fatto qualcosa che riceva dati dall’arduino (si, perchè il controllo del servomotore si occupava semplicemente di inviare dati all’arduino), in poche parole, l’arduino invia tramite USB tre letture analogiche, il software in C# le interpreta e visualizza il valore su tre TextBox e su tre ProgressBar.
Ecco un’immagine:

Ed ecco il codice sorgente per l’arduino:
void setup(){
Serial.begin(9600);
pinMode(A0, INPUT);
pinMode(A1, INPUT);
pinMode(A2, INPUT);
}
void loop(){
if (Serial.available() > 0){
if(Serial.read() == '1'){
Serial.println(analogRead(A0));
Serial.println(analogRead(A1));
Serial.println(analogRead(A2));
}
}
}
Come si può notare è molto semplice, non è questa la parte difficile da comprendere. :)
Il software invia all’arduino il carattere “1″ ogni 250 ms che viene interpretato come richiesta dati.
Ecco il link per il download del programma da me realizzato: http://www.megaupload.com/?d=X9A2UW91
Controllo di un servomotore tramite tastiera PS2 con Arduino
0
Tramite la libreria “PS2KeyBoard” per arduino è possibile ricevere i dati da una comune tastiera per computer PS2, così tramite questa libreria ho fatto in modo di controllare un servomotore con i tasti direzionali.
Il link che porta al playground di arduino è il seguente: http://www.arduino.cc/playground/Main/PS2Keyboard, tuttavia per scaricare l’ultima versione della libreria è necessario seguire questo link: http://www.pjrc.com/teensy/td_libs_PS2Keyboard.html.
I collegamenti da effettuare sono molto semplici e sono mostrati in un immagine nel precedente link, ma che riporto di seguito:

Se non disponete di un connettore, come nel mio caso, basta semplicemente comprare una prolunga PS2 (potrà costare al massimo 3€), tagliare la parte maschio del connettore, spellare i fili e verificarli tramite una resistenza e un multimetro.
Video:
Ecco il codice sorgente:
#include <PS2Keyboard.h>
#include <Servo.h>
const int DataPin = 4;
const int IRQpin = 3;
PS2Keyboard keyboard;
Servo servo;
int pos = 90;
int passo = 10;
long wait = 0;
void setup() {
delay(1000);
keyboard.begin(DataPin, IRQpin);
Serial.begin(9600);
Serial.println("Controllo Servo tramite tastiera PS2:");
servo.attach(5);
servo.write(pos);
}
void loop() {
if (keyboard.available()) {
// Leggo il valore ricevuto dalla tastiera
char c = keyboard.read();
// Controllo fra i tasti speciali (Es. BKSP, DEL, ESC)
if (c == PS2_LEFTARROW) {
Serial.print("[Left]");
pos -= passo;
}
else if (c == PS2_RIGHTARROW) {
Serial.print("[Right]");
pos += passo;
}
else if (c == PS2_UPARROW) {
Serial.print("[Up]");
passo += 10;
}
else if (c == PS2_DOWNARROW) {
Serial.print("[Down]");
passo -= 10;
}
else {
// Altrimenti mostro il carattere
Serial.print(c);
}
if (pos > 180)
pos = 180;
if(pos < 0)
pos = 0;
Serial.println();
Serial.println("--------------------------");
Serial.print("Posizione servo: ");
Serial.print(pos);
Serial.print("\tPasso: ");
Serial.println(passo);
Serial.println("--------------------------");
}
if (wait < millis()){
wait = millis() + 50;
servo.write(pos);
}
}
Come si può notare dal codice, tramite le frecce direzionali SU e GIU’ è possibile aumentare o decrementare (+10/-10) la variabile passo ovvero l’incremento/decremento che daremo alla variabile pos (posizione del servomotore) una volta premute le frecce direzionali DESTRA/SINISTRA.
Controllo matrice di LED 4×4 con Arduino e Nunchuck
0Dopo il post precedente (Arduino & Registro SIPO) ho deciso di realizzare una piccola matrice di LED dalle dimensioni 4 x 4 controllate da due registri a scorrimenti 74164 (datasheet).
Inizialmente avevo sviluppato il programma solo per fare dei semplici giochi di luce ma successivamente ho deciso di aggiungere al progetto il Nunchuck in modo da poter muovermi punto per punto sulla matrice e selezionare un punto ed accenderlo!
Mi spiego meglio: alimentando il circuito inizierà a lampeggiare un punto sulla matrice, questo punto può essere spostato tramite il joystick del nunchuck e tramite il pulsante C posso “selezionare” quel punto e lasciarlo sempre acceso.
Premendo il pulsante Z invece i led si accendono tutti.
Video:
Ecco lo schema di collegamento:

I pin non collegati dei 74164 sono le uscite A-B-C-….H e vanno collegati tramite resistenza ai led.
I due integrati sono, come detto prima, registri a scorrimento (da 8bit) e sono collegati in cascata per cui l’uscita H del primo integrato va all’ingresso dati del secondo integrato.
I collegamenti ai led devono essere così impostati:
A B C D <- Primo 74164
E F G H <- Primo 74164
A B C D <- Secondo 74164
E F G H <- Secondo 74164
Consultare il datasheet per il pinout dell’integrato.
Ed ecco il codice sorgente:
/*Controllo di una matrice di led 4x4 tramite
registri SIPO 74164.
Versione 2 - Aggiunto il nunchuck
Xfox
*/
//Includo librerie
#include <Wire.h>
#include <string.h>
#undef int
#include <stdio.h>
const int datapin = 2; //Pin di serial
const int clockpin = 3; //Pin di clock
const int catodo = 5; //Catodo
byte primobyte = B00000000;
byte secondobyte = B00000000;
byte primo_point, secondo_point, terzo_point, quarto_point = B0000;
byte xpos = B1000;
long delaytime = 100;
//Variabili per i dati Nunchuck
int joy_x_axis = 0;
int joy_y_axis = 0;
int accel_x_axis = 0;
int accel_y_axis = 0;
int accel_z_axis = 0;
int z_button = 1;
int c_button = 1;
//Variabili Nunchuck
uint8_t outbuf[6];
int cnt = 0;
int posizione_x = 2;
int posizione_y = 2;
int griglia[5][5] = {
{
B0,B0,B0,B0,B0 } //Rga inutile ma necessaria per far si che gli arry partano da griglia [1][1]
,{
B0,B0,B0,B0,B0 }
,{
B0,B0,B0,B0,B0 }
,{
B0,B0,B0,B0,B0 }
,
{
B0,B0,B0,B0,B0 }
};
void setup(){
Serial.begin(9600);
pinMode(datapin, OUTPUT);
pinMode(clockpin, OUTPUT);
pinMode(catodo, OUTPUT);
Wire.begin (); // join i2c bus with address 0x52
nunchuck_init (); // send the initilization handshake
}
void loop(){
Nunchuck(); //Richiama funzione per acquisire dati nunchuck
controlloxy();
if (z_button == 0){
scrivi(B1111, B1111, B1111, B1111, 0);
}
if(c_button == 0){
set(posizione_x, posizione_y);
delay(300);
}
/*
//Primo gioco
point(1, 1);
delay(delaytime);
point(2, 1);
delay(delaytime);
point(3, 1);
delay(delaytime);
point(4, 1);
delay(delaytime);
point(4, 2);
delay(delaytime);
point(4, 3);
delay(delaytime);
point(4, 4);
delay(delaytime);
point(3, 4);
delay(delaytime);
point(2, 4);
delay(delaytime);
point(1, 4);
delay(delaytime);
point(1, 3);
delay(delaytime);
point(1, 2);
delay(delaytime);
//Secondo gioco
point(1, 1);
delay(delaytime);
point(2, 1);
delay(delaytime);
point(3, 1);
delay(delaytime);
point(4, 1);
delay(delaytime);
point(4, 2);
delay(delaytime);
point(3, 2);
delay(delaytime);
point(2, 2);
delay(delaytime);
point(1, 2);
delay(delaytime);
point(1, 3);
delay(delaytime);
point(2, 3);
delay(delaytime);
point(3, 3);
delay(delaytime);
point(4, 3);
delay(delaytime);
point(4, 4);
delay(delaytime);
point(3, 4);
delay(delaytime);
point(2, 4);
delay(delaytime);
point(1, 4);
delay(delaytime);
*/
}
long wait = 0;
void Nunchuck(){
if (wait < millis()){
wait = millis() + 100;
Wire.requestFrom (0x52, 6); // request data from nunchuck
while (Wire.available ())
{
outbuf[cnt] = nunchuk_decode_byte (Wire.receive ()); // receive byte as an integer
cnt++;
}
// If we recieved the 6 bytes, then go print them
if (cnt >= 5)
{
print ();
}
cnt = 0;
send_zero (); // send the request for next bytes
}
}
void nunchuck_init ()
{
Wire.beginTransmission (0x52); // transmit to device 0x52
Wire.send (0x40); // sends memory address
Wire.send (0x00); // sends sent a zero.
Wire.endTransmission (); // stop transmitting
}
void send_zero ()
{
Wire.beginTransmission (0x52); // transmit to device 0x52
Wire.send (0x00); // sends one byte
Wire.endTransmission (); // stop transmitting
}
void print ()
{
joy_x_axis = outbuf[0];
joy_y_axis = outbuf[1];
accel_x_axis = outbuf[2] * 2 * 2;
accel_y_axis = outbuf[3] * 2 * 2;
accel_z_axis = outbuf[4] * 2 * 2;
z_button = 0;
c_button = 0;
if ((outbuf[5] >> 0) & 1)
{
z_button = 1;
}
if ((outbuf[5] >> 1) & 1)
{
c_button = 1;
}
if ((outbuf[5] >> 2) & 1)
{
accel_x_axis += 2;
}
if ((outbuf[5] >> 3) & 1)
{
accel_x_axis += 1;
}
if ((outbuf[5] >> 4) & 1)
{
accel_y_axis += 2;
}
if ((outbuf[5] >> 5) & 1)
{
accel_y_axis += 1;
}
if ((outbuf[5] >> 6) & 1)
{
accel_z_axis += 2;
}
if ((outbuf[5] >> 7) & 1)
{
accel_z_axis += 1;
}
}
char nunchuk_decode_byte (char x)
{
x = (x ^ 0x17) + 0x17;
return x;
}
void scrivi(byte primo, byte secondo, byte terzo, byte quarto, int n){
//Imposto primobyte
bitWrite(primobyte, 0, bitRead(secondo, 0));
bitWrite(primobyte, 1, bitRead(secondo, 1));
bitWrite(primobyte, 2, bitRead(secondo, 2));
bitWrite(primobyte, 3, bitRead(secondo, 3));
bitWrite(primobyte, 4, bitRead(primo, 0));
bitWrite(primobyte, 5, bitRead(primo, 1));
bitWrite(primobyte, 6, bitRead(primo, 2));
bitWrite(primobyte, 7, bitRead(primo, 3));
//Imposto secondobyte
bitWrite(secondobyte, 0, bitRead(quarto, 0));
bitWrite(secondobyte, 1, bitRead(quarto, 1));
bitWrite(secondobyte, 2, bitRead(quarto, 2));
bitWrite(secondobyte, 3, bitRead(quarto, 3));
bitWrite(secondobyte, 4, bitRead(terzo, 0));
bitWrite(secondobyte, 5, bitRead(terzo, 1));
bitWrite(secondobyte, 6, bitRead(terzo, 2));
bitWrite(secondobyte, 7, bitRead(terzo, 3));
if(n == 1){
sommagriglia();
}
inviadati();
}
void sommagriglia(){
//Unisco 4° Pezzo
for(int i = 0; i <= 3; i++){
bitWrite(secondobyte, i, (griglia[1][converti(i)] || bitRead(secondobyte, i)));
};
//Unisco 3° Pezzo
for(int i = 0; i <= 3; i++){
bitWrite(secondobyte, i+4, (griglia[2][converti(i)] || bitRead(secondobyte, i+4)));
};
//Unisco 2° Pezzo
for(int i = 0; i <= 3; i++){
bitWrite(primobyte, i, (griglia[3][converti(i)] || bitRead(primobyte, i)));
};
//Unisco 1° Pezzo
for(int i = 0; i <= 3; i++){
bitWrite(primobyte, i+4, (griglia[4][converti(i)] || bitRead(primobyte, i+4)));
};
}
//Funzione che permette di convertire un valore per
//la somma fra griglia e byte
int converti(int n){
switch(n){
case 0:
return 4;
break;
case 1:
return 3;
break;
case 2:
return 2;
break;
case 3:
return 1;
break;
}
}
//Funzione che invia dati tramite seriale
void inviadati(){
digitalWrite(catodo, HIGH);
//Scrivo sul secondo 74164
for (int i = 0; i <= 7; i++){
digitalWrite(datapin, bitRead(secondobyte, i));
//Impulso per il clock
digitalWrite(clockpin, HIGH);
digitalWrite(clockpin, LOW);
}
//scrivo sul primo 74164
for (int i = 0; i <= 7; i++){
digitalWrite(datapin, bitRead(primobyte, i));
//Impulso per il clock
digitalWrite(clockpin, HIGH);
digitalWrite(clockpin, LOW);
}
digitalWrite(catodo, LOW);
}
//Funzione per dare coordinate XY di un punto
void point(byte x, byte y){
primo_point = B0000;
secondo_point = B0000;
terzo_point = B0000;
quarto_point = B0000;
findxpos(x);
switch (y){
case 1:
quarto_point += xpos;
break;
case 2:
terzo_point += xpos;
break;
case 3:
secondo_point += xpos;
break;
case 4:
primo_point += xpos;
break;
default:
scrivi(B1001, B0110, B0110, B1001, 1);
break;
}
scrivi(primo_point, secondo_point, terzo_point, quarto_point, 1);
}
void findxpos(byte x){
xpos = B0000;
switch(x){
case 1:
xpos = B1000;
break;
case 2:
xpos = B0100;
break;
case 3:
xpos = B0010;
break;
case 4:
xpos = B0001;
break;
}
}
void lampeggia(int n){
if (n == 0){
digitalWrite(catodo, HIGH); //Spegne
delay(250);
digitalWrite(catodo, LOW); //Accende
delay(250);
}
else{
for(int i = 0; i < n; i++){
digitalWrite(catodo, HIGH); //Spegne
delay(250);
digitalWrite(catodo, LOW); //Accende
delay(250);
}
}
}
void set(int x, int y){
griglia[y][x] = !bitRead(griglia[y][x], 0);
sommagriglia();
inviadati();
}
long wait_controllo = 0;
long wait_lampeggio = 0;
byte state = B0;
void controlloxy(){
if (wait_controllo < millis()){
wait_controllo = millis() + 300;
if (posizione_x < 4){
if(joy_x_axis > 178){
posizione_x++;
}
}
if(posizione_x > 1){
if(joy_x_axis < 78){
posizione_x--;
}
}
if (posizione_y < 4){
if(joy_y_axis > 178){
posizione_y++;
}
}
if(posizione_y > 1){
if(joy_y_axis < 78){
posizione_y--;
}
}
}
if (state == 1)
point(posizione_x, posizione_y);
else
scrivi(B0,B0,B0,B0,1);
if(wait_lampeggio < millis()){
wait_lampeggio = millis() + 250;
state = !state;
}
}
Il pezzo di codice commentato nel loop è semplicemente un piccolo giochetto di luci.
Il codice può sembrare molto confuso poichè ho unito lo sketch per il nunchuck con lo sketch per la matrice.
E’ comunque un codice che andrebbe rivisto ma non credo che lo farò dato che ho già smontato tutto dalla breadboard per dare spazio al mio prossimo progetto! :)
Arduino & Registro SIPO (74164)
2
Oggi, passando dalla mia stanzetta mi son caduti gli occhi sulle mensole dove ho dei piccoli contenitori con componenti elettronici e così ho deciso di dare un’occhiata. Ho trovato moltissimi integrati fra cui un paio di registri SIPO (serial input parallel ouput) 74164 (datasheet).
Ho deciso quindi di realizzare qualcosa con questi registri ed il mio Arduino UNO.
Ho fatto un piccolo sketch che pilota 8 led con soli due pin, sfruttando appunto la particolarità del registro che consente di inserire un dato (di 8 bit) in seriale e prelevarlo in parallelo.
Ed ecco lo sketch:
const int datapin = 2; //Pin di serial out
const int clockpin = 3; //Pin di clock
void setup(){
pinMode(datapin, OUTPUT);
pinMode(clockpin, OUTPUT);
}
int numero = 0;
void loop(){
if (numero <= 255){
numero++;
}
else{
numero = 0;
}
scrivi(numero);
delay(500);
}
void scrivi(byte dato){
for (int i = 0; i <= 7; i++){
digitalWrite(datapin, bitRead(dato, i));
//Impulso per il clock
digitalWrite(clockpin, HIGH);
digitalWrite(clockpin, LOW);
}
}
E’ molto semplice, una variabile chiamata “numero” conta fino a 255 (il massimo valore che si può rappresentare con 8 bit) e mostra su questi led il valore in codice binario.
In realtà la mia idea era di controllare un piccolo quadretto di led 4×4 tramite due di questi registri, ma dovrei realizzare una PCB per far questo, non mi va di impazzire con le basette millefori. :D Chissà, magari un giorno mi viene la voglia di completare questo lavoro.
A presto!
Google+, il nuovo social by Google
13
Finalmente è arrivato Google Plus, il nuovo social network “made in Google”.
Nasce così lo scontro fra i colossi del web, Facebook e Google.
Oggi sono riuscito ad ottenere un invito per potervi accedere (si, attualmente servono gli inviti per potervi accedere, come tutti gli altri prodotti beta di google), e ho subito notato una certa somiglianza al, ormai conosciuto e famosissimo, facebook.
La grafia è quasi identica: Tre colonne, barra di navigazione in alto (con addirittura il link ed il menù a tendina per il profilo come su facebook).
Le differenze sono minime, una di queste è sicuramente la chat, che permette le conversazioni multiple (cosa che permette anche facebook) e video-conversazione multiple, cosa che davvero mi ha stupito!
Altra differenza sono “le amicizie”. Su google+ non c’è bisogno di richiedere l’amicizia, ci si aggiunge alle cerchie, che sono quasi simili ai gruppi di amici su facebook.
Vi rimando ad un’articolo di repubblica.it dove fanno notare in maniera migliore le differenze fra i due social network: Google Plus, prova competa i segreti del nuovo sito social
Se qualcuno si fosse incuriosito, io ho a disposizione qualche invito. Comunque sia, fra qualche giorno, google+ verrà aperto al pubblico.
P.S.
Non sarà mica un’altro flop di Google? Come Orkut o Wave?
Chissà come si evolverà la faccenda. . .
Xfox’s Blog su ITouch
0
Da oggi Xfox’s Blog è anche su Itouch (IPad, IPhone e IPod Touch).
Grazie al plug-in per WordPress chiamato WP-Touch si potrà navigare su Xfox’s Blog con una grafica semplice ed intuitiva, viene offerta anche la possibilità di lasciare un commento fra i vari post o di effettuare una ricerca sul sito.

E’ possibile navigare tenendo il nostro ITouch sia in verticale che in orizzontale.
Tramite il menù che compare al click sulla freccetta in alto a destra, potremo scorrere fra le varie categorie e tags oppure trovare il link per i feed RSS.
Arduino Personal Trainer
0
Ultimamente, vedendo dei pesi sulla mia scrivania ho deciso di cominciare ad utilizzarli, così ho creato un programmino per l’Arduino che mi permetta di contare le serie di pesi che faccio e il tempo fra una serie e l’altra.
Per essere più precisi, stabilisco io quante serie voglio fare (da una serie a cinque) e il tempo (da uno a cinque minuti) fra una serie e l’altra. Il programma segue uno schema piramidale al contrario, ovvero, parto da un numero maggiore di pesi (numero della serie * 20; es. 4a serie * 20 = 80 pesi) per poi finire con un ultima serie da 20.

Codice sorgente:
//Personal Trainer (pesi) By Xfox
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int A = A0;
const int B = A1;
const int Sound = 10;
int no_serie = 1;
int intervallo_serie = 1;
//Variabili per l'attesa
long start_time = 0;
long end_time = 0;
long tempo = 0;
void setup() {
lcd.begin(16, 2);
lcd.print("www.xfox.it");
lcd.setCursor(0,1);
lcd.print("PT By Xfox");
pinMode(A, INPUT);
digitalWrite(A, HIGH);
pinMode(B, INPUT);
digitalWrite(B, HIGH);
pinMode(Sound, OUTPUT);
delay(2000);
settaggio(); //Richiamo alla funzione di avvio programma
}
void loop(){
if(no_serie >= 1){
delay(500); //Delay sul pulsante
while (digitalRead(A) == 1){
scrivi(4);
} //Ciclo di attesa completamento
no_serie--;
attesa();
}
else {
scrivi(6);
}
}
void settaggio(){
//Passo 1: Settaggio numero serie
while(digitalRead(B) == 1){
scrivi(1);
if(digitalRead(A) == 0){
if(no_serie < 5){
no_serie++;
}
else{
no_serie = 1;
}
delay(300);
}
}
delay(300); //Delay per il pulsante B
//Passo 2: Settaggio tempo serie
while(digitalRead(B) == 1){
scrivi(2);
if(digitalRead(A) == 0){
if(intervallo_serie < 5){
intervallo_serie++;
}
else{
intervallo_serie = 1;
}
delay(300);
}
}
delay(300); //Delay per il pulsante B
//Passo 3: Wait per lo start
while(digitalRead(A) == 1){
scrivi(3);
}
delay(300); //Delay per il pulsante B
}
long wait_scrivi = 0;
void scrivi(int mode){
if (wait_scrivi < millis()){
wait_scrivi = millis() + 100;
//Mode 1 = Settaggio no_serie
if (mode == 1){
lcd.clear();
lcd.print("Quante serie?");
lcd.setCursor(0,1);
lcd.print(no_serie);
}
//Mode 2 = Settaggio tempo serie
if (mode == 2){
lcd.clear();
lcd.print("Intervallo?");
lcd.setCursor(0,1);
lcd.print(intervallo_serie);
}
//Mode 3 = Wait per lo start
if (mode == 3){
lcd.clear();
lcd.print("Premi A per");
lcd.setCursor(0,1);
lcd.print("andare avanti!");
}
//Mode 4 = Prima serie
if (mode == 4){
lcd.clear();
lcd.print("Serie da:");
lcd.print(no_serie * 20);
lcd.setCursor(0,1);
lcd.print("Premi A");
}
//Mode 5 = Tempo
if (mode == 5){
lcd.clear();
lcd.print("Attesa:");
lcd.setCursor(0,1);
lcd.print( tempo / 1000 );
lcd.print(" Secondi");
}
//Mode 6 = Fine allenamento
if (mode == 6){
lcd.clear();
lcd.print("Allenamento");
lcd.setCursor(0,1);
lcd.print("completato!!!");
}
//Mode 7 = Prossima serie
if (mode == 7){
lcd.clear();
lcd.print("Premi A per la");
lcd.setCursor(0,1);
lcd.print("prossima serie");
}
}
}
long wait_suona = 0;
void suona(){
if (wait_suona < millis()){
wait_suona = millis() + 1000;
tone(Sound, 262, 500);
}
}
void attesa(){
start_time = millis();
end_time = start_time + (intervallo_serie * 60000);
while(end_time > millis()){
tempo = (end_time - start_time) - (millis() - start_time);
scrivi(5);
}
while(digitalRead(A) == 1){
suona();
scrivi(7);
}
}
In sostanza all’avvio del programma si sceglie il numero di serie ed il tempo fra una serie e l’altra, successivamente ci viene chiesto di premere il pulsante A per cominciare “l’allenamento” una volta completata la serie premeremo ancora A per far comparire il countdown alla prossima serie, scaduto il countdown un buzzer ci avvertirà, premeremo ancora A per far comparire il numero di pesi da svolgere, una volta completati premeremo A e ci troveremo al punto di prima.
Una cosa da aggiungere, sicuramente molto utile, sarebbe un accelerometro per implementare la funzione di contare i pesi che si fanno.




