Pythonでニュートン法 ニューモン
●あらまし
高校のプログラミングの授業に発展問題としてこの「ニュートン法」が出ました
歯抜けのフローチャートがあり選択式で埋めるという問題でした
今思えば情報技術者試験の引用とすぐ分かるものですが
まったく手も足も出ずという感じだったのを覚えています
Python入門のタイミングでリベンジしたら解けたので
まとめることにしたのです
●概要
今回は情報技術者試験に登場したニュートン法
放物線 f(x) = x^2 - N = 0となる解を1つ求めるというものです
●考え方
十分に大きい数を選びx0とする
そのときのf(x)の接線とx軸との交点のx座標をx1とする
x1をx0とし、同様に接線からx1を求める ・・・くりかえし
ひたすら繰り返すとx0 ≒ x1 となる(収束)
プログラムでは欲しい精度を満たす段階で打ち切る
|x0 - x1| < ε
●Pythonで実装
# coding: utf-8 print("solve \"f(x) = x^2 - N \"") N = float(input("input N->")) ep = float(input("input convergence value->")) x1 = float(input(input start x value->")) x0 = 0.0 N /= 2 while(abs(x0 - x1) >= ep): x0 = x1 x1 = (x0 / 2) + (N / x0) print("x0->{0}, x1->{1}".format(x0, x1)) print(x1) print("") print(x1)
▼N = 10
●解説
情報技術者試験では接線を求める公式を当てはめるような気がします
今回で行けば与えられた式から「x0を代入するだけで次のx1が求まる式」を導くことになります
f(X)における接線yは Y = f'(X)(Xn - X) + f(X) XをX0, XnをX1と置き換える Y = f'(X0) * (X1 - X0) + f(X0) f'(X) = 2Xより f'(X) = 2X0 したがって y = 2X0(X1 - X0) + f(X0) = 2*X0*X1 - 2X0 + f(X0) よって x1 = (X0 / 2) / (N / 2X0)
プログラム内の
x1 = (x0 / 2) + (N / x0)
が求めた式に相当します
(Nを毎回2で割ることが分かっているためあらかじめ割っています)
●さいごに
f(x) = 0となる点がない場合は無限ループします
数学は奥が深い!
パソコンからArduino経由でSDにファイルを書いてみる2 完結編
とりあえず完成したのでまとめようと思います
ハード面でSDカードの耐圧を越えて使用しているため
真似する際はレベルシフト回路を使ってください
●概要
パソコンとSDカードをUSBで接続し、かつ専用ソフトを中継してデータをSDに送信する。書き込み制限のあるパソコンでもSD書き込みができ、Autorun系のワーム被害のリスクも低いはず。
●仕様
通信方式:シリアルポート(Serial Port Driver)
対応SD:2GByte ~ 32GByte
書き込み速度:4800, 9600, 57600, 115200bps
●転送
VB.NETで作成しています(パソコンからArduino経由でSDにファイルを書いてみる1 - 工作の2S(Seiri/Seiton)でも説明があります)
SDに書き込む機能だけです
VBではSerialPortクラス
ArduinoではSerialクラスを使用しています
Arduinoは正常に処理できなかった場合、PCに対しNACKを返します。ファイル処理途中であればそのファイルを削除します
PCはNACKを受信すると処理を中断しメッセージ表示します
タイムアウトは5秒設定されています
PCは接続後、データ送信時以外に定期的にPINGコマンドを発行し応答ない場合は切断処理を実行します
●使ってみる
htm形式の某ソフトのヘルプをSDに転送し開けることを確認しています
(途中移るハードはTX, RXと通信のLEDがチカってるよって意味です)
16kByteのファイルなので一瞬でした。1MByteくらいになると数10分は待つことになるでしょうね
●苦労したところ
Arduinoにデバッガ機能がないので、どこで通信途切れてるのか見えないのが大変だった。ステップ毎つどログ出力する形でなんとか進めることができた。
つながるまでが一番苦労したた
SDのホットプラグ機能やPCとのホットプラグを安定して動作させる方式を何度も作り直した。今でも完璧かどうかは怪しいがおおむねOK
SDカードのFATが8.3方式*1のファイル命名で8文字以上のファイルが作成できない(?)
ラズベリーパイ公式タッチパネルを100均の箱でケーシングしてみた
●こんにちは
上司的な何者かにラズベリーパイB+をタダで貰い、公式タッチパネルも夏のボーナスで購入しました。
抱き合わせで専用ケースみたいなのも売ってますが、100均でいい素材があったらそういうの使ってみるのも面白いかなと思い今回の活動に至ったわけです。
▼Amazonで11,290円もしたぞ
▼なぜくれたかは未だわからないが使う
そして、ダイソーで見つけたケース
●ディスプレイの固定のための加工
どういう構成で固定するかにセンスが問われます。とくに前面パネルにねじを出すようなのはあまり好きではありません。基本は裏側か中にするようにしています。
タッチパネルの裏にM3めねじ穴が4つ空いているので2枚のプレートを取り付けプレートでベース(引き出される方の底)に固定することにしました
▼固定用の穴を空ける前(空けた後の画像はねえのかよ)
会社のゴミ箱から拾ってきたものを仕上げました
前面をカッターで切り抜きます
●組み立てる
(高さもそのまんまでいいじゃないすか)
中はこんな感じ
DCジャックから5Vを供給します
画像処理をやらせると熱がひどいので放熱ファンをつけてみました
ワゴのWFRで接続しています。今までのようにスリーブかしめが不要になり、透明で接続状態がひと目でチェックできます。
オススメです
コネクタ面
左角がダレて、右角が尖ってる。こういうのは試験では減点されます
●完成したのであそぶ
そんなかんやでオセロをやってみました
タッチパネルなのでタッチで石を置けますね
最近ゲーム作りから離れているので何か作ってみようかな
●さいごに
タカチとかだと高くついてしまうので、趣味の工作であれば100均でケースを探すのもアリだと思います。「こんなのをケースにしてみよう」的な発想が面白いかも
それと、実は公式のケースがあまり好きではないので、(アクリル3枚重ねた感がムリ)同じように思ってるならこういう感じも良いと思います。
とりあえずは、来週から始まる夏休みの宿題としてPyGamesでニュートン法をやってみようかなーと思います
KiCADの3DモデルにDesignSpark MechanicalとWings 3Dで挑戦
KiCADでのフットプリント作成と3Dモデル作成と割付までを書いてあります
事後録のため順序が実際の作業と前後しています。
こんにちは。皆さんも日々、KiCADで基板アートワークしますね。
で、3Dビューしますね。
たとえば下のデータ転送回路の場合4ピンのDIPスイッチやらSDのホルダやらArduinoやら、オリジナル部品だらけです。
たとえばこのDIPスイッチ
オリジナル部品の場合3Dビューがないのです。
せっかくの3Dビューもオリジナル部品だらけではランドと基板だけの絵になってしまうのです
さみしいやないかい!
ということで作ります。
作業にあたり下記のサイトを参考にさせていただきました
Cubify Design + Wings3DでKiCad用の3Dモデルを作る:そこんとこkuwaしく - ブロマガ
●必要なもの
・KiCAD
・DesignSpark Mechanical
・Wings 3D
●KiCADのフットプリントを作る
グリッドを "2.54mm" にしてランドを配置して
外枠はグリッドを "1.27mm" にして、ランドのセンターにアンカーを置いてグリッドで計算しながら書いています
寸法は後述のメーカー情報を使います
この辺は KiCADことはじめ 的なモノを参考にすれば良いと思います
●3Dモデルを書く
DesignSpark使います。持ってない人は 公式ページでゲットだ!
メーカーの寸法情報を参考に書きます
今回はOMRONのA6Eシリーズです
DesignSpark Mechanicalは 平面作って 絵を描いて ヒッパル!
平面作って 絵を描いて ヒッパル!
はいおわり!
※DSMで電子部品を書く方法もまとめるかも
各構成ごとにコンポーネントを分けて、色をつけています
グリッドをヤード系にすると、グリッドにあわせながら簡単に作図できます
また、3Dモデルは見た目の話なので(?)ピッチは守りながらも外形などはラフに書きました(手抜き)
そして、完成したこいつを STL(Stereo Nantyara Li) で出力します。
STLは3D図形を細かい三角形の張り合わせで表現しようというものです。ファイルの中身は三角の座標とその面が向くベクトル情報の羅列になっています。
●Wings3Dで着色してwrlに変換する
DesignSparkMechanicalでは wrl が吐き出せないため Wings3D のお力を借ります
また、STLには色などの属性は含まれないため、着色もWings3Dで行います
(DesignSparkMechanicalがwrlを吐き出せれば一番いいのにね)
※説明書などを読まずに適当にやった方法です
最初にSTLをImportします
部品構成情報を用意する
Outliner ウィンドウをなんらかの方法で表示し、default を右クリック → duplicate(複製)して部品にRenameと色の設定をします
色の設定は右クリックし Edit Material... をクリック
下図、1、2の手順で変更可能 Ignoreのプルは左クリックを押しっぱなしじゃないと勝手に隠れるので注意
次は部品のメッシュ(三角)を今作成した構成情報に割り当てていきます
範囲選択などし、赤くします。下記はピン(赤くなっている)を構成するメッシュをすべて選択したった
outlinerの対象の pin を右クリックし Assign to Selection をします
するとそのメッシュに設定が適用されます。そう、色が変わるはずです
割り付けたらスペースキーを 押して選択を解除します
これを繰り返すとすべてに色がつきます
メッシュは1構成にしか割り付けられないらしく、メッシュを別の構成に割り付けると
横取り的な感じになるようですね
エクスポートします
●KiCADに取り込む
プロパティで取り込めますが、なんか知りませんがでかいですな。
(図はお試しで取り込んだ段階なので白いのです。ブログ用に作業の順序変えてるんすよ)
まあ、ピッチさえあっていればプロパティの調整でなんとかなるでしょう
スケーリングと位置オフセットを都合よくいじります
あーだこーだやって、しっかりはまりました
そして、細かい修正の中、スイッチの色をオレンジにしたらボディーが真っ白になって戻らなくなりました。スノーホワイト、これはこれでありですね。
続いてほかの部品を作ってみました
あまり凝るとメッシュが増えて大変です。特にRや丸系は悲惨なことになるかも知れません
同じようにフットプリントに割り付けます
そしてKiCADでアートワークするとこんな感じです
ばばーん!
なんか作った感出てきますね。
もう満足したし実物作らなくてもいいや
この機能は、手付けするとしたらコテが入るか?とか、SDカード取り外せるか?とか実用面での確認がしやすくなると思います
ただし、画像での保存しかできないため、メカCADにインポートして筐体設計に引き継ぐなどはできないようです
(世の中的には3Dモデルとしてシミュレーションにかけたりします)
最初の1個目は1時間かかりましたが、2個目からは10分程度でできるようになりました
3Dモデルを配布しているサイトもありますのでそこから利用させていただくのも手だと思います
今回のデータ
パソコンからArduino経由でSDにファイルを書いてみる1
ブログ作成時の作業BGMです
●製作品イメージ
PC上のファイルをArduinoを介してSDカードに書き込む
この関係あまり詳しくないですが、OSとSDカードが直接つながらないのでAutorun.infにかかわるワーム被害のリスクはだいぶ低いんじゃないでしょうか。(そういう目的ではないですが)
●ということで
製作物は3点になります
・そういうのができる回路
・VBの送信ソフト
・Arduinoソフト
●そういうのができる回路
まずはハードウェアが必要になります。
KiCADで作図しています。オリジナル部品の作成もだいぶ慣れてきました。
自動車学校で言うと教習所の外を走り出した感じですね(?)
回路ですが、Arduino NanoにSDカードホルダーをつなぐだけです
SDホルダーDIP化キットを使用しています。DIPスイッチはパーツケースで腐ってたモノを使用しました
マイクロSDカードスロットDIP化キット: 組立キット 秋月電子通商 電子部品 ネット通販
1ピンと2ピンの状態を起動時に読み取りボーレートを4800, 9600, 57600, 115200の4つに切り替えるというものです。早いほうが良いに決まってるので115200で使うことになるでしょう。残り2ピンは未使用です。
ブレッドボードで配線するとこんな感じ↓
●VBの送信ソフト
Arduino Nanoとダイレクトにシリアル通信できるため、.NETのSerialPortを使用します
SDの機能とファイル送信の機能があればいいかなということでこんな感じ
暫定でほとんどの機能を作ります
-----コマンド一覧---------------------------
CMD_ACCEPT As Byte = Asc("0") ' 通信受信正常
CMD_END As Byte = Asc("1") ' 通信終了指令
CMD_PING As Byte = Asc("2") ' PINGコマンド
CMD_SD_CONFIG As Byte = Asc("3") ' SD構成情報要求
CMD_SD_DISCONNECT As Byte = Asc("4") ' SD取り外し検出
CMD_FILE_SEND As Byte = Asc("5") ' ファイル送信
CMD_FILE_NACK As Byte = Asc("6") ' ファイル受信失敗
CMD_FILE_ACK As Byte = Asc("7") ' ファイル受信応答
CMD_NOP As Byte = &HFF
接続までの流れ
接続 ボタン押下でSD構成情報要求をArduinoに送信します
ArduinoからSD形式、全体容量、使用済み領域が帰ってくる
接続が確立する
確立中はVBから1秒ごとにPINGが送信されArduinoがPING応答する
応答がない場合は切断する
データの送信
ファイル名を送信する(unicode風?) ArduinoはACKを返す
SD上にすでに存在すれば削除する(上書き)
ファイルサイズを送信する ArduinoはACKを返す
63byteブロックで送信し、ブロック受信でArduinoはACKを返す
エラー時はNACKを返し作業中のファイルを削除して終了する
書き込み時はLEDが点滅する
そういえば、「シーケンス制御検定」は、このように箇条書きレベルの仕様書で
プログラムを作らなければならないので大変でした
●Arduinoソフト
VBソフトの仕様にあわせて作って行きます
SDの抜き差しに対応するために下記の工夫をしています
SPI.end();で終わることで、再度のSD.beginが正常実行でき、SDのホットプラグに対応できます
// ----------------------------------------------------------------------------------------------
// SDを終了する
// ----------------------------------------------------------------------------------------------
void SD_dispose() {
SPI.end();
volumesize = 0;
usedsize = 0;
sd_flag = false;
sd_standby = false;
sd_disconnect = true;
// Serial.print("exit...\n\n");
}
現段階のソースは下記です
・通信が不安定です
・SDスイッチが不安定です
●データの転送
途中途中ハマッタところが
・ファイル名をAsciiで送ったところファイル作成ができず、unicode(風)にしたらできた
・Arduinoのシリアルバッファ64bytesいっぱいにおくったらどうも63Bytesまでっぽい?
なんやかんや下記のように転送できました
bschのなぞの回路図をSDに転送し無事開けたところです
作成日時は 2000/01/01/01:00:00 になっています
DEBUG.TXTは経過を記録するファイルです
コンデンサ溶接電源の自作 その4 ~そして蔵入りへ~
●結論
現行の設計では放電回路に問題があり、溶接できないことが判明しました。
とりあえず仕様
コンデンサ:0.04F
充電電圧:8V ~ 35V
出力エネルギー:1.2J ~ 24J
溶接時間:すべてを放電しきるまで
電圧をボリュームで設定する方式です
一応、壊れるまでの2回、サス棒の溶接に成功しました
結構頑丈で引っ張り強度はよく、ねじって取れるレベルでした
また、前回よりバージョンアップしています
秋月DCDCの出力を35V(+5V)に変更しコンデンサも2倍盛り
配線もモッコリーナ
●問題の予想
状態として、最大出力時にFETの片側が壊れます。データシートを見ると壊れて当然です。
FET2個では200Aも流せない
2SK3271は定格100Aなので、最高パフォーマンスでも2個200A。
35V放電直後のIDは350Aを越えようとし、2SK3271(2パラ)では消化できない。後半はVgs4V代だったので駆動率が悪くなおさら。
おまけに給料も安いのでラインマンが過労死するイメージです
※あくまでイメージで、チョコボール生産ラインがブラックかどうかは知りません
Vgs5VではIDが高く無視できないレベルのRonとなり半開きになるようです
また片側だけ壊れるというのは、Cissが9nFと高いのに対しRgs100Ωで駆動しているため、抵抗やらFETやらのばらつきによって感度の良いほうが先に焼けてショートするからもう片側は保護されるという感じなんだと思います。
溶接SWオン
↓
FET半開き
↓
FETでロスしながら放電
↓
かたっぽ壊れるドーン!
FETが短絡して溶接開始というスイッチ方式
2SK3271でやる場合、Vgsは9Vの4パラくらいにする必要がありそうです。
2SK3271を使ったのは家に転がっていたからです。
拾ったものを使うからです
保護回路がない
調べると、FETの出力段をコンデンサにクリップすることで発振(サージ?)を防止するような工夫があるようです。
Vgs低下時の故障を防ぐために電圧低下検出回路も必須でした。
●ということで次回は
・FETを増やす
・FETのVgsを上げる
・FETドライブ抵抗を小さくする
・2sqより太い線を使う
・OSコンも検討
今回でいろいろと だいぶ習得することがあり、次回は安心して使えるものが作れるような気がします。
商用電源を使用しない溶接機に次回もトライするつもりです。
●感想
楽しかったです
コンデンサ溶接電源の自作 その3
●電極を作る TAKE1
洗濯ばさみの両口にクロム銅の丸電極を接着で取り付ける方式です。TAKE1ということなので、当然この方式は失敗しTAKE2があるということです。けっ
写真のように洗濯ばさみの口に穴をφ4mmの開けます。適当にやったら1mmくらいずれました。
電極はクロム銅電極φ4mmを使用します。
電極は長いので、半分にするための金切のこをダイソーで買ってきました。
この商品は100円です。
電極に電線をはんだづけします。ライターで400℃近くまで炙ります。
始め、鉛フリーはんだでやったら熱容量不足ではんだごてがはんだに埋まったので共晶はんだに変えました。
上下ともに配線し洗濯ばさみの穴に通した後、エポキシ系接着剤で固めます。
洗濯ばさみを 常時開 Normally Open にするためにGクリップを使用しています。
溶接をする前にトラブル発生
どうやら穴ずれ修正で穴を広げたせいか片側の電極の接着が弱く、閉じる力でひっこんでしまう感じになりました。ということで急遽方式を変えることにしました。
●電極を作る TAKE2
接着の弱い側を板形状のものにします。コンセントのプレートにすることにします。この材料が適正かどうかはわかりません。
金切のこでコンセントプラグのプレートを切り、電線をはんだづけします。
なかなかいい感じなので失敗したほうがよかったと思いました。
●実力を確認する
いちおう9Jのエネルギーを300msec程度で出力する予定です。
K熱電対をカッターで剥き、交差させ洗濯ばさみではさみます
うんともすんとも言わないよ
波形を確認すると1段目のドライブ用トランジスタがオンしていないようです。
CH1:マイコン出力
CH2:トランジスタ出力
トランジスタ出力がマイコン出力L時にHになるはずが無視されている。
どうやら前回30V線をマイコンに触れさせたときにトランジスタも死んだ可能性があります。ということで交換したところドライブ回路は直ったようです。
CH1:トランジスタ出力
CH2:FETゲート入力
あらためて熱電対を溶接してみます。
溶接できると思ったのですが、どうも熱で軟らかくなった分へこんだだけのような感じです。(細かくて写真はとれませんでした)
●なんで溶接できないんじゃ
理論上コンデンサ電圧30V、20000uFで仮に出力抵抗を2Ωとした場合、メインパワー継続時間は下記のグラフのように100m秒程度になるはずです。
実際の出力波形は下記で、7msecで放電しきっています。
7msecで放電しきるということは100mΩ以下である必要があります。ほんとにそうなんかなと思ってしまう。そして、コンデンサ放電波形に見えないという。
明日も休みなのでトラブルシューティングアンドウ対応は明日にすることにしました。