PythonとArduino。 シンプル、高速、美しい

開発者だけでなく初心者もよく質問をします。 コンピューターからArduinoで制御する方法? コンピューターがRaspberry Piではなく、通常のホームコンピューターである場合はどうでしょうか。 また、ESP8266に悩まされ、Webインターフェイスを介して管理したくない場合はどうでしょうか。 Arduino IDEを毎回開き、 ポートモニターを介してコマンドを送信する必要は本当にありますか? Arduinoを制御するための独自のGUIアプリケーションを作成する方法について説明します。



装備品



最近、非常に興味深いボードを手に入れました: Arduino SS Micro 。 それでも、このボードはDigispark Attiny 85に似ていますが、USB出力を備えた中国語版のArduino Microです。







これについては詳しく説明しません。なぜなら、 iomoioというニックネームを持つYouTubeユーザーは既にこれを行っおり、彼のレビューはここにあります



ワイヤーには非常に優れた特性があるため、これは小さな家のプロジェクトには非常にクールで便利なデバイスであるように思えます。



制御コンピューターとして、macOS Mojaveオペレーティングシステムを搭載したMacBook Proを使用しましたが、WindowsまたはLinuxを使用している場合は記事を閉じないでください。



Arduinoのスケッチ



例として、シリアルポートからのコマンドで、LEDをオン/オフするスケッチが使用されます。



警告



Arduino SS MicroのLEDはSSポートでハングするため、自動的にオフになります。 それにもかかわらず、標準の点滅の例はLEDの点滅です。



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); } } }
      
      





別のArduinoを使用する場合は、LEDのピンを変更することを忘れないでください。



コンピューターコード



Pythonの利点の1つは、クロスプラットフォームに加えて、膨大な数のライブラリが存在することです。 必要なもの:





設置



インストールするには、組み込みのパッケージマネージャー-pipを使用します。



 pip install pyserial pyqt5
      
      





GUIを作成するために、QTDesignerプログラムをインストールできます。



インターフェース



このプログラムは機能を示す可能性が高いため、ユーザーは提案されたポートからポートを選択でき、通信速度も選択できます。







ソースコード



デバイスでのすべての作業は、PySerialライブラリのおかげです。 しかし、いくつかのニュアンスがあります。 たとえば、デバイスがどのポートに接続されているかをどのように確認しますか?



よく知られているstackoverflowサイト全体で、 Thomasというニックネームを持つユーザーが既成のソリューションを提案し、それを使用しました。



 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
      
      





さらに、使用可能な速度のリストを保持する必要があります。



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





次に、 設計 (QtDesignerで作成され、pyuic5ユーティリティを使用して.pyファイルに変換される)、 ポートをスキャンする機能、およびメインプログラムコードをまとめましょう。



すべてのプログラムロジックを含むメインクラス



 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')
      
      





変数self.Portおよびself.Speedは、使用可能なポートと速度の値を含むドロップダウンリストです。



self.ConnectButtonボタンをクリックすると、 connect関数が呼び出され、指定された速度で指定されたポートへの接続が試行されます。 接続が成功すると、ボタンが緑色に変わり、ラベルが変わります。







send関数は、バイト文字列をポートに送信します-点滅モードを強制的にオンにします。



このようにして、USBに接続されたさまざまなデバイスを制御できます。



この記事は入門と概要であり、より完全な情報は、例えばここにあります:





Arduinoのスケッチとプログラムの両方の完全なソースコードは、 GitHubでホストされています



All Articles