Ordinata Arduino Ethernet Shield

0

Dopo parecchio dall’apertura dell’ Arduino Store ho finalmente deciso di fare un acquisto su quest’ultimo!

E’ parecchio che non realizzo un progetto con l’Arduino dunque ho deciso di ordinare un Ethernet Shield al modico prezzo (non tanto poi) di 29,00€ + 9,00€ di spedizione + 7,77€ di IVA (21%, poveri noi!) per un totale di 45,77€.

Beh, qual’è il progetto vi starete chiedendo?

In poche parole questa Ethernet Shield mi permette di collegare il mio Arduino UNO alla rete LAN di casa e controllare quest’ultimo tramite una pagina web. Sembra una cosa banale invece e tutt’altro.

Basti pensare alla possibilità di poter inviare valori ad o da una pagina web che può essere visitata da un pc, un tablet o uno smartphone in qualsiasi punto del mondo (ovviamente creando un ponte fra la rete locale di casa e la rete esterna).

Il primo progetto sarà sicuramente una cosa banalissima, il controllo di uno o più led collegati all’Arduino.

Concludo il post dicendo che si aprono nuove strade, chissà cosa mi verrà in mente.

Alla prossima!

Nuova webseries: John Danno

0

Se pensavate di averle viste tutte, sicuramente c’è ancora qualcosa che non avete visto!
E come perdersi la nuova Webseries “John Danno” che si sta lentamente aprendo le porte di youtube?!
Questa serie creata dal Regista Federico Maio e la sua “Peto Production” racconta di un soldato maldestro e della sua bizzarra squadra, alle prese con strane missioni segrete.
Il genere della serie è un’Action-Comedy tutta da scoprire!
Sicuramente ancora non sono al livello di youtubers più famosi, ma da loro la cosa importante che si nota subito, è la capacità di riuscire a migliorare di puntata in puntata!
Questo impegno e questa passione appunto si nota subito e quindi fa si che il lavoro sia sempre più apprezzato dal pubblico.
Sono già riusciti a conquistarsi 2 articoli sul blog Mondo Teen, ed uno sul sito Youtubers.it accanto al mitico Yotobi.
La prima stagione, già arrivata alla quarta puntata, ne prevede 10 in tutto.
La quinta puntata è quasi pronta ed uscirà nel mese corrente, ma la produzione spera di riuscire a far uscire anche la sesta dopo qualche giorno dalla quinta, per fare un regalo a tutti gli attuali sostenitori, fans e iscritti!
Chi già conosce John Danno aspetta con ansia la quinta puntata, e per chi non lo conoscesse ancora il mio consiglio è di guardarlo!
Chissà, magari piacerà anche a voi!
Troverete le puntate ufficiali nel loro canale chiamato Peto Production International.

 

Ed ecco il trailer del 5° episodio:

Buon Natale!!!

0

Auguri a tutti i lettori di Xfox’s Blog un grandissimo augurio per questo Natale, che a mio parere, è arrivato troppo velocemente e/o troppo in silenzio.

Spero, come ogni anno, che l’anno nuovo possa portare dei cambiamenti in tutto ciò che mi circonda!

Concludo dicendo semplicemente: BUON NATALE! :D

Manipolazione delle porte, ATMega328

0

Tutti gli articoli di programmazione che ho pubblicato fin ora sono stati in linguaggio ad alto livello, quale il C. Un linguaggio ad alto livello generalmente “aiuta” molto il programmatore che tramite funzioni può gestire tutto il processore senza badare ai registri e a tutto ciò che si trova “dentro” il processore.

A scuola utilizzando un processore della Scenix chiato SX28 (molto somigliante al processore dell’Arduino, ATMega328) ho imparato qualcosa del linguaggio basic per la programmazione.

Il basic non è un linguaggio ad alto livello e quindi per la gestione di parti come ad esempio impostare un pin di uscita come input/output oppure impostare il valore logico di un piedino è necessario conoscere il registro (e di conseguenza il bit) che controlla la direzione di quel pin (come detto prima in/out) e il valore.

 

Sia nello SX28 che nell’ATMega328 esistono tre PORT, ovvero 3 registri che si occupano della gestione dei pin.
Questi port per lo scenix sono: PORTA (registro a 4 bit), PORTB e PORTC (enrambi a 8 bit).

Mentre per l’ATMega328 sono: PORTD (che gestisce i pin digital da 0 a 7), PORTB (che gestisce i pin digitali da 8 a 13 e i pin del quarzo) e PORTC (che gestisce i pin analogici da 0 a 5).

 

Facciamo un esempio, per impostare come uscita il pin 0 legato al PORT B, nello Scenix si deve proseguire così:

label PIN PORTB.0 OUTPUT

E per scrivere un valore logico alto:

HIGH label

Mentre con l’arduino, in C:

label = 8; //Nell'ATMega328 il bit 0 del PORTB è collegato al pin digitale 8

pinMode(label, OUTPUT); //Imposto il pin come uscita

digitalWrite(label, HIGH); /*Scrivo un valore alto sulla porta.
Non è necessario specificare una label per il pin,
avrei potuto anche inserire direttamente "8" */

Però è anche possibile scrivere comandi in stile basic:

DDRB = 0b00000001; 'Imposto come uscita il pin,
' è possibile anche scrivere in esadecimale: 0x01
PORTB = 0b00000001 'Scrivo un valore alto sul pin.

Il registro DDRB o Data Direction B è il registro che si occupa della gestione della “direzione” dei pin:
Zero (0) sta per input e Uno (1) sta per output.

Il registro PORTB invece si occupa del valore presente sui pin, è possibile sia leggerlo (nel caso un pin sia configurato come ingresso) che scriverlo (nel caso il pin sia configurato come output).

Di gran lunga è più facile operare in C, anche per il semplice motivo che se si dovesse operare con il basic si dovrebbero conoscere almeno le basi delle “matematica dei bit“.
Anche se programmare in basic ha i suoi vantaggi in quanto è più rapido e si possono svolgere funzioni che richiederebbero più linee di programmazione in C.

Light Blue Led

0

Sono passato oggi, dopo parecchio tempo, dal negozio di elettronica ed ho comprato un paio di led blue (caspita costano 0.90€ a pezzo) ed ho realizzato un altro progettino di led a scorrimento! Ecco il video:

 

 

Ecco un piccolo schemino:

 

Ed ecco il codice sorgente:

const int datapin = 3; //Pin di serial out
const int clockpin = 2; //Pin di clock
const int catodo = 5;

void setup(){
  pinMode(datapin, OUTPUT);
  pinMode(clockpin, OUTPUT);
  pinMode(catodo, OUTPUT);

  digitalWrite(catodo, HIGH);
}

byte numero = B00000001;
int indice = 0;

void loop(){

  while (numero != 128){
    shiftOut(datapin, clockpin, LSBFIRST, numero);

    for(indice = 0; indice < 256; indice++){
      analogWrite(catodo, indice);
      delay(1);
    }

        for(indice = 256; indice > 0; indice--){
      analogWrite(catodo, indice);
      delay(1);
    }

    numero = numero << 1;
  }

  while (numero != 1){
    shiftOut(datapin, clockpin, LSBFIRST, numero);

    for(indice = 0; indice < 256; indice++){
      analogWrite(catodo, indice);
      delay(1);
    }

        for(indice = 256; indice > 0; indice--){
      analogWrite(catodo, indice);
      delay(1);
    }

    numero = numero >> 1;
  }

}

Nello schema non si nota, ma la massa del regolatore di tensione (7805) e quella dell’arduino (che è alimentato tramite USB) devono essere collegate insieme.

Il transistor utilizzato è un TIP31 che supporta fino a 3A sul colletore.

Un attimo di pausa

0

“Elettronica, informatica e tant’altro…” è il sottotitolo di questo blog. Fin ora sono stati parecchi gli articoli di elettronica e di informatica, meno quelli di “tant’altro”, beh è arrivato il momento di fare un articolo di carattere generale!

Intanto ecco un bel video musicale di una canzone bellissima di Katy Perry:

Ultimamente sono stato parecchio distratto, quasi assente con la testa, lasciando indietro tutti i miei doveri da buono studente di un istituto tecnico industriale.

Mi sto interessando maggiormente di politica, beh, ormai sono maggiorenne pure io e faccio a tutti gli effetti parte di questa società; Sono in pista pure io, quindi mi toccherà imparare a ballare se non voglio finire con i piedi schiacciati da qualcun altro.

Si avvicina giorno 22, il giorno “apocalittico” lo definirei, perchè?
Perchè Martedì (per l’appunto il 22) ci sarà l’incontro Scuola-Famiglia per la consegna dei pagellini di chiusura bimestre.
La mia situazione?
Tragica è dir poco. Non mi sono impegnato per nulla, malgrado abbia qualche voto positivo (7/8) nelle materie di specialistica (quali telecomunicazioni e sistemi) nelle altre materie ho davvero toccato il fondo (o quasi).
Si dice che toccando il fondo ci si può spingere per una risalita più veloce o ancora “le cose peggiorano sempre prima di migliorare” speriamo sia davvero così, non solo per la mia situazione scolastica ma anche per la situazione politica/economica Italiana.

Vi starete chiedendo l’Arduino che fine ha fatto! Eccolo:

Da circa 20 giorni è fermo così, con un diodo laser attaccato fra i pin +3.3V e GND. L’ultimo tentativo è stato creare il progetto “Arduino Laser POW” ma con scarso risultato, magari rivedrò il progetto più avanti.

Ultimamente il mio interesso è rivolto al mio nuovo telefono, eh si! Dopo aver compiuto 18 anni mi sono concesso il lusso di farmi un regalo! Un Nokia E7 comprato su Ebay al prezzo di 340€ (quando si trova a 470€ in negozio).
Mi sto davvero godendo questo fantastico telefono con schermo full-touch da 4″, tastiera QWERTY a scomparsa e fotocamera da 8 Mpx. Ecco una foto:

Concludo così questo articolo, dopo che il computer si è bloccato ed ho dovuto riscrivere mezzo articolo (menomale che WordPress salva la bozza dell’articolo automaticamente).

Alla prossima su Xfox’s Blog.

Musica del momento

0

E’ parecchio che non scrivo sul blog e data la mia inattività in elettronica ho deciso di fare un piccolo post che riguarda la musica che sto ascoltando in questo periodo.

Di seguito i link per ascoltare le canzoni su youtube.

Sono molto conosciute perchè proprio in questo periodo stanno scalando le classifiche musicali.

Per il resto nulla di nuovo, o quasi, il 30 ottobre ho compiuto 18 anni e quindi da adesso faccio parte a tutti gli effetti di questa società, se possiamo definirla tale. In genere non faccio post di argomento politico però è ormai impossibile non parlare della situazione Italiana, fra la svalutazione dei nostri mercati ed i disastri naturali siamo davvero messi bene (già, questa è ironia!).

Forse è meglio fermarmi qui. Tratterò meglio l’argomento in un altro post. Per adesso è tutto!
Alla prossima. :)

Data Logger con Arduino ed EEPROM 24LC256

0

Ieri finalmente, dopo parecchio tempo, mi sono deciso a realizzare un progettino con il mio Arduino UNO, si tratta di un Data Logger:

un circuito che campiona un dato e lo salva su un E2PROM.

L’E2PROM in questione è la 24LC256 che ho ricevuto nel mio ultimo ordine dalla SparkFun Electronics, sfrutta un protocollo seriale quale l’i2c per comunicare con l’arduino; Non ho trovato una libreria per gestire le operazioni di scrittura e lettura, ma sul playground di arduino si può trovare un codice che presenta delle funzioni per scrivere e leggere sull’EEPROM: http://www.arduino.cc/playground/Code/I2CEEPROM.

L’E2PROM può memorizzare dati fino ad un massimo di 32Kbyte, ma non li sfrutteremo tutti.

In sostanza, si collega l’arduino al computer, si apre il monitor seriale e ci viene chiesto se leggere o scrivere (r\w) sull’eeprom, nel caso della scrittura il programma effettua delle letture analogiche sul pin A0 e ogni 10ms salva sulla eprom dei record formati da 3 dati: int N° Lettura, int Lettura e int Sec (millis() al momento della lettura).
Sappiamo che ogni int occupa 2 byte ed è per questo che divideremo ogni dato in due parti: MSB ed LSB.

Adesso sappiamo che ogni record occuperà 6 Byte sulla nostra memoria. Di seguito un immagine che mostra il concetto:

I collegamenti da effettuare sono scritti anche sulla pagina del playground arduino:

Arduino pin 4 to EEPROM pin 5
Arduino pin 5 to EEPROM pin 6
Arduino 5V to EEPROM pin 8
Arduino GND to EEPROM pin 1,2,3,4

Di seguito il codice sorgente:

#include <Wire.h> //I2C library
void i2c_eeprom_write_byte( int deviceaddress, unsigned int eeaddress, byte data ) {
  int rdata = data;
  Wire.beginTransmission(deviceaddress);
  Wire.send((int)(eeaddress >> 8)); // MSB
  Wire.send((int)(eeaddress & 0xFF)); // LSB
  Wire.send(rdata);
  Wire.endTransmission();
}

byte i2c_eeprom_read_byte( int deviceaddress, unsigned int eeaddress ) {
  byte rdata = 0xFF;
  Wire.beginTransmission(deviceaddress);
  Wire.send((int)(eeaddress >> 8)); // MSB
  Wire.send((int)(eeaddress & 0xFF)); // LSB
  Wire.endTransmission();
  Wire.requestFrom(deviceaddress,1);
  if (Wire.available()) rdata = Wire.receive();
  return rdata;
}

/* Unione e disione Byte
 somma = (b << 8) | a; Si uniscono MSB (b) ed LSB (a)

 //Si divide
 a = somma; LSB
 b = somma >> 8; MSB
 */

int no_lettura = 0;
int lettura = 0;
int sec = 0;

byte no_letturaMSB = B00000000;
byte no_letturaLSB = B00000000;
byte letturaMSB = B00000000;
byte letturaLSB = B00000000;
byte secMSB = B00000000;
byte secLSB = B00000000;

int mode = 0; //0 = Leggi; 1 = Scrivi;
void setup()
{
  Wire.begin(); // initialise the connection
  Serial.begin(9600);

  pinMode(A0, INPUT);

  Serial.print("Avvio del programma");
}

long wait = 0;
int indirizzo = 0;

void loop()
{
  chiedi();
  if (mode == 1){
    Serial.println("Inizio scrittura");
    for(no_lettura = 0; no_lettura <= 30;){
      //Se le letture sono inferiori a 30 deve continuare a scrivere l'eeprom
      if (wait < millis()){
        wait = millis() + 10;
        //Divido i dati

        sec = millis();
        secLSB = sec;
        secMSB = sec >> 8;

        lettura = analogRead(A0);
        letturaLSB = lettura;
        letturaMSB = lettura >> 8;

        no_letturaLSB = no_lettura;
        no_letturaMSB = no_lettura >> 8;

        //Scrivo sull'EEPROM; i2c_eeprom_write_byte( int deviceaddress, unsigned int eeaddress, byte data )
        i2c_eeprom_write_byte(0x50, indirizzo, no_letturaMSB);
        delay(5);
        indirizzo++;

        i2c_eeprom_write_byte(0x50, indirizzo, no_letturaLSB);
        delay(5);
        indirizzo++;

        i2c_eeprom_write_byte(0x50, indirizzo, letturaMSB);
        delay(5);
        indirizzo++;

        i2c_eeprom_write_byte(0x50, indirizzo, letturaLSB);
        delay(5);
        indirizzo++;

        i2c_eeprom_write_byte(0x50, indirizzo, secMSB);
        delay(5);
        indirizzo++;

        i2c_eeprom_write_byte(0x50, indirizzo, secLSB);
        delay(5);
        indirizzo++;

        Serial.print("\tLettura no: ");
        Serial.print(no_lettura);

        Serial.print("\tLettura: ");
        Serial.print(lettura);

        Serial.print("\tSec: ");
        Serial.println(sec);
        no_lettura++;
      }
    }
    mode = 2;
  }

  else if(mode == 0){

    //Se le letture sono 30 legge dall'eeprom
    Serial.println("Inizio lettura");
    //Reset variabili
    indirizzo = 0;
    no_letturaMSB = B00000000;
    no_letturaLSB = B00000000;
    letturaMSB = B00000000;
    letturaLSB = B00000000;
    secMSB = B00000000;
    secLSB = B00000000;
    delay(5);

    //Leggo dall'EEPROM; i2c_eeprom_read_byte( int deviceaddress, unsigned int eeaddress )
    for(int i = 0; i <= 30; i++){
      no_letturaMSB = i2c_eeprom_read_byte(0x50, indirizzo);
      delay(5);
      indirizzo++;

      no_letturaLSB = i2c_eeprom_read_byte(0x50, indirizzo);
      delay(5);
      indirizzo++;

      letturaMSB = i2c_eeprom_read_byte(0x50, indirizzo);
      delay(5);
      indirizzo++;

      letturaLSB = i2c_eeprom_read_byte(0x50, indirizzo);
      delay(5);
      indirizzo++;

      secMSB = i2c_eeprom_read_byte(0x50, indirizzo);
      delay(5);
      indirizzo++;

      secLSB = i2c_eeprom_read_byte(0x50, indirizzo);
      delay(5);
      indirizzo++;

      no_lettura = (no_letturaMSB << 8) | no_letturaLSB;
      lettura = (letturaMSB << 8) | letturaLSB;
      sec = (secMSB << 8) | secLSB;

      Serial.print("\tLettura no: ");
      Serial.print(no_lettura);

      Serial.print("\tLettura: ");
      Serial.print(lettura);

      Serial.print("\tSec: ");
      Serial.println(sec);

    }
    mode = 2;
  }
}

void chiedi() {
    Serial.println("\n\nLeggi o Scrivi? (r\\w)");
  while (Serial.available() <= 0){}

    if(Serial.read() == 'w')
      mode = 1;
    else
      mode = 0;
  }

C’è un piccolo accorgimento da fare riguardante il dato Sec: ho già detto prima che quel dato in sostanza fa lo stamp dei millisecondi passati dall’accensione del microprocessore. La funzione millis() restituisce un dato long, ma noi immagazziniamo il valore in un int per questione di comodità, con un int possiamo raggiungere un valore massimo di (2^16) – 1 = 65535 che in secondi corrisponde a circa 65 secondi, dunque dopo 65 secondi la variabile sec va in overflow memorizzando il valore massimo (come detto prima 65535). Per risolvere si potrebbe, anzichè salvare i millisecondi trascorsi dall’accensione del microprocessore, i secondi:

        sec = millis() / 1000;

 

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

0

E’ 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!

Go to Top