Go Down

Topic: Serveur domotique raspberry pi + arduino (Read 7 times) previous topic - next topic

archibal11

Sur mon serveur ma page php contient les scripts jquery.min.js et init.js
la page php appelle des fonctions dans init.js tel que

Code: [Select]
function emet( lamp,value, ack)
{
  var textejson = {"str":0x02,"len":0x04, "cmd":0x03, "dt1":lamp, "dt2":value, "dt3":ack, "end":0x03 };
  envoie(textejson);
}
function envoie(textejson)
{
  jQuery.post("socket.php", textejson,
function(data)
{
parseJSon(JSON.stringify(data));
}, "json");


}
function parseJSon(dJson)
{
  log(dJson);

  var duino = eval('(' + dJson + ')');
  switch(duino.cmd)
  {
    case 0x02:
      digitalWriteResp(duino.data1, duino.data2, duino.data3);
    break;
    case '2':
      digitalWriteResp(duino.data1, duino.data2, duino.data3);
    break;
    case 2:
      digitalWriteResp(duino.data1, duino.data2, duino.data3);
    break;
  }
 
}

et le fichier socket.php
Code: [Select]
<?php

$msg 
"";
$buffer null;

$msg file_get_contents("php://input"); // on ne reprend que les données utiles et non l'intégralité de la requête 
$host="xxx.xxx.xxx.xxx";
$port="xxxx";

$socket socket_create(AF_INETSOCK_STREAMSOL_TCP); //création du socket
socket_connect($socket$host$port); //connection du socket
socket_write($socket,$msg,strlen($msg)); //envoie des données POST

do
{
  if(isset(
$buffer)) // si buffer contien des donnees
    
echo $buffer// reponse à la requête javascript
}
while(@
socket_recv($socket,$buffer,32,0) != 0); // on attend la reponse (=! 0) sur le socket

socket_close($socket); //fermeture du socket
?>


Désolé je ne saurai pas vous expliqué plus. En espérant que cela vous aide a comprendre comment cela marche chez moi...

barbudor

Donc si je comprend bien tu es déjà dans le 2nd cas

Page [Javascript/JQuery] --(post)--> Serveur web [PHP] --(tcp-socket)--> Arduino [EthernetServer]

Je dirais que tu es dans le cas le plus simple pour migrer vers une liaison USB/Serial entre ton RPi et ton Arduino.

En effet coté Arduino, il va te falloir passer à Serial au lieu de EthernetServer. Cela va dans le sens d'une simplification du code car tu n'auras plus besoin de gérer un serveur et une connexion : la connexion série est toujours présente.

Coté PHP il va falloir remplacer la gestion socket par une gestion de port série.
Une rapide recherche google et je vois qu'il y a probablement 2 méthodes pour faire cela :
- la lib intégré à PHP "Direct I/O" http://php.net/manual/en/book.dio.php
- une lib externe dédiée serial : http://code.google.com/p/php-serial/

et je tombe par hasard sur un article qui parle d'utiliser la lib php-serial avec un RPi : http://www.raspberrypi.org/phpBB3/viewtopic.php?f=34&t=12000 (en fait c'est un gars qui a des problèmes parce que ca marche pas).

Je dirais pas encore tout a fait "Total Bonheur" mais je pense qu'on s'en rapproche.

Je suggère les étapes suivantes :
1) Etablir la liaison série entre RPi et Arduino
- Flasher dans ton Arduino depuis PC un sketch qui configure Serial à 9600b et qui fait Serial.println("Hello world!" ); delay(1000 );
- Brancher l'Arduino sur le port USB du RPi (il peut être prudent d'alimenter l'Arduino sur son entrée 6-9V pour éviter de trop tirer sur l'alim USB du RPi qui n'est pas réputée pour être très costaude).
- Attendre quelques instants
- taper la commande "dmesg" qui devrait rapporter que le port USB a été monté comme une liaison série du genre /dev/sttyUSBx" ou quelque chose du genre (trop fatiqué pour essayer moi même ce soir)
- taper la commande "cat /dev/xxxx" avec le nom de device ci-dessus
- Si tout se passe bien, tu devrais avoir les HelloW orld qui s'affichent dans la console
(J'ai fait ca avec une leonardo sur mon WR703N et il n'y avait aps besoin de régler la vitesse du port série coté Linu. Avec une UNO possible qu'il faille d'abord configurer le port série Linux et je sais pâ faire)

2) Apprendre à se servir de la php-serial ou DirectI/O pour communiquer entre PHP et Arduino
Note que PHP peut aussi s'utiliser en ligne de commande sans Web comme un langage de script en utilisant la commande "php moncode.php" ce qui est plus facile pour faire ce genre de test que de la faire via un serveur web.

3) Modifier ton PHP et ton sketch pour passer au dialogue série.

J'espère avoir été clair sur les étapes.
Si un manchot pingouin ;) traine par là, il pourra te donner plus de détails sur le fonctionnement des ports série sur Linux, moins je suis encore trop imbibé de Windows XD.
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

archibal11

Merci pour les infos, je vais étudier cela  ...
J'ai aussi une WR703N non flashé OpenWrt, et pour l'instant pas trouvé quoi en faire si tu as des idées a me proposer ...

barbudor

Pour avoir essayé, le dev sur WR703N est pas évident.
Je pense que sur RPi c'est plus facile comme c'est plus ou moins une Debian propre.

Mais tu peux commencer par bosser sur Linux PC puis porter petit a petit sur RPi.

J'utilise un Xbuntu dans un VMWare player avec QTCreator comme IDE pour editer, compiler et debugger.
Quand ton code marche sur PC, tu peux passer et le recompiler sur RPi avec makefile sans IDE car il est déjà bon à 99.9%.

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

infobarquee

#14
Jan 05, 2013, 09:49 am Last Edit: Jan 05, 2013, 10:13 am by infobarquee Reason: 1
bonjour,
avec un uno r3, c'est /dev/ACM0 sur le RPI.

après pour envoyer des commandes via php sur l'usb, il faut donner les droits à apache pour le faire.
après avec un truc de ce genre
Quote

$string="coucou";
$port = '/dev/ACM0';
$handle = fopen($port, 'w');
$contents = fwrite($handle, $string);
fclose($handle);


le mieux est d'utiliser un daemon, regarde ici http://open3600.fast-mail.nl/tiki-index.php
tu pourras t'en inspirer, on fait ca pour connecter une station météo avec linux et envoyer les données recues par usb vers apache/mysql.

EDIT :
pour donner les droits sur l'usb à apache (j'ai oublié de mettre la commande :) )
Quote
sudo chown apache2:apache2 /dev/ttyACM0

Go Up