35 lines
20 KiB
HTML
35 lines
20 KiB
HTML
<!doctype html><html><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>AQM0802A に文字を表示してみる | おこげ俱楽部</title><meta name="title" content="AQM0802A に文字を表示してみる | おこげ俱楽部"><meta name="description" content="『ゲーム電卓パイ』プロジェクト~その2:LCD キャラクタディスプレイモジュール AQM0802A を試してみる"><meta name="keywords" content="オコゲ,デスクトップアプリ版,オコゲ,blockly,プログラミング,上野学習塾"><meta name="author" content="ocogeclub"><meta name="robots" content="index, follow"><link rel="canonical" href="https://ocoge.club/2022-06-21_aqm0802a/"><link rel="shortcut icon" type="image/png" href="/assets/img/favicon.png"><link rel="apple-touch-icon" href="/assets/img/apple-touch-icon.png"><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Nunito:wght@500&display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css2?family=Kosugi+Maru&display=swap" rel="stylesheet"><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap"><script src="https://kit.fontawesome.com/73f7be0650.js" crossorigin="anonymous"></script><link rel="stylesheet" href="/assets/floatbox/floatbox.css"><script src="/assets/floatbox/floatbox.js" defer="defer"></script><link rel="stylesheet" href="/assets/css/ocmain.css"><link rel="stylesheet" href="/assets/css/main.css"><link rel="stylesheet" href="/assets/css/footer.css"><link rel="stylesheet" href="/assets/css/post.css"><meta property="og:image" content="https://ocoge.club/assets/img/ogp_aqm0802a.webp"><meta property="og:title" content="AQM0802A に文字を表示してみる | おこげ俱楽部"><meta property="og:description" content="『ゲーム電卓パイ』プロジェクト~その2:LCD キャラクタディスプレイモジュール AQM0802A を試してみる"><meta property="og:url" content="https://ocoge.club/2022-06-21_aqm0802a/"><meta property="og:site_name" content="おこげ俱楽部"><meta name="twitter:card" content="summary"><meta name="twitter:site" content="@ocogeclub"></head><body class="flex flex-col h-screen bg-white text-gray-800 break-words"><header id="header" class="header-shadow bg-white px-6 py-5 z-50 fixed w-full top-0 transition-all transform ease-in-out duration-500"><div class="max-w-5xl mx-auto flex items-center flex-wrap justify-between"><div class="sm:mr-8"><a class="flex items-center" href="/"><span class="text-xl text-teal-700 font-semibold self-center"><img src="/assets/img/ocoge_title_kogecha.webp" title="おこげ俱楽部" alt="おこげ俱楽部" id="site_title"></span></a></div><nav id="menu" class="order-last md:order-none items-center flex-grow w-full md:w-auto md:flex hidden mt-2 md:mt-0"><a href="/about" class="block mt-4 md:inline-block md:mt-0 font-medium text-gray-700 hover:text-teal-600 text-base mr-4">About</a> <a href="/tags" class="block mt-4 md:inline-block md:mt-0 font-medium text-gray-700 hover:text-teal-600 text-base mr-4">Tag List</a> <a href="https://cloud.ocoge.club/" target="_blank" rel="noopener" class="block mt-4 md:inline-block md:mt-0 font-medium text-gray-700 hover:text-teal-600 text-base mr-4">Cloud/Mail</a> <a href="https://git.ocoge.club/ocogeclub/pages" target="_blank" rel="noopener" class="block mt-4 md:inline-block md:mt-0 font-medium text-gray-700 hover:text-teal-600 text-base mr-4">ocogIt</a></nav><form id="search" action="/search" class="order-last sm:order-none flex-grow items-center justify-end hidden sm:block mt-6 sm:mt-0"><label class="visually-hidden" for="header-searchbox">記事タイトル/概要を検索 ...</label> <input type="text" id="header-searchbox" name="q" placeholder="記事タイトル/概要を検索 ..." class="w-full sm:max-w-xs bg-gray-200 border border-transparent float-right focus:bg-white focus:border-gray-300 focus:outline-none h-8 p-4 placeholder-gray-500 rounded text-gray-700 text-sm"></form><div id="menu-toggle" class="flex items-center md:hidden text-gray-700 hover:text-teal-600 cursor-pointer sm:ml-6"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-menu"><line x1="3" y1="12" x2="21" y2="12"></line><line x1="3" y1="6" x2="21" y2="6"></line><line x1="3" y1="18" x2="21" y2="18"></line></svg></div></div></header><main class="mx-7 lg:mx-6 mt-32 flex-grow"><article class="max-w-5xl mx-auto"><header class="mb-14"><h1 class="text-3xl text-center font-bold leading-normal text-gray-900 mt-0 mb-3">AQM0802A に文字を表示してみる</h1><div class="text-center"><i class="fa-regular fa-clock"></i> June 21, 2022</div><div class="mt-3 text-center"><a href="/tags/オコゲ" class="inline-block bg-gray-200 rounded-full px-3 py-1 text-sm font-medium text-gray-700 m-0.5">#オコゲ</a> <a href="/tags/デスクトップアプリ版" class="inline-block bg-gray-200 rounded-full px-3 py-1 text-sm font-medium text-gray-700 m-0.5">#デスクトップアプリ版</a></div><div class="mt-10 -mx-7 md:mx-0"><img class="w-full max-w-2xl mx-auto" src="/assets/img/ogp_aqm0802a.webp" alt="This post thumbnail"></div></header><div id="content" class="prose text-gray-800 max-w-none"><div class="balloon_right"><div class="faceicon_right"><img src="/assets/img/mimmy.webp"><p>ミミィ</p></div><div class="chatting"><div class="says_right"><p>とにかく試しに動かしてみるわよ!<br>考えてるヒマがあったら手を動かすのよ手を!</p></div></div></div><div class="balloon"><div class="faceicon"><img src="/assets/img/tama.webp"><p>タマちー</p></div><div class="chatting"><div class="says">1行目に「ocoge」、2行目に「club」と表示してみよう・・・</div></div></div><div class="box_stripe"><p>手順説明の下に『オコゲ』のブロックで組み立てたプログラムコードを畳んで置いてあります。クリックすると開きます。<br>※一部ブロックの形状が現行バージョンと異なります。</p></div><div class="balloon_right"><div class="faceicon_right"><img src="/assets/img/mimmy.webp"><p></p></div><div class="chatting"><div class="says_right"><p>それとこの先の説明では16進数と2進数が何の説明もなく出てくるわ!<br>気になる人は <a href="https://wa3.i-3-i.info/word1610.html" target="_new" title="">16進数 <span style="color: gray; font-size: smaller;"><i class="fa-solid fa-arrow-up-right-from-square"></i></span> </a>, <a href="https://wa3.i-3-i.info/word1606.html" target="_new" title="">2進数 <span style="color: gray; font-size: smaller;"><i class="fa-solid fa-arrow-up-right-from-square"></i></span> </a>あたりを見てネ!</p></div></div></div><div class="balloon"><div class="faceicon"><img src="/assets/img/tama.webp"><p></p></div><div class="chatting"><div class="think-l-bal-s"></div><div class="think-l-bal-l"></div><div class="tamathink"><p>【<a href="https://wa3.i-3-i.info/index.html" target="_new" title="">「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典 <span style="color: gray; font-size: smaller;"><i class="fa-solid fa-arrow-up-right-from-square"></i></span> </a>】<br>ユルくて好き・・・</p></div></div></div><h2>I2C アドレス</h2><p>次のコマンドで確認します。</p><pre><code class="language-bash">$ i2cdetect -y 6
|
||
0 1 2 3 4 5 6 7 8 9 a b c d e f
|
||
00: -- -- -- -- -- -- -- --
|
||
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
|
||
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
|
||
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 3e --
|
||
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
|
||
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
|
||
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
|
||
70: -- -- -- -- -- -- -- --
|
||
</code></pre><p>AQM0802A の I2C アドレスは 0x3e と分かりました。</p><details class="lesson"><summary class="blockprogram"><i class="fa-solid fa-computer-mouse"></i> 『オコゲ』ブロックプログラム:I2C デバイスを開く</summary><div class="lesson"><div class="slide"><figure class="center"><img loading="lazy" src="/assets/img/game-dentak_i2copen.webp"><figcaption>GPIO を有効にして I2C デバイスに接続する</figcaption></figure><p>デバイスに限らず、何かに接続して使用可能な状態にすることをコンピュータ用語では「開く (open)」と表現します。</p></div></div></details><h2>コマンド書き込み</h2><p>レジスタ 0x00 にコマンドコード(1バイト)を書き込むことで、AQM0802A にコマンド(命令)を送信することができます。</p><details class="lesson"><summary class="blockprogram"><i class="fa-solid fa-computer-mouse"></i> 『オコゲ』ブロックプログラム:コマンドを書き込む</summary><div class="lesson"><div class="slide">繰り返し使用するプログラムなので、関数として分離しておきます。<figure class="center"><img loading="lazy" src="/assets/img/game-dentak_func-command.webp"><figcaption>コマンド書き込み関数</figcaption></figure><p>コマンド書き込み毎に待ち時間が必要です。待ち時間の長さはコマンドの種類によって若干の違いがあるようですが、ここでは無視して100分の1秒で統一します。</p><div class="balloon_right"><div class="faceicon_right"><img src="/assets/img/mimmy.webp"><p></p></div><div class="chatting"><div class="says_right"><p>ちゃんと動いているから大丈夫!<br>たぶん!</p></div></div></div></div></div></details><h2>データ書き込み</h2><p>レジスタ 0x40 にバイトコードを書き込むことで、AQM0802A 内蔵の RAM (DDRAM/CGRAM) にデータを書き込むことができます。DDRAM にデータを書き込むと画面に文字を表示することができます。CGRAM は自作文字のデータを登録しておくことができます。</p><details class="lesson"><summary class="blockprogram"><i class="fa-solid fa-computer-mouse"></i> 『オコゲ』ブロックプログラム:データを書き込む</summary><div class="lesson"><div class="slide">こちらも繰り返し使用するので関数にしておきます。<figure class="center"><img loading="lazy" src="/assets/img/game-dentak_func-data.webp"><figcaption>データ書き込み関数</figcaption></figure></div></div></details><h2>初期化</h2><p><a href="https://akizukidenshi.com/download/ds/xiamen/AQM0802.pdf" target="_new" title="">秋月電子のデータシート <span style="color: gray; font-size: smaller;"><i class="fa-solid fa-arrow-up-right-from-square"></i></span> </a>に従って初期化します。</p><p>以下のコマンドコードを、順にレジスタ 0x00 に書き込みます。</p><ol><li>0x38 (機能設定:表示行数とか文字の大きさとか)</li><li>0x39 (拡張コマンドモード開始)</li><li>0x14 (内蔵発振器周波数)</li><li>0x70 (コントラスト)</li><li>0x56 (3V動作)</li><li>0x6c (フォロワ回路のオンオフと増幅率)</li><li>0x38 (拡張コマンドモード終了)</li><li>0x0c (ディスプレイオン・カーソルオフ)</li><li>0x01 (ディスプレイクリア)</li></ol><details class="lesson"><summary class="blockprogram"><i class="fa-solid fa-computer-mouse"></i> 『オコゲ』ブロックプログラム:AQM0802A を初期化</summary><div class="lesson"><div class="slide"><figure class="center"><img loading="lazy" src="/assets/img/game-dentak_init.webp"><figcaption>初期化手順</figcaption></figure></div></div></details><h2>文字表示</h2><p>DDRAM にデータを書き込むと画面に文字を表示します。</p><h3>DDRAM アドレスを指定</h3><p>文字を表示するディスプレイ上の位置(2行目の3文字目とか)を指定します。</p><p>(データシートコマンドコード表より)</p><table><thead><tr><th>Instruction</th><th style="text-align:center">DB7</th><th style="text-align:center">DB6</th><th style="text-align:center">DB5</th><th style="text-align:center">DB4</th><th style="text-align:center">DB3</th><th style="text-align:center">DB2</th><th style="text-align:center">DB1</th><th style="text-align:center">DB0</th></tr></thead><tbody><tr><td>Set DDRAM address</td><td style="text-align:center">1</td><td style="text-align:center">AC6</td><td style="text-align:center">AC5</td><td style="text-align:center">AC4</td><td style="text-align:center">AC3</td><td style="text-align:center">AC2</td><td style="text-align:center">AC1</td><td style="text-align:center">AC0</td></tr></tbody></table><p>データシートではコマンドは8桁(8ビット)の2進数で書かれています。それぞれのビットに役割があり、最上位ビットを立てると DDRAM アドレス指定コマンドとして働きます。残りの7ビットでアドレス値を指定します。DDRAM アドレス値と表示位置の対応は次の通りです。(横の〇文字目を便宜上「列」と表現することにします)</p><table><thead><tr><th style="text-align:center"></th><th style="text-align:center">1列目</th><th style="text-align:center">2列目</th><th style="text-align:center">3列目</th><th style="text-align:center">4列目</th><th style="text-align:center">5列目</th><th style="text-align:center">6列目</th><th style="text-align:center">7列目</th><th style="text-align:center">8列目</th></tr></thead><tbody><tr><td style="text-align:center">1行目</td><td style="text-align:center">0x00</td><td style="text-align:center">0x01</td><td style="text-align:center">0x02</td><td style="text-align:center">0x03</td><td style="text-align:center">0x04</td><td style="text-align:center">0x05</td><td style="text-align:center">0x06</td><td style="text-align:center">0x07</td></tr><tr><td style="text-align:center">2行目</td><td style="text-align:center">0x40</td><td style="text-align:center">0x41</td><td style="text-align:center">0x42</td><td style="text-align:center">0x43</td><td style="text-align:center">0x44</td><td style="text-align:center">0x45</td><td style="text-align:center">0x46</td><td style="text-align:center">0x47</td></tr></tbody></table><p>以上から、ディスプレイ上の文字表示位置を指定するには以下のようにします。</p><ul><li>レジスタ 0x00 に、「0x80(最上位ビット) +(上の表のアドレス値)」を書き込む</li></ul><h3>文字表示</h3><p>DDRAM アドレス指定コマンドを書き込んだのちにデータ書き込みを行うことで、指定した位置に文字を表示することができます。文字コードは以下の通りです。</p><figure style="max-width: 400px; margin: 0 auto;"><div class="floatbox" data-fb-options="colorTheme:silver" style="width: 100%;"><a href="/assets/img/game-dentak_character-patterns.webp" title="キャラクターパターン表"><img loading="lazy" src="/assets/img/game-dentak_character-patterns.webp" style="width: 100%;"></a></div><figcaption><i class="fa-solid fa-magnifying-glass"></i> クリックで拡大</figcaption></figure><p>コード <code>0010 0000</code> からコード <code>0111 1101</code> まで、すなわちキーボードで入力できる半角(1バイト)の英数字・記号の大部分は UTF-8 (ascii) のコードと一致していますので、表示したい文字列がこの範囲内であれば、そのままデータとして(レジスタ 0x40 へ)書き込めば良いでしょう。</p><details class="lesson"><summary class="blockprogram"><i class="fa-solid fa-computer-mouse"></i> 『オコゲ』ブロックプログラム:AQM0802A に文字を表示する</summary><div class="lesson"><div class="slide">行と列を指定して文字列表示を行う関数を作成しましょう。<figure style="max-width: 800px; margin: 0 auto;"><div class="floatbox" data-fb-options="colorTheme:silver" style="width: 100%;"><a href="/assets/img/game-dentak_func-dispchars.webp" title="文字列表示関数"><img loading="lazy" src="/assets/img/game-dentak_func-dispchars.webp" style="width: 100%;"></a></div><figcaption><i class="fa-solid fa-magnifying-glass"></i> 文字列表示関数</figcaption></figure><p>「行」と「列」は、内部的には0(ゼロ)から始まる数え方をするので、それぞれ1を引きます。</p><p>大文字・小文字・記号などがちゃんと表示されるかどうか、表示位置指定の確認も含めて、1行目に「{ocoge}」、2行目は右に3文字ずらして4文字目から「CLUB!」と5秒間表示することにしましょう。</p><figure class="center"><img loading="lazy" src="/assets/img/game-dentak_call-dispchars.webp"><figcaption></figcaption></figure><p>最後に、ディスプレイをオフにしてデバイスとの接続を切るなど後片付けをします。ディスプレイの表示をオフにするにはコマンド <code>0x08</code> を書き込みます。</p><figure class="center"><img loading="lazy" src="/assets/img/game-dentak_okatazuke.webp"><figcaption></figcaption></figure></div></div></details><h2>まとめ</h2><p>今回作成したプログラムはこのようになりました。</p><figure style="max-width: 400px; margin: 0 auto;"><div class="floatbox" data-fb-options="colorTheme:silver" style="width: 100%;"><a href="/assets/img/game-dentak_display-characters.webp" title="AQM0802A に文字を表示してみるプログラム"><img loading="lazy" src="/assets/img/game-dentak_display-characters.webp" style="width: 100%;"></a></div><figcaption><i class="fa-solid fa-magnifying-glass"></i> AQM0802A に文字を表示してみるプログラム</figcaption></figure><figure style="max-width: 200px; margin: 0 auto;"><div class="floatbox" data-fb-options="colorTheme:silver" style="width: 100%;"><a href="/assets/img/game-dentak_display-characters-result.webp" title="AQM0802A に文字を表示してみた結果"><img loading="lazy" src="/assets/img/game-dentak_display-characters-result.webp" style="width: 100%;"></a></div><figcaption><i class="fa-solid fa-magnifying-glass"></i> 実行結果</figcaption></figure><p>バックライトは点灯させていません。期待通りの動作をしているようです。メデタシ。<br>次回はゲームのルール確認と自作文字(UFO と残機表示)の作成をしましょう。</p></div><div class="mt-10"><div id="disqus_thread"></div><script>let disqusLoaded = false;
|
||
let disqus_config = function () {
|
||
this.page.url = 'https://ocoge.club/2022-06-21_aqm0802a/';
|
||
this.page.identifier = '2022-06-21_aqm0802a';
|
||
};
|
||
function loadComments() {
|
||
if (!disqusLoaded) {
|
||
disqusLoaded = true;
|
||
const d = document, s = d.createElement('script');
|
||
s.src = '//ocogeclub.disqus.com/embed.js';
|
||
(d.head || d.body).appendChild(s);
|
||
}
|
||
}
|
||
if(!!window.IntersectionObserver) {
|
||
const disqusEl = document.getElementById('disqus_thread');
|
||
const intersectionObserver = new IntersectionObserver(function(entries, observer) {
|
||
if (entries && entries[0] && entries[0].isIntersecting) {
|
||
loadComments();
|
||
observer.unobserve(disqusEl);
|
||
}
|
||
});
|
||
intersectionObserver.observe(disqusEl);
|
||
}</script></div></article></main><footer class="mt-20 px-10 py-8 bg-gray-200"><div id="footer-badge"><a href="https://git.ocoge.club/" target="_new"><img loading="lazy" src="/assets/img/git-ocogeclub.svg" class="footer-img"></a><a href="http://creativecommons.org/licenses/by-sa/4.0/deed.ja" target="_new"><img loading="lazy" src="/assets/img/License_BY-SA_4.0.svg" class="footer-img"></a></div><div class="max-w-5xl mx-auto text-gray-700 text-center">© 2023 <a href="/" class="font-medium" target="_blank" rel="noopener">おこげ俱楽部</a>. Made by <a href="https://ocoge.club" target="_blank" rel="noopener">ocogeclub</a> using <a href="https://www.11ty.dev" target="_blank" rel="noopener">Eleventy</a> and <a href="https://github.com/dafiulh/vredeburg" target="_blank" rel="noopener">Vredeburg</a>.<br></div></footer><script src="/assets/js/bundle.js"></script></body><script>window.addEventListener('load', (event) => {
|
||
document.getElementsByTagName('html')[0].style.display='block';
|
||
});</script></html> |