2018年10月11日木曜日

ラズベリーパイ奮闘中(6)Bluetoothマウスとキーボードを接続

Bluetooth機器をつなぐ
ラスベリーパイ周辺にケーブルが多くなり煩わしいので、キーボード、マウスをBluetoothにしてみた。(Raspberry Pai3 ModelB + Raspbian)
マウスは中古ショップで買ったサンワサプライのMA-BTH20 Rというもの。

ペアリングは簡単で、マウスの電源を入れてから、右上のBluetoothマークを左クリック(以下クリックと省略)

 「Add Device...」をクリックしてSearching for Bluetooth devices...の表示を確認、マウスが見つかるまで待つ。(ここでマウスのConnectボタンを押す必要があるかも)
Bluetooth Optical Mouseが表示されたらそれをクリック。Pairボタンをクリックする。

もしかするとここでマウスの底面にあるConnectボタンを押す必要があるかもしれないが、一度ペアリングした後は、Remove Device... でペアリングを解除しても、PairボタンのみでペアリングOKとなった。

これまでの操作はUSBマウスで行い、Bluetoothマウスが使えるようになったらUSBマウスを抜く。
Bluetoothは、タイミングによってペアリングがうまくいかなかったりするので、何度かチャレンジしてみる。
ここまではコマンドを入力することもなく、簡単に作業が進むので、あえてブログに上げる人もいないかもしれない。

ラズパイはしばらく動かしていないとスリープ(?)して画面が黒くなるが、USBマウスだと、マウスを動かすことで目覚める。Bluetoothマウスだと、マウスを動かしても目覚めなかったので、キーボードからスペースキーを押すなどして目覚めさせるか、左または右クリックで目覚めさせる。
(2019.7.21追記 マウスのスリープモードはBluetoothかUSBかではなく、マウスそれぞれによって異なるようだ。)

キーボードをBluetoothでつなぐ
マウスがうまくいったので、キーボードもペアリングさせるが、ペアリング後のマウス動作がうまくない。しょっちゅう止まって、動かなくなる。しばらく待つと動くようになるが、原因がよくわからない。デスクトップ右上のBluetoothマークをクリックしておいて見ると、マウスのところが×印になるので、マウスがつながらなくなるのかもしれない。これは使用したキーボードの種類にもよるのかもしれない。
ちなみにキーボードはBluetooth 3.0 Class2。マウスは不明。
とりあえずマウス、キーボード両方をBluetooth接続することは今回は諦める。
(株)ピーナッツ・クラブで販売している
Bluetooth Multi Keyboard
これも中古ショップで購入。


2018.10.12追記
念のためキーボードを変えてテストしてみる。BUFFALOのBSKBB300WHであるが、結局同じ現象。ちなみに仕様がBluetooth 3.0 class2で全く同じ。

そこでマウスをBluetoothではなく、USBドングルを使う無線マウス(ELECOM M-DY11DR)にしたところ、Bluetoothの競合(?)がなくなったのか、どちらもうまく動くようになった。
Bluetoothではなく、無線マウス
スリープした後は、マウスを動かしても、キーボードのスペースキーでも(少し時間がかかるが)目覚める。

電源の再投入の際も、特に手続きは必要ないようだが、キーボードがすぐには反応せず、何回か押すと反応するようになる。また、最初に漢字変換キー(半角/全角キーに割当)を押すと、「’」が表示されて、日本語入力にならない。マウスで画面右上のキーボードマークをクリックして日本語入力にしてやると、その後は大丈夫のようだ。

最初はマウスでここをクリックして日本語入力にする


キーボード、マウスのケーブルでごちゃごちゃ

ケーブルが無くなってすっきり

ラズベリーパイ奮闘中(1)立ち上げ


初めに
すでに買って遊んでいるArduinoのIDE(開発環境)をWindowsXPにインストールしているが、若干不満があるので、(長いファイルネームが使えないとか、日本語がうまく使えないとか)やっぱり中古でもWindows7機でも買おうかと思っていた矢先、Raspberry PaiでもArduinoのIDEがインストールできるとわかって、買うことにした。安いのと、いろいろいじれる楽しみがあるのと、以前からLinuxには興味があったので、さっそくアマゾンで購入。

買ったのはRaspberry Pai3 ModelB。スピードも速そうだし、WiFi、Bruetoothが使えるのも利点。
公式のACアダプタ(容量が不足するとトラブルの元になるらしいので)とクリアケースも一緒に購入。放熱フィンもついていたが、後でいろいろ見ると、ファン付きを使っている例もあるようなので、夏のことを考えるとファン付きがよかったかな、と若干後悔。(値段もそれほど変わらないようだし)


参考にしたもの
ネット上のいろいろなブログが参考になるが、特に系統立ったものとしては、
Device PLUSの 「IT女子のラズベリーパイ入門奮闘記」
http://deviceplus.jp/hobby/raspberrypi_entry_056/

他にも立ち上げまでの手順はいろいろなところで書かれているが、ネット上の資料で注意が必要なのはそれが書かれた時期。
ネットでの情報は数年前のものもあるので、現在のバージョンと合わないものもあり注意が必要。



OSをマイクロSDに書き込む
この辺はどこで探しても親切丁寧な情報があるので迷うことはないだろう。
「IT女子のラズベリーパイ入門奮闘記」では、第57回が参考になる。

順番に、
1)SDカードのフォーマット
SDFornatterが必要。ダウンロードしたが、どうも画面が違う。マニュアルにある画面とも異なるので、何か設定があるのかと思ったが、見当たらずそのままフォーマットする。
Windowsで単純にフォーマットしたらWin32DiskImagerで認識されなかったので、これを用意する。

2)zipファイルの解凍(展開)
7-Zipで解凍。容量が1GByte以上もあるので、こういったソフトが必要らしい。

3)イメージファイルのコピーをする場合は
Win32DiskImagerでコピーをする。単なるファイルコピーではOSは起動しない。
なおNOOBSをダウンロードした場合はRaspberry Paiでインストールを行なうので、このソフトは不要。


Raspberry Paiでインストールかイメージファイルをダウンロードか
Raspbianを立ち上げるには、NOOBSのダウンロードとイメージファイルのダウンロードと2つのパターンがあるので、どちらにするか迷うところだが、両方やってみた結果では時間的に大差ないようだ。ダウンロードするPCの能力やネットワーク環境にも左右されるが、比較的貧弱なノートPCとWiFiでも、イメージファイルをダウンロードして書き込んだほうが若干早いように思える。
NOOBSからだと、イメージファイルのコピーはないが、Raspberry PaiでのRaspbianのインストールに1時間程度かかるようだ。
イメージファイルをSDカードに書き込む場合は、電源を入れてすぐRaspbianが立ち上がる。

NOOBSか、イメージファイルかの違いは、LANの環境があるかどうかも関係する。
Raspberry Paiの動作には、USBキーボード、USBマウス、HDMIのモニター、有線LANが必要とある。自宅では有線LANが部屋になく、WiFiのみしか使えないので、NOOBSからRaspbian以外のOSをインストールしようとすると、有線LANが必要なので、ルータがあるところで作業しなくてはならない。Raspbianであれば、とりあえずの立ち上げまではどちらのやりかたでもできて、その後にWiFiの設定をすればネットからのダウンロードもできるようになる。

なおRaspbianとしては、どちらのやりかたでも同じようにはなるが、両方を比べると、立ち上げ後の日本語環境の設定や表示には若干違いがあるようなので、注意が必要。


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)


2018年5月3日木曜日

ArduinoでSin波形を出力させる

アナログ出力のために
Arduino UNOにはアナログ出力がないので、デジタル出力をアナログに変換する。
外部にDAコンバータを用意する方法もあるが、簡易にはデジタル出力を利用して抵抗でDA変換をしてみる。
この辺は以下のサイトが詳しい。
http://mitt.la.coocan.jp/pic/pic7_16.html

8ビットのDA変換をするために、D2〜D9を使って図のような回路を組んだ。


予めSinの計算をして、配列に格納しておいたデータを使ったが、周期は13ms(約77Hz)となった。その都度Sinの計算をしたときには67ms(約15Hz)であった。



スケッチの一部を書くと、


予め計算していたSinData[kakudo]の8bitデータ(0x0000〜0x00ff)を、1ビットずつデジタル出力にHIGH,またはLOWで書き出す方法である。

スケッチを工夫して速度を上げる
デジタル出力にパラレルに出力できたらいいのに、と思っていたら、ちゃんとあった。
上と同じ内容を次のように変更。


PORTDはデジタル出力の0から7だが、0と1はシリアル通信に使われているので、2bitシフトして使っている。その分PORTBで2ビットを出力している。

このプログラムでSin波を出力させると、Sin波形の途中に異なった値のデータが、ヒゲのように出てしまう。原因はPORTDとPORTBの出力に時間差があるためで、アナログ値がその間本来と異なった値となってしまったため。
途中にヒゲが出ている
PORTDとPORTBの出力時間差を極力減らすため、次のように変更する。


PORTDとPORTBの出力の時間差が原因であることを確認するために、②を挿入してみた。
②がないと、ヒゲはほとんどなく、②を入れると、その時間だけ異なったデータが出る。
ヒゲがなくきれいな波形となる
 これによるSin波の周期は1.1ms、周波数は約910Hzである。forループ1回あたり(1度あたり)約3μsであるので、このくらいが限界かもしれない。周波数を上げるためには、5度おきに間引いて計算するなどが考えられるが、当然波形としては段差が目立ってきたなくなる。
5度おきに計算。階段状になる。

外部のDAコンバータ、MCP4726(12bit)を使用した場合


インターフェースはI2Cで、速さが100kHz、400kHz、3.4MHzと3段階あるようだが、その設定の仕方がよくわからない。しかし実際にSCL波形をオシロスコープで見ると、10μs周期なので、100kHzでの通信と考えられる。
予めSinθの計算をしたうえで出力させたが、12ビットで転送時間もかかるのか、出力の周期は115ms(約8.7Hz)となり、とても遅い。(単純計算では1度あたり320μsかかったことになる。通信量からするとこんなものか。)ただ、波形としてはヒゲもなく大変きれいである。0.5度ごとに計算して出力させるともっときれいになるだろう。

12ビットのDACなので、1度につき2バイト使って360度計算すると、RAMの54%を使ってしまった。
波形はヒゲもなくきれい。しかし遅い。




インターフェースをSPIにしてみる
I2Cは100kHzに対し、SPIは数十Mbpsも可能というので、次のような回路を組んでみた。

シフトレジスタは別基板に作った
シフトレジスタ74HC595を使ってデータを転送し、その出力を抵抗でDA変換するものである。ラッチで一斉にデータが変わるので、ヒゲは出ない。
このICは秋月電商で販売している7セグメントLED用に使われているもので、SPI.transfer()のコマンドでデータを転送する。
スピードアップのため、予めSinθを計算させておいてSinData[]に保存、その後順に出力する。

この結果、Sin波形の周期は約4.5ms(222Hz)となった。ラッチの周期は12μsだが、8ビットのデータ転送自体は2μsで終了している。digitalWriteの時間が結構かかっているようだ。

そこで、digitalWriteの代わりにPORTBコマンドを使ってみたのが以下のプログラムである。


ラッチにD10を使用しているので、直接制御している。

この結果、Sin波の周期は1.1msと、Arduinoのデジタル出力に直接抵抗をつけた場合(PORTコマンド使用)とほとんど変わらなくなった。ラッチの周期は3μsである。波形としては当然ヒゲもなくきれいなSin波になっている。

信号のタイミングを見ると、上がラッチ出力で、下がシリアルデータである。ラッチをLにした後、シリアルデータを出力。8ビットのデータを約2μsで送出し、その後ラッチをHにすることで、シフトレジスタの出力が変化する。

【UIAPduino】290円マイコンに書き込みができない

 290円マイコンで話題の【UIAPduino】を入手。スイッチサイエンスで一時在庫なしが続いていたが入荷、送料200円で購入できた。 スイッチサイエンスHPより Arduino IDEでプログラミングできるというので、お手軽だが、詳細は以下のサイトがとても詳しい。 ソースに絡ま...