Hatena::ブログ(Diary)

作業記録/備忘録(仮) このページをアンテナに追加 RSSフィード

2015/01/21

CAN通信させてみた(BeagleBoneBlack-RaspberryPi 間) - その1(1/3)

概要

BeagleBoneBlackとRaspberryPiの間でCANを利用した簡易通信実験ができるようになるまでに必要な情報をまとめた。
ほぼ先人の情報を参考にしてできたので、内容的には、その際に使用した参考にしたサイトを中心に紹介し、自分で実際にやってみて、間違えたところやうまくいかなかったところ、気づいた点などの情報を追記する形式とした。
初回は、CANのプロトコル仕様について。

背景

モータードライバをCANでコントロールする必要に迫られ、とりあえずCANってどういう仕様?というお勉強から、具体的に動かすために何が必要か(エレキ、ソフトウェア)の調査、実際に作ってみて・buildして実験まではできたので、それをまとめてみることにした。

環境

PC: Ubuntu14.04 64bit (RasPi kernelのクロスコンパイル用)

仮想系。母艦はMacBookProのVirtualBoxWindows8.1のVMwarePlayer

ロジックアナライザ: LogicCube(LAP-C16032)

StrawberryLinuxや秋月などで10k-12kほどで買えます。マルツでも買えるけどプローブが2個しかついてないみたい。
(マルツの方が安いのでプローブ持ってる人/使わない人は、そちらでいいかも)

リンク

まずは、CANの仕様について以下のサイトでお勉強してみた。
序章含めて全7回分あり、以下の4回を中心に読み進めた。

上記サイトから、CANの特徴を表し重要と感じたキーワードをピックアップすると以下。
使う分には、ざっくりと以下の意味と背景を知り、トラブルが発生した時にキーワードが思い出せれば最初の段階としてはいいのではなかろうか。(と勝手に思ってる)

感想としては、基本的には、IDとデータがあれば通信できると理解。
それをうまく動かす工夫として、ドミナントの意味と背景、ビットスタッフィングルールとエラー処理あたりがよく考えられてるなぁと感じた。
2線式だが低速の時は、1本切れても通信できたりも。

次回は、RasPi側のCANエレキ、ソフトの準備などについて記載予定。徐々にまとめる予定。

2014/08/29

BBB(Ubuntu12.04)で11ac WLANアダプタを利用する

概要

BeagleBoneBlack(BBB)で802.11ac無線LANアダプタ(WDC-867U3/添付写真も参照)を使えるようにする。
f:id:nihohi:20140830000803p:image:w240

背景

ある探査ロボットを遠隔無線操縦し、画像転送を行う必要があり、帯域を広めに利用したかった。
BBB用に、.11ac WLANドライバをbuildしたので、そのdriverと使い方を公開する。ドライバのbuild方法は後日記載予定。

環境

BeagleBoneBlack(BBB) Ubuntu 12.04

WLAN adaptor:ELECOM WDC-867U3

使い方

8812au.koをdownloadする。
https://github.com/nihohi0428/11ac_driver_for_BBB/tree/master

$ sudo cp 8812au.ko /lib/modules/3.8.13-bone30/kernel/net/wireless/
$ sudo chmod 644 /lib/modules/3.8.13-bone30/kernel/net/wireless/8812au.ko 
$ sudo /sbin/depmod -a 3.8.13-bone30

WLANアダプタを刺す。

$ sudo modprobe 8812au

11acとして使えてることが分かる。

$ sudo iwconfig
wlan0     IEEE 802.11AC  ESSID:"xxxxx"  Nickname:"xxxxx"
          Mode:Managed  Frequency:5.5 GHz  Access Point: DC:FB:02:xx:yy:zz
          Bit Rate:867 Mb/s   Sensitivity:0/0  
          Retry:off   RTS thr:off   Fragment thr:off
          Encryption key:****-****-****-****-****-****-****-****   Security mode:open
          Power Management:off
          Link Quality=100/100  Signal level=-45 dBm  Noise level=0 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

lo        no wireless extensions.

eth0      no wireless extensions.

rename4   unassociated  Nickname:"xxxxx"
          Mode:Managed  Frequency=2.412 GHz  Access Point: Not-Associated   
          Sensitivity:0/0  
          Retry:off   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:off
          Link Quality=0/100  Signal level=0 dBm  Noise level=0 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

buildの仕方

  • (後日記載予定)

2014/05/20

今後の更新予定/備忘

  • (自分向け。見たときに思い出せるように)

決意/方針

  • ドタバタしてていろいろ放置気味だったので、完璧に仕上がらなくても一部でも知見を共有できるように徐々に更新して行こう...。
    • 「あっ、と気付いたこと」、「心に引っ掛かったこと」、「これ知ってると便利なのに」、や、「面白い/愉快と感じたこと」を中心に。
    • 無理に分野に分けるより、上記分類でタグ付けた方が自分の中ではわかりやすいかも。
    • あと、これらの一見異なるものがすべてリンクしているというのも表明できると面白いかも。
公開方法/内容について
  • githubとも連携していくかな。
  • 月面ローバー開発の話とかとpythonの話も盛り込めるといいな
    • pycon行く余裕あればネタに出来るかしら)
  • プログラム以外の方向も少し織り込む? 炎上しやすそう...

ソフトウェア技術ネタ

今後ぼちぼちアップして行こう

  • Qt5つかってみた
  • ZMQつかってみた
  • 802.11acドライバ構築まとめ on BBB --> github
  • BBBでシリアル通信(2014/06/03 済)
  • AndroidでGPSで距離計測アプリつくってみた/.11acの到達距離計測ロガー --> github/google playにも置く?
  • 3D mapping / SfM
  • ステレオマッチング/OpenCV
  • MEMS LRF
  • インターフェースデザインの在り方
  • 設計のはなし

実験ネタ

  • .11ac距離計測
  • 月面探査ローバー開発の話
  • 鉱山跡探訪
  • 砂鉄が良く取れるところ
  • 自宅製鉄実験

社会ネタ? 生活ネタ? 考え方?

  • 資本主義について
  • 科学と宗教、哲学
  • 心理の話、心の動きの話
  • 興味のある本/著者の紹介(文・理・芸術問わず)
  • コンサート(クラシック)、美術館、博物館情報
  • 知財の話
  • 合気道の話
  • カーリング部の話
  • ハクトの話
  • 問題解決の心構えの話/debug含む
  • 問題解決と課題設定の違いの話
  • レイヤー的考え方/OSIなど通信プロトコル含む
  • 要求と仕様と設計の違いについて/いっしょくたにされることが多い。分析と構築の話でもいいかも。
  • 分析的アプローチとは異なる方法の課題抽出、問題特定、及び課題・問題解決アプローチについて
  • 自己複製について/物理的個体・物理的集団の自己複製、考え方・文化・振る舞いの自己複製

シリアル通信(RS232C/422A/485)の特徴まとめ

概要

  • Beagle Bone Black(以下BBB)/Ubuntu 12.04でのシリアル通信利用方法(RS232C/485)とその際に利用したRS232C-485コンバータのまとめ。(動作実績品ということで)

背景

  • BBBでモータードライバとシリアル通信する際にRS232Cだけでなく、RS485も使うことになったので、シリアル通信の整理と、サンプルコード、その際に利用したコンバータの情報などを整理しておきたいと思ったため。

環境

// 書く

RS232C/422A/485の特徴

  • RS485はRS422Aの上位互換があるらしい。(RS485が改良版)


規格最大伝送速度最大ケーブル長接続形式
RS232C 20kbps 15m 1:1
RS422A 10Mbps 1200m 1:N (Nmax:10)
RS485 10Mbps 1200m N:N (Nmax:32)

コンバータ

// RS232C<->RS485のコンバータ。BBBで動作実績あり。写真も。

コード

// 書く

2012/03/10

androidをリモートコントロール

PCから、ネットワーク越しにAndroidをリモート操作し、以下を行った。

  • トースト通知表示
  • カメラで写真撮影
  • センサ情報の取得

Androidでは、SL4Aのサーバを起動し、PCからpythonを使って、そのサーバ越しに上記操作を行った。

以下のサイトを参考にして作業を行った。

  1. AndroidFacadeAPIセンサー
  2. RemoteControl How to control the device while running scripts on your computer
  3. SL4A+PythonでAndroidをリモートコントロール

androidをノートPCに無線接続(帰属)

Windows7のノートPCをアクセスポイントにして、そこにAndroidを無線接続(帰属)させた。
また、開発環境は、Windows7のVM上のLinux(Ubuntu10.04)であったため、Windows上でルーティング解決が必要であった。

  1. アクセスポイント(AP)モードで起動可能な無線LANアダプタを用意する。
  2. APモードで起動する。
    • 「クライアントマネージャ」を起動し、「携帯電話を接続する」を選択する。すると、アクセスポイントモードで起動できる。
    • 適当に編集する。
    • 例えば、SSIDにunpopo,チャネルを13,認証タイプをWPA2-PSK,暗号化タイプをTKIP,WPAプリシェアドキーをhogefugahogefugaなど。
    • SSID,WPAプリシェアドキーは後でandroid端末から帰属させるのに必要である。
  3. Android端末をAPに帰属させる。
    • 自分が持っている端末(N-06C)だと、設定->無線とネットワーク->Wi-Fi設定で設定できる。
    • 先のAPが見えているはずなので、パスワードにプリシェアドキーと同じ文字を入れる。
  4. 接続後、先の画面でもう一度APをタップすると、IPアドレスが表示される。
    • windows7のコマンドプロンプトなどからpingでも打って導通することを確認しておく。
    • 自分はwindows7上の仮想系Linuxからだったので以下のルーティング設定が必須だった。

ルーティング設定

※必要ない時は読み飛ばして可

  1. fowardingの有効化
    • サービスの"Routing and remote Access"で右クリック、"開始"をする。
    • ipconfig /allしたときに、"IPルーティング有効"が"はい"になっていることを確認する。
  2. 仮想ネットワークの追加
    • VMwarePlayerでハードウェアで、"ネットワークアダプタ"を追加し、"NAT"で接続する。
    • もともとあったネットワークアダプタはそのまま(ブリッジ)にした。
  3. ルーティング設定

linuxのアドレスが192.168.28.1で、192.168.28.0/24ネットワーク(eth1)、Androidが192.168.100.0/24ネットワークであったので、Linuxにルーティング設定した。

$ sudo ip route add 192.168.100.0/24 via 192.168.28.1 dev eth1

android端末でSL4Aのサーバを動かす

  1. サーバ起動
    • SL4Aをインストール後、起動。メニュー画面を開きView->Interpretersを開く。
    • さらにメニュー画面を開き、StartServer->Publicを開く。
    • このとき、Publicの場合、帰属しているIPでサーバが立ち上がる。(Privateだとlocalhost/127.0.0.1で立ち上がる。)
    • 画面上部の通知領域にアイコンが出るのでそれを開く。IPアドレスとポート番号が表示されるの控えておく。例えば、192.168.100.2:42378など。リモート操作時に必要。

PCからandroidをリモート操作準備

  1. 接続サーバのIP,ポート番号を環境変数に設定する。
$ export AP_HOST=192.168.100.2
$ export AP_PORT=42378
  1. androidリモートコントロール用のscriptを用意する。

android.pyをダウンロードする。
(中を見るとAndroidクラスの__init__()でsocket作ってる。コンストラクタで接続先を指定されない時に環境変数利用している。)

リモート操作用のプログラム作成

あとは、作って実行するだけ。

  1. toast通知用

とりあえず練習。

#! /usr/bin/env python
# -*- coding: utf-8 -*-
import android
droid = android.Android()
droid.makeToast("Hello,nihohi")
  1. カメラ撮影用

リモートから任意のタイミング(定期的でも)撮影できるので、何か使えそう。
OpenCVと組み合わせて画像認識して撮影とかもできるかも。

#! /usr/bin/env python
# -*- coding: utf-8 -*-
import android
droid = android.Android()
droid.cameraCapturePicture('/mnt/sdcard/sl4a/fuga.jpg')
  1. センサ情報取得用

手で光センサ部分を覆ったり、傾けたりすると値が変化して面白い。
こちらのサイトが大変参考になった。
AndroidFacadeAPIセンサー

#! /usr/bin/env python
# -*- coding: utf-8 -*-
import android
import time
droid = android.Android()
droid.startSensingTimed(1, 500)
for i in range(100):
    event = droid.eventWaitFor("sensors")
    for key,val in event.result["data"].items():
        print "%s:%f"%(key,val)
    print "\n"
droid.stopSensing()