目次 †
概要 †
- BeagleBone
- Linuxが搭載可能
- Linuxから高速にAD入出力が可能(アナログ出力はPWM)
- USBホストあり
- OriginalとBlackの違い
- BeagleBoneとBeagleBoneBlack?がある.
- Originalは全てのピンが使えるが,BlackはHDMIとeMMC supportで予約されているピンがある.
- Beagle Bone Blackは内部のフラッシュにOSが入っているが,Beagle Boneはいっていない.SDからのみ.
導入 †
- OSインストール
- シリアル設定
- Macでは,Getting Startedが使えない.このコマンドが使える→sudo screen /dev/tty.usbserial-hogehogeB 115200 @ Bの方
- Windows8では,Getting Started参照.
- 固定IP設定
- ホストのネットワーク設定
- BeagleBoneのネットワークアドレスに属するIPを設定
- sshでログインできることを確認
ssh root@192.168.148.25
ログイン †
Serial †
Mac 10.9.4 †
sudo screen /dev/tty.usbserial-TIVAYAS4B 115200 # Bの方.
参考:screenコマンド †
- 終了:終わったら"[Ctr]+[a], [Ctr]+[\]"でQuit & Kill
- デタッチ:[Ctr]+[a], [Ctr]+[d]
- スクリーン一覧:screen -ls
- 再生:screen -r id(screen -r 12345など)
参考 †
ピンアサイン †
- BeagleBone
- GPIO: P8_3-P8_46とP9_11-P9_31とP9_41-P9_42
- AIN: P9_33とP9_35-40
- データシート(55ページらへん)
GPIO †
- GPIO0-GPIO3までのモジュールがある.
- どのモジュールの何ビット目がGPIOかは,データシート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の導入について †
APIの使い方 †
°サンプルプログラム
LEDチカチカ(OnBoard?) †
- いちいち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;
}
指令 †
User LEDs †
Beagle Boneのsysfsは遅い †
libgpiommap †
- ehayonさんが作ったGPIOライブラリを改変したもの
- digitalWriteとdigitalReadは,/dev/memを開くものなので,高速
- pinModeは,/sys/kernel/debug/omap_muxを開くので,低速
- 全ての関数で,/dev/memを開いていなければ開こうとする.initは必須ではないが,やらないと一番初めだけ遅くなる.
- インストール方法
- 転送
# 親機内
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/を書き換える方法 †
- 一回の書き換えに,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を使う方法 †
Tips †