
Dalam persiapan untuk forum TI tahunan, muncul ide untuk membuat manipulator sederhana yang dikendalikan oleh gamepad nirkabel untuk menunjukkan kemampuan mikrokontroler dan komputer papan tunggal. Di tangan adalah pengontrol TRIC, beberapa servomotors, konstruktor besi, dan sebulan sebelum dimulainya forum.
"Semuanya berjalan sesuai rencana," tetapi tidak dalam kasus ini.
Tahap 1. Persiapan
TRIC di atas Linux adalah penghalang bagi manipulator semacam itu, tetapi "masalahnya adalah kegunaan dan pemeliharaan dangkal" ( ClusterM mengutip tentang Linux dalam interkom pintar ).
Setelah membaca spesifikasinya , diketahui bahwa ia memiliki Bluetooth. Jika Anda bekerja dengan pengontrol ini, maka Anda tahu bahwa transfer program adalah melalui Wi-Fi dan tidak ada cara lain yang nyaman untuk berkomunikasi dengannya. Tidak disebutkan Bluetooth dalam menu. Tapi bagaimana caranya?
Berbekal SSH, obeng dan rasa ingin tahu, saya mulai mencari Bluetooth. Sistem ini termasuk hcitool, hciconfig, dan daemon bluetoothd. Mereka semua berkata bahwa dia tidak ada di sana.
root@trik-7dda93:~
root@trik-7dda93:~
root@trik-7dda93:~
Menelepon teman untuk mencari modul USB eksternal, saya terus mencari.
Setelah membongkar controller, modul Jorjin WG7311-0A ditemukan. Spesifikasi menyatakan bahwa sebenarnya ada Wi-Fi, Bluetooth dan bahkan radio FM. Antarmuka untuk berkomunikasi dengan Bluetooth adalah UART, dan dihidupkan melalui BT_EN.

Setelah membaca bagaimana modul Bluetooth terhubung melalui UART melalui hcitool, saya mencoba keberuntungan saya dan tidak melakukan apa pun. Dua dari tiga port UART gratis tidak bersuara.
Tapi kami sudah menghubungi BT_EN! Mungkin saja modul dimatikan dan tidak menanggapi permintaan. Setelah memeriksa perangkat kernel Linux untuk perangkat ARM, sebuah file ditemukan di mana semua kontak yang digunakan oleh SoC terdaftar. Dengan membuka arch/arm/mach-davinci/board-da850-trik.c
dalam kode sumber kernel, kontak GPIO untuk Bluetooth benar-benar ditemukan. Kemenangan! Saya pikir.
static const short da850_trik_bluetooth_pins[] __initconst = { DA850_GPIO6_11, DA850_GPIO6_10, -1 };
Tahap 2. Menyinggung
Untuk mengaktifkan kontak melalui GPIO, Anda perlu menemukan nomor seri ujung ke ujung. Kami menemukan baris berikut dalam kode kernel dengan permintaan untuk menginisialisasi kontak BT_EN_33 di arch/arm/mach-davinci/board-da850-trik.c
:
ret = gpio_request_one(GPIO_TO_PIN(6, 11), GPIOF_OUT_INIT_LOW, "BT_EN_33")
Ini menggunakan GPIO_TO_PIN makro. Lihat deskripsi makro di arch/arm/mach-davinci/include/mach/gpio-davinci.h
:
#define GPIO_TO_PIN(bank, gpio) (16 * (bank) + (gpio))
Dengan menggunakannya, Anda dapat menemukan nomor kontak ujung ke ujung. Kami mendapatkan bahwa 16 * 6 + 11 = 107. Sekarang kita beralih ke pencantuman kontak.
echo 1 >> /sys/devices/virtual/gpio/gpio107/value
0 atau 1 dalam perintah echo adalah status kontak.
Jalankan perintah untuk menghubungkan dan ...
root@trik-7dda93:~
tidak dapat dipahami oleh kami (saat ini) pesan kesalahan. Kami mencoba mengonfigurasi perangkat melalui hcitool:
root@trik-7dda93:~
Tidak ada perangkat, meskipun inisialisasi diduga disahkan. Kami mencoba menghubungkan kedua kalinya, tetapi dengan jenis adaptor yang berbeda:
root@trik-7dda93:~
Dan lagi, tidak ada. Mari kita kembali ke kesalahan pertama dan menerapkan pengetahuan bahasa Inggris:
Warning: cannot find BTS file: /lib/firmware/TIInit_7.6.15.bts
Kami membuka folder / lib / firmware dengan firmware dan tidak menemukan file yang kami butuhkan. Setelah lama mencari di Internet, kami menemukan file yang diinginkan di repositori TI dan mengunduhnya. Versi lain dari file yang sama menolak untuk berfungsi.
curl -k https://git.ti.com/wilink8-bt/ti-bt-firmware/blobs/raw/45897a170bc30afb841b1491642e774f0c89b584/TIInit_7.6.15.bts > TIInit_7.6.15.bts cp TIInit_7.6.15.bts /lib/firmware/TIInit_7.6.15.bts
Kami me-reboot controller dan menyambung kembali:
root@trik-7dda93:~
Hore! Firmware telah di-boot. Memeriksa hciconfig:
root@trik-7dda93:~
Kami memulai layanan bluetoothd, memindai perangkat, dan mendeteksi modul kami:
root@trik-7dda93:~
Pencarian komputer menemukan perangkat:

Untuk mengaktifkan Bluetooth, Anda dapat membuat skrip:
Dan tambahkan ke autorun:
cp init-bluetooth /etc/init.d/init-bluetooth update-rc.d init-bluetooth enable 99
Restart dan shutdown modul berperilaku tidak terduga, oleh karena itu opsi stop dan restart tidak memiliki perintah.
Tahap 3. Pemeriksaan komunikasi
Cara termudah untuk memverifikasi komunikasi di kedua arah adalah layanan port COM. Dengan beberapa perintah, hidupkan:
root@trik-7dda93:~
Kami terhubung dari telepon dan melihat undangan untuk masuk ke sistem:

Tidak ada terminal yang diuji yang diizinkan memasukkan kata sandi pengguna kosong, jadi saya harus mengirim informasi masuk menggunakan pengalihan utas dalam sesi SSH.
Mengikuti instruksi untuk menghubungkan gamepad ke Linux, kami menghadapi masalah berikut:
- BlueZ dalam distribusi sudah usang dan tidak mengerti perintah dari daemon sixad, yang membuat koneksi dengan gamepad
- Versi BlueZ baru dari sumber menolak untuk dikompilasi karena banyak dependensi
- BlueZ Fresh Debian membutuhkan udev dan systemd, yang hilang dari distribusi saat ini
Satu-satunya ketergantungan yang dapat memuaskan adalah modul kernel uinput.
Untuk melakukan ini:
- dapatkan konfigurasi kernel saat ini di perangkat
cp /proc/config.gz config.gz gunzip config.gz
- unduh kode kernel
- unduh dan instal toolchain
- salin konfigurasi kernel ke folder dengan kode kernel
- tambahkan modul uinput ke konfigurasi
echo "CONFIG_INPUT_UINPUT=m" >> config
- mulai perakitan dengan terlebih dahulu menyalakan toolchain
source /opt/trik-sdk/environment-setup-arm926ejste-oe-linux-gnueabi make
- salin modul kernel ke kartu memori
make INSTALL_MOD_PATH=/mnt/trik-sd modules_install
- buat gambar uBoot dan salin ke / boot
make uImage cp arch/arm/boot/uImage /mnt/trik-sd/boot/uImage-3.6.7
Sekarang program tidak bersumpah pada kurangnya modul kernel, tetapi kemudian kita tidak dapat melakukan apa-apa. Instruksi untuk gamepad akan berguna nanti.
Tahap 5. Masak bubur dari kapak
Mencapai rencana "tyap-blooper." Karena tidak ada cara mudah untuk meletakkan program yang diperlukan pada distribusi asli, kami akan meletakkan sesuatu yang populer. Prosesor ini memiliki arsitektur ARMv5TE, yang berarti ada distribusi untuk itu.
Kami mencoba membongkar dan menjalankan Arch Linux universal untuk ARM dan ketika memuat di konsol kami melihat bahwa systemd membutuhkan versi kernel yang lebih baru, yang tidak kami miliki. Upaya untuk mentransfer kernel 4,16 tidak berhasil dan butuh terlalu banyak waktu.
Kami beralih ke opsi lain - Debian. Ada disk image dengan sistem yang terinstal untuk ARM, tetapi lebih baik menempatkan sistem yang bersih dengan paket dan pengaturan yang diperlukan untuk kita.
Instalasi di QEMU
Unduh gambar instalasi (tautan ke .iso ) dan instal QEMU.
Kita juga memerlukan kernel dan imej initrd untuk mem-boot instalasi, yang dapat diunduh dari sini .
Buat gambar kartu memori dengan ukuran kartu memori nyata (dalam hal ini 4 GB):
qemu-img create -f raw debian.img 4G
Kami memulai instalasi:
qemu-system-arm -M versatilepb -kernel vmlinuz-3.2.0-4-versatile -initrd initrd.gz -hda debian.img -cdrom debian-7.11.0-armel-CD-1.iso
Jika Anda akan membuat tata letak disk dari distribusi asli relatif non-standar, maka tinggalkan partisi root terlebih dahulu, jika tidak, Anda harus mengubah parameter boot kernel di uBoot. Ada sejumlah partisi tempat sistem file root berada.
Markup standar berisi:
- Partisi EXT4 untuk file 1,3 GB sistem file root
- Partisi FAT32 untuk menyimpan data pengguna ≈ berukuran 500 MB
Output fdisk untuk gambar distribusi asli:
Disk: trik-distro.img geometry: 893/64/63 [3604478 sectors] Signature: 0xAA55 Starting Ending
Setelah mengatur parameter, kami pergi minum beberapa cangkir teh, karena emulator tidak jauh lebih cepat daripada prosesor ARM nyata.
Untuk memulai sistem yang terinstal, Anda memerlukan gambar initrd lain, yang dapat diambil dari sini .
Kami memulai sistem:
qemu-system-arm -M versatilepb -kernel vmlinuz-3.2.0-4-versatile -initrd initrd.img-3.2.0-4-versatile -hda debian.img -append "root=/dev/sda1"
Pengaturan sistem
Setelah memulai, kita memasuki superuser, memeriksa koneksi ke Internet, memperbarui repositori dan sistem, menempatkan sekumpulan minimum program:
apt-get update apt-get upgrade apt-get install curl git mc htop joystick
Terminal
Kami mengedit /etc/inittab
, menghapus terminal yang tidak perlu, menyalakan UART yang kami butuhkan untuk kami dan menambahkan input otomatis untuk pengguna yang tepat (gunakan root hanya saat debugging). Input otomatis berguna jika Anda berencana menjalankan shell untuk kontrol pada controller.
1:2345:respawn:/sbin/getty 38400 tty1 --autologin root
Bluetooth dan wifi
Instal bluez-utils dan wpasupplicant untuk mengakses Wi-Fi dan Bluetooth.
apt-get install bluez-utils wpasupplicant
Kami menonaktifkan antarmuka eth0 dan mengkonfigurasi antarmuka wlan1 di /etc/network/interfaces
:
# /etc/network/interfaces -- configuration file for ifup(8), ifdown(8) # The loopback interface auto lo iface lo inet loopback # Wireless interfaces auto wlan1 iface wlan1 inet dhcp wireless_mode managed wireless_essid any wpa-driver wext wpa-conf /etc/wpa_supplicant.conf
Tambahkan jaringan terlebih dahulu ke /etc/wpa_supplicant.conf
, karena melakukan ini pada controller itu sendiri tidak begitu nyaman:
wpa_passphrase ssid password >> /etc/wpa_supplicant.conf
Jika Anda tidak memiliki akses Wi-Fi, Anda dapat menggunakan UART untuk konfigurasi lebih lanjut, tetapi perlu diingat bahwa secara default kernel menampilkan semua kesalahan ke terminal ini. Karena itu, selama operasi, pesan mendadak dari kernel atau layanan dapat mengganggu Anda.
Tambahkan skrip untuk mengaktifkan Bluetooth. Kali ini, ubah /etc/init.d/bluetooth
:
139: case $1 in start) echo 1 >> /sys/devices/virtual/gpio/gpio107/value 168: hciattach /dev/ttyS0 texas log_end_msg 0 ;;
Dengan demikian, semua layanan yang memerlukan layanan Bluetooth akan menjalankan perintah yang diperlukan untuk menginisialisasi.
Geser ke kiri, geser ke kanan
Kami menghapus program dan layanan yang tidak perlu yang dapat dilihat menggunakan htop, karena mereka menempati tempat yang berharga di RAM:

Dalam hal ini, layanan ConsoleKit memiliki banyak proses . Pindahkan file layanan ini ke folder root jika terjadi pemulihan:
mv /usr/share/dbus-1/system-services/org.freedesktop.ConsoleKit.service /root/
Sebelum mematikan layanan, konsumsi RAM adalah 19 MB, dan setelah - 16 MB.
Bagian sistem
Meskipun uBoot mentransfer ke kernel perangkat tempat partisi root berada, ada baiknya menuliskannya di /etc/fstab
untuk keandalan. Kami mengubah baris pertama yang bertanggung jawab untuk bagian root:
/dev/mmcblk0p1 / auto defaults 1 1 proc /proc proc defaults 0 0 devpts /dev/pts devpts mode=0620,gid=5 0 0 usbdevfs /proc/bus/usb usbdevfs noauto 0 0 tmpfs /run tmpfs mode=0755,nodev,nosuid,strictatime 0 0 tmpfs /var/volatile tmpfs defaults 0 0
Jika Anda tidak menjadikan partisi root sebagai yang pertama, jangan lupa untuk menentukan nomor partisi yang diinginkan.
Jika Anda meninggalkan partisi FAT kedua untuk data pengguna, maka Anda perlu membuat folder untuk memasang partisi di dalamnya
mkdir /usr/share/trik
dan tulis bagian di /etc/fstab
:
/dev/mmcblk0p2 /usr/share/trik vfat defaults 0 0
Tahap 6. Kami mencoba bubur kami
Setelah mengkonfigurasi gambar sistem, Anda harus memasangnya untuk menginstal modul kernel dan kernel itu sendiri:
di mana, NNNN = ukuran sektor * awal bagian. Ukuran sektor default adalah 512 byte.
Kami juga memasang distribusi asli:
fdisk -l trik-distro.img mount -o loop,offset=NNNN trik-distro.img /mnt/trik-clean
Kami menghapus kernel untuk QEMU dan modul-modulnya, seperti mereka tidak dimaksudkan untuk platform kami. Kami menyalin kernel dan modul baru, seperti pada distribusi asli.
rm -rf /mnt/debian/boot/ rm -rf /mnt/debian/lib/modules/3.2.0-4-versatile rm -rf /mnt/debian/lib/modules/3.2.0-5-versatile mkdir /mnt/debian/boot/ cp arch/arm/boot/uImage /mnt/debian/boot/ make INSTALL_MOD_PATH=/mnt/debian modules_install
Kami membutuhkan firmware untuk modul Wi-Fi, yang ada dalam distribusi asli di folder / lib / firmware dan firmware Bluetooth yang kami temukan sebelumnya.
cp /mnt/trik-clean/lib/firmware/* /mnt/debian/lib/firmware/ cp TIInit_7.6.15.bts /mnt/debian/lib/firmware/
Putuskan sambungan gambar disk:
umount /mnt/trik-clean umount /mnt/debian
Dan mulai menyalin gambar ke kartu memori menggunakan dd:
# ( ) lsblk dd if=debian.img of=/dev/sdX bs=4M
Tahap 7. Garis finish
Kami mengkompilasi program untuk menghubungkan gamepad pada sistem baru dan menginstal daemon sixad.
Kami menghubungkan gamepad melalui USB ke controller dan menjalankan program untuk membuat pasangan:
root@trik:~/bt
Ketika gamepad terhubung, tidak ada yang terjadi dan layanan keenam diam:
sixad-bin[2675]: started sixad-bin[2675]: sixad started, press the PS button now sixad-bin[2675]: unable to connect to sdp session
Namun komunitas Raspberry Pi telah membuat "penopang" untuk memperbaiki koneksi .
Kami membangun kembali program dan bersukacita.
sixad-bin[2833]: started sixad-bin[2833]: sixad started, press the PS button now sixad-bin[2833]: unable to connect to sdp session sixad-sixaxis[2836]: started sixad-sixaxis[2836]: Connected 'PLAYSTATION(R)3 Controller (00:**:**:**:**:09)' [Battery 02]
Sekarang gamepad tersedia untuk sistem sebagai perangkat input dan program jstest akan menunjukkan status semua tombol dan sensor analog:
root@trik:~# ls /dev/input/ by-path event0 event1 event2 event3 js0 js1 js2 mice root@trik:~# jstest --normal /dev/input/jsX Driver version is 2.1.0. Joystick (PLAYSTATION(R)3 Controller (00:**:**:**:**:09)) has 29 axes (X, Y, Z, Rx, Ry, Rz, Throttle, Rudder, Wheel, Gas, Brake, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, (null), (null), (null), (null), (null), (null), (null), (null)) and 17 buttons (Trigger, ThumbBtn, ThumbBtn2, TopBtn, TopBtn2, PinkieBtn, BaseBtn, BaseBtn2, BaseBtn3, BaseBtn4, BaseBtn5, BaseBtn6, BtnDead, BtnA, BtnB, BtnC, BtnX). Testing ... (interrupt to exit) Axes: 0: 0 1: 0 2: 0 3: 0 4: -7150 5: -7746 6:-32767 7: 0 8: 0 9: 0 10: 0 11: 0 12: 0 13: 0 14: 0 15: 0 16: 0 17: 0 18: 0 19: 0 20: 0 21: 0 22: 0 23: 0 24: 0 25: 0 26: 0 27: 0 28: 0 Buttons: 0:off 1:off 2:off 3:off 4:off 5:off 6:off 7:off 8:off 9:off 10:off 11:off 12:off 13:off 14:off 15:off 16:off
di mana X adalah nomor perangkat dalam sistem, secara default - 2. Jumlah tombol dan sumbu dapat dilihat di sini .
Gunakan dalam praktek
Video yang menampilkan gamepad di YouTube .
Tautan yang bermanfaat
Program untuk menghubungkan gamepad Dualshock 3 - sixpair dan sixad .
Untuk gamepad dan perangkat input lainnya, ada pustaka C yang ringan - libenjoy .
Kode sumber program untuk mengendalikan servomotors dan motor adalah repositori GitHub .
Semua file konfigurasi dari artikel untuk distribusi yang dibuat sendiri - repositori GitHub .
Sumber kernel adalah repositori GitHub .
Fakta menarik tentang controller
- Spesifikasi menyatakan bahwa RAM adalah 256 MB. Tetapi jika Anda menjalankan htop, Anda akan melihat bahwa hanya 128 MB yang tersedia. Ini dibatasi oleh opsi kernel yang dapat dilihat di konsol uBoot:
mem=128M console=ttyS1,115200n8 rw noinitrd rootwait root=/dev/mmcblk0p1 vt.global_cursor_default=0 consoleblank=0
Chip memori ditandai 3PC22 D9MTD yang diproduksi oleh Micron. Itu tidak mungkin untuk menemukan informasi tentang volume saat ini.
- uBoot disimpan pada memori flash SPI di mana kernel juga terhubung, dan tidak digunakan. Anda dapat mencoba menggunakan tempat ini untuk tugas-tugas Anda atau menyalin kernel baru dan mengkonfigurasi ulang uBoot sehingga menggunakannya.
Alamat gambar dari dmesg:
[ 11.598170] 0x000000000000-0x000000040000 : "uboot" [ 11.642985] 0x000000040000-0x000000080000 : "uboot-env1" [ 11.706256] 0x000000080000-0x0000000c0000 : "uboot-env2" [ 11.761827] 0x0000000c0000-0x000000100000 : "config-periph" [ 11.805129] 0x000000100000-0x000000400000 : "kernel" [ 11.861864] 0x000000400000-0x000001000000 : "RootFS"
- Layar pengontrol, meskipun kecil, sebenarnya memiliki sensor resistif. Apakah sensor itu sendiri terhubung tidak diketahui.
- Dualshock 3 memiliki LED di konektor USB yang menunjukkan jumlah gamepad / joystick. Ada satu gamepad di video, tetapi jumlahnya 3. Ini bukan kesalahan, karena ada dua "joystick" dalam sistem: accelerometer dan giroskop.
Terjadi masalah saat menggunakan
- Robot kadang-kadang hang ketat, tanpa mematikan servomotors, yang memungkinkan mereka untuk mengubah posisi mereka dari noise pada jalur data. Ini telah terlihat bahkan pada distribusi standar .
- Dimasukkannya pengontrol PWM berbeda dari apa yang tertulis dalam dokumentasi . Setidaknya dalam C murni ini tidak berhasil.
- USB terkadang berhenti bekerja pada Debian.