ラズパイでロボットつくるぞ!(2)

前の更新からかなりの時間がたってしまいましたが・・・。

先日 みんなのPython勉強会#25で発表した資料です。

実際に作ったロボットのデモ(娘が泥棒役です)


お留守番ロボットデモ

ちなみに、この資料は、slideshipというMarkdownを使って簡単にスライドが作成&公開できるサービスを使ってつくったのですが、めちゃ便利!でした。 センスのない私でも、Markdownでただ書くだけで見た目よくいい感じにしてくれた。

みんなのPython勉強会では、ラズパイを触っている方がけっこう参加していて、たくさんアドバイスやいい刺激をうけさらにやる気でました!

最近、Raspberry Pi3も購入して、いろいろやり始めたのでまた忘れないうちに随時Upしていこう。

ラズパイでロボットつくるぞ!(1)

祖父母からクリスマスプレゼント何がほしい?と聞かれた当時小一の娘が、 「ラズパイが欲しい!」(もちろん、私の入れ知恵)と言って買ってもらってから、1年近くたちました。

少しずつですが、娘とロボット作ろう!と奮闘してきた記録を。

文学部出身なので、とりあえず電気やら抵抗値やらそこから?!というところでつまずきました。 が、ラズパイマガジン2016年春号(日経Linux)などを読みながら、なんとか動くところまできたのでそのメモ。

また、ラズパイで作ろう! ゼロから学ぶロボット製作教室にも一から丁寧に書いてあるので、とりあえずその通りに作成してみました!

独立歩行できるために準備するもの

  • Raspberry Pi2 モデルB
  • バイルバッテリー(携帯充電するもの)
  • 無線LAN子機(Wi-Fi USBアダプタ)(Raspberry Pi2 モデルB1は無線LANが内臓されていないため。)
    • PLANEX GW-USNANO2A
  • ブレッドボード
  • モータードライバ(TA7291P)2個
  • 10㎝ジャンパーワイヤー(オス-オス)10本
  • 30㎝ジャンパーワイヤー(オス-オス)4本
  • タミヤから発売されている「楽しい工作シリーズ」
    • 「TRACK & WHEEL SET」(No.100)
        キャタピラー、車輪、車軸のセット
    • 「ユニバーサルプレート」(No.157)
        車体を車軸や車輪に固定するための底板と固定部品。
    • 「ダブルギヤボックス」(No.168)
        二つの車輪を独立して動かせるダブルギヤボックス。モーター2個付き。
    • 「ユニバーサル金具4本セット」(No.164)

結構これがない、あれがないと一度にそろえられず、揃えるだけで大変でした;;

「楽しい工作シリーズ」でキャタピラー作成したあとは、いよいよ配線

1. ラズパイと、モーターをモータドライバーを介して接続

とりあえずはんだづけなどはせず、ブレッドボードを使用しました。 モーター2つ+モータードライーバー2つ で、前輪のタイヤ2つを動かすよう接続。

f:id:electricSheep:20170131223300j:plain:w300

2. ブラウザーを使ってGPIOをコントロール

「WebIOPi」というソフトウエアを使います。

  • ブラウザーから送られてくる指示を「WebIOPi」が受け取り、その指示通りにGPIOをコントロールしてくれる
  • GPIOをマウスクリックでコントロールできる便利なツールが用意されている
  • ラズベリーパイのピンを操作するページでピンの入出力を変更できる

とりあえず、上記サイトで紹介しているプログラムをそっくりコピペして、下記ディレクトリにファイルを保存します。

> cd /usr/share/webiopi/htdocs
> vi rasrobo.html <--プログラムをコピペして保存

3. WebIOPiの起動と停止

> sudo /etc/init.d/webiopi start
> sudo /etc/init.d/webiopi stop
  • ラズパイのIPを確認
> ip a
  • Wi-Fiで接続している場合は「wlan0」の「inet」の部分にIPアドレスが表示されるので、ブラウザーから、そのIP:8000でアクセスできます。
Username:webiopi
Password:raspberry
  • ただ、毎回IPを確認するのも面倒なので、ラズパイに名前をつけて、名前でアクセルできるように設定しました。
 http://rasrobo.local:8000/
  • 下記、先ほどコピペしたプログラムにアクセスします。(同じWifi環境であればPCからでもスマホからでもアクセスできます)
http://rasrobo.local:8000/rasrobo.html

画面でた!!

f:id:electricSheep:20170131223444p:plain:w300

[前進]ボタンをクリック!

前進した!

[左前]ボタンをクリック!

うごかない(T T)

配線間違えてるじゃん! 

などなど、とにかくもりあがりました。 ギヤが軽すぎて、結構なスピードがでたので、ギヤを1段階重くしたり。

5Vの電源でこれだけ動くんだーと感動したり。(といっても5Vがどんなものかわかっていない) とにかく楽しいです!!

ところで、何が一番苦労したかというと、「楽しい工作シリーズ」を組み立てることでした・・・。 

それ以外は、丁寧な解説サイトのおかげで結構さくさくできた(ありがたい)

娘も、ギヤのしくみやモーターを回転させてタイヤを回すことなどなど、たくさん学べたかな。(というか私がたくさんの学びを得ました。)

次は、ロボットが声を出すところを書きたいと思います!

【SQLの書き方とAPIファースト開発セミナー】に参加しました

SQLの書き方とAPIファースト開発セミナーに参加してきたので、そのメモになります。

はじめに

勉強会開催ページでは、下記内容が案内されていて、

SQLは文法ではなくイメージから考える!
テーブル設計はコーディングのあとで行うべし!

そんなばかな!と思いながらも、興味があったのと最近SQLのパフォーマンスの件で困っていたので参加してみたのですが、結果的にとても学びのある勉強会でした。

学んだこと

APIファースト

ウォーターフォール開発では、テーブル設計の変更が必ず起こるので、テーブル設計は後回し、UIを確定してからテーブル設計を行う。

  • 手法
    エクセルでダミーデータを作成し、ストアドプロシジャーを使用して、データベースを作成しないでUIを作成する。先に動くものをユーザーに見せてから、要件を確定しデータベースの設計を行う。
     
  • 利点
    • ユーザーにイメージしやすいものが見せれるので手戻りがすくない
    • エクセルなので簡単にダミーデータをつくれる
    • join とか考えなくてよい
    • 作成したダミーデータがそのままテストデータにもなる

※ 実際に講師の方が作成したエクセルのマクロを使用して、一連の動作のデモをみました。受託開発においては、ユーザーが実際にUIをみないとイメージできず手戻りが発生することがあるのと、テーブル設計の修正はかなりの工数を伴うと思うので、開発側とユーザー側の視点にも沿った合理的なやり方だなと感じました。

SQL小ネタ集

※ 私がoracleを使用しているので、oracleの内容だけをメモしています。実際には他のDBについての言及もありました。

CPUの動作と実行計画

  • RDBMSはブロック単位でレコードを保持しているため、1レコード読むのに、かならずブロック(8kByte)でよまれる。
  • indexで読むと1レコード8kbかかるので、index使わない方がいいことがある。
  • 実行計画にそったきれいなSQLで1回でよむことが、3回にわけてよむよりも DBのCPU負荷が下がる。
  • ネットワークの処理も1回で読んだ方が効率的。
  • 負荷は高さではなく、面積で考える。
  • スケールアウトのためにjOINを避けない。
  • Oracleの場合、ストアドプロシジャーを使うのがよい。依存関係がわかるので、保守性があがる。

RDBMSの違い

  • オラクル v$SQL (仮装テーブル)便利!
    • 実行されたSQLが取得できる
    • 処理に使用したCPU時間などがわかる
  • oracleは全体の10%(?)失敗すると、実行計画を作り直す。
  • MySQlはjoin が遅い。ハッシュjoinがないので。

パラメータテーブル

  • 複雑なロジックを使用して取得しなければならないようなデータの場合、まずはExcelで1行ずつ取得結果のデータを書きだしてから、ロジックに関わるデータを抽出し、そのデータをパラメータテーブルとして作成する。(if分で条件分岐するより、論理値での計算でできる。)
  • ロジックが増えた時に、テーブルに1行追加するだけでOKなので、保守性もあがる。

論理演算を復習しよう

SQLは論理演算に強いと、すぐイメージできる

  • AND(論理積)は掛け算
  • OR (論理和)は足し算
  • 演算の順番も掛け算(AND)が先
  • 論理和の場合、True が1個でもあれば1
  • 論理積の場合、False が一個でもあれば0

さいごに

勉強会で使用した資料は終わった後に頂けるということで、自分が参加時にメモした内容は以上になりますが、その他SQLの書き方など、参考になる点がたくさんありまりた。もしかしたら、私の理解が間違っている箇所もあるかもしれませんが、その辺はご了承ください。

oracleメモ(1)

これまで、業務システム開発でなんとなくSQLを使ってきましたが、最近、大量のデータを扱ったり直接データベースから(プログラムを介さず)データを抽出する作業などが増え、パフォーマンス等も考慮しなくてはならないなぁと、勉強を始めたので、そのメモです。

まずは、これを読む

言葉の定義

スキーマ・オブジェクト(oracleにおける)

  • スキーマは、データの論理構造(スキーマ・オブジェクト)の集まりです。
  • スキーマはデータベース・ユーザーによって所有され、そのユーザーと同じ名前を持ちます。ユーザーはそれぞれ1つのスキーマを所有します。

スキーマの定義はデータベースによって違うのでややこしいですね…。

リテラル

  • リテラルと定数値という用語の意味は同じで、固定データ値のこと。
  • 文字リテラルは、一重引用符で囲みます。一重引用符を付けることで、Oracleは文字リテラルスキーマ・オブジェクト名を区別します。

日付リテラル

  • DATE値を文字列リテラルに指定するか、文字値や数値をTO_DATEファンクションによって日付値に変換できます。
  • DATE値をリテラルに指定する場合は、グレゴリオ暦を使用する必要があります。次の例に示すように、ANSIリテラルを指定できますが、ANSIの日付リテラルには、時刻部分を含めず、書式'YYYY-MM-DD'で指定する必要があります。
DATE '1998-12-25'

PL/SQL

  • PL/SQLは、Oracle社が、Oracle Databaseのためにコンピュータのデータベース言語SQLを独自に拡張したプログラミング言語です。
  • PL/SQLを使用すると、手続き型言語で埋め込みSQLによる処理と同様に、変数の利用やif、for、loopなどの制御構造を記述して業務ロジックをデータベース内に実装することができ、問い合わせ結果の行を一件ずつ処理する場合には、カーソルによるFETCHループでの処理を行うことが出来ます。

ストアドプロシージャ・ストアドファンクション

  • PL/SQLのコードに名前を付けて、解析したコードをサーバに登録し、呼び出しが可能な状態にすることができる機能
  • プロシージャは戻り値無し、ファンクションは戻り値があるという違いだけ。
  • クライアントとサーバーを繋ぐネットワークという遅い通信経路に SQL と結果が何度も行き交うような処理に対して非常に有効です。

とりあえず実際に作ってみる!

[sample1] 10進数->x進数変換

 CREATE OR REPLACE FUNCTION TO_BASE
(
    p_dec   IN    NUMBER, 
    p_base  IN    NUMBER 
)

RETURN VARCHAR2--戻り値のデータ型
IS
    l_str   VARCHAR2(255) default NULL;
    l_num   NUMBER     default p_dec;
    l_hex   VARCHAR2(50)  default '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
BEGIN
    IF (TRUNC(p_dec) <> p_dec OR p_dec < 0) THEN
        RAISE PROGRAM_ERROR;
    END IF;
    LOOP
        l_str := SUBSTR(l_hex, MOD(l_num, p_base) + 1, 1) || l_str;
        l_num := TRUNC(l_num / p_base);
        EXIT WHEN (l_num = 0);
    END LOOP;
    RETURN l_str;
END;
/ 

ストアドファンクションを実際に呼んでみます。

  • 10進数の「22 」を->2進数変換
select TO_BASE(22,2) from dual

return ==> 10110

[sample2] x進数->10進数変換

CREATE OR REPLACE FUNCTION TO_DEC
(
    p_str   IN    VARCHAR2,
    p_base  IN    NUMBER
)
RETURN NUMBER-- 戻り値のデータ型
IS
    l_str   VARCHAR2(255) default p_str;
    l_num   NUMBER     default 0;
BEGIN
    FOR i IN 1..LENGTH(p_str) LOOP
        l_num := SUBSTR(l_str, LENGTH(l_str), 1) * POWER(p_base, i - 1) + l_num;
        l_str := SUBSTR(l_str, 1, LENGTH(l_str) - 1);
    END LOOP;
    RETURN l_num;
END;
/

今更ながら、とりあえずこんな感じで簡単に定義して関数として呼び出すことができるので、とても便利です。    実際、データ抽出作業において、複雑な条件やサブクエリを駆使して無理やりSQLでデータ抽出を行うよりは、ストアドプロシージャを定義して処理を行った方がいい場面もあるので、これからは使っていこう!!

STM32F4DISCOVERYでMicroPython!

この記事はGeekWomenJapan Advent Calendar 2016 の21日目の投稿です。

PyLadies Tokyo MeetUpで初めてのマイコン体験してきたので、そのメモになります。

正直いって、マイコンなんて触ったこともない完全な初心者です。
今回は、頼りになるPyLadies 代表@amacbeeさんにいろいろ教えてもらいながら進めました。
(接続するケーブルまでご用意頂き、本当にありがとうございました!)

準備するもの

  • STM32F4DISCOVERY
  • OS X (他Windows OS XP,7,8 / Linux 64bitでもOK)
  • USB Type A to mini-B cable
  • USB Type A to micro-b cable

※ケーブルは2本ともPCにつなぐ必要があるので、PC側にUSBポートが2つ必要です。

たったこれだけです!

Python女子部のイベントといことで、今回はMicroPythonを使って動作させます。

何もわからないので、とにかくググる

Micro Python とは

  • Python 3 互換の文法を実装した、マイコン上で動作させることに最適化されたもの
  • Micro Python は PyBoard というボードと共に、KICKSTARTER で多数の投資を集めて開発されたようです。
  • Micro Python を手軽に試すことが出来る PyBoard は、日本では入手困難ということで、今回は、PyBoard 同等の STM32F4 系のマイコンを搭載したSTM32F4DISCOVERYを使用しました。

STM32F4DISCOVERYって?

  • ARM社が販売しているマイコンボードです。(ちなみに、今年SoftBankが3兆円でARM社を買収したらしい)
  • ARMの場合、コンパイラやデバッガが無償で個人でも利用可能な為、世界中に多くのホビーユーザーがいるらしい。
  • 安く手に入る(@amacbeeさんがまとめて秋月で購入してくれたのですが、2,800円でした!)

f:id:electricSheep:20161217142120j:plain:w300

とりあえず、micropythonをSTM32F4DISCOVERYにインストール - くろねこ日記を参考に、各自ひたすらもくもく。
基本的に、上記サイトがとても丁寧に書かれていたので、そのとおりの手順で行えばOKだったのですが、それでもつまずいた箇所などあったので、さらに詳しく自分用にメモします。

ビルド環境 (ちなみに私の環境はOS X El Capitanです)

1.micropythonをビルドするときに使うgcc-arm-embeddedを自分の環境(MAC)にインストール。

 > tar xvf gcc-arm-none-eabi-5_4-2016q3-20160926-mac.tar.bz2 
 > cp -r gcc-arm-none-eabi-5_4-2016q3 ~/gcc-arm-none-eabi

2.bash_profile にpathを設定します。

> export PATH=$HOME/gcc-arm-none-eabi/bin:$PATH
> source .bash_profile

3.micropythonに書き込むためのライタ(ソフトウェア)を用意します.(homebrewが必要です。)

> brew install dfu-util

4.ボードをパソコンにつなぎます。

  • ボードの裏側にあるジャンパピン二つ(Jp2,Jp3と書いてあるやつです)のうちどちらかを取って,p2側の21pin-22pin(BOOT0とVDDのところ)に刺します。そのあとボードをパソコンに繋ぎます。 繋ぐときにはmicrousbとminiusbの2ポートがボードから出ているので、二つともパソコンに繋ぎます。 <-- ここ!!

やるまえにちらっと、USBの1つだけ繋げばOKみたいな情報もあったのですが、電源用と転送用で分かれているらしく、結局二つつながないとだめでした;

5. MicoroPython本体はgithubにあるので、DLしビルドします。

ビルドの際には今回使うマイコンをオプションで指定します。

> git clone https://github.com/micropython/micropython.git
> cd micropython/stmhal
> make BOARD=STM32F4DISC

※ dfu-utilで、build-STM32F4DISC/firmware.dfu を書き込み
> dfu-util -a 0 -D ./build-STM32F4DISC/firmware.dfu

ここまで済んだらp2の21pin-22pinに刺してあるジャンパピンを元の場所に戻します。

ここで、/dev/tty.usbmodemなんとかというデバイスがあるはずとありましたが、ない!! amacbeeさんがデバッグ?して解決してくれました。(ファームウエアをデバッグできるなんて!)

結局、一旦PCから外して、再度さしたらデバイスを検出。 ハードあるあるな感じですが、全くきづけなかった ....。
だめなら、抜き差し!重要ですね。

6.シリアルターミナルソフトウェアでそのポートに接続!

pyserialに付属してくるminiterm.pyを使って接続します。

> pip install pyserial
> miniterm.py /dev/usbmodem1412
(usbmodem1412***数字の部分は適宜かわるので、その都度確認します)
  • 接続ができた!とおもったのですが、コマンドが入力できないので、きいてみると、Ctl+cを押すといいとのこと。無事コマンドが打てる状態になりました!

チュートリアルを読むとMACの場合、screen コマンドで通信できるとあったので、こちらでも試してみたところ接続できました。

> screen /dev/tty.usbmodem1412 
終了は Ctrl + a 押しながら k 

とりあえず、Lチカ

> pyb.LED(1).on()

光った!!感動。

7.あとはPython のコードをかくだけ!

で、ここまでできればもう本当になんでもできる感あります。 まずはおきまりのLチカをためし、MicroPython tutorialに従い、いろいろ試してみました。

MAC のFinderでデバイスのフォルダをみるとPYBFLASHというリムーバルディスクが表示され、そこからファイルにアクセスできます。

main.py

というファイルがあるので、ここにpythonでプログラムを書き込みます。書き込んだら、一旦PYBFLASHMACから取り出し処理をしてResetボタンを押すとプログラムが実行されました。

または、

> Ctrl + d

で soft rebootしてもmain.py のプログラム実行されます。

プログラムを止める時は、

> Ctrl + c

一番盛り上がった?Disco

  • チュートリアルのLEDs の項に、「A Disco on your pyboard」という項目があったのでやってみました。
  • STM32 は4つのLEDがありますが、思った通り!実行すると、4つのLEDがきらびやかに点滅してまるでディスコ!!
    Disco って、立派な?英語だったんだーと、どうでもいい知見も得ました。

ちなみにdiscの定義 by Google先生(超どうでもいい。)

a club or party at which people dance to pop music.

python なので、本当に簡単なコードで手軽に試せる感あります。 マイコンといえば、Cのイメージでしたが、python だけで動かすことができるのでとても素敵だー。

STM32 には、ユーザースイッチやリセットボタンが標準でついていますし、GPIOのピンもたくさんあります。 加速度計もついていて傾き検出などもできました!

組み込み系は、とても敷居が高い感じがありましたが、みんなでわいわいやると楽しいですね! なにより、つまずいてもなんとかしてくれる人がいるというのが心強い。

今後もなにかしら引き続きやりたいな。