ゲームボタン(OBSAT-60UMQ)をテスト

アーケードゲーム機でよく使用されるゲームボタンのメーカーである三和電子から他とは違うタイプが出ていたので試してみました。正式な型番はOBSAT-60UMQ-G-HSW-12Vで筆者購入時の価格は2750円でした。

三和電子のこのような大きなボタンは裏側にオムロンのマイクロスイッチ(V-10-1A4)とウエッジ球が実装され、結構大きいために何らかの機器に組み込む場合は必然と大きくなってしまう。しかしこのボタンは無接点スイッチとLEDの基板によりコンパクトな形状となっている。しかもZHコネクタによって組立作業にも配慮されている。

試した回路、基板は下の写真のとおり。回路図は無く、ユニバーサルに適当に配線しています。試作は修正することも多いので片面に部品も配線も行っています。抵抗やコンデンサは基本的にチップを使っています。
ピンヘッダやすずメッキ線に色を塗っていますがATX電源の規格に準拠しており、黄色が12V、赤が5V、黒がグランド、白が信号線としています。

このタイプのボタンは12V用しかなく、電源には12Vが必要となります。さらに接続するマイコンの信号用に5V又は3.3Vなどのレギュレータが必要になります。
LEDの制御にはマイコンの信号電圧と電流の関係でフォトカプラを入れています。今は亡きTLP-521が手元にありましたので使用しています。コレクタ電流値がギリなので少し気になりますが・・・。
右側のSW OUTはプルアップしていますので待機でHI、押してLOWとなります。LED INはHIで消灯、LOWで点灯となります。

LEDには定電流ダイオード?が入っているので直接12Vかけても大丈夫です。点灯させてみたところウエッジ電球のタイプと比較すると少し暗い感じで実際に使用するには5V回路にする点も含めて基板を改造したほうがよさそうでした。

気になるスイッチ部分ですがフォトインタラプタを使用しているので無接点スイッチで接触不良の心配が軽減できます。そもそもこれ以外のモデルで使用されているマイクロスイッチはオムロンの資料で電気的耐久性が30万回と書かれており、かつ1分間に30回と記載されています。ゲーム用としてのボタンのスイッチ部分としては少々性能不足に思いますがこのモデルは無接点ですのでこちらのほうが耐久性は期待できます。三和電子の資料では電気的耐久性1000万回以上と記載されています。

また、通常スイッチ回路にはチャタリング防止として10μFのコンデンサを入れたりしますがその点は無接点なので不要です。

無意識に押したときのオシロとなりますが、約0.1msecとなっています。が、押す速度に依存しますので連打した場合はもちろんさらに短くなりますし、ゆっくり押すと傾斜がなだらかになってしまいますので手の震えが秒妙にある場合などを想定すると可能性は低いですがマイコン側ではチャタリングとなってしまう可能性はあります。

また、スイッチ部分には0.1mA程度流さないと接触不良を起こす可能性もあるが非接触であればその点も心配は不要と思われる。

まとめとして、下記の特徴があげられる。

良い点

・高耐久
・奥行きが短い
・ZHコネクタを採用
・見た目が以前からの物と変わらない

よくなかった点

・LEDが少々暗い
・クリック感が無い(スイッチのクリック感は客先によっては重要視される)
・12Vしかない

以上の点で設計上での置き換えは進めたいと考えるものの、少し注意しながらの置き換えが望ましいと思われる。

BigShot(レトロゲーム)を修理できる?

~ある日修理できませんか?と持ち込まれました~

BigShotとは?

高砂電器産業のビッグショット。人によっては非常に懐かしい超レアなゲーム機で、100円を入れて遊ぶゲーム機です。この機械は100円に設定されていましたが、物によっては10円だったりすると思います。コインを判別する部分は取り替え可能になっておりましたので・・・。

今尚健在なゲームセンターにある競馬ゲームの発端?ともいうべきゲーム機で賭けたいビット数だけコインを投入し、枠のボタンを押します。スタートボタンを押して外れればそのまま終了し、当たればあたった枚数のコインが出てきます。
その当たり枚数が10枚とか15枚とか出てくるので、子供にとってなけなしの小遣いで当たった日には間違いなくギャンブル中毒にはまるでしょう。

故障内容

持ち込まれた際には遊技可能ですが、ランプが消えて点かない、又は暗いという問題がありました。症状的には1ブロック丸ごとだったので初見では単純にランプが切れているのではなく、断線によるものと推定いたしました。

早速開けれる箇所を開けて点検してみました。右の写真は表示パネルの裏側ですが、結束している箇所を解き、断線していないか?問題の線はどのように接続されているのかを手繰っていきました。この部分に関してはおそらくは30年以上経過しているにもかかわらず問題ありませんでした。
しかし点くべきランプの配線には通電しておらず、下から来る配線のどこかで断線しているような感じです。

次に正面下側の扉を開け点検してみることにしてみました。

問題の線を手繰っていくとどうやらこの基板(右側写真)の上側につながっているようです。基板を外し(非常に硬かったです)ついでに端子部を接点復活材などで磨きました。するとやはり断線している線を見つけました。ちょうどランプが消えている問題の線(青の線)でした。

断線している線を再度はんだし、接続してみましたが復活できず・・・。

この基板周辺の配線も点検してみましたが他に断線は見られませんでした。余計に壊してしまうという恐れもあってこれ以上手を加える勇気はありませんでした。

とりあえずは遊べるのでここら辺であきらめることとしました。

故障原因

修理は断念してしまったので推測でしかありませんが、断線によって使用していたため、ランプに対しての接触不良が頻繁にトランジスタへの過電流(突入電流)を招き、トランジスタ(基板左上のどれか)が焼けたものと思われます。

基板を外した状態で電源を入れてオシロスコープで動きが見れれば修理は出来そうな気はしますがそれには相当な労力が必要であきらめてしまいました。

また、基板を外してわかったのですが、基板の裏側は湿気がひどい?のが原因でしょうか?ほぼ全面のレジストが浮いていてすごいことになっていました。コレが原因?では無いと思います。

最後に

さて、昔懐かしいレトロゲーム機の修理に挑戦してみましたが、残念ながら完治は出来ませんでした。が、修理してみたくてインターネットで検索している方へ少しでも貢献できればと公開してみました。
また、この記事を見て問い合わせしてみようと考えるのは結構ですが、あまり期待できませんのであしからず・・・。

レーザー加工機(Smart Laser CO2)買いました

※すでに売却済みで手元にはありません。

レーザー加工機(Smart Laser CO2)とは?

樹脂や紙など、レーザーによって切断したり焦げ目をつけるための機械で、モノづくりの現場では多用されています。レーザーの出力がワット数で表現され、1000Wクラスとなると金属も切れるようです。今回購入したのは40W。5mmのアクリルぐらいなら簡単に切れます。

どうせ買うなら3Dプリンターの方がいいのでは?という考えもありましたが、3Dプリンターは出力サービスが増えており、そちらに出す方が多種多様なパーツがすぐに作れます。さらに100万円以下の多くの3Dプリンターでは樹脂を積層していく方式なので出力後のざらざらとした感じと裏面のぐちゃぐちゃ感、サポート材を削ってきれいにする作業は必ず残ります。つまり3Dプリンターは仕上げ作業が必要な事が多い点がネックとなります。また、加工時間も長く、マウスぐらいのサイズでも5時間とか8時間とかかかります。その生産性と比較し、レーザー加工機は基本切るだけなので仕上げ作業も少なく、生産性は高いと考えたからです。

機械は割と大きいので狭い事業所では設置場所に少々困ります。別のパソコンとモニター、マウス、キーボードは兼用して窓際に設置しました。切断時の煙が結構出ますので、何らかの排煙は必須です。

Smart Laser CO2

・加工エリア:600×440mm
・レーザー方式:CO2レーザー 40W
・対応加工方式:ベクター加工、ラスター加工
・対応OS:Windows7、Windows8、Windows8.1、Windows10、
Mac OS X、Linux、Raspberry Pi
・対応ブラウザ:Chrome、FireFox
・対応ファイル:SVG、DXF
・付属品:保護メガネ、USBケーブル、ACケーブル
・電源:AC100V
・サイズ:910×820×380mm
・使用時温度:30度以下
・連続使用時間:30分以下
・重さ:約42kg

組み立て

注文後、約1ヵ月で大量の資材が届いた。開封し、欠品がないか確認する・・・が、部品点数が多くて確認には1時間以上かかった。

組み立ては正直丸1日かければ大体組みあがるかとなめていたが、実際には丸3日(24時間)ほどかかった。組み立てマニュアルは付属せず、ネット上に公開されている。画面で見ていると作業性が悪いのでその都度印刷していたら本のような枚数になった・・・。ちなみに、GoogleChromeの簡易版ページで印刷すると見やすくなった。

組み立て・操作マニュアル(ネット上のみ)

組み立てには六角レンチ、組スパナも必要だが電動ドライバとエルボがあると非常に効率的。それでも3日かかったので電動ドライバが無い場合はそれなりの労力が必要となる。

組み立て後、調整を行いつつ試験使用。試しに色々加工していくと、調整不足に気づき、少々分解して調整しなおすの繰り返し。レーザー加工機を熟知していれば組み立てながら調整はスムーズに行えると思うが、筆者はレーザー加工機が初めてで、結局調整と大体の勝手がわかるまで1週間ぐらいかかった。

※後にSmartLaserCO2はFABOOL LaserCO2と改名されたようです。ボランティアで組立てに行く機会がありましたので、オフラインでも組立マニュアルが確認できるようにPDF化したファイルと必要なドライバ関係一式を残しておきます。尚、ブラウザの問題なのか最後までPDF化できていないファイルがいくつかあるようです。普通のレーザープリンターに変えても同じでした、謎です。

FABOOL Laser CO2組立てマニュアル等一式 fabool_laser_co2_offline_document.zip(2017年7月20日作成)

加工してみました

アクリル板をカットしてみました。写真上の方に見える集光レンズ(黄色のレンズ)の上からレーザー光が照射され、材料に当てて加工します。左側に見える青いチューブのつながったところからはエアーが出ていて材料から火が出ないように吹き消しているという感じです。これがなかったら紙などは簡単に燃え上ってしまいます。

2mmの方では2枚重ねて会社のロゴとなるキーホルダーを作ってみました。

加工用データ

 テストキーホルダー
(SVGファイル、DXFファイル)

 20mm丸(DXFファイル)

右の写真はアクリル5mm板を20mmの直径でカットした断面をさらにカットした写真です。円を切ったカット面はまっすぐ?ちょっと斜め?という感じです。少々調整しにくいのかまだまだ調整方法に工夫が必要なのか現状こんな感じです。

印象としては意外と早く切れるという感じです。しかしカット面の直角を出すのが難しい点から10mmぐらいの細かい部品を作るのは微妙です。

注意点

筆者の知識不足によりご指摘をいただきました。ここを読まれる方も十分にご注意ください。
ご指摘頂いたのは塩ビ系素材にレーザーを当て、加熱加工することにより、塩素ガス、塩化水素ガス、ダイオキシンが発生するという事でした。よって、塩ビ素材、消しゴムについての記事は削除及びYoutubeも削除いたしました。
筆者も塩素の含まれる素材を燃焼など高温で処理した場合、ダイオキシンが発生するという知識はありましたがその話を聞いてから年数もたっており、うっかりと忘れておりました。大変申し訳ありません。
ダイオキシンは体に悪い事は2000年ごろだったか少々社会問題となり、認識はあると思いますが塩素ガス、塩化水素ガスは金属・樹脂の区別なく腐食させ、人体の粘膜にも損傷させるそうです。また消しゴムのレーザー加工も一般的な消しゴムは「塩ビに可塑剤を混ぜたもの」で塩ビ素材そのものほどではない物の同様に危険な行為だそうです。皆さんも十分に認識し、ご注意ください。

Q&A

この製品は機器の組み立てに関してある程度慣れた方向けの商品。さらに、プラモデルの延長のレベルではないとこが驚いた。組み立てながらも「よくこんな物を一般向けに販売してるよなぁー・・・、クレームとか低レベルな質問が大変そうやなぁー」と呟いていた。サポート等は無く、自力で頑張ってくださいというスタンスに共感したので・・・、人柱的にも気づいた点をQ&A形式で残していこうと思います。内容が間違っているとか、追加情報いただければ更新いたします。
また、実物を見たいという方はお問い合わせ頂ければ対応いたしますが、そこはボランティアですのでご配慮願います。

  Q.設定値はどれぐらいでしょうか?
 

A.パワーを30%で速度を調整して厚みに対応するという感じです。 こんな素材を試してほしいなど、ご要望あれば試します。また、外気温やレーザー管や電源の経年劣化?によってここまでの性能が出ない場合があります。購入してから2か月以内のデータとなりますので、参考とお考え下さい。当社でも半年使用するとここまでの性能は出なくなりました。

切削加工
材料 厚み 速度 仕上がり
アクリル(透明) 1mm 400 良好
アクリル(透明) 2mm 200 良好
アクリル(透明)※1 5mm 80 良好
アクリル(透明)※1 8mm 35 良好
アクリル(透明)※1 10mm 25 良好
木材 シナベニヤ 4mm 100 良好
木材 シナベニヤ 5.5mm 40 貫通できず
木材 桧(ひのき) 6mm 100 まあまあ
木材 桧(ひのき) 9mm 40 貫通できず
木材 栂(つが) 12mm

40

貫通できず
木材 杉 9mm 40 貫通できず
木材 ファルカタ 6mm 80 良好
木材 ファルカタ 13mm 40 貫通できず
木材 アガチス 3mm 700 良好
木材 アガチス 10mm 40 貫通できず
木材 MDF 5.5mm 20 貫通できず
ゴム NRスポンジゴム 5mm 200 切り口汚い
ゴム ゴムシートGS-05 1mm 200 切り口汚い
アルミ 0.2mm 20 無傷
※パワーはすべて30%です。
※木材は所々残ってしまうことが多く、速度を遅めても焦げが大きくなるだけで貫通できない場合があります。押しぬく前に裏面を確認し、抜けていない箇所はカッターなどで補修が必要です。逆に速度を極端に速めて何十回も加工することで下まで抜けるようです。(試していませんので他の方からのアドバイスです。)
※1アクリルで厚みがある場合はカット後、くっついてしまうのかスポッとは抜けない場合があります。ドライバーの柄やプラハンマーなどで軽くたたいて抜きとる必要があります。

※パワーはすべて30%です。
※木材は所々残ってしまうことが多く、速度を遅めても焦げが大きくなるだけで貫通できない場合があります。押しぬく前に裏面を確認し、抜けていない箇所はカッターなどで補修が必要です。逆に速度を極端に速めて何十回も加工することで下まで抜けるようです。(試していませんので他の方からのアドバイスです。)
※1アクリルで厚みがある場合はカット後、くっついてしまうのかスポッとは抜けない場合があります。ドライバーの柄やプラハンマーなどで軽くたたいて抜きとる必要があります。

彫刻加工
材料 速度 仕上がり
アクリル 800 1mm程度カッターで
彫った感じ
アクリル 1200 0.5mm程度カッターで
彫った感じ
アクリル 2000 ルーターで削った感じ
コルク 4000 良好

※パワーはすべて30%です。
※速度に関してはもう少し上げられると思いますが横に走るローラーとベルトが稀に滑りますのでこの程度にしています。
※アクリルに関しては加工箇所の周辺が白くなります。気になる方は紙やすりなどで仕上げた方が良いです。塗装するとほぼ分からなくなります。
※MDF材は2回、3回加工しても貫通できませんでした。

 

Q.真円、直角が出ません。

 
  A.X方向とY方向のフレームの直角が出ていない可能性があります、この作業を正確に行うには根気よくやるしかないと思いますが、直角の差し金または対角に計測しながら組みなおすしかないと思います。  
     
  Q.ラスターデータで加工する際に、レーザー加工機のソフトでバックエンドエラー又はno data loaded to generate previewと出てデータが読めない。  
  A.明確に原因が特定できているわけではありませんが、SVGファイルを作成する前の画像データで縦横1000px以下にしなければならない様です。また、解像度も読み込む時の値に合わせ、72pixel/inchにしなければなりません。  
     
  Q.外気温は影響しますか?  
 

A.影響します。寒い方が良いようです。真夏の加工は難しいような気がします。サポートにお聞きしたところ30度を超えたら性能が明らかに落ちるとの事でした。当社でも冷却水がお湯状態なると性能が激落ちで使い物にならなくなるのでレーザー加工機のオプションで購入したラジエータは取り外し、熱帯魚用のクーラーを付けました。ゼンスイのZR-miniです。冷却水はクーラーで十分冷えて加工性能は改善しましたが何故か4月ごろの性能は発揮できません。

 
     
  Q.レーザーが弱い気がします  
 

A.集光レンズの高さ調整はできていますか?集光レンズは対象物の厚みに合わせて調整する必要があります。1mmのアクリルを調整してカットした後、5mmのアクリルをそのままカットしても切れ味は悪く、意外とマメに調整する必要があります。

 
     
  Q.やっぱりレーザーが弱い気がします  
 

A.反射ミラーの調整を確認してください。反射ミラーの確認は照射位置が手前の左、手前の右、奥の左、奥の右の4カ所で確認してください。左手前の第2ミラーの位置と右側の第3ミラーのセンターが合っていない場合は手前の右で合っていても手前の左で合いません。同じく、第1ミラーのセンターと第2ミラーのセンターが合っていなくても奥と手前でずれてしまいます。ミラーの向きだけでなく位置も確認してください。

 
     
  Q.でもやっぱりレーザーが弱い気がします  
 

A.蝶番でついている上蓋の奥にある蓋を開けてレーザー管を確認してください。レーザー出力しているときにピンク色に見えるレーザーは安定よく出ていますか?レーザー管の冷却が足りないとき?は安定が悪いように思います。レーザー管にたくさんの空気が残っていたり連続稼働が長すぎたり出力が強すぎたりしている可能性があります。

 
     
  Q.もう嫌になってきた、レーザーが弱いです!  
 

A.反射ミラーやレンズは汚れていませんか?反射ミラーを調整する際にミラーの上にマスキングテープを貼り、レーザーで焼く作業を繰り返しているとその煙の影響でレンズや鏡が汚れます。調整後にはレンズや鏡をティッシュ等で綺麗に掃除してください。

 
     
  Q.冷却装置の気泡が消えません  
 

A.まず、冷却水はレーザー管の出力側から排水させます。逆につないでしまっている場合は電源を切って接続しなおしましょう。
流水方向があっているのにレーザー管に多くの空気が残っている場合は排水口の向きを確認してください。下に向いていたり横向いている場合は空気が抜けきりません。レーザー管を固定しているアクリルのビスを緩め、排水口が上向きになるように回して下さい。ホース内についてしまっている小さな気泡は気長に回し続けることで勝手になくなります。気泡がなくなってくると水も減ってくるので、途中でつぎ足すことを忘れずに・・・。

 
     
  Q.冷却装置のラジエータがビリビリします  
 

A.通常はビリビリ来ませんが、何が悪かったのか一時的にこのような症状が出たことがあります。レーザー照射時にレーザー管の電気が水を伝ってきていると思います。冷却装置と接続しているホースに金属製のカプラ等を取り付けた場合も同じく照射時にはカプラがビリビリしますので感電に注意してください。ちなみにアースには接続しない方がいいと思います。

 
     
  Q.組み立て後部品が余りました  
 

A.当社で組み立てた時も余りました。使っていても組み忘れという感じもなく、おそらく製造ロットによって必要部品数が変わっていると思います。用意する方も足りないのは問題だけど余るのは予備にもなるしいいんじゃない?という感じでしょうか・・・。

 
     
  Q.アルミはアルミホイルぐらいに薄くても切断できませんか?  
 

A.無理です。いくら遅く試しても無傷でした。

 
     
  Q.加工エリアって仕様書どおりできますか?  
 

A.ミラーとかが当たるので無理と思います、謎です。組み立てマニュアルの写真と届いたものが少々違う点から考えると、改良はちょくちょくやられているようです。その際に当初よりも狭くなってしまったのか、レーザーはそこまで行かないけど材料を置けるエリアとして記載しているのかどちらかだと思います。
当社の場合の加工エリアは580×390で、レーザーが届く範囲です。

 
     
  Q.レーザー加工機が突然反応しない時がある  
 

A.原点に戻った時なのか、リミットが働いた時?なのかレーザー加工機がパソコンからのコマンドを受け付けなくなる時があります。おそらくはそんな仕様なのか、レーザー加工機についているマイコンボードがバグっているかどちらかだと思います。電源を切ってリセットしてください。
ちなみにリセットはレーザー加工機の電源を入り切りしてもダメみたいです。USBケーブルからの電源供給でマイコンボード電源が入ったままのようです。加工機の電源を切ったときにUSBケーブルも抜き差ししましょう。

 
     
  Q.レーザー加工機が加工を途中で止める  
 

A.弊社でもこの症状は出ました。コマンドを送っているパソコンのデバイスマネージャを開いてみていると一瞬マイコンボードのシリアルポートが消えたのが確認できたのでおそらくノイズが激しと思われます。付属より短い1mのUSBケーブルを用意し、フェライトコアを2つ取り付けました。フェライトコアは大きいものしかなかったのでそれぞれ2回巻きと3回巻きして取り付けたところ、症状は消えました。

 
     
  Q.デバイスマネージャにマイコンが認識されているのに「接続」ボタンをクリックしても繋がらない  
 

A.マイコンボードと認識されているシリアルポートの番号が大きすぎる可能性があります。当社でも組みつけた時にCOM22と認識され、この症状になりました。強制的にCOM1に変更したら問題なくつながりました。FTDIのチップを使った機器が周辺にある方はご注意を。

 
     
  Q.臭い!  
 

A.当社では92mmのパソコンケース用のFANを6個(1600rpmが3個と2000rpmが3個)使って専用の換気扇を作りました。が、それでも手前から少し出てきているようです。もう少し強力にしておけばよかったとすこし後悔しています。
後にさらにファンを強化しました。80mm各の100V用でさほどきつくないものですが、16個付けました。加工中は臭いませんが加工後蓋をすぐに開けるのでその時は少々臭いが室内に入ります。新規で設置される場合は換気扇を直付けするかダクトファンを検討した方がいいと思います。

 
     
  Q.Y軸方向に動き始めたとき、ベルトが滑る  
 

A.いくつかの問題点はあると思いますが、ベルトがきつ過ぎるかローラーに緩み又はずれの原因があると思われます。ベルトはラジオペンチなどで引っ張りながら締めるとパンパンに張ってしまいますが、手でフレームを動かしたときに緩いときと同じぐらいスムーズに動くけばOKとしています。
もう一つ、直角が出ていない可能性があります。100mm程度の正方形を加工したときにひし形になっていれば再調整が必要と思います。Y軸の直角に関係する六角ボルトを緩め、左右の位置を巻き尺で確認しながら締め、手動で軽く動かして均等に動けば完了としています。

 
     
  Q.加工ベースが粗くて小さい物が加工しにくいです  
  A.当社ではマス目の小さいハニカムコアテーブルを別途購入しました。注文先はモリシン工業(http://www.morishin.com/ 0576-26-2200)です。仕様はアルミハニカムコア 1/4inch t6 x 500 x 700で、1枚1万円ちょっとでした。  
     
  Q.来てもらえますか?  
 

A.夢のレーザー加工機を思い切って購入し、組み立てにチャレンジしたところ組み立てがうまくいかない、調整がうまくいかない、加工がうまくいかないなどなど、サポートが無いためにゴミになりそうな方が多くいそうな気がします。決して上から言っているつもりではありませんが、同志として思い切って買った物が期待に沿えず眠ってしまうのは耐えないほどの残念な思いに共感を覚えます。
そこで、モノづくりが好きな仲間に協力すべく、ボランティアでなら対応いたします。ボランティアですので壊しても文句は無しです。旅費交通費(弊社は大阪です)は請求しますが日当は頂きません。必要な工具類は持参します。作業しやすいようにできるだけ周辺に物は無い状態でお願いします。良識ある作業環境の提供、宿泊先で願いします。当然ですが、かび臭い宿泊先や真夏でエアコンの無い場所を提供されて事故が起こった場合、トラブルの元となります。

以上の心得でよければinfo@zeatec.jpの方にお問合せ下さい。モノづくりの楽しさを共感できればと思います。質問、相談などもお気軽にどうぞ。

ソリッドワークスで棚を作りました

ソリッドワークスとは?

近年3Dプリンターの影響で3次元CADが流行りつつあります。使えるかも?と思えるようなフリーソフトも出てきたので大変気になるところです。

フリーで使える3D-CADソフト

市販の3次元CADは数十万レベルから数千万の物まであります。当社では電子機器類の設計を頻繁にやっているのでソリッドワークスを選択しました。

ソリッドワークスにはフリーのビューアであるeDrawings用に出力ができます。そのファイルをiPadに入れ、iPad用eDrawingsで読み込むことでAR機能を使うこともできます。
AR機能を使えば現物を作らなくてもCGで確認できるのでより使い勝手をリアルに検証できます。

組図 banngai7-1f

ソリッドワークスのデータ banngai7-1

有機ELキャラクタモジュール(SO1602AW)によるテキスト表示

有機ELのキャラクタモジュールを早速試してみました。 視認性がとてもいいのでいろんなところに使いたくなります。キャラクタモジュール側の1,3,4と8,9は短絡しています。

使用機器

  使用機器は下記のとおり。他、パソコンや電源、PICKIT2も当然ながら必要です。LCDは3.3V定格と書いていますが、5Vでも使用できました。  
     
 
I2C接続小型キャラクタLCDモジュール Sunlike Display Tech. Corp. SO1602AWGB-UC-WB-U,
SO1602AWWB-UC-WB-U,SO1602AWYB-UC-WB-U
マイコンボード(PIC16F1947搭載) ZEATEC co.,ltd. ZT-PIC16F194701(3.3V仕様)

接続

接続に関してはいたって簡単。CPUボードにあらかじめ必要回路が実装されているため4本の足を伸ばして接続するだけ。今回はデュポン(QIコネクタ)コネクタを使用して配線しました。キャラクタモジュールの1,3,4と8,9は基板上で短絡しています。

 

有機ELキャラクタモジュール用ライブラリ so1602awxb.zip

 
  プロジェクトファイルも含めたサンプル so1602awxb_sample.zip  
  開発環境:MPLAB_IDE_8_92 + CCS-C PCMコンパイラVer.4.132
/*****************************************************************************************
LCDモジュール(SO1602AWGB-UC-WB-U,SO1602AWWB-UC-WB-U,SO1602AWYB-UC-WB-U)
用ライブラリ 2015/2/14作成

□提供元
ZEATEC co.,ltd. 

□ご利用について
転載・無断使用可です。このライブラリを使用した上での不具合等に関しては、いかなる内容におい
ても一切の責任を追わないものとします。

□使用方法
so1602awxb_init()をスタートアップに入れ、so1602awxb_puts("アイウエオabc")で任意の文字列を表示す
る。又はprintf(so1602awxb_puts,"    %02x:%02x:%02x    ",hour,min,sec);でprintfを使用して出
力する。
I2Cはハードウェア制御を推奨とし、宣言例は下記のとおり。

#use i2c(MASTER, SDA=PIN_C4, SCL=PIN_C3,SLOW,FORCE_HW)//FAST=400kbps SLOW=100kbps
ピンアサインはPIC16F1947で使用した場合とします。

*****************************************************************************************/

void so1602awxb_cmd(char c){
    //スタートコンディションを発行する
    i2c_start();
    //LCDのアドレス
    i2c_write(0x78);
    // control byte の送信(コマンドを指定)
    i2c_write(0x00);
    // data byte の送信
    i2c_write(c);
    // ストップコンディションを発行する
    i2c_stop();
}

void so1602awxb_init(){
    so1602awxb_cmd(0x01);//クリアーディスプレイ
    so1602awxb_cmd(0x02);//カーソルを初期値にする
    so1602awxb_cmd(0x0c);//ディスプレイオン(0x0c,0x0dならチラつき無い)
    so1602awxb_cmd(0x01);//クリアーディスプレイ
}

void so1602awxb_puts(char s){

    //so1602awxb_cmd(0x01);//クリアーディスプレイ

    //スタートコンディションを発行する
    i2c_start();
    //LCDのアドレス
    i2c_write(0x78);
    i2c_write(0x40);
    i2c_write(s) ;              // data byte の送信(連続送信)

    i2c_stop();
}

void so1602awxb_contrast(int cont){
    so1602awxb_cmd(0x2a);//RE=1
    so1602awxb_cmd(0x79);//SD=1
    so1602awxb_cmd(0x81);//コントラストセット
    so1602awxb_cmd(cont);//コントラスト値
    so1602awxb_cmd(0x78);//SDを0に戻す
    so1602awxb_cmd(0x28);//2C=高文字 28=ノーマル
}

追記

  1行目と2行目と指定して表示するには下記の様にする。  
  //1行目表示
so1602awxb_cmd(0x80);
so1602awxb_puts(“ZEATEC co.,ltd. “);
//2行目表示
so1602awxb_cmd(0xa0);
so1602awxb_puts(“ZT-GSBC03 “);

キャラクタLCDモジュール(AQM1602XA・AQM0802XA)によるテキスト表示

薄型のLCDモジュールが出回り始めたので早速試してみました。

使用機器

  使用機器は下記のとおり。他、パソコンや電源、PICKIT2も当然ながら必要です。  
     
 
I2C接続小型キャラクタLCDモジュール Xiamen Zettler Electronics Co., Ltd. AQM1602A-RN-GBW,AQM0802A-RN-GBW
※接続する際にはピッチ変換基板を利用しています。
マイコンボード(PIC16F1947搭載) ZEATEC co.,ltd. ZT-PIC16F194701(3.3V仕様)

接続

  接続に関してはいたって簡単。CPUボードにあらかじめ必要回路が実装されているため4本の足を伸ばして接続するだけ。今回はデュポン(QIコネクタ)コネクタを使用して配線しました。AQM0802A-RN-GBWの基板上では1,2を短絡しています。  
  LCDのほうは記入する都合で不規則に並んでいるので要注意です。
  AQM1602A・AQM0802A用ライブラリ aqmxx02a.zip  
  プロジェクトファイルも含めたサンプル aqmxx02_sample.zip  
  開発環境:MPLAB_IDE_8_92 + CCS-C PCMコンパイラVer.4.132
/*****************************************************************************************
LCDモジュール(aqmxx02a-RN-GBW)用ライブラリ 2015/2/12作成

□提供元
ZEATEC co.,ltd. 

□ご利用について
転載・無断使用可です。このライブラリを使用した上での不具合等に関しては、いかなる内容におい
ても一切の責任を追わないものとします。

□使用方法
aqmxx02a_init(5)をスタートアップに入れて下さい。カッコ内は使用電圧を指定します。3.3Vの時は
3と指定してください。setcursor_aqmxx02a(0,0)で表示位置を指定し、aqmxx02a_puts("アイウエオabc")
で任意の文字列を指定する。
I2Cはハードウェア制御を推奨とし、宣言例は下記のとおり。

#use i2c(MASTER, SDA=PIN_C4, SCL=PIN_C3,SLOW,FORCE_HW)//FAST=400kbps SLOW=100kbps
ピンアサインはPIC16F1947で使用した場合とします。

*****************************************************************************************/
void aqmxx02a_init(int volt);
void aqmxx02a_setcursor(int col, int row);
void aqmxx02a_cmd(unsigned char c);
void aqmxx02a_puts(char s);
void aqmxx02a_clear();

void aqmxx02a_init(int volt){
    aqmxx02a_cmd(0x38) ;     // function set           : データ線は8本・表示は2行・フォントは5x8ドット
    aqmxx02a_cmd(0x39) ;     // function set           : 拡張コマンドの設定を有効にする
    aqmxx02a_cmd(0x14) ;     // Internal OSC frequency : バイアスの選択と内部OSC周波数の調整
    if(volt == 3){
        //コントラスト調整(3.3V)
        aqmxx02a_cmd(0x70) ;     // Contrast set           : コントラスト調整データ(下位4ビット)
        aqmxx02a_cmd(0x56) ;     // Contrast set           : 昇圧回路有効、コントラスト調整データ(上位2ビット)
    }else{
        //コントラスト調整(5V)
        aqmxx02a_cmd(0x7A) ;     // Contrast set           : コントラスト調整データ(下位4ビット)
        aqmxx02a_cmd(0x54) ;     // Contrast set           : 昇圧回路有効、コントラスト調整データ(上位2ビット) 
    }
    aqmxx02a_cmd(0x6C) ;     // Follower control       : フォロア回路をON、増幅率の調整を行う
    delay_ms(200) ;   // 電力が安定するまで待つ
    aqmxx02a_cmd(0x38) ;     // function set           : 拡張コマンドを設定を無効にする
    aqmxx02a_cmd(0x0C) ;     // display control        : 画面表示はON・カーソル表示はOFF・カーソル点滅はOFF
    aqmxx02a_cmd(0x01) ;     // Clear Display : 画面全体に20Hのスペースで表示、カーソルはcol=0,row=0に移動
    delay_us(1100) ;  // LCDが処理(1.08ms)するのを待ちます
}

void aqmxx02a_setcursor(int col, int row){
    int row_offsets[] = { 0x00, 0x40 };

    aqmxx02a_cmd(0x80 | (col + row_offsets[row])) ; // Set DDRAM Adddress : 00H-07H,40H-47H
}

void aqmxx02a_cmd(char c){
    //スタートコンディションを発行する
    i2c_start();
    //LCDのアドレス
    i2c_write(0x7c);
    // control byte の送信(コマンドを指定)
    i2c_write(0b10000000);
    // data byte の送信
    i2c_write(c);
    // ストップコンディションを発行する
    i2c_stop();
    //delay_us(27);
}

void aqmxx02a_puts(char s){
    //スタートコンディションを発行する
    i2c_start();
    //LCDのアドレス
    i2c_write(0x7c);
    //control byte の送信(データを指定)
    i2c_write(0b01000000);
    //data byte の送信
    i2c_write(s);
    //ストップコンディションを発行する
    i2c_stop();
}

キャラクタLCDモジュール(SD1602)によるテキスト表示

小型LCDモジュールを試してみました。今回はバックライトがオレンジ色のSD1602HUOB(-XA-G-G)を使用しましたが、他の色の物も大丈夫と思います。

使用機器

  使用機器は下記のとおり。他、パソコンや電源、PICKIT2も当然ながら必要です。  
     
 
小型キャラクタLCDモジュール Sunlike Display Tech. Corp. SD1602
マイコンボード(PIC16F1947搭載) ZEATEC co.,ltd. ZT-PIC16F194701(5V仕様)

接続

  接続は配線図と写真を参考にして下さい。  
     
     
  プロジェクトファイルも含めたサンプル 16f1947_sd1602huob.zip  
  開発環境:MPLAB_IDE_8_92 + CCS-C PCMコンパイラVer.4.132

グラフィックLCD SG12864ASLB-GB-R01を試す

マイコンでテキスト文字以外のデータを表示したいときももちろんあります。しかしPIC16FマイコンでのグラフィックLCDの取り扱いは少々難がありメモリーを多く必要とします。サンプルのソースでは画面半分のデータを用意し、同じデータをもう半分にも表示させています。よって、実際には画面データを作りながら表示させたり、EEPROMに文字などのキャラクタを登録しておき、読み込みながら表示させるなどの工夫が必要です。

使用機器

  使用機器は下記のとおり。他、パソコンや電源、PICKIT2も当然ながら必要です。  
     
 
バックライト付グラフィック液晶表示器 Sunlike Display Tech. Corp. SG12864A
マイコンボード(PIC16F1947搭載) ZEATEC co.,ltd. ZT-PIC16F194701(5V仕様)
 
     
     
  プロジェクトファイルも含めたサンプル zt-pic16f194701_sg12864a.zip  
  開発環境:MPLAB_IDE_8_92 + CCS-C PCMコンパイラVer.4.132

ちょっと解説・・・

  sg12864a_outの関数にデータと表示CS番号、データかコマンドかの識別番号を用意して実行すると事前に指定した場所に表示されます。場所の指定はページと列と行があり、ページは8までの数字、行や列は0~63までの数字を加算する事で任意の場所を指定することが出来ます。  
 
//表示データ送信
void sg12864a_write(int *display_data){

    int tmp_cs = 1;
    int tmp_x = 0;
    long tmp_y = 0;

    for(tmp_cs=1;tmp_cs<3;tmp_cs++){
        for(tmp_y=0;tmp_y<8;tmp_y++){
            sg12864a_out((0xb8+tmp_y),tmp_cs,0);//Page set plus 0 to 7
            sg12864a_out(0x40,tmp_cs,0);//Start column 0. plus 0 to 63
            sg12864a_out(0xc0,tmp_cs,0);//Start line 0. plus 0 to 63
            for(tmp_x=0;tmp_x<8;tmp_x++){
                sg12864a_out(display_data[(tmp_x*8)+(tmp_y*64)],tmp_cs,1);
                sg12864a_out(display_data[(tmp_x*8)+(tmp_y*64)+1],tmp_cs,1);
                sg12864a_out(display_data[(tmp_x*8)+(tmp_y*64)+2],tmp_cs,1);
                sg12864a_out(display_data[(tmp_x*8)+(tmp_y*64)+3],tmp_cs,1);
                sg12864a_out(display_data[(tmp_x*8)+(tmp_y*64)+4],tmp_cs,1);
                sg12864a_out(display_data[(tmp_x*8)+(tmp_y*64)+5],tmp_cs,1);
                sg12864a_out(display_data[(tmp_x*8)+(tmp_y*64)+6],tmp_cs,1);
                sg12864a_out(display_data[(tmp_x*8)+(tmp_y*64)+7],tmp_cs,1);
            }
        }
    }
}
 
     
 

「sg12864a.c」ファイルの一部 

 
 
//LCDを初期化
void sg12864a_ini(){

    //初期値
    output_bit(PIN_E4,0);// D/I Hで表示データ Lで制御コード
    output_bit(PIN_E5,1);// E 立下りでコードの読み込み
    output_bit(PIN_E6,1);// CS1 Hレベルで左半分を選択
    output_bit(PIN_E7,0);// CS2 Hレベルで右半分を選択
    sg12864a_out(0x3f,1,0);//Display1 on.
    sg12864a_out(0x3f,2,0);//Display2 on.

    delay_us(10);
}

//LCDへデータ・コマンド送信
void sg12864a_out(int data,int chip,int flag){

    if(flag == 0){
        //コマンドの場合
        output_bit(PIN_E4,0);
    }else{
        //データの場合
        output_bit(PIN_E4,1);
    }

    if(chip == 1){
        //CS1を有効
        output_bit(PIN_E6,1);
        output_bit(PIN_E7,0);
    }else{
        //CS2を有効
        output_bit(PIN_E6,0);
        output_bit(PIN_E7,1);
    }

    //データ出力
    output_f(data);

    //H→Lでデータ適用
    output_bit(PIN_E5,1);
    output_bit(PIN_E5,0);
    output_bit(PIN_E5,1);
    delay_us(1);
}

グラフィックLCDモジュール(LM320240CFW)を使ってみる

TOPWAYのLM320240CFWというグラフィックLCDが入手できたので試してみたいと思います。なかなかの解像度があり、バックライトもついていて視認性も悪くないです。

※注意:マイコンボードは3.3Vを使用して下さい。

OLYMPUS DIGITAL CAMERA
OLYMPUS DIGITAL CAMERA

使用機器

使用機器は下記のとおり。他、パソコンや電源、PICKIT2又はPICKIT3も当然ながら必要です。使い方はいたってシンプル。
lm320240cfw.cをmain.cの頭でインクルードし、起動時にlcd_ini()で初期化します。

テキストを表示する場合は、
lm320240cfw_line = 0;で、表示する行位置を指定し、
lm320240cfw_cursor = 0; で、横位置を指定し、
printf(lcd_char,”27| AN0 = %04lumV , RA1 = %u “,analog_value,port1_ra1);で、テキストデータをバッファに展開し、
lcd_buffer_set(lm320240cfw_line);で、バッファデータをポートから出力します。

イメージを表示させる場合は、
lm320240cfw_line = 0;で、表示する行位置を指定し、
lcd_bufferを直接修正するか set_dot関数を使ってイメージデータを作り、
lcd_buffer_set(lm320240cfw_line);で、バッファデータをポートから出力します。

 
LCDのデータシート LM320240CFW.zip
マイコンボード(PIC16F1947搭載) ZEATEC co.,ltd. ZT-PIC16F194701(3.3V仕様)
 
     
  プロジェクトファイルも含めたサンプル zt-16f194701_lm320240cfw.zip  
  接続ハーネスの図面 Harness_LM320240CFW.zip Harness_LM320240CFW LCD.pdf  
  開発環境:MPLAB_IDE_8_92 + CCS-C PCMコンパイラVer.4.132

lm320240cfw.cの中身

/*****************************************************************************************
グラフィックLCDモジュール(TOPWAY LM320240CFW)用ライブラリ 2017/08/04作成

□提供元
ZEATEC co.,ltd. 

□ご利用について
転載・無断使用可です。このライブラリを使用した上での不具合等に関しては、いかなる内容におい
ても一切の責任を追わないものとします。

□使用方法
lcd_ini()をスタートアップに入れ、用途に合わせて出力処理を定期的(0.1sec単位ぐらい)に実行す
る。出力処理についてはすべてのデータを出力するとリフレッシュに時間がかかるため必要な部分の
みの出力としたほうがいい。
フォントのデータはfont_data.cを修正することで記号なども追加できます。
テキストの場合は行番号を指定してからテキストを送信。
lm320240cfw_line = 0;
lm320240cfw_cursor = 0; 
printf(lcd_char,"27|                          AN0 = %04lumV , RA1 = %u  ",analog_value,port1_ra1);
lcd_buffer_set(lm320240cfw_line);
イメージの場合はset_dot()関数を使用するかlcd_bufferを直接更新してください。


□接続方法
RE0 = DB0
RE1 = DB1
RE2 = DB2
RE3 = DB3
RE4 = DB4
RE5 = DB5
RE6 = DB6
RE7 = DB7
RF0 = /WR
    0:Write enable input
RF1 = A0
    1: command write, display data or cursor add read 
    0: status flag read, display data or parameter write    
RF2 = /RES 1:Run 0:ini

上記以外の配線はLCDモジュール上またはハーネスによってVDDおよびVSSと接続する。
BLA = VDD
VSS to VOUT:VR47kohm V0:adjust
*****************************************************************************************/
//ポート設定
#define _WR PIN_F0
//#define _RD PIN_F1
//#define _CS PIN_F2
#define A0 PIN_F1
#define _RES PIN_F2
//#define A0 PIN_F3
//#define _RES PIN_F4

void lcd_ini();
void lcd_cmd(int cmd);
void lcd_data(int dat);
void lcd_write();
void set_dot(long x,int y,int value);

long lm320240cfw_cursor = 0;
int lm320240cfw_line = 0;

int lcd_buffer[] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //40byt
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //80byt
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //120byt
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //160byt
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //200byt
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //240byt
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //280byt
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//320byt

//表示位置を指定して表示する
void lcd_buffer_set(int line){
    int tmp1 = 0;
    int x = 0;
    long y = line * 8;
    int width = 40;
    int high = 8;

    int i,j;
    long addr = 0;
    long tmp2 = 0;

    addr = y * 40;
    for(i=0;i<high;i++){
        lcd_cmd(0x46);
        lcd_data(addr);
        lcd_data(addr>>8);
        lcd_cmd(0x4c);
        lcd_cmd(0x42);
        for(j=0;j<width;j++){
            tmp1 = lcd_buffer[tmp2];
            lcd_data(tmp1);
            tmp2=tmp2+1;
        }
        addr = addr + 0x28;
    }
}

//指定位置にドット描画します。
//x:0~319
//y:0~7
void set_dot(long x,int y,int value){
    long tmp_x = x + (y * 320);
    int tmp_value = value;

    long tmp_bit = 0;
    int tmp1 = 0;
    long tmp_index = 0;

    if(tmp_x >= 8){

        tmp_bit = tmp_x % 8;
        tmp_index = (tmp_x - tmp_bit) / 8;
    }else{
        tmp_bit = tmp_x;
    }
    
    //反転
    if(tmp_bit == 7){      tmp_bit = 0;
    }else if(tmp_bit == 6){ tmp_bit = 1;
    }else if(tmp_bit == 5){ tmp_bit = 2;
    }else if(tmp_bit == 4){ tmp_bit = 3;
    }else if(tmp_bit == 3){ tmp_bit = 4;
    }else if(tmp_bit == 2){ tmp_bit = 5;
    }else if(tmp_bit == 1){ tmp_bit = 6;
    }else if(tmp_bit == 0){ tmp_bit = 7;}

    if(tmp_value == 0){
        bit_clear(lcd_buffer[tmp_index],tmp_bit);
    }else{
        bit_set(lcd_buffer[tmp_index],tmp_bit);
    }
}

//テキストを表示する
void lcd_char(char c){

    int tmp1 = 0;
    
    for(tmp1 = 0;tmp1<5;tmp1++){
        set_dot(lm320240cfw_cursor+tmp1,0,bit_test(font[c-0x20][tmp1],0));  
        set_dot(lm320240cfw_cursor+tmp1,1,bit_test(font[c-0x20][tmp1],1));
        set_dot(lm320240cfw_cursor+tmp1,2,bit_test(font[c-0x20][tmp1],2));
        set_dot(lm320240cfw_cursor+tmp1,3,bit_test(font[c-0x20][tmp1],3));
        set_dot(lm320240cfw_cursor+tmp1,4,bit_test(font[c-0x20][tmp1],4));
        set_dot(lm320240cfw_cursor+tmp1,5,bit_test(font[c-0x20][tmp1],5));
        set_dot(lm320240cfw_cursor+tmp1,6,bit_test(font[c-0x20][tmp1],6));
        set_dot(lm320240cfw_cursor+tmp1,7,bit_test(font[c-0x20][tmp1],7));
    }

    //文字と文字の間に空白を入れる
    set_dot(lm320240cfw_cursor+5,0,0);  
    set_dot(lm320240cfw_cursor+5,1,0);
    set_dot(lm320240cfw_cursor+5,2,0);
    set_dot(lm320240cfw_cursor+5,3,0);
    set_dot(lm320240cfw_cursor+5,4,0);
    set_dot(lm320240cfw_cursor+5,5,0);
    set_dot(lm320240cfw_cursor+5,6,0);
    set_dot(lm320240cfw_cursor+5,7,0);

    //1文字分カーソル位置を残す
    lm320240cfw_cursor = lm320240cfw_cursor + 6;
}

//LCDにコマンド送信
void lcd_cmd(int cmd){
    output_bit(_WR,1); // init all control signal
    //output_bit(_RD,1);//省略
    output_bit(A0,1);// for command
    output_e(cmd);//LCDBUS = Command;
    //output_bit(_CS,0);// enable the access 省略
    output_bit(_WR,0);//_WR = 0;
    output_bit(_WR,1);//_WR = 1;
    //output_bit(_CS,1);// disable the access 省略
}

//LCDにデータ送信
void lcd_data(int dat){
    output_bit(_WR,1);//_WR = 1;                // init all control signal
    //output_bit(_RD,1);//省略
    output_bit(A0,0);//A0  = 0;                // for diaplay data
    output_e(dat);//LCDBUS = DData;
    //output_bit(_CS,0);//enable the access 省略
    output_bit(_WR,0);//_WR = 0;
    output_bit(_WR,1);//_WR = 1;
    //output_bit(_CS,1);// disable the access 省略
}

//LCDを初期化
void lcd_ini(){

    //ポート初期値
    output_bit(_RES,1);//_RES   = 1;
    //output_bit(_CS,0);//_CS     = 1;
    //output_bit(_RD,1);//_RD     = 1;
    output_bit(_WR,1);//_WR     = 1;
    output_bit(A0,1);//A0      = 1;

    output_e(0xff);//LCDBUS  = 0xff;         // pull up data bus
    
    //LCD初期化処理
    output_bit(_RES,1);//_RES    = 1;    // reset pin
    output_bit(_RES,0);//_RES    = 0;
    delay_ms(5);
    output_bit(_RES,1);//_RES    = 1;
    delay_ms(10);

    lcd_cmd(0x40);    //System set (8 byte parameter)
    delay_ms(1);
    lcd_data(0x30);   // IV=1(no line comp),ws=0(single drv),M2=0(8bit char height),M0=0(int CGROM), D4=1(by default)                    
    lcd_data(0x07);   // MOD=1 two frame AC drv, HorChar Size=8
    lcd_data(0x07);   // VerChar Size=8
    lcd_data(0x28);   // (320/8=40) char per line
    lcd_data(0x47);   // 23+blanking (frame freq = 66Hz (clk ratio=1/4  @ 10MHz)
    lcd_data(0xf6);   // (240-1=239) line per screen
    lcd_data(0x28);   // Virtual screen width LSB
    lcd_data(0x00);   // Virtual screen width MSB
    
    lcd_cmd(0x59);    // Display ON/OFF(1 byte parameter)
    lcd_data(0x04);   // SAD1=on, cursor=off
        
    lcd_cmd(0x44);    //Scroll (10 byte parmeter)
    lcd_data(0x00);   // SAD1 start ADD LSB
    lcd_data(0x00);   // SAD1 start ADD MSB
    lcd_data(0xEF);   // SAD1 block size(no.of line-1)
    lcd_data(0x00);   // SAD2 start ADD LSB 
    lcd_data(0x00);   // SAD2 start ADD MSB
    lcd_data(0xEF);   // SAD2 block size(no.of line-1)
    lcd_data(0x00);   // SAD3 start ADD LSB
    lcd_data(0x00);   // SAD3 start ADD MSB
    lcd_data(0x00);   // SAD4 start ADD LSB
    lcd_data(0x00);   // SAD4 start ADD MSB
    
    lcd_cmd(0x5D);    //CSRFORM (2 byte parmeter)
    lcd_data(0x07);   // cursor width = 8
    lcd_data(0x17);   // CM=1, for graphic mode, cursor height = 8        
    
    lcd_cmd(0x4C);    // CSRDIR (0 byte parmeter) to the right side

    lcd_cmd(0x5B);    // OVLAY (1 byte parmeter)
    lcd_data(0x05);   // 0v=0(2layer),DM1=0(blk3 for text),DM0=1(blk1 for graphic),layers combine=01(XOR) 

    lcd_cmd(0x5A);    // HDOT SCR (1 byte parmeter)
    lcd_data(0x00);   // no scroll

    lcd_cmd(0x60);    // GRAYSCALE (1 byte parmeter)
    lcd_data(0x00);   // 1bpp
}

void lcd_clear(){
    int tmp1 = 0;
    int tmp_pat = 0xaa;
    int x = 0;
    long y = 0;// * 8;
    int width = 40;
    int high = 8;

    int i,j;
    long addr = 0;
    long tmp2 = 0;

    for(tmp1 = 0;tmp1<30;tmp1++){
        y = tmp1 * 8;

        addr = y * 40;
        for(i=0;i<high;i++){
            lcd_cmd(0x46);
            lcd_data(addr);
            lcd_data(addr>>8);
            lcd_cmd(0x4c);
            lcd_cmd(0x42);
            for(j=0;j<width;j++){
                //tmp1 = lcd_buffer[tmp2];
                lcd_data(tmp_pat);
                tmp2=tmp2+1;
            }
            addr = addr + 0x28;
        }
    }
}

グラフィックLCDモジュール(LM6059BCW)を使ってみる

TOPWAYのLM6059BCWというグラフィックLCDが入手できたので試してみたいと思います。大きさの割には解像度があり、バックライトもついていて視認性も悪くないです。

※注意:マイコンボードは3.3Vを使用して下さい。

OLYMPUS DIGITAL CAMERA
OLYMPUS DIGITAL CAMERA

使用機器

使用機器は下記のとおり。他、パソコンや電源、PICKIT2又はPICKIT3も当然ながら必要です。使い方はいたってシンプル。lm6059bcw.cを頭でインクルードし、起動時にlcd_ini()で初期化し、lcd_write(lcd_image);で書き込みます。表示内容はlcd_imageの中身を更新するかlcd_start(0);で行を指定してprintf(lcd_char,”abcdefghijklmnopqrstu”);でテキストを表示します。その他詳細はソースをご確認ください。

  使用機器は下記のとおり。他、パソコンや電源、PICKIT2又はPICKIT3も当然ながら必要です。使い方はいたってシンプル。lm6059bcw.cを頭でインクルードし、起動時にlcd_ini()で初期化し、lcd_write(lcd_image);で書き込みます。表示内容はlcd_imageの中身を更新するかlcd_start(0);で行を指定してprintf(lcd_char,”abcdefghijklmnopqrstu”);でテキストを表示します。その他詳細はソースをご確認ください。  
     
 
LCDのデータシート LM6059BCW.zip
マイコンボード(PIC16F1947搭載) ZEATEC co.,ltd. ZT-PIC16F194701(3.3V仕様)
 
     
  プロジェクトファイルも含めたサンプル zt-16f194701_lm6059bcw.zip  
  接続ハーネスの図面 Harness_LM6059BCW-1.zip Harness_LM6059BCW-1.pdf  
  開発環境:MPLAB_IDE_8_92 + CCS-C PCMコンパイラVer.4.132
/*****************************************************************************************
グラフィックLCDモジュール(TOPWAY LM6059BCW)用ライブラリ 2016/10/29作成

□提供元
ZEATEC co.,ltd. 

□ご利用について
転載・無断使用可です。このライブラリを使用した上での不具合等に関しては、いかなる内容におい
ても一切の責任を追わないものとします。

□使用方法
lcd_ini()をスタートアップに入れ、用途に合わせて下記を定期的(0.1sec単位ぐらい)に実行する。
フォントのデータはfont_data.cを修正することで記号なども追加できます。イメージデータの場合は、
image_data.cデータを修正してください。1バイト単位のデータ作成は伊藤 哲雅様作のLCD_Imageが
便利です。

1バイト単位のビットマップデータの場合 lcd_bitmap8();
4バイト単位のビットマップデータの場合 lcd_bitmap32();
テキストの場合は行番号を指定してからテキストを送信。
lcd_start(0);
printf(lcd_char,"///////////////////// ");
lcd_start(1);
printf(lcd_char,"/  ZEATEC co.,ltd.  / ");
lcd_start(2);
printf(lcd_char,"/      ジーテック       / ");
lcd_start(3);
printf(lcd_char,"/                   / ");
lcd_start(4);
printf(lcd_char,"/AN0=%04lumV , RA1=%u / ",analog_value,port1_ra1);
lcd_start(5);
printf(lcd_char,"/TOPWEY LM6059BCW   / ");
lcd_start(6);
printf(lcd_char,"/Dot128x64,Text21x8 / ");
lcd_start(7);
printf(lcd_char,"///////////////////// ");

□接続方法
RE0 = DB0
RE1 = DB1
RE2 = DB2
RE3 = DB3
RE4 = DB4
RE5 = DB5
RE6 = DB6
RE7 = DB7
RF0 = /RES 1:Run 0:ini
RF1 = A0 1:DisplayData 0:ControlData
RF2 = E

上記以外の配線はLCDモジュール上またはハーネスによってVDDおよびVSSと接続する。
/CS1 = Vss
R/W = Vss
BLA = Vdd

*****************************************************************************************/

int const contrast_lavel = 0x18;

//LCDにコマンド送信
void lcd_cmd(int cmd){

    output_bit(PIN_F1,0);// A0 0:Control data.
    output_e(cmd);// DB0-7
    output_bit(PIN_F2,1);// E Enable trigger
    output_bit(PIN_F2,0);// E Enable trigger
}

//LCDにデータ送信
void lcd_data(int cmd){

    output_bit(PIN_F1,1);// A0 0:Control data.
    output_e(cmd);// DB0-7
    output_bit(PIN_F2,1);// E Enable trigger
    output_bit(PIN_F2,0);// E Enable trigger
}

//LCDを初期化
void lcd_ini(){

    //初期値
    output_bit(PIN_F0,!0);// /RES 0:stop.
    output_bit(PIN_F1,1);// A0 1:Display data. 0:Control data.
    output_bit(PIN_F2,0);// E Enable trigger

    //hardware reset LCD module
    output_bit(PIN_F0,1);// /RES SET
    output_bit(PIN_F0,0);// /RES RESET
    delay_ms(1);
    output_bit(PIN_F0,1);// /RES SET
    delay_ms(1);
    
    lcd_cmd(0xaf);//Display ON
    lcd_cmd(0x40);//Set display Start line=0
    lcd_cmd(0xa0);//ADC = 0:Normal 1:Reverse
    lcd_cmd(0xa6);//Normal display
    lcd_cmd(0xa4);//Disible display all point
    lcd_cmd(0xa2);//Bais = 0xa2:1/9 0xa3:1/7
    lcd_cmd(0xc8);//SHL Select 0xc8:Flipped in y direction 0xc0:Normal display

    lcd_cmd(0x2f);//Power control = all on
    lcd_cmd(0x26);//RA/RB setting

    lcd_cmd(0xf8);//Booster Rabit = 4x
    lcd_cmd(0x00);//(tow byte command)

    lcd_cmd(0x81);//E-Vol setting
    lcd_cmd(contrast_lavel);//(tow byte command)
}

void lcd_start(int row){
    lcd_cmd(0xb0+row);//select page 0-3
    lcd_cmd(0x10);//start form colum 4
    lcd_cmd(0x00);//(tow byte command)
}

void lcd_char(char c){
    lcd_data(font[c-0x20][0]);
    lcd_data(font[c-0x20][1]);
    lcd_data(font[c-0x20][2]);
    lcd_data(font[c-0x20][3]);
    lcd_data(font[c-0x20][4]);
    lcd_data(0x00);
}

//表示データ送信
void lcd_bitmap8(){

    int tmp_data;
    long i,j;

    for(i=0;i<8;i++){
        lcd_cmd(0xb0 | i);//select page 0-7
        lcd_cmd(0x10);//start form colum 4
        lcd_cmd(0x00);//(tow byte command)
        for(j=0;j<128;j++){
            tmp_data = lcd_image8[(i*128)+j];
            //tmp_data=lcd_image[0];
            //tmp_data=(*(lcd_image+(i*132)+j));
            lcd_data(tmp_data);
        }
    }
}