Go Down

Topic: [résolu]Moniteur et communication série (Read 1 time) previous topic - next topic

skywodd


Cela dit, ça ne change rien à mon problème, le comprtement reste le même. Mais bon au moins j'ai appris deux trois trucs pour mieux coder.

Je viens de voir un truc pas beau du tout dans le code python ;)

Tu ouvre le port série à chaque appel de updateData() !
Ouvre le port série une fois pour toute lors de l'instanciation de ta classe app, puis fait uniquement l'appel à ser.write(data) dans upateData().
Si l'auto reset à l'ouverture du port série se fait (ce qui semble le cas) ton arduino reboot à chaque fois et le temps du lancement tu "perd" les info ;)
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

CaptainNapalm

Yep ça roule maintenant =D
Merci pour vos réponses.

vohu

Essaye avec :  
Code: [Select]
ser.write(self.data.encode("utf8"))

Grillé, raté :D

skywodd


Yep ça roule maintenant =D

Publie ton code arduino et python qui marche (si ça ne te dérange pas bien sûr).
Cela permettra aux futurs lecteurs de ce topic de résoudre leurs problèmes ;)
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

CaptainNapalm

Yo,
Ça faisait un moment que j'étais pas repassé sur ce sujet. Mais mieux vaut tard que jamais, je mets les codes ici pour ceux que ça pourrait intéresser.
Bon du coup c'est ultra basique, mais y'a moyen d'étoffer tout ça en trouvant d'autres trucs à controler via une interface graphique.

Le sketch Arduino (pour le coup c'est vraiment basique haha)
Code: [Select]
const byte rpin = 9;
const byte gpin = 10;
const byte bpin = 11;


void setup() {
  pinMode(rpin, OUTPUT);
  pinMode(gpin, OUTPUT);
  pinMode(bpin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
 
  if (Serial.available() > 5) {
    int rval = Serial.parseInt();
    int gval = Serial.parseInt();
    int bval = Serial.parseInt();
     
      if(rval >= 0 && rval <= 255 && gval >= 0 && gval <= 255 && bval >= 0 && bval <= 255 && Serial.read() == '\n'){
analogWrite(rpin, rval);
        analogWrite(gpin, gval);
analogWrite(bpin, bval);
      }
}
}


Et le python
Code: [Select]
# -*- coding: ISO-8859-1 -*-


import kivy
from kivy.uix.gridlayout import GridLayout
from kivy.uix.slider import Slider
from kivy.uix.label import Label
from kivy.app import App

import serial
import sys

SERIALPORT = "/dev/tty.usbmodem1d11" ##def du port série
try:
ser = serial.Serial(SERIALPORT, 9600)
except serial.SerialException:
print "no device connected - exiting"
sys.exit()





class app(App):

def build(self):
self.data = str('0,0,0')
demo = GridLayout(cols = 4, rows = 3)

label1 = Label(
text = "R",
)

label2 = Label(
text = "V",
)

label3 = Label(
text = "B",
)

label7 = Label(
text = "General",
)

slider1 = Slider(
orientation = 'vertical',
pos_hint = {'x':0.5},
min = 0,
max = 255,
value = 0,
step = 1)
slider2 = Slider(
orientation = 'vertical',
pos_hint = {'x':0.5},
min = 0,
max = 255,
value = 0,
step = 1)

slider3 = Slider(
orientation = 'vertical',
pos_hint = {'x':0.5},
min = 0,
max = 255,
value = 0,
step = 1)

slider4 = Slider(
orientation = 'vertical',
pos_hint = {'x':0.5},
min = 0,
max = 100,
value = 100,
step = 1)



label4 = Label(
text = str(int(slider1.value))
)

label5 = Label(
text = str(int(slider2.value))
)

label6 = Label(
text = str(int(slider3.value))
)

label8 = Label(
text = str(int(slider4.value))
)


#Construction de l'interface graphique
demo.add_widget(label1)
demo.add_widget(label2)
demo.add_widget(label3)
demo.add_widget(label7)

demo.add_widget(slider1)
demo.add_widget(slider2)
demo.add_widget(slider3)
demo.add_widget(slider4)

demo.add_widget(label4)
demo.add_widget(label5)
demo.add_widget(label6)
demo.add_widget(label8)


#def des actions
def on_touch_event1(slider1, value):
#print "valR = ", value
label4.text = str(int(value))
update_data()

def on_touch_event2(slider2, value):
#print "valV = ", value
label5.text = str(int(value))
update_data()

def on_touch_event3(slider3, value):
#print "valB = ", value
label6.text = str(int(value))
update_data()

def on_touch_event4(slider4, value):
#slider qui controle l'intensité générale en multipliant les autres par un facteur entre 0 et 1
label8.text = str(int(value))
update_data()


def update_data():

self.data = str(int(slider1.value)*int(slider4.value)/100) + ',' + str(int(slider2.value)*int(slider4.value)/100) + ',' + str(int(slider3.value)*int(slider4.value)/100) + '\n'
ser.write(self.data)


slider1.bind(value = on_touch_event1)
slider2.bind(value = on_touch_event2)
slider3.bind(value = on_touch_event3)
slider4.bind(value = on_touch_event4)

return demo


if __name__ == '__main__':
app().run()



Hésitez pas si vous avez des questions, et encore merci pour votre aide.




Go Up