• 追加された行はこの色です。
  • 削除された行はこの色です。
*目次 [#h3a27dc7]
#contents

*概要 [#d249131f]
-BeagleBone
--Linuxが搭載可能
--Linuxから高速にAD入出力が可能(アナログ出力はPWM)
--USBホストあり
-種類
-Originalと
--BeagleBoneとBeagleBoneBlackがある.
--Originalは全てのピンが使えるが,BlackはHDMIとeMMC supportで予約されているピンがある.
--Beagle Bone Blackは内部のフラッシュにOSが入っているが,Beagle Boneはいっていない.SDからのみ.

*導入 [#t4376ca5]
-[[公式ドキュメント>http://beagleboard.org/getting-started]]
-Beagle Bone Blackは内部のフラッシュにOSが入っているが,Beagle Boneははいっていない.SDからのみ.
--例えばBeagle Bone Originalの場合,OSは[[ここ>http://www.elinux.org/Beagleboard:BeagleBone]]
-OSインストール
--OSは[[ここ>http://www.elinux.org/Beagleboard:BeagleBone]]のAngstrom for BeagleBoneをddコマンドでSDカードに書き込み
-シリアル設定
--Macでは,Getting Startedが使えない.このコマンドが使える→sudo screen /dev/tty.usbserial-hogehogeB 115200 @ Bの方
--Windows8では,Getting Started参照.
-ネットワーク設定
--not yet

*ログイン [#t3e67784]
**Serial [#v570126c]
***Mac 10.9.4 [#o447c53e]
 sudo screen /dev/tty.usbserial-TIVAYAS4B 115200 # Bの方.
**参考: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
--[[データシート>https://github.com/CircuitCo/BeagleBone-RevA5/blob/master/BeagleBone_revA5_SRM.pdf?raw=true]](55ページらへん)

&ref(./BBBlackGPIOMap.png,30%);

*GPIO [#ieee4879]
-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);



*リアルタイム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]
-/sys/class/leds/beaglebone::usr{数字}/trigger
--UserLEDが,どのような信号によってトリガーされるか(割り込みで)
--catすると,現在何によって割り込みトリガーされるかを表示する.
 cat /sys/class/leds/beaglebone::usr[数字]/trigger
--自分で制御したい場合はtriggerにnoneを設定する
 echo none > /sys/class/leds/beaglebone::usr[数字]/trigger
-/sys/class/leds/beaglebone::usr[数字]/brightness
--書き換えると,GPIOの電圧を設定(0でLOW,それ以外でHIGH)
 echo 0 > /sys/class/leds/beaglebone:green:usr0/brightness

*Beagle Boneのsysfsは遅い [#cf3495e5]
-GPIOを1回変えるだけで,0.1msもかかる!
** 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 main.c -lgpiommap
 ./a.out #ピカピカ光る

**/dev/mem/を書き換える方法 [#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


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS