オーディオレベルメータを作ってみた
本題のとおり,以前作成したD級アンプ(TPA3122D2を用いたD級アンプの製作 - JP7FKFの備忘録)にレベルメータを追加してみた.
回路は簡単に,オペアンプで入力信号を増幅して,マイコンのADCで受ける.
そのADCの値に応じてLEDを光らせるという単純なものだ.
入力まわりの回路は以下のようにした.
入力側から,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}'
ここを参照したのだけど,結局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をクリック
Service account keyでアカウントを作成する
今回はP12 keyを用いた.JSONがRecommendされてるから次からはJSON使おう.
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を参考にするとよい.
ここらへんを参考にパラメータをうめていく.
・削除する(イベントIDとカレンダーIDを指定する)
params = {'calendarId' => CALENDAR_ID, 'eventId' => event.id} result = client.execute(:api_method => cal.events.delete, :parameters => params)
DeleteはcalendarIdとeventIdを指定しろと書いてあるから,それだけ.
==参考==
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
rubyでgoogleカレンダーのイベントを取得するメモ
http://qiita.com/mechamogera/items/bf2ed20e332dc31d2352
ファイルの復元結果
先日Recuvaと,Ease US Data Recovery Wizard の比較をしていた.
復元した結果が出たので,お知らせ.
Recuvaは148件きちんと復元.
Ease US Data Recovery Wizardはというと
こちらも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.
ファイル復元ソフト EaseUS Data Recovery Wizardはすごい
昨日,データを誤って誤削除してしまった.
録画データなどが主だ.
私はいつもデータを削除するときはゴミ箱を経由せずに[Shift + Del.]するようにしているから,気づいた時には時すでに遅しでした.
そこで今回はデータ復旧ソフトを使ってみた.
まずは,おなじみ?のRecuvaを試してみた.
そこで得られた結果がこちらだ.
スキャンによりマッチしたのは148コだ.
本来はもっとたくさんのファイルがあったので,すべてのファイルを検知できたわけではないことを意味している.
このソフトでは,重要な,私のほしいデータは手に入らなかった.
次にこのソフトを試してみた.
EaseUS Data Recovery Wizardと呼ばれるものだ.
簡単な紹介をすると以下のようになる.
(EaseUS Data Recovery Wizard日本語公式サイトより抜粋)
================================================
削除、フォーマット、消失してしまったデータを復元する最高のフリーソフト
最高の無料データ復元ソフト - EaseUS Data Recovery Wizard は、あらゆるデータ損失の問題を解決できます。HDD、外付けHDD、USBメモリ、メモリカード、デジカメ、携帯、音楽プレーヤー、またはほかの記憶メディアから、削除、フォーマット、ソフトクラッシュ、HDD障害、ウィルスアタック、パーティション紛失またはほかの原因不明のデータ損失に対応できます。わずか3つのステップで消失したデータを簡単復元!
強力なデータ復旧機能
2種類のスキャンモード:『クィックスキャン』と『ディープスキャン』。『クィックスキャン』は間違って削除したデータの復元や、ゴミ箱を空にした後でのファイル復元に最適。『ディープスキャン』はアクセスできないパーティションや、完全消失、フォーマットしてしまった際のデータの復元に最適。
あらゆる失われたデータを復元:写真、ビデオ、音楽、Eメール、ドキュメント…
多彩な記憶装置に対応:パソコン、ノートパソコン、デジタル装置、記憶メディア…
いつでも一時停止、再開可能:スキャン中に一時停止し、スキャンの結果を保存して、次回スキャンせずに復元プロセスを再開することが可能です。
EaseUS Data Recovery Wizard は数多くのデバイスに対応できる無料データ復旧ソフト
EaseUS Data Recovery Wizard で色んなデータ損失状況から無料のデータ復旧を実現する
迅速、快適、精確、そして安全!
復元したいファイルの種類を指定してスキャンが可能
ファイル名、種類、日付でフィルタ検索ができ、ファイル復旧の時間を節約できます
復元を完了する前に、プレビューでファイルの詳細と品質を確認可能
安全、簡単、使いやすい!
3ステップでファイルを簡単復元できる、安全なデータリカバリツールです。データ復旧の経験がなくても、直感的で簡単なインターフェースにより復旧作業をおこなえます。初心者でもすぐ使える!
対話型の使いやすユーザーインターフェイスで、3ステップで失われたデータを復元できるように設計されています。
安全設計。デバイスに保存されたデータを破壊しないよう、元のデータに上書きなどをおこないません。
================================================
こちらのソフトも,利用はとても簡単だ.
このようなウィザードにしたがって進めていく.
この次では,ファイルの場所(どのドライブを検索するか)を選択し,スキャンを開始する.
スキャン結果がこれだ.
なんと273個のファイルを検知することに成功している.
先述のRecuvaの148個と比べて,約1.84倍も多くのファイルを検知している.
驚きである.
このファイルをきちんと復元できるかはまだわからないが,実行次第報告したいと思う.