raspberry pi / beaglebone black 高精度dmtimer

43
ソソソソソソソ ソソソソソソソソソソソソソソソソ 、。 ソソソソソソソソソソソソソソソソソソソソソソソソソソソ ソソソソ rti ソソソソソソソソソソソソソソソソソソソソ C++ ソソソソソソソソ PHP ソソソソソソソソソソI‘m CEO,Bitch! https://rti-giken.jp/

Upload: hiroyuki-fujie

Post on 05-Apr-2017

164 views

Category:

Technology


0 download

TRANSCRIPT

ソフト屋さんと、ネット屋さんとかをしていました。アーキテクトという肩書きで雑用係をやっていました。現在は、独立して rti 技研という会社をやっています。好きな言語は C++ サーバサイドでは PHP のお手軽さが好きです。I‘m CEO,Bitch!       https://rti-giken.jp/

自己紹介

フューチャーホームコントローラー

手に何も持たないハンズフリーの音声認識を提供します。手ぶらの音声認識を提供します。言葉でしゃべるだけです。

マイクまで 1m ~ 2m 程度の距離でも動作します。マイクを部屋の中央におけば全部をカバーします。

スマートフォンから「も」操作することもできます。

開発時の取材・掲載

取材・掲載

マルチデバイス HTML5 対応

スマホPC

設定はブラウザから簡単にできます。

・非インターネットの環境でも動く

・雑音が多い場所でも 認識するアルゴリズムを開発

・誤動作を起こしにくいアルゴリズムを開発

・ arm でも動作する身軽さ

オープンソースをベースに開発した音声認識エンジン

いろいろなリモコンを学習できる賢い学習リモコンエンジン

フューチャーホームコントローラー

様々なカスタマイズ

ユーザ : スマートウォッチ Pebble 連携

http://www.nicovideo.jp/watch/sm20654023

ユーザ : vim から家電操作

http://www.youtube.com/watch?v=Uqm8sYyzwO8

ユーザ :Ring と連動

ユーザ : 認識単語を呪文で家を操作

私の作品 : 家 mount

ls -la /mnt/drwxr-xr-x 5 root root 0 1 月 1 1970 .drwxr-xr-x 23 root root 4096 12 月 8 15:39 ..drwxr-xr-x 7 root root 0 1 月 1 1970 エアコンdrwxr-xr-x 4 root root 0 1 月 1 1970 照明drwxr-xr-x 4 root root 0 1 月 1 1970 扇風機

体の不自由な方の介護機器として

V8(javascript) で機能を拡張できます。 ( 上級者向け機能 )

ブラウザから javascript で、家をプログラミングすることができます。

音声認識のホームコントローラー FHC キャンペーン価格で提供中https://rti-giken.jp/ 定価 : 26800 円

Raspberry PiBeaglebone black高精度 DMTIMER

マイクロ秒単位のGPIO 割り込みを取りたい

例えば、赤外線リモコンの学習とか。

赤外線リモコンの信号は 10 マイクロ秒単位

汎用の IR 受信モジュール使うと38khz しか取れない問題がある

世の中にはわざと少し変わった周波数を出すリモコンがあったり・・・

それじゃあ、自前で解析しよう

そのためには、10 マイクロ秒の割り込みをとらないといけない。

以下のメモリにタイマーがあるので読みましょう .ボード メモリ位置 バイト長beaglebone    0x4804003C 4バイトraspberry pi2-3 0x3F003004 4 バイト

raspberry pi 2-3 0x3F003004 4 バイトunsigned int 値で、オーバーフローすると 0 に戻る .前回の計測値と比較すれば、処理時間がわかる。raspberry pi は 10 マイクロ秒で、beaglebone は、クロック秒だと思われる ( 多分 )

実測してみよう

Sleep 1 秒 しながら値表示rti@raspberrypi:~ $ sudo ./a.outTimer = 289602805Timer = 290603260Timer = 291603371Timer = 292603500 ↑ ↑ 秒 ms

実装方法実例

もし、User Land で書いているなら・・・

//user land raspberry pi 2-3int g_fd = open("/dev/mem", O_RDWR | O_SYNC); unsigned int* g_mmap = ( unsigned int*) mmap(NULL, 0x100, PROT_READ,MAP_SHARED,g_fd, 0x3F003000);

unsigned int* g_timer = &g_mmap[0x4/sizeof(int)]; //0x3F003004

// 一番オーバーヘッドを生まないマクロ展開で読む#define dmtimer_get() (*g_timer)

printf("timer: %u\n", dmtimer_get() ); close(g_fd);

もし、Kernel Land で書いているなら・・・

//kernel land raspberry pi 2-3void *g_timer = ioremap(0x3F003004,4); //raspberry pi

// 一番オーバーヘッドを生まないであろう// マクロ展開で読みだす . #define dmtimer_get() ((unsigned int)ioread32(g_timer))

printk(KERN_ALERT "timer: %u\n", dmtimer_get() ); iounmap(g_timer);

時刻の観測は、ここを読めばいいだけボード メモリ位置 バイト長beaglebone    0x4804003C 4バイトraspberry pi 2-3 0x3F003004 4 バイト

タイマーはわかった。では、 GPIO の入力の観測方法は?

UserLand単純に while(1){} ループを回すのも手。

KernelLandgpio_to_irqrequest_any_context_irq

kernel land だと、 gpio を irq 割り込みに変換 (?) する機能がある。

err = gpio_to_irq(IR_RECV_GPIO_PIN);err = request_any_context_irq( IRRecvIRQ, test_irq_latency_interrupt_handler, IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING | IRQF_NOBALANCING | IRQF_IRQPOLL , DRV_NAME, NULL);

static irqreturn_ttest_irq_latency_interrupt_handler(int irq, void* dev_id){//GPIO 割り込みがあったらコールされる}

注意点ミリ秒以下の世界なので、CPU の動作クロックが省電力モードになると、数字が変わることが有ります。注意しましょう。

音声認識のホームコントローラー FHC キャンペーン価格で提供中https://rti-giken.jp/ 定価 : 26800 円