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ライターに使う手もあり(←なんか違う)
セントラル ビワコ ツーリングラリー 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を買ってきました^^;
それにしても28ピンも必要ないんだけど。
まあUARTもI2Cも使えるし、値段も比較的安いですが・・・
↓
akizukidenshi.com
しかしコスパで言うとPICのほうが良くないか?
↓
akizukidenshi.com
こんなんでいいじゃんよ
などと疑念もいだきつつ、とりあえずPICはまたいつか勉強することにしておいて、作業進行させようと思います(いつかって)
Arduino UNOを使ったATmega328Pへの書き込み
とりあえずはArduino UNOからスケッチを書き込まねばならぬ。
Arduino UNOもCPUはATmega328Pだから、スケッチ書いたそばからCPU外せばいいんじゃね?とも思うんですが、それではソケットがクタクタになりそうだし、そもそも俺のArduino UNOは互換品だからCPUがDIPじゃないんですよ。
ついでに言うと私はケチなので外部クロックは使わず内部クロックで動作させたい。
いろいろ調べてみたら本家ページのこのあたりにつなぎ方は載っていたので、そちらを参考にしつつ、ボードマネージャーのほうは同ページにあるリンクからbreadboard-1-6-x.zipをダウンロードして展開した得たフォルダを、hardwareフォルダに突っ込んでおけば、ATmega328Pの内部クロックを使ったボードを選択できるようになります。
なんかコンパイルする時にwarning出ますが、気にしなーい
そもそもIDEバージョン1.8だしな。
つなぎ方はこちら↓
普通にスケッチ例にある「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号をそっくり移植してしまおうと思っています。 いくつか課題がありまして
- 今回はケースに入れたいので、基板の大きさとかスイッチをどうすれば良いのか調査
- 距離誤差の原因を確定するため、TinyGPSとfloat演算を自分ライブラリに代替
このあたり解決したいと思っとります。
やっと本筋に戻ってきた・・・^^;
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という寸法ですな。
配線図はこのように。
ソースはこのように。
#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号って、どれくらいの容量で動いていたのかな? うーん、10KBちょっとぐらいか・・・ それにしてもATmega328Pのフラッシュメモリは広大だ。
しかしどうしたもんか・・・せや、この前ついでに買ったATtiny85使ったろ!
これならフラッシュ8KBあるし!
勝ったも同然だ!(だれに)
ATtiny85でなんとかならんか?
というわけで書き込みシールドを改造して、とりあえずATtiny85にもプログラム書けるようにしてみました。
ATtiny85と仲間たちを繋ぐ
とりあえず繋いで動かしてみます。
基本的には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. (インターネットで、私は見た人が行く海へ)
网上我看了一个走向海边的人(インターネットで我は見れり歩き向かう海の人)
ちょっと海の様子見てくる https://t.co/NXXL0jZlc7
— 単車大好き気球さん (@777kdm) 2022年9月6日
ただし、韓国語は単語を覚えるのが至難の業です(俺だけ?)。
英語は中学からの蓄積が、中国語は漢字という共通要素があるのですが、韓国語の単語は全くとっかかりが無いのです。
一部の漢字由来の単語はまだ似ているのですが・・・特に基本的な動詞・形容詞が日本語と全く違うので、ものすごく覚えにくい・・・
- 覚えやすい
韓国語 | 中国語 | 日本語 |
---|---|---|
한국(はンぐㇰ) | 韩国(はンぐぉ) | 韓国(かんこく) |
운동(うンどん) | 运动(ゆンどん) | 運動(うんどう) |
- 覚えにくい
韓国語 | 中国語 | 日本語 |
---|---|---|
많다(まンた) | 多的(どぅおだ) | 多い(おおい) |
사다(さだ) | 买(まい) | 買う(かう) |
・・・
先生に「韓国語の単語は難しいです!」と泣きを入れてみたのですが、「日本語より簡単ですよ」とか言われてしまいトホホ
ま、確かに活用なんかは簡単ではありますが・・・
そんなわけで日々単語帳を繰る今日この頃です。
ラリコン試作1号でラリーした話
奈良でラリってきました(言い方)
「ミステリーラリー」という誰でも参加できる超楽しいラリーです。 teamkomaren.amebaownd.com
今回はArduinoで自作したGPSラリコンを使ってみます。
怪しい雰囲気を醸し出しておる。
何があっても良いように四輪にしました。
ま、防水機能も無いしな…
ダム湖畔に佇む我が愛車
クイズを解きながら、奈良をぐるっと180kmぐらい走行。
柿の葉寿司うまいうまい
ソフトクリームうまいうまい
で、ラリーどうでした?
結果ですが、無事にゴールは出来ました。
成績的にはクイズの結果が・・・ぐぬぬ
あとむっちゃ暑かったのに、クルマだからと油断して帽子もタオルも持っていかなかったのは失敗^^; (←キモい顔文字)
次どうする
しかし、なーんか精度がイマイチで、iPhone12のGPSと比較すると4kmで100mぐらい、遅れる方向の誤差がでます。 これが計算誤差なのか、割り込み禁止区間がどこかに残ってるのか、そもそもタイマー割り込みの精度が悪いのか・・・
カジュアルラリーで使う分にはコマ毎に補正してやれば良いのでそんなに問題にならないのですが・・・わたし、気になります!
えるたそに言われては仕方ないので、とりあえず要調査
あと、GPSだから当然トンネル入った時に速度がわからなくなるのですが、トンネル出た時に何か処理して誤差補正やったほうが良いのか?コードを追加してまで補正する意味があるのか? みたいなところも課題です。
とりあえず、ATtiny44で作る予定の試作2号機で検討しようっと(←未来のオレにぶん投げ)