【備忘録】Edisonの環境構築

Intel Edisonの環境構築手順

  • システム側の最新化は済ませておく

ネットワークの構築

開発PCに挿したモバイルスポットを使用する
Windowsのモバイルホットスポットから部屋のWifiを指定しブリッジさせ、グローバル接続も可能にさせる

固定IPの振り方

/etc/wpa_supplicant/wpa_cli-actions.sh を以下のように修正

if [ "$CMD" = "CONNECTED" ]; then
    kill_daemon udhcpc /var/run/udhcpc-$IFNAME.pid
#     udhcpc -i $IFNAME -p /var/run/udhcpc-$IFNAME.pid -S
     ifconfig $IFNAME 192.168.10.2 netmask 255.255.255.0
     route add default gw 192.168.10.1
fi

上記の場合、モバイルホットスポットゲートウェイのIPが
192.168.10.1
Edisonの固定IPが192.168.10.2となる

一々IPアドレスを見るのは面倒なので、名前解決 <Edison(マシーン名)の名前>.localになる ping EdisonName.local が届けばいい

今回、EdisonName=myedisonとする

Wifiの手動設定

以下のコマンドから、対話形式での設定が可能

# configure_edison --wifi

今回、モバイルホットスポットSSIDを指定し、接続させた
登録した内容はファイルに格納される。何度もやるとスタックされていく。優先順位は先勝ち。
以下のファイルから手動で変更可能
/etc/wpa_supplicant/wpa_supplicant.conf

Sambaファイルサーバーの設定

opkg install samba

ここ を参考にし、/etc/samba/smb.conf で以下を設定

[global]
   security = share
   hosts allow = 192.168.10.
# 同じネットワーク内の端末へのアクセスを許可
[hoge]
   comment = Comment for Windows
   path = /home/hoge
   guest ok = yes
   writable = yes
   share modes = yes
   force create mode = 0777
   force directory mode = 0777

ユーザーも忘れず作る

useradd hoge
passwd ******

Sambaはデーモン化されているため、特に再起動の必要はない(ps | grep smbで確認)
これで、Windowsから[ネットワークドライブの割り当て]で
\myedison.local\hoge を入力すると、ユーザーが問われるので、
hogeと******を入れてあげればよい

これで、WindowsエクスプローラーからEdisonのファイルが編集できるので、VSCodeなどのエディタを組み合わせることができる

APEC大会

負けました。

探索は走行中の最速経路導出+既知区間斜めも成功(?)。
最短は連続斜めは良かったものの、そのあとの45度ターンが入れずに全部リタイア。

原因は環境に対応できなかったこと、対応しようと調整をし過ぎて、タイヤのグリップ力が一定以下になってしまったことです。
Exiaはタイヤのグリップがなくなると、本来5m/sぐらい出せるのが、4m/sが限界ぐらいにまで落ち込みます。
速度に関してはタイヤ径が小さくなったときに、どこか余計なところが擦れてしまっているのが、直線速度については要因なのかなと。

今回、短期間でメンテも全くできない状況だったので、以下のハードトラブルが発生 * 真横センサーのエポキシ固定がは流れる(比較的マシ) * 左前センサーのエポキシ固定がはがれて、曲がってしまう(斜めの制御に問題。左側の制御を切った。) * 吸引のモーターマウントが破損、振動により色々制御できない状態になる

散々ですね。

Exiaは2017年度大会には出さないと思います。
基板の出来が悪いため、ものすごくハードウェアトラブルを抱えました。
何をしよう。。。

ともかく、やっと2016年度のシーズンが終われました。

大会会場では自分が作ったMMCルーラーやマウス用のブラウザアプリに興味を持ってもらった人がいるので、気が向いたら公開なりなんなりしたいです。

thank you for inviting me.

タンパ旅行記03/26/2017

アメリカのフロリダ州のタンパにいます。

APEC大会(Applied Power Electronics Conferenceの略)に出場するため、 25日夕方成田発の飛行機に乗って初渡米を果たしました。

自身のほどはこの後に控えている調整次第です。

今回行くまでの話を少々。

ワシントンのダレス空港を経由し、タンパ国際空港に来ました.

ダレスで乗り継ぐ際には、トランクは一旦ここで手に取って再度乗り継ぎ用のレーンに自分で乗せ換えました。 海外から来た場合は厳しいそうです。

拾ってから載せるところは少しだけ歩きます(50m?) 入国審査は意外とあっさり、質問は行き先、目的、滞在期間、一人か?とこれぐらいですね。

機内食は12時間も乗っていたので2度ありました、1つ目がチキンカツカレーorパスタ、2つ目がNoodle(焼きそば)or Omletsでした。

地味に焼きそばはうれしかったですね。

海外旅行で必須になるスマホの通信ですが、 今回日本でアクティベーションできるものを使いました。アメリカ T-Mobile SIM カード

30日間有効で、且つ、10GB、4G/LTEが使えるので、githubやnpmリポジトリが入用な俺には都合がいいツールでした。 ニコニコ動画も余裕です。

手続きは簡単で、日本でパッケージに書いてあるURLからアクティベーションのページ具体的にはここ にアクセス、必要な情報を入力して、登録してください。 日程は正確にとのことでしたが、一日ぐらい早めにやっても問題はありませんでした。

登録後メールが届けばOK。Gmailの広告側のボックスに入っていたので見落としに注意

これだけだと、電話とSMSしかできないので、キャリアのインターネットが使えるようにします。

手動でAPNを指定しました。公式(T-mobile)で指定方法が書いてありましたので、それを利用。参照URL

完了後は一応再起動しましょう。

これで日本とあまり変わらないネット環境ができましたね。 イモトのWifiもありますが、500MB/1dayは心細いですね。

新年あけましておめでとうございます。

はじめに

2日連続でブログを書いています。
明日あたり、静岡で雪でも降るのではないでしょうか

冗談は置いといて、
新年あけましておめでとうございます。

寝正月と酒を楽しんでいます。明日あたりは映画でも見に行こうかな。
私は残念ながら、年末に体力を削り、夢と希望と欲望の3日目とやらを追い求めることをしてないのですが、TLを見ていると皆さん、色々と成し遂げたようで、2016年に残したものは何もないことと思います。

新作のお話

皆さん新作の進捗はいかがでしょうか?
ここでは、新刊のことは言及しません。
2016年中に納まらなかった、新作のマイコンに関する、私の考えを述べようと思います。

まず、優先事項として

  • チップの大きさ(物理)
  • RAM
  • 動作周波数
  • 使いこなせること(ドキュメントが充実していること)

これらを優先します。 現状のRX631よりも優れいているものを使いたいですし、かといって、STM系のだと周りに私に教えてくれる人がいませんので、中々学習コストが高いと。(それについての言及もあとで)

候補は以下の通りです。

  • RX631 48pin
  • RX631 64pin
  • RX71M 100pin LGA
  • RX71M 176pin BGA
  • STM32F446 64pin

入手性も考慮した結果です。
LGA,BGAについてはネタに近いですが、それでも、いずれExiaに搭載したいなとも思っています。

さて、そうなるとSTM32F446とRX631の一騎打ちになって、性能差から、STM圧勝としか見えていないのですが、都合により、Windows縛りのため、環境構築が面倒くさい。

Mice BustersのSTM使いは石油を掘りにいっている騎士王しか心当たりがないので、非常にとっかかりにくいというのが、踏み切れていない原因です。
「これとこれを使えば動くよ」的な手法で学習していたので、プラットフォームの切り替えにリスクを伴ってしまう。というのが現状ですね。

結局、「ルネサスでいいや」に落ち着いてしまうのですが、それだと、日本のメーカーが提供している製品の使い方を覚えたに過ぎないという事実からは逃げられないです。
この意見は、ルネサスディスるよりも、それしか扱えない人にはなりたくないなという戒めです。

魚をもらうよりも釣り方を覚えたほうが意味がありますからね。

さて、どうしたものか。

2016年お疲れ様でした

はじめに

2016年お疲れ様でした。
今シーズンの私の活動は以下のような感じです。

  • 新PC Lenovo T460sを買う
  • クソ忙しいタイミングで新作「Exia」の設計をする
  • 自宅に迷路を買う
  • 全日本3位になる
  • APECの招待を受ける

こんな感じです。
迷路の購入は正解でした。なかったら、ふなくーだに負けてました。
Exiaはまだもう少し早くできることが分かっているので、よっぽどのことがなければ、来年も続投したいと思います。

来年5月から、部屋でマウスの活動ができないかもしれないので、今後のためにも、1月からの数か月間を環境作りのために、時間を割くことになりそうですね。

3月末にAPECを控えているので、なるべく早くケリをつけたいところです。APECの対策は進めていて、探索の速度の向上、既知区間斜めの導入、オートスタートと対応を順々と完了してます。

残りは、探索アルゴリズムの調整ですね。

先輩と後輩がAPEC迷路を攻略できていないので、APEC迷路を攻略(Busterとは決して言えない)したいと思います。

それでは、年越しそばを食べます。

書き込み基板を新調

経緯

大学4年の春に作成した書き込み基板がシーズン途中から接触不良を頻発するようになり、先日ついに、断線しました。
ということで、書き込み基板を新調します。

用意するもの

  • ジャンパー線 メス*4
  • ユニバーサル基板 穴数5*9
  • スライドスイッチ
  • エポキシ系接着剤(10分型)
  • UEW

ジャンパー線を4つ編み(というのは嘘で、2本1組にすることで疑似的に3つ編みを実現)

完成

こんな感じです。 f:id:nao1288stusj:20161213224802j:plainf:id:nao1288stusj:20161213224806j:plain

負荷がかかりやすいところにエポキシをつけることで補強しました。
裏面にもエポキシをつけてツルツルにすることで、手触りをよくしました。

いまのところ不具合もなく、APECにはこの子を連れて行きます。

番外編

次回作をRX71Mにするか、STM32F446にするかの瀬戸際に立っています。ハイエンドって憧れますよね。240MHzの何がハイエンドだって話ですが。

歩数マップ更新

この記事を書く背景

皆さんはマイクロマウス、ひいては、他のプログラムにおいて、計算コストというのを気にしたことがありますか。
ここでは、コストが高い=時間がかかるとし、そのためには多少のメモリを使うという思想で話します。

前提1:速い処理と遅い処理について

処理の速さとは、今回注目する、歩数マップ更新の更新においては、
ループの回数が少ない=速い処理であること意味します。
厳密には、加減乗除もコストに入るわけですが、今回に限っては、四則演算は求められないので、関係ありません。
その他、CPUの性能やメモリ等のリソースに関して、ここでは触れません。

前提2:必要な知識

この記事では以下の知識を要求します。

  • 基礎的な歩数マップ更新のプログラムが理解できること。
  • ビット演算を理解していること。

実装例

  
void updateDist(int x, int y, int mode) { //(x,y)ゴール座標
    unsigned char distPositionList[257];
    char head=0, tail=1;
    distPositionList[0] = x * 16 + y;
    clearMap(x, y); //歩数マップ初期化
    while (head != tail) { //head = tail なら更新する区画がない
        char Y = distPositionList[head] & 0x0f;
        char X = (distPositionList[head] & 0xf0) >> 4;
        head++;
        int distPoint= dist[X][Y] + 1;//歩数値
        char D = 1;//方向用の変数
        while (D <= 8) {
            char i = 0, j = 0;
            if (D == North) {//North=1
                j = 1;
            } else if (D == East) {//East=2
                i = 1;
            } else if (D == West) {//West=4
                i = -1;
            } else if (D == South) {//South=8
                j = -1;
            }
            //更新対象か確認 mode = 1(最短)のとき、既探索かを内部でチェック
            char isUpdateTarget = (mode==1) ? proceedEnable(X, Y, D) : !existWall(X, Y, D);
            if (isUpdateTarget  && getDistance(X + i, Y + j) == ILLEGAL_ARGUMENT) {
                if (X + i < 0 || X + i >= MAZE_SIZE || Y + j < 0
                        || Y + j >= MAZE_SIZE) {
                } else {
                    dist[X + i][Y + j] = distPoint;
                    distPositionList[tail] = ((X + i) << 4) | (Y + j);
                    tail++;
                }
            }
            D *= 2;
        }
    }
}

説明・解説

アルゴリズム解説

更新座標格納用配列qに初期値として、ゴール座標を格納、
隣接する座標に歩数を割り振り、
その座標を配列に格納、次の隣接する座標を探します。
無理やり1次元配列としている理由は、データ節約のためです。
ハーフでは2次元配列としてもよいと思います。
while(D<=8)としているのは、ソースの再利用性を考慮した結果です。

更新する座標情報の格納について

更新座標格納用配列qの各値には以下の法則で値を格納します。

  • 上位4ビットをX座標
  • 下位4ビットをY座標

headがインクリメントされ、値を参照したとき、上記のソースコードのようにX,Yに複合化します。

32*32の場合でも、同様の手法が使えます。

計算コストについて

今回紹介したアルゴリズムは、最大O(n)です。
ちなみに簡単に思いつく手法として

  
char looping = true;
while(looping){
    looping = false; //全座標を参照後更新がなければ、breakする仕掛け。
    for(int i=0;i<16;i++){
        for(int j=0;j<16;j++){
            if(dist[i][j]==targetDist){
                if((map[i][j+1]&0x11)==0x10){ 
                    dist[i][j+1]=dist[i][j]+1;
                    looping = true; //更新が続く可能性があるのでフラグをtrueにする
                }
                // 以下略
            }
        }
    }
}

上記のような感じになりますが、for文が3段階にネストしています。
この場合、計算コストはO(n^3)となります。
これがハーフサイズ決勝のサイズになったときの計算時間を想定した場合、恐ろしいことになります。

まとめ

計算コストについて意識する場合、ループ数を気にする
これだけです。