mercoledì 2 novembre 2011

auto radiocomandata controllata da iphone via webapp



Finalmente qualcosa di utile... :)

Qualche mese fa in soffitta ho ritrovato la macchinina radiocomandata di quando ero pischello.
Non ho pero' ritrovato il radiocomando.

Ho pensato allora di fare qualcosina di divertente e  "contemporaneo". Cercando dapprima un modo di controllare la macchina radiocomandata da pc via bluetooth grazie al modulo blueSMirf di cui ho già parlato. Poi ho pensato che scegliendo di controllare il tutto da una web application avrei potuto controllare la macchinina radiocomandata anche dall'iphone, dall'android, dal blackberry, dal nokia, dal fax, e dal pallottoliere...   A render possibile il tutto ovviamente ARDUINO!!!!

Sostanzialmente il progetto è composto da:
- Arduino (nel mio caso boarduino)
- Un doppio ponte H (L298)
- un laptop macbook (mi vergogno un po') su cui c'è linux (ubuntu 10.4)
- Apache
- php
- la libreria php_serial_class.php
- jqueryMobile

E funziona pressapoco così:
Apache ha i permessi di scrivere sulla seriale (rfcomm)
L'iphone, o chi per esso, visita una pagina sul server (in rete locale) dove ci sono 6 button.
Ogni button ha in query string appeso un valore diverso (tipo http://192.168.x.x/car.php?a=49)
in ajax viene chiamata una pagina php che va a scrivere sulla seriale bluetooth (nel mio caso rfcomm0) il valore della variabile passata in get
arduino ascolta i valori della seriale e in base al valore aziona uno dei 2 ponti H uno per lo sterzo e l'altro per i motori.


Di seguito il file rf.php che è la pagina visualizzata dall'iphone (abbastanza quick e soprattutto dirty):
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.0a2/jquery.mobile-1.0a2.min.css" />
<script src="http://code.jquery.com/jquery-1.4.4.min.js"></script>
<script src="http://code.jquery.com/mobile/1.0a2/jquery.mobile-1.0a2.min.js"></script>
<script>
jQuery(document).bind(
   "mobileinit", function(){
   jQuery.extend( jQuery.mobile, { hashListeningEnabled: false });
   });
 $(function() {
            $(".boton").click(function(e) {
e.preventDefault();     
                    $.ajax({
                      type: "GET",
                      url: $(this).attr('href'),
                      //data: ({'a': $(this).attr('href')}),
                      cache: false,
                      dataType: "text",
                      success: onSuccess
                    })
            });
            $("#resultLog").ajaxError(function(event, request, settings, exception) {
              $("#resultLog").html("Error Calling: " + settings.url + "<br />HTPP Code: " + request.status);
            });
            function onSuccess(data)
            {
$.mobile.loadingMessage = false;
                $("#resultLog").html("Result: " + data);
            }
        });
</script>
</head>
<body>
<div data-role="page" id="foo"> 
        <div data-role="header"> 
             <h1>Header</h1> 
        </div>
<div data-role="content"> 
<div data-role="controlgroup" style="width:30%; float:left;" >
<div class="boton" href="car.php?a=49" data-role="button" data-icon="arrow-u">FW</div>
<div class="boton" href="car.php?a=51" data-role="button" data-icon="delete">ALT</div>
<div class="boton" href="car.php?a=50" data-role="button" data-icon="arrow-d">BW</div>
</div>
<div data-role="controlgroup" data-type="horizontal"  style="width:60%; float:right;" >
<div class="boton" href="car.php?a=52" data-role="button" data-icon="arrow-l">L</div>
<div class="boton" href="car.php?a=53" data-role="button" data-icon="delete">C</div>
<div class="boton" href="car.php?a=54" data-role="button" data-icon="arrow-r">R</div>
</div>
</div>
<div style="clear:both"></div>
<div id="resultLog"></div>
<div data-role="footer"> 
<h4>Footer</h4> 
</div>
</div>
</body>
</html>


Questo è il php chiamato in ajax:

<?php
$a=$_GET['a'];
ini_set('display_errors',1);
require_once("php_serial.class.php");
// Let's start the class
$serial = new phpSerial;
// First we must specify the device. This works on both linux and windows (if
// your linux serial device is /dev/ttyS0 for COM1, etc)
//$serial->deviceSet("/dev/ttyUSB0");
$serial->deviceSet("/dev/rfcomm0");
 //Set the serial port parameters. The documentation says 9600 8-N-1, so
    $serial->confBaudRate(115200); //Baud rate: 9600
    $serial->confParity("none");  //Parity (this is the "N" in "8-N-1")

// Then we need to open it
$serial->deviceOpen();
// To write into
$serial->sendMessage(chr($a));
// Or to read from
//$read = $serial->readPort();
//var_dump($read);
// If you want to change the configuration, the device must be closed
$serial->deviceClose();
die($a);

?>
Questo è lo sketch per arduino:

int seriale=0;
/*
  AnalogReadSerial
 Reads an analog input on pin 0, prints the result to the serial monitor 
 This example code is in the public domain.
 */

void setup() {
  Serial.begin(115200);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
  pinMode(10,OUTPUT);
  pinMode(11,OUTPUT);
  pinMode(13,OUTPUT);
}

void loop() {
  if (Serial.available()>0)
  {
    seriale=Serial.read();
    digitalWrite(13,HIGH);
    
    switch(seriale){
    
    case 49:
            Serial.println("UNO");
            digitalWrite(8,HIGH);
            digitalWrite(9,LOW);
            
            break;
    case 50:
            Serial.println("DUE");
            digitalWrite(9,HIGH);
            digitalWrite(8,LOW);
            break;
    case 51:
            Serial.println("STOP");
            digitalWrite(8,LOW);
            digitalWrite(9,LOW);
            break;
     case 52:
           Serial.println("LEFT");
            digitalWrite(10,HIGH);
            digitalWrite(11,LOW);
            break;
     case 53:
            Serial.println("CENTER");
            digitalWrite(11,LOW);
            digitalWrite(10,LOW);
            break;
     case 54:
            Serial.println("RIGHT");
            digitalWrite(11,HIGH);
            digitalWrite(10,LOW);
            break;
            
    }
    Serial.println(seriale);
    
  }
    else
    {
    digitalWrite(13,LOW);
    }
       

      
      //Serial.flush();
   
  
  
}







Ecco un video delle prime prove con il circuito su breadboard col mitico Ricci come pilota:



E questa è una foto del gioiellino finito:




Boarduino e BlueSMirf sono montati su strips femmine in modo da poterli estrarre


Per il momento mi fermo qui se vi interessa commentate  : )



12 commenti:

  1. Puoi contattarmi a questo indirizzo sannino.shop@live.it?
    Grazie mille.. devo chiederti un'informazione sul progetto..

    RispondiElimina
  2. Il post è un po 'complicato, ma mi piace molto il tuo gem.Arduino finito è uno strumento molto utile ed è stato utilizzato molto intelligently.I anche pensare che l'apprendimento dalle esperienze è un bene, perché non si può mai dimenticare le esperienze di life.So hai fatto un bel sforzo e alla fine hai le result.Thanks per la condivisione di queste informazioni.

    Nitrotek

    RispondiElimina
  3. Ciao, avrei delle domande da farti sul tuo progetto. Hai un indirizzo e-mail o un contatto ad esempio skype in sui possa contattarti?

    Grazie in anticipo :)

    RispondiElimina
    Risposte
    1. Se vuoi possiamo scriverci qui, così magari la nostra discussione puo' essere di aiuto a qualcuno... cosa ne pensi?

      Elimina
    2. Per me va benissimo... Ma se hai comunque un indirizzo mail o in cui contattarti subito sarebbe meglio, qui mi sembra un po' statico.
      Comunque, scusa la mia ignoranza, come hai collegato l'arduino con i dati presi da internet? Io avevo in mente di fare una cosa come la tua, solo che pensavo di utilizzare l'arduino wifi ma tu non lo hai messo tra i componenti ma hai l'apache che sinceramente non ho la benchè minima idea di cosa sia.

      Grazie :)

      Elimina
    3. la mia mail gmail è ramointeractive.filippo@gmail.com

      Praticamente l'applicazione funziona così:

      - il laptop ha un server web installato (l'Apache appunto) che fa girare una webapp. In questo modo la stessa applicazione puo' essere usata sia dai telefoni android, iphone che dal pc attraverso un browser.

      - sempre sul server web installato sul laptop ci sono degli script php che si occupano di fornire le pagine visibili dai dispositivi (es telefono) e, quando sono passati dei comandi dalle pagine web (quando si clicca su un pulsante per intenderci), di scrivere sulla rfcomm i valori che lo sketch arduino interpreta per azionare i ponti H.

      - la connessione bluetooth è gestita dal laptop e il php puo' scriverci come se fosse un file (in linux "quasi tutto" è un file) /dev/rfcomm0

      Elimina
  4. Questo commento è stato eliminato dall'autore.

    RispondiElimina
  5. Buonasera,
    Le scrivo per chiederLe se è possibile mettersi in contatto con lei via mail poiché ho diverse domande da farLe sul progetto in questione.

    RispondiElimina
  6. Ciao,
    Cosa dici se continuiamo la comunicazione sul blog in modo da essere utili (se ci riusciamo) anche a qualcun altro?
    cosa dici?

    RispondiElimina