iizukakの作業ログ

忘れる前にメモしよう

2017年の当面の目標。CPU 作りについて

去年「CPUの創りかた」を読んで、実際に TD4 (この本をまるまる一冊かけて解説されている CPU ) を実装してみたところ、これがなかなか面白い体験でした。それからというもの、「コンピュータアーキテクチャのエッセンス」などを読んで、CPUについて思いを馳せていたのですが、理論を学ぶより作るほうが楽しかった(笑)

そこで、今年の当面の目標として、独自設計の CPU を作ってみたいと思っています。昨今では、CPU を自作するとなると手ハンダではなく FPGA を使うが主流と思います。しかし、「CPU の創りかた」を読んで慣れているのもありますし、ロジック IC に謎の愛着があるのもあって、とりあえずひとつロジック IC を使った CPU を作ってみることにしました。

(脱線しますが、ロジック IC って、どことなく LEGO ブロックに似ていませんか。どちらも基本的な要素を組み合わせて、複雑なものを作り上げられるかんじが。)

まず作成する CPU の名前を決めました。「FB04」です。「CPU の創りかた」では、16 ステップのプログラムしか ROM に格納できなかった関係上、ラーメンタイマあたりがプログラミングの限界でした。FB04 では、ぜひとも FizzBuzz を実行したい。これが "FB" の意味です。"04" はデータバス幅が 4bit の意味です。主な仕様としては、

  • ハーバードアーキテクチャ
  • FizzBuzz が実行可能であること
  • データバスは 4bit 幅とする
  • プログラム ROM は EEPROM を使って実装する
  • 命令デコーダは EEPROM を使って実装してもよい(妥協)
  • FizzBuzz を実行する関係上、アルファベットが表示可能な、キャラクタ液晶を搭載する

いま決めているのは以上です。FizzBuzz を実行したいのは、FizzBuzz には、プログラミングにおいて不可欠な要素(条件分岐、四則演算、比較、ループ、データの出力)が揃っていて、かつシンプルで CPU の性能を示すために良いと思うからです。

三が日を使って、簡単な回路図もどきを描きました。

f:id:iizukak:20170103223647j:plain

次は、使用予定のロジック IC の仕様書とにらめっこしつつ、KiCad で回路図を書こうと思います。お正月休みが終わるまでに、できるだけ進捗を出しておきたいところです。

HD44780 キャラクタ液晶を、LiquidCrystal ライブラリ無しで使う

Arduino でキャラクタ液晶を使う場合は、LiquidCrystal という Arduino IDE 付属のライブラリを使うのが一般的ですが、ライブラリなしで使ってみようという試みです。

キャラクタ液晶には、だいたい HD44780 互換コントローラが乗っています。記事後方のスクリプトも HD44780 互換コントローラが載っている液晶モジュールを想定します。ちなみに、今回は秋月電子で買った SD1602HUOB という小型の16桁x2行のモジュールを使っています。

お正月ということで、新年のメッセージを表示してみました。HD44780 にはカタカナのフォントも搭載されています。

f:id:iizukak:20170101081039j:plain

f:id:iizukak:20170101081122j:plain

配線は下記のスクリプトのコメントの通りです。Arduino では、いくつかのピンをまとめて扱うことができて、複数のビットをまとめて送ることができるので便利です。今回は PORTD を使っています。

コントラスト調整用の抵抗には、 10K の可変抵抗を使いました。

Makeblock Me Orion からブレッドボードやユニバーサル基盤を使う

引き続き Makeblock Me Orion で遊んでいます。Orion は入出力のための Arduino Uno のようなピンついておらず、RJ25 モジュラージャックが 8 つあるのみです。これは MakeBlock の各モジュールと接続することが前提としてあるのでこうなっているのだと思うのですが、やはり MakeBlock のモジュールだけでは十分ではありません。ユニバーサル基板やブレッドボードで使いたいと思うのが人情です。

どうするかというと、秋月の6極6芯モジュラージャックDIP化キット を使って、Orion の RJ25 ジャックを 2.54mm ピッチに変換することができます。Orion のピン配置は ここ にあります。

さて、ブレッドボードで L チカしてみます。Orion の 3 番ポートを以下の画像のようにつなぎます。6芯のうち、一番左が Uno でいう 13 番ピンなので、一番左に LED のプラスを接続、適当な抵抗を挟んで右から 3 番目の GND の芯に接続します。これで、Arduino IDE から Blink を書き込むと L チカできます。

f:id:iizukak:20161015165445p:plain

秋月のおかげで簡単に Orion 用のモジュールが作れそうです。

Me Orion を Arduino IDE から使う

MakeBlock は、ロボット版の LEGO ともいうべき会社で、ブロックのように組み合わせてロボット工作ができるパーツを販売しています。MakeBlock では Arduino Uno 互換ボードの Me Orion も開発していて、だいたいのキットに入っています。また、それらのキットは mBlock という IDE を使ってプログラミングすることができます。mBlock はおそらく教育向けですが、こういった GUI のプログラミング環境はおじさんには少々つらい。そこで、 Arduino IDE 上で開発することにします。

Me Orion の特徴は、

  1. RJ25 モジュラージャックで各 MakeBlock モジュールと接続できること
  2. 供給できる最大電流が Uno と比べて大きく(試した感じ 3A くらいはいけそう)、Me Orion から直接大きな電流を必要とするパーツを駆動できる。例えば、ステッピングモーターなど

試しにステッピングモーターを駆動するところまでやってみました。

Me Orion 本体はこんなかんじ。

f:id:iizukak:20161010182744p:plain

1~8 が RJ25 モジュラージャックになっていてて、今回は 1 ポートを Me Stepper Motor Driver に接続します。

f:id:iizukak:20161010183005p:plain

f:id:iizukak:20161010183105p:plain

モータドライバから 42BYG Stepper Motor につなぎます。ケーブルの向きとかはさすが間違うと挿せないようになっています。

さて、 Me Orion は素の Arduino IDE からは見えません。ドライバをインストールする必要があります。自分は mBlock からインストールしました。

f:id:iizukak:20161010183625p:plain

『接続』→『Arduino のドライバをインストールします』からインストールできます。

Arduino ライブラリは Github で管理されていて、たぶんそっちからもドライバをインストールすることはできるのだと思います。この Github プロジェクトを clone して、Arduino IDE の libraries ディレクトリに配置します。自分の場合は Mac で、 /Applications/Arduino.app/Contents/Java/libraries/ でした。

f:id:iizukak:20161010185008p:plain

Arduino IDE で『スケッチの例』→『MakeBlockDrive』→『Me_stepperMotor』→『SerialControlStepper』を選択します。これで Me Orion に AC アダプタから電源を供給し、 USB ケーブルで PC に繋いで Arduino IDE から通り書き込めば、シリアルモニタから 1~8 の数字を送信することでステッピングモーターの制御をテストできます。

フリップドットディスプレイ時計を作る(完成)

さて、前回までフリップドットディスプレイで時計、名付けてフリップドットクロックをつくるための何やかやを用意していたのですが、完成しました。

f:id:iizukak:20160924174519p:plain

f:id:iizukak:20160924174552p:plain

f:id:iizukak:20160924174818p:plain

基盤のほうはこんなかんじ。

f:id:iizukak:20160924174922p:plain

基盤は、秋月のユニバーサル基板の適当なサイズのやつにドリルで穴をあけて、フリップドットディスプレイに固定しています。ぴったりサイズの基盤があったので、カットする手間を省けました。

電源投入時に自分のIDを表示する小昨日をつけたり…。

f:id:iizukak:20160924175302p:plain

フリップドットディスプレイはわりかし高価なので多用するのは難しそうですが、いろいろ使ってみたくなる一品でした。

フリップドットディスプレイ時計を作る

ブレッドボードで仮組みして、時計として動くところまできたので、使ったパーツと接続をメモしておこうと思います。

使用パーツ。

接続は次の通り

フリップドットディスプレイ部

Arduino RS485 Module Flip-Dot Boards XY5
RX RO -
TX DI -
8 DE+RE -
5V VCC -
GND GND -
- A +485
- B -485

RTC モジュール部

Arduino RTC Module
A4 Sda
A5 Scl
5V Vcc
GND Gnd

AC アダプタとフリップドットディスプレイの接続は、自明だと思います。また、いまは Arduino は USB ケーブル経由で給電していますが、ちゃんと組むときには三端子レギュレータで 24V 電源を 9V まで落として接続する予定です。

コードは Gist にあげてあります。

時計用の木材をシマホで切ってもらったので近いうちにちゃんと組んで動画をアップします。今日は大雨でシマホまで歩くのがたいへんであった。

Pocket CHIP が届きました

5 月末ごろに注文していた Pocket CHIP が、4 ヶ月の時を越えやってきました。Mac から SSH 接続するところまでメモ。

f:id:iizukak:20160919235841p:plain

f:id:iizukak:20160919235911p:plain

f:id:iizukak:20160919235942p:plain

まず知りたいことは root のパスワードですが、初期では chip が設定されています。

箱から取り出して最初にすることは充電だと思います。Pocket CHIP は Micro-USB ケーブルで充電できるのですが、ケーブルを接続しても背面の LED が一瞬フラッシュするだけで、充電されているかどうかよくわからないんですね。充電中かどうかは次のコマンドで確認することができます。

充電中の例

chip@chip:~$ sudo battery.sh
BAT_STATUS=0
CHARG_IND=1
BAT_EXIST=1
CHARGE_CTL=0xc9
CHARGE_CTL2=0x45
Battery voltage = 4204.2mV
Battery discharge current = 0mA
Battery charge current = 399.5mA

放電中の例

chip@chip:~$ sudo battery.sh
BAT_STATUS=0
CHARG_IND=0
BAT_EXIST=1
CHARGE_CTL=0xc9
CHARGE_CTL2=0x45
Battery voltage = 4074.4mV
Battery discharge current = 270.0mA
Battery charge current = 0mA

充電中だと、 Battery charge current が数百 mA になるようです。

Pocket CHIP に使われている Linux は、Github 上で管理されているようです。Debian ベースなのでしょうか、 apt コマンドが使えます。 SSH したいので、次のコマンドで必要なものをインストールしました。

$ sudo apt-get update
$ sudo apt-get install openssh-server

これで再起動すれば、 sshd が起動しています。

次に

$ ip add show wlan0

で IP アドレスを調べます。

chip@IPアドレス

SSH できます。パスワードは root と一緒で chip です。これで SSH できるようにはなるのですが、なんとなく接続が不安定です。どうも無線 LAN がパワーセーブモードになったりすると、接続が切れる疑惑があります。

sudo iw wlan0 set power_save off

でパワーセーブをオフにします。これで、ブツブツ切れるのはなくなったような。

これで快適に SSH 接続して Pocket CHIP 上で開発できるようになりました。Pocket CHIP についているキーボードは、お世辞にも押しやすいとはいえないので、本体のキーボードは外出時やちょっと動作確認したい時用ということになりそうです。

さて、 いろいろ試しにインストールしてみましたが、けっこう普通に動きます。Python はデフォルトで動作しますし、Julia も ARM 用バイナリをとってくるだけで起動しました。vim ももちろん入ります。

おまけに cpuinfo と、ちょっと動かしたあとの df の出力を貼っておきます。

chip@chip:~$ cat /proc/cpuinfo
processor       : 0
model name      : ARMv7 Processor rev 2 (v7l)
BogoMIPS        : 100.24
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpd32
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x3
CPU part        : 0xc08
CPU revision    : 2

Hardware        : Allwinner sun4i/sun5i Families
Revision        : 0000
Serial          : 1625420c0d02e958
chip@chip:~$ df
Filesystem     1K-blocks   Used Available Use% Mounted on
udev               10240      0     10240   0% /dev
tmpfs             101584   6780     94804   7% /run
ubi0:rootfs      3777124 580380   3196744  16% /
tmpfs             253956      0    253956   0% /dev/shm
tmpfs               5120      4      5116   1% /run/lock
tmpfs             253956      0    253956   0% /sys/fs/cgroup
tmpfs              50792      0     50792   0% /run/user/1000

多くの情報は、 Pocket CHIP のフォーラム で入手しました。フォーラムが活発なのは良いですね。