自作”CPU”キット「TTM8」の無線プログラムライターを作ってみた
今回は自作”CPU”キット「TTM8」の拡張ボードを作ってみました。
プログラムの書き込みはTTM8付属のProgramBoardでできるのですが、入力に時間がかかるのとミスプログラムを動かすとプログラムが壊れてすべて入力しなおしです。 というわけでPCから書き込む仕組みを作ってみました。 ちょっと前にTwitterで動画にしましたが、こちらをユニバーサル基板化しました。 電子回路にあまり詳しくない素人が作ったものなので、いまいちなとこがあるかもです。
TTM8のプログラムをPCから書き込めるようにしてみました。
— matutake (@MatuTakwe) 2022年9月8日
M5ATOMをサーバにして送ります。#TTM8 #自作CPU #M5ATOM #M5Stack #電子工作 pic.twitter.com/vmHWErJ81F
概要
PCからWiFi経由でTTM8のプログラムを書き込む拡張ボードです。 ざっくり以下の構成です。
パーツ | 役割 |
---|---|
PC(ブラウザ) | TTM8のプログラムを入力するインターフェイス。 |
M5ATOM Matrix | 小型のマイコンで拡張ボードのコントローラ。主にWebサーバと書込み制御。 |
シフトレジスタ | M5ATOM のGPIO数を拡張するためのIC。アドレスバス、データバスの送信用。 |
TTM8 | 拡張ポート経由でTTM8のRAMへ書き込み。 |
RAMの書込み手順
以下の操作を行うことで手動でRAMの書き込みができます。
- CPU停止
- データバス、アドレスバスに書き込みたい内容を出力
- RAM書込み信号送信
TTM8から出ている26ピンのケーブルから上記操作が行えます。 ピンアサインは以下のようになっていて赤字がRAM書き込みで使用するピンです。
(負)は負論理です。データバス、アドレスバスそれぞれ8bitです。パラレルバスでData0, Address0が下位ビットになります。
例えばアドレス1番地にデータ"5"を書き込む場合は以下のようにします。
- 21ピンのCPU停止を5Vにする。
- 23ピンのRAM出力有効を0Vにする。
- 13ピンのAddress0を5Vにする。
- 5,7ピンのData0, Data2を5Vにする。
- この状態でRAM書込みを有効にするとバスに流れてる情報がRAMに書き込まれます。 RAM書込み信号は負論理なので0Vにすると有効になります。
この操作をM5ATOMで自動化します。
M5ATOM の処理内容
拡張ボードのコントローラとして使うマイコンです。 Webサーバを立てて、プログラム書き込みリクエストが来たら上記のRAM書き込み操作を自動的に行います。 ソースコードはGitHubからご覧ください。
アーキテクチャ
- 開発言語はC++で、開発環境はVSCodeにPlatformIOプラグインを入れて使ってます。
- Webサーバのライブラリは「ESPAsyncWebServer」を、CSV解析は「CSV Parser」を利用しました。
- PCからM5ATOMへは同一ネットワーク内でのみアクセス可能です。
- フロントは1画面のみでBootstrapとオワコンぎみのjQueryで実装しています。
- リクエスト用ボタンはすべてAjaxリクエストでデータはJSONで送ります。
- バリデーションは手抜きで未実装です。
ビルド手順
- M5ATOMの開発環境を用意します。(構築手順は省略)
- ライブラリマネージャなどで上記の2ライブラリが使える状態にします。
- main.cpp の上部にあるWiFi情報を環境に合わせて書き換えます。
- GitHubのコードをM5ATOMへ書き込みます。本体のコードは「main.cpp」 の1ファイルのみです。
- 静的リソース(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に保存する仕組みがほしいっすね。入力画面ももう少し整理したいしバリデーションも入れたいしコードも全体的にリファクタしておきたいとこです。
考えてるとグレードアップしたいとこがいっぱいでてきますね。