2018年6月2日土曜日

2つのmicro:bitで無線コントロールカーを作ってみた

0. はじめに

小中学生へのプログラミング教育用教材について興味があり、これまで下記のエントリを書いてきました。


どちらも Raspberry Pi 上の Scratch 1.4 を用いて物の制御を行う、という内容になっています。

しかし、この方法では以下の問題があり、やや敷居が高いのが難点です。

  • Raspberry Pi を初めて触る方にとっては物品の準備やOSのインストールから始めなければならないこと
  • Raspberry Pi 上ではScratch の新しいバージョン2が動作するものの、Flashベースのため動作が遅く、さらに電子工作に必ずしも適していないという点から、古いバージョン1.4を使わざるを得ない場面が多いこと

そこで、今回は目先を変えてBBC micro:bit をプログラミング教材として用いた場合に何が可能かを試してみました。BBC micro:bit とは、イギリスの英国放送協会 (BBC) が小学生の教育用に開発したマイコンボードです。

用いたのは以下のものです。


下図が完成状態です。
micro:bitを2つ持っていなかったので、コントローラー用の1台は、スイッチサイエンスにより開発されたmicro:bitの互換機であるchibi:bitを用いました。もちろん、chibi:bitでなくmicro:bitを用いても同じです。

chibi:bitには、スマートフォン用のモバイルバッテリーを電源として用いてます。


今回作成したのはタイトルにもあるように無線コントロールカーです。完成品の動画が下記になります。

2台のmicro:bitがBLEで通信して、バギーカー上のmicro:bitが車体を動かしています。


1. プログラム

プログラムはmicro:bitの公式サイトでプログラミング用のブロックを組み合わせることで作成します。

まず、受信側(機体側)のプログラムです。


送信機から 0 (静止)、1(前進)、2(左折)、3(右折)に対応する数値が送られてきますので、それに応じて2つの連続回転サーボを動かしています。

(P1, P2)のピンに対し、(90, 90)を出力すると静止です。
(0, 180)は全速で前進、(180, 0)は全速で後退、
(0, 0)は全速で左回転、(180, 180)は全速で右回転です。

上記のプログラムでは後退を用いず、左回転と右回転は速度を遅めにするためそれぞれ(80, 80)、(95, 95)と設定しています。これらは好みやモーターの特性によると思いますので、お好みで調整します。

次に、送信側のプログラムです。


こちらはあまり美しいプログラムにはなっていません。

micro:bitには「ボタンが押されたら」というイベントハンドラはあるのですが、「ボタンから指を離したら」というイベントハンドラがありません。

そのため、そのままでは「ボタンAを押したら」、「ボタンBを押したら」、「ボタンAとBを同時押したら」という3パターンしか動作を作れません。

このプログラムでは前進、左回転、右回転、静止、の4つの動作を作りたかったので、上記のプログラムではイベントハンドラを用いず、200msごとにボタンの状態をチェックすることにしています。

さらに、そのままでは最悪200msごとに通信が行われてしまいます。それを避けるために、現在のボタンの状態を表すstateという変数を導入し、stateの値が変化した場合のみ通信を行う、ということをしています。

上記を実現するため、「もし~なら~でなければ」の分岐命令を4重に組み合わせることになり、プログラミングの講義ではあまり教えたくないようなプログラムになってしましました。

2. まとめ

最後に、この題材の良いところと悪いところを列挙します。

良いところ
  • 普段使っているPC(Windowsなど)でブロックによるプログラミングができる
  • BLEによる通信が簡単
  • PCから切り離してもスタンドアロンで動作するプログラムが簡単に書ける(Raspberry Piでそれをやろうとするとそれなりに大変)
  • 連続回転サーボは標準のブロックだけで制御できるのでmicro:bitと相性が良い
悪いところ
  • 作ってみればわかりますが、:MOVE miniの機体の組み立てが、見た目ほどフレンドリーではない
  • 「ボタンを離したら」というイベントハンドラがないので表現できる状態が少ない
そんなところでしょうか。

どんな環境を用いる場合も当てはまりますが、後は用意する題材の工夫次第で十分面白い講義ができるのではないかと思いました。



「ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作」、「実例で学ぶRaspberry Pi電子工作」、「Raspberry Piではじめる機械学習」を執筆しました。

2017年12月13日水曜日

Raspberry PiのGPIOが引き出せる小型タッチスクリーンが届いたので電子工作に使ってみた

0. はじめに

(2024/7/30 Bookworm OS にて動作確認済)
2017年12月10日頃、Raspberry Pi用の小型タッチスクリーンでGPIOを引き出せるものが、amazonでセールされているというので話題になっていました。こちらです。
セール中は2656円でしたが、通常時でも十分安いですね。

この手の小型液晶はGPIOが塞がれてしまうものが多いのですが、それが利用可能なものは珍しいと思い、入手して利用してみました。

利用イメージはこちらです。ターミナルソフトウェアのLXTerminalが映った画面がこのタッチスクリーンです。そこから下方向に横向きにGPIOのピンが出ており、電子工作などに利用可能になっています。


以下、利用時におこなった設定などをメモしていきます。

1. まずは起動してみる

2017/11/29にリリースされたNOOBS 2.4.5でRaspbianをインストール済のRaspberry Pi 3が手元にあったので、そのままタッチスクリーンを差して起動してみたのが次の写真です。

特に何の設定もすることなく画面が映りました。画面の解像度は1280x720でした。さすがにこの解像度では文字が小さすぎて全く読めず、解像度を変更する必要があります。また、この状態ではタッチには反応しません。

以下でそれらの設定を行っていきます。

2. 設定

設定方法は付属のDVDのドキュメントに書いてあります。DVDにある圧縮ファイル Driver/LCD-show.tar.gz を展開すると LCD-show というディレクトリが現れるのですが、その中のスクリプトファイル MPI3508_480_320-show を管理者権限で実行すると設定が完了するようです。

しかし、システムの設定ファイルを丸ごと差し替えられるのが嫌なので、 MPI3508_480_320-show の中身を見ながら必要な設定を行っていくことにしました。

まず、/boot/firmware/config.txt の末尾に設定を記します。例えば、下記のように管理者権限のテキストエディタで/boot/firmware/config.txt を開きます。テキストエディタはviなどお好みのものをどうぞ。
なお、Bullseye までの OS ではこのファイルは /boot/config.txt ですのでご注意ください。
sudo mousepad /boot/firmware/config.txt
開いたファイル末尾に下記の内容を追記し、保存してからファイルを閉じます。
hdmi_drive=2
hdmi_force_hotplug=1
hdmi_group=2
hdmi_mode=87
#hdmi_cvt 480 320 60 6 0 0 0
#hdmi_cvt 800 480 60 6 0 0 0
hdmi_cvt 800 600 60 6 0 0 0

dtparam=spi=on
dtoverlay=ads7846,cs=1,penirq=25,penirq_pull=2,speed=50000,keep_vref_on=0,swapxy=0,pmax=255,xohms=150,xmin=200,xmax=3900,ymin=200,ymax=3900
最後の2行がタッチの設定を行っており、それ以外は解像度の設定です。800x600のみを有効にしています。実用に耐える解像度は800x480か800x600ではないでしょうか。

さらに、Bullseye 以降の OS では、上記内容を記述の上、さらにデスクトップ左上のメニューから「設定」→「Screen Configuration」を起動し、 そこから「Configure」→「Screens」→「HDMI-1」→「解像度」→「800x600」を選択する必要がありました。「解像度」にはデフォルトで利用可能な解像度に、 /boot/config.txt (/boot/firmware/config.txt) で有効にした解像度が追加されて現れるようです。

このとき、/boot/firmware/config.txt の解像度を(例えば800x600から800x480に)後から変更する場合、GUI アプリでデフォルトで利用可能な解像度(例えば1024x768 など)に一旦変更しておかないと、画面表示できなくなりますので注意しましょう。

以上の設定が終わってから Raspberry Pi を再起動すれば、800x600 の解像度でデスクトップが表示されるはずです。

ただし、このままではタッチの位置が上下逆転してしまうなど正しくないので、キャリブレーションによりタッチの位置を正しく反映するようにします。

次に、まず、下記のコマンドを実行し、/etc/X11/xorg.conf.d/99-calibration.conf を管理者権限で開きます。テキストエディタはお好みで。
sudo mkdir -p /etc/X11/xorg.conf.d
sudo leafpad /etc/X11/xorg.conf.d/99-calibration.conf
空のファイルが開きますので、下記の内容を記して保存し、ファイルを閉じます。
Section "InputClass"
        Identifier      "calibration"
        MatchProduct    "ADS7846 Touchscreen"
        Option  "Calibration"   "3948 236 3823 328"
        Option  "SwapAxes"      "1"
EndSection
この内容は、LCD-show/usr/99-calibration.conf-3508 を元に、私がキャリブレーションを行ったものです。

さて次に、以下のコマンドで xserver-xorg-input-evdev をインストールします。
sudo apt update
sudo apt install xserver-xorg-input-evdev
最後に、下記のコマンドを実行します。設定ファイルの優先順位を変更しているようです。
sudo cp -rf /usr/share/X11/xorg.conf.d/10-evdev.conf /usr/share/X11/xorg.conf.d/45-evdev.conf
以上で再起動すると、タッチの位置が正しくなっていると思います。

この解像度でもターミナルの文字を読むのはやや厳しいので、私の場合LXTerminalのメニューの「編集」→「設定」から、フォントサイズを14、ウインドウサイズを70x16(解像度800x480の場合)または70x18(解像度800x600の場合)に変更しました。この設定もお好みで。
LXTerminalの設定画面で「OK」ボタンが画面外にあるので苦労しますが、キーボードのTABキーで選択肢のフォーカスを画面範囲内の最下部のものに移動し、そこから「TABキー二回押してからEnter」で「OK」ボタンを押したことになります(この表現で伝わるか不安ですが)。

3. 画面タッチのキャリブレーションについて

以上で画面タッチによる操作が可能になったと思いますが、タッチ位置と画面上のカーソルの位置の微妙なずれが気になる方がいるかもしれません。その場合、xinput_calibrator というソフトウェアでキャリブレーションを行うと良いでしょう。まず、以下のコマンドで xinput_calibrator をインストールします。
sudo apt update
sudo apt install xinput-calibrator
インストールが終わったら下記のように xinput_calibrator を起動します。
xinput_calibrator
画面を4か所タッチするよう指示がありますので、指示通りペンでタッチします。すると、キャリブレーション結果が表示されますので、それを参考に /etc/X11/xorg.conf.d/99-calibration.conf を編集し、再起動すればよいのです。

4. GPIOについて

GPIOはそのまま使えますが、下図のSPI関係のピンとGPIO 25はタッチスクリーンで使用済であるようなので使わないようにしましょう。


5. 終わりに

この手の小型タッチディスプレイは沢山出ていますが、GPIOが利用可能なものは貴重ですね。設定もそれほど難しくありませんし、3000円前後なら十分試す価値はあるのではないでしょうか。



「ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作」、「実例で学ぶRaspberry Pi電子工作」、「Raspberry Piではじめる機械学習」を執筆しました。

2016年10月21日金曜日

Raspberry PiのGPIOを用いてPICマイコンに書き込みをしてみた

はじめに

Raspberry Pi上のScratchでアナログ入力を利用してみた」というエントリにて、PICマイコンを用いると、Raspberry Pi上のScratchにて簡単かつ安価にアナログセンサを取り扱えることを紹介しました。

ただし、PICマイコンには自作プログラムを書き込まなければならず、その書き込み用のツールPICkit3が6千円程度することがややネックでした。

しかし今回、PICkit3を必要とせず、Raspberry PiのGPIOからPICのプログラムを書き込む方法が分かったので紹介します。Raspberry Piをお使いの方ならば、数百円でPICマイコンにプログラムを書き込むことができるようになります。

この方法により、Raspberry Pi上のScratchでアナログセンサを取り扱うことがさらに身近になります。もちろん、それ以外の用途への応用も可能です。

用意するもの

今回、PICマイコンへプログラムを書き込むために用意するものは下記の通りです。
  • 3.3Vで動作するPICマイコン。本ページではAD変換とシリアル通信を取り扱うことのできるPIC12F1822PIC16F1823を用いました。5V以上でしか動作しないPICマイコンでも原理的に書き込み可能だと思いますが、3.3V←→5Vのレベル変換がさらに必要になるので、回路がやや複雑になるでしょう。
  • 9Vの角形電池1つ
  • 9Vの角形電池用スナップ1つ
  • MOSFET 2N7000を1つ:3.3V←→9Vのレベル変換に用います
  • 10kΩの抵抗2つ
  • ブレッドボード、ジャンパワイヤ:適宜


ソフトウェアの準備

まず、Raspberry Piにpickleというソフトウェアをインストールする必要があります。

pickleのページの「Installation」という項目に pickle-5.01.tgz と書かれたリンクがあるのでクリックし、ファイルをダウンロードします。

Raspberry Piのブラウザでは、通常「Downloads」または「ダウンロード」ディレクトリに保存されますので、ファイルマネージャでそれをユーザーpiのホームに移動しておきます。

そして、ターミナルソフトウェアLXTerminalを起動し、下記のコマンド順にを実行し、pickleをインストールします。
$ tar zxf pickle-5.01.tgz
$ cd pickle
$ make
$ sudo make install
以上で必要なソフトウェアのインストールが終わりました。そのターミナルを終了せず、そのまま下記のコマンドを実行します。pickleを用いるための設定ファイルを適切な位置に作成しています。
$ mkdir /home/pi/.pickle
$ leafpad /home/pi/.pickle/config
なお、NOOBS 3.2.1以降ではテキストエディタとしてleafpadではなくmousepadを用います。その場合、二つ目のコマンドは次のようになります。
$ mousepad /home/pi/.pickle/config
テキストエディタleafpadで空のファイルが開きますので、下記の内容をコピーして貼り付け、保存してください。
DEVICE=RPI2
SLEEP=1
BITRULES=0x1000
BUSY=0
VPP=4
PGM=65535
PGC=17
PGD=27
MCP=0x20
FWSLEEP=30
DEBUG=1
「DEVICE」が「RPI2」となっているのはRaspberry Pi 2 または 3 用の設定ファイルであるという意味です。
Raspberry Pi 4を用いている場合は、「DEVICE」を「RPI4」に設定してください。
また、Raspberry Pi 1系やZero系を用いている場合は数字を省いて「DEVICE」を「RPI」に設定してください。

その他の設定の意味については、公式サイトに説明があります。

回路の準備

次に、PICマイコンに書き込みを行うための回路を準備します。そのために、利用するPICマイコンのピン配置をあらかじめ調べておく必要があります。

PICマイコンへプログラムを書き込むにはいくつかの方法がありますが、今回用いるのは「High voltage programming」という手法です。一般に、マイコンにプログラムを書き込むことを「プログラミング(programming)」と呼ぶことにも注意しておきましょう。

この手法には「VDD」、「VSS(GND)」、「ISCPDAT」、「ISCPCLK」、「~MCLR」という5つのピンを用いますので、そのピンの位置を事前に調べておきます。

今回用いるPIC12F1822およびPIC16F1823の仕様書は英語版日本語版がありますが、それらによると、該当するピンは下記のように配置されていることがわかります。


High voltage programmingでは、~MCLRピンにPICマイコンの動作電圧より高い電圧(ここでは9V)の信号を与える必要があります。

Raspberry PiのGPIOから出力される信号は3.3Vなので、これを9Vに変換する必要があります。そのために、本ページではNチャネルMOSFETを用いた下記のようなレベル変換回路を利用します。

これは、「ロジックレベル双方向変換モジュールBOB-12009」で用いられている回路と同等なものです。


以上をまとめると、PIC12F1822を用いるときに構成すべき回路は下図のようになります。

この回路を構成する場合、9V電池の取り扱いには十分注意してください。9Vの部分をRaspberry Piに接触させると、Raspberry Piが壊れる可能性があります。同様に、回路の接続が正しいことのチェックも重要です。


ほぼ同じですが、PIC16F1823の場合は下図のようになります。


書き込み

最後に、書き込みを行いましょう。

書き込むプログラムをビルドしてできるHEXファイルを用意する必要がありますが、ここでは冒頭で紹介した「Raspberry Pi上のScratchでアナログ入力を利用してみた」というエントリで用いるファイルを書き込んでみます。

HEXファイルはPIC12F1822用とPIC16F1823用の2つしか用意しておりませんのでご注意ください。

まず、LXTerminalを新たに開き、下記のコマンドでファイルをダウンロードし、そのディレクトリに移動します。
$ git clone https://github.com/neuralassembly/TinyPicoBoard
$ cd TinyPicoBoard
pickleというソフトウェアをインストールした際、p12、p14、p16、p24、p32、などといったコマンドがインストールされ、用いるPICマイコンの種類によって使い分けるのですが、本ページではp14コマンドを用います。 まず、Raspberry Piに接続されているPICマイコンの情報を取得するには、下記のコマンドを実行します。
$ p14 id
その結果、下図のように、PICマイコンの情報が表示されます。PIC12F1822が認識されていることが見て取れますね。


TinyPicoBoardディレクトリにある「12f1822.hex」というファイルをPIC12F1822に書き込むには、下記のコマンドを実行します。上図にその様子が示されていますね。
$ p14 program 12f1822.hex
同様に、「16f1823.hex」というファイルをPIC16F1823に書き込むには、下記のコマンドを実行します。
$ p14 program 16f1823.hex
なお、PICに書き込まれているプログラムを消すためのコマンドとしては下記が使えます。消すことの確認を英語で求められたら、「y」をタイプしてEnterします。
$ p14 blank
書き込みが終わったPICは、「Raspberry Pi上のScratchでアナログ入力を利用してみた」に基づいて使用することができます。

終わりに

以上です。~MCLRピンに接続する信号を9Vにレベル変換する必要があることに気づくまで時間がかかってしまいました。

なお、本ページでは3.3Vで動作するPIC12F1822やPIC16F1823を対象としました。4V以上でないと動作しないPICマイコンの場合、恐らく下記のようにする必要があるでしょう(試していません)。
  • VPPピン:Raspberry PiのGPIOから5Vを与える
  • ISCPDAT、ISCPCLKピン:Raspberry Piの17ピン、27ピンと接続する際、3.3V←→5Vのレベル変換回路を介する必要がある



「ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作」、「実例で学ぶRaspberry Pi電子工作」、「Raspberry Piではじめる機械学習」を執筆しました。