FLProg - Integrasi independen ke dalam program pengontrol khusus


Untuk waktu yang lama proyek FLProg belum tercakup di Habré. Ini karena kurangnya waktu untuk menulis artikel, dan bahkan masalah pribadi saya sendiri. Tetapi proyek ini tidak mati, ia hidup dan berkembang. Rata-rata sebulan sekali, versi program berikutnya dirilis. Sejak publikasi terakhir , rendering skema telah sepenuhnya diulang (berkat ini, jalur dihapuskan selama rendering), sistem Referensi Silang untuk proyek, dan sistem analisis proyek untuk kesalahan diperkenalkan. Kode program itu sendiri dipindahkan ke versi bahasa pemrograman yang lebih baru. Karena ini, di sisi positif (dari sudut pandang saya, tentu saja, baik, pengguna mendukung saya), antarmuka program telah berubah. Banyak blok menarik telah ditambahkan. Skema skema yang diterapkan dan memblokir pencarian.

Tapi tetap saja, masalah utama dari proyek ini tetap bahwa pengembang program adalah satu orang (ini saya), dan jumlah papan pengontrol, sensor, sensor, kartu ekspansi yang berbeda yang diproduksi oleh orang Cina dan baru-baru ini oleh pabrikan kami terus bertambah. Dan pengguna ingin mencobanya, atau menggunakannya dalam proyek mereka. Untuk perangkat periferal, pada satu waktu, masalah ini kurang lebih diselesaikan oleh saya dengan bantuan membuat editor blok khusus. Langkah ini, seperti yang mereka katakan, "tembak", dan sekarang, hampir di sebagian besar papan periferal yang ada, di Internet, atau di forum program , Anda dapat menemukan blok pengguna yang sesuai. Ya, atau di forum yang sama (atau dalam kelompok di Vkontakte ) minta guru setempat untuk menulis satu. Biasanya Anda bisa setuju.

Sekarang saatnya untuk menyelesaikan masalah kedua - ini adalah papan pengontrol.

Baru-baru ini, versi beta dari program dengan angka 6.0 dirilis. Dalam versi ini, editor untuk deskripsi pengguna dari pengendali diimplementasikan. Seperti blok khusus, deskripsi dapat dikelompokkan ke dalam perpustakaan, disimpan sebagai deskripsi terpisah serta seluruh perpustakaan sebagai file, dan dibagikan.

Dengan posting ini, saya memulai serangkaian setidaknya dua posting di mana kami akan mempertimbangkan bagaimana menggunakan editor ini. Pada artikel pertama, dengan izin shiotiny, saya akan mencoba menggambarkan papan ShIoTiny-nya. Pada artikel kedua, kita akan mencoba untuk membuat analog dari pengontrol industri nyata, dan menggambarkannya.

Jadi mari kita mulai.

Buka program FLProg. Di menu "Tools", pilih "Controller Custom Descriptions Editor".



Jendela editor deskripsi terbuka.

Deskripsi khusus dapat dikombinasikan di perpustakaan dengan kedalaman bersarang. Karena itu, pertama-tama kita membuat pustaka deskripsi.



Tetapkan nama perpustakaan.



Setelah itu kita akan membuat deskripsi controller di library.



Dan beri dia nama:



Saat membuat deskripsi pengontrol, kami segera membuka cabang parameter umum.



Di sini kita dapat mengubah nama, mengatur jenis CPU, mengatur ukuran EEPROM, mengubah nomor versi deskripsi.

Karena papan ShloTiny didasarkan pada pengontrol ESP8266, kami memilihnya. Saat memilih pengontrol, volume EEPROM yang sesuai secara otomatis ditempelkan. Jika perlu, nilai ini dapat diubah. Nomor versi default untuk deskripsi baru diatur ke 1.

Di masa mendatang, saat mengubah deskripsi yang ada, disarankan untuk mengubahnya ke atas. Saat menggunakan deskripsi ini dalam proyek, program akan membandingkan versi deskripsi di proyek dan di perpustakaan. Jika nomor versi deskripsi di pustaka lebih besar daripada di proyek, item untuk memperbarui deskripsi di program muncul di menu "Proyek" program. Jika sebaliknya, maka suatu item akan muncul untuk memperbarui deskripsi di perpustakaan. Nah, jika deskripsi pengontrol yang digunakan dalam proyek tidak ditemukan di perpustakaan sama sekali, item untuk memasukkan deskripsi dari proyek ke perpustakaan akan muncul di menu yang sama.

Juga di utas ini, Anda dapat menulis deskripsi teks dari pengontrol yang membantu pemilihannya.

Untuk menerapkan perubahan yang dibuat sebelum mengubah ke cabang lain dari parameter pengontrol, klik tombol "Terapkan". Jika ini tidak dilakukan, perubahan tidak akan disimpan.

Sekarang perhatikan diagram sirkuit papan ShloTiny.



Papan memiliki tiga input digital, tiga output digital, input analog, dan input untuk sensor. Sebanyak delapan kesimpulan dewan.

Di editor, buka cabang "Pengendali kesimpulan" dan atur jumlah kesimpulan, jangan lupa klik tombol "Terapkan" setelah itu.



Program ini akan menghasilkan jumlah kesimpulan yang diperlukan. Kami lolos ke yang pertama dari mereka.



Di cabang ini, Anda dapat menentukan nama output alternatif, yang akan ditampilkan dalam program. Jika tidak ada, program akan menampilkan PinN di mana N adalah nomor pin dalam daftar pin. Saya sarankan Anda menulis prasasti di papan tulis di bidang nama alternatif. Ini akan membuatnya lebih mudah untuk memahami kesimpulan apa yang sedang ditarik. Untuk papan yang dijelaskan, kita akan meletakkan nilai Input1 sesuai dengan diagram sirkuit. Jadi di utas ini, Anda dapat menulis deskripsi satu per satu dari keluaran, misalnya, untuk menunjukkan fitur penerapannya. Jika perlu, Anda juga dapat menentukan alias untuk output, yang akan ditampilkan dalam program dalam tanda kurung setelah nama output.

Setelah melakukan perubahan, jangan lupa klik tombol "Terapkan". Dengan prinsip yang sama, mari kita sebut kesimpulan yang tersisa.



Di cabang yang sama dari parameter output utama, fungsi yang dilakukannya ditambahkan ke dalamnya.



Fungsi-fungsi berikut dapat ditetapkan untuk setiap pin.



  • I2C adalah fungsi dari salah satu pin bus I2C (SDA atau SCL).
  • SPI adalah fungsi dari salah satu pin bus SPI (MISO, MOSI, SCK, SS).
  • UART adalah fungsi dari salah satu pin antarmuka UART (RX atau TX).
  • Fungsi input analog
  • Fungsi output analog (belum digunakan dalam FLProg, backlog untuk masa depan).
  • Fungsi input / output digital.

Tetapkan pin 1 fungsi input / output digital. Saat menetapkan fungsi baru (belum dikonfigurasi) ke output, cabang "Kesalahan" akan muncul di pohon pengontrol dan seluruh jalur ke cabang fungsi yang salah akan berubah merah. Pada cabang "Kesalahan", Anda dapat melihat daftar kesalahan yang ditemukan dalam deskripsi pengontrol.



Dalam hal ini, input 1 dalam fungsi "Input / output digital" tidak menentukan jumlah input ini sebagai digital. Kami beralih ke cabang fungsi ini (di masa depan saya berencana untuk melakukan transisi langsung ke cabang yang diinginkan ketika saya mengklik kesalahan).



Menurut diagram sirkuit papan, output "Input1" terhubung ke pin GPIO2 controller. Kami memasukkan nilai ini di bidang "Nomor input digital". Saat menyusun proyek, nilai ini akan dimasukkan ke dalam kode. Karena penggunaan input ini sebagai output tidak disediakan, kami menghapus kotak centang "Dapat digunakan sebagai output". Seperti biasa, klik tombol "Terapkan". Dengan cara yang sama, konfigurasikan dua input digital lainnya. Lalu pergi ke output dari input analog "ADC1" dan tambahkan fungsi "Input Analog" untuk itu.



Dalam pengaturan fungsi ini, Anda harus menentukan jumlah output ini sebagai input analog. Menurut skema, ini adalah 0 (dalam ESP8266 itu adalah satu).



Lalu pergi ke pengaturan output "1WIRE". Di sini kami menambahkan fungsi input / output digital, tetapi kami melarang penggunaan input dan output. Akibatnya, itu akan tersedia untuk pemilihan hanya di blok sensor, dan tidak tersedia saat membuat input dan output.



Pengaturan output "K1" - "K3" mirip dengan pengaturan input "Input1" - "Input3" hanya dalam hal output kami melarang mereka untuk digunakan sebagai input.





Buka cabang "Gambar". Di dalamnya, kita dapat menambahkan gambar yang dimuat ke dalam deskripsi controller, misalnya, dengan tampilan controller, pinout, dll.

Harap dicatat bahwa gambar dimuat langsung ke deskripsi controller, dan disimpan dalam proyek yang dibuat menggunakannya. Karena itu, jangan unggah gambar besar. Ini akan memerlukan peningkatan ukuran proyek, dan akan mempengaruhi kecepatan pembukaannya.

Gambar ditambahkan menggunakan tombol "Tambah Gambar".



Setelah memilih dan memuat gambar (hanya format PNG yang didukung), cabang terpisah dibuat untuk setiap gambar di pohon. Di cabang ini, Anda dapat menentukan nama untuk gambar yang diunduh, yang akan ditampilkan dalam informasi pengontrol.



Jika perlu, Anda dapat mengunggah beberapa gambar dan mengaturnya dalam urutan yang diinginkan.





Kami lolos ke cabang "Blok standar".



Cabang ini menunjukkan blok yang dapat diwakili di perpustakaan blok standar program sesuai dengan pengaturan program saat ini. Apa artinya itu? Beberapa blok bangunan program hanya ditujukan untuk jenis CPU tertentu. Dan ketersediaannya tergantung pada prosesor yang dipilih. Juga, blok yang dirancang untuk bekerja dengan SPI, I2C, UART akan muncul dalam daftar ini hanya jika fungsi yang sesuai ditambahkan ke pin pengontrol. Blok yang dirancang untuk bekerja dengan EEPROM akan muncul hanya jika ukuran EEPROM yang ditentukan pada cabang parameter pengontrol umum lebih besar dari nol, atau fungsi I2C ditambahkan ke pin pengontrol. Secara default, semua blok di perpustakaan dilarang untuk digunakan (ditandai dengan oranye). Anda dapat mengizinkan untuk menggunakan blok terpisah atau seluruh folder blok dengan menyorot cabang yang diperlukan dan mengklik tombol "Izinkan", atau dari menu konteks.



Ketika Anda membiarkan blok atau folder blok ditampilkan di program, mereka dicat hitam.

Pemblokiran blok atau folder terpisah dilarang dengan cara yang sama.



Dalam folder di mana tidak semua blok diizinkan untuk ditampilkan, mereka ditandai dengan tiga tanda bintang sebelum dan sesudah nama.

Kami melarang penggunaan motor, jam waktu nyata, display, unit kontrol IR, sensor (kecuali untuk sensor DS18B20 dan DHT22 - karena pengembang sejauh ini hanya mengumumkan dukungan mereka), chip ekspansi dan speaker piezo.



Kami akan melakukan hal yang sama untuk bahasa LAD



Jangan lupa untuk menerapkannya setelah melakukan perubahan.

Cabang-cabang yang tersisa dari deskripsi pengontrol akan dibahas di posting berikutnya, sementara pengaturan saat ini cukup untuk menggunakan papan khusus ini dalam program FLProg.

Untuk saat ini, saya hanya akan mengatakan secara singkat bahwa cabang "Blok Khusus" digunakan untuk memuat blok khusus ke dalam deskripsi, yang akan ditampilkan di perpustakaan blok standar dalam program saat menggunakan pengontrol ini. Cabang "Kode khusus" digunakan untuk merekam kode yang akan selalu dimasukkan ke dalam kode yang dikompilasi, dan cabang "Perpustakaan khusus" digunakan untuk memuat pustaka ke dalam deskripsi controller, yang akan diunggah ke folder \ libraries ArduinoIDE tempat program ini bekerja.

Setelah semua perubahan, simpan perpustakaan deskripsi pengontrol.



Sekarang mari kita coba gunakan deskripsi controller yang kita buat.
Dalam program FLProg, kami membuat proyek baru untuk controller.



Buka jendela pemilihan pengontrol.



Dan pilih deskripsi yang kami buat.



Saat memilih pengontrol, Anda dapat melihat gambarnya dan, jika perlu, menyimpan yang diperlukan ke file.





Anda juga dapat melihat parameter lainnya



Setelah memilih controller, konfirmasikan pilihannya:



Akibatnya, jendela kerja proyek utama terbuka, dikonfigurasi sesuai dengan pengontrol yang dipilih.



Tujuan dari posting ini tidak termasuk tugas pelatihan untuk bekerja dengan program FLProg. Ini dijelaskan dengan cukup baik di posting saya sebelumnya , di situs web proyek , dan di forum proyek . Selain itu, sudah ada cukup banyak saluran di YouTube di mana tutorial video tentang bekerja dengan program tersebut diposting. Misalnya, saluran yang sangat bagus "Kunci Arduino" , baru saja melakukan serangkaian pelajaran, dengan presentasi materi yang sangat bagus.

Karena itu, misalnya, kami cukup membuat proyek sederhana dan mencoba mengompilasinya.
Pertama, tambahkan input controller.



Hanya kesimpulan bahwa kami diizinkan bekerja dalam kapasitas yang tersedia untuk dipilih sebagai input.



Kemudian buat output digital. Hanya kesimpulan yang diizinkan juga tersedia di sini.



Kami merakit sirkuit sehingga ketika tombol pada Input1 (Input 1) ditekan, relai K1 (Relay1) menyala.
Kami juga mengeluarkan unit untuk membaca informasi dari sensor DS18B20 ke papan sirkuit di papan terpisah.



Buka pengaturan blokir. Saat membuat bus OneWire baru, kami melihat bahwa semua input / output digital tersedia untuk dipilih. Ini adalah cacat dalam versi 6.0. Tapi karena versi ini masih berstatus beta, itu bisa dimaafkan. Dalam versi 6.1, akan dimungkinkan untuk melarang penggunaan pin sebagai sensor, sensor, atau untuk chip ekspansi. Selain itu, pada posting selanjutnya saya akan memberi tahu Anda cara lain untuk menyelesaikan masalah ini. Untuk saat ini, pilih pin 1WIRE.



Kami mengkonfigurasi sensor untuk mengatur alamat melalui array.



Kami menyisipkan papan baru di depan yang pertama dan mengeluarkan blok "OneWire Bus Scan" di atasnya.



Kami mengkonfigurasinya pada bus OneWire yang sama, dan pada larik yang sama, di mana unit pembacaan dari sensor DS18B20 dikonfigurasi.



Kami menyusun skema untuk memulai tunggal pemindaian bus saat pengontrol dimulai, menggunakan blok R pemicu (pemilihan tepi depan).



Di papan dengan unit pembacaan data dari sensor DS18B20, kami merakit relai on / off dengan hysteresis. Untuk ini, kami menggunakan dua pembanding, dan pemicu SR. Berkat skema ini, relai 2 akan menyala ketika suhu turun di bawah 10 derajat, dan mati ketika suhu naik di atas 20 derajat.



Kami memulai skema kompilasi.



Akibatnya, kode yang dihasilkan akan terbuka di Arduino IDE. Sebagai papan, kami memilih NodeMCU, di mana chip yang sama dipasang seperti pada ShloTiny. Memeriksa kode menunjukkan bahwa itu benar dan dapat diunduh.



Kode yang dikompilasi
#include <OneWire.h> extern "C" { #include "user_interface.h"; } OneWire _ow13(13); byte _FLPArray133289689[9]; unsigned long _d18x2x1Tti = 0UL; float _d18x2x1O = 0.00; bool _trgr1 = 0; bool _bounseInputD2S = 0; bool _bounseInputD2O = 0; unsigned long _bounseInputD2P = 0UL; bool _trgrt1 = 0; bool _trgrt1I = 0; bool _sowb1_needScan = 0; bool _sowb1_ost = 0; bool _sowb1_Out_1 = 0; void setup() { pinMode(2, INPUT); pinMode(12, OUTPUT); pinMode(14, OUTPUT); _bounseInputD2O = digitalRead(2); } void loop() { bool _bounceInputTmpD2 = (digitalRead (2)); if (_bounseInputD2S) { if (millis() >= (_bounseInputD2P + 40)) { _bounseInputD2O = _bounceInputTmpD2; _bounseInputD2S = 0; } } else { if (_bounceInputTmpD2 != _bounseInputD2O ) { _bounseInputD2S = 1; _bounseInputD2P = millis(); } } //:1 if (1) { if (_trgrt1I) { _trgrt1 = 0; } else { _trgrt1 = 1; _trgrt1I = 1; } } else { _trgrt1 = 0; _trgrt1I = 0; }; if (_sowb1_needScan) { if ( _oneWireSeach (_FLPArray133289689, _ow13)) { _sowb1_Out_1 = 1; } _ow13.reset_search(); _sowb1_needScan = 0; } if (_trgrt1) { if (! _sowb1_ost) { _sowb1_ost = 1; _sowb1_needScan = 1; _sowb1_Out_1 = 0; } } else { _sowb1_ost = 0; } //:2 digitalWrite(12, !(_bounseInputD2O)); //:3 if (_isTimer(_d18x2x1Tti, 1000)) { _d18x2x1Tti = millis(); _d18x2x1O = _readDS18_ow13(_FLPArray133289689, _FLPArray133289689[8]); } if (((_d18x2x1O)) > (20)) _trgr1 = 0; if (((_d18x2x1O)) < (10)) _trgr1 = 1; digitalWrite(14, _trgr1); } bool _isTimer(unsigned long startTime, unsigned long period ) { unsigned long currentTime; currentTime = millis(); if (currentTime >= startTime) { return (currentTime >= (startTime + period)); } else { return (currentTime >= (4294967295 - startTime + period)); } } float _convertDS18x2xData(byte type_s, byte data[12]) { int16_t raw = (data[1] << 8) | data[0]; if (type_s) { raw = raw << 3; if (data[7] == 0x10) { raw = (raw & 0xFFF0) + 12 - data[6]; } } else { byte cfg = (data[4] & 0x60); if (cfg == 0x00) raw = raw & ~7; else if (cfg == 0x20) raw = raw & ~3; else if (cfg == 0x40) raw = raw & ~1; } return (float)raw / 16.0; } float _readDS18_ow13(byte addr[8], byte type_s) { byte data[12]; byte i; _ow13.reset(); _ow13.select(addr); _ow13.write(0xBE); for ( i = 0; i < 9; i++) { data[i] = _ow13.read(); } _ow13.reset(); _ow13.select(addr); _ow13.write(0x44, 1); return _convertDS18x2xData(type_s, data); } bool _oneWireSeach (byte array[], OneWire ow ) { byte temp[8]; byte i; if ( !ow.search(temp)) { return false; } if (OneWire::crc8(temp, 7) != temp[7]) { return false; } switch (temp[0]) { case 0x10: array[8] = 1; break; case 0x28: array[8] = 0; break; case 0x22: array[8] = 0; break; default: return false; } for ( i = 0; i < 8; i++) { array[i] = temp[i]; } return true; } 


Deskripsi pengontrol ShloTiny untuk program FLProg

Kami akan menyelesaikan pelajaran ini, di pos berikutnya kami akan mencoba menggambarkan sesuatu yang lebih serius dan lebih dekat dengan pengontrol industri "nyata".

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


All Articles