EMUZ80を作った話

昨日実はDUCATI MONSTER 696が納車されまして・・・

本当ならこの三連休ウキウキでツーリングの予定だったのですが・・・


無慈悲な台風(T_T)
これではおバイクできないではあ~りませんか・・・

しかし、そんなこともあろうかと電子工作キットを1つ仕込んでおったのでした!

EMUZ80買いました

レトロCPUといえば鈴木哲哉氏。
ザイログZ80伝説」はじめ、いつも楽しませていただいてます。

そんな氏が作成されたZ80を最小構成で動かそうボードがまさにこれです。

で、このボードキットですが普通にオレンジピコさんのYahooショップで買えてしまいます!

こちらボード単品 store.shopping.yahoo.co.jp

こちら必要な部品一式 store.shopping.yahoo.co.jp

送料入れても1,945えん・・・安い

早速作ってみましょう


部品点数が少ないので制作難易度は高くないのですが、なんせ40ピンのICが2つあるのではんだ付けは根気が必要です(あと一応導通確認ぐらいはやったほうが良いかも)

シリアル端子にAmazonで買った安いUSBシリアル変換器を接続。

最初からPICにBASICが焼き込まれているので、スイッチオンでBASICが起動します!

動く動く
すげー😆

ソース拝見します!

前述鈴木哲哉氏のサイト該当ページに情報があります。
git clone https://github.com/vintagechips/emuz80
このソースと合わせてページ中のリンクにある「雑誌投稿(ボツ)記事 PDF-EMUZ80の設計と製作」を読むと、知的好奇心が最高に刺激されます^^

次どうする?

せっかくなので、Z80のプログラムを作って動かしてみようかな、と思っています。
まずはZ80開発環境の整備からやな・・・

PICkit2互換ライターを買った話

やっぱちょっとPICも触りたくなって、かと言ってあまり費用もかけたくないので秋月のPICkit2互換ボードを購入してみました。


https://akizukidenshi.com/catalog/g/gM-02495/

最新はPICkit4ということなのでもう老头儿(lǎotóur:ロートル)のライターですが、2,600円で買えるのは魅力です^^

さて、ライターソフトをインストールしなければ(←なぜ今やる

PICkit2をインストールする

web.nucky.jp
↑ こちらのサイトを見ながらインストール
Windows10や11の注意点など、詳しく書かれています。

しかし互換ボード大丈夫かな?

ちゃんとPICkit2として認識されているようです。
ファームも最新になってました。

pickit minusもインストールする

まだ勉強してないのでよくわかんないのですが、PICkit2だと最近のPICに対応してないこともあるとかで、こちらのツールも合わせてインストールしました。
kair.us

開発環境は?

これまたちょっと良くわかってないのですが、とりあえず標準と思われるMPLAB X IDEをインストールします。
https://www.microchip.com/en-us/tools-resources/develop/mplab-x-ide#
最新Verは6.001

Javaも必要なのでインストール
https://www.java.com/ja/download/ie_manual.jsp

MPLAB X IDE最新版はPICkit2対応してないので、ついでに過去Verもインストールしておきました(使うかどうかわかりませんが・・・)
https://www.microchip.com/en-us/tools-resources/archives/mplab-ecosystem
ここからMPLAB X IDE v4.22を選択

あとはXCコンパイラをインストール
https://www.microchip.com/en-us/tools-resources/develop/mplab-xc-compilers
XC8だけで良いか?

このサイトを参考にしました。
my-web-note.com

で、どう使う?

・・・なにしろまだPICが手元にないのでどうしようか悩み中
秋月でPICも一緒に買っとけという話もありますが、だってどれを買ったらいいか良くわかんないんだも~ん^^;

AVRも焼けるみたいなので、AVRライターに使う手もあり(←なんか違う


  1. なぜか初回インストールに失敗しまして、一度削除してインストールし直したら動きました・・・JAVAを先に入れてからインストールしたほうが良いのかもしれないです

  2. おそらくPICkit2対応の最終版

セントラル ビワコ ツーリングラリー 2022に参加した話

台風がやって来ている最中ではありますが、第1回 CBTR セントラル・ビワコ・ツーリングラリー2022(略して「びわツー」)というイベントに参加してきました!


湖畔に佇むわが愛車(R56 MINI JCW)

びわツーとは?

要は琵琶湖を一周するスタンプラリーです😃
スマホGPS機能を使って指定地点のバーチャルスタンプをゲットして、全部ゲットすると琵琶湖一周証明がもらえます。


スタンプゲットだぜ!


一周回ったで賞

どんな感じだったの?

ホントは17(土)にスタートイベントがあったのですが、それには参加せず18(日)にフリーで回りました
本来ならバイクで参加することを想定していると思うのですが、台風がどうなるかわからないので四輪でGO!

おすすめルートは彦根港から反時計回りなんだそうで、朝10時頃に彦根港からスタート


彦根港にぼっち集合


ソフトクリームは見つけたら食べねばならぬ

まずは琵琶湖東岸を北上して、北端に到達したら今度は南下
渋滞の国道161号を抜けて、午後1時ごろに近江神宮到着。

シャアがいそうな赤さ


ん?進むべき時と道を示してくれるとは・・・これちょっとレア?なお守りじゃないか?


ここで遅めのお昼に十割そばを。
天ぷらもイケる

引き続き南下して大津まで行ったら今度は琵琶湖東岸に回りこんで北上します。
その後、午後4時には最終目的地の彦根城に無事到着しました。
ぼっちゴール! 雨降ってきたので即撤収

詳しいことや参加はこちらへ

スマホ使って目的地でスタンプゲットするだけで特に他には制約もなく、別に何日かけて回ってもOKのゆるいイベントです。
ちんたら走って6時間ぐらいなので、なんもない休日にのんびりドライブでもいかがでしょうか
biwaguru.com

おまけ

夜はもちろん近江牛?で一杯…😋


ぐふふ・・・やっぱり焼肉はロースターですわ(≠お嬢様)


じゅわー


途中の道の駅でお土産に買った琵琶湖ワイン


琵琶湖一周記念どらやき😁

なお、今朝早く台風が来る前に帰ってきましたとさ。
台風マジ卍

Arduinoでラリコン作る話(4)~ ATmega328Pに出戻った

<<前回のあらすじ>>
ATtiny44でラリコン作り出した気球人
そこにメモリ不足という魔の手が襲いかかる
最終兵器ATtiny85を取りだして見たものの、今度は速度不足という新たな敵が!

どうする、気球人!?
次回も(秋月に)サービスサービス!


三小スタンプ

詳しくは ↓ kikyujin.hatenablog.com

なんて引っ張ってみましたが

結局のところはTOKYO GAME SHOW 2022の帰りに秋葉原行ってATmega328Pを買ってきました^^;

ついでに2ピンのタクトスイッチもいっぱい買った

それにしても28ピンも必要ないんだけど。
まあUARTもI2Cも使えるし、値段も比較的安いですが・・・
akizukidenshi.com

しかしコスパで言うとPICのほうが良くないか?
akizukidenshi.com こんなんでいいじゃんよ

などと疑念もいだきつつ、とりあえずPICはまたいつか勉強することにしておいて、作業進行させようと思います(いつかって)

Arduino UNOを使ったATmega328Pへの書き込み

とりあえずはArduino UNOからスケッチを書き込まねばならぬ。

Arduino UNOもCPUはATmega328Pだから、スケッチ書いたそばからCPU外せばいいんじゃね?とも思うんですが、それではソケットがクタクタになりそうだし、そもそも俺のArduino UNOは互換品だからCPUがDIPじゃないんですよ。

Atmega 328P-AUというらしい(基板上◆部分)

ついでに言うと私はケチなので外部クロックは使わず内部クロックで動作させたい。

いろいろ調べてみたら本家ページこのあたりつなぎ方は載っていたので、そちらを参考にしつつ、ボードマネージャーのほうは同ページにあるリンクからbreadboard-1-6-x.zipをダウンロードして展開した得たフォルダを、hardwareフォルダに突っ込んでおけば、ATmega328Pの内部クロックを使ったボードを選択できるようになります。

なんかコンパイルする時にwarning出ますが、気にしなーい
そもそもIDEバージョン1.8だしな。

ついでにLチカも組んどく

つなぎ方はこちら↓

普通にスケッチ例にある「blink」が動きます。 youtube.com Lチカ、ヨシ!

さくさく移行

ATtiny44で動かしたI2CのLCDですが、とりあえずArduino UNOで動かした実績あるパラレル方式に変更します。 合わせてSoftwareSerialのテストまで進めます。


はいはい表示できたできた。


はいはいエコーバックエコーバック

書き込み部分を除いた回路はこちら↓ ※書き込み部分があっても動作します。

スケッチはこちら↓

#include <LiquidCrystal.h>
#include <SoftwareSerial.h>

// LCD ←→ Arduinoのピンの割り当て
// rs      →   D7
// rw      →   GND
// enable  →   D8
// d4      →   D9
// d5      →   D10
// d6      →   D11
// d7      →   D12
 // [構文]LiquidCrystal(rs, rw,  enable, d0, d1, d2, d3, d4, d5, d6, d7)
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

// RX - D5
// TX - D6
SoftwareSerial ss(5, 6);

void setup() {
  // debug serial
  ss.begin(9600);
  ss.print(F("Good morning!\r\n"));

  // LCD init
  lcd.begin(16, 2);          // LCDの桁数と行数を指定する(16桁2行)
  lcd.clear();               // LCD画面をクリア
  lcd.setCursor(0, 0);
  lcd.print("Hello world");
  lcd.setCursor(0, 1);
  // キョウハイイテンキ
  lcd.print(F("\xb7\xae\xb3\xca\xb2\xb2\xc3\xdd\xb7"));
}

void loop() {
  while (ss.available() > 0) {
    // echo back
    char c = ss.read();
    ss.write(c);
  }
}

D9-D12は実装の具合によっては逆順にしたほうが良いかもしれないなあ・・・
試作1号機Arduino UNOに対してLCDの実装が90度ひねられていたのでこれで良かったのですが🤔

さて次は

HW的にはArduino UNOとほぼ等価になるので、一旦はラリコン試作1号をそっくり移植してしまおうと思っています。 いくつか課題がありまして

  • 今回はケースに入れたいので、基板の大きさとかスイッチをどうすれば良いのか調査
  • 距離誤差の原因を確定するため、TinyGPSfloat演算自分ライブラリに代替

このあたり解決したいと思っとります。

やっと本筋に戻ってきた・・・^^;

Arduinoでラリコン作る話(3)~ 激闘編

前回、Arduino UNOじゃなくてATtiny44でラリコン作り始めたところまででした。
kikyujin.hatenablog.com

早くもメゲそうです・・・というかメゲました^^;
とりあえずそこに至る経緯を。

周波数測ってみよう

本題に入る前に、先日のラリーで試作1号使ってみたらちょっと誤差大きくて・・・と言っていた件について。 kikyujin.hatenablog.com

問題の切り分けをしたいので、とりあえず秋月で周波数も測れるテスターを買ってきました。

かなりデカい

試作1号は0.1秒間隔(10Hz)でタイマー割り込みを入れて距離の積算をしているので、その間隔がなんらかの影響で長くなっているようならば実走行距離より積算が小さくなるはずなのです。
そこで、割り込みハンドラー内部でLEDのON/OFFを交互に入れてチカチカさせて、その周波数を測ることに。要は5Hzですな。
早速測定開始

わりと正確じゃんよ

んー
これは割り込みタイミングの狂いとかでは無いな・・・
じゃあ演算の誤差とかなんだろうか・・・
ちょっと長丁場になりそうなので、とりあえず試作2号機で対処することにしようっと(俺にぶん投げ

ATtiny44でソフトウェアシリアル通信

んじゃま、作業を続けましょう。
とりあえず、ATtiny44でソフトウェアシリアルを動かしてみるところからです。
今回確認用にAmazonでUSB-シリアル変換器を買っておきました。
2個で799円、安い。

それにしても赤い

これをATtiny44に繋いで、PCからの送信をエコーバックできればまあOKという寸法ですな。
配線図はこのように。

ATtiny44でLCDとシリアルUSB変換器

ソースはこのように。

#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h>

// RX D2
// TX D3
SoftwareSerial ss(2, 3);

// I2C address 0x27 16x2
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup() {
  // debug serial
  ss.begin(9600);
  ss.print(F("Good morning!\r\n"));

  // LCD init
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(F("Hello world?"));
  lcd.setCursor(0, 1);
  // キョウハイイテンキ
  lcd.print(F("\xb7\xae\xb3\xca\xb2\xb2\xc3\xdd\xb7"));
}

void loop() {
  while (ss.available() > 0) {
    // echo back
    char c = ss.read();
    ss.write(c);
  }
}

まあ普通に動きますわな。

読める!読めるぞ!

ところが、コンパイル時に不穏なメッセージが出るようになってしまいました。

おっと、これは・・・

メモリが足らん!

おじさん、マイコンのメモリの少なさナメてましたわ。 ATtiny44は4いうだけあって、プログラム用のフラッシュが4KBしか無いのでした。 なんとかなるかな?と思ってたけど、なんともなりませんでした。
ごめんね でも本当です・・・

ちなみに試作1号って、どれくらいの容量で動いていたのかな?

余裕の32KB
うーん、10KBちょっとぐらいか・・・ それにしてもATmega328Pのフラッシュメモリは広大だ

しかしどうしたもんか・・・せや、この前ついでに買ったATtiny85使ったろ!
これならフラッシュ8KBあるし!
勝ったも同然だ!(だれに)

ATtiny85でなんとかならんか?

というわけで書き込みシールドを改造して、とりあえずATtiny85にもプログラム書けるようにしてみました。

表はキレイだが・・・

実はかなりやっつけ

ATtiny85と仲間たちを繋ぐ

とりあえず繋いで動かしてみます。

ATtiny85 + LCD + シリアルUSB変換器

基本的にはATtiny44と同じですが、ピン配置がだいぶ違います(あと少な・・・はっ、誰か来たようだ)。

ATtiny85にLCD1602つけてるのも割とレアかもしれん。

動くには動く

ソフトウェアシリアルも動くには動く・・・

なにこれ
送信は良いけど、受信はバケバケのバケ蔵じゃんよ! 9600bpsでこれか・・・4800bpsだとどうだろう

÷!生きとったんかワレ!
うまくやってるように見えてバケとる・・・

いろいろ試してボーレートを2400bpsまで落とせば送受信とも大丈夫という結果でした。

うーん、控え目に言って使い物になりませんな!

なおソースはこちら

#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h>

typedef unsigned char u8;

u8 g_count = 0;

// RX D3
// TX D4
SoftwareSerial ss(3, 4);

// I2C address 0x27 16x2
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup() {
  // debug serial
  ss.begin(4800);
  ss.print(F("Good morning!\r\n"));

  // LCD init
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(F("Hello world?"));
  lcd.setCursor(0, 1);
  // キョウハイイテンキ
  lcd.print(F("\xb7\xae\xb3\xca\xb2\xb2\xc3\xdd\xb7"));
}

void loop() {
#if 1
  while (ss.available() > 0) {
    // echo back
    char c = ss.read();
    ss.write(c);
  }
#else
  char buff[4];
  u8 n = g_count;
  buff[3] = 0;
  buff[2] = '0' + n % 10;
  n /= 10;
  buff[1] = '0' + n % 10;
  n /= 10;
  buff[0] = '0' + n;
  ss.print(buff);
  g_count++;  
  delay(100);
#endif

さて、どうする?

とりあえずATtiny44/85での制作継続は難しそうです。 UNOと同じATmega328が無難かな
しかし28ピンのICソケットはハンダ付けしたくない

ここでPICの出番ですよ・・・?

まあちょっと考えます^^;(キモい顔文字)

韓国語レッスンの話 〜 한국어 공부중

前のブログで韓国語を勉強していることを書いていたのですが、一応まだ続けています
오ㅓとかいう謎ハングルを書くことはさすがになくなってきましたが、パッチムで音が変化することには全然慣れません^^;

先生は「いっぱい話して慣れてください」とかおっしゃるのですが、や、ボッチだから話す相手がいないんだよ!心の中でツッコミを入れる日々です。
逆にいうと、書くことや読むことは話すより簡単 なイメージです。 なにしろ、日本語を頭から訳していけば韓国語になるという。

《例》
海へ行く人をインターネットで見ました。
바다에 간 사람을 인터넷으로 봤어요.

韓国語 日本語
바다
行く
사람
인터넷 インターネット
으로
봤어요 見ました


英語や中国語だとこうはいきません。

On the Internet, I saw a man who went to beach. (インターネットで、私は見た人が行く海へ)
网上我看了一个走向海边的人(インターネットで我は見れり歩き向かう海の人)

ただし、韓国語は単語を覚えるのが至難の業です(俺だけ?)。 英語は中学からの蓄積が、中国語は漢字という共通要素があるのですが、韓国語の単語は全くとっかかりが無いのです。
一部の漢字由来の単語はまだ似ているのですが・・・特に基本的な動詞・形容詞が日本語と全く違うので、ものすごく覚えにくい・・・


- 覚えやすい

韓国語 中国語 日本語
한국(はンぐㇰ) 韩国(はンぐぉ) 韓国(かんこく)
운동(うンどん) 运动(ゆンどん) 運動(うんどう)

1


- 覚えにくい

韓国語 中国語 日本語
많다(まンた) 多的(どぅおだ) 多い(おおい)
사다(さだ) 买(まい) 買う(かう)


・・・
先生に「韓国語の単語は難しいです!」と泣きを入れてみたのですが、「日本語より簡単ですよ」とか言われてしまいトホホ

ま、確かに活用なんかは簡単ではありますが・・・
そんなわけで日々単語帳を繰る今日この頃です。


  1. 日本語で「ん」で終わる単語は韓国語ではㄴだし中国語ではn。「う」とかで終わる単語は韓国語ではㅇだし中国語ではngだ!ユーレカ!

ラリコン試作1号でラリーした話

奈良でラリってきました(言い方)

「ミステリーラリー」という誰でも参加できる超楽しいラリーです。 teamkomaren.amebaownd.com

今回はArduinoで自作したGPSラリコンを使ってみます。

怪しい雰囲気を醸し出しておる。

何があっても良いように四輪にしました。
ま、防水機能も無いしな…

ダム湖畔に佇む我が愛車

クイズを解きながら、奈良をぐるっと180kmぐらい走行。

柿の葉寿司うまいうまい

ソフトクリームうまいうまい

で、ラリーどうでした?

結果ですが、無事にゴールは出来ました。
成績的にはクイズの結果が・・・ぐぬぬ
あとむっちゃ暑かったのに、クルマだからと油断して帽子もタオルも持っていかなかったのは失敗^^; (←キモい顔文字)

次どうする

しかし、なーんか精度がイマイチで、iPhone12のGPSと比較すると4kmで100mぐらい、遅れる方向の誤差がでます。 これが計算誤差なのか割り込み禁止区間がどこかに残ってるのか、そもそもタイマー割り込みの精度が悪いのか・・・

カジュアルラリーで使う分にはコマ毎に補正してやれば良いのでそんなに問題にならないのですが・・・わたし、気になります

TVアニメ『氷菓』より、千反田える

えるたそに言われては仕方ないので、とりあえず要調査

あと、GPSだから当然トンネル入った時に速度がわからなくなるのですが、トンネル出た時に何か処理して誤差補正やったほうが良いのか?コードを追加してまで補正する意味があるのか? みたいなところも課題です。

とりあえず、ATtiny44で作る予定の試作2号機で検討しようっと(←未来のオレにぶん投げ