Sejak saya mulai berkendara, saya selalu ingin dapat berkomunikasi dengan cara yang lebih bermakna dengan pengemudi acak di sekitar saya. Sepertinya bagi saya, flash lampu, lamba tangan, gerakan yang melibatkan lebih dari sekadar lamba tangan, klakson, atau rem tiba-tiba semuanya akhirnya menjadi mekanisme komunikasi yang sangat kasar.
Inspirasi untuk ini adalah film James Bond di mana, dalam adegan pembuka, dia memiliki beberapa teks yang ditampilkan di jendela belakang Austin Martin-nya. Saya pikir, saya benar-benar dapat memberi tahu (bukan hanya mengungkapkan dengan tangan melambung) pengemudi di kendaraan lain persis apa yang saya pikirkan.
Ini adalah demo rak:
Dan demo aksi semu:
Ini adalah sketsa konsep:
Proyek ini memiliki tantangan tambahan karena MKR1000 adalah papan pra-rilis dan tidak ada dokumentasi resmi. Ada titik awal yang sangat baik di Hackster:
Saya beruntung bisa masuk ke forum yang disponsori oleh https://arduino.cc, yang memiliki forum pribadi untuk kami pemilik papan pra-rilis. Setelah satu hari Sabut yang padat, saya berhasil memprogram papan dan membuat semua komponen bekerja.
Pengaturan saya saat ini melibatkan versi Arduino IDE 1.6.9 hourly build. Jika Anda seperti saya, menggunakan build "hourly" dalam proyek membuat Anda "tidak nyaman" paling tidak.
Setelah saya menginstal IDE, saya mengunduh driver untuk papan dengan Board manager IDE. Saya juga memuat perpustakaan berikut menggunakan library manager IDE: Adafruit DotStar, Adafruit DotStarMatrix, Adafruit GFX, ArduinoJson, dan Windows Virtual Shields for Arduino.
Saat papan ini dirilis secara resmi, proses akan jauh lebih sederhana. Jadi, saya tidak akan membahasnya di sini. Ada referensi ke proyek untuk membantu Anda melakukan ini di akhir artikel.
Aturan nomor 1 dalam membangun elektronika: Jangan biarkan asap keluar dari rangkaian!
MKR100 adalah papan berbasis 3v3. Tidak memiliki semua dokumentasi yang saya inginkan, saya tidak tahu apakah mereka tahan 5 volt. Tidak hanya itu beberapa komponen benar-benar ingin memiliki 5 volt yang tersedia untuk menegakkan logika 1 dan 0 yang tepat.
Ini mendorong kebutuhan untuk pengalih level 4 channel bidirectional oleh Adafruit. Kartu bluetooth dan terutama matriks DotStar benar-benar suka penuh 5 volt. Jadi, hati-hati saat menghubungkan hal-hal ini.
Pastikan komponen bekerja
Sebelum saya khawatir tentang membuat semuanya bekerja bersama, saya ingin memastikan bahwa semua komponen bekerja.
Saya memulai dengan <insert link>Adafruit 8x32 DotStar matrix. Saya menemukan bahwa koneksi yang saya miliki sedikit longgar. Untuk membuat ini tidak menjadi masalah, saya menggunakan beberapa pin header yang saya miliki dan sekedar memasangnya dengan las.
Dengan pin header yang terpasang dengan kuat. Saya merutekan Data dan Clock In ke pin SPI yang ditandai SDA dan SCL pada MKR1000.
Dengan pin header yang terpasang dengan kuat. Saya merutekan Data dan Clock In ke pin SPI yang ditandai SDA dan SCL pada MKR1000.
Saya memuat sketsa contoh "File > Examples > Adafruit DotStarMatric > matrixtest" ke dalam IDE. Sesuaikan DATAPIN ke 11 dan CLOCKPIN ke 12 dalam kode. Build dan solusi terpasang. Setelah sedikit dengan opsi untuk matriks saya akhirnya dengan tampilan yang bekerja.
Selanjutnya adalah membuat Virtual Shield bekerja melalui adaptor Bluetooth. Ini sangat sederhana. Saya mengikuti petunjuk yang disebutkan di repositori github https://github.com/ms-iot/virtual-shields-arduino. Perubahan satu-satunya yang harus saya lakukan adalah pin TX dan RX. Itu adalah pin 14 dan 13 seperti ditandai pada papan saya.
Saya akan mencatat bahwa dalam inkarasi sebelumnya saya harus memutuskan pin TX/RX untuk mengunggah sketsa baru. Saya senang melaporkat bahwa ini tidak lagi berlaku.
Lewati kode
Sekarang semuanya bekerja saya akan mengambil sejenak dan menjelajahi kode yang spesifik untuk proyek ini.
Untuk mengakses semua fungsi Anda perlu menyertakan yang berikut:
5 include pertama seharusnya cukup menjelaskan diri sendiri.
VirtualShield.h berisi fungsionalitas dasar untuk komunikasi melalui adaptor Bluetooth. Ini diperlukan terlepas dari sensor mana yang ingin Anda akses.
File Text.h membuat teks yang lebih baik, yaitu penanganan String.
Graphics.h, Recognition.h, dan Colors.h berisi fungsionalitas yang Anda butuhkan untuk mengakses layar virtual dan mengaktifkan pengenalan suara. Meskipun belum selesai untuk tantangan ini, saya akan memprogram fitur suara di masa depan.
Selanjutnya dalam daftar baris kode penting, menginisialisasi matriks DotStar dan menginisialisasi objek Shield:
Baris pertama memberi tahu perpustakaan DotStar ukuran dan tata letak matriks. Lihat contoh matrixtest atau berkas Adafruit_DotStarMatrix.h untuk opsi yang berbeda.
Warna-warna adalah untuk perpustakaan DotStar.
3 baris terakhir menyalakan shield dan menginisialisasi objek untuk bekerja dengan sensor di ponsel.
Selanjutnya seperti semua sketsa Arduino kita perlu menangani metode setup()
void setup() { matrix.begin(); matrix.setTextWrap(false); matrix.setBrightness(40); matrix.setTextColor(colors[0]); DisplayText("Initializing...", 4, 10); // set up virtual shield events: shield.setOnRefresh(refresh); speech.setOnEvent(onSpeech); screen.setOnEvent(screenEvent); // begin the shield communication (also calls refresh()). shield.begin(); //assumes 115200 Bluetooth baudrate DisplayText("Initializing...finished", 3, 10); }
Baris "matrix" cukup menjelaskan diri sendiri dan dengan baris-baris tersebut dieksekusi ini memberi saya kemampuan untuk sekarang mengeluarkan beberapa pesan informasi ke matriks.
Baris "shield" sekarang menyiapkan metode callback. Metode ini akan dipanggil sesuai kebutuhan saat terjadi peristiwa.
Sekarang untuk metode paling rumit dalam seluruh sketsa
void loop() { // checkSensors() checks for return events and handles them (calling callbacks). This is VirtualShield's single loop() method. shield.checkSensors(); }
Ya, Anda mendapatkannya. Kita terus memeriksa apakah salah satu sensor telah memicu peristiwa yang perlu ditangani.
Oke sekarang, mari kita benar-benar menangani beberapa peristiwa. Pertama adalah metode refresh(). Ini akan dipanggil saat sejumlah peristiwa berbeda terjadi. Satu peristiwa yang kita pedulikan saat ini adalah saat bluetooth terhubung. Kita butuh peristiwa sehingga kita dapat menggambar ulang layar sehingga terlihat seperti yang seharusnya.
void refresh(ShieldEvent* shieldEvent) { // put your refresh code here // this runs whenever Bluetooth connects, whenever the shield.begin() executes, or the 'refresh' button is pressed in the app: screen.clear(ARGB(123,86,204)); screen.drawAt(0,0, ""); thanksId = screen.addButton(10, 50, ". Thank you ."); welcomeId = screen.addButton(10, 100, ". Welcome ."); turnLeftId = screen.addButton(10, 150, ". Left ."); stoppingId = screen.addButton(175, 50, ". Stopping ."); startingId = screen.addButton(175, 100, ". Starting ."); turnRightId = screen.addButton(175, 150, ". Right ."); backoffId = screen.addButton(10, 225, ". Back Off ."); calling911Id = screen.addButton(10, 290, ". Calling 911 ."); }
Metode ini membersihkan layar dengan latar belakang ungu muda dan melanjutkan untuk menempatkan berbagai tombol di layar. Perhatikan spasi di sekitar kata-kata. Ini adalah keterbatasan saat ini dari fungsionalitas virtual shield karena saya benar-benar ingin memusatkan semuanya agar terlihat bagus.
Jadi apa yang terjadi ketika saya menyentuh salah satu tombol itu? Sebuah peristiwa ditangkap dan ditangani dalam potongan kode berikut.
Sebuah peristiwa masuk, kode memeriksa tombol mana yang ditekan dan kita memanggil metode DisplayText dengan hal yang akan ditampilkan.
Dan akhirnya bagaimana teks keluar ke matriks? Metode DisplayText akan menanganinya untuk Anda.
void DisplayText(String message, int colorIndex, int currDelay) { int x = matrix.width(); int maxX = -1 * (message.length() * 5 + message.length()); matrix.setTextColor(colors[colorIndex]); while( x > maxX) { matrix.fillScreen(0); matrix.setCursor(x, 0); matrix.print(message); --x; matrix.show(); delay(currDelay); } }
Metode ini mengetahui seberapa lebar string ini sebenarnya. Kita perlu mengetahui, sehingga kita dapat memastikan string sepenuhnya digulir ke dalam dan keluar dari tampilan. Huruf-lebarnya 5 + 1 untuk spasi di antara huruf.
Bangun kotak pelindung
Pembangunan cukup sederhana. Saya menemukan kotak yang cukup besar yang lebih besar dari jejak matriks. Dapatkan selembar plywood baltic birch 1/4" yang lebih besar dari yang saya butuhkan dan potong ke ukuran.
Menggunakan teknik yang sama seperti gerinda meja. Mulai dengan meletakkan matriks pada plywood. Setelah itu diposisikan, tandai pusat horizontal dan vertikal dari koneksi (termasuk koneksi daya tambahan). Yang perlu Anda lakukan sekarang adalah menghubungkan garis untuk menemukan pusat lubang yang akan Anda bor.
Ya saya bilang 'bor', tidak 'lubur. Kali terakhir saya "membor" lubang dalam plastik, saya memiliki beberapa hasil yang sangat tidak memuaskan. Kali ini saya menggunakan Forestner bits. Saya memiliki gambar dari mereka di bawah ini. Perhatikan bahwa tepi untuk pemotongan dan pusat memiliki penggaruk untuk mengeluarkan kayu yang tidak diinginkan. Membuat "lubang" yang jauh lebih bagus. Sekarang, mulai 'membor' dan Anda mungkin ingin melanjutkan dan bor lubang penangguhan.
Dapatkan selembar kertas susur 120 Grit dan susur ringan seluruh bagian. Pastikan 'membungkus' tepi papan termasuk semua lubang yang baru saja dibuat. Pastikan untuk mengusap papan, sehingga tidak ada debu gerinda atau 'barang' lain di papan.
Sekarang saatnya bekerja pada kotak plastik.
Bor dua lubang di kedua ujung kotak. Ini adalah untuk konektor daya dan koneksi ke matriks. Jangan bor lubang daya tambahan matriks untuk saat ini.
Sekarang, terapkan beberapa lembar pita double-sided di bagian belakang kotak, dan pasang kotak ke plywood. Karena ini adalah pita 'reposition-able', saya benar-benar ingin ini menempel untuk selamanya. Saya menempatkan beberapa buku tebal di atas dan membiarkannya selama 24 jam. Mengapa 24 jam? Instruksi pita bilang tidak boleh. Itu alasan yang cukup baik untuk saya.
Saatnya untuk lubang terakhir. Anda sekarang harus memiliki posisi tepat untuk lubang koneksi daya tambahan. Bor itu, nikmati pekerjaan yang 'akurat' terlihat.
Masukkan otak ke dalam kotak
Sepertinya breadboard adalah ukuran yang tepat untuk kotak, tetapi saya ingin dapat mencabut/mencabut konektor USB dari MKR1000. Jadi, saya harus mempersingkat breadboard.
Oke setelah trauma itu, lepaskan pelindung belakang breadboard dan tempelkan. Pastikan untuk menghindari lubang koneksi daya tambahan.
Pasang matriks di bagian depan plywood dengan memasukkan koneksi melalui lubang. Amankan matriks dengan beberapa lem panas.
Mari kita bicara tentang daya
Meskipun saya telah mengatur kecerahan ke 40%, arus maksimal jika saya menyalakan semua 256 piksel adalah sekitar 7,5 Ampere. Lebih banyak daripada yang mungkin dapat diberikan oleh MKR1000. Untungnya bagi saya, tidak ada tampilan yang statis dan saya tidak menyalakan dekat dengan matriks penuh. Koneksi daya tambahan datang untuk menyelamatkan. Saya menyediakan hingga 4A. Saya pikir karena itu tidak berkelanjutan dan tidak statis, sumber daya harus baik.
Saya juga memiliki wall-wart cadangan yang saya gunakan ujungnya untuk menyediakan daya ke MKR1000 saat dihidupkan dalam kendaraan.
Saya memikirkan untuk membangun konverter daya ke dalam proyek untuk mengambil daya mobil 12V dan memberikan 5V ke proyek. Setelah banyak pemikiran, lebih baik dalam segala hal untuk mendapatkan adaptor AC 5V 4A seharga $5,00 dan menggunakan konverter AC yang sudah saya miliki. Sederhana biasanya lebih baik ketika datang ke hal ini.
Menggantung papan
Saya berencana untuk menggunakan "Ball stretch cords" dan beberapa cangkir sedotan untuk mengamankan ini ke kaca belakang. Katakan saja, saya masih memiliki banyak pekerjaan yang harus dilakukan di bidang itu.
Kode
The Say Thanks code
https://github.com/pulcher/mkr1000_challenge
Skema Rangkaian
The MKR1000 is just a micro as the real MKR1000 hasn't been released yet.