MCUプログラミングmcuプログラムでdebug_print文で継続的に出力を行ったらCPU自体の処理が重くなり無線LANへの接続もままならなくなった。USBケーブルでシリアル接続するとなんとかコマンドは打てるが反応が鈍い。してMCUにダウンロードしたプログラムを削除したいところ。ディレクトリを探したところ、MCU関連では次のようなディレクトリを発見した。intel_mcu.binこんな感じ。intel_mcu.binがダウンロードしたバイナリっぽい。ダメ元でこれを削除して、ボードを再起動したところ復活した。debug_printの大量の出力には注意が必要。Time_usの不具合MCUをプログラミングしてみたものの、どうも怪しげな動作をする。mcu_delayやtime_us関数が期待通り動作しない。メインCPUとデータをやり取りすると、経過時間のカウンタが大幅に増える(それも何秒分も)。ググってみると、インテルのディスカッションに類似のやり取りを見つけた。2016年2月の時点で未対処、5月6日にファームや開発環境(Mac)を最新化したものの、事象は変わらず。これではmsecオーダでのリアルタイム処理を求めるような制御システムには使えない。対処にこれだけ時間がかかっているところを見ると、ハードウェアレベルの問題なのか、もともとそのようなリアルタイム処理向けを重要視していないものなのだろう。方針転換して、ArduinoやPICでの制御を考えることにした。SPIEdisonにmraaを使って3軸センサMCU-9250の接続を試みた。I2Cは容易に接続できたが、SPIでは接続できず。その過程でSPIの仕様を色々調べてみた結果、MCU-9250にはI2Cを使う方が良さそう。[SPIの仕様]・I2Cと違って、受信データは送信データとタイミングを取れない。MCU-9250に向かって読み取りレジスタアドレスを送信しても、次のバイトデータで情報を取得できるとは限らない。・全二重なのでストリームデータを流すような送受で独立な通信に向いている。[MCU-9250の仕様]・SPIを使った通信方法の情報が少ない。・マニュアルを見る限りではどのようにすればI2Cのようなバーストデータの取得ができるか不明。400kHz)・SPIから磁気センサへのアクセスするはMCU-9250に内蔵されているI2Cマスター機能を使わなければならず煩雑。<追記>saleaeのロジックアナライザLogic4を購入したので動作を確認した。mraaのwriteByteでは8クロックのみが出力され受信ができていない。;}transferを使ってもセンサーから返る値は安定しない。PICとのI2Cレベル変換ICによる接続EdisonのI2Cは1.8V、これに3.3VのPICのI2Cに接続するために、レベル変換IC(PCA9306)を利用した。購入したのは秋月のAE-PCA9306。秋月の説明書には記載がないが、VREF2側を高電圧側(このケースではPIC)に接続する必要があることに注意が必要。board)にはプルアップ抵抗が実装済みなので、AE-PCA9306のプルアップ抵抗を無効(パターンを切断)しなければならない。PIC側(VREF2側)のプルアップ抵抗(1kΩ)をそのまま使ったところ正しく動作しない。Edison側の信号を見てみるとSDAがLOWに落ちるものの続くシーケンスが進んでおらず、アナログ信号の変化も不十分である。PIC側の電圧が十分に下がらずPCA9306がPIC側がHレベルであると誤認しているようである(一つ目の写真)。このあたりについては、こちらのサイトに詳しい。PIC側のプルアップ抵抗のパターンも削除して波形を観測すると正しく動作した。PIC側はプルアップしないとHレベルは1.8V程度なのでこのままでは通信できない(二つ目の写真)。PIC側に4.7kのプルアップをSCLとSDAに接続したところレベル変換もできるようになった(三つ目の写真)。通信速度も400kHz程度でている。readByteでPICをslaveとしたデータを読み取ろうとしたら、0x80は読めても0x70が読めない。MSBがHIGHかLOWの違いでクロックが再開しない(一つ目の図)。SDAがなぜSCLに影響を与えているか(STOPビットとして誤認?)はわからないが、I2Cレベル変換IC(PCA9306)について詳細に解説したサイトがあった。これによると、コンデンサを挿入すると改善する可能性があるらしい。この事象もタイミング問題のように思われるので、スレーブ側(PIC側3.3V)にコンデンサ100pFを、SCLとSDAに挿入したところ正しく動作するようになった。(二つ目の図)三つ目の図はスレーブ側のコンデンサ挿入後の波形であるが、ピークの電圧が2.1V程度まで下がっており、最低基準の2.0Vギリギリである。一つ前の記事で記載したようにプルアップ抵抗4.7kΩでは100pFよりもやや小さい方が望ましい思われる。400kHzの周期は2.5μsec(Hレベルの保持期間は1/4の0.625μsec)となるが、これよりは実際の時定数は長いようである。PCA9306は双方向であるがために挙動が難しく、プルアップ抵抗やコンデンサを注意深く調整する必要なようだ。PWMサーボ(ESC)を制御するためにPWMを使う。mraaでは次のようなコードだけで制御できるので簡単。50%なお、コンストラクタで設定するpin番号は物理的なピン番号です。14番ピンはPWM1になります。periodはPWMの周期です。こちらのサイトにも記載されているように、50msecを指定しても正確に50msecにはならず、54.613msecになります。実際ロジアナで見てみてもその値でした。サーボ制御くらいなら問題ないかもしれませんが、正確な組み込み制御にはEdisonは不向きかもしれません。当然ながら、Edisonのロジックレベルは1.8Vなので、サーボ(ESC)との接続にはレベル変換(3.3V/5V)が必要です。Trademarks。