キノコの自省録

テクノロジーとコンテンツの融合を目指して

RaspberryPiを使ってHiLetgo 0.91" I2C シリアルLCDモジュールを表示させてみる

送料無料の上にとても安価なHiLetgo品をAmazonでたまに買うのですが、HiLetgo製品の中に、420円で買えるLCDモジュールがあります。

HiLetgo 0.91" IIC I2C シリアルOLED液晶ディスプレイモジュール 128x32 3.3V/5V AVR PIC Arduino UNO MEGA [並行輸入品]

カスタマーコメントにも、RaspberryPiでも表示できた旨のコメントがありましたので、購入して表示させてみました。とっても簡単です。このエントリも覚書程度。

まずこれは何物?

ドライバICがSSD1306なので、SSD1306を制御してやればよいということです。これはAdafruit製のようですね。データシートはこちら。

https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf

かなり親切なチュートリアルもあります。

https://learn.adafruit.com/ssd1306-oled-displays-with-raspberry-pi-and-beaglebone-black?view=all

配線

I2Cです。電源電圧は3.3Vでも5Vでもいいようです。必要な電流値はMax15mAとなってますので、3.3Vからの給電で十分です(RaspverryPiの3.3Vピンは最大50mAなので)。あとは普通にI2C接続をすればOKです。raspi-configから、I2Cを有効にするのを忘れないようにしましょう。結線完了したら、

$ i2cdetect -y 1

で確認。アドレス3cが見えていたら成功です。

表示

チュートリアルのUsageの通りです。抜粋しておきます。なお、これらはRaspberryPi上で実行します。

$ sudo apt-get update

$ sudo apt-get install build-essential python-dev python-pip

$ sudo pip install RPi.GPIO

$ sudo apt-get install python-imaging python-smbus

ビルドツールやらpipやらの基本セットですね。RPi.GPIOやpython-smbusは、最近のRaspbianには既にインストールされていると思いますが、とりあえずそのまま記載しておきました。これらをインストールした後、gitからライブラリをcloneしてビルド~インストールします。

$ sudo apt-get install git

$ git clone https://github.com/adafruit/Adafruit_Python_SSD1306.git

$ cd Adafruit_Python_SSD1306

$ sudo python setup.py install

上手くいけば、準備完了です。exampleディレクトリにサンプルコードが入っていますので、実行してみます。

$ cd example
$ python stats.py

上手くいけばこんな感じにスタッツが表示されます。

f:id:kinokorori:20170820213739j:plain

$ python image.py

これを実行すると、猫の絵が表示されます。

f:id:kinokorori:20170820213806j:plain

とりあえずこんな感じで。非常に小型で、かなり綺麗です。ただ、Amazonのカスタマーレビューにもありますが、取り付けする場合にちょっと困った形をしています。うまくカバーを作ってやらないと、基盤が見えてしまいます。

RaspberryPi ZeroとESP-WROOM-02を繋いでみる

RaspberryPi ZeroにはWiFiモジュールがないので、単独ではネットワークに接続できません。解決方法として、ZeroをホストにしてUSBでWiFiドングルを繋ぐ、というのが一番早そう(試してはいませんが)ですが、ESP-WROOM-02なるWiFiモジュールが巷で評判だったので、繋いでみました。今回は、秋月のDIP化キットを使用しました。

akizukidenshi.com

ESP-WROOM-02って何?

正直、「WiFiモジュールならなんか繋がるんだろう」程度で、ろくに下調べもせず買いました……。まあ650円ですし。

WiFiモジュールなのは確かですが、バスで接続するわけではなく、モジュール単品で動作します。実はArduino IDEを使ってファームを書き換えることができます。Arduinoそのものではないですが、いわばWiFi積んだ疑似Arduinoです。SPIやI2Cなどのピンがなんで出てるんだろう?と不思議でしたが、そういうことです。

デフォルトのファームでは、これらのピンは使用せず、UARTを介してATコマンドで会話します。組み込み機器なんかではよくある、外部マイコンとメインボードが通信するというような感じですね。ということで、面倒くさいです。ラズパイならドングル挿した方が楽でしょう。

回路

ESP-WROOM-02の動作電圧は3.0V~3.6Vということで、3.3Vの電源ピンから供給できそうに見えますが、電流が平均でも80mAで、RaspberryPi3.3Vの最大出力50mAを超えてしまいます。そのため、5Vを使って、3.3Vへ3端子レギュレータでドロップしました。使用した3端子レギュレータはNJU7223F33です。

それ以外は、こちらのエントリを参考にして配線しました。

ESP-WROOM-02 の配線 - Qiita

実物写真はこちら。タイトルにZeroと書いておいて3B使ってますが、まあ同じということで……。あと、送信(Tx)と受信(Rx)はちゃんとクロスするように配線しましょう。たまにTx-Tx, Rx-Rxを結線する人がいますが、それだと動きません。

f:id:kinokorori:20170812223627j:plain

バイスの確認

RaspberryPiは、デフォルトでSerialが無効になっているので、有効化する必要があります。RaspberryPiのコンソールを開いて、

$ raspi-config

から、Serialを有効にします。

正しく機器が接続されているならば、/dev/ttyS0が出現すると思います。とりあえず、

$ ls /dev/tty*

でチェックしてみてください。挿抜で出たり消えたりするデバイスがあれば、それがWROOM-02です。

ターミナルソフトを利用した通信コマンドの送信

物理的な結線が確認できたら、次にシリアルを介してWROOM-02にコマンドを送信してみます。コマンドはいろいろあるのですが、とりあえずは、ATを送信して、OKが返ってきたら成功です。

多くの人はssh経由でRaspberryPiを操作していると思いますが、それだとssh用ターミナル - シリアルターミナル - WROOM-02というように、ターミナルを複数経由することになってしまいます。特に、WROOM-02のコマンドは、改行コードCR+LFを送信、WROOM-02からはLFで受信というようになっており、大抵わけのわからないことになります。

なので、今回はcutecomというUI付きアプリを使って、RaspbianのGUIから直接操作する方法を紹介します。cutecomは、普通にaptから取得できます。

$ sudo apt-get install cutecom

インストールしたら、

$ cutecom &

で起動します。画面はこんな感じです。

f:id:kinokorori:20170813202924p:plain

設定はこのスクリーンショットの通り、Deviceを/dev/ttyS0に、通信設定を115200baud,8bit,1にします。ウィンドウ下部に改行コードの設定がありますので、そこでCR+LFを指定します。Open Deviceボタンで接続した後、Inputから”AT”と入力して送信してみましょう。そこでOKと返ってきたら成功です。”AT+GMR”を送信すると、バージョンが確認できます。

VNC

少々脇道にそれて、VNCリモートデスクトップ)の設定について。HDMI繋いで、キーボードとマウス繋いで……とやっていると非常に面倒なので、直接RaspberryPiのデスクトップを触りたい場合、VNCを利用しましょう。最近のRaspbian Jessieには、デフォルトでVNCがインストールされていますので、利用は簡単です。

  1. raspi-configからVNCを有効にします
  2. $ vncserverを実行して、RaspberryPiのVNCサーバを起動します
  3. クライアント側から、vnc://xxx.xxx.xxx.xxx:5901に接続します

Macの場合、Finderのメニューから、Go->Connect to serverで、上記vnc://~を入力すると接続できます。

http通信のテスト

ほぼこちらのエントリ通りです。

ESP-WROOM-02: ATコマンドによるWifi動作確認 - Qiita

流れとしては、

  1. WiFiルータに接続
  2. TCPコネクション確立
  3. HTTP GET送信

という感じです。まず、WiFiルータへ接続するには、以下のコマンドを実行します。

AT+CWMODE_DEF=1
AT+CWLAP
AT+CWJAP=“SSID”,”passwd”

AT+CWMODE_DEFでWROOM-02のStationモード設定、AT+CWLAPでSSIDリスト取得、AT+CWJAPで接続しにいきます。AT+CWJAPが成功すると、以下のような応答が返ってきます。

AT+CWJAP=“foobar”,"hogehoge12345”

WIFI CONNECTED
WIFI GOT IP

OK

これでWiFiルータに接続できました。次にTCPコネクションをどこか適当なところに張ります。

AT+CIPSTART=“TCP”,”192.168.1.10”,80
AT+CIPMODE=1
AT+CIPSEND
>

AT+CIPSENDが受け付けられると、コマンドプロンプトよろしく、>が出現します。この状態になれば、TCPコネクションが確立されていますので、HTTP GETがリクエストできるようになります。

GET / HTTP/1.0

実際、googleにGETリクエストを投げて取得した応答がこちらです。

>HTTP/1.0 302 Found
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Referrer-Policy: no-referrer
Location: http://www.google.co.jp/?gfe_rd=cr&ei=U46OWb62O5DR8gfkybeQBg
Content-Length: 261
Date: Sat, 12 Aug 2017 05:12:51 GMT

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.co.jp/?gfe_rd=cr&amp;ei=U46OWb62O5DR8gfkybeQBg">here</A>.
</BODY></HTML>

上記コマンドは一体何をやっているのか、他にどんなコマンドがあるかは、こちらのページが非常に見やすいです。

ATコマンド集 — ESP-WROOM-02-Note 1.0 documentation

まとめ

RaspberryPiのUARTを通してESP-WROOM-02と接続してみました。シリアル間通信なので、ブラウジングなどの複雑な用途には不向きですが、サーバにセンサデータをPOSTするなどには使用できると思います。RaspberryPiとWROOM-02を併用しなければならない事態というのはなかなか想像しにくいところですが、覚えておいて損はないかもしれません。

RaspberryPi ZeroをMacとUSB OTGで繋いで制御するまで

RaspberryPi Zeroが手に入りやすくなっていたので、購入してみました。購入はKSYから。料金はZero本体が600円、送料・支払い手数料が700円、消費税104円で合計1404円でした。本体より手数料の方が高いですね。ちなみにWiFiなしモデルです。

接続に必要なケーブルなど

色んな方が書いていますが、基本はUSBAオス-microBオスケーブル1本で繋ぐことができます。

そんな事情も知らずに衝動買いしたため、どういう風に外と繋ぐか頭になく、届いてから慌てました。何しろ3BとZeroではデフォルトのインタフェースが結構異なります。同じなのは電源(microB)、microSD、PiCameraの口くらいだと思います。

  • HDMI・・・3Bは通常のHDMI, Zeroはmini
  • GPIO・・・ピン数は一緒だが、ピンヘッダがない
  • LAN・・・ZeroにはLANソケットがない
  • マイク端子・・・Zeroにはない
  • USB端子・・・3BはAが4つ、ZeroはmicroBが1つ。
  • WiFi・・・ない(WiFi付きモデルも販売されているが、より入手困難)

LANもWiFiもないため、SSHで入れません。それにUSB端子もmicroBなので、microB->Aメスに変換して、Aメスからハブ繋いでマウスとキーボードを繋ぐ、みたいなことをしないと、直接叩くこともできません。

しかし、上述の通り、Zeroは普通のUSBAオス-microBオスケーブルだけで開発が可能になっています。設定を少し弄ると、USBをEtherDeviceとして動作させることができます。ということで、必要なのは以下の3つ。

  • USBケーブル(Aオス-microBオス)
  • microSD
  • ピンヘッダ2x22 (for GPIO)

ピンヘッダは半田付けしておきましょう。

USB IPを利用するための設定

USBからEtherDeviceとして接続するために、ちょっとだけ作業が必要です。下記リンク先の説明が一番シンプルでわかりやすいと思います。

Simple guide for setting up OTG modes on the Raspberry Pi Zero, the fast way! · GitHub

  1. SDCardにRaspbian Jessieを描き込む(これは従来のRaspberryPiと変わりません)
  2. boot直下にあるconfig.txtの末尾にdtoverlay=dwc2を追加
  3. boot直下にsshという空ファイルを生成する($ touch /Voluems/boot/ssh)
  4. boot直下にあるcmdline.txtを開き、modules-load=dwc2,g_etherをrootwaitの後ろに追加する
  5. ZeroとMacをUSBで繋いで起動し、90秒ほど待ってから、ssh pi@raspberrypi.localでインしてみる(初期パスはraspberry)

起動は結構遅いので、気長に待ちましょう。4をミスると最悪起動しなくなるので注意。リンク先にコピペ用テキストが載っているので、それを使った方が安全かもしれません。

ちなみに、このモードをRaspberryPi Zero USB OTG(On the go)と呼んでいるようです。PWR INという従来と同じmicroBの給電の口がありますが、OTGで使用する場合、ここから給電しなくても動作します。電流が足らない場合に差すといいと思います。

USB OTG?

USBは、PCとMouseの関係のように、通常はホストとデバイスがはっきり決まりますが、デバイスがホストになることもできるのがOTGです。オンザゴーと読みます。Androidが一番わかりやすいですかね。AndroidはPCと繋ぐとデバイスとして機能しますが、microBからデバイスを繋ぐと、ホストとして動作させることができます。例えば、USB Serial(FTDIなど)を繋ぐと、/dev以下にデバイスが出現して、openすることでデバイスをコントロールすることができたりします。

ということで、USB OTG=USB Etherではありません。上記設定をすると、USB Deviceモードの場合はEtherとして起動するようにしているだけです。Zeroで使用されているOTG Controllerはこれではないかと思います。dwc=DesignWare Coresです。

www.synopsys.com

従来のRaspberryPiでは、残念ながらこの技は使えません。USBポートはAメスしかないためで、Aメスの場合はOTGが使えず、常にホストとして動作します。ここのページが詳しいですが、micro(およびmini)Bはピンが5個出ていますが、Aは4本(5V,D+,D-,GND)しかありません。

http://ktsite.ddo.jp/kikaku/usb/index.html

microBのIDピンを開放状態で使用した場合はデバイス、GNDへ短絡した場合はホストとして動作します。IDをGNDへ短絡させたケーブルをOTGケーブル、もしくはUSBホストケーブルと言います。USBホストケーブルの方が実情に即している気がしますね。

なお、規格としてのOTGは、どちらがホストとなるかデバイスとなるかをその場その場で切り替えるデュアルロールを目指しているため、ホストとデバイスが一意に決まってしまうUSBホストケーブルは邪道なんじゃないの?と思ったりしますが、詳しくは以下のページのOTG補足を参照してみると良いと思います。

USB On-the-Go(OTG)| 3分でわかるシリーズ | [技術コラム集]組込みの門 | ユークエスト株式会社

インターネットへの接続

話をZeroに戻します。SSHでつながったとは言え、WiFiもLANも繋がっていないので、インターネットに接続できません。つまりapt-getもできません。ただ、Macならインターネット共有から、実に簡単にネットワーク機能を提供することができます。

f:id:kinokorori:20170624162236p:plain

このRNDIS/Ethernet GadgetがZeroです。ここにチェックを入れてInternet共有をすると、特に苦も無くZero上でインターネットが利用できるようになります。

ZeroでYMZ294を制御してみる

YMZ294の回路をそのままにしてあったので、3Bと差し替えてみました。ごくごく普通に動作しました。起動がおそいなーという程度。写真見ておわかりのように、ミニブレッドボードの幅1.5倍くらいしかありません。非常に小さい。

f:id:kinokorori:20170625003423p:plain

動画はこちら。ただ単純に再生できたよ、という確認だけにすぎませんが・・・。曲はAve Mariaです。

youtu.be

お絵描き

【緒方智絵里】「フラワーエンジェル」イラスト/kinokorori [pixiv]

一応、今回気にした点を備忘録的に。

  • 輪郭線の色

絵がどうも固くなってしまうところが気になったため、今回は輪郭線を輪郭対象の色に近づけて描いています。ほぼ影と同じ扱いで描いている感じです。

  • 光の入れ方と色

光の入れ方は、今まで逐次髪なら髪、服なら服、肌なら肌と各自バラバラに光を入れていたんですけど、最後に0x4C4C30くらいの色を一気に描いて、少し統一感を出してみています。艶消し状態から一気に入れたということです。光源追加前はこんな感じ。

f:id:kinokorori:20170621230217j:plain

それにしても、自分の絵が良い方向に進んでいるのか、少しはイケてる絵が描けてるのか、あんまり自信がありません。むしろ、絵の練習を始めたころの方が、自分はイケていたという謎の自信があった気がします。

当時良く描けたと思っていた絵も、半年くらい経って見返すと、「うわなんだこれ」という感想しか出ずに凹む、というのを何度も繰り返しているので、すっかり自分の目に自信がなくなってきます。自分の絵ってなぜか客観視しづらいんですよね。

ディベートは人を屁理屈で言い負かす弁論術ではありません

ディベートが割と誤解されている風潮がありますので、ディベート本の紹介を。

amzn.to

ビジネス・ディベート (日経文庫) | 茂木 秀昭 |本 | 通販 | Amazon

どちらも素晴らしい本です。非常に読みやすくもあるので、ぜひ読んで欲しいと思います。

ディベートって何?

ディベートは、決められた論題に対して、肯定派と否定派とにわかれ、それぞれがルールに従って主張を行う競技です。 そう、競技なんです。ルールがあります。審査員もいます。

肯定派と否定派が意見を述べる時間が決まっており、大体以下のような順序で行われます。

  • 肯定側立論
  • 質疑
  • 否定側立論
  • 質疑
  • 否定側第一反駁
  • 肯定側第一反駁
  • 否定側第二反駁
  • 肯定側第二反駁
  • 否定側結論
  • 肯定側結論

立論というのは、「私はこう思いますよ」という主張を、なぜそう思うのかという理由とともに説明する時間です。 反駁は、相手の主張に対して、いやいや違いますよというリアクションでの反撃を行う時間です。

論題は、必ず賛否が明確に分かれるように設定されます。例えば、 「死刑制度は廃止すべきである」 「日本は移民を受け入れるべきである」 「当社は英語を公用語とすべきである」 といった具合です。

相手を言い負かすのが目的なんですか?

Noです。肯定派も否定派も、相手の意見を聞いて、立場を変えるようなことをしません。ディベートは、どちらの言い分がより説得力があるかを、審査員という第3者視点で判断し、優劣を競うゲームです。最終的にどっちが良かったかジャッジされるということです。

また、論述に対する意見を述べるのであって、人格攻撃や、論題と無関係なことを述べてはいけません。そして、肯定派を取るか否定派を取るかは、大抵くじで決まります。その人の信条と同じか違うかはあまり関係ありません。

ゲームスキルってことになるけど実践で使えるわけ?

冒頭で紹介した本でも力説されていますが、考え方の教育に非常に適していると思います。その効果は、ディベートはルールのあるゲームだからこそでしょう。

理由1. 審査員が判断する

審査員は、述べられた意見に対して、どちらの方が説得力があったかを審査します。審査員による評価が入ることで、自分の意見の組み立てが適切だったかどうかの振り返りの機会が得られます。

例えば、社内公用語の英語化について、否定派が「英語だとコミュニケーションロスが増えるから反対です」とだけ主張をした場合、否定派に賛同できるでしょうか?

Noでしょう。これだけだと、あっそう、で終わってしまいます。その主張の理由付けが要ります。例えば、どれくらいのコミュニケーションロスが発生するのか?それは他でリカバリできないほど深刻だと言えるのか?英語の公用語化のメリットを上回るほどのものなのか?その問題が業績にどれくらいのインパクトを与えるのか?などの観点から説明を加える必要があります。でないと、ただのボヤキです。

ここで役に立つのが演繹法帰納法などの垂直思考になります。垂直思考が出来ていないと、論理の接続がおかしいため、ツッコミが入ってしまいます。ここの辺りの考え方は、紹介した本に丁寧に書かれています。

また、審査員がいることで、先ほど書いた人格攻撃のような、無意味な論述は排除されます。これも大きなメリットです。

理由2. 論述の順番と時間が決まっている

時間が決まっているので、声のでかい一人が延々としゃべり続けることはできません。また、論旨不明のままダラダラしゃべってしまうと、すぐ時間切れになってしまいます。発言する内容を精査し、取捨選択する必要があります。時間設定にも拠ると思いますが、立論で主張できるポイントは、大体2つくらいです。

この主張ポイントはただ増やせばいいというものではなく、ポイントが増えた分、どうしてもそれぞれに対する「なぜそう思ったのか」を述べる時間が短くなります。主張ポイントの優先順位付けと、どのくらい述べるかの戦略を練る必要があるということです。

日常見られるような長ったらしい会議も、座長はこんな感じの戦略をあらかじめ練って欲しいと常々思っています・・・。

理由3. 相手がいる

これは割とディベートならではの環境だと思いますが、自分たちと真逆のポジションを取った相手がいます。相手の立論や質疑、反駁をよく聞いて、その主張を理解する必要があります。相手の主張に穴がないか、相手が何を狙ってこちらの攻撃をしているのかなどを判断し、自分たちの戦略をその場で練り直す必要がでてきます。いわゆるクリティカルシンキングです。

立論で終わらず、意見の応酬があるのがミソですね。相手がどこからパンチを繰り出してくるのか、ある程度予測しなければならず、不測の事態にも対処しなければならないということです。

理由4. しゃべる

当たり前ですが、実際にしゃべります。喋り方も、やはり説得力に直結します。プレゼンスキルは誰しも重要だと思っていますが、そのトレーニングにもなります。

下の動画はフジテレビでやっていたディベートの番組で、現役高校教師チーム vs 落語家チームの対決です。実は、この現役高校教師チームの男性教師が、冒頭紹介した本の著者です。本でもチラッとこの時の紹介がありますが、落語家チームの話し方の上手さに舌を巻いていました。

www.youtube.com

それにしてもフジテレビがこんな本格的なディベート番組をやっていたことに驚きました。本を読むまで知りませんでした。

最後に

以上、本に書いてあったことを自分なりの解釈を織り交ぜながらディベートの説明をしてみましたが、自分には実際ディベートの経験がありません。興味はありますけど。

ただ、ディベートに必要な思考法が、現実のビジネスシーンでも非常に親和性が良いと感じています。「考える」というのは言うは易しで、なかなか身につかないスキルです。その「考える」ということがどういうことか、ディベートのトレーニングを行うことで、身につくんじゃないかと思います。

Raspberry pi + YMZ294用MMLプレーヤーコード公開

Raspberry pi + YMZ294用MMLプレーヤーのソースコードgithubに公開しておきました。ライセンスはMIT。

GitHub - kinokorori/rpi_psg_mml: MML player using Raspberry Pi with YMZ294(PSG).

使い方はREADME_ja.mdを参照してください。ごく一般的な再生のみサポートしていますが、オープンソースということで、適当に改変して使っていただければ幸いです。サンプルとして、Ave Mariaを16小節分再生するコード(sample-avemaria.py)もくっつけてあります。Raspberry PiArduinoと違って「こうやってピン配するよね」というデフォルトがないので、外側から設定できるようにはしてあります。

オリジナルで曲を書く場合、sample-avemaria.pyを改変するのが一番楽だと思います。MMLの文字列を弄って確認してみてください。

Raspberry Pi + YMZ294でのノイズ対策にコンデンサを使用する

前回はアナログフォトカプラでスピーカーを絶縁し、ノイズの少ない電源を用意しました。

kinokorori.hatenablog.com

今回はコンデンサでノイズ除去。アンプ周辺の回路図はこんな感じにしました。47μFはアルミ電解コンデンサです。ちなみに今までサボってYMZ294近辺のデカップリングコンデンサすら配置していませんでしたが、それも配置。

f:id:kinokorori:20170516004818p:plain

電源のパスコンもちょっと効果ありましたが、信号線(IN+,IN-)側の効果が大きく、ほとんどノイズが聞こえなくなりました。グランドノイズが大きいということですかね。ただ、全体的なボリュームが若干下がってしまう上に、少し音がマイルドになってしまいます。47μFから10μFに変更すると、PSG特有の元のとんがった音がある程度保存されますが、ちょっとだけノイズが気になります。22μFあたりが丁度よさげな感じ。なお、全体的なゲインが下がってしまうので、抵抗を1Kから100Ωに変更しています。

ノイズ対策にはコンデンサを使いましょうとか、アンプ回路を見ると、コンデンサが大量に配置されてたりしますが、実際に試してみると、おーなるほど、という感じです。オーディオも楽器もやらないソフト屋にとっては割と新鮮な体験だったりします。結構コンデンサ容量は勘だったり試行錯誤だったりという話を聞きますが、確かに入れ替えてみるとノイズ感がガラッと変わりますね。

非常に素人感満載ですが、動画も撮ってみました。

youtu.be