Python et Arduino. Simple, rapide et beau

Très souvent, les débutants et non seulement les développeurs ont des questions. Comment contrôler avec Arduino depuis un ordinateur? Et si l'ordinateur n'est pas un Raspberry Pi, mais un ordinateur domestique ordinaire? Et si vous ne voulez pas souffrir avec ESP8266 et gérer via l'interface web? Est-il vraiment nécessaire d'ouvrir l'IDE Arduino à chaque fois et d'envoyer des commandes via le moniteur de port ? Je vais vous expliquer comment créer ma propre application graphique pour contrôler Arduino.

Équipement


J'ai récemment obtenu une carte très intéressante: Arduino SS Micro . Cette carte, ressemblant au Digispark Attiny 85, est néanmoins une version chinoise de l'Arduino Micro, avec une sortie USB.



Je ne vais pas en parler en détail, car un utilisateur YouTube avec le surnom iomoio l' a déjà fait, et sa critique se trouve ici .

Il me semble que c'est un appareil assez cool et pratique pour les petits projets domestiques, car les fils ont une super propriété: se perdre au moment le plus inopportun.

Un MacBook Pro avec le système d'exploitation macOS Mojave a été utilisé comme ordinateur de contrôle, mais ne fermez pas l'article si vous utilisez Windows ou Linux - tout ce qui est décrit dans l'article fonctionnera sans modification sur aucun système d'exploitation.

Croquis pour Arduino


Par exemple, une esquisse sera utilisée pour allumer et éteindre la LED, sur commande du port série.

AVERTISSEMENT

La LED de l'Arduino SS Micro se bloque sur le port SS et, par conséquent, elle s'éteint automatiquement. Malgré cela, l'exemple standard de clignotement est une LED clignotante.

char inChar; #define LED_PIN SS void setup() { pinMode(LED_PIN, OUTPUT); //   Serial.begin(115200); //  Serial -  } void loop() { if (Serial.available() > 0) { inChar = Serial.read(); if (inChar=='e') // e - Enable -  { digitalWrite(LED_PIN,HIGH); } } else if (inChar=='d') // d - Disable -  { digitalWrite(LED_PIN,LOW); } else if (inChar=='b') // b - Blink -    { while (true){ digitalWrite(LED_PIN,HIGH); delay(1000); digitalWrite(LED_PIN,LOW); delay(1000); } } } 

Si vous allez utiliser un autre Arduino - n'oubliez pas de changer la broche de la LED.

Code informatique


Un des avantages de Python, en plus de sa multiplateforme, est la présence d'un grand nombre de bibliothèques. Nous aurons besoin de:

  • PySerial - bibliothèque pour travailler avec le port série
  • PyQT5 - bibliothèque pour créer une interface graphique

L'installation


Pour installer, utilisez le gestionnaire de packages intégré - pip.

 pip install pyserial pyqt5 

Pour faciliter la création d'une interface graphique, vous pouvez installer le programme QTDesigner.

Interface


Étant donné que ce programme est destiné à démontrer les capacités, l'utilisateur peut sélectionner le port parmi ceux proposés, ainsi que la vitesse à laquelle la communication se produira.



Code source


Tout le travail avec l'appareil est grâce à la bibliothèque PySerial. Mais il y a quelques nuances. Par exemple, comment savez-vous à quel port l'appareil est connecté?

Sur l'ensemble du site de stackoverflow bien connu, un utilisateur avec le surnom Thomas a suggéré une solution prête à l'emploi, que j'ai utilisée.

 def serial_ports(): """ Lists serial port names :raises EnvironmentError: On unsupported or unknown platforms :returns: A list of the serial ports available on the system """ if sys.platform.startswith('win'): ports = ['COM%s' % (i + 1) for i in range(256)] elif sys.platform.startswith('linux') or sys.platform.startswith('cygwin'): # this excludes your current terminal "/dev/tty" ports = glob.glob('/dev/tty[A-Za-z]*') elif sys.platform.startswith('darwin'): ports = glob.glob('/dev/tty.*') else: raise EnvironmentError('Unsupported platform') result = [] for port in ports: try: s = serial.Serial(port) s.close() result.append(port) except (OSError, serial.SerialException): pass return result 

De plus, vous devez conserver une liste des vitesses disponibles:

 speeds = ['1200','2400', '4800', '9600', '19200', '38400', '57600', '115200'] 

Maintenant, rassemblons la conception (créée dans QtDesigner et convertie à l'aide de l'utilitaire pyuic5 en un fichier .py), les fonctions de numérisation des ports et le code du programme principal .

La classe principale contenant toute la logique du programme

 class LedApp(QtWidgets.QMainWindow, design.Ui_Form): def __init__(self): super().__init__() self.setupUi(self) self.Port.addItems(serial_ports()) self.Speed.addItems(speeds) self.realport = None self.ConnectButton.clicked.connect(self.connect) self.EnableBtn.clicked.connect(self.send) def connect(self): try: self.realport = serial.Serial(self.Port.currentText(),int(self.Speed.currentText())) self.ConnectButton.setStyleSheet("background-color: green") self.ConnectButton.setText('') except Exception as e: print(e) def send(self): if self.realport: self.realport.write(b'b') 

Les variables self.Port et self.Speed sont des listes déroulantes contenant les valeurs des ports et vitesses disponibles.

Lorsque vous cliquez sur le bouton self.ConnectButton , la fonction de connexion est appelée, dans laquelle une tentative est effectuée pour se connecter à un port donné à une vitesse donnée. Si la connexion réussit, le bouton devient vert et l'étiquette change.



La fonction d' envoi envoie une chaîne d'octets à notre port - nous forçant à activer le mode clignotant.

Ainsi, vous pouvez contrôler divers appareils connectés à USB.

Cet article est une introduction et une vue d'ensemble, des informations plus complètes peuvent être trouvées, par exemple ici:


Le code source complet pour l'esquisse pour Arduino et le programme est hébergé sur GitHub .

Source: https://habr.com/ru/post/fr443326/


All Articles