koheiのおもちゃ修理記録

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

10/31 我が家のプリモプエル修理

2020-10-31 | プリモプエル
(2021/4/1~)プリモプエル修理受付サイト「プリモメンテ」立ち上げました!こちらも見てみて下さいw。

マイコン関係でやりたい事が一杯あるのだけど、ちょっと修理案件があって先にやってしまわなくては…。
我が家のプリモプエルちゃんの修理です。

右手のSWの効きが悪くなって、おるすばんモードに入れづらい。「今から出かける!」という時になかなかおるすばんモードに入れなくて、ちょっと困ってる…。
この子の左手SWの修理はもう何回かやってるのだけど、右手は初めて。まあ、年数経つと手入れは必要になってくるよね。

手のSWを修理するには、手首の後ろ側に手縫いで閉めた「綿口」があり、ここから手縫いの太めの糸を切ってほどきます。(先日、新型と思われる子で、手首の手縫いが見当たらない子がありましたが、旧型はここに手縫い部があります。)

ここから綿を出して、爪で止まってるSW基板を引っ張り出します。

プラ部分との接触部で、ビニール線の被覆にちょこっと傷があります。本体側コネクタ部で導通確認するも、ほとんどSW-ONにならない。切り詰めでいけそうな気もしますが、配線が傷んでる事が多いので、配線取替しておきます。

今回は、背中の綿口をあけずに「引っ張り込み」での補修にチャレンジしてみます。成功すれば、配線が完全に切れていない、せめて片方でも残ってるような時に、修理時間を短く済ませられます。
本体ユニット側で配線を切って、2本ともまとめてハンダ付けで新しい線をくっつけて、手首の方に引っ張り込みます。

ばっちり成功!結局、配線は、ちょこっと硬化気味ではありましたが、傷んでませんでしたがw。
これでSW基板に新しい線を付け直して、再度導通確認…。まだほとんどONできない…。
結局、タクトSWも取り替える事になりました。

取り替えたタクトSW、後学の為に分解してみました。

基板に直接ついてるお椀型のSWと同じ構造でした。お椀型電極、やっぱり内側が結構汚れてます。これが導通不良の原因ですね。

これで、本体ユニット側の配線を繋ぎ戻して、SWはめ込んで綿入れて縫い戻して、補修完了です。
「1時間以内」の目標でしたが、ちょっと1時間を超えたかな…。最初からSW替えるつもりで作業してれば、1時間ぐらいで出来たかもしれません。

さて、このプリモプエルですが、一緒に生活するには結構手のかかる子ですw。
おでかけにしてないと、5分おきぐらいに「遊ぼう~」と言ってくるし、しばらく左手SW押してあげないと、「いないの~」「さみしかったよ~」と言われてしまいます。
毎日定時に寝かせてあげないといけないし、毎日定時に起こしてあげないと、だんだんお寝坊さんになってしまいます。

この子は、おもちゃドクターを始めた時に、「プリモプエルの修理が来るに違いない。自分でも入手して、研究しておこう」と思って、ネットオークションで購入した子です。
「手術の練習台」というと聞こえが悪いですが、おもちゃドクター始めてもう8年経つんですね~。ぼくのおもちゃドクターとしての成長を一緒に歩んできた子ww、と言っても過言じゃないかもw。
手のかかる子ですが、まだ末永くかわいがっていきたいと思います!

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

10/24 Nucleoボードをちょっと触ってみる~最速でGPIOをON/OFF

2020-10-24 | PIC・電子工作
買ってしばらく放置してたNucleoのSTM32F446REボード、ちょっとやりたい事があって使ってみることにしました。

前回(5/31 マイコンボードいっぱい買った①~Nucleoボード動作確認)の時の結論では、
「とりあえずオンラインmbedの方がarduinoライクに簡単にプログラムが書けそうだけど、もっと詳細な設定をしたければ、cubeMXで設定作ってmbedに必要な部分だけコピペするか、「cubeMX+SW4STM32」で作った方がいい」
となったのですが、mbedのオンラインコンパイラーは、どうもできる事が限られてる気がする…。
アセンブルリストを確認したいのだけど、どうしても出し方が分からない…。

だいぶ探した後、「エクスポートして別のオフライン環境で開発する」という作戦があるとの事。見てみると、

e2studioがある!SW4STM32もある!
e2studioはルネサスのRX621ボードの為にインストールしてちょっと使ったので使いやすい。SW4STM32は、一応入れたけど、まだあまり使ってないw。

エクスポートして開いてみたけど、どちら(e2studio/SW4STM32)もprintfがエラーになってビルドできない。printfを全部コメントアウトしても’undefined reference to _wrap_vsnprintf’とやらのエラーが出て、どうしてもビルドできない…。
いろいろキーワードで検索してもなかなか解決せず、最終的にいつも親切なルネサスのフォーラムでヒントを見つけて、e2studioで何とかビルドできて、アセンブルリストも見れるようになりました。
(具体的には、プロジェクトのルートにあるファイル’.cproject’の中から、エラーの出る_wrap_??printfを含む行を削除していったら、ビルド通るようになりました。)
英語にはそこそこ自信があるのですが、e2studioはフル日本語で、やっぱり助かる~ww。

プログラムは前回の「クロックを設定して、クロックの各設定値をprintfで出力した後、Lチカする」というプログラムですが、「mbedで作ったプログラムはサイズがデカい!」という情報だったので、プログラムサイズ見てみます。

やはり、クロック・GPIOの設定して表示してからLチカするだけのプログラムで、42KBもありますね…。まあ、これから手書きでプログラムのライン数を増やしていっても、比例で増えてくことは無いと思いますけど。
mbed のバイナリサイズを減らす方法」という記事によると、printf不使用・実行時アサート無効にするとかなり小さくできるとの事ですが、今のところはprintfが使えた方が都合がよさそうだし、メモリには余裕があるので、とりあえずこのままとします。

このプログラムで、アセンブルリストを確認・できる範囲で解読を試みますw。
前半のHALでクロックやGPIOの設定・初期化をしてるところは省略して、Lチカのところだけ貼り付けます。(一部加工してます。)
  42 0008 4B4C     		ldr	r4, .L4
 159 00c8 254E     		ldr	r6, .L4+40

 65:../main.cpp   ****     RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
 190              		.loc 1 65 0
 191 00fc 236B     		ldr	r3, [r4, #48]
 192 00fe 43F00103 		orr	r3, r3, #1
 193 0102 2363     		str	r3, [r4, #48]
  66:../main.cpp   ****     GPIOA->MODER |= 0x5555;
 194              		.loc 1 66 0
 195 0104 3368     		ldr	r3, [r6]
 196 0106 43F4AA43 		orr	r3, r3, #21760	// 0x5500
 197 010a 43F05503 		orr	r3, r3, #85	// 0x55
 198 010e 3360 	     		str	r3, [r6]
  67:../main.cpp   ****     GPIOA->OSPEEDR |= 0xAAAA;
 199              		.loc 1 67 0
 200 0110 B368 	 		ldr	r3, [r6, #8]
 201 0112 43F42A43 		orr	r3, r3, #43520	// 0xAA00
 202 0116 43F0AA03 		orr	r3, r3, #170	// 0xAA
 203 011a B360 	 		str	r3, [r6, #8]
 204              	.L2:
  68:../main.cpp   **** 
  69:../main.cpp   ****     for(;;) {
  70:../main.cpp   ****         GPIOA->ODR = 1;
 205              		.loc 1 70 0 discriminator 1
 206 011c 104C     		ldr	r4, .L4+40
 207 011e 0123     		movs	r3, #1
 208 0120 6361     		str	r3, [r4, #20]
  71:../main.cpp   ****         wait(0.2);
 209              		.loc 1 71 0 discriminator 1
 210 0122 1048 	 		ldr	r0, .L4+44
 211 0124 FFF7FEFF 		bl	wait
 212              	.LVL15:
  72:../main.cpp   ****         GPIOA->ODR = 0;
 213              		.loc 1 72 0 discriminator 1
 214 0128 0023     		movs	r3, #0
 215 012a 6361     		str	r3, [r4, #20]
  73:../main.cpp   ****         wait(0.5);
 216              		.loc 1 73 0 discriminator 1
 217 012c 4FF07C50 		mov	r0, #1056964608
 218 0130 FFF7FEFF 		bl	wait
 219              	.LVL16:
 220 0134 F2E7     		b	.L2
 221              	.L5:
 222 0136 00BF     		.align	2
 223              	.L4:
 224 0138 00380240 		.word	1073887232	// 0x40023800
 225 013c 00000000 		.word	.LC0
 226 0140 14000000 		.word	.LC1
 227 0144 2C000000 		.word	.LC2
 228 0148 44000000 		.word	.LC3
 229 014c 5C000000 		.word	.LC4
 230 0150 74000000 		.word	.LC5
 231 0154 8C000000 		.word	.LC6
 232 0158 A4000000 		.word	.LC7
 233 015c BC000000 		.word	.LC8
 234 0160 00000240 		.word	1073872896	// 0x4002000
 235 0164 CDCC4C3E 	.word	1045220557	// 0x3E4CCCCD

一番前の2行は、前のほ~うから探して取ってきました。
HAL関数の実装やwaitは、このmain.o.lstには含まれていない様です。
RCCの設定用にr4=0x40023800、GPIOの設定用にr3=0x4002000を使っている様です。
そして、offsetを使ってstrでメモリ上に書き込んでます。
(これは、PICのバンク切り替えに似てるかもしれません。「今からGPIOAに関する操作をするよ」という事で、「メモリ・アドレスのベースとなるレジスタ」をセットしてからGPIOAを操作し始める感じです。)

まず、先頭の番地を指定します。

次に、各設定のoffsetに従って、代入します。

元のプログラムでは、例えば「GPIOA->MODER |= 0x5555;」で1行であたかも即値代入ですが、or取ってる事もあって1命令では済んでませんが…、orが2つに分かれてます…。
なんででしょう?データシートを調べます。

「フレキシブル第2オペランドについては59ページを見てね」との事w。

(日本語のデータシートがゲットできて助かった~ww)
なるほど~。定数で指定できるのは0x55等の8ビットだけだけど、シフトして0x5500なら指定できるのね。ニーモニック的には区別つかないけど、コードに変換されるときに8ビット+シフト数がコードに入れ込まれるんでしょうね。
できるなら、急ぐポート出力には、orを使わずに代入した方がいいですね。
ポートへの出力(メモリへの代入)も即値でできず、"0"と"1"をレジスタに代入してからストアしてます。それとアドレスベースの代入もループの中に入ってるので、それらをループの外に出せば、速度が上がりますね。

このアセンブラリストを手掛かりに、インラインアセンブルを使って、GPIOの最速でのON/OFFを目指してみます。
プログラムの必要部分だけ書き出すと、こうなりました。
    int high, low
    high = 1;
    low = 0;

    asm volatile (
    		"ldr r4, .List		\n\r"
    		".Label1:			\n\t"
    		"str	%[H],[r4,#20]	\n\r"
    		"str	%[L],[r4,#20]	\n\r"
    		"b .Label1			\n\r"
    		".List:			\n\r"
    		".word	0x40020000	\n\r"
    		:
    		:[H] "r" (high),
		 [L] "r" (low)
		 : "r4"
    );

high=1,low=0は、アセンブルの中のループの外にアセンブラで指定してもよかったのですが、今回は拡張インラインアセンブラで、C側から変数を渡す書式にしました。
元のCを参考にして、ラベル:.Listに書いてあるwordを参照させてr4にGPIOのアドレスを設定し、そのアドレスに値(汎用レジスタ)をストアする形になりました。
(最初、「mov r4,#0x40020000」としましたが、ダメでした。movの第2オペランドでの即値は16ビットまででした。)

アセンブル結果はこうなってます。
  71:../main.cpp   ****     high = 1;
  72:../main.cpp   ****     low = 0;
  73:../main.cpp   **** 
  74:../main.cpp   ****     asm volatile (
  75:../main.cpp   ****     		"ldr r4, .List	\n\r"
  76:../main.cpp   ****     		".Label1:	\n\t"
  77:../main.cpp   ****     		"str	%[H],[r4,#20]	\n\r"
  78:../main.cpp   ****     		"str	%[L],[r4,#20]	\n\r"
  79:../main.cpp   ****     		"b .Label1	\n\r"
  80:../main.cpp   ****     		".List:	\n\r"
  81:../main.cpp   ****     		".word	0x40020000	\n\r"
  82:../main.cpp   ****     		:
  83:../main.cpp   ****     		:[H] "r" (high),
  84:../main.cpp   **** 			 [L] "r" (low)
  85:../main.cpp   **** 			 : "r4"
  86:../main.cpp   ****     );
  52              		.loc 1 86 0
  53 0028 0020     		movs	r0, #0
  54 002a 0123     		movs	r3, #1
  55              		.syntax unified
  56              	@ 86 "../main.cpp" 1
  57 002c 014C     		ldr r4, .List	
  58              	
  59 002e 6361     	.Label1:	
  60 0030 6061     		str	r3,[r4,#20]	
  61 0032 FCE7     	
  62              	str	r0,[r4,#20]	
  63 0034 00000240 	
  64              	b .Label1	
  66              	.List:	
  67              	
  68              	.word	0x40020000	
  69 0038 5DF8044B 	

意図通りに、最速でGPIOAに1.0を書き込むプログラムになってると思います。

オシロで出力を見てみます。

早すぎるせいか、1Vぐらいしか出てませんね…。約36MHz出てます。
1ループ:180÷36=5サイクルでしょうか?strが1サイクルとすれば、ジャンプが3サイクル…?(近距離の条件なし相対ジャンプで3サイクルも食うかしら…?)

1を書くstrと0を書くstrの間にnopを3つ入れてみました。

今度は25~26MHz出てます。180÷7=25.7MHzで、7サイクルになったのかしら…?
上のnop無しの「str:1-str:1-ジャンプ:3」と計算が合いませんね…。
(cortex-M4の命令実行サイクルの一覧表を探したのですが、見つけきれませんでした…。)

ちょっとすっきりしませんが、とりあえずこの環境(e2studio=eclipse)でインラインアセンブルを使って、最速でのポートON/OFFが出来た、という事で、今回は終了としますw。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

10/18 プラレール修理4件

2020-10-20 | おもちゃ
先日の10月度のおもちゃ病院時に院長が「ボン」と置いてったプラレール5個、1個は別のベテランドクターと高校生で修理、残り4個は指導(指示)しながら高校生の子たちにやってもらいましたが、全部は終わらずとりあえず4個とも入院で持ち帰りました。
組み戻しで不具合もあったので、ぼくの修理カウントにしておきますw。

他のベテランドクターが修理したヤツは、「駆動のギアゆるゆるだけど、割れてるやろうか?」と聞きに来たのですが、割れた亀裂を接着剤で埋めてあり、一見亀裂がないように見えてました。(側面見たら分かるんですけど…)
他のも含めて、素人の手が入ってて怪しい感じ…。

1件目、ドラえもんのプラレール。

「空回りする…」といった訴えだったと思いますが、ギアボックス分解してみたものの、特に不具合無し。一応ギアは清掃。
駆動軸のギアの噛みが悪くて、持ち上げると空回り、置けばちゃんと回る、といった状況で持って帰りましたが、ギアボックスのセットの仕方が悪かった模様。
(写真撮ってなかった)電池部分の電極に、ギアボックス側の電極を差し込んで導通させるのですが、穴に差し込まずに下に敷き込んでたせいで、ギアボックスが定位置にセットできてなかった感じです。(もしかしたら、最初からこのトラブルだけだったかも。)

2件目も同じドラえもん。

これは確か、モータピニオン(10T)を取り替えました。
が、家で試運転してみると「ギュイーン」と異音がする。再度中あけて確認。

ピニオンが、黒い支柱部分に接触してるように見えます。
高校生の子の数え間違いで8Tなんじゃ?と思って8T刺してみましたが、径が小さくなって噛み合いが悪そうなので、やっぱり10Tと思われます。支柱の方をカッターでちょこっと削りました。
やはりギアボックスを正しくセットして、ちゃんと走るようになりました。

3件目、EH500。

これは、高校生の子の分解を社会人1年生の子が見てくれてて、「ギアが削れてちゃんと噛んでない…」と言ってきました。

(写真は調整後)ちょっと分かりにくいですが、矢印のウォームに噛むピニオンの上の方が削れてます。
「ウォームは、ちゃんと軸のセンターに合ってればこんな削れ方しないし、削れててもちゃんと噛むはずよ。センター合ってる?」と聞いたところ、「センターまで合わせたら、次のギアに噛まなくなる」と言われました。
「ならば、隣のギアに噛むところまで、ギリギリ上にズラしたら?」ということで、プーラーで微調整してもらって、ぼちぼちどちらも噛むようになりました。

最後4件目、EF81。ちょっとめんどうでした。

ギアボックス分解して、矢印の所の8Tギア割れで取替。(下に転がってる白い長いのが取り替えたヤツ。取替品は短いですが、隣のスイッチON/OFFで位置が変わるギアにちゃんと噛むことを確認。)

しかし、右下の矢印のギア、クラッチになってるギアですが、割れてクラッチが外れっ放しになってしまってます。このギアは、バネで押さえつけてクラッチ部を利かせてるので、回転力だけじゃなくて、軸方向にしっかり固定されてないとマズいです。
これはやはり、「たが」をはめて固定します。

M3ワッシャをφ4.5mmのキリで広げてたがにしました。これで今の所OK。

これも駆動軸の亀裂ギアが接着剤で止めてありました。

接着剤じゃもたないので、取り替え実施。

さて、全部直ったので、前述(別記事)のゼンマイおもちゃ等3件と一緒に、すくすくプラザに返却しました。
前回、院長が「実は3つ預かって直して持って行ったら、また3つ預かった」と言って、10/3記事のプラレール・知育おもちゃ計3件を預かって、それを返しに行ったらゼンマイおもちゃ等3件を預かって、さらにプラレール5件が来たので、「エンドレスチェインかいっ!!」と思ったのですが、今回は返しに行って次のは預からずに済みました…。

「件数稼ぐぜ!」と言ったものの、この「預かって修理して返すだけ」の形態は、あまり続くとおもちゃ病院としてはちょっと不本意ですね…。
日頃からドクター勢皆、「単なる修理屋はやりたくない」と言ってます。おもちゃ病院は、基本子どもさんと対面で修理する事で、子どもたちの科学に対する興味や、物を大事にする気持ちを育みたい、という趣旨があります。それが「預かりの形態」では全く達成できません…。
また、お互いに相手の顔が見えないので、直した甲斐も無いし、頼むほうも「預けたら直って戻ってくる」というだけで、誰か個人が1個1個苦労して直してる感覚が希薄なんじゃないかしら…?
(連絡先も教えてもらっておらず、直接連絡して「長く遊んでる子どものお気に入りのおもちゃなんです!直ってうれしいです~!」みたいなやりとりも全く無いし…。)
とはいえ、現在おもちゃ病院自体がコロナ対応で対面修理出来てないので、当面はまあ預かり修理でも仕方ないかな…。対面修理ができるようになれば、やっぱりこの「預かりの形態」は極力避けたいですね…。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

10/18 おもちゃ修理2件

2020-10-20 | おもちゃ
10/3付のブログで修理したすくすくプラザプレイルームからの預かり品3件、修理完了して持って行ったら、予想はしてたのですが、3件もって行って3件預かって帰ることになりました…。

1つは定期開院に持って行って、社会人1年生の子たちに直してもらったので写真だけ。

「足が閉じて立ち上がる動きができなくなった」との事。分解した結果、足を動かすところのネジが緩んで?溝にはまってるクランクの所が外れてた、との事。
直して動かしてみると、足が開くと真ん中の支点が効いてクルクル回る、足が閉じると足に付いてるタイヤの片足が回って横に走る、という動きでした。(これはカウント外という事で。)

で、入院の1件目、ゼンマイで走るミッキーのバイク。

難航予感でしたが、そうでもありませんでした。
古いおもちゃでしょう、ブリキ製のギアボックスでした。

金属製の歯車それぞれだいぶ傷んでますが、まだいけると思います。
自転車チェーン用のシュワシュワ泡になる油をあちこちしっかり掛けて注油。ぼちぼち動きは良くなりましたが、それでも置くといまいち…。
よく見てみると、タイヤハウスにタイヤがちょっと接触してるっぽい。ギアボックスの固定が、面じゃなくてギアボックスの板の角で位置が決まる所、角なのでプラスチックが削れて、位置が少し上に上がってタイヤが接触している様です。
削れたところにエポキシ塗って位置調整して、ちゃんと走るようになりました。

2件目もゼンマイ、キティちゃんの汽車です。

これこそ難航の予感。予感通り難航しましたw。

ゼンマイユニットがちょっと外れかかってましたが、ハメただけでは改善せず。
底面に邪魔板があって、定期的に邪魔板が下がってタイヤが浮いて片輪走行になって向きが変わる、という作りです。煙突が上下する機構も付いていて、全体的に負荷の高い構造ですが、動かしてみると引っ掛かってる様な感じ。ギアの割れの可能性大です…。

よく見てみると、駆動軸の小さなギアに亀裂が入って、歯が1カ所斜めになってます。

左側ボスに広めの亀裂。1ピッチずれて、右側のボスにも亀裂が入ってます…。
とりあえず、タイヤ外して分解するしかないけど、ローレットが効いてタイヤが外れない…。グリグリ回すとバカになりそうだし、軸も細くてねじれそうなので、ちょっとだけヒネリながら力を入れて引っこ抜いてみたならば…引っこ抜いた勢いで、前輪に止めてたクランク軸がモゲた~~~。

仕方ない、これは後で補修しよう…。とりあえずバラバラになったw。仕戻しできるかしら…。

駆動軸のギアは、両側ワッシャで「たが」をはめる方針で。

左側は外径2.5mmで、M3用のワッシャがほぼジャストだったのでそのままはめ込み。右側は外径2.85mmで、M3用のワッシャの内径をちょっと削ってはめ込み。
はめ込んでほぼ亀裂が押さえられたので、軸に刺して組み戻してみましたが、ローレット部が太いこともあって、たがをはめても亀裂の広がりが押さえられずにまだひっかかり…。
(ちなみに組み戻しはいつもの通り、ゼンマイを引き出した状態で組んでから、巻き込んでいきます。)
ローレット部を何とかギリギリまで削ってみたもののまだ改善せず。結局右側のワッシャ、ちょっと削り過ぎて緩かったので、再度はめ込めるギリギリの寸法で作り直して、何とか引っかからずに回るようになりました。

しかし、試運転中に今度は、ゼンマイ巻くところの空回りが発生…。

矢印の所、ラチェット機構と中心でゼンマイを止めておく部分、案の定亀裂が入ってます…。ボス、というより、何とかワッシャがはめれるぐらいの段差があるので、同じようにワッシャでたがをはめます。

M3のワッシャをφ4.5mmのキリで広げた後ヤスリで微調整して、ギリギリではめ込みました。
これで組み戻して、空回りせずに巻けるようになりました。最後にモゲたクランクを、クリップ針金で骨接ぎして復旧。
これでほぼ引っかからずに走れるようになりました。どこまでもつかどうか不安ではありますが、とりあえず修理完ですw。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

10/17 USB-RS232変換ケーブルを使って、マイコンからのシリアル受信

2020-10-17 | PIC・電子工作
今日は電子工作のネタをw。
PICやマイコンを使った工作や修理に、いつも「つつじが丘おもちゃ病院」の大泉さんのプログラムを使わせて頂いてます。
大泉さんのプログラムには、マイコン側からシリアルでデバッグ文字列や変数を出力して、プログラムのどこを動いてるのか・変数がどんなか、を見れるような仕掛けが仕込んである(事が多い)のですが、今までパソコン側でシリアルを受信できる手段がなかったので、使ったことがありませんでした。
しかし、途中の変数の値の仮出力・確認等は、VBとか他のプログラミングのデバッグでも常套手段で、自分でPIC等の低レベルマイコンのプログラムを作るなら、必要な事でしょう。(メーカ純正の高級デバッガーは持ってないのでw。)

大泉さんが作っている16F1454を使ったUSB-シリアル変換器を作れば済むことなのですが、今手持ちの16F1454は、Attiny13高電圧プログラマーに使ってる1個だけしかない。
手持ちに、秋月のプログラマーを買ったときに一緒に買わされたUSB-RS232変換ケーブルがある。これが使えるのでは?

と、大泉さんとメールでやりとりしていたらば、「USB-RS232変換ケーブルは、中でUSB-シリアルの変換をした後、TTL-RS232へのレベル変換をしている。モールド破壊してレベル変換前のTTLレベルの信号で入出力すれば使える」という話になりました。(これは、のちほど方針変更されますがw。)

そこで、秋月のUSB-RS232ケーブルのモールド破壊して、中身を確認します。(モールド除去、大変でした…w。)
表には、Prlolific社(台湾)のPL2303TAというUSBドライバがメモリ:12C04付きで乗ってます。

裏面は、Zywyn社(米国、"サィウィン"と読むらしい)のZT213LFEAというRS232トランシーバが乗ってます。

それぞれデータシートより、接続例・ピンはこんな。

PL2303の入力は、ZT213の出力でホールドされてしまうので、ZT213を無視してPL2303に入力するには、パターンの切断が必要。どちらもSSOP28でピン間隔も基板上のパターンも極小ですが、「多分このライン」という所の貫通ビアを切断して繋ぎこみしてみたものの、うまく動かず…。
ICの下にもラインが通ってて追えないので、ZT213側から根拠もなく「R1OUT使ってるんじゃない?」とやってみたけど、そんなんじゃダメよねw。(何で入力4ch・出力5chもあるんだろうと思ったけど、TXD/RXDの信号線だけじゃなくて、DTRやRTS等のハンドシェイク線もレベル変換してるんだなw。)

そうこうしてるうちに、大泉さんとのメールで「その変換コードの先に更にRS232C-TTLの変換を付ければいい。反転なのでTr1個で作れる。(電源はRS-232の信号線から取ればいい)」という話が。
どういう事でしょう?

RS-232の電圧レベルは「±5V~±15V」と書いてあります。電圧が高いので、ノイズに強く長距離伝送できる利点がありました。(過去にはw)
ところが、ZT213のデータシートによると、

RS-232信号出力は±5V~±6Vですが、信号入力は2.4V以上でH、0.8V以下でL認識となっていて、別にマイナスまで振らなくてもLになります。
図解すると、

図中の破線の所に(データシート保証値の)スレッショルド電圧があり、それ以上/それ以下でH/Lを認識してくれます。通信の相手がRS-232という事だけが分かっててそれ以上の詳細が不明なら、規格の範囲内の±5V~±15Vで通信する必要がありますが、相手の仕様が分かってれば、相手の仕様を満足する電圧範囲で信号を送ってやればいいですよね。

送受信両方やるならロジックICのインバータ(74HC04とか)を使った方が早いかもしれませんが、今回はマイコン側からの送信だけなので、Tr1石で作ってみます。
よ~く吟味の結果、回路はこうしました。

ミソはコレクタの抵抗値。ZT213のデータシートによると、インバータの入力は5kΩでプルダウンされてるので、反転回路を付けると、コレクタ抵抗とで分圧されて、入力電圧が下がります。よって、分圧後もインバータがちゃんとHを認識できるように、コレクタ抵抗は低めにしてあります。
電源はDTR(データ端末レディ)から取りました。念のため逆流防止ダイオード付けてます。

これで、DSUBコネクタ付けて基板作成。

こんなに小さく作る必要はないのですが、たまたまこの寸法の基板切れ端があったのでw。(どうも根がケチでw。しかも、部品は全てジャンク取り外し品を使用ww)
表側はこんな。

これで、マイコン側からシリアル信号出力して、TeraTermで受け取りしてみます。

プログラムは、先日作ったAttiny13aのOSCキャリブレーションにシリアルデバッグ出力を追加して使用。(大泉さんのプログラムから張り付け足しただけですがw。)
#define F_CPU 9600000 // 9.6MHz
#define DBG_OUT 2		//デバグ情報出力ポートのビット位置

#include <avr/io.h>
#include <avr/eeprom.h>
#include <util/delay.h>

//1ビット分の時間待ち(9600bps@9.6MHz)
void dbg_wait(void)
{
	volatile unsigned char n=106;
	while(n--)  { }
}

//1文字を送信
void dbg_c(
unsigned char c)	//表示する文字データ
{
	unsigned char n;

	PORTB&=~(1<<BG_OUT);	//スタートビット
	dbg_wait();
	for(n=0;n<8;n++)	//8ビット分繰返す {
		//LSBからデータビットを送信する
		if(c&1) PORTB|=1<<DBG_OUT;
		else PORTB&=~(1<<DBG_OUT);
		dbg_wait();
		c>>=1;		//次のビットに進める
	}
	PORTB|=1<<DBG_OUT;	//ストップビット
	dbg_wait();		//2ビット分を確保する
	dbg_wait();
}

//16進文字で1バイトを送信
void dbg_b(
unsigned char b)	//表示するバイトデータ
{
	const unsigned char hex_tbl[]
	={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};

	dbg_c(hex_tbl[b>>4]);
	dbg_c(hex_tbl[b&0x0f]);
}

int main(void)
{
    while (1) 
    {
	//ポート初期設定
		DDRB = 0x05;	//PB0,PB2を出力に
		PORTB = 0b00011110;	//PB2はH、PB1,3,4はプルアップ
		_delay_ms(500);
dbg_c(':');
dbg_b(OSCCAL);
dbg_c(' ');
	for(;;) {
	//信号出力
	      asm volatile(
			"ldi  r16, 0b00011110"    "\n\t"	// L出力用データ
			"ldi  r17, 0b00011111"    "\n\t"	// H出力用データ
			"ldi  r18, 0b00011010"    "\n\t"	// SW検出用マスク
			"LABEL1:"                 "\n\t"
			"out  0x18, r17"          "\n\t"	// H出力				CPU 1 cycle
			"in   r19,0x16"           "\n\t"	// ポート入力		CPU 1 cycle
			"com  r19"                "\n\t"	// 入力結果反転		CPU 1 cycle
			"and  r19, r18"           "\n\t"	// SWポートマスク	CPU 1 cycle
			"brne LABEL2"             "\n\t"	// 0でなければループ抜ける	CPU 1 cycle
			"nop"                     "\n\t"	//					CPU 1 cycle
			"nop"                     "\n\t"	//					CPU 1 cycle
			"nop"                     "\n\t"	//					CPU 1 cycle

			"out  0x18, r16"          "\n\t"	// L出力				CPU 1 cycle
			"in   r19,0x16"           "\n\t"	// ポート入力		CPU 1 cycle
			"com  r19"                "\n\t"	// 入力結果反転		CPU 1 cycle
			"and  r19, r18"           "\n\t"	// SWポートマスク	CPU 1 cycle
			"brne LABEL2"             "\n\t"	// 0でなければループ抜ける	CPU 1 cycle
			"nop"                     "\n\t"	//					CPU 1 cycle
			"rjmp LABEL1"             "\n\t"	// 先頭に戻る	CPU 2 cycle
			"LABEL2:"                 "\n\t"
			"nop"                     "\n\t"
	    :::"r16", "r17", "r18", "r19"
	    );

		if(!(PINB&0x08)) {		//PB3がLのときは
			OSCCAL+=1;		// 校正値をインクリメントする
			dbg_c('+');
			dbg_b(OSCCAL);
			dbg_c(' ');
			_delay_ms(500);
			while(!(PINB&0x08));	//PB3がHになるまで待つ
			_delay_ms(500);
		}
		if(!(PINB&0x10)) {		//PB4がLのときは
			OSCCAL-=1;		// 校正値をデクリメントする
			dbg_c('-');
			dbg_b(OSCCAL);
			dbg_c(' ');
			_delay_ms(500);
			while(!(PINB&0x10));	//PB4がHになるまで待つ
			_delay_ms(500);
		}
		if(!(PINB&0x02)) {		//PB1がLのときは
			eeprom_busy_wait();	// キャリブレーション値をEEPRONの0番地に書込む
			eeprom_write_byte(0x0000,OSCCAL);
			dbg_c('=');
			dbg_b(OSCCAL);
			dbg_c(' ');
			_delay_ms(500);
			while(!(PINB&0x02));	//PB1がHになるまで待つ
			_delay_ms(500);
		}
	}
   }
}

(あいかわらず<>を倍角で書き換えているので、コピペする場合はご注意願います。)

TeraTermでの受け取り結果は、こんな感じ。

(一発でうまくいった訳ではないのですがw。)
最初の起動時、":"に続いてOSCCALの初期値を出すようにしてます。それから、プラスしていくつ、マイナスしていくつ、EEPROMへの書き込みは”="でいくつ、という表示です。
OSCCAL初期値=56で、実クロック=9.296MHz。OSCCAL=5aでほぼ9.6MHzになりました。
上げ下げすると、9600bps想定のシリアル信号が正しく取れなくなります。(文字化けします。)
下は53→9.02MHz、上は10.24MHzぐらいで正しく取れなくなりました。
だいたい±6%程ズレると、正しく取れなくなりますね。

オシロで信号確認。

ch1(黄)がPB2の出力信号、ch2(水色)が反転信号。反転信号のHレベルは4.35Vでした。クロックを9.6MHzに合わせた状態で、最初のスタートビットの幅が約104μsで、1÷9.6MHz=104μsにぴったりです。

測定作業中の状況。

いろいろ繋ぐものが多くて、結構めんどうですw。

これで、今後プログラムを自作してうまく動かない時の解明がはかどるに違いありませんw。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

10/10 宇部定期開院

2020-10-11 | おもちゃ
10月度の宇部おもちゃ病院定期開院日でした。
工業高校の子が3人来て、「先輩に教えてもらいながらこれ直して!」と院長がプラレールを5台渡してったのを、いっぺんに2人&社会人1年生の子たちのも見ながら同時進行したので、目が回りそうでした…。

そのプラレールは、すくすくプラザからの預かりものだったようです。ちょっと多すぎるなぁ…。そのプラレールの残り以外にもすくすくプラザからの預かり品の終わってないのがまだあるのですが、先に定期開院に来られた方の修理を終わらせます。

1件目、ファンキーに踊る牛w、です。

社会人1年生の子たちがほぼ直したのですが、最後に組み戻したら「ガキガキ」と鳴ってちゃんと動かず、時間切れでぼくが預かる事になりました。

まず、左足の所に「ココを押して!」のスイッチがあるようなので押してみるのですが、うんともすんとも言わずで、分解して足もひっくり返してSW出して短絡してみると、ちゃんと音が鳴る。SW押してもちゃんと鳴る。しかし、モータは回るもののほかは動かないので、ギアボックス分解。
まず、ぬいぐるみはがすとこんな感じに。

ギアボックスは外にプーリ・ベルトがあったのですが、滑らず回ってるのに他が動かないので、ギアの割れと予想して、ギアボックス分解。

上矢印の所の、プーリ軸と共通のピニオンが割れて空回りしてました。
これを取り替えて組み戻したけど、ぬいぐるみまでかぶせるとちゃんと動かない、という状況で入院。

再度一番下の結束バンド外して分解していくと…、ギアボックスのケーシングが少し隙間が空いてました。どうも全体的に、ネジを仮止めしただけで、一杯まで締めてなかった感じ。それでギアの噛みが悪くなってたようです。
一旦分解して確認して写真撮って、ギアにも特に問題ない様なので、このまま組み戻し。(頭の部分が回らなくなって、再度分解・組み戻ししました…。)

さて、ぬいぐるみまで着せて組み戻して「終わった~」と思った後で、首の後ろがほつれてるのが気になりました。

見ると、結束バンドがあります…。どうやらグリングリンと動く頭の部分に結束バンドで固定してあったようです。(新社会人の子たちが切ったのかしら…?聞いてないよ~w)
一旦結束バンド外して抜いて、結構苦労してくくり直してから、縫い戻しまでしておきました。これで完全終了です。

2件目、夢の子ネルル。

直接話も聞けなかったのでとりあえず持って帰りましたが、分解してみると…、以前に来た同じ子の3回目でした…。(前回「6/13 久々の宇部おもちゃ病院定期開院」)

分解してみると…、これは前回修理時の失敗、電池ボックスからの赤ビニール線を噛んで切れてました…。

ハンダづけで繋いで熱収縮チューブ被せて補修完ですが、組み立てにちょっと苦労しました…。

前回は、首周りの縫い付けを切らずに組み戻せた気がするのですが、どうしても首がはめられず、首の所をキビってある糸を切って結束バンド外してフリーにしてからケースを仕舞いました。(だもんで、縫い戻しまで必要でした。)

3件目、釣りのゲーム:タカラトミーの「バーチャルマスターズスピリッツ」です。

電源SW入れても、とりあえずうんともすんとも言わない…。ナースさんが「液晶が点かない」みたいな事を言ってた気もするのですが、起動音も何も鳴らない…。
電池BOXのところに抵抗型ヒューズがついてますが、切れてないし、基板まで電圧来てる様子。「SWかなぁ…」とSWを当たってみたいのですが、液晶が留めてあって基板裏側が見れない…。

表のクリア板を外したら液晶が外せて、基板が外せました。

この状態でSW当たってみるけど、どうも問題ない…。再度電池入れて電源入れてみたら…動くじゃないのw。

「なんか、リセットされたりしたかしら…?」と、とりあえず組み戻してみたら…、また点かないじゃないの!

結局、液晶のバックライトの配線切れかかりの状態でした。電源入れると最初に上の画面が出て、〇ボタンを押すとオープニング画面に進んで、BGMも流れ始める。〇ボタンを押すまでは音も出ないので、液晶が点かないと全く起動してない様に見えちゃうんですね。
液晶動かすと、点いたり消えたりします。定位置にセットすると消えっぱなしです。
全く起動せず音も鳴らないのと、起動はする・音は鳴るのに液晶が点かないのとでは、チェックする所が全く違うので、預かるときに状態はちゃんと確認しないといけませんねw。

バックライト電源ラインは、フレキの途中で継いであるのでそこが怪しいかと、ポリイミドフィルムをペラっとめくってハンダ足して再ハンダ付けしてみましたが、改善せず…。全体が点いたり消えたりするので、LEDのコモンラインと思われます。コモンラインを調べて、ビニール線で直繋ぎします。

これでどうだ!…ちゃんと点く様になりました~!

このおもちゃ預かるときに、ナースさんから「これ、前やったでしょ?」と言って預けられたのですが、この釣り竿型のゲームは、おもちゃドクターを始めてすぐの頃(調べたら2012/11月でした)に1回担当しました。ナースさん、それ憶えてたの??w
まだ初心者で、散々つつきまわして結局何も分からずに断念した苦い思い出なのですが、今回でリベンジできたかな?ww
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

10/3 プレイルームおもちゃ修理3件

2020-10-03 | おもちゃ
院長経由で、宇部すくすくプラザプレイルームからの修理依頼を3件預かりました。
例年100件/年前後の修理をしてきましたが、今年は4分の3過ぎたところで現在62件。バリバリ引き受けて修理しなくちゃ~w。

1件目、プラレール、多分ドクターイエローかな?

電池直結しても動かない。電池直結で隙間からピニオンつついてみたけど、まだ動かないので、ギアボックス分解。

一番スタンダードなタイプのギアボックスでしたが、モーター電極がハンダ付けしてあって、ハンダ溶かして外さないとギアボックスが分解できませんでした。
この状態で電池直結したら、モーター問題なく回りました。10Tピニオン割れてたので取替。ギアに絡まってる髪の毛や垢を全部きれいにして組み戻して終了~。

2件目も、同じ人のプラレール。…トーマス関係の誰か?ですw。

こちらも、電池直結で回らないので、ギアボックス分解。

こちらはウォームのタイプでした。これもこの状態で電池直結したらモーターすぐ回りました。同じようにギアの垢をきれいに取ってからグリスアップして組み戻して終了。

さて3件目、なかなか厳しい戦いでした…。いつもの5角形の知育おもちゃです。

聞いている不具合は3点。

左から、①青い歯車の中の水が抜けてしまった②パチンコの玉が上まで上がらない③玉が引っ掛かってなかなか上がらない
との事。

まず①。そもそも水がどこから抜けたのか?裏から3mmぐらいの穴あけてスポイトで水注入して、2日ほど放置したけど、特に水は減らない…。何かで圧掛けてみようと、ガスライターのボンベを押し当てて吹かしたら、逆流して水が噴き出した~w。
仕方がないので口にくわえてできるだけ圧を掛けてみたけど、漏れ箇所確認できませんでした…。このまま水量調整して(たしか、通常フルには入ってない気がする)、穴に接着剤で蓋して終了としました。

次、②のパチンコ。動かしてみると、ピンクのボタンを押すとレバーが下がった状態でロックして、右の青いボタンを押すとリリースされて、玉が打ち出されるところが、ロックがちゃんとできないっぽい。
分解してみると…、ボタンのスプリングが間違った所にテープで留めてありました…。

本来は、右の黒いボタンの下にはまってるべき。しかし、これを正規の場所に戻しても、ロックはいまいち(と~きどき掛かる程度)でした。
左の矢印の所に爪があって、これが下側のピンク色の爪と引っ掛かってロックされる作りですが、そこの引っ掛かりが弱いようです。
ハンダごてで加熱して曲げようかとか、詰め物して当たりを強くしようかとか思ったのですが、後ろからバネで押すことにしました。

矢印の所に穴をあけて、プラモデルの端材を突っ込んでバネのガイドにして、爪を若干押してやりました。これでロックはバッチリ!
動かしてみると、ロック/リリースはちゃんとできるけど、玉が上まではあがりきらない…。打ち出し部の黒いスポンジがだいぶ朽ちてたので、取って代りに板ゴムを貼り付けたら、バッチリ上まで上がるようになりました。

さて、大変だった③の玉の引っ掛かり。
上の3連の写真の一番右、青い球の位置で引っ掛かって、真ん中のスクリューエレベータが回せなくなってしまう。外から見た感じでは、緑の部分から透明の部分に行く所に段差があって、玉が引っ掛かってるように見える。
その段差を埋めれば改善しそうなんだけど、裏にネジが全くなく、表から透明部分を接着止めしてある様で、全然分解できない…。マイナスの精密ドライバーやカッターナイフ突っ込んでコネてみるも、ビクともしない…。
「分解できないものは修理できない」ので、これは諦めよう…と一旦思ったのだけど、「こうすれば良くなる」という見込みが立ってるのに手が出せないのは悔しい…。
裏から2.5mmのキリで穴あけて押してみた、けどまだビクともしない。3か所あけて押してみたけど、やっぱりビクともしない。
またもやくじけ掛けたけど、こうなったら、裏からドリルで全周穴あけて、裏をはがしてしまえ!
電動ドリルで根気よく全周穴あけ、上部はクルクル回すツマミの隙間の部分で切断。
悪戦苦闘の途中の状況。

何回かくじけそうになりましたが、この方針で苦闘の末、なんとか裏を外すことに成功!

この矢印の所に段差があって、玉が引っ掛かる。エポキシを盛ってこの段差を埋めます。

矢印の所に一発発勝負でエポキシ盛り。(右に切り粉が写ってるのは、後でプラ溶着するのに、この切り粉を使ったためw。)
仮フタして回してみる…いい感じ!
これで、フタ戻してハンダごてで溶かして溶着・仕戻し。動かしてみると…完璧!全く引っかからずにスムーズに玉が上がっていきました!

さて、聞いていた不具合は全部直しましたが、ほかに不具合が無いか確認。
音楽再生する所にスピードの上げ下げボリュームが付いてるのですが、操作不能になってました。ボリュームが完全不通の様です。ツマミを取らないと整備や取替もできないので、マイナスドライバー突っ込んでグイグイやったら…抜けそう…軸ごと抜けちゃった~。
ツマミが取れずにボリューム本体から軸ごと抜けてしまいました…。とりあえず分解して中を確認。特にサビサビになったり抵抗体がハゲてなくなったりはしてなかったのですが、接点復活剤で拭いたら、抵抗復活しました。
抜けた軸は…接点回転盤との固定部が割れて抜けたようで、突っ込んでも固定されませんでした…。100KΩBのボリューム、たまたま手持ちがあったので取り替えようかとも思ったのですが、抜けてしまうもののカツカツ操作はできるようなので、これでお返ししようかと思います。

さて苦労しましたが、なんとか根性で「△」を回避して完全に治せたと思います~w。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする