工作の2S(Seiri/Seiton)

工作やプログラムでやったことをまとめていきます

Pythonでニュートン法 ニューモン

●あらまし

高校のプログラミングの授業に発展問題としてこの「ニュートン法」が出ました
歯抜けのフローチャートがあり選択式で埋めるという問題でした

今思えば情報技術者試験の引用とすぐ分かるものですが
まったく手も足も出ずという感じだったのを覚えています
Python入門のタイミングでリベンジしたら解けたので
まとめることにしたのです

●概要

今回は情報技術者試験に登場したニュートン法
放物線 f(x) = x^2 - N = 0となる解を1つ求めるというものです
f:id:kt-marshal:20160822000055j:plain

●考え方

十分に大きい数を選びx0とする
そのときのf(x)の接線とx軸との交点のx座標をx1とする
x1をx0とし、同様に接線からx1を求める ・・・くりかえし
f:id:kt-marshal:20160822220406j:plain
f:id:kt-marshal:20160822220413j:plain

ひたすら繰り返すと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
f:id:kt-marshal:20160906213556j:plain

●解説

情報技術者試験では接線を求める公式を当てはめるような気がします
今回で行けば与えられた式から「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:id:kt-marshal:20160906214019j:plain

●さいごに

f(x) = 0となる点がない場合は無限ループします
数学は奥が深い!

パソコンからArduino経由でSDにファイルを書いてみる2 完結編

とりあえず完成したのでまとめようと思います

ハード面でSDカードの耐圧を越えて使用しているため

真似する際はレベルシフト回路を使ってください

●概要

パソコンとSDカードをUSBで接続し、かつ専用ソフトを中継してデータをSDに送信する。書き込み制限のあるパソコンでもSD書き込みができ、Autorun系のワーム被害のリスクも低いはず。

 

●仕様

通信方式:シリアルポート(Serial Port Driver)

対応SD:2GByte ~ 32GByte

書き込み速度:4800, 9600, 57600, 115200bps

f:id:kt-marshal:20160814001256j:plain

 

f:id:kt-marshal:20160814003818j:plain

●転送

VB.NETで作成しています(パソコンからArduino経由でSDにファイルを書いてみる1 - 工作の2S(Seiri/Seiton)でも説明があります)

 

SDに書き込む機能だけです

VBではSerialPortクラス

ArduinoではSerialクラスを使用しています

 

f:id:kt-marshal:20160814001303j:plain

Arduinoは正常に処理できなかった場合、PCに対しNACKを返します。ファイル処理途中であればそのファイルを削除します

PCはNACKを受信すると処理を中断しメッセージ表示します

タイムアウトは5秒設定されています

PCは接続後、データ送信時以外に定期的にPINGコマンドを発行し応答ない場合は切断処理を実行します

●使ってみる

htm形式の某ソフトのヘルプをSDに転送し開けることを確認しています

(途中移るハードはTX, RXと通信のLEDがチカってるよって意味です)

www.youtube.com

16kByteのファイルなので一瞬でした。1MByteくらいになると数10分は待つことになるでしょうね 

 

 

●苦労したところ

Arduinoにデバッガ機能がないので、どこで通信途切れてるのか見えないのが大変だった。ステップ毎つどログ出力する形でなんとか進めることができた。

つながるまでが一番苦労したた

 

SDのホットプラグ機能やPCとのホットプラグを安定して動作させる方式を何度も作り直した。今でも完璧かどうかは怪しいがおおむねOK

 

SDカードのFATが8.3方式*1のファイル命名で8文字以上のファイルが作成できない(?)

 

VBArduinoのメインプログラムと実行ファイルが入っています

データ転送ツール.zip - Google ドライブ

ラズベリーパイ公式タッチパネルを100均の箱でケーシングしてみた

●こんにちは

上司的な何者かにラズベリーパイB+をタダで貰い、公式タッチパネルも夏のボーナスで購入しました。

抱き合わせで専用ケースみたいなのも売ってますが、100均でいい素材があったらそういうの使ってみるのも面白いかなと思い今回の活動に至ったわけです。

Amazonで11,290円もしたぞ

f:id:kt-marshal:20160808235128j:plain

▼なぜくれたかは未だわからないが使う

f:id:kt-marshal:20160808235145j:plain

そして、ダイソーで見つけたケース

f:id:kt-marshal:20160809002231j:plain

 

 

●ディスプレイの固定のための加工

どういう構成で固定するかにセンスが問われます。とくに前面パネルにねじを出すようなのはあまり好きではありません。基本は裏側か中にするようにしています。

 

タッチパネルの裏にM3めねじ穴が4つ空いているので2枚のプレートを取り付けプレートでベース(引き出される方の底)に固定することにしました

f:id:kt-marshal:20160809000407j:plain

▼固定用の穴を空ける前(空けた後の画像はねえのかよ)

 会社のゴミ箱から拾ってきたものを仕上げました

f:id:kt-marshal:20160809000440j:plain

前面をカッターで切り抜きます

f:id:kt-marshal:20160809000629j:plain

f:id:kt-marshal:20160809000652j:plain

 

●組み立てる

(高さもそのまんまでいいじゃないすか)

f:id:kt-marshal:20160809000711j:plain

 

中はこんな感じ

DCジャックから5Vを供給します

画像処理をやらせると熱がひどいので放熱ファンをつけてみました

f:id:kt-marshal:20160809001037j:plain

ワゴのWFRで接続しています。今までのようにスリーブかしめが不要になり、透明で接続状態がひと目でチェックできます。

オススメです

www.wago.co.jp

f:id:kt-marshal:20160809001216j:plain

 

コネクタ

左角がダレて、右角が尖ってる。こういうのは試験では減点されます

f:id:kt-marshal:20160809000856j:plain

 

●完成したのであそぶ

そんなかんやでオセロをやってみました

タッチパネルなのでタッチで石を置けますね

f:id:kt-marshal:20160809001605j:plain

f:id:kt-marshal:20160809002307j:plain

 最近ゲーム作りから離れているので何か作ってみようかな

 

●さいごに

タカチとかだと高くついてしまうので、趣味の工作であれば100均でケースを探すのもアリだと思います。「こんなのをケースにしてみよう」的な発想が面白いかも

 

それと、実は公式のケースがあまり好きではないので、(アクリル3枚重ねた感がムリ)同じように思ってるならこういう感じも良いと思います。

 

とりあえずは、来週から始まる夏休みの宿題としてPyGamesでニュートン法をやってみようかなーと思います

KiCADの3DモデルにDesignSpark MechanicalとWings 3Dで挑戦

KiCADでのフットプリント作成と3Dモデル作成と割付までを書いてあります

事後録のため順序が実際の作業と前後しています。

 

 

こんにちは。皆さんも日々、KiCADで基板アートワークしますね。

で、3Dビューしますね。

 

たとえば下のデータ転送回路の場合4ピンのDIPスイッチやらSDのホルダやらArduinoやら、オリジナル部品だらけです。

f:id:kt-marshal:20160604204235j:plain

 

たとえばこのDIPスイッチ

f:id:kt-marshal:20160604204250j:plain

f:id:kt-marshal:20160604204257j:plain

 オリジナル部品の場合3Dビューがないのです。

せっかくの3Dビューもオリジナル部品だらけではランドと基板だけの絵になってしまうのです

 

 

さみしいやないかい!

 

ということで作ります。

 

作業にあたり下記のサイトを参考にさせていただきました

Cubify Design + Wings3DでKiCad用の3Dモデルを作る:そこんとこkuwaしく - ブロマガ

●必要なもの

 ・KiCAD

 ・DesignSpark Mechanical

 ・Wings 3D

 

●KiCADのフットプリントを作る

グリッドを "2.54mm" にしてランドを配置して

外枠はグリッドを "1.27mm" にして、ランドのセンターにアンカーを置いてグリッドで計算しながら書いています

寸法は後述のメーカー情報を使います

この辺は KiCADことはじめ 的なモノを参考にすれば良いと思います

f:id:kt-marshal:20160604204945j:plain

 

●3Dモデルを書く

DesignSpark使います。持ってない人は 公式ページでゲットだ!

www.rs-online.com

メーカーの寸法情報を参考に書きます

今回はOMRONのA6Eシリーズです

f:id:kt-marshal:20160604205354j:plain

f:id:kt-marshal:20160604205400j:plain

DesignSpark Mechanicalは 平面作って 絵を描いて ヒッパル!

 平面作って 絵を描いて ヒッパル!

f:id:kt-marshal:20160604205635j:plain

はいおわり!

DSMで電子部品を書く方法もまとめるかも

 

各構成ごとにコンポーネントを分けて、色をつけています

f:id:kt-marshal:20160604210028j:plain

グリッドをヤード系にすると、グリッドにあわせながら簡単に作図できます

また、3Dモデルは見た目の話なので(?)ピッチは守りながらも外形などはラフに書きました(手抜き)

 

そして、完成したこいつを STL(Stereo Nantyara Li) で出力します。

STLは3D図形を細かい三角形の張り合わせで表現しようというものです。ファイルの中身は三角の座標とその面が向くベクトル情報の羅列になっています。

 

●Wings3Dで着色してwrlに変換する

DesignSparkMechanicalでは wrl が吐き出せないため Wings3D のお力を借ります

また、STLには色などの属性は含まれないため、着色もWings3Dで行います

(DesignSparkMechanicalがwrlを吐き出せれば一番いいのにね)

 

※説明書などを読まずに適当にやった方法です

 

最初にSTLをImportします

 

部品構成情報を用意する

Outliner ウィンドウをなんらかの方法で表示し、default を右クリック → duplicate(複製)して部品にRenameと色の設定をします

f:id:kt-marshal:20160604211535j:plain

色の設定は右クリックし Edit Material... をクリック

f:id:kt-marshal:20160604212312j:plain

下図、1、2の手順で変更可能 Ignoreのプルは左クリックを押しっぱなしじゃないと勝手に隠れるので注意

f:id:kt-marshal:20160604212320j:plain

 

次は部品のメッシュ(三角)を今作成した構成情報に割り当てていきます

範囲選択などし、赤くします。下記はピン(赤くなっている)を構成するメッシュをすべて選択したった

f:id:kt-marshal:20160604211522j:plain

outlinerの対象の pin を右クリックし Assign to Selection をします

するとそのメッシュに設定が適用されます。そう、色が変わるはずです

f:id:kt-marshal:20160604211704j:plain

割り付けたらスペースキーを 押して選択を解除します

 

これを繰り返すとすべてに色がつきます

メッシュは1構成にしか割り付けられないらしく、メッシュを別の構成に割り付けると

横取り的な感じになるようですね

f:id:kt-marshal:20160604211229j:plain

 

エクスポートします

f:id:kt-marshal:20160604213308j:plain

 

●KiCADに取り込む

プロパティで取り込めますが、なんか知りませんがでかいですな。

(図はお試しで取り込んだ段階なので白いのです。ブログ用に作業の順序変えてるんすよ)

f:id:kt-marshal:20160604213301j:plain

まあ、ピッチさえあっていればプロパティの調整でなんとかなるでしょう

スケーリングと位置オフセットを都合よくいじります

f:id:kt-marshal:20160604213404j:plain

あーだこーだやって、しっかりはまりました

f:id:kt-marshal:20160604213605j:plain

そして、細かい修正の中、スイッチの色をオレンジにしたらボディーが真っ白になって戻らなくなりました。スノーホワイト、これはこれでありですね。

f:id:kt-marshal:20160604213754j:plain

続いてほかの部品を作ってみました

あまり凝るとメッシュが増えて大変です。特にRや丸系は悲惨なことになるかも知れません

f:id:kt-marshal:20160604213855j:plain

f:id:kt-marshal:20160604213902j:plain

同じようにフットプリントに割り付けます

 

そしてKiCADでアートワークするとこんな感じです

 

 ばばーん!

f:id:kt-marshal:20160604214559j:plain

なんか作った感出てきますね。

もう満足したし実物作らなくてもいいや

 

この機能は、手付けするとしたらコテが入るか?とか、SDカード取り外せるか?とか実用面での確認がしやすくなると思います

ただし、画像での保存しかできないため、メカCADにインポートして筐体設計に引き継ぐなどはできないようです

(世の中的には3Dモデルとしてシミュレーションにかけたりします)

 

最初の1個目は1時間かかりましたが、2個目からは10分程度でできるようになりました

 

3Dモデルを配布しているサイトもありますのでそこから利用させていただくのも手だと思います

 

今回のデータ

SW-DIP4.zip - Google ドライブ

 

 

パソコンからArduino経由でSDにファイルを書いてみる1

ブログ作成時の作業BGMです

 

●製作品イメージ

PC上のファイルをArduinoを介してSDカードに書き込む

f:id:kt-marshal:20160601223408j:plain

この関係あまり詳しくないですが、OSとSDカードが直接つながらないのでAutorun.infにかかわるワーム被害のリスクはだいぶ低いんじゃないでしょうか。(そういう目的ではないですが)

 

●ということで

製作物は3点になります

 ・そういうのができる回路 

 ・VBの送信ソフト

 ・Arduinoソフト

 

●そういうのができる回路

まずはハードウェアが必要になります。

KiCADで作図しています。オリジナル部品の作成もだいぶ慣れてきました。

自動車学校で言うと教習所の外を走り出した感じですね(?)

f:id:kt-marshal:20160601232330p:plain

回路ですが、Arduino NanoにSDカードホルダーをつなぐだけです

SDホルダーDIP化キットを使用しています。DIPスイッチはパーツケースで腐ってたモノを使用しました

マイクロSDカードスロットDIP化キット: 組立キット 秋月電子通商 電子部品 ネット通販

 

拡張機能としてDIPスイッチを4つ取り付けています。

1ピンと2ピンの状態を起動時に読み取りボーレートを4800, 9600, 57600, 115200の4つに切り替えるというものです。早いほうが良いに決まってるので115200で使うことになるでしょう。残り2ピンは未使用です。

 

ブレッドボードで配線するとこんな感じ↓

f:id:kt-marshal:20160601233534j:plain

 

●VBの送信ソフト

Arduino Nanoとダイレクトにシリアル通信できるため、.NETのSerialPortを使用します

(ちなみにワタクシは気分でVBC#を使い分けています)

f:id:kt-marshal:20160601233841j:plain

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が送信されArduinoPING応答する

応答がない場合は切断する

データの送信

ファイル名を送信する(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スイッチが不安定です

movexe.zip - Google ドライブ

 

●データの転送

途中途中ハマッタところが

・ファイル名をAsciiで送ったところファイル作成ができず、unicode(風)にしたらできた

Arduinoのシリアルバッファ64bytesいっぱいにおくったらどうも63Bytesまでっぽい?

 

なんやかんや下記のように転送できました

f:id:kt-marshal:20160601235941j:plain

bschのなぞの回路図をSDに転送し無事開けたところです

作成日時は 2000/01/01/01:00:00 になっています

DEBUG.TXTは経過を記録するファイルです

 

残念なことにbschの回路ファイルはまんまAsciiファイルなのでバイナリファイルを次回試してみることにします

コンデンサ溶接電源の自作 その4 ~そして蔵入りへ~

●結論

現行の設計では放電回路に問題があり、溶接できないことが判明しました。

とりあえず仕様

 コンデンサ:0.04F

 充電電圧:8V ~ 35V

 出力エネルギー:1.2J ~ 24J

 溶接時間:すべてを放電しきるまで

電圧をボリュームで設定する方式です

 

一応、壊れるまでの2回、サス棒の溶接に成功しました

結構頑丈で引っ張り強度はよく、ねじって取れるレベルでした

f:id:kt-marshal:20160515004552j:plain

 

また、前回よりバージョンアップしています

秋月DCDCの出力を35V(+5V)に変更しコンデンサも2倍盛り

f:id:kt-marshal:20160515005423j:plain

配線もモッコリーナ

f:id:kt-marshal:20160515005454j:plain

●問題の予想

状態として、最大出力時にFETの片側が壊れます。データシートを見ると壊れて当然です。

FET2個では200Aも流せない

2SK3271は定格100Aなので、最高パフォーマンスでも2個200A。

35V放電直後のIDは350Aを越えようとし、2SK3271(2パラ)では消化できない。後半はVgs4V代だったので駆動率が悪くなおさら。

チョコボール生産ラインのチョコボール流し量を4倍にされ

おまけに給料も安いのでラインマンが過労死するイメージです

 ※あくまでイメージで、チョコボール生産ラインがブラックかどうかは知りません

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くらいずれました。

f:id:kt-marshal:20160509002755j:plain

電極はクロム銅電極φ4mmを使用します。

f:id:kt-marshal:20160509002801j:plain

電極は長いので、半分にするための金切のこをダイソーで買ってきました。

この商品は100円です。

f:id:kt-marshal:20160509002808j:plain

 

電極に電線をはんだづけします。ライターで400℃近くまで炙ります。

始め、鉛フリーはんだでやったら熱容量不足ではんだごてがはんだに埋まったので共晶はんだに変えました。

f:id:kt-marshal:20160509002813j:plain

f:id:kt-marshal:20160509002821j:plain

 

上下ともに配線し洗濯ばさみの穴に通した後、エポキシ系接着剤で固めます。

f:id:kt-marshal:20160509003518j:plain

洗濯ばさみを 常時開 Normally Open にするためにGクリップを使用しています。

f:id:kt-marshal:20160509003646j:plain

溶接をする前にトラブル発生

どうやら穴ずれ修正で穴を広げたせいか片側の電極の接着が弱く、閉じる力でひっこんでしまう感じになりました。ということで急遽方式を変えることにしました。

 

●電極を作る TAKE2

接着の弱い側を板形状のものにします。コンセントのプレートにすることにします。この材料が適正かどうかはわかりません。

 金切のこでコンセントプラグのプレートを切り、電線をはんだづけします。

f:id:kt-marshal:20160509004311j:plain

なかなかいい感じなので失敗したほうがよかったと思いました。

f:id:kt-marshal:20160509004347j:plain

 

●実力を確認する

いちおう9Jのエネルギーを300msec程度で出力する予定です。

K熱電対をカッターで剥き、交差させ洗濯ばさみではさみます

f:id:kt-marshal:20160509004524j:plain

f:id:kt-marshal:20160509011235j:plain

 

うんともすんとも言わないよ

 

波形を確認すると1段目のドライブ用トランジスタがオンしていないようです。

CH1:マイコン出力

CH2:トランジスタ出力

トランジスタ出力がマイコン出力L時にHになるはずが無視されている。

f:id:kt-marshal:20160509004805j:plain

どうやら前回30V線をマイコンに触れさせたときにトランジスタも死んだ可能性があります。ということで交換したところドライブ回路は直ったようです。

CH1:トランジスタ出力

CH2:FETゲート入力

f:id:kt-marshal:20160509004944j:plain

 

あらためて熱電対を溶接してみます。

 

溶接できると思ったのですが、どうも熱で軟らかくなった分へこんだだけのような感じです。(細かくて写真はとれませんでした)

 

●なんで溶接できないんじゃ

理論上コンデンサ電圧30V、20000uFで仮に出力抵抗を2Ωとした場合、メインパワー継続時間は下記のグラフのように100m秒程度になるはずです。

f:id:kt-marshal:20160509011052j:plain

f:id:kt-marshal:20160509014057j:plain

実際の出力波形は下記で、7msecで放電しきっています。

f:id:kt-marshal:20160509011223j:plain

f:id:kt-marshal:20160509014306j:plain

7msecで放電しきるということは100mΩ以下である必要があります。ほんとにそうなんかなと思ってしまう。そして、コンデンサ放電波形に見えないという。

 

明日も休みなのでトラブルシューティングアンドウ対応は明日にすることにしました。