Modérateurs: Modération Forum DIY, Modération Forum Installations, Le Bureau de l’Association HCFR • Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 5 invités

DSPiy + domotiyque

Message » 07 Juin 2015 19:04

Bonsoir,
j'ai un peu avancé sur le code. J'ai fait un p'tit script python (parce que c'est le seul langage que j'ai appris, que c'est facile et pas besoin de compiler.. :siffle: ) qui envoi une chaîne de caractères à l'arduino via l'ethernet. L'arduino reçoit bien, pas de soucis à ce niveau. Le soucis, c'est que l'arduino reçoit caractère par caractère. Si j'envoi "120", il reçoit 1, puis 2, puis 0. Je cherche à convertir ces caractères en entier, mais la je bloque un peu. Une idée ?

Le script python :
Code: Tout sélectionner
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("192.168.0.1", 1337))
data = 0
q = 0
print ("-Dspiy control using Arduino-Ethernet and sony IR protocol-")
print ("0 à 110 Volume Level *2")
print ("111 à 120 N° de Preset + 110")
print ("121 Standby")
print ("122 Sortie de Standby")
print ("123 Mise en Mute")
print ("124 Sortie du Mute")
print ("Pas de Balance")
print ("125 exit program")
while q != 125:
 
    q = int(input())
    s.send(str(q).encode())
     
    if q < 111 :
        print ("Volume à : ")
        print (q/2)
        continue
 
    if q > 110 and q < 121 :
        print ("Preset n° : ")
        print (q-110)
        continue
   
    if q == 121 :
        print(" Standby")
        continue
   
    if q == 122 :
        print ("Sortie de Standby")
        continue

    if q == 123 :
        print ("Mute")
        continue

    if q == 124 :
        print ("Unmute")

         
print ("a+ !")
s.close()


Le code arduino :

Code: Tout sélectionner
#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED } ;
byte ip [] = { 192,168,0,1};
byte gateway [] = {192,168,0,1};
int address = 29 ;
int out = 9 ; //output is pin 9

EthernetServer server(1337);


void setup() {
  pinMode(out, OUTPUT);  //put pin "out" as output
  Ethernet.begin(mac, ip, gateway);
  server.begin(); 
  Serial.begin(9600);
}

void loop() {
  int command ;
  EthernetClient client = server.available();
  if (client && client.connected()) {
    if (client.available() > 0) {
     char inputChar =client.read();
    Serial.println(inputChar) ;
    }
     //inputChar to int command
    int zeros = 7 - String(command,BIN).length(); //convert command in 7-bit
    String Com;
    for (int i=0; i<zeros; i++) {
      Com = Com + "0";
    }
    Com = Com + String(command,BIN);
    zeros = 5 - String(address,BIN).length(); // convert address in 5-BIT
    String Address ;
    for (int u=0 ; u<zeros; u++) {
      Address = Address +"0" ;
    }
    Address = Address + String(address,BIN);
    String ComAddress = Address + Com ; // ComAddress = 5 bit address + 7 bit com
    digitalWrite(out,HIGH);     //2.4ms leading pulse burst
    delay(2.4);
    digitalWrite(out,LOW);      //0.6ms space
    delay(0.6);
    for (int j=11; j>-1; j--) {   
      char Bit = Com.charAt(j) ; //12-bit command + address for the receiving device
      if (Bit == 1) {     // give Bit 1 in sony protocol
        digitalWrite(out,HIGH);
        delay(1.5);
        digitalWrite(out, LOW);
        delay(0.6);}
      else {                   // give Bit 0 in sony protocol
        digitalWrite(out,HIGH);
        delay(0.6);
        digitalWrite(out, LOW);
        delay(0.6);
      }
    }
  }
}

Louis
Misu
 
Messages: 284
Inscription Forum: 04 Nov 2012 16:44
Localisation: Bordeaux-Poitiers
  • offline

Message » 07 Juin 2015 20:52

Misu a écrit: Si j'envoi "120", il reçoit 1, puis 2, puis 0. Je cherche à convertir ces caractères en entier, mais la je bloque un peu. Une idée ?

Louis

int(s) ne convertit pas s de string en entier ?
alkasar
 
Messages: 11517
Inscription Forum: 29 Nov 2005 22:47
Localisation: Neuf deux
  • offline

Message » 07 Juin 2015 21:08

Il y a la fonction toInt() qui converti en string. Mais mon soucis c'est surtout que client.read() envoi caractère par caractère. Mais en regardant la doc de la fonction toInt() je crois que j'ai la solution au problème :bravo:
http://www.arduino.cc/en/Tutorial/StringToIntExample
L'exemple à la fin, juste remplacer serial.read par client.read() ! Pas le temps ce soir de tester, je regarderai ça demain je pense. Sinon l'autre soucis c'est ce que je peux pas regarder ce que l'arduino sort sur ses pins car pas d'oscilloscope/analyseur logique sur moi
Louis
Misu
 
Messages: 284
Inscription Forum: 04 Nov 2012 16:44
Localisation: Bordeaux-Poitiers
  • offline

Message » 09 Juin 2015 22:41

Voila, j'ai normalement cette fois c'est bon, j'arrive bien à récupérer la chaîne de caractère d'après ce le moniteur série. J'ai légèrement modifié le script python pour qu'il envoi le char 'b' à la fin de chaque message pour dire à l'arduino que c'est la fin du message. Pas encore testé, mais normalement ça devrait marcher. Si quelqu'un veut tenter qu'il n'hésite pas. Ou du moins regarder si quelque chose sort sur les pins de l'arduino, parce que ça c'est pas encore gagné !
Le code :
Code: Tout sélectionner
#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED } ;
byte ip [] = { 192,168,0,1};
byte gateway [] = {192,168,0,1};
int address = 29 ;
int out = 9 ; //output is pin 9

EthernetServer server(1337);


void setup() {
  pinMode(out, OUTPUT);  //put pin "out" as output
  Ethernet.begin(mac, ip, gateway);
  server.begin(); 
  Serial.begin(9600);
}

void loop() {
  int command ;
  String inString = "";
  EthernetClient client = server.available();
  while (client && client.connected()) {
    if (client.available() > 0) {
      int inChar =client.read();
      if (isDigit(inChar)) {
         inString +=(char)inChar;
       }
      if (inChar == 'b') {
        command = inString.toInt();
        Serial.print("inString : ");
        Serial.println(inString);
        Serial.print("Command : ");
        Serial.println(command);
        inString = "";
      }
    int zeros = 7 - String(command,BIN).length(); //convert command in 7-bit
    String Com;
    for (int i=0; i<zeros; i++) {
      Com = Com + "0";
    }
    Com = Com + String(command,BIN);
    zeros = 5 - String(address,BIN).length(); // convert address in 5-BIT
    String Address ;
    for (int u=0 ; u<zeros; u++) {
      Address = Address +"0" ;
    }
    Address = Address + String(address,BIN);
    String ComAddress = Address + Com ; // ComAddress = 5 bit address + 7 bit com
    digitalWrite(out,HIGH);     //2.4ms leading pulse burst
    delay(2.4);
    digitalWrite(out,LOW);      //0.6ms space
    delay(0.6);
    for (int j=11; j>-1; j--) {   
      char Bit = Com.charAt(j) ; //12-bit command + address for the receiving device
      if (Bit == 1) {     // give Bit 1 in sony protocol
        digitalWrite(out,HIGH);
        delay(1.5);
        digitalWrite(out, LOW);
        delay(0.6);
      }
      else {                   // give Bit 0 in sony protocol
        digitalWrite(out,HIGH);
        delay(0.6);
        digitalWrite(out, LOW);
        delay(3);
     }
   }
  }
 }
}



Le script :
Code: Tout sélectionner
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("192.168.0.1", 1337))
data = 0
q = 0
print ("-Dspiy control using Arduino-Ethernet and sony IR protocol-")
print ("0 à 110 Volume Level *2")
print ("111 à 120 N° de Preset + 110")
print ("121 Standby")
print ("122 Sortie de Standby")
print ("123 Mise en Mute")
print ("124 Sortie du Mute")
print ("Pas de Balance")
print ("125 exit program")
while q != 125 :
 
    q = int(input())
    msg = str(q).encode()
    msg =  msg + b'b'
    s.send(msg)
    print(msg.decode())
     
    if q < 111 :
        print ("Volume à : ")
        print (q/2)
        continue
 
    if q > 110 and q < 121 :
        print ("Preset n° : ")
        print (q-110)
        continue
   
    if q == 121 :
        print(" Standby")
        continue
   
    if q == 122 :
        print ("Sortie de Standby")
        continue

    if q == 123 :
        print ("Mute")
        continue

    if q == 124 :
        print ("Unmute")

         
print ("a+ !")
s.close()


Louis
Misu
 
Messages: 284
Inscription Forum: 04 Nov 2012 16:44
Localisation: Bordeaux-Poitiers
  • offline

Message » 11 Juin 2015 18:02

J'ai pas mal réfléchi à tout ce qu'on pouvait faire en utilisant ce système de code IR, et je pense à utiliser un arduino comme master, donc il gérerait tous les boutons, les entrées, l'écran ( :-? ), je pense inclure le module bluetooth également, et afficher les infos sur l'écran. J'aimerai passer en multidspiy pour faire du 5.1, donc l'arduino gérerait également l'allumage/extension des dspiy quand je passerai de 2.0 à 5.1. Je pense aussi à un retour d'état, qui peut être pratique dans certain cas. C'est un peu dans l'optique d'avoir un préampli super complet et modulaire. Je vais essayer de mettre tout ça au clair, et quand ça aura un peu mûri je ferai un fil dédié. Si ça marche j'espère pouvoir faire un joli PCB. Pour l'instant j'ai juste rapidement ajouté un encodeur rotatif, et ça a l'air de marcher. Si vous avez des idées..
Louis
Misu
 
Messages: 284
Inscription Forum: 04 Nov 2012 16:44
Localisation: Bordeaux-Poitiers
  • offline

Message » 11 Juin 2015 19:46

Misu a écrit:Si vous avez des idées..
Louis

ben je vois que t'es pas en manque d'idées justement :)
super perspective intéressante autour du DSPiy.
alkasar
 
Messages: 11517
Inscription Forum: 29 Nov 2005 22:47
Localisation: Neuf deux
  • offline

Message » 11 Juin 2015 20:03

Ben ça fait quelque temps que j'y pense, et j'essaye de faire le tri entre utile/inutile/réalisable/irréalisable, pour pas que ça parte dans tous les sens. Je vais acheter un écran assez rapidement, je pense la même gamme que celui du dspiy mais probablement son grand frère ( :oops: ) car c'est que je connais le moins, et qui risque de prendre le plus de temps.
Misu
 
Messages: 284
Inscription Forum: 04 Nov 2012 16:44
Localisation: Bordeaux-Poitiers
  • offline

Message » 16 Juin 2015 1:25

Bonsoir,
J'ai fait ce petit block diagram qui récapitule un peu tout au niveau du hardware. Je vais essayer de faire pareil niveau software. Il manque surement des trucs, et je ne sais pas s'il existe des codes ou pas mais j'ai vraiment fait ça au feeling ( :siffle: ). N'hésitez pas à faire des remarques.
Image
Louis

Edit : il manque par exemple les entrés analogiques du DSPIY II_2 et II_3
Edit 2 : Les trigger Out seront probablement gérés directement par l'atmega
Misu
 
Messages: 284
Inscription Forum: 04 Nov 2012 16:44
Localisation: Bordeaux-Poitiers
  • offline


Retourner vers Filtrage actif, Equalisation et Processeurs

 
  • Articles en relation
    Dernier message