koheiのおもちゃ修理記録

宇部おもちゃ病院 毎月第2土曜日 13:00~16:00
宇部新天町の西の端、市民活動センターで開院してます。

5/31 マイコンボードいっぱい買った①~Nucleoボード動作確認

2020-05-31 | PIC・電子工作
外出自粛や各種会場の閉鎖で外でやる用事がガックリ減ってるけど、ぼけ~~~っとしてる暇はない!やりたいことがいっぱいあるw。
長年温めてる「やりたい事」があって、速度・メモリに余裕のあるマイコンボードを購入しようと検討。秋月でガッポリ買ってみましたw。

左から、NucleoのSTM32F411RE、同じくNucleoでSTM32F446RE。
右から2番目は、日本が誇る半導体メーカー:ルネサスエレクトロニクスのRX621マイコンボード、一番左が(オマケで)Seeeduino XIAO。

購入時現在の価格と各スペックは下記の通り。
①STM32F411RE:1,850円、Clock100MHz、Flash512KB、SRAM:128KB
②STM32F446RE:1,980円、Clock180MHz、Flash512KB、SRAM:128KB
③RX621マイコンボード:2,700円、Clock96MHz、Flash512KB、RAM(96KB)
④Seeeduino XIAO:580円、Clock48MHz、Flash256KB、SRAM:32KB

作りたいと思ってるものに対して、Arduinoは…、日本での情報も多いしちょっとした工作には大変便利なんだけど…ATMegaでクロックが8or16Mhz主体なので、ちょっと遅すぎる…。最近CPUがCortexに変わってスピードアップしつつある様だけど、まだバリエーションがあまり多くない感じ…。
以前に「LED工作第1弾(?)」として作った3×3×3 LED-Cubeで使ったルネサスのGR-SAKURAはなかなか良かったんだけど、どうももう売ってない…。
いろいろ探すと、①や②のNucleoというボードが、安くてスペック高そう。という事で、試し買いにF411と、本命でClock180MHzのF446を購入。
それから、GR-SAKURAの代りに、同じルネサスでスペックも近いRX621ボードを購入。
ついでに「このスペックでこの値段はお得じゃない?!」と、Seeeduino XIAOを買っといてみた。(ポートはあまりいらないけど速度やメモリが欲しいときに便利かも、と。)
(最近ちまたで大人気らしいRasberry Piも考えてみたんだけど、OS上で動く前提なので、厳密に時間を管理したいプログラムには向かないらしい。OSを外して「ベアメタルでラズパイ」という使い方もできるらしく、楽しそうでめっちゃ心そそられるけど、どうも統合環境なしでコンパイルしないといけなそうなので、初心者は手を出さない事にしましたw。)

とりあえずまず、Nucleoのボードの使い方を勉強してみるw。

秋月の商品ページでは「mbedで開発しなさい」と書いてある。(書いてない?)
「mbedとはなんぞや?」どうやら、Cortexを作ってるARMのボードもしくは開発環境の事らしい。mbedの使い方はいろんなサイトに書いてあるので、参考にしながらとりあえずオンライン版のmbedにユーザー登録して使ってみる。

Nucleoボードは、USBで繋ぐとUSBストレージとしてパソコンに認識される。サンプルプログラムを取ってきてコンパイルすると、(プログラム名).binのファイルができるので、それをどこかに保存してからエクスプローラでドラッグ&ドロップすると、あっという間に書き込み出来て、本体のLEDが点滅する。
(実際には、自宅にボードが到着する前にあーでもないこーでもないと悩んだのだけど、ボードが到着して繋いでみたら、あっという間だったw。)

さてこのボード、秋月のページには「(STM32F411)クロック:最大100MHz」と書いてある。ほんとに100MHzで動いてるのだろうか…。
サイトを探すと、「裏にシールが貼ってあって、C-01は内部クロックで動作、C-02はST-LINKからクロックを供給」(※Nucleoボードの上3分の1は、USBでの書き込み用にマイコンが1個乗ってて、その部分をST-LINKと言うらしい。)と書いてあったのだけど、買ったボードには「C-04」のシールが貼ってあって、クロックがどうなってるのかよく分からない…。
分からないなら調べるしかない。ネットであちこち探して調査する。

昨日一日散々悩んでうまくいかなかったけど、一晩寝てやり直してみるとスッキリ。概ね調査が終わりました。
「MCOピンにクロックが出力できる」との事で、出力させてオシロで確認。
CH1がHSI(内部クロック)、CH2がHSE(外部クロック)です。

外部クロックには8MHzが入ってるようです。(ST-LINKの水晶は8MHzが乗ってます。)
続いて、MCOの出力パラメータをRCC_MCO2SOURCE_HSE→RCC_MCO2SOURCE_SYSCLKに変更して、システムクロックを確認。(ちょっと早すぎるので、パラメータで4分周にして出力させる。)

オシロの値がだいぶ振れるけど、どうやら4分周で25MHz→システムクロック=100MHzで動作中らしい。

続いて、下記のプログラム:HALのGetOscConfigを使って、クロック周辺の設定を確認してみる。

RCC_OscInitTypeDef RCC_OscInitStruct;
HAL_RCC_GetOscConfig(&RCC_OscInitStruct);

printf("System Clock = %d\r\n", HAL_RCC_GetSysClockFreq());
printf("OscillatorType : %d\r\n", RCC_OscInitStruct.OscillatorType);
printf("HSEState       : %d\r\n", RCC_OscInitStruct.HSEState);
printf("PLLState       : %d\r\n", RCC_OscInitStruct.PLL.PLLState);
printf("PLLSource      : %d\r\n", RCC_OscInitStruct.PLL.PLLSource);
printf("PLLM           : %d\r\n", RCC_OscInitStruct.PLL.PLLM);
printf("PLLN           : %d\r\n", RCC_OscInitStruct.PLL.PLLN);
printf("PLLP           : %d\r\n", RCC_OscInitStruct.PLL.PLLP);
printf("PLLQ           : %d\r\n", RCC_OscInitStruct.PLL.PLLQ);

printfの結果は…、TeraTermで受けれるのかな?出力画面はこうなる。

結局、cubeMX(後で説明)でのクロック設定は、

こうなって、結論としては、外部からのクロック入力は8Mhzで、CPUの動作クロック=HSE÷M×N÷P=8Mhz÷4×200÷4=100MHz という事になってるらしい。

続いて同様に、STM32F446の方のクロックも確認しておく。やはりHSEは8MHz。

4分周したシステムクロックは約45MHz。

システムクロックは書いてある通り180MHzで動作中の様子。
クロックの各設定は、

cubeMXで表現すると、

となって、結論としては、外部からのクロック入力は8Mhzで、CPUの動作クロック=HSE÷M×N÷P=8Mhz÷8×360÷2=180MHz という事になってるらしい。
(OscillatorType=15になってるのがちょっと気になる…。「15」は多分、「RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI」の合計と思われる。同時に設定した場合には優先順位があるのかな…。)
(「NucleoはPF0にオンボードのST-LinkからのMSOを入力すれば自動でクロック源をHSIからHSEに変えてくれる」と書いてあるページがあったので、OR取って全部指定していたら、HSEを優先してくれるのかもしれません。)

ということで、STM32F411もSTM32F446も、設定を変えなければ、多分ST-LINK側の水晶発振を使って、秋月の商品ページに書いてある最大周波数で動いてる事が確認できました。
(設定を変更しようとしたのだけど、mbedで作ったプログラムで変更できなかった…。やり方が悪いのか、後述のSW4STM32からなら変更できるのかまだ分からないけど、とりあえずは最高周波数で動かしたいので放置しておくw。)

ところで、オンライン版のmbedですが、関数とか定義済みの定数とかの定義が見れない…。

関数は、カーソルを合わせると説明の窓が出るけど、ドキュメントには飛べないし、定義のライブラリにも飛ばない。定数の説明も出ない…。
例えばMCOの設定に、「RCC_MCO2SOURCE_HSE以外の何があるんだろう?」という際には、定義に飛んでくれないと大変不便…。
mbedの方で調べたけど、どうにも分からない。オンライン版じゃなくてダウンロード版もあるらしいのでインストールしてみたけど、そちらはライブラリがリンクできずにコンパイル出来なかった…。
秋月のサイトには、Nucleoボードは「mbedでプログラム開発しなさい」と書いてある(書いてないw?)のだけど、あちこち調べると「cubeMX+SW4STM32で開発しよう!」と書いてあるサイトがあったので、参考にさせて貰いながら入れてみました。

「cubeMX」は、Nucleoのボードに使われているSTM32F4を製造しているSTMicroelectronics社のソフトで、サイトの説明によると「STM32マイクロコントローラの設定を簡略化し、対応する初期化用Cコードを段階を追って生成できるグラフィカル・ツール」との事で、プログラム本体を作る前にポートやクロック等の面倒な設定の部分を作ってくれるソフトらしい。
「SW4STM32」は、フルネームは「System Workbench for STM32」で、同じくSTMicroelectronics社のソフトで、つまり自社製のSTM32プログラム開発用の統合環境の様である。

オンライン版のmbedで定義が参照できなくて困ったけど、SW4STM32ならctrl押しながら語句をクリックすると定義に飛んでくれたので、上記のクロック設定の確認とかは、SW4STM32とオンラインmbedとをいったりきたりして作りました。
まだ全部は理解できてないけど、とりあえずオンラインmbedの方がarduinoライクに簡単にプログラムが書けそうだけど、もっと詳細な設定をしていきたければ、cubeMXで設定作ってmbedに必要な部分だけコピペするか、「cubeMX+SW4STM32」で作った方がいい、といったところかな~?

画面のコピーばっかりになったので、作業もしてるんだよ、という写真も載せておきますw。

上のmbedの画面コピーの下の方にこっそり書いてあるプログラムで、PA0に繋いだLEDの「Lチカ」をしてる所です。(基板のLEDを点けるだけじゃ、ほんとに言う事聞いてくれてるかどうか実感が無いのでw。)

参考にさせて頂いたサイトを記載しておきます。(それぞれお断りしてませんが、リンクご了承くださいw。)
SW4STM32とCubeMXを用いてNucleo開発環境を整える:CubeMXとSW4STM32のインストール手順と使い方を手取り足取り書いてくれているページ。初心者には大変助かりましたw。
電子工作専科のぐうたラボ「NucleoのClock (2)」:MCOの設定がしっかり書いてある。そのままコピーさせて頂いて使いましたw。
STMのGPIOはどうなってるのか(LEDをつける):GPIOレジスタの直接操作方法を一から説明してくれてるページ。実行サイクルの厳しいプログラムを作ろうと思ったら必須かな。

ところで、上のGPIOの使い方を説明してくれてるサイトにも書いてありますが、普通のマイコン(PICとか)は、ポートは方向指定をしてあげるぐらいで使えると思うのですが、STM32は、まずポートに電源を供給してやらないといけないらしい。それは「ペリフェラルにクロック供給」という仕組みとの事。そしてそのクロックは、cubeMXで見てみると、CPUの方を最大クロックで使用していると、最高でもCPUクロックの半分の周波数までしか供給できないみたい。
ゴソゴソやってる時に、GPIOを直接H-Lとした時に、オシロでHが拾えずにだいぶ悩んだ。DegitalWrite等を使わずに1サイクルでGPIOをH-Lとすると、CPUのクロックにGPIOがついてきてないのかもしれない。時間に厳密なプログラムを書くときには、ちょっと意識しないといけないかも、と思いました。

さて、次はRX621マイコンボードの使い方だな~w。


コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

5/16 自動車用フラッシャーリレー製作~第2報

2020-05-16 | PIC・電子工作
GWにがんばって作った、愛車カプチーノ用のフラッシャーリレー。
車に乗る用事が無いので実車にて確認できてませんでしたが、先日ちょっと走ってみると、不具合発生…。

最初は好調で、tiny13くんが起きて、寝て、起きて、寝て、とけなげに働いてると思うと「かわいいな~w」などと思いながら走ってたのですが、そのうち「点きっ放し」になってしまった。
ウインカーSWを切れば物理的にランプへの通電が切れるので当然消灯しますが、リレーがONしっ放しになってる様です。予想通りですが、エンジン・ACCを一回切って掛け直すと、動作不良も復活します。
30分ぐらいの走行で、点きっ放し2回は発生しました。これは…、ノイズによるデバイス誤動作ではないかしら…?

またもや先輩から「デバイス側の不具合なのか回路側の不具合なのか切り分けすべき。動作不具合の時にPB0とPB1の電圧を測定して」との助言。
どうしようかと考えましたが、結局せま~~~い車内にノートパソコン持ち込んで、USBオシロで測定しました。
基板から1mずつ4本線を出して準備。この状態で、多分よりノイズを拾うようになったのだろう、近くの公園までちょっと車動かすだけで、不具合多発。さらにオシロのプローブを繋ぐと、ほとんどまともに動かないというほど不具合さらに多発。やっぱりノイズによるデバイス誤動作の気がする…。

まず通常動作時:

電源電圧:3.3Vの変動は、時間軸拡大してみてもそんなに大きくない。200kΩでプルアップしてるPB0のHレベルは、いまいちデコボコしてる。点滅周期は約1.5Hzぐらいに調整してある。

次に、「点きっ放し」が始まった所の結果:

やっぱりリレーON指示のPB1がHのままで、回路側でFETが勝手にONしっ放しになってる訳ではなく、tinyからリレーON指令が出っ放しになってると思われる。(リレーがONの間は、PB0はHのままになって正常。)

ところが、誤動作は「点きっ放し」だけでなく、点かないとか、一瞬点くとか様々発生。
その中で、「点灯」だけ短くなって周期が早くなってしまう誤動作が発生!
その時の電圧観測結果:

点灯と消灯の時間はどちらも、最初にADCから取った値=voltを使って、「(定数+volt/2)×2ms」で、SW変化の待ち時間を含めて同じになるようにプログラムしてる。
こんな点滅になるためには…、点灯の方だけ上式の「定数+」が抜けた状態じゃないとこの点灯時間にならない…。
そんな事が起きるか分からないけど、tiny内で「命令の抜け(飛ばし)」が起きてるとしか思えないなぁ…。(たとえば、ノイズでクロックが1個余分にカウントされて、命令終了前にプログラムカウンタが1個進んでしまうとか??)

という事で、何かノイズ対策を検討する。先輩からはWDTを勧められたけど、それはあくまでも「誤動作した時のリカバリー」策。「誤動作しにくくなる対策」の方がいい気がするし、ICSP使用になってないので、プログラム書き換えるのめんどくさくってww。

外部と繋がってて一番怪しいのは、PB0への入力信号。電圧が違うのでダイオード(BAV99)でブロックしてるつもりだけど、微小高電圧のノイズがブロックしきれてないのかも。
手持ちの家電ジャンクを覗いてみると、仕様不明だがDIP4のフォトカプラが見つかった。これを使って信号ラインを切り離そう。

回路検討、Markingからフォトカプラの型番がぴったり見つからないけど、シャープのPC817というフォトカプラが名前が似てる…。これを参考に、LED側はVf=1.2V、If=6mA程度で抵抗設定して、ブレッドボードで動作確認。各抵抗等を下記で設定。

PB0のプルアップは200k→50kに変更。(これだとtinyの内部プルアップを使うのと変わらないけど、プログラム書き換えが面倒なので、外部プルアップのままにするw。)
スペース厳しいけど、これでフォトカプラ部の基板を作って今まで作った基板に追加する。

DIP4なので、最小で万能基板の2×4穴は要るけど、さすがにそれじゃ厳しい。3×4穴使う。表はフォトカプラのみ。

裏はSMD部品を無理やり搭載し、出入りの線を4本接続。

なんとかこれが「最小」基板かな?これを何とかケーシングに収まるように搭載すると、こんな感じに完成。

フォトカプラは、両面テープでtinyに張り付けて何となく固定。まあ、何とか配線切れずにもつかな~?

これで机上で試運転→一発OK!
車に搭載して、ちょこっとその辺を5分ぐらい走ってみたところ、まあ問題なさそう。「良くなった」かどうかは、もうちょっと長時間走ってみないと分からないけど、少なくとも悪くはなってなさそう。
そもそも車あまり動かさず、おもちゃ病院と試合(アイスホッケーと野球)に行く時ぐらいしか車使わないので、コロナでどれも中止中で全然車を使わないw。まあいずれ確認して、これでもまだ誤動作発生する様なら、次はWDTによるリセットを考えてみますw。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

5/6 おもちゃ修理3件

2020-05-06 | おもちゃ
ちょっと前に修理した物ですが、知り合いからの頼まれ物他3件の修理報告です。

1件目、「BIGサイズ リトミックダンスアンパンマン」です。

コロナ影響で久しぶりの修理、「張り切って行くぞー!」と思ったのですが、電池の不良だけでしたw。
単三3本の内、1本はまあまあ、1本が半分ぐらい、1本はすっからかんでした。新品電池入れたらちゃんと動きました。

2件目、コカコーラの景品と見受けられます。「コカコーラペーパーギター」だそうです。

名前通り、おもて面は厚紙でできてますw。
電源入れると、「トトトトト」と変な音がします。電池は単4電池3本。テスターの電池チェックモードで確認するとほぼ満タン…。
しかし、同封してあった別の新品電池を入れると…ちゃんと音が鳴るじゃないの!

これは「電池不良!」で片づけよう、と思ったのですが、一応あけてみる。
今回から、欲しかったけどずっと見送っていた「電動ドライバー」の導入です!。

とある日、近所のホームセンターに行ったら、「チョイドラ」という名前で、ちょっと大きめのドライバーぐらいの大きさの電動で、手締めもできるよ、という商品が売ってました。
「これはよさげ!」と、ヤフオクで類似品を探して、吟味の結果、藤原産業の「SK11」を購入。
おもちゃは相手がほとんどプラスチックなので、電動だとトルク掛け過ぎてネジ穴を壊してしまわないか心配でした。買った電動ドライバにはトルクリミットはついていませんが、上の写真のような感じで軽く持って、トルクが掛かったら「クルッ」と手で逃がすようにすれば、締める時のトルク掛け過ぎの心配がありません。
「手締めもできる」との事ですが、手締めにはやはり使い慣れたドライバーの方がいいので、結局最後はドライバーで手締めとしました。

あけてみると、結構ちゃんとした基板が入っている。

外観で特に異常はない…。
テスターでOKな電池なのに、なぜちゃんと動かないのだろう…。電源電圧の不安定を疑って、電源ラインの電解コンデンサを外して確認するも問題なし。パスコンの不良?と、COB近くのSMDコンデンサを1個取り替えてみるも、やはり改善せず…。
「トトトトト」となる電池で、オシロで電源電圧の変動を見てみると、「ト」の所で方形波状に0.3V程度の電圧降下が見られる。ちゃんと動く電池だと、電圧変動はない…。
やっぱり電池の不良。何と言いましょうか…電圧はあるのに内部抵抗が非常に高いというか、「池がすごく浅い」というか…。
結局、基板に異常はなく電池不良の判断で、ケース仕戻し。

しかし、モードとか押してもあまり変化がない…。
ネットで使い方を調べると、曲は3曲あるらしい。それと「フリースタイルモード」があって、曲無しでフレット押さえてコードが弾けるらしい。
曲も含めたモードの切り替えは、モードボタンを長押ししながらフレットで選択との事だが、と~~~き時モードの切り替えに成功して、曲が変わってみたりフリースタイルモードになってみたりするが、フリースタイルモードでも、フレット押さえてもコードがほとんど変化しない。

フレットの感知は…多分タッチセンスじゃないかと思われる。フレット部の分解を試みたが、接着してあって困難だった。
基板とフレキとの接触を疑って、拭いてみたりちょっと磨いてみたりしたけど、改善しない…。

ビニール線の芯線を1本ずつ挟み込んでみることにした。

位置が固定されるように、手前の抵抗(1カ所はレジスト削ってパターン部)に芯線をハンダ付け。これでフレキを挟み込むと、だいぶ改善して、なんとなく曲の切り替えや、フリースタイルモードでのコード演奏ができるようになった。
完璧かどうかちょっと疑問なんだけど、まあほぼ直ったかな?と、これで返却としました。

3件目、これは妻の勤務先である学童のおもちゃです。
何と言う名前のおもちゃでしょうか…「コロコロ迷路」と名付けようw。

もっとちっちゃくて手にもって傾けて玉をゴールまで運ぶおもちゃもありますが、これは「前後傾き」「左右傾き」をツマミで調節して玉をゴールまで運ぶ、ちょっと難しいバージョンです。
フローティングな迷路板が落ち込んじゃってるようです。

前後傾きは正常なのでそちらを見ると、「コマ」が入っていて迷路板をセンターで固定してあります。
左右傾きは、その「コマ」がなくなってるようです。(赤矢印のところ)

ここに、4mmプラ棒と手持ちのプラ端材で作ったコマをはめ込みます。
これでちゃんとフロート状態に復活出来ましたが、ツマミを回しても前後傾きが動かない…。
仕方ない、底板をひっぺがします。

接着剤でしっかりつけてあって、剥がすの大変でした。なんとか見える側のダメージを少なくひっぺがしました。

作りは、シンプルかつ合理的。軸に糸が1周巻き付けてあって、バネで適度にテンション掛けてあり、軸を回すと糸の摩擦力分だけ引っ張られて迷路板が傾きます。これだと、ツマミをグリグリ回しても壊れることがないですね。(ただ、あまりしつこくグリグリすると、糸が摩耗して切れるでしょうけど。)
前後傾き用の(横方向に走ってる)糸は、持ちの悪そうなビニール糸ですが、左右傾き用(縦方向)の糸は、長すぎるタコ糸です。切れて誰かが補修したのではないでしょうか。
ともあれ、長すぎるタコ糸の方を、結び目作ってちょこっと短くしたら、ちゃんと左右傾きも操作できるようになりました。
剥がした底板を木工用ボンドで軽くつけて終了です。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

5/4 自動車用フラッシャーリレー製作

2020-05-02 | PIC・電子工作
いや~、待ってましたGW~。やりたいことが一杯あるのねw。
ぼくの愛車のカプチーノですが、平成4年式→もう28年物!あちこちボロボロなだけでなく、古い車なのもあって不具合な所が多いのよね。

カプチーノは電装系が弱いことで有名。例えば、夜信号待ちで、ヘッドライト付けた状態でウインカーを点けると、ヘッドライトがウインカーの点滅に合わせて明暗変わるし、インパネも明暗する。
電装系の弱さをカバーするため省電力を図るには、とりあえずヘッドライトのLED化が一番効くんだけど、それは結構大変…。そこで、ヘッドライト以外のほとんどをLED化してます。
(ちなみにヘッドライトが55W×2、ウインカーが合計47W(×2:ハザード時)、テールランプ/ブレーキランプ42&10WはLED化済み。インパネ周り:15WもLED化済み。エアコンは絶対に使わないw。)

最初にウインカー球をLEDに替えた際は、電流低すぎ=球切れ判断でハイフラッシュ状態になってしまいましたが、純正のウインカーリレーの中の回路の抵抗を変えて、何とか60Hz程度に調整してました。
しかし、それだとDUTYが50%じゃなくなっちゃったので、次にシャント抵抗を上げて
ハイフラッシュ回避してました。これで数年やってました。

しかし車検の時に「ウインカーが黄色い!」という指摘で車検通らず(「橙色」の決まりらしい…)、車検の時だけ電球に戻して車検を通す、という事になった。
ところが、純正のウインカーリレーは、電流低すぎ検知だけじゃなくて、電流高すぎ検知もしてるようで、LEDでちょうどいいシャント抵抗にした状態で白熱電球に戻すと、DUTY20%ぐらいの変な点滅になってしまう…。

という事で、もう電流監視はせずに、LEDを付けても白熱電球を付けても、どっちでも使えるウインカーリレーを作ってしまおう、という目論見です。
(ちなみに、LED用ハイフラ回避ウインカーリレーも売ってますが、「電子音はイヤ!昔ながらのカッチン、カッチンの方がいい!」とか、LED用のリレー刺した状態で白熱灯に戻すとリレーが壊れる、とかの事情で却下ですw。)

元のウインカーリレーはこれです。(ケース外してます。)

これの端子・基板・リレーを転用して、まるっきり作り変えてしまいます。

前置きが長くなりましたが、マイコン使う手もありましたが、最初「タイマーIC:NE555」で作ろう、と思い、TTLタイプNE555を購入しておきました。マイコンと比べての利点は、
・電源が~15Vまでなので、バッテリーから直でいける。電源を用意しなくていい。
・プログラム作らなくていいw。
…ぐらいかしら。
しかし、3極のフラッシャーリレー、「B」端子に給電したらウインカー点き始めるのかと思ってたけど、調べてみるとそうではないらしい…。
回路図はいろいろあったけど、簡略化して書くと、こんな感じらしい。

メインスイッチを入れる(鍵を回す)と、ウインカーリレーは常に電源供給状態になり、ウインカー灯の側でGNDラインを繋げると、ウインカーが点灯(点滅)する、という構造らしい。
これは困った…。555で電源入れっぱなしの発振回路作って、ウインカーを点けたいときにGND側を接続するだけと、点滅の中途半端な途中から始まって、ウインカーレバーを入れてすぐに点かなかったり、点いたけど瞬間切れて遅れたりとかになってしまう…。これはヤだなぁ…。
Lの端子がGNDに落ちたのを検知して電源を入れて、ランプ点灯中は自己保持する、という回路の例があったけど、ちょっと部品点数が増えすぎな気が…。

そこで、マイコンで作ることにしました。
目指す機能は、
・ウインカーつけると、例えば60Hzなら、必ず点灯0.5秒-消灯0.5秒…の最初から始まる。
・点滅周期は、60~120Hzぐらいの可変にする。
・点灯制御は機械式リレーを転用する。
在庫の余ったPICで作ろうかとも思いましたが、Attiny13aならSOP8を持ってて、そっちの方が小さく作れるので、使用デバイスはAttiny13aにしました。

プログラムにちょっと行き詰ったところでいつもの先輩に相談したところ、全体に渡っていろいろとご指摘を頂き、最終的に回路はこうなりました。

プログラムは後で載せますが、ブレッドボードで動作確認。

今回のSOP8のAttiny13aへの書き込みは、SOP8用アダプタを使いました。

AliでSOP用のアダプタを買おうかずっと悩んでたのですが、他のおもちゃドクターの記事で紹介されてた、SOP8→DIP8変換基板を使って挟み込んでネジで締めるアダプタを作ってみました。これで、基板に取り付けずに書き込みできました。

ブレッドボードでの動作確認は、リレーは付けずに出力にLEDを繋いで模擬。PINB0に繋ぐ「SW入った」検知ラインは赤色LEDを経由してGNDに落して実機を模擬。
プログラムは何度か間違い修正してちゃんと動くようになったものの、LEDをGNDに落しただけではPINB0がLになりませんでした…。
LEDの順方向電圧が乗っちゃって、PINB0の内部プルアップ使用時は、LEDをGNDに繋いでもPINB0=1.65Vで点滅が全くスタートせず。内部プルアップをやめて1MΩの外部プルアップにして1.45Vで、点滅がスタートしたりしなかったり…。
先輩の助言から、プルダウン用の抵抗(回路図の、LEDに並列に入れてる10kΩ)が必要という結論になりました。これだと、12Vブロック用のダイオード(BAV99)の電圧降下を考慮しても、PINB0がちゃんとLになってくれると思われます。
プルダウン時の電流と抵抗の電力とプルアップとのバランス考えて、プルアップは200kΩ、プルダウンは10kΩとして、上述の最終回路となりました。
検知ラインのダイオードは、順方向電圧降下の低いショットキーを使おうかと思いましたが、耐逆電圧の高いスイッチングダイオードを選択しました。(家電基板から取った、Marking:KJEのBAV99を使いました。)

さて、プログラムが完成、いけそうな目途が立ったので、いよいよ、元のリレーの部品を全部取っ払って、作り替えていきます。
残りICだけになった所。

型番調べても出てこない、多分法人専用と思われます。ちなみに、リレーも型番からヒットしません…。

1.27mmピッチのスルーホール基板に乗せますが、限られたスペースで、なかなか頭を使いました。こんな感じの出来上がり。

基板の拡大。

おもちゃ修理で鍛えられて「小さく作るのはお手の物!」といいながら、なかなか大変でした。(あまりキレイじゃないのはご勘弁を…)
基板裏面。

1.27mm基板の方のスペースが厳しくて、検知ラインのダイオードは、こっちの基板裏に付けました。また、リレーコイルの逆起電力からFETを保護するためのダイオードも、基板裏に直付けしてます。(回路図に型番書いてませんが、手持ちであったそれっぽいヤツですw。)

これで、車に付けてたLED取ってきて繋いで動作確認……期待通りに動かない…。
LEDをGNDに落すと、点きっ放し、約0.5秒おきに一瞬切れる、という動き…。
PINB0のH→Lがちゃんとできてない?と、オシロ繋いで確認したりしましたが、これは…、リレーの物理的なSWが遅いので、リレーがOFFになってすぐにPINB0が確実にLになりきってない→時間待ちの追加が必要、と思われます…。
もう「プログラムは完成だ!」と、全部組んじゃった…。けど、まだ間に合う。(というか、これが完成しないと車に乗れないw。)
完全にICSPするように作ってないので、一部配線外し&配線を引き出して、無理やり再書き込みをします!

プログラムに時間待ちを追加して、注意深く配線して、書き込み…一発でOK!

プログラムの最終はこうなりました。

1:  /*
2:  * FlashRelay.cpp
3:   *
4:  * Created: 2020/04/29 10:04:27
5:  * Author : Kohei Murakami
6:  */ 
7:
8:  /*
9:  車載フラッシャーリレー用プログラム
10:  【ヒューズ設定】
11:  ”FEF9”
12:  内蔵オシレータ4.8MHzの8分周無し、BOD無効
13:  ピン数には余裕あるが、RESET無効・低電圧プログラミング無効にしておく
14:
15:  【PIN割当て】
16:  PIN1:NC
17:  PIN2:NC
18:  PIN3:NC
19:  PIN4:GND
20:  PIN5:PB0(INT0)ウインカーSW入り検出、外部pull-up
21:  PIN6:PB1 リレー駆動FET行き出力
22:  PIN7:PB2(ADC1) 点滅速度調節用VR
23:  PIN8:Vdd
24:  */
25:
26:  #define F_CPU 4800000 // 4.8MHz
27:
28:  #include <avr/io.h>
29:  #include <util/delay.h>
30:  #include <avr/interrupt.h>
31:
32:  /* ピン変化割込みハンドラ */
33:  ISR(PCINT0_vect)
34:  {
35:  	//何もしない
36:  }
37:
38:  int main(void)
39:  {
40:  	unsigned char i,volt;
41:
42:  // 初期設定
43:  	PORTB = 0b00000000;	// 全ポートL(内部プルアップ不使用)
44:  	DDRB = 0b00000010;	// PB1のみ出力、他は入力(Hi-Z)
45:  	ADMUX = 0b00100001;	// 基準電圧=Vcc、左寄せ、PB2
46:  	MCUCR = 0b00110000;	// パワーダウンモード、Sleep許可
47:  	PCMSK = 0b00000001;	// PINB0のみ割り込みを許可
48:
49:  // 点滅周期取得のため、ADC1電圧を読み込む
50:  	_delay_ms(20);	// 電圧安定時間を取る
51:  	ADCSRA = 0b11000000;	// AD変換許可、変換開始、自動起動不可、完了割込み不可、分周CK/2
52:  	while(!(ADCSRA & (1 << ADIF)));	// 変換終了まで待つ
53:  	volt = ADCH;	// 値取得(上位8bitのみ)
54:  	ADCSRA = 0b00000000;	// AD変換不可
55:
56:  	/* メインループ */
57:  	while (1)
58:  	{
59:  		// PB0がHならsleepに入る
60:  		if (PINB & (1 << PINB0)) {
61:  			GIFR=(1<<PCIF);	// 割り込みフラグをクリア
62:  			GIMSK = 0b00100000;	// ピン変化割り込みを有効
63:  			sei();	// 割り込み許可
64:  			__asm__ __volatile__ ("sleep");		//Sleep
65:  			cli();	// 割り込み禁止
66:  			GIMSK = 0;			//割り込み無効
67:  		}
68:
69:  		for(;;)
70:  		{
71:  			// 出力ON
72:  			PORTB |= (1 << PINB1); // PB1をHに
73:  			for(i=0;i<=100+volt/2;++i) {
74:  				_delay_ms(2);
75:  				__asm__ __volatile__ ("nop");	// OFFと時間を合わせる
76:  				__asm__ __volatile__ ("nop");
77:  			}
78:			
79:  			// 出力OFF
80:  			PORTB &= ~(1 << PINB1); // PB1をLに
81:  			_delay_ms(100);
82:  			for(i=0;i<=50+volt/2;++i) {
83:  				_delay_ms(2);
84:  				if (PINB & (1 << PINB0)) goto OUT;	// 出力OFF時にPINB0がHならloopを抜ける
85:  			}
86:  		}
87:  		OUT:
88:  		;
89:  	}
90:  }

(あい変わらず「不等号」がちゃんと書けないので、倍角に変えてます。コピー時は注意願います。誰もコピーして使わないと思うけどww。)
81行目が、後から追加した時間待ちです。最初20msにしてましたが、失敗してもう一回書き込みするのはイヤだったので、長めに0.1s取っておきました。これを長くしても、次の消灯中のforループを短くすれば影響なしです。(この0.1sの間は、ウインカーSWを入れたり切ったりしても検知してくれませんが、人間の操作には影響ありませんねw。「切り」は、物理的に切断されるので、切った時に切れが遅くなる心配はありません。)

先輩から「デバイスの省電力を狙わないならsleepの必要ないでしょ?」と指摘されましたが、例えば2時間のロングドライブ、そのうちウインカーを点けるのが例えば30秒×20回。その10分の為に残りの1時間50分プログラムがぐるぐる走ってるのは無駄かなぁ、と思って、必要ないときはsleepにしました。

電源ONの最初に1回だけ、ADCを読み込んで点滅周期を決める作りにしてます。
まあ、言ってみれば単なる「Lチカ」ですが、ADC・sleep等、データシート熟読・先輩にダメ出しされながら、いろいろと勉強になりましたw。

さてさて、再書き込みの為にバラしたのを元に戻して、プルダウンを追加したLEDを繋いで動作確認…バッチリ期待通りの動き!!
後は、実車にて、どこにプルダウン抵抗を入れるか検討・実行すれば完成。

外してきたフロントウインカーとLED。

左はサイド用のウェッジ球。右が前後ウインカーに使ってるLED。
「ウインカーが黄色い!」と言われて車検が通らない、黄色LEDを買ったかと思ってたけど、どうやら白色LEDを買ってたみたい。
点灯させて、HDR(明るさ調整)かけて撮ると

こんな感じですが、明るさ調整なしだと

こんな感じ。プラスチックはある程度橙色なのですが、白が強すぎて黄色っぽくなってしまうようです。LEDの表面をオレンジの油性マジックで塗ってみたけど、ほとんど変わりませんでした。何とかならないかなぁ…。

フロント・サイド・リアと確認しましたが、このフロントウインカーでプルダウン取るのが一番簡単そう。被覆の一部を切って、線間に抵抗を入れます。

あとビニールテープ巻いて終了!実車装着して試運転…、とりあえず走ってはないけど、バッチリでした~!
(5/16:追記)
実車装着して走ってみると、不具合発生しました…。
「5/16 自動車用フラッシャーリレー製作~第2報」にて改造実施です。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする