CH32V003 OLED SSD1306 ライブラリ

またまたCH32V003ネタです。

I2CインターフェースのOLEDのディスプレイをArduino UNO R3用のDFPlayer miniシールドに以前実装した過去の経験があったのですが、今回は、CH32V003で使用するためライブラリの解析をしたので共有します。

恐らくCH32V003でOLED SSD1306を使い方で、私と同じくライブラリを探している方には朗報です。

Arduinoで使用する場合は、ネットで検索するとすぐいろいろヒットします。

前述のArduino UNO R3用のシールでは、Adafuruitのライブラリを使っています。

まぁ、販売用なのでIDEからインストールできるライブラリである必要もあったので、公開されているライブラリで実装しました。

さて、今回はCH32V003ですが、やはり開発環境が整いつつあるとはいえ、Arduino IDEでは、ポン付けでは使えません。

ネットでいろいろなライブラリを使ってみたという記事を拝見します。例えばこちら

そのまま使えるかどうかという点までしか記事になっていないのですが、紹介されているライブラリであってもArduino IDE環境では使えなったりします。

今回は、ACROBOTIC_SSD1306ライブラリを解析しCH32V003でも使えるようにしたので、紹介します。

ACROBOTIC_SSD1306は、Arduino IDEのライブラリのインストーラーから検索しインストールできます。前述の記事では、1.0.0では動いたが、1.0.1では動かないと紹介されている。

自分もそうでした。

うんともすんともです。

調べてみると、3か所の修正でArduino IDEを使用したCH32V003でも無事動きました。

ACROBOTIC_SSD1306.cpp

putCharというアスキーコードをsendDataする関数ですが、boolで宣言されています。

フォントが格納されているm_font配列が存在しない場合は、0を返すようにエラー処理がされていますが、bool宣言されてしまっています。本関数の戻り値は、このreturn 0;のみなのですが、bool宣言されているので、正常に動きません。Arduino IDE 1.8.10でなコンパイルではエラーにはならず、ワーニングにもなりません。※ここが開発途中なのでしょうね。

じゃぁ、int宣言にしてもみたのですが、これの何故か正常に動きません。もちろんですが、コンパイルは通ります。※ここの開発途中なのでしょうね。

このフォント配列のエラー処理の戻り値も実際は使用もされていないので、void関数にしてしまいます。

著者の方も検証も完全に行って公開しているようではなさそうです。

突っ込みどころが他にも多いのですが、ACROBOTIC_SSD1306.cppは、この2点の修正で動きます。

ACROBOTIC_SSD1306.h

関数を変更したので、ヘッダーファイルも修正します。

これにて、サンプルプログラムも動くようになります。

解析ついでに改善点も多く見つけたのでいっそのこと新規にライブラリを作成してしまえという感じでもあったのですが、暇なときにでもやってみようと思います。

本ライブラリは、8×8のフォントも実装しており、Flashに配列で格納するため、Flashがかなりひっ迫します。

開発するファームで必要な最小限のフォントのみに限定すればFlashのひっ迫は改善できると思います。

余談ですが、OLEDは、0.96インチなので、8×8のフォントでも小っちゃくてたいへんです。

ドット表示の具合は拡大鏡が必要だったりします。^^;

独自のフォントの描画もできますが、ビットマップ画像の描画も128 x 64以内で可能です。

が!

Flashが、16kBしかないので、そのまま128 x 64フルでのマップデータは描画はFlashがオーバーフローします。

マップデータの形式を工夫すれば、Flashの節約できそうです。

縦が、8Line * 8bit = 64bitで、横が8bit * 16桁 = 128 bitです。

フルで描画するには、8192bit = 1024byteととなりますが、Flashの容量的には、850byteほどでコンパイルエラーとなります。

因みに、Flashがオーバーフローすると、オーバフローのエラーではなく、以下のようになります。当初は、原因は分からずに困っていました。

因みに、当医院のロゴでもここまでしか描画できませんでした。

最近のプログラミングの意味するところ

コンピュータ用のプログラムは、ChatGPTに書いてもらう昨今、今回は、最近ふと感じたことについての記事となります。

ご覧の皆さんは、『プログラミング = Programing』という言葉を聞いて何を想像されますか?

もしかして、プログラミング言語と呼ばれる人工言語でコンピュータ用のプログラムを記述することと思われているかもしれません。

たぶんですが、プログラミング = コーディングなら、間違いではないんでしょうけど、それってプログラミングの極一部の領域のことではないでしょうかね。

まぁ、いろいろ定義や歴史を知っている知らないと自己中な判断で、どぉーでもいいことを言う人も多く、このようなネタは炎上しがちですが、最近知育系の玩具で見た衝撃的光景を紹介します。

知育パッドのメニューに『プログラミング』という項目がありました。

おおお!どんなことできるの?

とワクワクしながら選択してみると、パズルのような迷路にキャラクターが居て、スタート地点からゴールまでの順路を正確に進めるように、↑↓→←の進む、右回り、左回りetc…を指示して、キャラクターがその指示通りに進んでゴールまでたどり着けるかという内容だった。

( ̄▽ ̄;ガーン

そうですか、、。これをプログラミングと称し知育パッドに入れているんですね。

何かとても複雑な気持ちになりました。

そーいえば、ムカデのような生き物形態のおもちゃで同じようなものがありましたね。

昔、よくやったファミコンのパズルゲームか迷路に小さな金属球を転がしスタートからゴールまで転がす様まんまです。

そういえば、コロナ前に地元自治体で夏休みプログラミング教室というの広報で見かけました。

ドローンをプログラムしてスタート地点から飛び上がりゴール地点まで着地できるかという内容でした。マウスで何かピコピコやっていそうです。

フローベースのGUIのようでした。

特に児童期にプログラミングを教える場合は、大変重要な点に、難しいことを難しく教えて嫌いになることがないようにすべきでしょうかね。

皆さんもご経験があるかもしれません。

そこら辺のプログラミング教室に大金支払って通い出し、数日で辞めてしまった苦い経験だったりしますよね。こんな記事もあります。

さて、知育パッドのパズルゲームは楽しいのですが、これはパズルゲームと呼ぶことにしましょう。

児童期のプログラミングを教えるのなら、もう少しなんぞやという内容も含めないと、『マウスでテキトーに動かす』というようなイメージに終始しそうです。まぁ、楽しいのでOK牧場です。

パソコンの画面でいろいろピコピコやって、実機で動かしてみたりすると、楽しいのですが、心配な点も多いです。

  • 手で動かすプログラミング以前に設計は、ちゃんとできていますか?
  • 何をするのか?もしくはしたいのか?
  • どのような手段でするのか?
  • どのような制約はあるのか?
  • どうやって動作確認するのですか?
  • どう動くことを確認できたら問題なしとしていいのですか?

でないと、え!パソコンで何か打ち込むのがプログラミングなんでしょ?というおかしなことになります。

設計段階の仕様書を準備しろってことです。

仕様書を基にコードを吐いてもいいです。等価検証が完全であればですが、、、。

この仕様策定という段階をすっとばし言語やGUIでモニターをみながら操作するようなことになっちゃうと、トライ&エラーの繰り返しで、プログラミングの重要な考える思考作業がおろそかになります。

エンジニアに仕様書を書かせるのが管理のお仕事になっていて、外資系会社新卒の時に本社アメリカのお偉いさんのコメントで、エンジニアに仕様書を書かせるぐらい大変なことはないって言っていました。仕様書を書かずにいきなりコーディングを始めちゃう新人さんが居て困るというのです。分かります。。。

お仕事の8割は、仕様策定で、ここで致命的な問題などを振るい落とします。

プログラミングは、仕様書に沿ってコーディングするのだから、得意な人にやってもらえればいいのです。

容量式 タッチスクリーンの交換部品について

1.5才からタッチでカンタン!アンパンマン知育パッドで実装されているタッチスクリーンが割れたしまったという修理相談があります。

この割れた部品名ですが、調べてみるとタッチスクリーンというのが多いです。

一方、タッチパネルという使われ方もあります。

厳密な言い分けのルールはなさそうなので、ここは勝手に以下のように呼び分けをします。

タッチパネル・・・抵抗式

タッチスクリーン・・・容量式

従いまして、本記事は容量式なので、タッチスクリーンと呼ぶことにします。

何か物をぶつけたか、落としたかで画像のように割れます。

容量式のタッチスクリーンが液晶の上面に張り付いており一体化しています。

液晶の描画に問題なければ、当医院の4.3インチタッチパネルの修理のように上層のタッチパネルのみを剥がし交換できます。

この容量式のタッチスクリーンも同じ手法で修理できないか考察した記事になります。

結論から申し上げますと同じドライバーIC品でないと無理です。

仕様確認

まず、商品に実装されているタッチスクリーンの仕様を確認します。

液晶モジュールについているFPCケーブルが3か所あります。

左側から、バックライト、液晶、タッチスクリーンのケーブルになります。

タッチスクリーンのケーブルは、ドライバーICがケーブル上に実装されております。

ドライバーICは、FT5436というFocalTech Sustem社のICです。

10ピンのFPCケーブルが基板のコネクタに接続されています。

基板側を確認します。

10ピン用のコネクタで接続されます。

さてさて、ここでこのタッチスクリーンは、一般的な市場で入手できる代物なのかざっくりみます。

市販品

秋葉系のジャンク屋さんやAliexpressなども物色してみると、5インチ用のタッチスクリーンは見つかります。

ですが、ドライバーICがGT911というGoodix社のICです。

ネットで見つかるタッチスクリーンは、6ピン FPCケーブルの商品です。

おやおや、┐( ̄へ ̄)┌

既にここでポン付けできるような代物でないことが判明しました。

FPCケーブルの接続面も裏表逆です。

もう既に半分あきらめモードです。

次いでなので、このタッチスクリーンなる仕組みを仕様書で確認します。

インターフェース

既に市販商品を検索した際に見つけたのですが、6ピンの内訳は、以下のように共通のようです。

  1. Reset
  2. Vcc
  3. GND
  4. INT
  5. SDA
  6. SCL

I2Cインターフェースで取得した座標をホスト側に割り込みで通信しています。

I2Cならば無理ですね。だってスレーブのアドレスが違うもん。

GT911の仕様書を確認すると。


GT911 的I2C 从设备地址有两组,分别为0xBA/0xBB 和0x28/0x29。主控在上电初始
化时控制Reset 和INT 口状态进行设定,设定方法及时序图如下:

GT911 の I2C スレーブ アドレスは 0xBA/0xBB と 0x28/0x29 の 2 セットあります。メインコントロールは最初は電源が入っています 変更時に設定するリセットおよびINTポートの状態を制御します。設定方法とシーケンス図は以下のとおりです。

~GT911仕様書より~

であればと、FT5436の仕様書で確認しましたが、スレーブアドレスの記載がないので、恐らく組み込みの場合は、I2Cアドレスのスキャナなどで読み出しするしかないでしょう。

さて、FT5436のタッチスクリーンは、ラズパイで利用している方も多く、そのような記事を拝見すると、


I see on my I2C bus that the chip do respond at 0x38 address, so at least that part looks ok.

手持ちのFT5436のI2Cバス上の通信を確認するとスレーブアドレスが0x38で応答していたのが分かった。恐らく少なくともこれで大丈夫でしょう。

~FT5436 touchscreen interrupt記事より~

とありますの、ドライバーICの違いから互換性なしですね。

またFT5436の仕様書からもINT信号のポラリティが逆だったりしますね。レジスタ関係の仕様も異なりそうです。

ここまで調べたらアンパンマン知育パッドの10ピンが気になります。もう少し調べます。

アンパンマンの知育パッドのICとFPC端子の結線を調べると、10ピンのうち9ピンしか使われておらず、そのうち2ピンがGNDになっています。

なるほど、基本6ピンのインターフェースで共通なのですね。

さらに突っ込んだ仕様面での違いや実際の投資コストなども考えると投資に見合う修理になりそうもないという見解に至りました。

メーカー様でも修理の受け付けはしていないとお聞きしておりますが、液晶のタッチスクリーンが割れた場合は、もう修理は難しいという結論になります。

【備忘録】CH32V003J4M6 PA2 AD変換できない対処について

備忘録的な記事になります。

CH32V003の8ピンパッケージのJ4M6品をいろいろなところで使っています。

ピン数に限りがあるのでいろいろ苦労する部分は多いのですが、最近3番ピンのPA2/OSCO/A0…ピンで起きた問題に対処しましたので、情報共有的に備忘録に残しておきます。

事の次第は、ADCの0chであるA0でAD変換をしたかったのですが、0chで変換できないという事態でした。他の汎用ピンと共用もされているA7/A5/A2などは、無事変換確認できたのですが、A0が何故か変換できません。

というか、Analog input設定しているにもかかわらず、パルス波形が該当ピンから出力されます。もちろんですが、以下の設定は繰り返し確認しています。

  • GPIO設定
  • GPIOクロック設定
  • PLL設定
  • ADCチャンネル設定

同じ設定でもA0で変換できません。

ADC関係の記事ではありませんが、同じような不具合に遭遇した記事をインターネットで見つけました。※助かりました。

当該記事は、汎用IOとして使えないという記事でしたが、同じような問題そうだったので読んでみると、原因は同じでした。

リンクの記事は、内部発振モードで使用しているにも外部発振の設定がなされてしまいPA1/PA2が汎用ピンとして使えないということです。

強制的に外部発振の設定にされているという事態でした。

問題設定は、AFIO_PCFR1レジスタにあります。

各ペリフェラルモジュールのピンと汎用ピンの共用ピンの機能の切替設定になっています。

15ビット目にPA12_RMの設定ビットがあります。

デフォルト設定では、汎用IOと共有機能側の0になっています。

因みに、1は、外部発振モード用のピンなので、OSCO設定になります。

確認のため、PA12_RMを読みだしてみると、見事に1になっています。

内部発振しか設定しているにもかかわらず、なぜこの設定が1になっているかです。

設定していないのになぜか1になっています。

前述の記事を参照すると、system_ch32v00x.c内での設定に問題があるそうです。

前述のリンク記事と同じ内容になってしまうのですが、、、。

詳しくは、前述のリンク記事にありますが、system_ch32v00x.c内では外部クロックモード設定になっていますが、外部発振回路を実装していないので、発振ロックせず処理がタイムアウトし外部クロックの設定が残ったまま設定が進行してしまうという顛末でした。

おやおや(´・_・`)

自分は、Arduino IDE環境で開発をしており、前述の記事は問題にならないと記述されておりますが、ツールはArduino IDEを使用はしておりますが、コードは非Arduinoで実装していますのでこの問題が生じました。WCHのMounRiver Studioの自動生成された初期化コードと同じ問題が生じると思います。

“#define SYSCLK_FREQ_48MHZ_HSI 48000000”を有効にしてあげれば解決できます。

季節の俳句


五月雨の晴れ間に出でて眺むれば青田涼しく風渡るなり

~良寛~

梅雨時期に思い出す、好きな俳句があります。

良寛の詠んだ梅雨時期の俳句です。

旧暦の五月なので、ちょうど梅雨時期の俳句ですね。

横浜に住んでいたころですが、この梅雨時期がとても嫌で嫌で、まったくうっとうしい毎日でした。

自分は、湿気が大の苦手なので、関東圏の梅雨時期は、除湿機をフル回転で乗り切っていました。

この梅雨時期の晴れの合間に、外に出てみたのでしょう。ちょうど田植えの終えた青田に清々しい少し冷たい風がそよいでいるという光景が広がりますね。

青森の梅雨は、関東圏の梅雨に比べれば梅雨では全くない快適な毎日です。

そもそも移動が車なので、電車やバス移動のための移動がないため、直接雨に打たれるということがないのもありますね。

湿度が80%を超えるような毎日に冷房がガンガン効いている電車に乗ると、窓が結露で曇ってしまい、電車が満員だったりすると最悪です。

メールフォーム更新

長年の懸念でして、メールフォームのTLS/SSL化のため、メールフォームにformzuを適用しました。

ご存じの通り、当医院のサーバーでは、TLS/SSL対応できておりません。

まぁ、いろいろあるんですよね。

常時SSL化は、やはりさらなる投資が必要で、無料プランもあるにはあるんですが、契約をしなおしたり、サーバーのデータの引っ越しなど、いわゆる面倒な作業が多いのです。

そのため、ホームページ内のメールフォームなどの送信データが暗号化されていなかったので通信データのスニッフィングの脅威がありました。

お問い合わせフォームをformzu様に委託することで、送信データが暗号化されます。今後は安心してメールをフォームをご利用いただけます。

デコ活

おデコを活用しようという運動ではありません。

当医院では、環境省が推進しております、デコ活に賛同しております。

ヤマト運輸の配送時の再配達の軽減など、皆さまにはご協力を強くお願いをしております。


※「デコ活」とは
 「脱炭素につながる新しい豊かな暮らしを創る国民運動」の愛称であり、二酸化炭素(CO₂)を減らす(DE)脱炭素(Decarbonization)と、環境に良いエコ(Eco)を含む”デコ”と活動・生活を組み合わせた新しい言葉です。

~環境省ホームページより~

当医院の利用ルールでは、返送時は、送料着払いでのみとさせていただいております。

ヤマト運輸では、クロネコメンバーズ限定にて置き配の指定ができるようになりましたので、送料元払いでの対応も利用者限定で承っております。

置き配が指定できるようになりましたので、デコ活の推進する再配達の抑制に寄与できるようになりました。

返送案内時に、置き配を利用するため送料元払いでとその旨の希望をお知らせください。送料を含めて見積もりをお出しします。

一旦、送料着払いで返送してしまうと、置き配の指定はできなくなりますので、くれぐれも申告忘れなきようご注意ください。

32.768kHz クリスタル

発振回路についての記事になります。

たまごっちなどおもちゃの制御ICの外付け発振回路に付いている32.768kHzのクリスタルをご存じかとは思います。

マイコンなどの製品開発の経験などあれば、基礎知識として発振回路やIC内部のPLL回路などでこれらクリスタルの役目や回路仕様も把握していなければなりません。

もちろんですが、おもちゃ修理に関しても必須事項です。

車載マイコンの設計や開発をしていました頃は、品質や信頼性などたいへん厳しい要件があり検証や評価をしていたころをよく思いだします。

外付けの発振回路は、それぞれの回路の応じた品質や信頼性の検証や評価の基で設計されます。

電源、温度、部品のバラつき、基板の誘電率などなど。

さて、話を32.768kHzのクリスタルに戻します。

当医院の記事でもよく登場しますが、時計など時を刻む場合、よく目にするシリンダー型の32.768kHzのクリスタルを目にします。

で、なぜ時を刻むのに32.768kHzのクリスタルなのか?

と思ったことありませんか?

マイコン設計やデジタル回路の設計経験があれば、既にご存じかと思いますが、それは、インプリが容易だからです。

実現しようとすれば、他のクリスタルでも時を刻むことはできますが、32.768kHzですと容易になります。

皆さん、分かりますか?

理工系の学生さんであれば宿題にすべきところですが、答えはカウンターなどで容易に実現できるからです。

32.768kHzって何Hzですか?

32.768kHz = 32768Hz

1秒に32768回振動します。

これって、いいかえると、32768回の振動で1秒とも言えます。

発振子が、計測開始から32768回振動した時が1秒であると言えることになります。

この32768回というのがみそです。

他の周波数であれば、それぞれの回数カウントすればいいのですが、この32768回は、1秒を2の15乗の分周比で実現できます。※電卓で2を押し、×を2度押して、=を繰り返し押してみてください。14回目で32768になるでしょ?

ん?分周ってなに?という方は工学系の教養の書籍などで調べてみてください。

デジタル回路のお話になってしまうのですが、2の4乗、すなわち16bitのカウンターなど多用します。Verilogなんかでは簡単に記述でき、合成でも問題なく論理合成もできます。

もう、今現在はそんなことはしていなさそうですが、私が現役のころは、VerilogでHDLを記述しDesign Compilerで合成など懐かしい言葉となります。

巷では、AIで論理合成/配置配線が一括でGDSまで吐いてくれるそうです。時代も進んでおりますね、、、。

EDAベンダーさんには、エンジニア時代の諸先輩方が多くおられたのですが、皆さんお元気でしょうか?

さて、話をカウンターに戻すと16bitのカウンターであれば、

10進の32768という値は、2進では、1000_0000_0000_0000と表現でき、つまり2の15乗であります。

刻々をカウンターをクリスタルの発振の立ち上げか立下りのエッジでインクリメントした場合、ちょうど15bit目のインクリメントで1秒を刻めます。

例えば、FF(フリフロ)で実現されたカウンターのCKinに印加したイメージです。

参考

モーターブラシの修理

プラレールなんかで多用されている、130型のモーターについてです。

そう、こういったやつです。

いろんなおもちゃの各所で使われており、稼働不良の原因も様々ですね。

そのような故障の中にグリス劣化や焼損や焦げの導通不良も多いかと思います。

ドクターの皆さまにおかれましては、いろいろが修理の方策を模索されておられるかと思いますが、そのような中の手段の一つに破損したブラシを修理するという方針について当医院での経験をご紹介します。

インターネットでブラシ修理を検索とすると以下のような記事があろうかと思います。

  • 接点復活剤を吹いてコキコキして復活するか診る。
  • 規定よりも高い電圧をかけてみる。
  • モーターを市販の同型モーターに交換する。
  • 破損したブラシのみを手持ちのブラシと交換する。
  • 破損したブラシをリン青銅板で自作し交換する。

などなどあります。

当医院もいろいろ修理を実施した経験で、基本はモーター自体を交換した方が予後がいいという結論に至りました。

もちろんですが、予算優先の制約もあろうかと思いますが、品質と信頼性を第一優先とした意見です。

というのも、まずは完全に焼損しブラシの先がなくなっていたり、摩耗が進みコミュテータとの接点部に穴が空いていたり、その影響でコミュテータにも削れ筋が2本できていたります。

この溝がとても厄介です。

細かいサンドペーパーで磨き筋をきれいに消せればなおよしですが、程度が酷い場合は、研磨で接点が剥がれてしまいます。

1.接点復活剤などを吹き付けてコキコキを繰り返してみる方法

その場しのぎですね。一時的には回復しますが、すぐ再発はするでしょう。

時間制約や緊急的な場合のみの手段となり、品質や信頼性を優先する場合は、選択肢にはなりません。

2.高い電圧をかけてみる

これは、恐らくですが故障の原因が、ブラシとコミュテータに塗布されたグリスが劣化し高抵抗な状態になっているか酸化膜が付いているところへ高電圧つまり高電流を流し一機に焦がし除去しようというものだろうと思います。

また、異物や劣化グリスの固着で回転抵抗があれば、そこに高い電圧でトルクを一気に上げて突入電流で初動させようというものかと思います。

初動さえできれば、回転で電極の接触も改善されるのだろうと思います。

ですが、例えば高抵抗の場合は、突入電流でブラシが焼損するリスクもあるので状況次第でしょうかね。

いづれにしても一時的処置で恒久対策ではありません。

3.同型の新品モーターに交換

元々付いていたモーターの仕様が不明のため、形がそっくりなモーターに交換せざるをえないかもしれません。

ただ、規定電圧や電流をオーバーした場合は、ブラシの焼損や異常加熱を招きます。

おもちゃの仕様を解析し交換しても大丈夫なモーターに交換しますが、次の問題にトルクが足りなかったります。

ラジコンやプラレールなどガシガシ動く動力部の場合は、だいたいトルク不足や速度不足がでます。

まぁ、目視でコイルの形状や導線の径、巻き数で一目瞭然で違いがあればそっくり交換は難しいでしょう。

4.破損したブラシのみを手持ちのブラシと交換する

コミュテータの溝の程度が軽度であれば、無事なブラシに交換できると思います。

ただ、交換用のブラシを別途用意できません。

ミニ四駆用などのカーボンブラシは、単体でマブチ製のモーターが買えてしまいます。

5.破損したブラシをリン青銅板で自作し交換する

インターネットで紹介されていたりしますね。0.1mmや0.2mmのリン青銅版で代替えのブラシを作成してもいいかもしれませんが、予後悪いことが多いです。

だいたい、コミュテータの深く削られた溝を残したまま、ブラシを作成してもこの溝が悪さします。回転中に段差に接触しモーターの回転が安定しません。

特に速度が不安定で振動で変化します。

固定部がグラグラだとこでも接触が不安定になるので、端子部は元々付いていた端子部を残し破損した先をカットして先だけ交換という手もあるかもしれません。

また、リン青銅版をV字で折りバネ性を上げておられるかと思いますが、流せる電流が制限されるため、前述の不安定な挙動の原因になっているようです。

もし、リン青銅版でブラシを作成し交換する場合は、かならず2本のブラシとも交換します。

というのも、片方のみ交換すると左右でコミュテータとの接触の差異が生じます。

自作ブラシで交換する場合は、2本とも交換です。また、コミュテータとの接点も突入電流を考慮しコミュテータとの接触部を大きく取れるようにする。

V字ですと、突入電流の1Aが一時的に流れたとしても接点面積が小さいため、焦げる可能性が出てきます。できるだけ、コミュテータに溝があれば研磨でフラット化しておくです。

U字に曲げて作成したブラシです。


ATtiny用 OSC CAL値 キャリブレーション 冶具

旧スタッフブログ記事からの転記となります。

今回は、ATtinyマイコン向けのOSCCAL値のキャリブレーション治具を紹介します。

おもちゃの修理やモノづくりの制御マイコンに8bit RISCアキーテクチャマイコンのATtiny13aやATtiny85を利用しています。

8ピンとIOは少ないのですが、GP-IOでのスイッチやドライバの制御やPWMも使えるので、重宝しています。SPIやUARTもソフトで実現すると、今回のような治具の制作もできます。

さて、通信販売ページの赤外線リモコン(ハピエスト リモコン)などを製作する際やUART通信を行いたい場合など、ライブラリで使用する内部タイマーの精度が必要です。

特に製造段階でキャリブレーション済みであろうOSCの値であっても、デフォルト値のままだとズレていたります。

実際の使用環境(内部発振か外部発振、周波数、電圧、周辺温度)に合わせてOSC値を計測しインプリします。

今回は、その最適値の計測治具とプログラムを紹介します。

開発環境:Arduino IDE(統合開発環境なので、コンパイラやエディタなど一式含む)

※先人様のおかげではあるのですが、統合開発環境なのでmakeファイルなども一式使わせていただけ、便利な世の中になりました。コンパイラ一つとっても、gccのバージョンなどいろいろありますからね。

内部 RC OSC

ATtiny13aデータシート P23参照 ブロック図でいうところの青枠なのですが、精度を求めるなら、外部に水晶発振器を付けるということになるのですが、部品点数の増加や基板のスペース的なところもあって、内部発振器の精度でよければ、外付け回路無しで構成できます。

精度仕様

マイコン開発業務に携わった経験があればご存じかもしれませんが、低価格帯マイコンの出荷選別にコストは掛けれませんので、この数値は設計保証もしくは抜き取り検査だろうと思います。

インターネットなどでATtinyやその他マイコンの紹介記事を参照すると、内部RC発振を校正(最適なOSCCAL値のチェック)する記事をいろいろ拝見します。

当医院でもブレッドボードで最適なOSCCALを確認しているのですが、ちゃんと基板に起こしておこうという紹介になります。前振り長くてすんません。^^;

要件は、以下のような感じです。

  • ユニバーサル基板でサクッと作れる。
  • 電源は、使用環境での最適値を探索するため外部安定化電源から供給。
  • OSCCALの調整は、プッシュスイッチで。
  • OSCCALの値は、UARTからシリアルでターミナルソフトで確認。
  • オシロスコープでクロックサイクルの波形を目視する。
  • ターゲットマイコンは、ATtiny13aとATtiny85。ATtiny2313もそのうち。

当初、OSCCALの変更は、UART経由でキーボードで打ち込もうかと思っていたのですが、そもそも最適値でない場合、通信が文字化けして分からないことや、OSCCALの変更は、周波数の2%を超えるなということでプッシュスイッチの押下で±1づつを調整することにしました。 コンセプトとしては、ネット上でよく拝見する内容とほぼ同じとなります。

UARTでの通信とVCC電源ですが、Arduino Pro Mini用のシリアルI/F基板があり、ちょうど3.3V/5Vの2種の供給とUSB越しにUART通信ができるので、そのまま挿して接続できるようにしました。

3.3V/5V以外は、外部から給電できりょうにVCC/GNDピンを設け切り替えスイッチで切り替えるようにしています。

さて、キャリブレーションについてですが、ATtiny85のようにクロックアウト機能を有している場合は、FUSEビットを書き換えるなりで外部ピンにシステムクロックを出力させOSCCALを増減させジッタなりを評価してやればいいのかもしれませんが、ATtiny13aのようにシステムクロックを直に評価できない場合の手段が必要になります。

自分の場合は、インラインアセンブラにて、1CPUサイクルで実行できる命令にてポートにパルスを出力させるようにしました。

仕様書のISAの当たりにある表(Instruction Set Summary)で確認し、手っ取り早く、OUT命令が、1サイクルで実行されるので、適当なレジスタをスタッキングし退避させ、”HI” → “LOW” → “HI”とトグルさせてています。そのパルス信号をオシロスコープで周期を確認するといった具合にしています。

例えば、ATtiny13aを内部RC発振の1.2MHzで使用するとすると、デフォルト内部RC発振で起動します。

デフォルト値でCKSEL[1:0] = 10で9.6MHzで発振しますが、Fuse bitのCKDIVが立っているので、9.6MHz設定を8逓倍で回した場合、9.6MHz / 8 = 1.2MHzとなります。

因みに、SUT[1:0] = 10なので、longest start-up timeだそうです。


まぁ、ここら辺の基本的なお作法は、マイコンを使用上での基本中の基本なのでね。


1.2MHzの周期は、1/1.2M = 833nsをカーソルなりで計測し目視します。 同時にTeraTermに表示されているOSCCALの値が、最適値になります。

ATtiny85用コード

ATtiny13a用コード ATtiny13a用は、Software Serialが使用できないため、ATtiny13a用のライブラリを利用します。ライブラリの一部を更新しております。2022.3.3 追記