Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

XMOS startKIT:Membangun XMOS dan Robot Raspberry Pi XMP-1

Pengantar

StartKIT XMOS dari Farnell (atau Newark) adalah platform prosesor berbiaya sangat rendah (£12 termasuk PPN) yang bekerja dengan baik dengan Raspberry Pi. Bersama-sama dimungkinkan untuk membuat aplikasi robotika tanpa perlu menyolder.

StartKIT XMOS adalah papan berukuran hampir kartu kredit dengan chip XMOS di dalamnya dengan beberapa 'inti XMOS' yang dapat diprogram dalam C. Teknologi XMOS memungkinkan segala sesuatunya berjalan secara paralel dengan kecepatan tinggi dengan jitter rendah. Inilah karakteristik yang ideal untuk aplikasi robotika.

Bersama dengan beberapa kode untuk dijalankan pada papan startKIT XMOS dan pada Raspberry Pi (RPI), papan tersebut digunakan untuk membangun platform seluler ringkas yang sederhana (saya akan menyebutnya XMP, Platform Seluler XMOS, bukan robot mulai sekarang dalam semangat XMOS untuk mendahului segalanya dengan 'X').

Meskipun XMP-1 bukanlah robot sampai memiliki beberapa sensor dan lebih banyak program, itu bisa diperpanjang di masa depan untuk eksperimen robotika. XMP-1 menggunakan perangkat keras standar murah dan tidak ada alat eksotik selain obeng, pemotong kawat, dan tang.

Postingan ini mencakup komunikasi antara RPI dan papan XMOS menggunakan antarmuka serial periferal (SPI) dan cara membuat XMP-1 dan mengontrolnya dari browser web.

Video di sini menunjukkan XMP-1 sedang diajarkan rute; percobaan pertama menggunakannya! Ini akan mendapat manfaat dari antarmuka pengguna yang lebih baik. XMP-1 bisa bergerak cukup cepat, tapi saya santai saja di sini dengan kecepatan rendah. Di sebelah kanan adalah kontrol browser, dan di bawah adalah output konsol, hanya membuat beberapa pesan keep-alive dan status untuk melihat apa yang terjadi.

Video berikutnya di bawah ini menunjukkan XMP-1 mencoba memutar ulang rute dan menyebabkan penderitaan dan rasa sakit di sepanjang jalan. Servo rotasi kontinu saya yang murah (yang digunakan untuk menggerakkan roda) tidak terlalu bagus, dan XMP-1 belum memiliki sensor.

Sedikit lebih detail

Posting ini sebenarnya adalah bagian 2 dari beberapa eksperimen startKIT XMOS. Bagian 1 berisi pengenalan XMOS, terminologi, arsitektur dan panduan memulai cepat dengan contoh program. Jika Anda tertarik dengan teknologinya maka mungkin membantu untuk mengikuti bagian 1 terlebih dahulu, sehingga bagian 2 ini lebih masuk akal. Bagian 2 ini dimaksudkan untuk membangun kerangka kerja sederhana untuk komunikasi berkecepatan tinggi antara Raspberry Pi dan papan startKIT XMOS. Kerangka kerja harus memiliki tujuan umum yang cukup untuk dapat digunakan untuk banyak proyek (robotik bukanlah tujuan saya). XMP-1 benar-benar hanya produk sampingan, dalam keinginan untuk menguji komunikasi papan Raspberry Pi ke XMOS. Itu dicatat di sini jika itu berguna. (Catatan, ada juga bagian 3 yang berjudul XMOS startKIT:XMOS dan Raspberry Pi Oscilloscope XAE 1000 yang menggunakan kembali kemampuan SPI yang dibahas adalah posting ini, dan memperkenalkan cara menggunakan konverter analog ke digital (ADC) yang ada di chip XMOS , dan cara menampilkan grafik waktu nyata di browser web).

Jika Anda hanya tertarik untuk membuat dan menggunakan XMP-1 maka Anda cukup mengambil kode di bagian bawah posting, kompilasi dan simpan ke Flash (seperti yang dijelaskan di bagian 1) pada papan startKIT XMOS dan Raspberry Pi, dan cukup ikuti bagian yang menjelaskan perakitan perangkat keras XMP-1, lewati semua konten lainnya di sini. Jika Anda tertarik untuk mengontrol perangkat keras apa pun menggunakan Raspberry Pi dan browser web, maka beberapa kode di sini dapat digunakan kembali. Namun, untuk mendapatkan hasil maksimal dari kombinasi startKIT Raspberry Pi dan XMOS, informasi selebihnya di sini mungkin berguna jika Anda baru mengenal startKIT.

Ikhtisar Solusi – Perangkat Keras dan Perangkat Lunak

Berikut adalah foto XMP-1 yang telah diisi dayanya. Untuk penggunaan di luar ruangan, saya menggunakan perangkat jenis hotspot 802.11 (MiFi), menjalankan browser di ponsel.

Diagram di bawah menunjukkan tata letak perkiraan bit dan potongan seperti yang dilihat dari bagian belakang XMP-1. Anda dapat melihat bahwa ini cukup mendasar – XMP-1 hanyalah eksperimen singkat.

Raspberry Pi (RPI) digunakan untuk menangani semua aktivitas jaringan. Ini menjalankan server web kecil dan sebagian besar kode ditulis dalam JavaScript pada platform Node.js. RPI mengkomunikasikan kecepatan kontrol motor (sebenarnya servos rotasi kontinu digunakan untuk XMP-1) melalui antarmuka serial (SPI) ke papan startKIT XMOS. StartKIT XMOS bertanggung jawab untuk mengumpankan sinyal modulasi lebar pulsa (PWM) ke motor.

RPI terhubung ke jaringan menggunakan adaptor USB WiFi 802.11.

Diagram pengkabelan lengkap ditampilkan di sini. Perangkat keras dan konstruksinya akan dijelaskan nanti.

Diagram di bawah ini menunjukkan perangkat lunak yang akan diimplementasikan pada RPI dan startKIT. Terlihat banyak, tetapi sebenarnya tidak dan dapat dipecah menjadi bagian-bagian kecil yang akan dijelaskan lebih lanjut di bawah. Seperti yang disebutkan, seluruh kode sumber ada di bagian bawah posting ini sehingga dapat digunakan tanpa modifikasi apa pun jika diinginkan.

Singkatnya, blok hijau menangani interaksi web dan menentukan kecepatan dan arah motor berdasarkan input pengguna. Blok hijau menyediakan halaman web (index.html) kepada pengguna yang menggabungkan antarmuka pengguna. Program xmos_servo adalah perangkat lunak kecil yang ditulis dalam C yang menerjemahkan kecepatan/arah yang diinginkan menjadi byte antarmuka periferal serial dari data yang dikirim ke startKIT. Perangkat lunak startKIT dibagi menjadi tiga bagian yang berjalan secara bersamaan pada inti XMOS yang terpisah. spi_process mengubah sinyal SPI menjadi data yang disimpan dalam array. Kode data_handler memeriksa array untuk memutuskan apa yang harus dilakukan (satu-satunya kesimpulan yang dibuat hari ini adalah memanipulasi servos). Proses servo_handler mengeluarkan aliran pulsa ke servo, sehingga servo dapat berputar pada kecepatan yang diinginkan. Semua blok ini dijelaskan lebih detail di bawah ini.

Antarmuka Periferal Serial (SPI)

SPI bergantung pada empat kabel yang dikenal sebagai SS, SCLK, MISO dan MOSI dan penugasan master dan slave untuk dua perangkat yang terlibat dalam komunikasi. Dalam kasus papan RPI dan XMOS, RPI adalah perangkat utama dan bertanggung jawab untuk menghasilkan sinyal clock. RPI mengirimkan data pada kabel MOSI, dan menerima data pada kabel MISO. Ini berarti bahwa antarmuka SPI dapat mentransfer data secara dua arah secara bersamaan. Dalam praktiknya jika data satu arah diperlukan maka sinyal MOSI atau MISO dapat diabaikan tergantung pada arah yang diinginkan.

Tangkapan layar osiloskop di sini (sinyal individual dan dekode SPI otomatis dari osiloskop Tektronix MSO2024B) menunjukkan contoh komunikasi SPI menggunakan Raspberry Pi. SPI dapat dikonfigurasi dalam beberapa cara; Anda dapat melihat dalam contoh ini bahwa tiga byte data ditransfer dari master (RPI) ke slave (papan XMOS) dan mereka adalah 0x02, 0x00 dan 0x10, dan tidak ada data atau 0x00, 0x00, 0x00 yang ditransfer dari budak ke master secara bersamaan.

Kabel SS adalah sinyal pilihan chip (aktif rendah). RPI memiliki dua pin pada konektor 26 arahnya yang dapat digunakan untuk SS; mereka ditunjukkan dilingkari dengan warna biru pada diagram di bawah, ditandai CE0 dan CE1. Ini berarti bahwa RPI dapat berbicara dengan dua perangkat budak SPI jika diinginkan. Dalam hal ini, hanya satu pin CE yang digunakan – saya memilih CE1.

mengendalikan Motor Servo Hobi

Motor servo hobi menghasilkan gerakan berdasarkan sinyal input. Mereka biasanya berputar kurang dari satu putaran penuh. Biasanya servo hobby akan berputar dalam kisaran sekitar 180 derajat. Poros keluaran dapat dihubungkan ke (katakanlah) hubungan untuk membuat roda berbelok penuh ke kiri atau ke kanan penuh (atau apa pun di antaranya) berdasarkan sinyal masukan.

Diagram di bawah ini menunjukkan internal servo hobi yang khas (diambil dari situs ini). Di sebelah kiri (berwarna biru) adalah motor DC konvensional. Ini banyak diarahkan, dan poros terakhir dapat dilihat di sebelah kanan terhubung ke lengan biru yang dapat dihubungkan ke mekanisme kemudi roda misalnya. Di bawah poros akhir akan ada potensiometer, dan yang memberikan umpan balik tentang posisi yang tepat dari poros akhir. Oleh karena itu, servo hobi adalah sistem loop tertutup dan dapat mengoreksi sendiri jika lengan secara tidak sengaja terlempar dari posisi yang diinginkan.

Servo hobi biasanya memiliki tiga koneksi; 0V, 5V dan Sinyal. Kabel sinyal adalah input digital ke servo dan membutuhkan sinyal PWM. Ukuran lebar pulsa menentukan sudut yang akan dituju poros. Sinyal PWM perlu diulang setiap 20 mdtk, dan lebar pulsa 1,5 mdtk akan mengakibatkan poros bergerak ke posisi tengah. Lebar 1 mdtk akan menggerakkan servo sepenuhnya ke satu arah, dan lebar 2 mdtk akan menggerakkan servo sepenuhnya ke arah lain (lebih jauh di bawah akan ada beberapa jejak osiloskop dari kontrol servo).

Ada jenis servo yang dimodifikasi yang dikenal sebagai servo 'rotasi terus menerus'. Ini adalah servo yang dimodifikasi di mana potensiometer dilepas bersama dengan penghentian akhir, dan sirkuit dibujuk untuk berpikir bahwa servo masih dalam posisi tengah. Mengirim PWM dengan lebar pulsa selain 1,5msec akan membuat mekanisme berputar searah jarum jam atau berlawanan arah jarum jam dengan kecepatan yang tergantung pada lebar pulsa. XMP-1 menggunakan dua servos hobi rotasi kontinu, satu untuk setiap roda. Mereka bukan cara yang optimal untuk mendapatkan gerakan terkontrol (XMP-2 akan menggunakan motor DC brushed) karena mereka digunakan untuk tujuan yang berbeda dari tujuan awal untuk servos hobi, tetapi mereka memiliki keuntungan bahwa mereka dapat dikendalikan oleh digital sinyal logika dan tidak memerlukan sirkuit H-bridge eksternal.

Kabel servo hobi dapat diberi kode warna berbeda tergantung pada pabriknya. Biasanya kabel tengah berwarna merah, dan mengalir ke +5V. Kabel hitam atau coklat adalah 0V. Kabel putih atau kuning adalah input sinyal PWM.

Memulai pengembangan – Menghubungkan papan

Untuk mengembangkan perangkat lunak, RPI dan startKIT dihubungkan menggunakan kabel pita dan rakitan konektor IDC – ini dapat dirakit menggunakan wakil atau dibeli yang sudah jadi. Untuk versi rakitan sendiri, sebaiknya beli konektor IDC tambahan untuk digunakan sebagai konektor debug di bagian tengah kabel, agar lebih mudah saat memeriksa sinyal dengan multimeter atau scope.

Menerapkan SPI (spi_process) pada XMOS startKIT

Menggunakan lingkungan pengembangan XMOS (xTIMEcomposer) dibahas di bagian 1. Tangkapan layar di bawah ini menunjukkan versi Windows dari xTIMEcomposer, tetapi versi Linux terlihat identik (dan mungkin versi Mac juga terlihat serupa).

Pada titik ini Anda dapat mengklik kanan pada Perpustakaan Fungsi Budak SPI di lab xSOFTip dan mengimpor perpustakaan ke dalam ruang kerja. Saya bukan ahli dalam xTIMEcomposer jadi saya mungkin salah menggunakannya di sini, tetapi kode sumber dan file header untuk perpustakaan tersebut muncul di folder terpisah di Project Explorer (ditampilkan dilingkari dengan warna biru di bawah):

File-file tersebut harus berada di folder spi-test (sehingga muncul seperti yang ditunjukkan dilingkari hijau di atas) sehingga untuk mencapai itu saya secara manual menyalin file spi_slave.h dan spi_slave.xc dari folder module_spi_slave/src ke dalam spi-test /src folder menggunakan Windows Explorer.

Perangkat lunak ini menggunakan konsep port untuk mengontrol output atau membaca input. Ada pemetaan antara port logis ini dan pemetaan fisik ke pin pada chip. Pemetaan dapat diubah dalam kombinasi tertentu (Lihat gambar 3 dalam dokumen PDF Pengantar port XS1).

Port input/output pada perangkat XMOS dapat berukuran 1, 4, 8, 16 atau 32-bit. Saat mendesain dengan bagian tersebut, Anda mungkin ingin mengalokasikan fungsi tertentu ke port 1-bit, atau fungsi lain ke port multi-bit, sehingga gambar 3 akan sangat berguna untuk menentukan port dan pin mana yang akan digunakan.

Dengan kode budak SPI sekarang di spi-test/src filer, kode ini sedikit dimodifikasi. Kode library membuat asumsi bahwa port yang digunakan untuk antarmuka SPI semuanya adalah port 1-bit, sedangkan pin Raspberry Pi SPI SS (CE1) terhubung ke port 32-bit pada board XMOS. Gambar 8 dari dokumen PDF Manual Perangkat Keras startKIT ditunjukkan di bawah ini. Di tengah berwarna hijau Anda dapat melihat header 2x13 arah yang menghubungkan antara papan XMOS dan Raspberry Pi. Di kiri dan kanan dengan warna biru adalah nama pin fisik pada chip (X0D0,, X0D11, dll). Nilai pin yang disorot adalah nomor port logis. P1A, P1D dan seterusnya adalah port bit tunggal. P32A1 adalah digit biner pertama dari port 32-bit

Cukup banyak perubahan yang dilakukan pada perpustakaan SPI dan seluruh kode dilampirkan ke posting, jadi hanya beberapa potongan kode yang akan dijelaskan di sini, tidak perlu menyalin/menempel, kode lengkap terlampir di akhir posting ini dapat digunakan.

Antarmuka SPI pada perangkat XMOS diinisialisasi seperti yang ditunjukkan di sini. Ini dijelaskan lebih lanjut di bawah ini.

+ perluas tampilan sumber polos
  1. void spi_slave_init(spi_slave_interface &spi_if)
  2. {
  3.     int clk_start;
  4.     set_clock_on(spi_if.blk);
  5.     configure_clock_src(spi_if.blk, spi_if.sclk);
  6.     configure_in_port(spi_if.mosi, spi_if.blk);
  7.     configure_out_port(spi_if.miso, spi_if.blk, 0);
  8.     start_clock(spi_if.blk);
  9.     kembali;
  10. }

Seperti disebutkan dalam posting Bagian 1, I/O dapat di-clock masuk dan keluar dari perangkat XMOS pada waktu yang tepat. Dalam kode di atas, fungsi set_clock_on (didefinisikan dalam file header XMOS xs1.h) digunakan untuk mengaktifkan salah satu mekanisme clocking bawaan dalam chip XMOS. Diagram di bawah ini (dari dokumen Pengantar Port XS1) menunjukkan mekanisme ini dengan warna kuning. Fungsi configure_clock_src digunakan untuk memilih jam eksternal (ditunjukkan dengan warna biru pada diagram). Ini akan terhubung ke pin SCLK pada Raspberry Pi. Fungsi configure_in_port dan configure_out_port digunakan untuk mengikat port ke mekanisme clocking. Baik sinyal MOSI maupun MISO (ditunjukkan dalam warna hijau di bawah) dikonfigurasi untuk dikaitkan dengan mekanisme pencatatan jam kerja.

Cara data serial ditangani pada perangkat XMOS sangat rapi. Kode di sini dijelaskan lebih lanjut di bawah ini. Pertama, struktur digunakan untuk memuat detail tentang port yang diinginkan untuk digunakan sebagai antarmuka SPI.

+ perluas tampilan sumber polos
  1. typedef struct spi_slave_interface
  2. {
  3.     jam blk;
  4.     di port ss;
  5.     di port buffered:8 mosi;
  6.     out buffered port:8 miso;
  7.     di port sclk;
  8. } spi_slave_interface;

Baris yang menarik di atas adalah yang mengacu pada variabel port mosi dan miso. Mereka telah dideklarasikan sebagai tipe port:8. Jika variabel diberi alamat port 1-bit, maka perangkat XMOS akan secara otomatis men-de-serialize aliran bit 1-kawat menjadi nilai 8-bit.

Itu membuat sisa kode SPI menjadi sangat sederhana. Berikut adalah kode yang mengelola input data SPI dari Raspberry Pi:

+ perluas tampilan sumber polos
  1. void spi_slave_in_buffer(spi_slave_interface &spi_if, unsigned char buffer[], int num_bytes)
  2. {
  3.     data int tidak ditandatangani;
  4.     unsigned int vlen=0;
  5.     clearbuf(spi_if.miso);
  6.     clearbuf(spi_if.mosi);
  7.     untuk (int i = 0; i < num_bytes; i++)
  8.     {
  9.         spi_if.mosi :> data;
  10.         data=data<<24;
  11.         buffer[i]=bitrev(data);
  12.         jika (i==2)
  13.         {
  14.            vlen=(((unsigned int)buffer[1])<<8) | (unsigned int)buffer [2];
  15.            jika (vlen==0)
  16.                break;
  17.         }
  18.         jika (i >= vlen+2)
  19.         {
  20.             break;
  21.         }
  22.     }

Pada kode di atas, Anda dapat melihat bahwa ada for loop, dan di dalam loop terdapat baris spi_if.mosi :> data; digunakan untuk membaca 8 bit informasi pada jalur MOSI ke dalam variabel yang disebut data.

Dua baris berikutnya digunakan untuk membalik bit di dalam byte dan kemudian data disimpan dalam array buffer.

Beberapa baris berikutnya membutuhkan penjelasan; mereka terkait dengan protokol yang diinginkan. Itu dimaksudkan untuk membuat beberapa kode tujuan umum yang dapat digunakan untuk banyak hal, bukan hanya XMP-1. Jika Raspberry Pi mengirimkan data ke papan startKIT XMOS, papan XMOS perlu mengetahui berapa banyak byte data yang diharapkan. Ini mungkin sulit dikodekan tetapi tidak fleksibel.

Diputuskan untuk menggunakan protokol 'tag (atau tipe), panjang, nilai' (TLV) yang sangat sederhana. Byte pertama yang harus dikirimkan oleh Raspberry Pi adalah tag atau pengenal dalam rentang 0-255 (yaitu satu byte). Terserah pengguna untuk memutuskan apa yang mewakili nilai. Misalnya, nilai 1 bisa berarti "mengatur kecepatan motor" dan nilai 2 bisa berarti "mengatur intensitas kecerahan lampu depan". Dua byte kedua adalah nilai 16-bit yang menunjukkan berapa banyak nilai (yaitu data) byte yang harus diikuti. Saya memutuskan untuk membatasi ini hingga 4kbyte (4096 byte) yang seharusnya memenuhi banyak kasus penggunaan tetapi nilai sebenarnya dapat diubah dengan menyesuaikan definisi BUFLEN dalam kode.

Oleh karena itu jumlah minimum byte yang dikirim pada antarmuka SPI adalah tiga (tag, dan panjang 0x0000) dan maksimum 4099 yang merupakan tag dan panjang 0x1000 (ini adalah 4096 dalam heksadesimal) dan 4096 byte data.

Protokol sedikit disempurnakan, sehingga nomor tag ganjil berarti Raspberry Pi mengharapkan respons kembali dalam komunikasi SPI berikut yang dimulai setelah aliran TLV saat ini selesai, dan nomor tag genap berarti Raspberry Pi tidak mengharapkan respons kembali.

Ini adalah protokol yang sangat mendasar tetapi harus memenuhi banyak persyaratan biasa. Juga dijelaskan pada tabel di bawah ini di mana angka biru adalah indeks byte SPI ke buffer penerima 4099 byte.

Kembali ke cuplikan kode sebelumnya, dapat dilihat bahwa beberapa baris berikutnya memeriksa isi buffer[1] dan buffer[2] dengan cepat saat data SPI diterima. Isinya diharapkan menjadi panjang seperti yang terlihat pada diagram di atas (lihat indeks buffer biru). Segera setelah kode menentukan panjang sisa, kode akan menerima jumlah byte Data yang tepat, dan kemudian rutin keluar.

Itu mencakup input SPI ke papan XMOS pada jalur MOSI. Keluaran SPI dari perangkat XMOS pada saluran MISO beroperasi dengan cara yang sama, memeriksa panjang secara bersamaan pada saluran MOSI dengan cepat lagi, sehingga fungsi dapat keluar segera setelah jumlah byte yang diminta telah ditransfer.

Komunikasi Antar-Proses

Sekarang setelah SPI diketahui dan protokol telah diterapkan untuk bertukar data panjang variabel di kedua arah hingga panjang 4096 byte, beberapa pertimbangan diberikan pada bagian utama program. Jelas bahwa inti XMOS akan didedikasikan untuk menangani tugas SPI, tetapi kode lainnya mungkin perlu berada di satu atau lebih Skor XMO tambahan.

Pada bagian 1, dijelaskan bagaimana tugas berjalan secara paralel pada inti XMOS yang berbeda, dan bagaimana tugas dapat berkomunikasi satu sama lain dengan mendorong nilai ke saluran. Ada cara lain untuk berkomunikasi antara inti dan menggunakan konsep "transaksi melalui antarmuka" daripada saluran. Ini lebih fleksibel karena Anda dapat mengirim banyak variabel dari tipe yang berbeda dari satu inti XMOS ke inti lainnya. Jenis transaksi didefinisikan seperti prototipe fungsi C. Ini semua menjadi lebih jelas dengan melihat sebuah contoh.

Misalnya, jika aplikasi memiliki tugas yang mengontrol tampilan, maka tugas pengirim mungkin ingin mengaktifkan atau menonaktifkan tampilan, atau mungkin ingin memplot piksel. Definisi antarmuka untuk komunikasi antara dua inti XMOS dapat terlihat seperti ini:

+ perluas tampilan sumber polos
  1. interface program_display
  2. {
  3.     void backlight(int state, int color) ; // jenis transaksi 1
  4.     plot kosong(int x, int y, int warna); // jenis transaksi 2

Komunikasi antarmuka bersifat searah, jadi jika layar ingin mengirim informasi seperti (misalnya) status layar sentuh, maka antarmuka lain perlu digunakan ke arah lain. Dari sini jelas bahwa antarmuka memiliki ujung klien dan server. Diagram di sini menunjukkan dua inti XMOS (berwarna ungu), dua antarmuka (berwarna abu-abu), dan antarmuka pertama (disebut program_display) memungkinkan dua jenis transaksi yang berbeda terjadi (berwarna biru) di seluruh antarmuka program_display.

Hal yang hebat tentang menggunakan antarmuka dan jenis transaksi adalah, seperti halnya prototipe fungsi C, Anda dapat memiliki nilai kembalian dan Anda dapat meneruskan referensi ke variabel, sehingga meskipun komunikasi selalu dimulai oleh ujung antarmuka klien, transfer data dapat terjadi dua arah. Fitur lain yang sangat menarik yang tidak ditampilkan pada diagram adalah kemampuan ujung server untuk dapat mengirim 'pemberitahuan' ke ujung klien. Ini bisa menjadi sinyal bagi klien untuk mengeluarkan transaksi dengan cara biasa, mungkin untuk mengambil beberapa data. Fitur ini akan digunakan dalam kode XMP-1. Jadi, informasi lebih lanjut tentang cara membuat kode antarmuka dan mengirim data serta notifikasi akan dijelaskan lebih lanjut di bawah ini.

Merancang arsitektur IPC untuk menangani konten SPI

Penanganan antarmuka SPI telah dijelaskan. Sekarang konten pesan SPI perlu disajikan ke tugas dengan cara yang berguna untuk pemrosesan selanjutnya. Berbekal pengetahuan tentang antarmuka dan transaksi, dimungkinkan untuk mulai mengalokasikan fungsionalitas untuk memisahkan inti XMOS dan merancang komunikasi antar-proses untuk mencapai kerangka tujuan umum yang memungkinkan konten pesan yang berguna dikirim dari RPI ke XMOS papan dan sebaliknya, dan diproses.

Diagram di sini menunjukkan apa yang dikembangkan (diagram serupa seperti sebelumnya, kecuali sekarang ada urutan waktu dari atas ke bawah).

Ketika Raspberry Pi ingin mengirim pesan ke papan XMOS, RPI akan menyusun pesan ke dalam format TLV yang dijelaskan sebelumnya. Informasi tersebut kemudian di-clock pada kabel sinyal MOSI (ditunjukkan dengan warna hijau di bagian atas diagram di atas). Secara bersamaan perangkat XMOS perlu mengirim sesuatu kembali, tetapi karena belum ada informasi untuk dikirim kembali, garis MISO dapat berisi sampah atau semua nilai nol seperti yang ditunjukkan dalam warna merah muda. Fungsi spi_process akan mengumpulkan pesan ke dalam buffer (array unsigned char) dan kemudian akan memulai transaksi ke inti XMOS data_handler terpisah. Data_handler bertanggung jawab untuk memproses konten pesan dan secara opsional mengirim kembali informasi ke inti spi_process XMOS, sehingga setiap pertukaran SPI berikutnya dapat mengirim data yang berguna kembali ke Raspberry Pi alih-alih nilai sampah.

Data dapat dikirim antara spi_process dan data_handler dengan membuat salinan buffer. Namun sebaliknya dimungkinkan untuk hanya meneruskan pointer ke memori buffer. Salah satu cara yang dapat dilakukan adalah 'memindahkan' kontrol pointer dan lokasi memori buffer  dari spi_process ke data_handler. Setelah data_handler selesai dengan pemeriksaan pesan, ia dapat memindahkan kontrol kembali ke spi_process menggunakan variabel pengembalian yang mungkin digunakan dalam transaksi. Inilah sebabnya mengapa diagram di atas memiliki transaksi yang disebut array_data dengan parameter yang didefinisikan sebagai pointer yang dapat dipindahkan dan nilai kembalian yang juga didefinisikan sebagai pointer yang dapat dipindahkan. Dengan cara ini, hanya satu inti XMOS yang memiliki akses ke memori buffer pada satu waktu.

Berikut adalah interface yang digunakan:

+ perluas tampilan sumber polos
  1. antarmuka ke_rpi
  2. {
  3.     kode batal(unsigned char c);
  4. };
  5. antarmuka from_rpi
  6. {
  7.     unsigned char* movable array_data(unsigned char* movable bufp);
  8. };

Kode spi_handler mengalokasikan ruang untuk buffer, dan kemudian meneruskan kontrol buffer ke kode data_handler menggunakan baris buf=c.array_data(move(buf)) yang ditunjukkan dalam kode di sini:

+ perluas tampilan sumber polos
  1. batal
  2. spi_process(antarmuka ke_rpi server, antarmuka dari_rpi klien c)
  3.   penyimpanan char yang tidak ditandatangani[4099];
  4.   unsigned char* movable buf=storage;
  5.   …
  6.   buf=c.array_data(move(buf));
  7.   …
  8.   pilih
  9.   {
  10.     case s.code(unsigned char c):
  11.       jika (c==KIRIM)
  12.       {
  13.         spi_slave_out_buffer(spi_sif, buf, 4099);
  14.       }
  15.       istirahat;
  16.   }
  17. }

Kode data_handler memperoleh kontrol buffer dan kemudian jika ada respons yang diinginkan untuk dikirim ke RPI pada transaksi SPI berikutnya, buffer diisi dengan respons. Akhirnya kontrol buffer diteruskan kembali ke proses spi_handler.

+ perluas tampilan sumber polos
  1. batal
  2. data_handler(antarmuka ke_rpi klien c, antarmuka dari_rpi server s)
  3.   pilih
  4.   {
  5.       case s.array_data(unsigned char* movable vp) -> unsigned char* movable vq:
  6.          // vq berisi data dari SPI. Kami dapat melakukan apa pun yang kami suka dengan itu di sini.
  7.          // Setiap tanggapan dibangun di sini juga:
  8.          vq[0]=0x22; // tag
  9.          vq[1]=0x00; // panjang
  10.          vq[2]=0x00; // panjang
  11.          vq=move(vp); // teruskan kontrol penunjuk kembali ke spi_process
  12.          tosend=1;
  13.          break;
  14.      }
  15.   jika (mengirim)
  16.   {
  17.     c.code(KIRIM); // send a code to spi_process so that it is aware there is data to send to RPI
  18.   }
  19. }

Earlier it was mentioned that if an odd tag value was sent by the RPI then this would be an indication that the RPI expected a response message from the XMOS startKIT board on the subsequent SPI exchange. This is implemented by both the spi_process and data_handler making a note that a return message is expected if the first byte received is an odd value. Once data_handler has finished constructing the return message in the buffer memory it moves the buffer pointer back to the spi_process XMOS core and also sends a code transaction which could contain a message such as “ready to send”. The spi_process XMOS core is now ready for any subsequent SPI exchange. If the data_process doesn’t want to send any message back to the Raspberry Pi (for example if the tag was even valued) then the code transaction is not sent (or a different code could be sent such as “not ready to send”).

In the graphic diagram earlier you can see that the subsequent SPI exchange did transmit data back to the Raspberry Pi on the MISO wire.

To summarize, the spi_process and data_process present a fairly general-purpose capability to exchange data bidirectionally between the RPI and XMOS board.

Implementing PWM (servo_handler) on the startKIT

To test out the general purpose architecture, it was decided to use it to control many devices. The devices ended up being hobby servos because they require very little electrical interfacing effort – no H-bridge or transistor driver is needed – and the servo input wire can be directly connected to an XMOS output pin. I didn’t have many servos, so although the code implements 8 servo control, only two were used for XMP-1.

The code could be modified to provide DC motor control too (with a suitable external H-bridge circuit).

It was decided to use a single XMOS core to handle the eight servos. The diagram below shows the total of three XMOS processes used in the solution. The new addition is the servo_handler task which is shown on the right. This task has an array that stores the current servo values. As soon as the task starts up, the values are initialized to a centered value (or standstill for a continuous rotation servo) and then every microsecond the task wakes up to check if the servo PWM signal needs adjustment.  If it does then the servo port output is toggled. After 20msec the process repeats.

For more detail:XMOS startKIT Building an XMOS and Raspberry Pi Robot XMP-1


Proses manufaktur

  1. Komunikasi MQTT Antara NodeMCU dan Raspberry Pi 3 B+
  2. Sensor Suhu Python dan Raspberry Pi
  3. Suhu dan Kelembaban yang Mudah di Raspberry Pi
  4. Sensor Suhu dan Cahaya Raspberry Pi
  5. Sensor Pi Raspberry dan Kontrol Aktuator
  6. Aeroponik dengan Raspberry Pi dan sensor kelembapan
  7. MODEL B RASPBERRY PI 3 BARU + FITUR DAN PEMBELIAN
  8. Robot Menggunakan Raspberry Pi &Bridge Shield
  9. BeagleBone dan Raspberry Pi mendapatkan pengaya FPGA
  10. Membangun Kit Robot Raspberry Pi MonkMakes