正月休みの工作
正月休みの工作でライントレーサを作ってみました。
ラインを外さないようにするため速度を落とす必要があり、また、センサーが2個でON/OFFな制御のためカクカクしているため、センサーの増設、比例制御の導入などで改善を行いたい。
材料
- Arduino UNO R4
- サンハヤト Arduino用ユニバーサルキバン(UB-ARD03-P)
- 5V昇圧DCDCコンバーター(秋月 K-13065)
- デュアルHブリッジモータードライブ(MX1508使用)
- 赤外線反射センサーモジュール
- タミヤ ダブルギヤボックス
- タミヤ ナロータイヤセット 58mm径
- タミヤ ボールキャスター
- 電池ボックス 単3×2本 リード線(秋月 P-17271)
- 電池ボックス 単4×3本 リード線(秋月 P-03195)
- トグルスイッチ(DPST or DPDT)
- 絶縁キャップ(ニチフ LP TIC-22-黒)
- 木の板(3.5mm厚)
- ボルト&ナット
ポイント
- Arduino UNO R4はPWM周波数を自由に設定したいこと、e2studioの使い方の勉強、将来的にはFreeRTOS化したいなどで、Arduinoとしては使用せず、ベアメタルプログラミングを行った(E2-Liteを使用して書き込み)
- 単4×3本を5V昇圧コンバータを使用してArduinoの5Vピンに供給
- 単3×2本を昇圧せずにモータードライバに供給
- ギアボックスのギア比は114.7:1(タイプC)
- 外乱光の影響を減らすため、センサーに絶縁キャップを流用したカバーを装着
- 重心をキャスター側に寄せる
- マイコンは電池ボックスの上に配置
ソースコード(抜粋)
※エラー処理は全く行っていない
while (1)
{
R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_0, &adc0);
R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_1, &adc1);
if (adc1 > L_THRESHOLD && adc0 > R_THRESHOLD) {
state=3;
} else if (adc1 > L_THRESHOLD) {
state=2;
} else if (adc0 > R_THRESHOLD) {
state=1;
}
} else {
state=3;
count++;
}
switch(state) {
case 0:
R_GPT_DutyCycleSet(&g_timer0_ctrl, 0, GPT_IO_PIN_GTIOCA);
R_GPT_DutyCycleSet(&g_timer0_ctrl, gpt0_pwm_counts, GPT_IO_PIN_GTIOCB);
R_GPT_DutyCycleSet(&g_timer1_ctrl, gpt1_pwm_counts, GPT_IO_PIN_GTIOCA);
R_GPT_DutyCycleSet(&g_timer1_ctrl, 0, GPT_IO_PIN_GTIOCB);
break;
case 1:
R_GPT_DutyCycleSet(&g_timer0_ctrl, 0, GPT_IO_PIN_GTIOCA);
R_GPT_DutyCycleSet(&g_timer0_ctrl, gpt0_pwm_counts, GPT_IO_PIN_GTIOCB);
R_GPT_DutyCycleSet(&g_timer1_ctrl, 0, GPT_IO_PIN_GTIOCA);
R_GPT_DutyCycleSet(&g_timer1_ctrl, gpt1_pwm_counts, GPT_IO_PIN_GTIOCB);
break;
case 2:
R_GPT_DutyCycleSet(&g_timer0_ctrl, gpt0_pwm_counts, GPT_IO_PIN_GTIOCA);
R_GPT_DutyCycleSet(&g_timer0_ctrl, 0, GPT_IO_PIN_GTIOCB);
R_GPT_DutyCycleSet(&g_timer1_ctrl, gpt1_pwm_counts, GPT_IO_PIN_GTIOCA);
R_GPT_DutyCycleSet(&g_timer1_ctrl, 0, GPT_IO_PIN_GTIOCB);
break;
case 3:
R_GPT_DutyCycleSet(&g_timer0_ctrl, 0, GPT_IO_PIN_GTIOCA);
R_GPT_DutyCycleSet(&g_timer0_ctrl, 0, GPT_IO_PIN_GTIOCB);
R_GPT_DutyCycleSet(&g_timer1_ctrl, 0, GPT_IO_PIN_GTIOCA);
R_GPT_DutyCycleSet(&g_timer1_ctrl, 0, GPT_IO_PIN_GTIOCB);
break;
default:
break;
}
/* Delay */
R_BSP_SoftwareDelay(delay, BSP_DELAY_UNITS_MILLISECONDS);
}
FM77AV40EX/SX用の512KRAMカード
ハードウェア解説書をもとに512K-RAMカード(S-RAMカード)を作成してみました。
物理アドレスの&H40000-&HBFFFFに割当てされます。
LEDはCE、READ、WRITEのインジケータになっています。
READ、WRITEはアドレスに関係なく点灯するので、ほぼ常時点灯しています。
プログラムで簡単な動作確認をしてみました。
拡張MMRとMMR高速モードを有効にしたのちに、&H40000-&hBFFFFを&H6000に割付しつつ4Kブロックの先頭のバイトに物理アドレスの上位8bitの値を書き込みし、すべて書き込み終わったら、読み込みを行って表示します。
表示結果が物理アドレスの上位8bitと一致していれば一応はOKとなります。
物理アドレスの上位8bitと表示結果が一致しているのでちゃんと動作しているようです。
回路図、チェック用のプログラムをgithubで公開しました。
yoichiro-ono/FM77AV40EX-RAM (github.com)
ねんがんのマニュアルをてにいれたぞ
念願のハードウェア解説書が手に入りました。
これでFM77AV40EXの増設メモリを作れそうです。
コネクタの入手性が次の問題ですが。。。
FM-7 64180カード用CP/M BIOS
ある程度動く状態になりましたので、githubで公開しました。
https://github.com/yoichiro-ono/FM7-64180-CPM
エスケープシーケンスが不足しているのか、サポートデバイスに問題があるのかWordmasterは動いていませんが、MBASICは動作しました。
FM-77用PS/2キーボードインターフェース
キーボード無しのFM-77を入手しましたので、PS/2キーボードI/Fを作成しました。
CPUに手持ちのMega168Pを使用し、内臓の8MHzで間に合うと思うのですが20MHzの外部クロックを付けました。
PS/2コネクタ(MiniDIN)はaitendoで安売りしていたものを使用しています。
以前に作成した64180ボードを10cm×10cmから12.7cm×8cmにパターン変更し本体に収めて蓋ができるようにしました。
パターン変更の際にシリアルポートを引き出したのですがZ80180を8MHzで動作させた場合はまともに通信できるボーレートにならないので、6.144MHzに変更するか、外部から通信用のクロックを入れないとダメなようです。
2020/8/14追加
https://github.com/yoichiro-ono/FM77-KBIF
FM-7用64180カード作成
久しぶりの更新ですが、FM-7を入手し、プロセッサ誌の64180カードを作成しました。
10MHzへの切り替えを無くし、メモリを4MBitのSRAMに変更(物理アドレスも80000-FFFFFに変更)、74LS⇒74HCT、74ALS・74F⇒74ACに変更した程度で、記事の回路ほぼそのままです。
Oh!FM誌の63K CP/Mの製作記事をもとに、CP/Mを動かしてみました。
CP/Mのフロッピー等は持っていないので、The Unofficial CP/M Web siteのCP/M 2.2 ASM SOURCEなどからFDイメージを作成し起動しました。
フロッピーエミュレータを使用していますが、ディスクアクセスが遅いので、512KバイトのRAMにキャッシュするように、表示も1文字毎にサブシステムに送っていて遅いので、EXM80のように、ある程度まとめて送り込むように、改造を考えています。
出来上がるのはいつになるやらですが。
CP/Mの作成には以下のサイトをはじめ数多くのサイトを参考にさせていただきました。
Yamamoto's Laboratoryの8ビット CPU Z80