Bonjour à tous.
J'ai un arduino qui compte des tours toutes les secondes, et je voudrais pouvoir changer la vitesse.
D'abord je demarre le compteur en envoyant le code A et un nombres de tours 100 soit dans IDE arduino (A100), ou en Python3 dans IDE arduino (b'A100')
et pour la vitesse dans IDE arduino (B5) ou en python3 dans IDE arduino (b'B5').
Tout se passe bien le temps de la communication et correcte.
Je lance le progamme Python et là pour les mêmes valeurs la liaison et très longue environ 1 seconde et le comptage s'arrête pendant ce temps.
Je ne comprends pas mon erreur.
L'un d'entre vous aurait-il une idées.
Cordialement.
Marc.
#***************** coding: UTF-8 ******************#
#**********environnement PYTHON IDE 3.7.4**********#
#*****************ARDUINO 1.8.5********************#
#******************Arduino nano********************#
#****************Tk version 8.6.9******************#
from serial import Serial
import serial.tools.list_ports
from tkinter import *
import tkinter.ttk as ttk
serial_port = None
# Liste des Ports
liste_ports = []
ports = serial.tools.list_ports.comports(include_links=False)
for port in ports:
liste_ports.append(port.device)
# Selection du Port serie
def Selection_port(event):# sur evenement
global serial_port
port = combo.get()
baudrate = '9600'
try:
serial_port = serial.Serial(port, baudrate, timeout=0.1) # initialise port serie forme réduite
print ("Ouverture du port série : "+port+", vitesse : "+baudrate+" réussie")
except:
#print ("Echec ouverture du port série "+port)
tkinter.messagebox.showwarning("ERREUR communication","Echec ouverture du port série "+port)
def Valider():
global nombre
nombre = TextEntree_Nb_tour.get()
nombre = "A" + nombre # code commande A
nombre = nombre.encode()
print ("Envoi Nb tours Arduino")
print (nombre)
serial_port.write(nombre)# Envoi port série
Recu_Arduino()
def Recu_Arduino():
id = Fenetre_Principale.after(100, Recu_Arduino)# Appel de la fonction tous les xxxms
nombre_lu_Arduino = serial_port.readline().rstrip()# Lecture ports série
nombre_lu_Arduino = str(nombre_lu_Arduino)# transforme en string
if('C' in nombre_lu_Arduino):
print ("Retour Arduino")
print (nombre_lu_Arduino)# b'Cnombre'
Decode_nombre_lu_Arduino = nombre_lu_Arduino[3:]# Lecture à partir du 3ème caractère
Decode_nombre_lu_Arduino = Decode_nombre_lu_Arduino[0:-1]# Efface dernier caractère
Decode_nombre_lu_Arduino = int(Decode_nombre_lu_Arduino)# transforme en nombre entier
print ("nombre_lu_Arduino")
print (Decode_nombre_lu_Arduino)
Retour_Arduino.config(text = Decode_nombre_lu_Arduino)
def Valeur_Tours(nouvelleValeur):## nouvelle valeur 'curseur Nb Tour/sec'
global nombre
nombre = nouvelleValeur
nombre = "B" + nombre # code commande B
nombre = nombre.encode('ascii')
print ("Envoi vitesse Arduino")
print (nombre)
serial_port.write(nombre)# Envoi port série
# Création Fenetre_Principale
Fenetre_Principale = Tk()
Fenetre_Principale.resizable(width=False, height=False) # pas de redimensionnement
Fenetre_Principale.geometry("600x150") # Taille Fenetre_Principale
Fenetre_Principale.title("Compteur Tour") # titre fenetre
# Création d'un widget combobox 'choix USB'
combo = ttk.Combobox(values=liste_ports, width = 6)
combo.bind('<<ComboboxSelected>>', Selection_port)# Fonction séléction du port
combo.place(x = 10, y = 5)
# création de widgets 'Label'
Affichage_Nb_tour = Label(Fenetre_Principale, text ='Nb Tours', width = 12, fg = 'RED', borderwidth=2, background='bisque', relief='sunken')
Affichage_Nb_tour.place(x = 205, y = 5)
# création de widgets 'Entry' Entrée nombre
TextEntree_Nb_tour = StringVar()
Entree_Nb_tour = Entry(Fenetre_Principale, textvariable = TextEntree_Nb_tour, border=3, width = 8)
Entree_Nb_tour.place(x = 320, y = 5)
# création de widgets 'Label'Affichage Arduino
Affichage_Arduino_Tour = Label(Fenetre_Principale, text ='Retour Arduino', width = 12, fg = 'RED', borderwidth=2, background='bisque', relief='sunken')
Affichage_Arduino_Tour.place(x = 400, y = 5)
# création de widgets 'Label'Retour Arduino
Retour_Arduino = Label(Fenetre_Principale, text = "", width = 5, borderwidth=2, background='white', relief='sunken', justify = LEFT)
Retour_Arduino.place(x = 515, y = 5)
# Création d'un widget Button 'Valider'
Bouton = Button(Fenetre_Principale, text ='Valider', command = Valider)
Bouton.place(x = 320, y = 40)
# Création d'un widget Scale 'curseur Nb Tour/sec'
Valeur_Nb_tour = StringVar()
Valeur_Nb_tour.set(1)# position départ du curseur Scale
Vitesse_Nb_tour = Scale(Fenetre_Principale,from_=1,to=10, orient=HORIZONTAL, length=180,width=12,label="Vitesse Tour/sec",\
tickinterval=1, variable=Valeur_Nb_tour, command = Valeur_Tours)
Vitesse_Nb_tour.place(x = 20, y = 30)
# démarrage :
Fenetre_Principale.mainloop()
'''
PROGRAMME ARDUINO
//***ARDUINO 1.8.5***//
//***Arduino nano Atmege 328P old Bootloader***//
//***Python IDLE version 3.6.3
//*** Tk version 8.6.6
#define BUF_LEN 128
char buffer[BUF_LEN];
char chaine_Python;
const int Led = 13;
unsigned long previousMillis = 0;
unsigned long prevuMillis = 0;
int Reste_chaine_Python_int = 0;
int Nb_tours = 0;
int compte_Nb_tours = 0;
int Etat = 0;
int Vitesse_T_sec = 1;
//*************************************************************
void setup()
{
Serial.begin(9600);
pinMode(Led, OUTPUT);
}
//*************************************************************
void loop()
{
if (Serial.available() > 0)// Reçu de Python
{
Serial.print("Serial.available() : ");
Serial.println(Serial.available());
char chaine_Python = (Serial.read()); // Lit le premier octet reçu et le met dans la variable
Serial.print("chaine_Python : ");
Serial.println(chaine_Python);
switch (chaine_Python) //si le premier octet correspond au code
{
case 65://65=A
lecture_nombre_int();
Nb_tours = Reste_chaine_Python_int;
Serial.print("Nb_tours :");
Serial.println(Nb_tours);
Etat = 1;
break;
case 66://66=B
lecture_nombre_int();
Vitesse_T_sec = Reste_chaine_Python_int;
Serial.print("Vitesse_T_sec :");
Serial.println(Vitesse_T_sec);// Envoi vers Python
break;
}
}
if (Etat == 1)
{
Tour();
}
}
//*************************************************************
void lecture_nombre_int()
{
digitalWrite(Led, HIGH);
Reste_chaine_Python_int = Serial.parseInt(); // lit le reste des octets
digitalWrite(Led, LOW);
}
//************************************************************************
void Tour()
{
unsigned long courentMillis = millis(); // Enregistrement du temps
if (courentMillis - prevuMillis >= 1000 / Vitesse_T_sec)
{
prevuMillis = courentMillis;
compte_Nb_tours++;
if (compte_Nb_tours <= Nb_tours)
{
digitalWrite(Led, HIGH);
//Serial.print("compte_Nb_tours : ");
//Serial.println(compte_Nb_tours);
snprintf(buffer, sizeof(buffer), "C%d\n\r", compte_Nb_tours);
Serial.println(buffer);
digitalWrite(Led, LOW);
}
}
}
'''