matuconとマイコン

ITガジェットが好物です

自作”CPU”キット「TTM8」の無線プログラムライターを作ってみた

今回は自作”CPU”キット「TTM8」の拡張ボードを作ってみました。

プログラムの書き込みはTTM8付属のProgramBoardでできるのですが、入力に時間がかかるのとミスプログラムを動かすとプログラムが壊れてすべて入力しなおしです。 というわけでPCから書き込む仕組みを作ってみました。 ちょっと前にTwitterで動画にしましたが、こちらをユニバーサル基板化しました。 電子回路にあまり詳しくない素人が作ったものなので、いまいちなとこがあるかもです。

概要

PCからWiFi経由でTTM8のプログラムを書き込む拡張ボードです。 ざっくり以下の構成です。

シフトレジスタ操作
(3ポート)
シフトレジスタ操作 (3ポート)
リセット
信号
リセット 信号
M5ATOM Matrix
M5ATOM Matrix
拡張ポート
(26ピン)
拡張ポート (26ピン)
カスケード
接続
カスケード 接続
アドレスバス信号
(8ポート)
アドレスバス信号 (8ポート)
シフトレジスタIC
(アドレスバス用)
シフトレジスタIC...
データバス信号
(8ポート)
データバス信号 (8ポート)
シフトレジスタIC
(データバス用)
シフトレジスタIC...
WiFiでプログラム送信
WiFiでプログラム送信
RAM書込
信号
RAM書込...
CPU
停止信号
CPU...
GND
GND
拡張ボード
電源スイッチ
拡張ボード 電源スイッチ
TTM8
TTM8
Viewer does not support full SVG 1.1

パーツ 役割
PC(ブラウザ) TTM8のプログラムを入力するインターフェイス
M5ATOM Matrix 小型のマイコンで拡張ボードのコントローラ。主にWebサーバと書込み制御。
シフトレジスタ M5ATOM のGPIO数を拡張するためのIC。アドレスバス、データバスの送信用。
TTM8 拡張ポート経由でTTM8のRAMへ書き込み。

RAMの書込み手順

以下の操作を行うことで手動でRAMの書き込みができます。

  1. CPU停止
  2. データバス、アドレスバスに書き込みたい内容を出力
  3. RAM書込み信号送信

TTM8から出ている26ピンのケーブルから上記操作が行えます。 ピンアサインは以下のようになっていて赤字がRAM書き込みで使用するピンです。

(負)は負論理です。データバス、アドレスバスそれぞれ8bitです。パラレルバスでData0, Address0が下位ビットになります。
例えばアドレス1番地にデータ"5"を書き込む場合は以下のようにします。

  1. 21ピンのCPU停止を5Vにする。
  2. 23ピンのRAM出力有効を0Vにする。
  3. 13ピンのAddress0を5Vにする。
  4. 5,7ピンのData0, Data2を5Vにする。
  5. この状態でRAM書込みを有効にするとバスに流れてる情報がRAMに書き込まれます。 RAM書込み信号は負論理なので0Vにすると有効になります。

この操作をM5ATOMで自動化します。

M5ATOM の処理内容

拡張ボードのコントローラとして使うマイコンです。 Webサーバを立てて、プログラム書き込みリクエストが来たら上記のRAM書き込み操作を自動的に行います。 ソースコードGitHubからご覧ください。

github.com

アーキテクチャ

  • 開発言語はC++で、開発環境はVSCodeにPlatformIOプラグインを入れて使ってます。
  • Webサーバのライブラリは「ESPAsyncWebServer」を、CSV解析は「CSV Parser」を利用しました。
  • PCからM5ATOMへは同一ネットワーク内でのみアクセス可能です。
  • フロントは1画面のみでBootstrapとオワコンぎみのjQueryで実装しています。
  • リクエスト用ボタンはすべてAjaxリクエストでデータはJSONで送ります。
  • バリデーションは手抜きで未実装です。

ビルド手順

  1. M5ATOMの開発環境を用意します。(構築手順は省略)
  2. ライブラリマネージャなどで上記の2ライブラリが使える状態にします。
  3. main.cpp の上部にあるWiFi情報を環境に合わせて書き換えます。
  4. GitHubのコードをM5ATOMへ書き込みます。本体のコードは「main.cpp」 の1ファイルのみです。
  5. 静的リソース(html, jsファイル)をSPIFFSに書き込みます。GitHubの「/Ttm8WriterAtom/data/www」内にあるファイルです。PlatformIO では以下をクリックすると書き込まれます。

入力画面

ブラウザから「http://ttm8.local」か「http://{M5ATOMのIPアドレス}」にアクセスすると以下のような入力画面が表示されます。IPは起動時に"Serial.print()"で出力してるのでシリアルモニタで確認できます。(M5ATOMをUSB接続する場合は、必ず拡張ボードから外します)

一応スマホからでも行けますが、私の環境ではURLをIPにしないとアクセスできませんでした。

TTM8のプログラムはアドレスとデータをCSV形式で入力します。
テキストエリアの末尾は空行にします。
「書込み」ボタンを押すと下記の「書込みAPI」へ入力内容をPOSTします。
「未使用アドレスをクリアする」をONにすると、プログラムに記述されてないアドレスをすべて0に上書きします。RAMの全アドレスへ書き込むので処理に5,6秒かかります。
画面右半分は拡張ボードのデバッグ用に用意したものなので通常は使用しません。

プログラム書込みAPI

POSTで受けたプログラムを1行ずつ上記の手動RAM書き込み手順で書き込みます。
シフトレジスタに入力されたアドレスとデータを流して、RAM書込み信号を送信します。これを行数分繰り返します。
書込み後は自動的にTTM8へリセットをかけてるのですが、うまくかからないので手動でリセットするか電源を落として使ってます。

回路

M5ATOMのピンアサインは以下です。

M5ATOMのGPIO 接続先
19 シフトレジスタ (SER)
23 シフトレジスタ (SRCLK)
33 シフトレジスタ (RCLK)
21 TTM8 RAM書き込み
25 TTM8 外部リセット
+5V TTM8の +5Vから給電 (拡張ボードのスイッチと連動)
GND TTM8の GND

シフトレジスタはGPIOを増やすことができる便利ICです。GPIOの少ないマイコンでは重宝しますね。
ICの使用方法は省略しますが、M5ATOMのGPIO3本で制御できます。
シフトレジスタの+5Vは拡張ボードのスイッチに関係なく常に5Vを給電してます。何らかの原因でICが発火するくらい発熱することがあり、スイッチOFFの時はOEで出力しないように制御してます。出力ポートに信号が逆流するのがまずかったのでしょうか??
1つのICで8ポート増やせるので2つ使ってます。以下のように接続してます。

M5TOMのGPIOは3.3VですがTTM8は5Vです。 シフトレジスタは3.3V信号でも操作できますが、TTM8とM5ATOMは直結しても動かないのでトランジスタでスイッチングしました。コレクタ側に抵抗を入れると動かなくなるので、やっていいものかわからないですが信号を直結してます。全体の回路図はこんな感じです。

電源スイッチはLED付きのものにしたので実際には抵抗がもう一つあります。ケーブルのコネクタは便宜上1列で書きましたが実物は2列です。

部品一覧

拡張ボードに使用したパーツ一覧です。

パーツ 数量 用途
ユニバーサル基板 Bタイプ(95 x 72 mm) 2 メイン基板
M5ATOM Matrix 1 拡張ボードの制御用マイコン
ピンヘッダ 1 M5ATOM 接続用
8ビットシフトレジスタIC U74HC595AG-D16-T 2 各バスのデータ送信
ICソケット 16ピン 2 なくてもよかったかも?
トランジスタ 2SC1815 GR (ジャンク品) 3 TTM8の信号制御
カーボン抵抗 2 kΩ 6 トランジスタで使用
カーボン抵抗 4.7 kΩ 1 トランジスタで使用
カーボン抵抗 10 kΩ 1 電源スイッチのプルダウン?
積層セラミックコンデンサー 0.1μF 1 シフトレジスタパスコン
スイッチングダイオード 2 制御信号の逆流防止
照光スイッチ オルタネイト 緑 1 拡張ボードの電源スイッチ
フラットケーブル 2x13 (26ピン) 1 TTM8接続用
ボックスヘッダコネクタ 2x13-ピン 2.54mmのピッチ 2 TTM8接続用
スペーサー 六角両メネジ FB3-15 1
なべ小ねじ(+) M3x6 8
はんだメッキ線 0.3mm 適量

実行

M5ATOMは電源投入前に差し込んでおきます。

拡張ボードOFF状態です。

ProgramBoardを接続してる場合はCPU START/STOPを「START」にします。でないと正しく書き込まれません。

電源を入れるとCPUが停止しM5ATOMが起動します。緑に光ってるのがスイッチです。

ブラウザ上で入力して書き込みます。

書込み中。

リセットボタンを押しながら電源を切ると書き込んだコードで動き出します。

失敗点

  • 電源スイッチはトグルスイッチにした方が安いし使い勝手が良かったかもしれません。書き込みを何度も繰り返すとボタンを押し込むのが面倒になります。
  • ケーブルのコネクタは2個付いてますが1個しか使えません。本当は2個つなげたかったのですが、はんだ付けがメチャクチャになり断念しました。
  • 拡張ボードとTTM8をつなげた状態でM5ATOMをUSB接続すると、TTM8が電源OFFでも給電され電源が入ってしまいます。どのくらい流れてるか不明なのでやらない方がよさそうです。
  • プログラム書き込み後にTTM8へ自動的にリセットをかけてるのですが、なぜかかからないことが多く原因不明です。5秒くらいしっかりかけてもだめでした。
  • ボードはユニバーサル基板でサンドされてますが、下側は基板である必要はありません。基板の裏側にあまり触れたくないので予備で買った基板をとりあえずつけてます。

最後に

プログラム書込みが自動化されたのでTTM8のコーディングに集中できるようになりました。コードの管理もPC側でできるようになり、プログラムの書き換えがコピペでサクサクできます。

ブレッドボード上では不安定だったとこも、基板に載せ替えたら安定するようになりました。(ジャンパー線の抵抗の影響、接触不良、ノイズを拾ってた?)

入力するプログラムはProgramBoardと同じアドレスとデータの羅列ですが、アセンブラ形式で入力できるように作れたらもっと便利になりそうです。 プログラムもどこかのDBaaSに保存する仕組みがほしいっすね。入力画面ももう少し整理したいしバリデーションも入れたいしコードも全体的にリファクタしておきたいとこです。

考えてるとグレードアップしたいとこがいっぱいでてきますね。