ネコをジャンプさせよう

Scratchでネコを動かしてみよう - IT父さんのロボブログの続き。
今度はネコをジャンプさせてみます。
スペースキーが押された時にジャンプするように改造してみましょう。

    1. スペースキーが押されたら
      ここでは、イベントの「__キーが押された時」というブロックを利用します。
      このイベントブロックにつながったプログラムは、そのイベント(この場合は「スペースキーが押された」というイベント)が発生したときのみ、実行されます
      f:id:tomaberry:20170723065338p:plain
      これに「ジャンプする」プログラムをつなげます。

    2. ジャンプは縦移動
      「ジャンプする」はスプライトを縦に動かす、つまりy座標を変える必要があります。例えばこんな感じ。
      f:id:tomaberry:20170723065424p:plain
      スプライトの画面上の位置は、真ん中が(x=0, y=0)で、x(横)が±240、y(縦)が±180で指定できます。つまり、このプログラムの意味は、

      (1) yが0より大きくなるまでyを10ずつ増やす(上に移動)
      (2) yが-100より小さくなるまでyを10ずつ減らす(下に移動)

      ということになります。

    3. 自然にジャンプ
      一応ジャンプは出来るようになったものの、何か不自然ですね。
      これは上に移動するときも下に移動するときも、同じ速度で移動しているからです。(等速度運動)
      ここで言う速度とは、「y座標を10ずつ変える」の"10"のこと。
      普通、ジャンプしたときは最初が速度が速く、段々遅くなり、一番高いところで止まり、今度は落ちる方向に段々早くなります。
      細かい説明は省きますが、この動きを「等加速度運動」といいます。
      プログラムにするとこんな感じ。

      f:id:tomaberry:20170725220047p:plain
      y座標を移動するときに、最初"21"だった速度を"-3"ずつ変えています。
      この"-3"が「加速度」で、
      7回繰り返しで速度"0"になり、ジャンプの一番高い所になり、
      14回繰り返しで速度"-21"になり、着地します。

    4. 背景をつけよう
      真っ白な背景では味気ないので、ついでに背景を設定しよう。
      まず、画面左下のスプライトの横にある「ステージ」を選択する。

      f:id:tomaberry:20170725224043p:plain
      次に、画面上部タブの「背景」をクリックし、背景をライブラリーから選択する。

      f:id:tomaberry:20170725224231p:plain
      いろいろな背景が選択できますが、ここでは"blue sky"を選択しました。

      f:id:tomaberry:20170725224657p:plain

      これでジャンプするネコの完成です。

Scratchでネコを動かしてみよう

前回、とりあえずのプログラムとして計算ゲームを紹介しましたが、やはりここはキャラクターが動くゲームを作りたいところです。Scratchはむしろそういうゲームを作るのに向いています。

これからスクラッチ最初から用意されているScratchを使って、少しずつゲームを作っていきましょう。

  1. スプライトとは?
    スプライト(sprite)は直訳すれば「妖精」ですが、Scratchの中ではプログラムによって動くキャラクターのことを言います。
    スプライトは同じステージの中に複数配置することができ、それぞれ独立したプログラムに従って動きます。そして、スプライト同士が衝突した場合はどうするか、というようなことをそれぞれのプログラムに書いていくことによって、ゲームができていくわけです。

  2. ネコをカーソルキーで動かす
    では実際にネコを動かしてみましょう。
    「制御」ブロックから「ずっと」を、「動き」ブロックから「10歩動かす」を持ってきて、下のように組んでみましょう。

    f:id:tomaberry:20170213105646p:plain

    これで「10歩動かす」をずっと繰り返すプログラムの出来上がりです。
    では、この組みあがったブロックをクリックしてみましょう。

    f:id:tomaberry:20170213211903p:plain

    ネコが画面の端まで移動して止まります。
    では次に、右のカーソルキーを押している間だけ移動するようにしてみましょう。

    f:id:tomaberry:20170214213023p:plain
    これでOK。
    「もし右向き矢印キーが押されたら10歩動かす(そうでなければなにもしない)」をずっと繰り返すという意味になります。
    でも、これでは右に行くだけで戻れないので、さらに左にも行けるプログラムにしてみましょう。

    f:id:tomaberry:20170214213857p:plain

    戻る場合は「-10歩動かす」になります。

  3. コスチュームを変える
    ネコがカーソルキーで左右に動けるようになりましたが、このままでは戻るときも同じ方を向いたままです。
    今度は戻るときに後ろを向かせるようにしましょう。これはスプライトの「コスチューム」を変えることで実現できます。
    画面上部のコスチュームタブをクリックすると、そのスプライトが持っているコスチュームが表示されます。
    f:id:tomaberry:20170218215955p:plain
    ネコのスプライトでは、2つのコスチュームが最初からあるのがわかりますね。ただ、どちらも右向きなので、ここでは左向きのネコを作りましょう。
    まず、"costume1"を右クリックしてコスチュームを複製します。

    f:id:tomaberry:20170218221620p:plain
    次に、複製したコスチュームを反転させます。
    画面右上の方に反転ボタンがあるので、クリックしましょう。

    f:id:tomaberry:20170218221710p:plain

    これで左向きのコスチュームができました。
    あとはスクリプトタブに戻り、プログラムでコスチュームを変更しましょう。

    f:id:tomaberry:20170218222011p:plain

    これで右に移動するときは右を向き、左に移動するときは左を向くようになりました。
    さらに"costume2"の反転コピー"costume4"を作り、
    "costume1"と"cosutume2"、"costume3"と"costume4"が交互に表示されるようにしてみましょう。(ついでに、旗がクリックされたときにプログラムを起動するようにイベントブロックを頭につけておきます。)

     f:id:tomaberry:20170218224851p:plain

    これでネコが走っているように見え、、、ますよね?
    なんか目玉が上下して落ち着かない感じではありますが、、、


    これで走るネコの完成です。
    次回はジャンプに挑戦です。

コマンドラインからGPIOを操作する

  1. GPIOについて
    Raspberry Piで何かを動かしたり、センサーからデータを取り込んだりする場合、基板上に並んだ40本(旧モデルでは26本)のピンに信号を送ったり、信号を読み取ったりすることでできるようになります。
    つまり現実世界とのインターフェースで、言うところのIoT的なことができるようになります。
    このピンには番号が振られており、Raspberry Piに付属のカードにも記載されております。
    f:id:tomaberry:20170212141136j:plain
    このうち、GPIO xx と記載されているピンが実際にデータの入出力に使用できるピンになります。GPIOというのは"General-Purpose Input/Output"の略で、入力にも出力にも使用することができます。
    なかでも後ろに()がついているピンはさらに特殊用途に使えるものですが、とりあえずは何もついていないピンから使いましょう。
    ちなみに番号は「GPIO xx」のxxにあたるGPIO番号と、基板上の物理的な位置に対応した番号(上の図の緑の部分)の両方で指定することができます。

  2. gpioコマンド
    ではまず、コマンドラインから現在のGPIOの状態を見てみましょう。
    コマンドラインからは、"gpio"コマンドでGPIOを操作することが可能で、
    $ gpio readall
    と入力すると、現在のピンの状態が一覧表示されます。f:id:tomaberry:20170212144148p:plainここで真ん中の"Physical"という部分が物理的な番号で、両端の"BCM"がGPIO番号になります。
    さらに"Mode"の部分に現在のピンのモード(IN/OUT)が、"V"の部分にピンの値(1ならON、0ならOFF)が表示されます。

  3. GPIOからの入力
    個々のGPIOの値(先の"V"の部分)を読み取る場合は以下のようにコマンドを入力します。
    $ gpio -g read 3
    1
    ここで"-g"は番号種別、"read"は操作種別、"3"はピン番号になります。
    つまり、このコマンドの意味は「GPIO番号3のピンの値を読む」ということになります。
    ピン番号を物理番号で指定したい場合は、オプションが"-1"(数字の1)になります。つまり、以下でも同じ結果が得られます。
    $ gpio -1 read 5
    1
  4. GPIOへの出力
    GPIOに信号を出力する場合は以下のようになります。
    $ gpio -g write 17 1
    "17"がピン番号、"1"が値(1がONで0がOFF)、つまりこのコマンドの意味は「GPIO番号17のピンを1(ON)にする」ということです。
    $ gpio -g read 17
    1
    とすれば、実際に値が"1"に変わっていることが確認できます。

  5. GPIOのモード変更
    次にピンのモード変更について説明します。
    最初の"gpio readall"コマンドの出力より、GPIO番号3のモードは"IN"、GPIO番号17のモードは"OUT"であることがわかります。
    "IN"になっているピンは入力モード、つまり各種センサーなどから値を取得するためのピンで、"OUT"は出力モード、つまりLEDやモーターなどに信号を送信するためのピンということになります。
    この「モード」も、gpioコマンドによって変更することができます。
    $ gpio -g mode 3 out
    とすると、GPIO番号3のピンのモードが"OUT"に変わります。
    もとに戻す場合には、
    $ gpio -g mode 3 in
    とすればOKです。

ラズパイローバーのデモ動画

さて、Raspberry Piで何ができるかですが、
これまでに挑戦したことは以下の通り。

  • LEDの点灯(いわゆるLチカ)
  • モーターを動かす
  • Webカメラとスピーカーを接続
  • 日本語音声合成
  • 日本語音声認識
  • タクトスイッチによるシャットダウンボタン
  • 赤外線LEDによる対物センサーの作成
  • 温度センサーによる温度検知
  • 光センサーによる明るさ検知
  • フルカラーLEDの点灯

とまあ、いろいろやりましたが、とりあえずこちらが完成形のデモになります。

youtu.be

ローバーの形はITproの記事そのままで、機能の実装もお手本通りに進めましたが、音声認識あたりからは(なぜか記事が見れなかったこともあって)、いろいろなサイトを参考にしつつ、独自に工夫しております。

これから完成形までの道のりを順番に説明していきたいところですが、そのためには一回ローバーを解体する必要があるので、なかなか踏み切れません。。

 

Scratchでゲーム作成

最近更新が滞ってますが、今回はScratchについて書いてみます。

ScratchはMITメディアラボが開発した子供向けの教育用プログラミング言語で、ブロックを積み上げるようにプログラミングします。
「ビジュアルプログラミング」と言うそうです。

単純なゲームなら、本当に簡単に出来てしまいます。
例えばこんな感じ。
タイトルは「けいさんゲーム」 。足し算と引き算をするだけのゲームです。
Flashなので、スマホからは見れません)

プログラムの中身はこちにアクセスすれば見れます。
けいさんゲーム on Scratch

Scratch2.0はウェブアプリケーションとして提供されているため、特にソフトウェアのインストールは必要ありません。

下のリンクからScratchのサイトに行けば、作ることも、公開することも、他の人が作ったプログラムを見ることも自由にできます。上の例のように、自分のブログやホームページに埋め込むこともできます。

scratch.mit.edu

 

Raspbianの初期設定

OSのインストールに続いて初期設定を行います。

まずはモニタ、キーボード、マウスを取っ払い、作業用PCからネットーワーク経由でアクセスできるようにしたいところです。その他、タイムゾーンと日本語入力環境も設定しておきます。

  1. 無線LANの設定
    Raspberry Pi3は無線LAN内蔵なので、まずはこれを有効にします。
    画面右上のインジケータエリアに、無線LANのアイコンが表示されています。(設定前は接続できていないので、未接続の表示になっています)

    f:id:tomaberry:20161225083814p:plain

    ここをクリックして表示される「Turn On Wi-Fi」をさらにクリックすると接続可能なSSIDの一覧が出てくるので、接続するSSIDをクリックしてパスワードを入力すれば、あっさり繋がります。

    f:id:tomaberry:20161225085539p:plain

  2. SSHVNCの有効化
    タスクバーのランチャーよりLXterminalを起動し、
    f:id:tomaberry:20161225101747p:plain

    sudo raspi-config"コマンドを実行します。f:id:tomaberry:20161225101928p:plain
    カーソルを移動して「7 Advanced Options」でEnterキーを押します。f:id:tomaberry:20161225102115p:plain

     「A4 SSH」を選択し、Enterキーを押します。f:id:tomaberry:20161225102955p:plain
    以降、下記の通り画面に表示されるので、そのままEnterキーを押して進めます。

    Would you like the SSH server to be enabed?
       <はい>
    The SSH server is enabled   <了解>

    同様の手順で「A6 VNC」も有効化します。
    これでリモート接続ができるようになりました。Raspberry Piに繋いでいたモニター、キーボード、マウスを取っ払ってしまいましょう。

  3. パソコン側の設定
    次に、パソコン側にリモート接続するためのソフトをインストールします。必要なソフトは以下の通り。(代表的なもののご紹介)

    Tera Term・・・SSHでターミナルに接続する
    WinSCP・・・SSHでファイルを転送する
    RealVNC・・・VNCでデスクトップに接続する
    Bonjour Print Services for Windows・・・IPアドレスではなく、ホスト名でアクセスするためのツール
    (そろそろ面倒になってきたので)インストール手順は割愛します.

    なお、最後のBonjourIPアドレスを固定する場合は不要です。
    Bonjourが何者かいまいち把握していないのですが、Zeroconfというほぼ設定なしでネットワークを使えるようにするための仕様があり、そのAppleによる実装、とのことです。なので、Macでは標準で利用可能であり、WindowsでもiTunesがインストールされている場合は同時にインストールされているので不要です。

  4. タイムゾーンの設定
    既にリモートで接続できる状態になっているので、Tera TermでRaspberry Piに接続して管理者権限で raspi-configを実行します。
    $ sudo raspi-config

    実際の画面はこんな感じ。
    f:id:tomaberry:20161225131652p:plain
    以降、下記の順で設定すれば日本時間に切り替わります。
    4 Internationalisation Options を選択
    I2 Change Timezone を選択
    アジア を選択
    Tokyo を選択

  5. 画面解像度の設定
    そのままVNCで接続すると、画面サイズがやたら大きくなったり小さくなったりします。(この辺の条件はよくわかりません)
    あまり大きいとVNCのレスポンスが悪くなるし、逆に小さ過ぎると使いづらくなるので、程々なところで固定しておきたいところです。
    管理者権限で/boot/config.txtを編集します。
    $ sudo vi /boot/config.txt
    以下の設定を追記します。
    hdmi_group=2    <- HDMI
    hdmi_mode=23 <- 1280x768 60 Hz
    ネットで調べて拾った設定ですが、ウチの環境ではこの辺が最適でした。
    再起動後に反映されます。

  6. 日本語入力環境の導入
    標準ではデスクトップ環境で日本語入力ができないため、日本語入力ソフトとしてGoogleが開発した”Mozc”をインストールします。
    $ sudo apt-get update    <- パッケージリストの更新
    $ sudo apt-get upgrade <- パッケージの更新
    $ sudo apt-get install ibus-mozc
    インストールが終わったらRaspberry Piを再起動します。
  7. $ sudo reboot
    再起動後VNCでデスクトップに接続し、日本語入力をONにします。

    f:id:tomaberry:20161225175306p:plain
    「US」となっているアイコンをクリックし、「日本語-Mozc」を選択すると日本語入力モードになります。

    f:id:tomaberry:20161225175415p:plain
    これで「半角/全角」キーで入力モードの変更ができるようになります。

これでとりあえずの初期設定は完了です。
あとは用途によっていろいろ設定することになりますが、共通の設定としてはこんなところかと思います。

Raspbian(OS)のインストール

Raspberry Piが届いたら、まずはOSをインストールします。

OSのインストールというと何やら大変な作業を想像しますが、とても簡単にインストールできる仕組みが出来上がっています。

  1. OSイメージのダウンロード
    Raspberry Piの公式サイトからOSイメージをダウンロードします。
    https://www.raspberrypi.org/downloads/

    f:id:tomaberry:20161223195543p:plain

    インストールするのは推奨OSの「Raspbian」ですが、ここでは「NOOBS」を選択します。NOOBSを使えばmicroSDカードに簡単にRaspbianがインストールできます。

    f:id:tomaberry:20161223195554p:plain

    NOOBSの「Dowload ZIP」をクリックしてzipファイルをダウンロードします。

  2.  microSDカードのフォーマット
    インストールの前にmicroSDカードをフォーマットします。
    OSの標準機能によるフォーマットではなく、SDアソシエーション(SDカードの規格策定団体)が配布している「SD Formatter 4.0」 を使用することが推奨されています。
    ダウンロードはこちらから。

    https://www.sdcard.org/jp/downloads/formatter_4/

    f:id:tomaberry:20161223194652p:plain
    ダウンロードしたファイルをインストールし、SDフォーマッターを起動します。

    f:id:tomaberry:20161223215011p:plain
    「オプション設定」で「クイックフォーマット、論理サイズ調整ON」に設定し、ドライブが正しいことを確認して「フォーマット」ボタンをクリックすれば、フォーマットが開始されます。

  3. microSDカードにNOOBSをコピー
    1.でダウンロードしたzipファイルを解凍し、2.でフォーマットしたmicorSDカードにコピーします。

    f:id:tomaberry:20161223213733p:plain

    これで作業用PCでの準備は完了です。
    次はいよいよRaspberry Piを起動してOSのインストールを行います。 

  4. Raspberry Piを起動
    3.でNOOBSをコピーしたmicroSDカードを挿してRaspberry Piを起動します。
    この時、HDMIディスプレイとUSBキーボードおよびマウスを接続しておいてください。
  5. インストールの実行
    Raspberry Piの起動後にインストール設定画面が表示されるので、「Raspbian[RECOMMENDED]」を選択し(それ以外選択できませんが)、言語を「日本語」、Keyboardを「jp」として「Install」ボタンをクリックします。
    (しばらくハードコピーが取れないので見づらい画面が続きますが、ご容赦ください)f:id:tomaberry:20161224220915j:plain
    警告が表示されますが、「はい」で続行。f:id:tomaberry:20161224221723j:plain
    microSDカードのスピードにもよりますが、10~30分程度でインストールが完了します。f:id:tomaberry:20161224222035j:plain
    「OK」ボタンをクリックして続行すると、デスクトップが起動します。f:id:tomaberry:20161225083223p:plainこれでRaspbianのインストールは完了です。

インストールされたRapbianバージョンは8.0で、Raspbian単独のバージョンではなく、ベースとなっているDebian GNU/Linuxのバージョンでカウントするようです。
8.0のコードネームは「Jessie」となっており、ネットで検索する場合はこのコードネームで検索するとよいかもしれません。(結構バージョンによって挙動が変わってくるので)

ちなにみ今回、ブログに書くために半年ぶりに再インストールしているのですが、半年前とはすでにかなり違っていて、いろいろ戸惑ってます。。
デスクトップ環境が「PIXEL」というRaspbian独自のものに入れ替わってますので、ネット検索の際はこの辺もキーワードにすると良いかもしれません。