目次

概要

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

導入

  • OSインストール
  • シリアル設定
    • 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/conmann/ #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によるネットワーク設定(conmannがない場合は、こっちが動いている。)
  • ホストのネットワーク設定
    • BeagleBoneのネットワークアドレスに属するIPを設定
    • sshでログインできることを確認
      ssh root@192.168.148.25

ログイン

Serial

Windows

  • Tera Termをインストール
  • シリアル→OK→設定→シリアルポート→ '115200' Bits per second, '8' Data bits, 'None' Parity, '1' Stop Bits, 'None' Flow control and press

Mac 10.9.4

sudo screen /dev/tty.usbserial-TIVAYAS4B 115200 # Bの方.

Ethernet

Windows

  • 固定IPの設定
    • 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

  • ネットワーク設定→追加(+ボタン)→設定→BeagleBoneに設定したネットワークマスクを共有するIPアドレスを設定する(BeagleBoneが192.168.149.25でマスクが255.255.255.255なら、192.168.149.1など)
  • Terminalでssh root@192.168.149.25

参考:screenコマンド

  • 終了:終わったら"[Ctr]+[a], [Ctr]+[\]"でQuit & Kill
  • デタッチ:[Ctr]+[a], [Ctr]+[d]
  • スクリーン一覧:screen -ls
  • 再生:screen -r id(screen -r 12345など)

参考

ピンアサイン

BBBlackGPIOMap.png

  • より詳細な表

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

  • トリガー確認
    • 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

Beagle Boneのsysfsは遅い

  • GPIOを1回変えるだけで,0.1msもかかる!

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

  • 可変CPU速度をやめる
    sudo cpufreq-set --min 1GHz

Appendix

udhcpdによるネットワーク設定

  • 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化


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