JP7FKFの備忘録

ヒトは,忘れる生き物だから.

つくりたいもの

今後作りたいものがいろいろある.


・デジタルSWRメータ
氾濫原さん(https://lowreal.net/2016/03/08/1)の記事を見て作りたくなって作ってる.
デジタルSWRメータの作製1 =方向性結合器の作製= - JP7FKFの備忘録
デジタルSWRメータの作製2 =方向性結合器の作製2= - JP7FKFの備忘録
このエントリでも紹介してあったが,方結がうまく動いてなくて止まってた.
原因はなんとコアを通る同軸の外皮の両端がシャーシ(GND)に落としてあるということだった.
当たり前だ.GNDを伝わる電流がコア内部を流れてしまう.
これに気づくのにしばらくかかってしまった.わけがわからない.
ということでうまくいきそうです.
(というか今の所PICマイコン(PIC16F88)を使って仮組みしてあるのですが,かねいい感じです)
ただ,PICのメモリが今の時代にしては極端に小さく,POWER関数を計算するだけでプログラムメモリがあっぷあっぷで,他の実装がろくにできません.進行波,反射はの電力とSWRを計算して出すくらいはできるんだけど.
なので,ARMに移植してみようかなと考えています.
PIC16F88は10bitADCしかもっていないため,特に大電力域での電力分解能が著しく落ちます.
なので,少なくとも12bitADCを使いたい.なので,12bitADCが内蔵されていて,かつプログラムメモリも十分であるSTM32F042(http://akizukidenshi.com/catalog/g/gI-10789/)なんかを使ってみようかと考えている.
正直オーバースペックなのだが,なんにせよこの価格は安い.なのでまぁいいかという感じ.

・アンテナアナライザ
これも氾濫原さんのところで見たやつです.
簡単かつ安く高精度なアンテナアナライザーを自作したい | tech - 氾濫原
アンテナアナライザーをケースに収めた | tech - 氾濫原
市販のアナライザと同じような波形が出ていて,十分使い物になりそう.
先日AD9851のモジュール(http://akizukidenshi.com/catalog/g/gM-09945/)をPICやらnucleoでいじってみたのだけど,簡単なシリアル通信で周波数設定ができるし,非常に使い易い.
なので私にもできそう.今はRFスイッチの入手をどうしようか苦労してる.

・VNA
これはHFアップコンバータなどの頒布でもお世話になったTT@北海道さんのところの記事で見た.
DDS AD9859とGNURadioでVNAを作ってみる(5.周波数レンジ拡大2GHz編) - Computer Radio RF Tech
VNA製作(6):matplotlibとSciKit-RFによる校正とスミスチャートのプロット - Computer Radio RF Tech
HFコンバータキットのポート特性を自作VNAで眺めてみる - Computer Radio RF Tech
NanoVNA(仮称)を製作予定です - Computer Radio RF Tech

非常によくできており,DG8SAQさんのところのVNWA(http://sdr-kits.net/VNWA3_Description.html)とも良く似た特性が出ていて(仕組みは同じだから当たり前といえば当たり前なのだが)使い物になりそう.
AD9859が若干高価なのが痛い.
けど,RSオンラインでAD9859は手に入るし,ミキサであるSA612もRSで手に入る.
なので実現はできそう.
私の場合これにBluetoothやら何やらで他の液晶に転送して表示するということをやりたいかもしれない.
たぶんnanoVNAでTT@北海道さんがSDカードソケットをつけているのはFlashAirをつけて同じようなことをしようとしているのか?とも思った.

オシロスコープ
オシロを持ってない.高価なので買う気になれないので作りたい感じ.
別に高機能を求めているわけでなく,時々信号が見たいときがあるのでそういう時に使えればいいかなという感じ.
ATT,アンプと高速ADC,CPLDSRAMMPUで構成しようかなという感じ.
おそらく観れるのは10MHzくらいが限度か?
なので最近はCPLDに手を出そうとしています.
で,CPLDは所持しているのですが書き込み機を持っていません.
なので書き込み機を作るところからです.
JTAGの書き込み機を自作しているページがちらほらあるので,まずはLチカ(もしくはAND回路?)からかな?

で,ここまで書いて思った事.
自分は誰かのやっていることをコピーしているだけで,オリジナリティがないなぁと思う.
TT@北海道さんなんかはアイディアも知識も技能も素晴らしく,いろいろなモノの組み合わせで新しい事をしている.
氾濫原のcho45さんなんかは,webまわりのプログラミング知識だけでなくRFにも精通する人で,この方も新しい事をしている.

私はそんな人をただ真似ているだけで,新しい事をしていない.
第一,私はもともと新しいことをしたいわけじゃなく,測定器やら機材にあまりお金をかけられないので,自分で作ってしまいたいという思いがあるからなのかもしれない.まぁパーツやなんやらを買うと測定器が買えてしまうくらいのお金をかけている場合もよくあるのだが,作るとともに知識も同時に得る事ができればと思っている.
なので,作っている時はあんまり楽しくない(要は作業だから)ときもある.
だが自分でその測定器やら機材を手に入れたいから作る.

しかし最近はちょっと新しいこともしたいなという思いもある.
楽しみながらやる工作っていいよなと思う.
そもそも,そういうものがものづくりの根底な気もする.
という最近の心情.

作れる測定器をさっさと作って,そろそろ新しいことをやってみようかなという感じ.

オーディオレベルメータを作ってみた

本題のとおり,以前作成したD級アンプ(TPA3122D2を用いたD級アンプの製作 - JP7FKFの備忘録)にレベルメータを追加してみた.

www.youtube.com

回路は簡単に,オペアンプで入力信号を増幅して,マイコンのADCで受ける.

そのADCの値に応じてLEDを光らせるという単純なものだ.
入力まわりの回路は以下のようにした.
f:id:jp7fkf:20160811223319p:plain
入力側から,DCカットのコンデンサ,非反転増幅をするオペアンプ,半波整流,そして最後にLPFを入れている.

入力は,RかLの片一方を取っている.今回はバーLEDを一つしか使わないので,それでいいと思った.
本気でやるなら,RとLの平均を取ったりなんだりするんだろうけど,別にRとLは多くの場合同じような音圧だと思うし,私はそこまで真面目にレベルメータを使おうと思ってないし.

真面目に作るなら音圧レベルに応じてキャリブレーションしたりなんだりきちんとするべきだし.

オペアンプの増幅度は適当に実験しながら決めればいいと思う.
整流はめんどくさいので小信号用ダイオードでカジュアルに半波整流.

LPFの定数も,作りながら適当に決めた.
ゆっくり下がっていくのが好きな人もいれば,LEDが音声に応じて高速にチカチカ応答してくれるのが好きな人もいるだろうから,
これは個人の好きな時定数を選べばいいと思う.

実のところ,間違って開けた穴をなんとかして塞ぎたかっただけなのだが,
案外いいかんじのアンプになったと思う.
音楽に合わせてレベルメータが上下してくれるとやはりなんだか楽しい.
また,このアンプもレベルメータも自分でつくったもんだから,愛着はやっぱり計り知れない.

また,音質にこだわる人はこのレベルメータによる音質低下を懸念されるかもしれないが,
今の所特に気になる点はない.というか,私はもともとそこまでこだわって聞いていない.

普通に使う分にはD級アンプサイコーです.省電力だし小型だし.

しかしこれだとまぶしくてウザいということになりかねない.
今,電源ONから遅延させてスピーカー出力のリレーを駆動させている部分にPICマイコンを用いているのだが,そのマイコンの足が空いてるので,その足とメインボリュームのON,OFFのタイミングをうまく組み合わせて,レベルメータの有効,無効を切り替えれるようにしたいと思っている.

具体的には,メインボリュームをONにしてLEDのblinkingが始まって,それが終わるまで(出力ONになるまで)の間にボリュームがOFFになったときに,有効から無効,または無効から有効に切り替え用と思っている.
これはマイコン内部のEEPROMに保存しておいて,電源を切っても前の設定を保存するようにする.

これでもっと使いやすくなるだろうから,早く改造したい.

rbenvなrubyをcronで回す

ドはまりしたので載せておく.
$ crontab -e とかの設定ファイルにこいつを書く.

* * * * * {username(なくてもいい)} /bin/bash -c 'export PATH="$HOME/.rbenv/bin:$PATH" && eval "$(rbenv init -)" && cd {実行したいrbファイルのディレクトリまでのパス} && ruby {実行したい.rb}'

blog.livedoor.jp

ここを参照したのだけど,結局1,2,3のうち2がうまくいった.
gemで怒られたりいろいろしたけど上記のやつならうまくいった.


=2017/04/06追記=
usernameはなくてもいいって書いたけど,逆にあるとうまくいかない
/bin/sh: 1: {username}: not found
と言われる.なので今のところ下記が良さそう.

* * * * * /bin/bash -c 'export PATH="$HOME/.rbenv/bin:$PATH" && eval "$(rbenv init -)" && cd {実行したいrbファイルのディレクトリまでのパス} && ruby {実行したい.rb}'

screenコマンドでシリアル通信しながらxmodem転送

mac El capitanでxmodemした

http://netmark.jp/2011/12/gnu-screen-xmodem.html

上記がとても参考になったので備忘録として書いておく.

lrzszをインストールしておく

$ brew install lrzsz

screenを使ってシリアル接続する.

多分大体こんな感じだと思う.USB接続されたデバイスはdevの下にあるはずなので.tty.まで打つと補完が効くと思う.

$ screen /dev/tty.usbserial

Xmodem転送の実行

Ctrl+aを一回押し,コロンを入力するとコンソールの下らへんにコロンが入力されていて,コマンドが打てるようになる.
そこに下記のようにコマンドを入れて実行する.

:exec !! /usr/local/Cellar/lrzsz/0.12.20/bin/lsx -kb [ファイルまでのパス]

/usr/local/Cellar/lrzsz/0.12.20/bin/lsx はバージョンによって変わってくると思うので適切に.
ファイルまでのパスはフルパスいれればいいと思う.相対パスはどこ基準なのだろう?
たぶん/usr/local/Cellar/lrzsz/0.12.20/bin/lsxか?
オプションの-kbは1kパケットのバイナリ転送.

$ /usr/local/Cellar/lrzsz/0.12.20/bin/lsx --help

すればオプションが確認できるのでお好みで.

Rubyを用いて予定をgoogle カレンダーに登録する

あるページから自動で予定をスクレイピングしてきて自動的にGoogle Calendarに登録したかったので,Rubyを使って実現した.

使ったバージョンは下記のとおり
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin15]
google-api-client (0.8.6)
#google-api-clientが,0.9以降だと下記のコードは使えない.
#v0.9以降では,require で 'google/api_client' の下の階層の指定が必要らしいです.

まずはgemをインストールする

$ gem install google-api-client -v 0.8.6

google developerで認証等の手続きをする
google dev. console ( https://console.developers.google.com/ )に行って,Credentialsの登録をする.

Create credentialsをクリック
f:id:jp7fkf:20160715214239p:plain
Service account keyでアカウントを作成する
f:id:jp7fkf:20160715214243p:plain
今回はP12 keyを用いた.JSONがRecommendされてるから次からはJSON使おう.
f:id:jp7fkf:20160715220324p:plain
account nameやIDを入力.Createをクリックすると,P12キーがダウンロードされ,secret passwordが表示されるのでメモっとく.
これで登録は完了だ.

準備ができたのでコードを書く.いろいろなサイトを参照したが,
以下のようなコードができた.

# encoding: UTF-8
require 'google/api_client'

CALENDAR_ID = '[登録したいカレンダーのID]'

client = Google::APIClient.new(:application_name => 'test')

# 認証
key = Google::APIClient::KeyUtils.load_from_pkcs12('[p12ファイルへのパス]', '[秘密のパスワード]')
client.authorization = Signet::OAuth2::Client.new(
token_credential_uri: 'https://accounts.google.com/o/oauth2/token',
audience: 'https://accounts.google.com/o/oauth2/token',
scope: 'https://www.googleapis.com/auth/calendar',
issuer: '[シークレットアカウント(emailアドレス形式)]',
signing_key: key
)
client.authorization.fetch_access_token!

# google calendar に登録
cal = client.discovered_api('calendar', 'v3')

event_name = "New Event!" #イベントのタイトル(summary)

event = {
'summary' => event_name,
'start' => {
'date' => "[開始日の日付]",
},
'end' => {
'date' => "[終了日の日付]",
}
}

result = client.execute(:api_method => cal.events.insert,
:parameters => {'calendarId' => CALENDAR_ID},
:body => JSON.dump(event),
:headers => {'Content-Type' => 'application/json'})

以下の部分をAPIのReferenceに合わせて上手に書いてあげることでいろいろなことができる.

result = client.execute(:api_method => cal.events.insert,
:parameters => {'calendarId' => CALENDAR_ID},
:body => JSON.dump(event),
:headers => {'Content-Type' => 'application/json'})

:api_method => cal.events.insert
の部分を cal.events.[やりたい動作] にして,
Referenceに書いてある Parameters を与えてやる.

:parameters => {'calendarId' => CALENDAR_ID}

bodyやその他もろもろも,Referenceを覗いて,それを書いてあげるだけでいい.
今回は,eventの中身をjson formatにしてあるので(どこかのコードを参考にしたため),jsonでstart.dateやend.dateを指定しているが,eventオブジェクトを生成してその中に入れていくということもできると思う.
例えば,書き換えると以下のようなことができる.


・現在を中心とした過去と未来の各6ヶ月分の予定を引っ張ってくる(計1年)

d = Date.today
time_max = (d >> 6).to_time.iso8601
time_min = (d << 6).to_time.iso8601
params = {'calendarId' => CALENDAR_ID,
'orderBy' => 'startTime',
'timeMax' => time_max,
'timeMin' => time_min,
'singleEvents' => 'True'}

result = client.execute(:api_method => cal.events.list,
:parameters => params)

これは,Referenceのlistを参考にするとよい.
f:id:jp7fkf:20160715214700p:plain
ここらへんを参考にパラメータをうめていく.


・削除する(イベントIDとカレンダーIDを指定する)

params = {'calendarId' => CALENDAR_ID,
'eventId' => event.id}
result = client.execute(:api_method => cal.events.delete,
:parameters => params)

DeleteはcalendarIdとeventIdを指定しろと書いてあるから,それだけ.
f:id:jp7fkf:20160715214734p:plain

==参考==
Google Calendar API Reference
https://developers.google.com/google-apps/calendar/v3/reference/

Google Calendar API を使って予定表を自動更新したりする
http://maehrm.hatenablog.com/entry/20141216/p1

Googleカレンダーに予定をRubyで登録する
http://maehrm.hatenablog.com/entry/20141216/p1

rubygoogleカレンダーのイベントを取得するメモ
http://qiita.com/mechamogera/items/bf2ed20e332dc31d2352

ファイルの復元結果

先日Recuvaと,Ease US Data Recovery Wizard の比較をしていた.

復元した結果が出たので,お知らせ.

Recuvaは148件きちんと復元.

Ease US Data Recovery Wizardはというと

f:id:jp7fkf:20160520235327p:plain

こちらも273個きちんと復元.

いずれにせよ,検知も復元もきちんとできたEase US Data Recovery Wizardいいですね.

ここでネタバレなんですけど,Ease US Data Recovery Wizardは,こうやってブログでレビューを書くと,無料でEase US Data Recovery Wizard Professionalにアップグレードできるライセンスがもらえるのです.(そういうキャンペーンをやっています 2016/05/20現在)

なので,先日とか(ステルス)マーケティングみたいな記事になったわけなんですけど,それにしてもこのソフトはいいソフトだと思います.

検知率も復元率もよい.

いざというときはレビューで紹介してコードをもらってみてはいかがでしょうか.

デジタルSWRメータの作製2 =方向性結合器の作製2=

先日作った方向性結合器だが,うまく動作してくれずに悩んでいる.

コアの向きが違うのか?と思って向きを変えていくつものパターンを試したりしたけど,一つもうまくいかない.回路は理解できてると思っていて,その通りに組んでいるはずなのだけど動いていない.

症状としては,FWD出力,REF出力両方同じようなパワーが出てきてしまっている.

ANT側を50オームで終端してもしなくてもだ.

なにか高周波的な罠にはまっている気がする.

小さく収めようとしすぎて結合したりしてしまっているのだろうか?

GNDで囲っているから結合はあまりないと思っているけど,GNDとコアが近すぎて影響していたりするのだろうか?

高周波の工作は初めてだから,このあたりで躓いている可能性は大いにある.

うーんわからない.HELP.