レトロでハードな物語

レトロなゲーム機・マイコン・中古デバイスなどをArduinoやAVRで再活用する方法を模索しています。

PCとPro MiniをI2Cでつないでみる

2019年02月05日 | 電子工作

前回、Arduino Pro MiniとPCでMAX232を使ったシリアル通信を行いました。Pro Miniにはシリアル以外にI2Cというシリアルバス通信機能があります。普通のPCにはI2Cインターフェイスはありませんが、こんなものを使えばPCにI2Cデバイスをつなげます。



サンハヤトのMM-CP2112Aというモジュールで、USBに接続するとI2Cインターフェイスと8ポートのGPIOが利用できます。税抜きで¥1,700でした。Arduinoに手を出す以前に購入したものです。

標準HIDデバイスなので専用ドライバが不要とかマイコンのプログラミング不要とかいう謳い文句につられて買ってしまったのですが、PCとつなげてもHIDデバイスがつながったというだけで、HIDのコントロールプログラムを書かないと何も出来ません。結局サンハヤトのサイトからダウンロードしたサンプルプログラムをコンパイルしてLチカさせただけでお蔵入りしてしまいました。これを買うくらいならArduinoを購入したほうが遥かにマシです。もっと早くArduinoを知っていれば買わなかったのに…。

しかし、ただ寝かせておくのももったいないので、この機会に利用してみましょう。

まずはPro MiniをI2Cのスレーブにするためのスケッチを作成します。I2C通信にはマスターからスレーブにデータを送るだけのものと、マスターからスレーブに送信要求を出してデータを受け取るものの2種類があるとのことです。そこで勉強のためPro Miniにはこの2通りの通信手順を実装してみることにしました。
最初にマスターから送られてきたデータ(今回は文字列にします)をメモリに保存しておき、次にマスターから送信要求がきたらこの文字列データを送り返すようにします。
作成したスケッチはこちらです。

I2Cslave.ino

動作確認のためにマスターのスケッチも作成しました。

I2Cmaster.ino

このスケッチはI2C接続されたスレーブに文字列を送り、その後送信要求を出してその文字列を受け取るという動作を繰り返すものです。ArduinoのI2C通信のバッファサイズは32バイトのようなので、文字列の長さも32バイト限定の手抜き仕様です。
LeonardoやPro Micro向けに書いたスケッチですが、他のArduinoでも動くでしょう。#ifdef文中のSerial1は前回ちょっと紹介したデバッグ用のデバイスに表示するためのものなので、Serialに書き換えるなど利用する環境に合わせて変更して下さい。

次にMM-CP2112Aのプログラムですが、あまり情報がなくサンハヤトのサイトからダウンロードできるサンプルプログラム(Sample_MMCP2112_MMTXS03.zip)だけが頼りです。このサンプルはC#で書かれているので開発はWindowsのVisual Studio 2015で行いました。GUIにWPFを使用しましたので、プロジェクトはWPFプロジェクトとして作成して下さい。プロジェクト名はMMCP2112で.NET Frameworkのバージョンは4.6.1にしました。
C#からHIDデバイスにアクセスするにはライブラリが必要なので、サンハヤトのサンプルに入っているSLABHIDDevice.dllとSLABHIDtoSMBus.dllを使います。これをプログラム実行時に読み込めるように、*.exeファイルが作成されるフォルダーにコピーしておく必要があります。また、これらのライブラリを使用するためにサンプル内のSLABCP2112.csも必要になりますのでプロジェクトに追加しておきます。

作成したC#のソースは以下の2つです。

MainWindow.xaml

MainWindow.xaml.cs

該当するソースに上記の内容をコピペするなどして下さい。まあ、Arduinoを使用している人はMM-CP2112Aなんて必要ないでしょうから詳しい説明は省きますが、一応使い方だけ書いておきます。

プログラムを実行するとテキストボックスが上下2つあるウィンドウが表示されます。上のテキストボックスに文字列を入力してその下の'送信'ボタンを押すと、文字列がI2C接続されたPro Miniに送られます。送られる文字列の長さは32バイトまでで、それ以上長いとカットされます。
次に'受信'ボタンを押すとPro Miniに送った文字列が返されて、下のテキストボックスに表示されます。

ところでMM-CP2112AとPro MiniのI2C端子を接続するのに1つ問題があります。手持ちのPro Miniは5V動作のものなのですが、MM-CP2112Aは3.3V動作になっています。これらを直接つなぐのは機器の破損の可能性もあるので避けるべきです。なので、なんらかの方法で電圧の変換を行う必要があります。

そこでこれ。



サンハヤトのロジックレベル変換モジュールMM-TXS01です。1.2~5.5Vまでの電圧を相互変換できます。いつかRaspberry PiとArduinoを接続しようと思い、ちょっと前にAmazonで購入しておいたものです。¥810でした。
ちょうどいい機会なので動作確認も兼ねて使ってみます。

使い方は簡単で3.3VのMM-CP2112AのVccを変換モジュールのVccAへ、Pro MiniのVccをVccBに接続し、それぞれのGNDは変換モジュールのGNDに一緒につなぎます。あとはそれぞれのSDAとSCLをA1-B1やA2-B2など対応する端子を介してつなぐだけです。
実際につないで確認してみると、きちんと動作しました。



これでPCとArduinoをI2Cで接続する環境が整いました。けど、つないで何をしましょうか?今のところなにも思いつきません。
またしばらくの間MM-CP2112Aはお蔵入りになりそうです。

ところでRaspberry Piについて話が出たついでに触れますけど、最近Raspberry Piの動作環境を整理しているときに知ったのですが、去年発売のRaspberry Pi 3 Model B+はUSBブート標準対応だそうですね。手元にあるRaspberry Pi 3 Model BでもゴチャゴチャやればUSBブート対応になりましたが、最初から設定無しでUSBブート出来るのはいいですね。USBハードディスクからブートしたらもう普通のPCです。

以前Pi3 Model Bで試したときは手持ちの古いUSBハードディスクでブートしなかったので、もしかしたらこのタイミングでファームを最新のものにアップデートすればUSBブートが改善されているかもという甘い期待をもってしまい、USB-HDDブートに再チャレンジしちゃいました。でも残念ながら失敗でした。起動できるハードディスクには相性もあるようで、手持ちのハードディスクではだめなようです。

でも、USBフラッシュメモリや100円ショップで購入したUSB接続のSDメモリカードリーダーなどからブートすることは出来ました。そこで古い256MのSDフラッシュメモリにブートローダーとブートパーティションを書き込み(起動時にハードディスクがルートパーティションとなるように設定を書き換えます)、USBハードディスクにルートパーティションを書き込んでRaspberry Piにつなぎ、SDメモリをSDメモリカードリーダーに入れてUSBブートさせると、ハードディスクからRaspbianを起動させることが出来ました。

これでフラッシュメモリの寿命を気にすること無く、Raspberry Piでコンパイル作業をいくらでも行うことが出来るようになりました。RaspbianでArduino IDE動かすことも出来るようなので、いずれ試してみたいですね。



最新の画像もっと見る

コメントを投稿