*目次 [#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/

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS