Arduinoは行方知れずになる

 沢山買ったはずのArduinoや互換基板、使いたい時に何故か見当たらないことがあります。何かの試作に組み込まれたり、実験用の仮組の中に紛れたり、仕事の開発環境の一部となり保管されてしまうことや、どこかに嫁に出されてしまうなどして消費され、気が付いたときには在庫が無くなっているのです。

 最近はArduino本家の基板を使うことも減り、在庫がなくなると秋月さんのATMEGAマイコンボードを補充しています。この基板は150円とコスパが良いです。

akizukidenshi.com この基板のお気に入りポイントは、リセット信号をピンで切り離せるところです。数時間に一度程度しか起こらないファームウェアのバグをとらえたい時など、適当なスケッチを書いてデバッグ対象のマイコンに接続しっぱなしに。そんなとき、DTRリセットを無効にできるは便利です。

 場合によっては使いにくいところもあります。3.3V 8MHzで動かしたいとき、パターンを切り貼りするのが少々やり難かったりします。また、Arduino+Windowsあるあるの、ボードの数だけCOMポートの番号ができしまう問題があります。COMポート番号が沢山出来るのは嫌なのでArduino Proみたいな6ピンのシリアル端子が欲しいのですが、シリアルモジュールのピンを利用して6ピンをうまく配置する改造もやり難いです。

f:id:jun930:20200117105629j:plain

3.3V 8MHz版のATMEGAマイコンボード

 そんなこんなを考える度に自分仕様のATMEGAボードが欲しいと思いながらも、秋月さんのATMEGAマイコンボードを使ってきました。次に在庫が切れたら作ろうと思い、、、NC切削で作れる片面パターンを引いてみましたが、なんとなく作らずに1年くらい経ちました。。。

 そんな時ふと気付いたのですが、ちょくちょく注文している基板屋さん、送料を除けば10枚$5で、なんと秋月さんの基板より安いのです。DHLの送料が入ったら秋月さんにはかないませんけど、DHLが無かったら安いのですよ。

www.pcbgogo.jp これって数年前には考えられないことで、高々10枚の基板を作って秋月さんより安いって革命的と思うのです。何かの「ついでに」注文することで自分仕様のマイコンボードにはコスト革命が起こる。そーなったら、NC用に無理やり引いた片面パターンを両面仕様に修正したくなってきました。そしてこの基板を「ついででいーの」と呼ぶことにしました。

 

f:id:jun930:20200117105748j:plain

5V 16MHz仕様の、ついででいーの

 しかしながら、今回作ったボードサイズの物を工作に使うことは少なくなってきました。サイズ的に大きいのでマッチする場面が少ないです。やっぱり小さい方が収まりもいいので、大きなマイコンボードの役割は、開発初期段階の試作や動作確認、開発環境中の治具的な役割にシフトしています。

 下の写真は上から、ついででいーの、Arduino nano互換、Extra-coreと呼ばれるボードです。

f:id:jun930:20200117110700j:plain

基板の大きさ比較

 大きな基板でファームウェアや周辺回路を開発したら、Extra-coreを使って色々な所に組み込んでいます。

基板パターン切削用エンドミルを研ぐ


 CNCで基板パターンを切削するときにエンドミルの先端が折れてしまうことがあります。ダイヤモンドヤスリで適当に形を整えてみたものの切れ味が悪く、適当な作業ではダメっぽいことを思い知らされました。また、ダイヤモンドヤスリは目が粗すぎて、硬いエンドミルのエッジが欠けてしまう欠点もあります。

 

 ちゃんと研ぐために新品がどーなっているのか良く観察しようと思いました。使っているものは、角度30度、先端0.2mm、径3.175mm、以下の形をしたものです。f:id:jun930:20191225004819j:plain

 三角の2つのエッジを観察すると、短い方(A)と長い方(B)があります。

f:id:jun930:20191225004841j:plain

Aのエッジは鋭く、以下の矢印部分が平面に落されています。

f:id:jun930:20191225004838j:plain

 一方、Bのエッジは丸く、ワークの切削面から逃げるように加工されています。

f:id:jun930:20191225004834j:plain

 Aのエッジで基板の銅を切削する訳ですから、Aのエッジが鈍ってくると切れ味が悪くなる訳です。このときAのエッジのみを研ぐと、AのエッジはBのエッジに近づきますので、先端の0.2mmが狭くなり、芯ブレとなってしまいます。従ってAとBを同じ量研ぎ出し、先端も0.2mmになるように調整しないといけません。そう考えてみると、先端が折れてしまった場合も同様に、AとBを同じだけ研ぐことになります。また、実際はエッジだけではなく丸い部分全体を3次元的に研ぐ必要があるのです。

 

 構造が判ったところで、何でどのよう研いだらよいのか?ダイヤモンドヤスリは既に玉砕しています。普通の砥石も試してみましたが砥汁の色が黒っぽくならず、砥石が減るだけでした。以下のダイヤモンド砥石を試してみました。

www.fujiwarasangyo-markeweb2.com

 これはガンガン削れます。しかし、#400番を使うとダイヤモンドヤスリと同様にエッジが欠けてしまいます。エッジ以外の整形には#400を使い、大まかな形が整ったところで、#1000に切り替え力を入れずエッジを研ぐのが良さそうです。

www.tamiya.com 作業は庖丁研ぎと同じ要領ですが、エンドミルは小さく直接持つと安定しないので、3.2mmまでつかめるピンバイスを使用しました。やはり持ち手があると格段に安定します。

 

  刃は研ぎだせそうになってきました。しかし、手作業ですのでA,Bの研ぐ量が変ってしまうと芯がぶれてしまいます。どのように芯を保つかが次の課題になります。

 このエンドミルはシャンク部以外を半月に削り出し先端を三角にしたものです。半月を作る面は円柱の芯にあるはずなので研ぎません。少々のバリが出てしまっても使っているうちに落ちてしまうので放置です。この面には指一本触れません。つまりこれが芯のリファレンスになるはずです。

 芯を確かめるには、回転するフォルダにエンドミルを固定し、研ぎだしている先端が半月面のラインと一致しているか、90度回転させながら見れば良いことになります。しかしながら0.2mm幅の先端のブレを肉眼で見極めることはできませんので、SMDの半田でいつもお世話になっている実体顕微鏡を使うことにしました。

www.hozan.co.jp 半田付けもそうですが見えてしまえば何とかなることが多いです。先端が0.2mmにできるかどうかも、顕微鏡で新品のエンドミルと見比べればOKそうです。

  と言うことでやってみました。

f:id:jun930:20191228221734j:plain

 研ぎが終わったので、試し切りです。

f:id:jun930:20191228221923j:plain

 うわ、凄いバリだらけになってしまいました。何が悪いのか?まだまだ腕を磨く必要がありそうですw

f:id:jun930:20191228222021j:plain

 バリを落としてみると、使えるレベルの仕上がりでした。

一様乱数の分散

これは2008/5/11の記事です。

------------------------------------------------------------------------------------------------

ちょっと気になったのでメモ程度に・・・

正規分布を返すメソッド

 仕事や趣味を通じてプログラムを書くことが多いのですが、正規分布を返すものが欲しくなりちょっと調べたら、 java には java.util.Random.nextGaussian() なるお便利なメソッドがあることがわかりました。このメソッドは平均 0.0、標準偏差 1.0 のガウス (「正規」) 分布の double 型の擬似乱数を返します。javaのライブラリは充実していますねぇ。

 で、一般的にこれっぽいことをするにはどうするのかを調べたら、Rubyの実装例が見つかりました。

def gaussian()
   sum = 0.0
   12.times{ sum += rand() }
   return sum - 6
end

 乱数を12回足して6を引くと不思議なことに正規分布を返します。おもしろいですねぇ。

 区間[0,1]の一様乱数の分散は 1/12 だそうで、12個足し合わせて無理やり分散を 1 にしています。最後に平均が 0 になるように 6 を引いています。

◆1/12を確かめる

 区間[0,1]の一様乱数の分散が 1/12 であることは気になります。分散の定義から検証してみたいと思いました。

 分散はデータのばらつき度合を示す指標で equ.1 を使って計算できます。

f:id:jun930:20191224100421p:plainequ.1

 区間[0,1]の一様乱数の平均は 1/2 ですから、( 1/2 - x )2区間[0,1]で定積分すれば良いと思われます。

f:id:jun930:20191224100454p:plain

 おおっ、1/12 になりました!

 分散はデータの二乗平均から平均の二乗を引くことでも求めることができますので、こちらも検証してみましょう。二乗平均は x2区間[0,1]で定積分します。平均の二乗は 1/2 の二乗です。

f:id:jun930:20191224100515p:plain

 おおー、これもちゃんと 1/12 になっています。(あたりまえか・・・)

◆この際だからプログラムでも確かめちゃう

 以下はRubyのコードです。いっぱい回してみます。

n = 1000000
s = 0
n.times{
  r = rand()
  s += (r - 0.5) * (r - 0.5)
}

puts s/n

 0.08338865747202297 こんな数値が出ました。

 乱数の分散なんてあまり考えたこともなかったので 1/12 とか言われちゃうと気になります。とりあえず気が済みました。忘れないように書きました。

Replicator2Xの温度センサー換装

この記事は2013/12/27のものです。

 当時、熱電対の接合処理に衝撃を受けてこの記事を書きました。その後この3Dプリンタは多くのトラブルを起こしながらも稼働しています。

 トラブルの中でも長年決定打が見つからなかったABSの反り問題は、

www.cadshop610.com

 これを使うようになってからすごく調子がいいです。

------------------------------------------------------------------------------------------------

 あこがれの3Dプリンタが導入され使い始めたところ、いろいろなトラブルに見舞われ勉強の日々が続いております。トラブルの一つは温度センサーの接触不良です。温度センサーはベッドと2つのホットエンドに付いており、ある日突然左のホットエンドのエラーが出るようになりました。

■K型熱電対

 Rep2Xは2つのホットエンドがあるのでとりあえずエラーの出ない方を使っていました。しかし、印刷中に温度センサーエラーが発生するとLCDの進捗表示が消えてしまうなど気持ち悪いです。そこでセンサーを交換することにしました。純正部品以外に国内で入手できないかと思い調べてみると、どうやらセンサーはK型の熱電対のようです。であれば、何でもいいので秋月で販売されている物に換装することにしました。

■分解

 センサーを交換するにはホットエンドを取り出す必要があります。取説に従ってフィラメントの送りモータを取り除きます。下の写真は左側を取り外したところ、このときフィラメントが詰まってアンロードできなくなってしまったのでフィラメントが刺さりっぱなしになってます。温度センサーは左側からちょろっと出ているケーブルの先にあります。

f:id:jun930:20190618113400j:plain

 X軸からアルミの台座を取り外すと以下のようにホットエンドを摘出できます。

f:id:jun930:20190618113412j:plain

 センサーはM3のネジと一体化されていますので、ねじると取ることができます。センサーのネジ穴に別途M3のネジとワッシャ使い秋月センサーの先端部を固定しました。左側の白いケーブルが秋月センサーです。

f:id:jun930:20190618113424j:plain

 元々のセンサーの赤はアルメル(-)、黄色はクロメル(+)のようです。コントロール基板の赤側に‐、黄色側に+を接続します。偶然にも秋月のセンサーはケーブルの長さがオリジナルよりも気持ち短いですが継ぎ足しなしで使うことができました。ラッキーです!センサーのエラーも解消され元気を取り戻しました。

■どこが接触不良なのか?

 摘出したオリジナルセンサーは何処の接触が悪いのか調べてみました。線を触ったところ途中で断線している感じは無くどうやら先端部のようです。しかし、先端部はネジとセンサーがカシメで一体化されしまっているので線を引っぱっても取れません。仕方がないのでカシメ部を切断することにしました。するとウマく引き抜けました。以下のような感じです。

f:id:jun930:20190618113433j:plain

 更に先端を観察すると、こ、これは、なんと、ねじってあるだけでした!!

f:id:jun930:20190618113443j:plain

 製造中に溶接の工程が飛ばされたのか、そもそも溶接工程が無いのかは不明ですが、現物はねじってあるだけなので振動が加わったりすれば接触不良になるもの納得がいきます。

■オリジナルセンサーの補修

 もしも、溶接レスのセンサーだったら右側もダメになるかもしれないのでオリジナルセンサーを補修することにしました。

f:id:jun930:20190618113454j:plain

 偶然にも小型のスポット溶接機を自作中なのでテストも兼ねてくっ付けます。更に、切断したカシメ部分を放熱用シリコン接着剤で固め作業は完了です。

f:id:jun930:20190618113506j:plain

■まとめ

 同様のトラブルはネット上で良く見かけるので、もしかしたらセンサーは全て溶接されていない可能性もあると思っています。めんどくさいので右側のセンサーを分解して確かめるまではしていませんが。。調子の悪い方は秋月センサーへの換装をお勧めします。

 

TM-541リモートコントローラの制作

この記事は2012/10/27のものです。

------------------------------------------------------------------------------------------------

Translate this page:

 

 数年前にディスプレイが壊れた Kenwood TM-541 をローカル局から頂きました。その当時はガラスをバリバリに割ったようにLCD全体が点灯し数字が認識できない状態でした。ディスプレイの生きているTM-x41シリーズを入手したらLCDを交換しようと思っていました。(現在は、数か所光りっぱなしになるセルが存在し、LCDの温度が下がると見えにくくなり、温度が上がると以下のように大体読めるようになります。)

f:id:jun930:20190616213105j:plain

 同時にTM-x21, TM-x31, TM-x41シリーズには RC-10, RC-20 と言うリモートコントローラがあることも知りました。リモートコントローラは8ピンのマイクコネクターに挿すと使えるようになります。どこかのピンを使って無線機のマイコンと通信機能があると思われます。

f:id:jun930:20190616213117j:plain

 RC-10 の回路図を見るとマイク端子の UP, DOWN, PTT, AF OUTを利用してマイコンとの通信が行われていることがわかります。RC-10をRIGに接続してこの辺のピンにロジックアナライザを当ててるとSPI形式に類似したシリアル形式の通信が行われているように見えます。

 信号をハックするのはいろいろめんどくさそうだと思いインターネットを検索すると、N9XLC局のBLOGに到達しました。そのコメントに既にプロトコルを解析してドキュメントを作ったというURLがあります。このドキュメントにはとても詳しくプロトコルの詳細が書かれています。そこで、早速Arduinoへ実装してみました。

f:id:jun930:20190616213129j:plain

 無線機との接続は簡単です。まず、6ピンのAF OUTをHIGH(5V)にするとRIGはリモートコントロールモードに入ります。したがって、マイコンの接続時は6ピンを常にHIGHにします。

 その他 RIG と Arduino の接続は、以下の通りです。

マイク端子のピン番号 Arduinoのポート番号 備考
2(PTT) 2 RIG->Arduino
3(DOWN) 4 Arduino->RIG
4(UP) 3 CLOCK
6(AF OUT) Vcc  
8(GND) GND  

 ブレッドボードを使って適当に配線した感じでは、信号は若干ノイジーでしたので、UPとGNDの間に 0.01uF を、PTTとGNDの間に 0.001uF を入れた状態で良好に動作しています。

 作成したファームウェアは RC-10/20 のプロトコルをシリアル信号に変換すると同時に、16 x 2のLCDをリモートディスプレイとして利用できるようにしました。LCDArduino との接続は以下の通りです。

Arduinoのポート番号 LCDのピン 備考
5 RS  
6 RW  
7 EN  
A2 D4  
A3 D5  
A4 D6  
A5 D7  

 また、シリアルからRIGにコマンドを送信することができます。シリアルターミナルを使い、Arduinoに9600bpsで接続し、Ludovic氏のドキュメントにあるコマンドを参照し16進文字列を送るとRIGを操作することができます。例えば 0A は送信、0B は受信、03 8A を続けて送ると電源OFF、03 80 を続けて送ると電源ONです。

 ソースコードGithubに公開しました Arduinoバージョンは1.0.1です。このファームは非商用の目的の範囲にておいてご自由にお使いください。お約束ですがこのファームを使用したことによって生じる一切の事柄について作者は責任を負いません。

 最後に、素晴らしいハック情報を提供してくれた Ludovic氏に感謝いたします。

Sable-2015 配電基板を作る

 Sable-2015本体からモータードライバへの配線をまとめたいと考え、配電基板なるものに配線を集約することにしました。ステッピングモータや原点センサ、スピンドルも含めた配線は背面の配電基板に集約されモータードライバへ配線します。

f:id:jun930:20190616145109j:plain

 この基板は配電目的以外にスピンドルの速度制御機能も兼ねています。Sable-2015のスピンドルセットには専用電源が付いており、軸制御系の電源とは別系統の電源になっています。このように電源を分けておくと、スピンドルから発生するノイズが制御系に回り込みにくく、不具合が起きにくい利点があります。

 取扱説明書のスピンドルのON/OFF制御はSSRを使って100VをON/OFFするようにユーザが実装しましょうとなっています。しかし、grblのスピンドル制御はPWMによる速度制御なので、それを活かすような実装をして行こうと思います。

f:id:jun930:20190616145036j:plain

 上の回路図はCN-R5GよりPWMを受け取りU4をON/OFFすることでスピンドルの回転数を制御する回路です。24Vのハイサイドは別電源なのでOKとして、問題は制御信号のGNDとスピンドルのGNDを接続しなければならないところです。ノイズがいっぱい載っているスピンドルからの帰還電流をGND経由でその他の回路に伝えない様に考慮する必要があります。

f:id:jun930:20190616145044j:plain

 対策として、この部分のパターンを小さくまとめる。スピンドル系のGND(ベタ)を分離して帰還電流の通り道から少し離れたところで制御系のGND(ベタ)と接続するようにしました。帰還電流はU4のソースの足からCN_24Vに向かって流れます。さらにスピンドルのケーブルにはパッチンコアを入れました。通しただけでなく、念のため1ターンしました。

f:id:jun930:20190616145059j:plain

 基板はこれまで使ってきたmini-CNC BLACK 1510で切削しました。mini-CNC BLACK 1510は単一電源で動作しており、以前スピンドルノイズの回り込みに泣かされました。mini-CNC BLACK 1510の駆動回路と制御回路は全て自作で、シリアルラインでPCとアイソレートしているだけで、grblとモータードライバが電源を共有しており、そこがノイズに対する弱点でした。この構成でもスピンドルのラインを、パッチンコアに2ターンすることで誤動作は収まり、以来安定稼働しています。

 一方、Sable-2015のモータードライバはgrblの制御信号をフォトカップラでアイソレートしていますので、mini-CNC BLACK 1510の構成よりもノイズ耐性があります。今のところ配電基板経由の動作でスピンドルを回してもgrblによる制御への影響はなくほっとしています。

Sable-2015付属のモータードライバ

 Sable-2015をgrblで動かしたく先人の知恵を検索していたら不具合の情報を見つけました。

kyouminotepad.web.fc2.com この不具合の原因を良く見つけたと感心しました。手元のフォトカプラも同じか確認しました。(画像中の数字はピン番号の割り当てメモです)

f:id:jun930:20190616103803j:plain

 中を開けるとEL817が実装されています。同じです。不具合の原因は信号をフォトカプラの出口から見たときにSTEPがDIRを追い越してしまうことです。これはMach3を使った場合なので、grblの場合はどうなのかオシロで確認してみました。

f:id:jun930:20190616104505j:plain

 DIR(黄色)の切り替えからSTEP(水色)までおよそ1msの余裕がありました。grblで使用する限りフォトカプラは交換してくても良さそうです。とりあえず無改造で使うことにしました。