トドお父さん通信 -23ページ目

トドお父さん通信

北部九州在住 高BMI中高年のオタク趣味の活動記録

前回、近隣のおもちゃ病院の院長さんに依頼された、クリスマスおもちゃ修理用のSound Player基板 V1を設計して作りました。

[Part2ピエゾアンプ]ATTINY用Sounds Player基板を作って動作確認しました!

 

これを院長さんに渡して、動かしている様子は下記のYoutubeビデオです。

 

この動作確認で色々と不具合も見つかったので、その対応を行います。

 

① おもちゃを叩くとクリスマスの音楽が始まり、同時にモータを駆動しておもちゃが動きます。

  音楽の1曲目が終わったら、基板は待機モード(スリープ)に入って、また叩くと次の曲を

 ラウンドロビンで演奏する仕組みです。 今回は、音楽が終わってモータが止まっても、

 余動でおもちゃがまだ動いているので、ピエゾマイクが振動を拾って、待機せずに次の音楽を

 次々と演奏してしまう、という不具合です。

 

 対策:オリジナルを設計された、つつじが丘おもちゃ病院の大泉さんに相談して、

 main.c 内の、スリープに入る前のSLEEP_TMRを1000mSから4000mSに伸ばしました。


//==============================================
//構成情報(個別アプリケーションだけで使うもの)
//==============================================
#define    SLEEP_TMR    1000 → 4000           //Sleepに入る前の時限[ms]
                        // 操作の評価時間よりも長くすること

② 基板サイズが50x60mmと大きいため、おもちゃに入らない。

 対策:余分な回路とユニバーサル基板部を外して、35x50mmに小型化しました。

 

今回の記事は、この内容について説明します。

 

プロジェクトのフォルダをまるまるコピーして、ペーストした後、別名にリネームします。

実際は、この611版を 0807版に変更します。

 

 

6月11日版 (回路図ミスの修正を全て入れた V1.2)

 

 

 

8月7日版(V1.2のサイズを35x50mmに小型化したV2.0)

 

 

ここまでの変更の方法について説明しますね。

 

まずは、基板サイズの変更です。

レイヤー EDGE CUTを選択して、その下の非アクティブレイヤーを● 非表示にします。

フィルタ選択のロックしたアイテムのチェックも忘れないようにしてください。

これで、基板外形が表示されました。 全部選択して、右クリック → ロック →ロック解除

これで、基板外形が編集できます。

穴を削除、外形線を変更して、50x60mm → 35 → 50mmに変更します。

変更が終わったら、また全選択して、右クリック → ロック → ロックする でロックします。

 

 

忘れないうちに、外形の内側0.5mmにキープアウト領域も入れておきましょう。

右のメニューからKEEPOUTを選んで、基板外形の四隅をクリックしてください。

基板外形の内側に0.5mm幅で破線がでます。ここはパターンや部品の禁止領域です。

 

次は寸法線の編集です。

Youser Drawings で寸法線を表示させます。

 

外形線と同様に前の寸法線のロックを外して、寸法線を編集したらまたロックを掛けます。

 

ここまで来たら、回路図のいらない部品を外して、基板に反映しましょう。

電源ラインに入っていたLDO AMS1117とデジタル音声を再生するためのQ2 J3を削除しました。

ネジ穴4個も回路図から外しますね。 ここで、ツール → 回路から基板を変更 を実行します。

 

 

こんな感じになりました。 ユニバーサル基板部のPADも消しました。

この部品を指定したサイズに入れないといけません。

一旦じゃまなパターンは消して、部品の配置から始めます。

配置はKiCADの3D表示で確認するといいですね。

 

変更前の配置

 

変更後の配置

 

苦労しながら、パターンも再度 引いていって、未配線ネットも全部通りました。

 

裏面にGNDベタパターン処理をしたら、DRC(デザインルールチェッカ)を通します。

表面は、パターン修正のことも考えて、ベタパターンは作りません。

部品のGNDが切れなくなりますからね。

 

気持ちで、表面のGNDパターンと裏面のGNDベタパターンの間に、いくつかVIAを

打って、多少はGND (グランド)のインピーダンスを下げました。

 

エラー2つは、R14とR15が可変抵抗RV1の下にオーバラップしているとのこと

RV1を実装しない時に、R14とR15実装で音量をコントロールするので問題なしです。

 

ウォーニングは前回も同様にでましたが、いくつかの部品のフットプリントがKiCAD

のライブラリと一致しないという警告、これはKiCADの問題の様で無視しましょう。

 

これで、小型化したV2基板ができました。

前回と同様に、ファイル → 製造用出力 → Gerber でガーバーデータとドリルデータを

作ります。 これは、いろいろな情報がありますので、ここでは割愛します。

発注する基板メーカのWebサイトを参照するのが一番ですね。

 

外形データのEdge Cuts と、 寸法データのUser. Drawings も忘れず追加してくださいね。

寸法データは、自分でGerber Viewerで確認する時に、便利です。

 

これがGerber Viewerの画面です。KiCADホーム画面のガーバービュワーを起動します。

各レイヤーをレイヤーマネージャで確認できます。 起動したら、

ファイル → ガーバープロットファイルを開く で作成したデータを全て選択して 開く です。

 

 

ドリルデータ(穴データ)は、NPTH(ノンスルーホール)とPHT(スルーホール)の2種類の

データがありますので、両方確認します。

前のV1の時は取付けネジ穴 2.7φがあったのですが、今回はなしにしたのでNPTHはないです

 

これで、Gerberデータの確認もできましたので、Zipファイルに圧縮して

基板メーカに発注できますね。

 

今回も、安価でかつ短納期で基板を作れるJLCPCBさんで手配しました。

事前に先方のGerber Viewerでデータを確認できるので便利ですね。

今回は、前の基板と弁別するために、黒レジストにしてみました。

 

表面データです。

 

裏面データです。

 

手配して基板作成に3日、送付に4日~7日、合計1週間~10日で手元に届きます。

100x100mm以下なら、5枚で500円程度ですので、いい世の中になったモンですね。

 

それでは、次回をお楽しみに!

 

 

関連記事 

ATTINY202/402のFUSEビットをAVRDUDESSを使って書く方法
おもちゃ修理用のSOUND PLAYER基板の小型版 V2を設計しました!
[Part2ピエゾアンプ]ATTINY用Sounds Player基板を作って動作確認しました!
[Part1] ATTINY用Sounds Player基板を作って動作確認しました!
[Part2 テスト終了です] ATTINY402で音声再生のテストをしました
[Part1] ATTINY402で音声再生のテストをしました
ATTINY402に電子オルゴールのHVPプログラム書き込みテストをしました
[Part2 完成しました!]HVP対応のUPDI プログラマーを作成中です
[Part1] HVP対応のUPDI プログラマーを作成中です
[Part4 IRリモコン完成!] ATTINY202への書き込みとプログラムをやっています!
[Part3] ATTINY202への書き込みとプログラムをやっています!
[Part2] ATTINY202への書き込みとプログラムをやっています!
[Part1] ATTINY202への書き込みとプログラムをやっています!
ATTINY85 CPUを使って小型の赤外リモコンを作りました!

 

 

みなさんこんにちは。トドお父さんです。

今回は、I2C Scanner 3回目 画面データの編集です。

ラジオペンチさんのブログ記事にECXELでフォント形状と7bitアドレスモードでSSD1306の基本画面

を編集する方法が書かれていましたので、この内容をトレースしたいと思います。

 

ラジオペンチさんによると、

>oled.cpp の中の frame[] という配列に画面全体のイメージが定義されていて、スキャナーの

>プログラムは、このイメージを出力しながら、I2Cアドレスがヒットしたセルを塗り潰す、

>という処理をやっているようです。

 

>oled.cpp 内変数(定数)の frame[] でイメージが定義されていました。上の図はエクセルに読ませて
>文字列の操作で作っています。
>ただ、そのエクセルのファイルはセキュリティが心配なのでここにアップしません(MSが何をするか
>判らないので信用していません)
 
>データーフォーマットとしては、縦8画素をデータの1バイトで表現していてMSBが画面の下側。画面
>の左上から右方向に順に埋めて行って、128バイトで次の行。縦64画素なので8行分のデーターで
>1画面。つまり、128*8=1024 バイトのデータになっています。
ということでした。
ラジオペンチさんに直接アドバイスもいただきながら、EXCELのVBAを使って、frame[]配列の
HEXデータをCSVで取り込んで、”*” と ”  ”で画像イメージに変換するHex2image マクロ、
”*” の位置を編集して、HEXデータに逆変換するimg2HEX変換マクロを作ってみました。
 
もともとのframe[]配列で画像イメージを作るマクロが入ったEXCELファイルはここに
3、8、B、E、S のフォント を変更し、7bitアドレスの画像イメージに変更されたEXCELは
ここに置いています。
 

使い方:① SSD1306_test_old.xlsm を開いてCSVデータ(カンマ区切り)をコピペします

(元のCSVデータはコピペずみ。別のCSVデータを貼り付けるときは、右クリック ”値”コピーで元の書式を保持してください)
② EXCELマクロを有効にして、表示 → マクロ → マクロの表示でマクロがでます。
③ Hex2image変換を実行します。 Bitファイルに変換後、* で表示イメージが出ます。
④ * 表示イメージ を消したり追加で編集します。(3、8、B、E、Sフォントを編集)
⑤  編集後、img2HEX変換マクロを実行します。下に編集後のCSVデータがでますので、
  全部選択してコピー → プログラムのframe[]部 に貼り付けて終わりです)
  (各列x128行の最後はカンマなしにしましたので、最終列以外はカンマ追加します)

 

これで、文字の画像イメージの修正が自由にできるようになりました! 

VBAはこの年になって、生まれて初めて使いましたので、レベルはご想像くださいw

 

ラジオペンチさんも言われているように、マイクロソフトは信用できませんので、再配布等は

ご容赦くださいね。(私のVBAも信用できませんし (爆;))

 

 

次に、いちばん下に生成されたHEXファイルを選択してコピーします。

 

 

これを、ATMEL STUDIOのframe[]配列に貼り付けます。(前の配列はコメントアウトしておいてくださいね)

8列x128行の配列の最終列を除いて、一番後ろに”,” を付けます。

(本来はマクロ内でdelimiterの条件式を修正すればいいかと…汗)

 

 

これで画像イメージの変更は終了です。

リビルドして、書き込んで表示を見てみましょう。

おっ、編集したとおりの画面に変更されていますね。

 

ただし、7bit I2Cアドレスを表示するようにプログラムも変更しないといけませんね。

この内容も、ラジオペンチさんのブログコメントに siliconvalley4066 さんが投稿してくれています。

 

>I2Cアドレスの下4bitを水平方向に、残り上3bitを垂直方向に配置すればよいので、72行目を
> a = ((nx - 17) / 7) + (y << 4);
>として、
> adr[a - 1]
>となっている5か所を
> adr[a - 16]
>にすれば一応OKです。

→ siliconvalley4066 さん、ありがとうございます。暑くて脳が停止しているので、そのままパクらせていただきますw。

できました、デバッグ用のアドレスもきちんと表示しているようです。

これで、ミッション・コンプリート、ファイナルアンサーです。

 

 

ここまでのATTINY85 I2Cスキャナのプロジェクトは ここに置かせていただきますね。

ダウンロードできない、内容にまずい点等がありましたら、コメントでご教示いただけますと幸いです。

 

これで安価なOLED SSD1306ディスプレイに、自由にイメージを描画できるのは楽しいですね。

みなさん、いろんな情報とネタをありがとうございました。

 

つぎは、ATTINY402への移植にチャレンジしてみましょうかね。

New ATTINYは、ポートアクセスがSTM32みたいな構造体になっているので、移植は大変そうですが。

それとおもちゃ病院の宿題も残っているので、これもやらんばいけませんね(大汗;)

 

それでは、みなさん次の記事をお楽しみにお待ちくださいね。


関連記事

毎日 暑い日が続きます。

コロナもだいぶ治りかけているので、電子工作の宿題と並行しておもちゃ病院の宿題を片付けたいと

思っています。

ただし半田付けをしている工房が和室なので、暑い 😨 

その点、涼しいリビングでノートPCだけで作業ができる、電子工作のプログラミングが素敵ですね。

 

閑話休題:前回はNickelbrassさんのI2C Scannerを元ネタにして、ATMEL StudioでターゲットCPUを

ATTINY44(14ピン)からATTINY85(8ピン)にプログラム編集して、動作させるところまででした。

ステップ1. が完了したので、ステップ2. に移行します。

 

2. SSD1306の1番上の行が消えて、一番下の行がゴミデータを表示する件の対策

 ラジオペンチさんのブログのコメント欄に、① Adafruitの実績あるSSD1306ドライバを参照して書き直す

 案が書かれていたので、SSD1306のデータシートも参照しながら、初期化ルーチンを書き直すことにしました。


void init_oled(void)
{
	// 24/08/11 OLED Display collapse amendment 
		oled_com(0xAE);//display off
	//	oled_com(0x2E);//  stop scroll
		oled_com(0xD5);//display clock
		oled_com(0x80); // clock speed (Range:0000b~1111b) RESET is 1000b(0x80)suggested ?
		oled_com(0xA8);//mux ratio
		oled_com(0x3f); // RESET= 111111b (i.e. 63d, 64MUX) //‘ƒ‰ƒCƒ“” 64s
		oled_com(0xD3);//offset
		oled_com(0x00); // 0  //Set Display Offset 0x00
	    oled_com(0x40);//Set Start line to 40h
		oled_com(0x8D); // Charge Pump Setting
		oled_com(0x14); // Enable Charge Pump (before Display on )
		oled_com(0x20);//addressing mode
		oled_com(0x00); // A[1:0] = 00b, Horizontal Addressing Mode
		oled_com(0xA1);//SegRemap = 40h + 1h
		oled_com(0xC8);//COMSCANDEC = C8h
		// if defined SSD1306_128_64
		oled_com(0xDA);//SETCOMPINS = DAh
		oled_com(0x12);// 12h
		oled_com(0x81);//SETCONTRAST = 81h
		oled_com(0x9F);//
		oled_com(0xD9);//pre charge
		oled_com(0x22); // default is 22h
		// logic threshold 
		oled_com(0xDB);//v deselect level
		oled_com(0x40);  // ~ 0.83 x VCC
		//
		oled_com(0xA4); // Resume to RAM content display(Off default)//Disable Entire Display On A4/A5
		oled_com(0xA6);//A7 inverse, A6 normal(default) //”’•”½“] A6/A7
		oled_com(0x2E);//DEACTIVATE_SCROLL
		
			oled_com(0x20);//addressing mode
			oled_com(0x00); // A[1:0] = 00b, Horizontal Addressing Mode
			oled_com(0x21); //set column address
			oled_com(0x00); //= 0d
			oled_com(127);  // Column end address, range( default=127d)
			oled_com(0x22);  //set Page address
			oled_com(0);  //start address = 0d
			oled_com(7);  //end address = 0d
		
		oled_com(0xAF);//display on
		oled_cls();  // clear screen
}

 残念ながら、表示の崩れはかわりませんでした。

 ラジオペンチさんのコメント欄を良く見てみると、最初にこの問題を提起された「それ、やってみよう!」さんの

 「I2C スキャナ」の表示不良を直す にソルーションが書かれていました。

なんと、下記の7行目 oled_com(0); をoled_com(1);に書き替えるだけでした。

コマンド22hは、Set Page Adress で、次にスタートアドレスとエンドアドレスを書くのが仕様なので、

なんとも奇妙な修正になりますが、結果オーライということで良しとしましょう。

void oled_xy(uint8_t x, uint8_t y)
{
	oled_com(0x21);
	oled_com(x);
	oled_com(127);
	oled_com(0x22);
	//oled_com(0);
  oled_com(1);
	oled_com(7);
	oled_com(0xB0|y);
}

 修正前の画像

 

修正後の画像

これで、表示の崩れが直りました。

 

【追記】どうも、このソルーションは納得いかないので、記事を書いた後に深堀りしてみました。

 

 oled_cls() と oled_xy() になにかいそうな気がします。

 なんども、column とPageのスタートアドレスとエンドアドレスを設定して

 います。これはoled_init() で設定しているので、不要ではないでしょうか?

 まず、oled_xy() を呼ぶところをコメントアウトしてみました。

 

Page0の表示が一番下に来ましたが、全データ表示するようになりました。

 

次にあやしい oled_cls() のcolumn とPageのスタートアドレスとエンドアドレスの

設定をコメントアウトしてみました。

 

おっ、今度はきちんと表示するようになりました。

これで、表示崩れの件はミッション・コンプリートでしょうか?

 

たぶん、元の作者がいろいろと表示の不具合が出たときに現場調整したのかもしれませんね。

とりあえず、納得できない不思議な現象が解決できてよかったです。

 

次は、3. ■塗りつぶしの修正と文字フォントの修正です。

試しに、I2C検出ターゲット側のSSD1306の電源を外してみます。

SSCLとSSDAのプルアップが無くなりますので、全アドレスでACKが帰ったことになります。

酷い■表示になりますね。

 

ここは、 ラジオペンチさんのブログ記事のsiliconvalley4066 さん のコメント通り、

main.cpp 処理で、■データの fill書き込みを OR処理に修正しました。

 

 

これで、きれいな■表示になりました。さすがですね、ラジオペンチさんとsiliconvalley4066 さん

 

 

デバッグのために、描画前にadr[128]配列のところどころにtrueを入れて表示の

デバッグをしました。

 

        for(uint16_t y = 0; y < 8; y++)
        {
            adr[0]=adr[1]=adr[2]=adr[3]=adr[4]=true;  //For debug powpher
            adr[10]=adr[11]=adr[12]=adr[13]=adr[14]=true;  //For debug powpher
            nx = 17;

 

意図通りのアドレスを表示していますね。OKです。

これで、今回のPart2は終わりです。

 

次回Part3はEXCELを使った表示データの編集と編集後のHEXファイルの生成にチャレンジしますね。

 

それではおやすみなさい。


関連記事