2018年9月27日木曜日

ArduinoでSin波形を出力させる その2

Arduinoを使い、Sin波形を出す方法をネット上で見つけたが、内容が非常に深く、理解するまでにかなりの時間がかかった。(それでも十分理解したとは言い難い)一部備忘録としてまとめる。

さて、Arduinoの動作周波数から、以前のやり方では、どうしても高い周波数のSin波を出力することが難しかった。(最高でも910Hz)このサイトの記事を見ると、16kHzまで出せるという。これはやりかたを勉強しなくてはならない。

お手本は 大輔 岡氏の
https://qiita.com/daisukeokaoss/items/787dab2371d29a82308f
元ネタが
http://interface.khm.de/index.php/lab/interfaces-advanced/arduino-dds-sinewave-generator/
である。

いくつかのポイントがあり、
(1)Sin波形データを用意してそれを順次取り出して出力する考え方は同じ。
(2)Sin波形の周波数を極めて正確にすることが一つのポイント。(Direct Digital Synthesis (DDS) )
(3)そのために、内部のタイマーによる割り込みを使っている。
(4)出力はPWM(Pulese Width Modulation)で、基本的にLPF(Low Pass Filter)を介してSin波形を出力させる。
(5)最高16kHzを出力させるため、ライブラリーを使うことなく、直接にマイコンを制御している。コマンドも工夫されている。

それぞれ補足すると、
(1)前は普通に配列を用意してSinデータを保存していたが、この例では、少ない(UNOでは1kbyteしかない)SRAM領域を使わずに、プログラム領域にデータを保存している。



(スケッチ冒頭に#include "avr/pgmspace.h"とあるが、以下のArduino Referenceにある通り、IDEバージョンが1.0以下だと必要なのであって、それ以降であれば不要。
PROGMEM is part of the pgmspace.h library. It is included automatically in modern versions of the IDE, however if you are using an IDE version below 1.0 (2011), you’ll first need to include the library at the top your sketch, like this:)

(2)(3)周波数精度を決めるのは16MHzのクリスタル発振器である。
(4)D/A変換は使用していない。
(5)Arduinoではなく、AVRマイコンのことを書いていたりするので、端子名称など、混同しないようにしないといけない。

大輔 岡氏のスケッチのうち、
dfreq=1.0; // initial output frequency = 1000.o Hz
の部分を
dfreq=1000.0; // initial output frequency = 1000.o Hz
として出力を見る。
LCフィルターがないので、図のようなCRフィルターで見ると、一応1kHzのようなSin波が出ているのが確認できた。(CRフィルターなので、出力レベルは低い)


横軸は1目盛り100μs
上がPD11の出力、下のSin波がCRフィルターの出力である。Sin波のギザギザはフィルターの特性が悪いことによる。後述の写真とやや似ている波形になっている。

まずは少しずつプログラムを解析していくことにする。
正確なタイミングでSin波を出すための割り込みについて、内臓のタイマーカウンターも含め以下の「うしこ」さんのサイトが詳しい。
http://usicolog.nomaki.jp/engineering/avr/avrInterrupt.html
http://usicolog.nomaki.jp/engineering/avr/avrPWM.html

タイマーカウンターと割り込みの動作
タイマーカウンターは、とても複雑で(機能豊富で)なかなか理解ができない。
ともかく今回はTimer2をつかっているので、そこだけを注目して見ていく。
Timer2はTimer0と同じく8bitのカウンターである。これをクロックでカウントアップしていくので、0〜255までカウントする。Arduino UNOのクロックは16MHzだが、カウンターのクロックは16MHzではないようだ。
以下のスケッチで確認すると、


内容をざっと説明する。
setup()でタイマーカウンターの動作を設定する。10,11行にある、TCCR2A,TCCR2Bレジスタの各ビットが意味を持ち、(内容の詳細は前述の「うしこ」さんのサイト参照)タイマーカウンターのクロックは分周なしに、直接カウンターを駆動(スピードが最も早い)、カウンターの値がレジスタのOCR2Aと同じになったら、PD11の出力をLにするように設定した。この例では0〜0xFF(255)までカウントアップしていく途中の中間値をレジスタOCR2Aにセット、PD11をオシロスコープで見ると、HとLが半分ずつ(duty50%)になるはずである。

Timer2がオーバーフローしたら(すなわち0xFFになったら)割り込みが発生し、この関数(23行)を動かす。今回はPD7をON,OFFさせている。通常であれば
 digitalWrite(7, HIGH);
 digitalWrite(7, LOW);
とするところだが、高速化するために、こういった書き方をしている。
PD7の出力をオシロスコープで見ることで、Timer2がどれくらいの周期で動いているのかがわかるはずである。
オシロスコープの波形は以下の通りである。

上がPD7、下がPD11である。やはりPD11出力はduty50%になっている。
横軸は1メモリ10μSなので、Timer2が0〜0xFF(255)までカウントアップするのに、約32μSかかっていることが分かる。
1つカウントアップするのに、32/256(μS)かかっているので、カウンターのクロック周波数は
256/32(MHz)=8(MHz)となり、クリスタルの16MHzの半分であることが分かる。

どうやったらアナログ値を出力できるのか
PWMなので、Hの時間が長いと(H=5Vとして)平均値は5Vに近くなり、短いと0Vに近くなる。先のスケッチで言えば、OCR2Aに0xFF(255)をセットすれば5Vになり、0をセットすれば0Vになる。半分の0x7F(127)をセットすれば、2.5Vになる。
Sin波形データは0〜255の範囲にあるので、このデータを順にOCR2AにセットしていくことでSin波形が出力されることがわかる。

その時の周波数は
Sin波形のデータは全部で256個ある。これを32μSごとにOCR2Aにセットしていくと、1周期は32×256(μS)となり、その周波数は1/(32×256)(MHz)すなわち約122Hzにしかならない。どうやったら1kHzや16kHzが出るのか。

ここでサイト上にある、波形の写真をよく見てみよう。

⊿t=33.3μs  f=33.3kHzと表示されているが、おそらく上のPWM波形の周期を測っているのではないか。(2つの小さなクロス)先のテストでもPWMの周期が32μsなので、たぶん間違いない。
では、下のSin波の周期はというと、先の33.3μsからすると1目盛り100μsのようなので、半サイクルで約5目盛り。(つまり500μs)1サイクルで1msすなわち1kHzとなる。
スケッチのsetup()の部分に
dfreq=1000.0; // initial output frequency = 1000.o Hz
とあるので、1kHzは出るのだろう。

(ただ、スケッチを追っていくと、出力周波数は
 dfreq=analogRead(0);             // read Poti on analog pin 0 to adjust output frequency from 0..1023 Hz
というloop()にある一文によって自由に(0〜1,023Hz)変えることができるようである。
大輔 岡氏はこの部分を使わず、setup()で
 dfreq=1.0; // initial output frequency = 1000.o Hz
と変更して、1HzのSin波を出力させている。そのことはコメントで記載している。)


DDSの動作を含め、冒頭のスケッチの解析については改めて。

2018年9月10日月曜日

hp Pavilion にSSDを取り付け(2)SSDの取り付け

SSD購入
2.5インチSSDが物理的に使えることがわかったので、購入することにする。
HDDの容量が500Gbyteではあるが、実際の使用容量は、リカバリーを含めても50G以下のようなので、費用節約のため120GのSSDを購入する。officeが使えて、ネットが見られれば十分なので、あれこれソフトをインストールする予定もないし、この容量でまずはOK。




リカバリーディスクの作成
Windows updateもしたことなので、この後のいろいろな作業を前にリカバリーをUSBメモリに作る。容量は16Gbyte。作業方法はネットで検索すると出てくるのでそれを参考にする。

HDDクローンの作成
いよいよSSDにデータを移していくことになるが、ネット上にはSSD交換の記事を多く見つけることができる。今回はノートPCでの交換なので、データはUSBを介して転送することになる。データ移行ソフトもフリーソフトがあるので、使い方を含めよく見ておく。今回はEaseUS Todo Backup Free 10.6を使用、ダウンロードする。

このソフトでクローンを作成するが、HDDはCドライブとリカバリーの入ったDドライブに別れている。Cドライブは400Gbyte以上あり、SSDが120Gbyteなので、容量差を解決しないとクローン作成ができない。HDDのパーティションを切り直し、Cドライブを小さくする必要がある。

Cドライブの縮小
Windows8.1ではパーティションの変更が機能としてついているので、それを利用する。
エクスプローラーを立ち上げ、「PC」を右クリックすると「管理」メニューがあるので、そこから「ディスク管理」を選択して作業をすすめる。
「コントロールパネル」>「システムとセキュリティ」>「管理ツール」でも同様。

今回は知らずにフリーのソフト(EaseUS Partition Master 12.9)をインストールしてパーティションを切った。
Cドライブをかなり小さくしたので、Dドライブとの合計がSSDより小さくなる。SSDに交換後、SSDをフルに使えるのか心配したが、差分はDドライブが拡大して、未使用部分が生じないようにしているようだ。

縮小が完了したらクローンの作成に入る。購入したSSDを以前買っていたHDDケースに装着し、USB接続する。


SSDをHDDケースにセットしたところ


実は今回、新しいSSDをHDDケースに入れてUSB接続した際、SSDを認識しないと思ってしまった。新しいSSDは「未割り当て」状態なので、、エクスプローラーでは表示されない。しかし管理ツールを立ち上げると、「未割り当て」として120Gbyteくらいが認識される。このとき、表示枠の下に隠れていて、見えなかったので、認識していないのでは、と思ってしまった。
スライダーを移動させると、ちゃんと「ドライブ1」として出てくる。(現用ドライブは”0”)

クローンの作成
フリーソフトのEaseUS Todo Backup Free 10.6を使って、容量を小さくしたHDDドライブのクローンをSSDに作成する。
今回誤ってCドライブのみのクローンを作ってしまったところ、SSDに交換後、ブートできないというメッセージが出て立ち上がらなかった。そこで再度C、D含むHDD全体のクローンを作ってOKとなった。

120GbyteのSSDではあるが、作業時間は1時間以上かかるので、完了まで放っておく。
出来上がるとSSDにCドライブ、Dドライブのクローンができ、リカバリーの入ったDドライブが容量拡大になっていることがわかった。(差分がDに追加された)

HDDとSSDを交換
以前に書いた手順に従って本体をバラし、HDDとSSDを入れ替える。交換後の動作は非常に快適。
ここでDドライブの増加分をCドライブに移すが、これは簡単にいかなかった。
まずは管理ツールでDドライブを縮小する。この結果、「未割り当て」部分ができるが、そのままでCドライブの拡張をしようとしてもできない。「未割り当て」部分をCドライブのすぐ後に持ってこないと結合・拡張ができないようだ。(パーティションの名前の通り、縮小はパーティションを新たに切ることでできるが、拡張はパーティションを取り去ることで実現するのだから、当然といえば当然。)

管理ツールではこの移動ができないので、フリーソフトのEaseUS Partition Master 12.9を使って「未割り当て」部をCドライブの後に移動させる。移動が完了すれば、管理ツールでCドライブの拡張が可能になる。

2019/3/25追記
EaseUSについては下記サイトを参照してください。

https://jp.easeus.com/backup-software/free.html

また、EaseUS Partition Masterの公式ページはこちら

https://jp.easeus.com/partition-manager-software/free.html

hp Pavilion にSSDを取り付け(1)構造

中古で買ったhp Pavilion。Windows8.1で10.1インチのネットブック。
Wifi、Bluetooth OK。メモリは2Gbyteで交換増設不可。HDDは250Gbyteという。(実際装着されていたのは500Gbyte)
スピードは期待していなかったが、HDDが「黄信号」と書いてあって、いずれ交換が必要な物件であるため、SSDに交換する前提で購入。


動作テスト
買った直後に電源を入れたが、HDDもメモリもフル稼働でほとんど応答せず。とても使用に耐えるとは思えなかったが、Windowsのupdateも終えると、HDD、メモリともにおちついて、稼働率もそれなりに下がり、Windows8.1のためか、立ち上がりも早くて動作としてはまずまず使える範囲となる。

バラす
裏を見ても、簡単にHDDを交換できるような代物ではない。ネットで情報を仕入れ、これはキーボード面を外すタイプと思われる。
バッテリーを取り外し、裏面のネジを全て外し、ゴム足を取ると更にその下にもネジがある。



ゴム足を取ると、その下にネジがある。
ゴム足は両面テープで付けられている。



そのネジを外した後で、ディスプレーのヒンジカバーを外し、その下のネジも外す。
これで、キーボードが外れるが、縁のどこかからパリパリと外していく。マイナスドライバーでこじって開けると、プラスチックに跡が残るので、ネットの記事ではギターのピックを使っていた。

キーボードをそっと開けると、接続用のフィルム状のケーブルが2本あるので、基板側のコネクタを外す。外し方は、黒のプラスチックのロックパーツを垂直に起こすことでフィルムケーブルがすっと抜ける。これでキーボードは外れる。
キーボードを持ち上げたところ
HDDが見えるが、交換できそうなメモリは見当たらない。


キーボードをつないでいるコネクタ(外しているところ)

基板を見ると、HDDがあるので、交換はできそう。HDD本体が金属フレームに取り付けられた上で本体に取り付けられている。
取り外したHDD

HDDは金属のフレームに取り付けられている

メモリーは見たところ交換できるようではない。基板に直にメモリーがついたタイプのようだ。これはメモリ増設でスピードアップは望めないので、ますますSSD交換が必要。
ここで一旦もとに戻して正常に動作することを確認。

ラズベリーパイ奮闘中(5)LibreOfficeを日本語表示にする

Raspbianには最初からOfficeソフトとして、LibreOfficeが入っているが、メニューなどは英語のままである。やはりこれでは使いにくいので日本語表示の方法を探すと、以下のような回答を見つけた。

https://ask.libreoffice.org/ja/question/78824/ri-ben-yu-hua-surufang-fa-wojiao-etekudasai/

そこには

「Linuxであれば、langpackのインストールし忘れが考えられるので日本語のlangpackパッケージをインストールしてください。」

とあった。
そこでLibreOfficeのいずれかを開いた状態でメニューバーのTools -> Optionsからオプション画面を開く。
Language Settings -> Languages に移動。

そこで、
Language Of
   User interface;
がJapaneseになっていないといけないようだ。


日本語の設定画面User interfaceがJapaneseになっていないといけないが、
langpackがインストールされていないと、ここにJapaneseを設定できない。

実際日本語化されていない状態だと、ここにJapaneseを選択できないので、(Japaneseが出てこない)日本語のlangpackをインストールすることにする。

アプリケーション メニューの「設定」から「Add/Remove Software」を選択、LibreOfficeで検索すると、たくさん出てくるが、順に探すとlangpackが確かにあり、インストールされていなかった。



Japanese helpと Japanese language packageをインストールした後。
(Japaneseで検索)

これをインストール(チェックマークを入れてApply)するとRebootすることなく、LibreOfficeを立ち上げた時点で日本語の表記になった。(すべてのOfficeに適用)

もしならなければ、前述の
Language Of
   User interface;
がJapaneseになっているかを確認。


メニューバーが日本語化された(LibreOffice Writer)


INA219にはまる

 INA219電流センサーの互換品を買う。 互換品 オリジナル Adafruit Industries(エイダフルート) 商品レビューで評判が良くない。不良品が多すぎるという。 とはいえ全体の購入者数からすれば一部の人の評価だろうから、まあ大丈夫だろうと買う。 オリジナルの値段の...