sketch per ciabattino

Tutto sull'Arduino e la sua grande famiglia... Atmel AVR, Microchip PIC, ecc...

Moderatori: ragno, tapino, alez, zulu, davidea

Rispondi
Avatar utente
ragno
Messaggi: 3017
Iscritto il: 20 gen 2007, 09:43
Località: Marte e dintorni
Contatta:

sketch per ciabattino

Messaggio da ragno »

Ciabattino e' una ciabatta gestita da arduno comandabile via ethernet.
Non e' un progetto definitivo, ma e' ancora tutto nella mia testa. :lol: :lol: :lol:

Comunque:

- capacita' di pilotare fino 8 rele per le prese comandate.
- memorizzazione dello stato di ogni singolo relay.
- gestione via web client side. (Penso che il client sara' realizzato in java per superare le limitazioni della "same-origin policy"Cross-Domain, ma magari trovo l'uovo di colombo :) ).

Attualmente l'intefaccia risponde a query nel formato <ip>/?pin=P&val=V (P=numero pin dell'Arduino da 2 a 9 e V=valore 0/1) e ritorna una risposta testuale alla chiamata.
Con <ip> senza parametri viene restituita una stringa con lo status di tutte le linee digitali gestite (da 2 a 9, le 10,11,12,13 sono riservati per la gestione dello shied 28J60).

Ho realizzato tutto prendendo spunto qua e la, con uno shield ENC28J60 ed un arduino carrozzato con un atmega8/optiboot
Rimangono 1k per la programmmazione, ma l'output seriale non funziona probabilmente per problemi di buffer (l'A8 ha solo un 1k ram, mentre 328 ne ha 2k ).

No JSONP, no librerie troppo server side che rendono la vita semplice ma occupano inutilmente la memoria dell'atmega.

[AGGIORNAMENTO 28-01-2013]
Sono riuscito ad effettuare chiamate da webclient con risposte tramite CORS. Quindi l'interfaccia sara' una semplice pagina html.
Voglio implementare un timer per forzare lo spegnimento delle prese in 'tot' minuti, questo per consentirmi lo shutdown del pc, al resto poi ci pensera' l'Arduino. :lol: :lol: :lol:


Stesura prima versione.

Codice: Seleziona tutto

#include "EtherShield.h"
// Default CS pin is 10, for the unmodified shield.
// Can be changed in init function to use another pin
// define DEFAULT_ENC28J60_CONTROL_CS 10
// define SPI_MOSI 11
// define SPI_MISO 12
// define PI_SCK 13
// http://192.168.1.15/?pin=2&val=1
// pin da 2 a 9
//

// EEPROM
#include <EEPROM.h>
// ID of the settings block
#define CONFIG_VERSION "v01"
// Tell it where to store your config data in EEPROM
#define CONFIG_START 32

#define SET_EEPROM 1

//#define SERIAL_LOG 1

static byte mymac[6] = {
  0x54,0x55,0x58,0x10,0x00,0x25};
static byte myip[4] = {
  192,168,1,15};
static byte gwip[4] = {
  192,168,1,1};
// listen port for tcp/www:
#define MYWWWPORT 80

#define BUFFER_SIZE 650
static byte buf[BUFFER_SIZE+1];
static char status[11] = {'0','0','0','0','0','0','0','0','\r','\n','\0' };
static char setpin[10] = {'p','=',' ','&','v','=',' ','\r','\n','\0' };

EtherShield es= EtherShield();

// eeprom
struct StoreStruct {
  // The variables of your settings
  byte pins[8];
  // This is for mere detection if they are your settings
  char versione[4];
} settings = {
  // The default values
  {LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW},
  CONFIG_VERSION
};

int pinvalue;
char kvalstrbuf[10];
int8_t analyse_get_url(char *str)
{
  byte mn=0;

  if (es.ES_find_key_val(str,kvalstrbuf,10,"pin")) {
    mn=1;
    //Serial.println(kvalstrbuf); //prints value to serial
    pinvalue = atoi(kvalstrbuf);
    //?pin=<N>
    //Serial.println(kvalstrbuf); //prints value to serial
    es.ES_find_key_val(str,kvalstrbuf,10,"val");
    //?val=<0:1>
  }
  return(mn);
}


uint16_t http200ok(void)
{
  return(es.ES_fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nPragma: no-cache\r\n\r\n")));
}

void saveConfig() {
  for (unsigned int t=0; t<sizeof(settings); t++)
  { // writes to EEPROM
    EEPROM.write(CONFIG_START + t, *((char*)&settings + t));
    // and verifies the data
    if (EEPROM.read(CONFIG_START + t) != *((char*)&settings + t))
    {
#ifdef SERIAL_LOG      
      Serial.println("errore, salvando le impostazioni");
#endif      
      // error writing to EEPROM
    }
  }
}

void loadConfig() {
  // To make sure there are settings, and they are YOURS!
  // If nothing is found it will use the default settings.
  if (//EEPROM.read(CONFIG_START + sizeof(settings) - 1) == settings.version_of_program[3] // this is '\0'
      EEPROM.read(CONFIG_START + sizeof(settings) - 2) == settings.versione[2] &&
      EEPROM.read(CONFIG_START + sizeof(settings) - 3) == settings.versione[1] &&
      EEPROM.read(CONFIG_START + sizeof(settings) - 4) == settings.versione[0])
  { // reads settings from EEPROM
    for (unsigned int t=0; t<sizeof(settings); t++)
      *((char*)&settings + t) = EEPROM.read(CONFIG_START + t);
  } else {
#ifdef SERIAL_LOG      
    Serial.println("dati errati in caricamento, salvo impostazioni");
#endif
    // settings aren't valid! will overwrite with default settings
    saveConfig();
  }
}


void setup()
{
#ifdef SERIAL_LOG      
  Serial.begin(9600);
#endif
  // carica stato pin dalla eeprom interna

#ifdef SET_EEPROM
  loadConfig();
#endif

  // setta le porte dei pin in output e carica stato dalla eeprom
  for (byte pin = 2; pin < 10; pin++) {
    pinMode(pin, OUTPUT);
#ifdef SET_EEPROM    
    digitalWrite(pin, settings.pins[pin-2]);   // set the LED on    
    delay(20);
#endif    
  }
  
  /*initialize enc28j60*/
  es.ES_enc28j60Init(mymac);
  //init the ethernet/ip layer:
  es.ES_init_ip_arp_udp_tcp(mymac,myip, MYWWWPORT);
  // init the web client:
  es.ES_client_set_gwip(gwip);  // e.g internal IP of dsl router

}

void loop(){
  uint16_t dat_p;
  int8_t cmd;
  byte flag_err = false;

  while(1)
  {
    // handle ping and wait for a tcp packet
    dat_p=es.ES_packetloop_icmp_tcp(buf,es.ES_enc28j60PacketReceive(BUFFER_SIZE, buf));
    
    if(dat_p==0){
      continue;
    }
    
    if (strncmp("GET ",(char *)&(buf[dat_p]),4)!=0){
      dat_p=http200ok();
      goto SENDTCP;
    }

    cmd=analyse_get_url((char *)&(buf[dat_p+4]));

OK:    
    dat_p=http200ok();


    // ritorna status
    if (cmd == 0) {  
      for (byte pin = 0; pin < 8; pin++) {
      status[pin] = char(48+settings.pins[pin]);  
      }
      dat_p=es.ES_fill_tcp_data(buf,dat_p,status);
    }  

    // pins
    else if (cmd == 1) {
  
      // controlla pin
      if ((pinvalue > 1) && (pinvalue < 10)) {
        int val = atoi(kvalstrbuf);

#ifdef SERIAL_LOG         
        Serial.print("pin=");//prints value to serial
        Serial.println(pinvalue); //prints value to serial
    
        Serial.print("val=");//prints value to serial
        Serial.println(val); //prints value to serial
#endif

        // controlla se set validi
        if (val == 0 || val == 1) {

          // controlla se il valore del pin e' cambiato e lo salva in eeprom
#ifdef SET_EEPROM  
          if (!( (byte) settings.pins[pinvalue-2] == (byte) val)) {
            settings.pins[pinvalue-2] = (byte) val;
#endif                 
#ifdef SERIAL_LOG      
            Serial.println("salvo impostazioni");
#endif
#ifdef SET_EEPROM  
            saveConfig();
          }
#endif      
          digitalWrite(pinvalue, val);   // set the LED     

          // prepara buffer risposta
          setpin[2]=char(48+pinvalue);
          setpin[6]=char(48+val);          
          dat_p=es.ES_fill_tcp_data(buf,dat_p,setpin);
        } 
        else flag_err = true;
        // val err        
      } 
      else flag_err = true;
      // pin err
   } 
    
#ifdef SERIAL_LOG      
          Serial.println(status);
#endif

    if (flag_err) dat_p=es.ES_fill_tcp_data_p(buf,dat_p,PSTR("err\r\n"));

 SENDTCP:
    es.ES_www_server_reply(buf,dat_p); // send data
  }
}
:ciao:
vdr: 1.4.7+extpatch54 (pensionata), 1.7.27 (yavdr 0.4)
Percorri la via che porta al sole,
e non camminare sui sentieri oscuri.

E quando penso che sia finita,
è proprio allora che comincia la salita.
Avatar utente
alez
Messaggi: 3074
Iscritto il: 09 mag 2007, 17:11

Re: sketch per ciabattino

Messaggio da alez »

Ho pensato anche io a come realizzare un server web evoluto con le limitazioni dell'Atmel.

Mi sono preso un libro su AJAX e volevo darci un'occhio. (chiaro che facendo il tutto con la Raspi viene più semplice ma...)

Se cerchi in rete trovi molte soluzioni sulla realizzazione di un server web che usa la SD card per memorizzare le pagine, le quali possono essere realizzate in HTML5 e Javascript per fornire un'interfaccia utente user friendly, io volevo studiarlo per fare un'interfaccia umanamente gestibile per un datalogger.
Ciao alez
Avatar utente
ragno
Messaggi: 3017
Iscritto il: 20 gen 2007, 09:43
Località: Marte e dintorni
Contatta:

Re: sketch per ciabattino

Messaggio da ragno »

ciao
di librerie per gli shield ethernet ce ne sono di ben fatte, segnalo queste:

ENC28J60:
NanodeUI
WebDuino

W5100:
TinyWebServer

Per il resto quest'aggeggio non vuole certo competere con quelle, a me serviva una soluzione barbona/minimalista.

ciao
vdr: 1.4.7+extpatch54 (pensionata), 1.7.27 (yavdr 0.4)
Percorri la via che porta al sole,
e non camminare sui sentieri oscuri.

E quando penso che sia finita,
è proprio allora che comincia la salita.
Avatar utente
alez
Messaggi: 3074
Iscritto il: 09 mag 2007, 17:11

Re: sketch per ciabattino

Messaggio da alez »

Penso che per una cosa semplice come la ciabatta sarebbe over engeneering ricorrere ad una Raspi, fermo restando che il costo di Arduino originale + Ethernet shield originale sorpassa il costo della Raspberry Pi, la quale è già dotata di ethernet e di un sistema operativo che renderebbe tutto molto più semplice da fare (web server, ecc...)

E' bello però ottimizzare il tutto per fare le cose riuscendo ad usare la minor potenza possibile e minor componenti possibili. Sicuramente un atmelino del piffero è più affidabile e semplice di una Raspberry, non ha un sistema operativo complesso ed un filesystem che si può corrompere se gli togli alimentazione brutalmente. Inoltre aspettare qui 30/40 secondi perché la ciabatta faccia il boot :mrgreen: cheppale :lol:

"Aho aspè, la ciabatta sta a fa er boot" :lol: :lol:
Ciao alez
Avatar utente
ragno
Messaggi: 3017
Iscritto il: 20 gen 2007, 09:43
Località: Marte e dintorni
Contatta:

Re: sketch per ciabattino

Messaggio da ragno »

Una raspi per pilotare una ciabatta? Ma siamo pazzi... :lol: :lol: :lol:

Per il resto lo shield 28J60 sono 3 anni che sta nella casetta degli Arduino, dopo la tua segnalazione ho preso un W5100 con slot mini sd, che e' molto piu' semplice da utilizzare e consente semplici connessioni permanenti (ad esempio telnet).
Il modulo 28J60 invece ha bisogno di uno stack completamente software, c'e' in giro pure un lib ipv6, ma non troverai uno straccio di client telnet, perche' l'approccio e' del tipo: rimani in ascolto, prendi il pacchetto in arrivo, cambia gli header tcp/ip, rispondi sulla stessa porta e chiudi la connessione.

Quanto alle spese, ho preso per 7 euro 10 atmega8 sulla baya. Dovendo ricarrozzare il tutto ho sempre uno xino a disposizione. Il modulo ethernet 28J60 costa 3,09 sulla baya. Il modulo 8 relay costa 24 euro dall'Europa o 7 euro dalla Cina.

Riguardo la funzione timer: se la presa del pc e' sottocontrollo e dallo stesso pc devo controllare la ciabatta, se disattivo la presa, il pc si spegnerebbe subito.
Col timer imposterei ad esempio 10 minuti, tempo abbondante per chiudere la sessione e dopo 10 minuti l'arduino mi "stacca" tutte le prese.
In seguito resettando l'Arduino dopo 1 secondo ho tutte le prese on/off (secondo quanto salvato in eeprom, il timer non influirebbe sullo stato delle prese). Con un approccio differente (raspi) i tempi sarebbero molto piu' lunghi (caricamento del SO, etc).

E' un esperimento indirizzato ad un approccio "domotico". Pensa ad un sistema del genere in ogni stanza di casa. Potresti comandare 8 punti luce/prese (decidere quando accenderle e spegnerle automaticamente nel corso della giornata) via ethernet oppure con i moduli NRF24l01+ (se non generano troppa RF) in rete peer (chiaramente servirebbe con un 328) tutti gestiti da una raspi master e server web.

ciao
vdr: 1.4.7+extpatch54 (pensionata), 1.7.27 (yavdr 0.4)
Percorri la via che porta al sole,
e non camminare sui sentieri oscuri.

E quando penso che sia finita,
è proprio allora che comincia la salita.
Avatar utente
alez
Messaggi: 3074
Iscritto il: 09 mag 2007, 17:11

Re: sketch per ciabattino

Messaggio da alez »

ragno ha scritto: E' un esperimento indirizzato ad un approccio "domotico". Pensa ad un sistema del genere in ogni stanza di casa. Potresti comandare 8 punti luce/prese (decidere quando accenderle e spegnerle automaticamente nel corso della giornata) via ethernet oppure con i moduli NRF24l01+ (se non generano troppa RF) in rete peer (chiaramente servirebbe con un 328) tutti gestiti da una raspi master e server web.

ciao
Per quanto riguarda i moduli, ho pensato ad un approccio tipo antifurto wireless: siccome i sensori radio degli antifurto (quelli sulle finestre attivati dai sensori reed) sono solitamente alimentati con pile ministilo e durano mediamente 3 anni, usano un sistema furbetto: i sensori trasmettono solo quando il sensore viene attivato, mentre solo una volta ogni 24 ore viene fatto il check della centrale che ne controlla lo stato. Qundi probabilmente sono in ascolto a basso consumo.

Per quanto riguarda la domotica, si potrebbe fare un sistema che li accende ogni 5 secondi per qualche millesimo di secondo in ascolto e l'impulso dalla "centrale" potrebbe essere lungo 6 secondi, in questo modo si ottiene un sistema poco o niente irradiante.
Ciao alez
davidea
Messaggi: 1279
Iscritto il: 16 ago 2009, 13:32
Località: Palermo
Contatta:

Re: sketch per ciabattino

Messaggio da davidea »

alez ha scritto: Per quanto riguarda i moduli, ho pensato ad un approccio tipo antifurto wireless: siccome i sensori radio degli antifurto (quelli sulle finestre attivati dai sensori reed) sono solitamente alimentati con pile ministilo e durano mediamente 3 anni, usano un sistema furbetto: i sensori trasmettono solo quando il sensore viene attivato, mentre solo una volta ogni 24 ore viene fatto il check della centrale che ne controlla lo stato. Qundi probabilmente sono in ascolto a basso consumo.

Per quanto riguarda la domotica, si potrebbe fare un sistema che li accende ogni 5 secondi per qualche millesimo di secondo in ascolto e l'impulso dalla "centrale" potrebbe essere lungo 6 secondi, in questo modo si ottiene un sistema poco o niente irradiante.

questo sistema e' quello che usano i ricetrasmettitori portatili radioamatoriali per risparmiare corrente in ricezione, azionano il ricevitore solo per poche decine di ms ogni 1,5sec , e se non trovano un segnale tornano in riposo , i risparmi sono notevoli!

invece io pensavo con questo progetto ad un qualcosa che mi sarebbe servito oggi che sono a bologna, la possibilita' di resettare un server senza che ci sia nessuno!!!! guidare la suocera a spegnere e riaccendere un pc messo dietro la tv non e' proprio agevole!
Avatar utente
alez
Messaggi: 3074
Iscritto il: 09 mag 2007, 17:11

Re: sketch per ciabattino

Messaggio da alez »

Le soluzioni professionali costano diverse centinaia di euro, fare un Ciabattino secondo me regala molte soddisfazioni e costa poco :ok:
Ciao alez
Avatar utente
ragno
Messaggi: 3017
Iscritto il: 20 gen 2007, 09:43
Località: Marte e dintorni
Contatta:

Re: sketch per ciabattino

Messaggio da ragno »

alez ha scritto: Per quanto riguarda i moduli, ho pensato ad un approccio tipo antifurto wireless: siccome i sensori radio degli antifurto (quelli sulle finestre attivati dai sensori reed) sono solitamente alimentati con pile ministilo e durano mediamente 3 anni, usano un sistema furbetto: i sensori trasmettono solo quando il sensore viene attivato, mentre solo una volta ogni 24 ore viene fatto il check della centrale che ne controlla lo stato. Qundi probabilmente sono in ascolto a basso consumo.

Per quanto riguarda la domotica, si potrebbe fare un sistema che li accende ogni 5 secondi per qualche millesimo di secondo in ascolto e l'impulso dalla "centrale" potrebbe essere lungo 6 secondi, in questo modo si ottiene un sistema poco o niente irradiante.
IMHO, la cosa puo' andare bene per gli antifurti, ma per la gestione dei punti luce mi pare di no. Non devi avere latenze e ogni "stazione" dovrebbe essere raggiungibile sempre. Io mi riferivo al fatto che sarebbe possibile anche utilizzare i moduli NRF2401. C'e' da "vedere" quanta rf modulano (tengo spento pure il wireless e lo attivo solo quando serve). Per il resto preferirei un approccio ethernet, anche perche' i moduli 28j60 costano 3 euro l'uno.

Lo schema e' sempre il solito.
MCP ->TRON: attiva la presa 1
TRON -> MCP: ho attivato il punto luce 3
Chiaramente nell'implementazione piu' semplice (tipo la mia ciabatta) MCP = TRON, in quella piu' complessa MCP = RASPI (o DS) e TRON = ARDUINO
:lol: :lol: :lol:

:ciao:
vdr: 1.4.7+extpatch54 (pensionata), 1.7.27 (yavdr 0.4)
Percorri la via che porta al sole,
e non camminare sui sentieri oscuri.

E quando penso che sia finita,
è proprio allora che comincia la salita.
Avatar utente
ragno
Messaggi: 3017
Iscritto il: 20 gen 2007, 09:43
Località: Marte e dintorni
Contatta:

Re: sketch per ciabattino

Messaggio da ragno »

Test prototipo Ciabattino.

Al momento non ho fatto modifiche allo sketch, sono in attesa della UI (penso dopo la raccolta dei carciofi :lol: :lol: :lol:)

In foto si puo' notare:

arduino con shield ethernet 28j60
led spia su pin 2
modulo a 2 relay collegato ai pin 8 e 9, vcc e gnd.

Ho riscontrato un'anomalia. Sul pin2 dell'arduino il led funziona correttamente ma il relay non viene eccitato. Sulle altre porte funziona. Togliendo lo shield funziona. Boh!

ciao

[edit]ho messo un'immagine un po' meno indecente...
Prototipo Ciabattino
Prototipo Ciabattino
IMG217.jpg (116.48 KiB) Visto 3893 volte
vdr: 1.4.7+extpatch54 (pensionata), 1.7.27 (yavdr 0.4)
Percorri la via che porta al sole,
e non camminare sui sentieri oscuri.

E quando penso che sia finita,
è proprio allora che comincia la salita.
Avatar utente
alez
Messaggi: 3074
Iscritto il: 09 mag 2007, 17:11

Re: sketch per ciabattino

Messaggio da alez »

Non riesco a capire se hai messo la resistenza sul LED...

In ogni caso se l'assorbimento generale fosse troppo elevato, si potrebbe verificare una perdita di potenza aleatoria che inficerebbe i pin a caso
Ciao alez
Avatar utente
ragno
Messaggi: 3017
Iscritto il: 20 gen 2007, 09:43
Località: Marte e dintorni
Contatta:

Re: sketch per ciabattino

Messaggio da ragno »

alez ha scritto:Non riesco a capire se hai messo la resistenza sul LED...

In ogni caso se l'assorbimento generale fosse troppo elevato, si potrebbe verificare una perdita di potenza aleatoria che inficerebbe i pin a caso
La resistenza sul led "spia" c'e' e dovrebbe essere da 1k

Spero che l'arduino riesca a pilotare tutte le uscite (con 2 relay funge ed il modulo e' fatto proprio per questo).
Riguardo pin2 (INT 0) forse e' differente rispetto gli altri i/o. Comunque non intendo utilizzare un driver per ciascuna uscita. Deve essere tutto il piu' semplice possibile.

ciao
Allegati
Particolare resistenza led &quot;SPIA&quot;
Particolare resistenza led "SPIA"
IMG218.jpg (133.2 KiB) Visto 3893 volte
vdr: 1.4.7+extpatch54 (pensionata), 1.7.27 (yavdr 0.4)
Percorri la via che porta al sole,
e non camminare sui sentieri oscuri.

E quando penso che sia finita,
è proprio allora che comincia la salita.
Avatar utente
alez
Messaggi: 3074
Iscritto il: 09 mag 2007, 17:11

Re: sketch per ciabattino

Messaggio da alez »

Ogni relais se non sbaglio ha il proprio transistor, per cui le uscite digitali dovrebbero farcela.

Hai provato invece dell'USB ad alimentarlo con un alimentatore 9V col jack?

Non vorrei che la porta USB e/o il regolatore onboard non ce la facessero
Ciao alez
Avatar utente
ragno
Messaggi: 3017
Iscritto il: 20 gen 2007, 09:43
Località: Marte e dintorni
Contatta:

Re: sketch per ciabattino

Messaggio da ragno »

@alez: grazie della dritta. :ok:
Provato con alimentatore della DS 9v 2a
Ora funge tutto, anche il relay sul pin2.

:ciao:
vdr: 1.4.7+extpatch54 (pensionata), 1.7.27 (yavdr 0.4)
Percorri la via che porta al sole,
e non camminare sui sentieri oscuri.

E quando penso che sia finita,
è proprio allora che comincia la salita.
Avatar utente
alez
Messaggi: 3074
Iscritto il: 09 mag 2007, 17:11

Re: sketch per ciabattino

Messaggio da alez »

:D bene mi fa piacere :ok:
Ciao alez
Rispondi