« 2020年9月 | トップページ | 2020年11月 »

2020年10月

2020/10/31

FRISKケース入りArduinoへのISPプログラマ機能追加

先日ArduinoクローンをFRISKケースで作ったとき、使ったことの無いICSP端子をノリで付けていました。
その後、どうして使ったことが無いのかを考えていたところ、この端子はターゲットとして付いていること、すなわち別途用意したISPプログラマ(AVRライタ)によってプログラムされるために付いているもので、その機会が私に無かったからだと思い至りました(ISPはIn-System Programmingの略)。
そんなことを考えながら、ジャンパー線をD10〜D13に繋いでATtiny85へ書き込もうとしたところ、エラーの嵐。ATtiny85のデバイスID(シグネチャ)が違う!などと言われてしまいました。
Friskisp1
なんでかな、たぶん配線ミスだろうけれどもしかしてコンセプトミス? と思ってソフトハード両面で調べていたところ、ATTinyCoreのprogrammers.txtでavrdudeに-Fを付けて強引に書けば動くことが分かったものの気持ち悪く、さらに調べるとICSP端子の横で隣り合っているMISO(=D12)とD13用LEDのアノードの間にはんだカスが見つかり、これを掻き出したら治りました(お恥ずかしい)。

他にも気になるところがあったので手直ししようとしたところで、ふと、ICSP端子は、ターゲットになる場合とISPプログラマにする場合とで、リセットだけが違うことに気が付きました。つまり、ターゲットになる場合はRSTピンをATmega328Pの1番ピン(=RESET)に接続し、ISPにする場合はATmega328Pの16番ピン(=D10)に接続すれば良いわけです。そしてラッキーなことに、ちょうどその辺にジャンパーピンを立てるスペースがありました(スイッチは入らなかった)。

またミスしそうに思ったので、まずは回路図です。前回漏れていたICSP端子を書き足し、ジャンパーを追加します。さらに、忘れていたAREFのパスコンとAVCCのLCフィルタを書き足しました。但し、まだインダクタを買っていないのでLCフィルタは未実装です。あと、D13とLEDの間を2.2kΩで受けているところへバッファを入れたいのですが、スペースが足りないので今回は見送りました。
Arduinofrisksch2

ピンと配線を追加して、蓋を削ってラベルを作り直したものがこちらです(ショートしていた所も書いています)。ここでは緑色のジャンパーピンでISPモードにしています:
Friskisp2

ISPプログラマは書き込むときに挿し、動かす時は(使うピンが被れば)抜かないといけませんが、いちいちジャンパー線で1本ずつ繋ぐのも面倒だったので、まとめて繋ぐケーブルも作りました:
Friskisp3

ブレッドボード側はATtiny85に覆い被さる形です:
Friskisp4

ケーブル単体も記念に撮影しておきました。すぐバラけるのでマスキングテープで緩くまとめています:
Friskisp5

これでArduino側にArduinoISPのスケッチを書き込めばISPプログラマのできあがりです。既に何日か使っていますが、コンパクトに収まって満足しています。

ただ、元々ついでに付けた端子で周囲にまったく余裕がないので、ふつうのISPケーブルはコネクタが入りそうにありません。安いSOPIC用クリップにも付いてくるようなので、上記のバッファなどを追加するときにでも検討しようと思います。

何かの参考になれば幸いです。

パドラッパ from MacBook Air (2017)

| | | コメント (0)

2020/10/19

FRISKケースでArduinoクローンを作りました

秋月電子さんの小さなUSBシリアル変換モジュールからArduinoの動作に必要なDTR(相当のRTS端子)を引き出すことができたのを踏まえて、FRISKケース入りのArduinoクローンを作ってみました。

屋内暑さ指数計を作ったときと同様にLibre OfficeのWriterでざっとレイアウトを検討したところ、ヒューズリセットの時ぐらいしか使わない割に部品点数が多くなる12V系だけ外せば、基本のArduino UNOの機能がほぼ搭載できそうです。むしろ、少々面積に余裕があるので、1つの端子に複数のラインが繋げるようにソケットを2列に並べる余裕があります。というのはArduino UNOなどの場合、例えばデジタル入力をプルダウンしたいときや、PWMの電圧を確認したいとき、それだけのためにブレッドボードへいったん引き出してやる必要があって、配線が煩雑になるのが気になっていたのです(プルアップはpinModeで設定できるのですが)。
あと、Arduinoの不思議なハーフピッチずらし(逆挿し防止用?)はサクッと無視します。が、その隙間は作例を参考にさせて頂くときの目印になるので、機能端子としては空けつつジャンパーにします(部品を直列接続するときに使う)。また、単体で完結させようとすると必ず不足するGND端子はできるだけ多く設けることにしました。
更に、ATtiny85などの親ボードとして使用するときに間違えて「マイコンボードに書き込む」をしてしまうことの対策として、ライトプロテクトスイッチを付けます。これは、リセット端子に10μFをぶら下げることの切換スイッチで、普通のリセットスイッチと並列に入れます。
最後に、私は使ったことが無いのですが、この際ICSP端子も付けておきます。

できたものがこちら。GNDは16ホールも取りました。アナログ側はスペースの余裕があったので3列構成で、例えば半固定ボリューム(可変抵抗)を直挿しした上で、ピンを立てて端子電圧をテスターで測ることもできます。
Arduinofrisk1
左の方でスイッチの頭を出しているので、右から開くように左側をシール止めしています。開けてみると、左下が昨日加工したFT234Xモジュールで、左上がスイッチコーナーになっています。FT234Xモジュールの右側でお辞儀しているのが3.3Vの三端子レギュレータで、負荷容量は裏面にチップで実装しました。右上の中ほどにあるのがセラロック(発振子)で、狭いところに配線するには楽だったのですが、背の高さは少々困ったもので、蓋を一部削りました。
Arduinofrisk2
基板裏は概ね配線です。右上の(フォーカスが合ってない:すみません)青いのがリセット妨害用コンデンサで、右下がFT234Xモジュールです。FT234Xモジュール裏面のCB0端子から通信インジケータLED信号を取っています。FT234Xモジュール左側の赤ライン下に、三端子レギュレータ用のチップコンデンサが見えています。
Arduinofrisk3
次が昨日加工したDTR(RTS)端子の引き出し部です。オレンジ色の線でリード線を押す方向にバネを利かせています。
Arduinofrisk4
最後に、Arduinoを使い始めてすぐの2013年から愛用しているスイッチサイエンスさんのABCプレートに搭載したArduino UNO&ブレッドボードと一緒に記念撮影しました。今後は、ちょっとした作業はFRISKサイズでできそうですし、秋月電子さんがDタイプと呼ばれているサイズの基板でシールドも作れるので、ヒューズリセットなどのとき以外はお蔵入りかな。
Arduinofrisk5
回路図も添付しておきます:
Arduinofrisksch
…あ、AVCCにLCフィルタを入れる(リンク先PDFのp.212)のを忘れてた! Arduino UNOにも入っていないから、ま、いっか…

以上、何かの参考になれば幸いです。

パドラッパ from MacBook Air (2017)

| | | コメント (0)

2020/10/18

秋月電子さんのFT234X超小型USBシリアル変換モジュールからDTR(RTS)をしっかり取り出す

先日作った屋内暑さ指数計のようにFRISKのケースを使って色々しようと考えたとき、タブレット取り出し部の幅11mmに収まるインターフェースがあるとちょうどいいです。
前々から気になっていた秋月電子さんのFT234Xを使ったUSBシリアル変換モジュール(AE-FT234X)が、まさに幅11mmなのですが、ATmega328Pへスケッチを書き込むのに必要なDTR端子が出ていません。
というか、FT234X(リンク先データシートPDF)は、従来から多く使われているFT232R(同左)と違ってDTRが無いのですが、RTSラインで大丈夫だという下記レポートがあります:
超小型USBシリアル変換モジュールをArduinoとして使う方法 | あつラボ
ただ、ここにも書かれている通り、配線直付けでは耐久性が問題かなと思っていました。

まぁ現物を見て考えようということで、とりあえず買って観察したところ、1.2tと厚い基板が単なる両面だと気が付いて、それなら側面に穴を掘ってはんだめっき線を挿入して折り返して固定すればしっかり取り出せそうだと思い、やってみました。

まず、RxDの大きいランドと細いRTSラインが近いので、RxDランドを削っておきます(RxDは裏面で配線されています)。
Ft234xae01
はんだめっき線の径をあれこれ見比べて、1/6W抵抗のリード線がφ0.35mmでちょうど良さそうだったので、ピンバイスでφ0.4mmの穴を基板側面に開けます。深さは約2mmです。
Ft234xae02
続いて、RTSとCTSのラインをカットし(しなくて良かったかも)、RTS側のレジストをカッターナイフの背で削ります。9番ピンVccIOのスルーホールが近いので、その手前までにしておきました。
Ft234xae03
リード線を切ってコの字型に曲げて、横から嵌めます。
Ft234xae04
最後にリード線をはんだ付けし、接着剤で固めて完成です(写真は接着剤塗布前)。
Ft234xae05

これで無事に動きました。これを使って動かした記事は、次にアップする予定ですしました。

以上、参考になれば幸いです。チャレンジされる方は自己責任でお願いします。

パドラッパ from MacBook Air (2017)

| | | コメント (0)

2020/10/15

屋内暑さ指数計をFRISKケースへ入れました

先週、屋内暑さ指数計をATtiny85で作ったとき、基板がスカスカだったので「適当なケースが見つかったら」収めてみようかなと思っていました。
それで100均など眺めてみたのですがピンと来ず、あれこれ考えていたところでFRISKを思い出して買って帰り、ポリポリ食べながら検索したところ、採寸されている記事がありました。そのおかげですぐに部品が配置できるメドが立ちました。

電源電圧は秋月電子さんのLCDが1番厳しい3.3±0.2Vなので、1.5Vの電池を3つ直列にしてレギュレータで3.3Vを作ることにしました。電池はφ11.6mmのLR44で検討を進めます(LR44x3といえば、HP-42Sなど懐かしの関数電卓を思い出します)。
センサは小さくて安い上にレギュレータが入っていて1.8〜5.0Vで使えるRasbeeのBME280モジュールにします。幅が11mmなので、FRISKのタブレット取り出し部にジャスト入るはず。
3.3Vをレギュレータで作るので、5V電源で作っていたときのLCD・センサ電源用PWMは不要になりますが、大したノイズにはならないので、今回はスケッチ(プログラム)は変更せずそのままにします。
LCDと電池を並べて実装するには面積が足りないので、逆面に実装することにします。ケース内高さ9.1mmに対して、LCDとサブボードが実測3.5mm、LR44の厚みが5.4mmで最も薄い電池ケースの高さが5.5mmのようなので、計9.0mmになります。残りが0.1mmしか無いので、LCDの表示部1.8mmは窓から出して、0.3mmの基板を使うとすれば、LCDと電池だけの単純計算では1.6mmマージンができます。
電池駆動だと付けっぱなしにはしたくないので、前はリセットに使っていたスイッチを電源スイッチにして、押している間だけ動くようにします。回路図はこうなりました:
Wbgt03sf_sch

もうひとつ、肝心のATtiny85がDIP品だとパッケージ厚5.08mm(max)あります。するとソケットには到底入れられず、将来プログラムし直すことができません。そこで厚さ2.03mm(max)のSOP品を厚さ0.1mmの薄い変換基板に載せて、この基板状態でプログラムし、親基板の上でスルーホールを使わず配線することにしました。
プログラムしたときの状態はこんな感じで、丸ピンソケットで接触を得ています。本当はポゴピンを使いたかったところですが、ありませんでした(こんど買っておこう)。
Friskw00

FRISKをゆっくり食べ終わったころに秋月電子さんに頼んだ部品が届いて、組み立てました。表面の招き猫ラベルは温存して、
Friskw01
トレイをカッターナイフとピンバイスとミニルーターとリーマーで加工し、ラベルを貼りました。重さは26.9g。
Friskw02
タブレット取り出し部に設けた開口からセンサが見えます。
Friskw03
ケースを開けると、電池とATtiny85が出てきます。実は基板を切り出す時に一列間違えて、電池ケースがはみ出してしまいました。そのためトレイの壁を一部削っています。また、厚さが想定外に収まらず、何かと思ったら電池押さえバネが電池を入れると上に出たせいで、その部分の蓋を一部削いでいます。なお、ATtiny85の変換基板裏面には絶縁シートを貼ってあります。
Friskw04
LCD面にはセンサとLEDとコントラスト調整ボリューム、それとUSB電源などで動作確認するためのソケットがあります。LCDサブ基板の裏面にSMDがあるので、クッションシートをかませて絶縁シートを貼ってあります。左下のスイッチとレギュレータは別基板で、レギュレータの負荷容量は裏面にチップで実装しました。また、0.3mmの基板が電池ケースの圧力に負けていたので、0.8mmのユニバーサル基板で補強しました(最終的に、これで高さマージンを食い潰した)。
Friskw05

ところで、
今回、部品やラベルのレイアウトにLibre OfficeのWriterを使いました。基板外形やラベルはミリメートル単位でグリッド設定を適当に変えながら描き、部品配置はインチ単位に変えて50mil(約1.27mm)グリッドで検討すると、それなりに使えるなという印象です。
参考に、FRISKケース向けの基板とラベルの白データを.odtと.pdfで付けておきます。

ダウンロード - frisk0.odt

ダウンロード - frisk0.pdf

ちょっと苦労しましたが面白かったです。また何か作ろうかと思いつつ、FRISKをまたポリポリと。クセになってきました。

パドラッパ from MacBook Air (2017)

| | | コメント (0)

2020/10/08

ATtiny85版の屋内暑さ指数計

ATtiny85版の屋内暑さ指数計 ATtiny85のArduino IDEによる使い方を習得し、 ATmega328Pからスケッチを移植した勢いで、屋内暑さ指数計を組み立てました(もう寒くなったというのに)。
Attiny07

今回はATmega328Pで使っていたケースの中身を挿し換えたのですが、基板はすかすかで、これなら同じ基板に液晶もセンサも直接搭載できそうです。
Attiny08
(2.2kΩの抵抗を切らしてしまって…)

適当なケースが見つかったら、やってみようかな。

パドラッパ from MacBook Air (2017)

| | | コメント (0)

2020/10/06

ATtiny85マイコンの手習い(その2・屋内暑さ指数計の移植)(2020/10/07修正)

ArduinoIDEでATtiny85が使えるようにする方法を、前のエントリーで紹介しました。
続いて、ATmega328PからATtiny85への移植を、屋内暑さ指数計を例題にやってみた内容を紹介します。

まず、両ICの簡単な比較は次の通り:
項目ATmega328PATtiny85単位
ピン数288
(内I/O)236
(内ADC)64ch
(内PWM)62
flash32k8kbyte
EEPROM1k512byte
RAM2k512byte
ATmega328Pでの回路図は次の通り:
Wbgt01_scha
電源とリセット以外に7ピンを使っています。また、当初のメモリ使用量はflash/EEPROM/RAMの順に13562/0/1254byteでした。
ここから明らかな通り、移植のポイントは使用するピン数とメモリの削減(flash6kB, RAM742byte)です。メモリはほぼ半減ですね。
ピン数については、暑さ指数計ではI/Oに
1.2. LCDおよびセンサと通信するI2Cの2ピン
3. リセット(1ピン固定)
4. LCDコントラストを設定するため可変抵抗から電圧を読み込むADC入力
5. LEDを点滅させるデジタル出力
6. USBの5VからLCDとセンサの電源電圧3.3Vを生成するPWM(元電源が3.3Vなら不要)
を使います。あと電源の計8本で、ちょうど全てです。というか、きっちりなので例題にしました。

スケッチ(プログラム)は次のGitHubリポジトリに掲載しました:
pado3/ArduinoWBGT: Indoor WBGT meter with ATmega328P and ATtiny85
変化を追いやすいように、ブランチを3つに分けています:
1. mainのWBGT01.inoがATmega328Pで最初に使えるようにしたもの
2. WBGT03がATmega328P上でメモリ削減に取り組んだもの
3. WBGT03sがATtiny85で使えるようにしたもの
です。

最初のWBGT01では測定・表示機能の他に、シリアル通信によってArduinoIDE側へ途中経過や測定データを戻す機能がありました。ATtiny85ではピン数が少なくてシリアル通信ができなくなるので、Serial.print()等をバッサリ消しました。これだけでflashが3kbyte減りました。
LCDとセンサの電源をPWMから外部レギュレータに変えてみても、flashは172byteしか減らず、元に戻す。
LCDのコントラストをADC読み取りから決め打ちに変えてみても、flashは160byteしか減らず、元に戻す。
温湿度からWBGTデータを出す対照表(intの20x17 = 340byte 680byte(intは2byteでした…) )をオンメモリからEEPROMへ出すと、flashが792byte, RAMが680byteも減りました。出した量の2倍減ったのは驚きましたが、理由は宿題です(おそらく領域と内容がそれぞれ消費していた)。この時、別途EEPROM書き込み用のスケッチ"WBGT03_EEPROM.ino"を作成しました。
温度の演算に使っているdoubleの変数3つをintに変えるとflashが930byteも減りました。元々intの読み取り値を表示・演算のためにdoubleにしているだけなので、intとcharで操作することにします。
ここまでスイッチサイエンスさんのLCD表示サンプルプログラムをそのまま使わせて頂いていたのですが、この中のlcd_printInt()を消して別処理にするとflashが1344byte減りました。どうも、sprintf()がメモリ喰いだったようです。
これで、ATmega328P上では8k/512/512に収まりました。主要なポイントをまとめると次の通りです(他にも細々と手直ししているので単純な加減にはなっていません):
項目flashEEPROMRAM
WBGT01初期1356201254
Serial削除104600969
対照表をEEPROMへ9480340289
一部メッセージ削除9402340270
doubleを3つintに8472340270
メッセージをEEPROMから読む8576364276
lcd_printInt()削除7272364272
floatを1つintにして表示処理7852364270
細かな処理や待ちの見直し7888364279

メモリが削減できたのに気をよくして、いよいよATtiny85へ移します。
次のブログなどを参考に調べたところ、ATtinyでは、I2C通信に使っていたWireの代わりにTinyWireMを使います。また、WireとTinyWireMで1つだけ異なるコマンドがあります。
TinyWireMのインストールは、こちらを参考にしました:
ATtiny85でI2C-LCDを使う方法 | Arduino | kosakalab
(ST7032ライブラリは特に必要ありません。)
プログラムの移植は、こちらを参考にしました:
ATtiny85 - Tomiya's blog (3DCG & Photo etc.)

こちらを元に、まずはLCDの表示、EEPROMの読み書き、そして全体構成へと進めます。
LCDの表示は、まず"Wire"を"TinyWireM"に全置換します。
次に、Tomiyaさんの記事ではWire.writeからTinyWireM.sendへの差し換えは慎重にとありますが、.writeのままだとフリーズしたので、とりあえず.sendに全置換したところ、あっさり動いてくれました
続いてEEPROMへの読み書きをしたのですが、ここで引っかかりました。ATmega328Pでは対照表全てとメッセージを一気にEEPROMへ書けたのですが、ATtiny85ではRAMオーバーになってしまいます。364byte書き込むのに、512byteしかないRAMに728byte置こうとする訳ですから、そりゃ無理というものです。
最初は、それでもデータを前後半に分けたら書けるかと思ったのですが、コンパイル時に「スケッチが使用できるメモリが少なくなっています。動作が不安定になる可能性があります。」というメッセージが出て、無視して書き込んでみるとデータ化けの嵐。
Attiny05
結果としてデータを4分割とメッセージを別枠にした5段階書き込みをすることになりました。

ここをクリアしたところで、ATmega328PのWBGT03から
1. "Wire"を"TinyWireM"に全置換
2. "TinyWireM.write"を"TinyWireM.send"に全置換
すると、あっさりとWBGT計として動作してくれました。
Attiny06
この時のメモリ使用量は5548/364/79byteで、flashもRAMも使用量がとても少なくなりました。おそらくライブラリの違いが大きいのだろうと思われます。
回路図は次の通りです: Wbgt03s_scha

というわけで、無事にシュリンクすることができました。ただ、ここから更にflashを4kまで削減してATtiny45に収めるのは一苦労しそうです。

以上、何かの参考になれば幸いです。ご利用は自己責任で。

パドラッパ from MacBook Air (2017)

【2020/10/07追記】
・EEPROM周りでのポカを修正しました(見え消しあり、お恥ずかしい限り)。
・回路図のノードが分かりにくかったので修正しました。

| | | コメント (0)

ATtiny85マイコンの手習い(その1・動作環境の確認)

夏にRaspberry pi zero wTinkerBoard屋内の暑さ指数WBGTを簡単に求めてみたあと、Arduino nanoでも同じことができるようにしていました。
その後Arduinoに乗っているマイコンATmega328P-PU単体赤外線リモコンコンバータでも使っていたもの)へも移植して、ケースに収めて使えるようにしました。
Attiny01

さて、
最近、ATmega328Pで遊んでいて動作しないものが1個できてしまいブートローダーを書き直す方法と書き込みヒューズをリセットする方法を調べていたときに、同じメーカーのATtinyシリーズ(例えばATtiny85)というマイコンでもArduinoと同様のスケッチを動かせることを知りました。私には、次の2記事が分かりやすかったです:
Arduino IDE で ATtiny 他の開発 | Make | kosakalab
Tiny AVR Programmer Hookup Guide - learn.sparkfun.com

それで興味をもってあれこれ調べたところ、両者のブートローダーライターの回路はほとんど同じだと分かりました。
From Arduino to a Microcontroller on a Breadboard | Arduino
Programming ATtiny85 with Arduino Uno - Arduino Project Hub

web上の情報が、枯れたネタであることからか新旧おり混ざっていて私は少々混乱したのですが、結局のところブートローダーについては現時点で最新のArduino IDE 1.8.13のスケッチ例に標準で入っているArduinoISPで、ATmega328PにもATtiny85にも書き込むことができました(ATtiny85にはATTinyCoreのインストールが必要です)。参考に、ATtiny85へ書き込むときの設定キャプチャを付けておきます。
Attiny04
他方のヒューズリセッタについては、ATmega328PにはArduinoIDE 1.6系が、ATtiny85にはArduino IDE1.8系が必要でした(macOS Catalinaでは1.6系が動かず、Windows10で確認)。

ブレッドボードで確認した上でシールド(Arduinoに直接挿すサブボード)を作りました。左側がヒューズリセッタで、右側がブートローダーライターです。
Attiny02
Attiny03

ATmega328P-PUへスケッチを書き込むのはスイッチサイエンスさんのこちらの記事のようにシリアル変換アダプタを付けっぱなしにして、Arduino UNOなどと同じくArduino IDEで「マイコンボードへ書き込む」とすればOKです。
一方、ATtiny85へのスケッチ書き込みは、
1. Arduino UNOにArduinoISPのスケッチを書き込む
2. ブートローダーライターを繋ぐ
3. Arduino IDEの「ツール」をブートローダー書き込みと同じ設定にする
4. ATtiny85に書き込むスケッチを用意する
5. Arduino IDEの「スケッチ」で「書込装置を使って書き込む」
6. ATtiny85を実際に動かす基板・ブレッドボードに挿し換える
という手順の、4〜6をぐるぐる回す感じになります。
正直、ちょっと面倒なので専用のISPが欲しいような気がしています。とはいいつつ、Arduino UNOより高かったら意味が無いのでUSBaspが安くていいのですが、例によってmacOS Catalinaだと問題があるようです。(泣
なお、ブートローダーライターやヒューズリセッタの検討を始めるそもそものきっかけになった「書き込めなくなったATmega328P」は、どうやら完全にぶっ壊したようで、これらのツールでも復活できませんでした(泣き笑い

さて、ここまででATtiny85を使う環境が整いました。続いて、屋内暑さ指数計の移植へ挑戦しますが、長くなったので別エントリーにします。
何かの参考になれば幸いです。

パドラッパ from MacBook Air (2017)

| | | コメント (0)

« 2020年9月 | トップページ | 2020年11月 »