Python & Arduino. Sederhana, cepat dan cantik

Sangat sering, pemula dan tidak hanya pengembang memiliki pertanyaan. Bagaimana cara mengontrol dengan Arduino dari komputer? Dan jika komputer itu bukan Raspberry Pi, tetapi komputer rumah biasa? Dan jika Anda tidak ingin menderita dengan ESP8266 dan mengelola melalui antarmuka web? Apakah benar-benar perlu untuk membuka IDE Arduino setiap kali dan mengirim perintah melalui Port Monitor ? Saya akan berbicara tentang cara membuat aplikasi GUI saya sendiri untuk mengendalikan Arduino.

Peralatan


Baru-baru ini saya mendapat papan yang sangat menarik: Arduino SS Micro . Papan ini, menyerupai Digispark Attiny 85, tetap merupakan versi Cina dari Arduino Micro dengan output USB.



Saya tidak akan membicarakannya secara rinci, karena pengguna YouTube dengan nama panggilan iomoio telah melakukan ini , dan ulasannya dapat ditemukan di sini .

Tampaknya bagi saya bahwa ini adalah perangkat yang cukup keren dan nyaman untuk proyek rumah kecil, karena kabel memiliki properti super: tersesat pada saat yang paling tidak tepat.

MacBook Pro dengan sistem operasi macOS Mojave digunakan sebagai komputer kontrol, tetapi jangan tutup artikel jika Anda menggunakan Windows atau Linux - semua yang dijelaskan dalam artikel ini akan berfungsi tanpa perubahan pada sistem operasi apa pun.

Sketsa untuk Arduino


Sebagai contoh, sketsa akan digunakan yang menghidupkan dan mematikan LED, pada perintah dari port Serial.

PERINGATAN

LED di Arduino SS Micro hang pada port SS, dan karenanya dimatikan secara otomatis. Meskipun demikian, contoh Blink standar adalah LED yang berkedip.

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

Jika Anda akan menggunakan Arduino lain - jangan lupa untuk mengubah pin LED.

Kode komputer


Salah satu kelebihan Python, selain cross-platform-nya, adalah keberadaan sejumlah besar perpustakaan. Kami akan membutuhkan:

  • PySerial - perpustakaan untuk bekerja dengan port serial
  • PyQT5 - pustaka untuk membuat antarmuka grafis

Instalasi


Untuk menginstal, gunakan manajer paket bawaan - pip.

 pip install pyserial pyqt5 

Untuk kenyamanan membuat GUI, Anda dapat menginstal program QTDesigner.

Antarmuka


Karena program ini dimaksudkan untuk menunjukkan kemampuan, pengguna dapat memilih port dari yang diusulkan, serta kecepatan komunikasi yang akan terjadi.



Kode sumber


Semua pekerjaan dengan perangkat ini berkat pustaka PySerial. Namun ada beberapa nuansa. Misalnya, bagaimana Anda tahu ke port mana perangkat terhubung?

Di seluruh situs stackoverflow terkenal, pengguna dengan nama panggilan Thomas menyarankan solusi yang sudah jadi, yang saya gunakan.

 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 

Selain itu, Anda harus menyimpan daftar kecepatan yang tersedia:

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

Sekarang mari kita kumpulkan desain (dibuat di QtDesigner dan dikonversi menggunakan utilitas pyuic5 ke file .py), fungsi untuk memindai port, dan kode program utama .

Kelas utama berisi semua logika program

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

Variabel self.Port dan self.Speed adalah daftar drop-down yang berisi nilai port dan kecepatan yang tersedia.

Ketika Anda mengklik tombol self.ConnectButton , fungsi connect disebut, di mana upaya dilakukan untuk menghubungkan ke port yang diberikan pada kecepatan yang diberikan. Jika koneksi berhasil, tombol berubah menjadi hijau dan label berubah.



Fungsi kirim mengirimkan string byte ke port kami - memaksa kami untuk mengaktifkan mode berkedip.

Dengan demikian, Anda dapat mengontrol berbagai perangkat yang terhubung ke USB.

Artikel ini adalah pengantar dan ikhtisar, informasi lebih lengkap dapat ditemukan, misalnya di sini:


Kode sumber lengkap untuk sketsa Arduino dan program di-host di GitHub .

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


All Articles