*目次 [#h3a27dc7] #contents *概要 [#d249131f] -BeagleBone --Linuxが搭載可能 --Linuxから高速にAD入出力が可能(アナログ出力はPWM) --USBホストあり -OriginalとBlackの違い --BeagleBoneとBeagleBoneBlackがある. --Originalは全てのピンが使えるが,BlackはHDMIとeMMC supportで予約されているピンがある. --Beagle Bone Blackは内部のフラッシュにOSが入っているが,Beagle Boneはいっていない.SDからのみ. *導入 [#t4376ca5] -OSインストール --OSは[[ここ>http://www.elinux.org/Beagleboard:BeagleBone]]のAngstrom for BeagleBoneを[[dd]]コマンドでSDカードに書き込み sudo fdisk -l sudo dd if=BeagleBone_Rev_A6_Production_06_18_2012.img of=/dev/sdb1 bs=10M -シリアル設定 --Macでは,Getting Startedが使えない.[[screen]]コマンドが使える→sudo screen /dev/tty.usbserial-hogehogeB 115200 @ Bの方 --Ubuntuでは,Getting Startedが使えない.[[screen]]コマンドが使える→sudo screen /dev/ttyACM0 115200 --Windows8では,Getting Started参照. -固定IP設定 --シリアルでBeagleBoneのターミナルに入る. --conmannによるネットワーク設定(''/etc/network/interfacesでは設定不能なので注意''.connmanを利用した特殊なネットワーク形式を採用している) ls /var/lib/connman/ #ethernet_xxxxxxxxxxx_cableをメモ /usr/lib/connman/test/set-ipv4-method ethernet_xxxxxxxxxxx_cable manual 192.168.149.25 255.255.255.0 192.168.149.254 # アドレス,ネットワークマスク,ゲートウェイの順番 /usr/lib/connman/test/set-nameservers ethernet_xxxxxxxxxxx_cable 8.8.8.8 8.8.4.4 # nameserverが複数あれば列挙 --[[udhcpdによるネットワーク設定>BeagleBone#t320508d]](conmannがない場合は、こっちが動いている。) -ホストのネットワーク設定 --BeagleBoneのネットワークアドレスに属するIPを設定 --sshでログインできることを確認 ssh root@192.168.148.25 *ログイン [#t3e67784] **Serial [#v570126c] ***Windows [#q3786bd1] -Tera Termをインストール -シリアル→OK→設定→シリアルポート→ '115200' Bits per second, '8' Data bits, 'None' Parity, '1' Stop Bits, 'None' Flow control and press ***Mac 10.9.4 [#o447c53e] sudo screen /dev/tty.usbserial-TIVAYAS4B 115200 # Bの方. **Ethernet [#ee82d885] ***Windows [#q38bbfd0] -[[固定IP>http://home.wakatabe.com/ryo/wiki/index.php?Windows#navigator]]の設定 --BeagleBoneに設定したネットワークマスクを共有するIPアドレスを設定する(BeagleBoneが192.168.149.25でマスクが255.255.255.255なら、192.168.149.1など) -Tera Term→TCP/IP→ホスト:192.168.149.25→OK→ユーザ名root→OK ***Mac 10.9.4 [#t7dc1b0a] -ネットワーク設定→追加(+ボタン)→設定→BeagleBoneに設定したネットワークマスクを共有するIPアドレスを設定する(BeagleBoneが192.168.149.25でマスクが255.255.255.255なら、192.168.149.1など) -Terminalでssh root@192.168.149.25 **参考:screenコマンド [#mda84d95] -終了:終わったら"[Ctr]+[a], [Ctr]+[\]"でQuit & Kill -デタッチ:[Ctr]+[a], [Ctr]+[d] -スクリーン一覧:screen -ls -再生:screen -r id(screen -r 12345など) *参考 [#w6460a37] -[[ものすごく低位から頑張っているブログ>http://beagle1.blog.so-net.ne.jp/2011-06-05]] -[[C言語@BBBのサンプルコード>http://d.hatena.ne.jp/rti7743/20131219/1387447643]] -[[BeagleBoneの基本的なサンプルコード>http://www.cs.gunma-u.ac.jp/~nagai/wiki/index.php?BeagleBone%20%A4%CE%BB%C8%A4%A4%CA%FD]] *ピンアサイン [#jc78a356] -BeagleBone --GPIO: P8_3-P8_46とP9_11-P9_31とP9_41-P9_42 --AIN: P9_33とP9_35-40 --[[BBOriginalデータシート>https://github.com/CircuitCo/BeagleBone-RevA5/blob/master/BeagleBone_revA5_SRM.pdf?raw=true]](55ページらへん) --[[BBBデータシート>http://www.adafruit.com/datasheets/BBB_SRM.pdf]] &ref(./BBBlackGPIOMap.png,50%); -より詳細な表 --[[P8>http://www.embedded-things.com/wp-content/uploads/2013/08/P8.png]] --[[P9>http://www.embedded-things.com/wp-content/uploads/2013/08/P9.png]] *SPI [#g6bd8d36] -BBBのピン --SPI0: CS0 P9_17, MISO P9_21, MOSI P9_18, SCLK P9_22(MOSI, MISOはソフトで交換可能) --SPI1: CS0 P9_28, CS1 P9_42, MISO P9_29, MOSI P9_30, SCLK P9_31(MOSI, MISOはソフトで交換可能) ---''NOTE: You CAN NOT use SPI1 on the BeagleBone Black WITHOUT disabling the HDMI interface'' -[[MOSIとMISOはソフトで変更可能>http://elinux.org/BeagleBone_Black_Enable_SPIDEV#Enabling_SPIDEV_with_Cape_Manager]] -[[Pythonのライブラリ>https://github.com/alexanderhiam/PyBBIO/wiki/SPI]] -[[CでSPI0>http://mytoolbox.sakura.ne.jp/wp/?p=171]], [[CでSPI1>http://elinux.org/BeagleBone_Black_Enable_SPIDEV#Enabling_SPIDEV_with_Cape_Manager]] *リアルタイムOSの導入について [#j8bee116] -[[yonekenさんのページ>http://blog.livedoor.jp/k_yon/archives/52499027.html]] *APIの使い方 [#j0b5e89b] -[[PIOとAIO両方>http://d.hatena.ne.jp/rti7743/20120603/1338686912]] -[[Arduino風プログラム>https://github.com/justjoheinz/beagleboneIO/]] °サンプルプログラム **LEDチカチカ(OnBoard) [#de9567a8] -いちいちCloseしないと反映されなかった. #include <iostream> #include <stdio.h> using namespace std; int main() { FILE *LEDHandle = NULL; const char *LEDBrightness = "/sys/class/leds/beaglebone::usr3/brightness"; for (int i = 0; i < 10; i++) { if (( LEDHandle = fopen( LEDBrightness, "r+")) != NULL ) { fwrite("1", sizeof(char), 1, LEDHandle); fclose(LEDHandle); } sleep(1); if (( LEDHandle = fopen( LEDBrightness, "r+")) != NULL ) { fwrite("0", sizeof(char), 1, LEDHandle); fclose(LEDHandle); } sleep(1); } return 0; } *指令 [#o6934800] **User LEDs [#o05b120f] -トリガー確認 --UserLEDは,CPUやメモリカードアクセスによってトリガーされて光る --信号によってトリガーされるかは,catで確認できる. cat /sys/class/leds/beaglebone::usr[数字]/trigger -トリガー設定 --例えばトリガーなしでUserLEDsを自分で制御したい場合は,echoでtriggerにnoneを設定する echo none > /sys/class/leds/beaglebone::usr[数字]/trigger -出力設定 --UserLEDsの電圧を設定する場合は,echoでbrightnessに値を設定する(0でLOW,それ以外でHIGH) echo 0 > /sys/class/leds/beaglebone:green:usr0/brightness *GPIO [#cf3495e5] **GPIOピン配置 [#j138ff1a] -GPIO0-GPIO3までのモジュールがある. --どのモジュールの何ビット目がGPIOかは,[[データシート>https://github.com/CircuitCo/BeagleBone-RevA5/blob/master/BeagleBone_revA5_SRM.pdf?raw=true]]55ページのMode7で見てとれる.(gpio3[17]なら,GPIO3の17bit目.) --モジュールのそれぞれに先頭アドレスがある. #define GPIO0_BASE 0x44E07000 #define GPIO1_BASE 0x4804C000 #define GPIO2_BASE 0x481AC000 #define GPIO3_BASE 0x481AE000 #define GPIO_SIZE 0x00000FFF --先頭アドレスに以下のbitを足したアドレスから,重要な3つのアドレス空間がある #define GPIO_OE 0x134 // PINのInputかOutputかを設定 #define GPIO_SETDATAOUT 0x194 // このアドレスのbitに1を代入することで,PinをHIGHにする. #define GPIO_CLEARDATAOUT 0x190 // このアドレスのbitに1を代入することで,PinをLOWにする. --OEの設定 ---n bit目のピンは,*gpio_oe_addr & (1<<n)が,0なら出力で1なら入力 --STARTDATAOUTとCLEARDATAOUTの設定 ---*gpio_setdataout_addr &= (1 << n); ---*gpio_cleardataout_addr &= (1 << n); **sysfs [#r0dfefbd] -GPIOを1回変えるだけで,0.1msもかかる! **BBBIOlib [#x62f767a] -[[https://github.com/VegetableAvenger/BBBIOlib]] -[[リンク>https://github.com/VegetableAvenger/BBBIOlib]] ** libgpiommap [#g0fb84b5] -[[ehayonさんが作ったGPIOライブラリを改変したもの>https://github.com/hamko/BeagleBone-GPIO]] --digitalWriteとdigitalReadは,/dev/memを開くものなので,高速 --pinModeは,/sys/kernel/debug/omap_muxを開くので,低速 --全ての関数で,/dev/memを開いていなければ開こうとする.initは必須ではないが,やらないと一番初めだけ遅くなる. -[[インストール方法>https://github.com/hamko/BeagleBone-GPIO/blob/master/README.md]] --転送 # 親機内 git clone https://github.com/hamko/BeagleBone-GPIO scp -r BeagleBone-GPIO-master root@beaglebone:~ --コンパイルとインストール # Beagle Board内 cd BeagleBone-GPIO make install --サンプル cd ~/BeagleBone-GPIO gcc -Isrc main.c -lgpiommap ./a.out #ピカピカ光る **/dev/mem/をmmapで直だたき [#k53b696a] -一回の書き換えに,250nsくらい. -http://stackoverflow.com/questions/13124271/driving-beaglebone-gpio-through-dev-mem --注意点:GPIO Driverとコンフリクトする可能性. -LEDチカチカ(BeagleBoneWhiteで動作確認済み) --beaglebone_gpio.h #ifndef _BEAGLEBONE_GPIO_H_ #define _BEAGLEBONE_GPIO_H_ #define GPIO1_START_ADDR 0x4804C000 #define GPIO1_END_ADDR 0x4804DFFF #define GPIO1_SIZE (GPIO1_END_ADDR - GPIO1_START_ADDR) #define GPIO_OE 0x134 #define GPIO_SETDATAOUT 0x194 #define GPIO_CLEARDATAOUT 0x190 #define USR0_LED (1<<21) #define USR1_LED (1<<22) #define USR2_LED (1<<23) #define USR3_LED (1<<24) #endif --gpiotest.c(拡張子はcでないとコンパイルできない) #include <stdio.h> #include <stdlib.h> #include <sys/mman.h> #include <sys/stat.h> #include <fcntl.h> #include "beaglebone_gpio.h" int main(int argc, char *argv[]) { volatile void *gpio_addr = NULL; volatile unsigned int *gpio_oe_addr = NULL; volatile unsigned int *gpio_setdataout_addr = NULL; volatile unsigned int *gpio_cleardataout_addr = NULL; unsigned int reg; int fd = open("/dev/mem", O_RDWR); printf("Mapping %X - %X (size: %X)\n", GPIO1_START_ADDR, GPIO1_END_ADDR, GPIO1_SIZE); gpio_addr = mmap(0, GPIO1_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, GPIO1_START_ADDR); gpio_oe_addr = gpio_addr + GPIO_OE; gpio_setdataout_addr = gpio_addr + GPIO_SETDATAOUT; gpio_cleardataout_addr = gpio_addr + GPIO_CLEARDATAOUT; if(gpio_addr == MAP_FAILED) { printf("Unable to map GPIO\n"); exit(1); } printf("GPIO mapped to %p\n", gpio_addr); printf("GPIO OE mapped to %p\n", gpio_oe_addr); printf("GPIO SETDATAOUTADDR mapped to %p\n", gpio_setdataout_addr); printf("GPIO CLEARDATAOUT mapped to %p\n", gpio_cleardataout_addr); reg = *gpio_oe_addr; printf("GPIO1 configuration: %X\n", reg); reg = reg & (0xFFFFFFFF - USR1_LED); *gpio_oe_addr = reg; printf("GPIO1 configuration: %X\n", reg); printf("Start blinking LED USR1\n"); while(1) { printf("ON\n"); *gpio_setdataout_addr= USR1_LED; sleep(1); printf("OFF\n"); *gpio_cleardataout_addr = USR1_LED; sleep(1); } close(fd); return 0; } **PRUを使う方法 [#u513cde4] -http://mitaka1954.cocolog-nifty.com/blog/2014/03/beaglebone-blac.html *Tips [#yf233bd4] -可変CPU速度をやめる sudo cpufreq-set --min 1GHz *Appendix [#eacf418d] **udhcpdによるネットワーク設定 [#t320508d] -conmannすらない場合の固定IP設定方法 -network設定は以下の三つ --/etc/network/interfaces(有線の設定、個々のネットワークに応じて設定すること) # The loopback network interface auto lo iface lo inet loopback #The primary network interface auto eth0 allow-hotplug eth0 iface eth0 inet static address 192.168.149.101 netmask 255.255.255.0 gateway 192.168.0.4 dns-nameservers 192.168.149.5 # Ethernet/RNDIS gadget (g_ether) # ... or on host side, usbnet and random hwaddr # Note on some boards, usb0 is automaticly setup with an init script #auto usb0 iface usb0 inet static address 172.16.0.2 netmask 255.240.0.0 --/opt/scripts/boot/am335x_evm.sh(USB接続のDHCP初期設定と、USB接続の設定。クラスBのローカルIPを使っていなければ以下をそのまま置き換える) if [ ! -f /etc/udhcpd.conf ] ; then echo "start 172.16.0.1" > /etc/udhcpd.conf echo "end 172.16.0.1" >> /etc/udhcpd.conf echo "interface usb0" >> /etc/udhcpd.conf echo "max_leases 1" >> /etc/udhcpd.conf echo "option subnet 255.240.0.0" >> /etc/udhcpd.conf fi /etc/init.d/udhcpd restart /sbin/ifconfig usb0 172.16.0.2 netmask 255.240.0.0 /usr/sbin/udhcpd -S /etc/udhcpd.conf --/etc/udhcpd.conf(USB接続のDHCP設定。クラスBのローカルIPを使っていなければ以下をそのまま置き換える) start 172.16.0.1 end 172.16.0.1 interface usb0 max_leases 1 option subnet 255.240.0.0 --/etc/resolv.conf(有線の設定とルータの設定) domain xx.co.jp search xx.co.jp nameserver 192.168.?.? **XenomaiによるリアルタイムOS化 [#s72dd561] -http://brunosmartins.info/xenomai-on-the-beaglebone-black-in-14-easy-steps/ |