logo

lunedì 8 ottobre 2012

Ubuntu server gui


Per poter installare la parte grafica al vostro server dovete, per prima cosa dopo aver effettuato il login
digitare: sudo apt-get update (per aggiornare i pacchetti software)
poi: sudo apt-get install ubuntu-desktop
per installare l'interfaccia grafica di ubuntu 

sudo apt-get install xubuntu-desktop
per installare l'interfaccia grafica di xubuntu

sudo apt-get install kubuntu-desktop
per installare l'interfaccia grafica di kubuntu

domenica 7 ottobre 2012

Arduino Web Server GUI

Adesso, dopo aver visto come realizzare un web server con arduino e visualizzare l'output su un browser, vediamo come realizzare un'interfaccia grafica per interagire con il nostro arduino.
In questo esempio accenderemo un led collegato ad arduino tramite un pulsante sul nostro browser.



//ARDUINO 1.0
//include tutti i pacchetti necessari
String readString;
#include <Ethernet.h>
#include <SPI.h>
boolean reading = false;

////////////////////////////////////////////////////////////////////////
//configurazione della rete
////////////////////////////////////////////////////////////////////////
  byte ip[] = { 192, 168, 1, 17 };   //ip:modificabile, da digitare nel browser
  byte gateway[] = { 192, 168, 1, 1 }; //non modificare
  byte subnet[] = { 255, 255, 255, 255 }; //non modificare

  //  MAC address
  byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

  EthernetServer server = EthernetServer(80); //port 80
////////////////////////////////////////////////////////////////////////

void setup(){
  Serial.begin(9600);

 

  pinMode(2, OUTPUT);//Pin 2 led

  Ethernet.begin(mac, ip, gateway, subnet);
 

  server.begin();
  Serial.println(Ethernet.localIP());

}

void loop(){


 
  checkForClient();

}

void checkForClient(){

  EthernetClient client = server.available();

  if (client) {

   
    boolean currentLineIsBlank = true;
    boolean sentHeader = false;

    while (client.connected()) {
      if (client.available()) {

        if(!sentHeader){
       
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          client.println("<html>");
          client.println("<head><title>Arduino accendere e spegnere LED</title>");
          client.println("<center><h1>Accendere e spegnere LED</h1></center> </head>");
          client.println("<body>");
         
  client.println("<center>");  
  client.println("<table width=100>");
  client.println("<form METHOD=get action=\"\">");
  client.println("<input type=hidden name=\"c\" value=\"2\">");
  client.println("<input type=submit value=\"LED On\">");
  client.println("</form>");
  client.println();
 
  client.println("<form METHOD=get action=\"\">");
  client.println("<input type=hidden name=\"c\" value=\"3\">");
  client.println("<input type=submit value=\"LED Off\">");
  client.println("</form>");
  client.println();
 
 
  client.println("</table>");
  client.println("</center>");
 
 
 
 
  client.println("</body>");
  client.println("</html>");
 
          sentHeader = true;
        }

        char c = client.read();

        if(reading && c == ' ') reading = false;
        if(c == '?') reading = true;

        if(reading){
          Serial.print(c);

           switch (c) {
            case '2':
              //add code here to trigger on 2
              digitalWrite(2, HIGH);
              break;
            case '3':
            //add code here to trigger on 3
              digitalWrite(2, LOW);
              break;
           
          }

        }

        if (c == '\n' && currentLineIsBlank)  break;

        if (c == '\n') {
          currentLineIsBlank = true;
        }else if (c != '\r') {
          currentLineIsBlank = false;
        }
if (c == '\n' && currentLineIsBlank)  break;

        if (c == '\n') {
          currentLineIsBlank = true;
        }else if (c != '\r') {
          currentLineIsBlank = false;
        }
      }
    }


    delay(1);
    client.stop(); // chiude la connessione

  }

}

Arduino Web Server

Questo sketch mette le basi all'interazione di arduino e il linguaggio del web(html, php, etc...)

L'ide utilizzato è 1.0 lo specifico perchè c'è una piccola differenza con le precedenti versioni, e non funziona, l'esempio è quello che si trova in examples/ethernet/web server e non esegue alcunchè se non visualizzare sul browser lo stato delle porte analogiche.




#include <SPI.h>
#include <Ethernet.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };//lasciare invariato
IPAddress ip(192,168,1, 177); //ip da digitare nel browser

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);

void setup()
{
  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
}

void loop()
{
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();

          // output the value of each analog input pin
          for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
            client.print("analog input ");
            client.print(analogChannel);
            client.print(" is ");
            client.print(analogRead(analogChannel));
            client.println("<br />");
          }
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
  }
}


domenica 8 aprile 2012

Cos'è il ponte ad H e come si costruisce

Con questo tutorial vorrei chiarire come pilotare un motore DC in modo bi-direazionale con 4 porte digitali di arduino (che possono essere ridotte a 2 con l'aggiunta di 2 ulteriori transistor), con un circuito composto da 4 transistor (di cui 2 NPN e 2 PNP) e 4 diodi. Come ben sapete i motori elettrici hanno bisogno di una "centralina" per essere comandati. Questo componente spesso è composto (se si parla di motori dc) da 4 transistor e 4 diodi (molto spesso sono presenti anche dei condensatori e resistenze), quindi una cosa realizzabile senza problemi in casa in pochi minuti. 

Lista dei componenti
  1. 2x BD177 transistor
  2. 2x BD178 transistor
  3. 4x IN4007 diodo
I transistor sono i componenti fondamentali e attivi del sistema. Ci sono due tipologie di transistor quelli NPN e quelli PNP. La differenza tra i due è che gli NPN funzionano permettendo alla corrente positiva di attraversarli (cioè corrente in arrivo da + e in uscita dal transistor verso motore) solo se il polo base è connesso al +, invece PNP permettono alla corrente in arrivo dal motore di attraversali e andare verso la massa, solo se la base è connessa al -.

 PNP NPN

In cosa consiste
Il ponte ad H è cosi' chiamato per la forma dello schema, è formato da 4 transistor e 4 diodi che hanno il ruolo di permettere o no il flusso di corrente in un dato senso all'interno del sistema. Questi verranno accesi a coppie per ruotare il motore in un senso o nell'altro, gli altri due saranno opportunamente chiusi per evitare corti circuiti. In poche parole grazie a 4 switch è possibile decidere la direzione della corrente all'interno del motore e quindi trasformarla in movimento in un dato senso di rotazione. Ecco uno schema semplice di cosa si ottiene:

 transistor1  transistor2  transistor3  transistor4 Risultato sperimentale
1001 Rotazione in senso orario
0110 Rotazione in senso antiorario 
0000 Motore libero
0101 Frenata elettromagnetica
1010 Frenata elettromagnetica

Tutto ciò consiste in un Ponte ad H davvero minimale.
E' pensato per pilotare motori DC da 3 a 36v con un assorbimento massimo di 3A continui e 7A pulsati. L'architettura del sistema è pensata per ridurre il più possibile le possibilità di baking di componenti (bruciare tutto per errore di wiring). I Transistor consigliati sono enormi ed è impossibile bruciarli con una batteria da 6 volt in qualsiasi combinazione proviate.

ponteadh
Come potete vedere il circuito è molto semplice. Fate molta attenzione al wiring dei transistor, controllate sui datasheet linkati sopra la referenza dei pin e connettetela come spiegato. Testate prima il funzionamento di un singolo transistor delle due tipologie. Dopo aver chiarito i collegamenti di entrambi, iniziate con metodo a duplicare e specularizzare lo schema ; ). Dopo aver fatto il wiring come mostrato qui sopra, collegate le basi dei 4 transistor alle porte digitali  2 3 4 5 di Arduino e caricate lo sketch seguente:
01int motorPin1 =  2;   
02int motorPin2 =  3;   
03int motorPin3 =  4;   
04int motorPin4 =  5;   
05
06void setup()   {               
07  pinMode(motorPin1, OUTPUT);    
08  pinMode(motorPin2, OUTPUT);    
09  pinMode(motorPin3, OUTPUT);    
10  pinMode(motorPin4, OUTPUT);           
11}
12
13void loop()                     {
14  digitalWrite(motorPin1, HIGH);  //gira in senso orario per 1 sec
15  digitalWrite(motorPin2, LOW);  
16  digitalWrite(motorPin3, LOW);   
17  digitalWrite(motorPin4, HIGH); 
18  delay(1000);
19  digitalWrite(motorPin1, LOW);   //gira in senso antiorario per 1 sec
20  digitalWrite(motorPin2,HIGH);  
21  digitalWrite(motorPin3, HIGH);   
22  digitalWrite(motorPin4, LOW);  
23  delay(1000);                  //l'uso di delay è deprecato, è solo un esempio ;)
24}
Dopo aver alimentato il motore e caricato lo sketch dovreste ottenere 1 secondo di rotazione in un senso e 1 secondo di rotazione nel senso opposto. Questo è solo un piccolo esempio delle incredibili funzionalità di questo sistema, che permette di pilotare qualsiasi motore dc applicato alla robotica amatoriale senza avere problemi.
In questo caso per l'esempio ho utilizzato un motore delle amate MINI4WD e un alimentatore da 6v 1A.