2017年11月04日

OLED簡易オシロスコープの製作@ポートの設定(暫定)

DigoleSerialDisp mydisp(1,5,14); //SPI: Pin 1:data, 5:clock, 14:SS, you can assign 255 to SS, and hard ground SS pin on module

#define buttonPin01 2 // Button Pin on D2
#define button_State1 (CORE_PIN2_PINREG & (1<<0))

#define buttonPin02 3 // Button Pin on D3
#define button_State2 (CORE_PIN3_PINREG & (1<<12))

#define buttonPin03 4 // Button Pin on D4
#define button_State3 (CORE_PIN4_PINREG & (1<<13))

#define LED 6  //Blue LED
#define LED_ON (CORE_PIN6_PORTSET = (1<<4))
#define LED_OFF (CORE_PIN6_PORTCLEAR = (1<<4))

#define LEDgrn 19
#define LEDgrn_ON (CORE_PIN19_PORTSET = (1<<2))
#define LEDgrn_OFF (CORE_PIN19_PORTCLEAR = (1<<2))

#define LEDred 18
#define LEDred_ON (CORE_PIN18_PORTSET = (1<<3))
#define LEDred_OFF (CORE_PIN18_PORTCLEAR = (1<<3))

const int ad_ch0 = 20; // Analog 0 pin for channel 0
const int ad_ch1 = 21; // Analog 1 pin for channel 1

posted by Yasuski at 12:59| Arduino

2017年07月23日

Teensy3.6の修理を行う

開発中の短絡事故でオンボードの電源ICが破損したTeensy3.6の修理を行った。 

パワーソースを接続しても反応がなく、パソコンとの通信も行えない。 オンボードの電源ラインには正常な電圧が供給されておらず、電源ICの破損が疑わしい。 

IMG_7219.JPG

まず、破壊が予想される該当部品を撤去した後、ボードにピギーバックさせる形にユニバーサル基板を敷設し、そこに1117系の電源ICを取り付けた。

IMG_7221.JPG

改修後はパソコンからのデータアップロードが正常に行えるようになった。 入出力端子が死亡している可能性は残るが、とりあえず基幹部は正常に動作している模様。
posted by Yasuski at 06:32| Arduino

2017年01月31日

Arduino関連の資料2冊を購入する

値段は少々高価かったが、バーゲン価格になっていたのを機に在庫ラストを思い切って購入。 

A4サイズ/3cmと分厚い外観に圧倒されるも、中にはDigitalFilter等の有用な情報が詰まっていた。

51W3z4N9p4L.jpg

後日こちらも購入している。 記事の内容が殆ど被らないところが興味深い。

51UNDRtmcJL.jpg
posted by Yasuski at 23:21| Arduino

2016年12月24日

ArduinoIDE1.6.12でDueにスケッチのアップロードが行えない件

Dueへのアップロードが行えない問題は、このメソッドで解決するらしい。

具体的には、platform.txt内の記述、

tools.bossac.upload.pattern="{path}/{cmd}" {upload.verbose} --port={serial.port.file} -U {upload.native_usb} -e -w {upload.verify} -b "{build.path}/{build.project_name}.bin" -R

を、、、

tools.bossac.upload.pattern="{path}/{cmd}" {upload.verbose} --port={serial.port.file} -U {upload.native_usb} -e -w -b "{build.path}/{build.project_name}.bin" -R

に書き換えて、対応できるという。


他にも、別のファイルを改修するこんな記事を発見している。

後ほど、ファイルを書き換えて実験してみよう。
posted by Yasuski at 13:22| Arduino

2016年10月25日

USBマウスの製作

昨日は、軍用ラップトップのジャンクを復活させるために、マウスとキーボードの仕様を解析していたので、OpenTheremin関連の作業はポリ音源化のコードを書くのみで、現物系の作業はお休みした。

そのマウスというかポインティングデバイスがクセモノで、ポインターによって平面の上下左右方向に掛かる圧力を感圧素子が検知して、抵抗値をアウトする仕組みだった。 配線は黒がコモンで、隣の緑から順に下・右・上・左に圧力が掛けられた場合の抵抗値(変化は減少方向)が出力される。 抵抗値の変化はかなり急峻で、数MΩから20kΩ前後に数値が急変する。 そのため、ソフト側の加速度設定は必要が無いかもしれない。

この素子からマウスを実現するためにArduino/LeonardoをUSB HIDデバイスに仕立てあげるスケッチを見つけたが、単純にVRポットを2つ組み合わせた構造のものを対象にしているため、件のポインティングデバイスに応用するためには改造が必要となる。

ポインティングデバイスの出力はそのままでは使えないので、Rail to RailのOpAmpで抵抗値の変化を電圧値に変換し、これを4つのアナログポートに出力する。 Arduino側は、入力を4chに増やしつつ、負の変化をカウントするために新たな関数を追加しなければならない。 XY変化量のフルスケールは1024段階ということなので、これを512ずつ正負の値に分離してオフセットを掛ければなんとかなるだろうか???
posted by Yasuski at 06:53| Arduino

2016年10月16日

expansion boardが届いた

Teensy用のexpansion boardが届いたので、早速ピンの実装を行った。

14717147_1259918190705303_3715099529849125631_n.jpg

Teensy3.2の外周のピンを固定した後に、内側のダブルカラム状態のピンを取り付けるのは至難の技だった。

ブレッドボードで試作を行う場合は、ボードの端子配列の性格上、Teensy3.2の裏側に表面実装するピンを取り付けられない為に今回のような顛末に至ったのだが、expansion boardそのものを変換ソケットとすれば、最初からTeensy3.2に全てのピンを取り付けられる。

リセット端子のパターンが脆いのには要注意で、案の定pinの接続時に剥離をやらかしてしまったが、この製品は基盤の銅箔がかなり薄い代物なので、加熱には細心の注意が必要だ。 剥離に対する手当は、辛うじて残された配線パターンの切り端にハンダをメッキして端子を接続し、ブラブラ状態のそれをUV硬化タイプのエポキシ樹脂で固定したが、これはこの場所にピンを使用する場合には必ず必要な手当だろう。

もう一枚予備で購入したexpansion boardにはピギーバック用のコネクタを取り付けておいた方が良さそうだ。
posted by Yasuski at 08:34| Arduino

2016年10月11日

TeensyからMCP系DACにデータを送信するコードの覚書き

昨日からテストしているMCP4921へデータを送るためのサブルーチンはこんな感じにまとまった。

void MCP_OUT(uint16_t value){ //start of sequence
cli();
CS01_OFF;
SCK01_OFF;
//send the 12 bit sample data with dac config data on 4bit MSB
for(int k=15;k>=0;k--){
SCK01_OFF;
SI01_out = ((value & (1<>k;
if(SI01_out == LOW)
{
SI01_OFF;
}
else
{
SI01_ON;
}
SCK01_ON;
}
CS01_ON;
// LDAC01_OFF;
SI01_OFF;
SCK01_OFF;
// LDAC01_ON;
}


データを送る側では、

 temp_val = (datax | 0x7000 );
 MCP_OUT(temp_val);


のように、出力をコンフィグデータでラッピングしてから送信する。

送信するdataxが16bit幅以上の場合は、予め上位の不要なbitをシフトして桁合わせを行っておくこと。

なお、チップ内蔵DACのアウトプット A14 に出力するのは遥かに簡単で、

analogWrite(A14,(int)value);


と記述するだけだが、こちらも事前に桁合わせを確実に行う必要がある。
続きを読む
posted by Yasuski at 18:26| Arduino

2016年10月10日

Teensy3.2のNOP時間を計測する

ラジオテスト用のオシロは、入力レベルに問題があって、これは多分使用しているプローブが原因と思われるが、電圧が異常に低く表示されてしまう。

が、とりあえず波形の観測はなんとか行えたので、NOP1発の信号幅を計測してみた。

IMG_6405.JPG

ところが、理論的にはCPUの処理1サイクルのクロックが計測されるはずが、アウトプット端子の物理的な制約が生じたのか、最高速度はコードをどう弄っても2.5us止まりだった。 

一方、遅延時間の設定を行うためにfor文を使用する場合には、繰返しと判定のプロセスが介入する分の遅延が発生するようで、クロックの最高速度はNOP単体の倍以上遅い8usとなった。

何れの波形もデューティーサイクルが狂ってしまうのが特徴だが、8usの方はまだ矩形波の綺麗な形を保っていた。

一方、出力端子の物理的な制約を受けない「内部回路で繰り返し処理を重ねる方法」を使って実際の速度を計測したところ、for文でNOP2発を回した時の1秒に相当する回数は約8000000カウントだった。 これは、1.25usの遅延を意味するが、内部処理を行う場合はこの時間を目安にタイミングを測っていけば良いだろう。

IMG_6407.JPG

DACへのデータを読み出す場合は、出力ポートにダイレクトアクセスを行いつつプロセスを踏まえてタイミングを管理する出力構造なので、基本的には齟齬が発生する可能性は低いと思われる。 ただし、速度が低速なDACを使用する場合は、データの確定時間そのものを管理する必要があり、この場合はローカルでNOPを使った調整を行えば良いだろう。
posted by Yasuski at 04:12| Arduino

2016年10月04日

FTMの稼働状況を解析する

FTMの状態を可視化するために、シリアルポート経由でPCにデータの状態を反映させてみたところ、カウンタ自体は動作しているものの、カウンタの値を取り込むためのトリガーが全く動作していないことが判った。

問題の発生が、ポートのコンフィグを行うレジスタに起因するのか、FTMの設定そのものに瑕疵があるのか、明確には判らないが、どうもコンフィグレベルで何かがおかしい様に感じる。

場当たり的な問題の解決方法としては、カウンタの瞬間値を汎用レジスタに格納するオリジナルではINT0で行われていた方法をattatchInterruptを使って実現するだけなのだが、せっかくハードウエアに実装された機能が使えないのは勿体無いので、これまたTeensyのフォーラムに質問を投げることにした。
posted by Yasuski at 03:46| Arduino

2016年09月26日

Arduino@CorTexM系チップが搭載されたボードのDirectPortAccessに関して

今日はArduino工作の初歩の初歩、LEDチカを出力ピンにデータをダイレクトアクセスして実行するスケッチを使って、コンパイルの実験を行っていた。

IMG_6384.JPG

スケッチはご覧のように小学生の高学年レベルで楽勝な内容ではあるが、これがArduinoMega等AT328系のボードでは動作を確認できた。

WS000693.JPG

出力ピンにデータのダイレクトアクセスを行う意味は、異なるボード毎に通訳を行う「通常の命令セット」よりも格段にスピードが稼げることにあり、その分ボードの種類毎に違ったポート/ピン番号を入力する必要が生じる。

ところが、DueやTeensy等のCorTexM系ボードで同様の操作を行ったところ、コンパイルは通るものの、機能を全く実現できないことが判明した。

これは、すでに去年末の段階においてDue上で確認していた不具合だったが、全く修正が行われていない案件であり、早速Teensyのフォーラムに一件を書き込んでおいた。

まあ、クロックがAT328よりも5倍以上速いM3やM4で、時間を稼ぐ必要があるのか?と言われたらソレまでで、実際 digitalRead(Write)Fast なる命令セットも存在するわけだが、「マージンは稼げるところで稼ぐべき」という考え方も一面で真実と言えるので、もちっと粘ってみることにする。

追記:


その後、GPIOに直セスアクセスする命令セットを思い出して試してみたところ、、、

WS000694.JPG

出力は可能だったものの、入力のPDIR(PortDataInputRegister)は相変わらずの動作不能だった。

9月27日追記1:

フォーラムに質問を投げたところ、マクロセットの使用を提言する回答をもらった。

記述は以下のように行う。 bitの指定が必須ではあるが、ボードによって異なるGPIOのグループを参照しなくて良い点が便利だ。


#define LED_ON (CORE_PIN13_PORTSET = (1<<5))
#define LED_OFF (CORE_PIN13_PORTCLEAR = (1<<5))


ついでに入力レジスタにアクセスする

#define buttonState GPIOD_PDIR & (1 << 7)

および

#define buttonState (CORE_PIN5_PINREG & (1<<7))

の動作を確認した。  を取るのは、ポートレジスタにおける目的するBitの状態を抽出するため。

次に、ピンへの入力でLEDの点灯を行うスケッチに関して。

当初は回路の物理的な不備(DigitalPinがハイインピーダンスで放置)が原因と思われたが、

if(state1 == HIGH) {LED_ON};

とした場合、相変わらずLEDが点灯しない。

判定回路を

void loop() {
state1 = buttonState;
  if(state1 == LOW) {LED_OFF;}
  else {LED_ON;};
}


と判定の条件を反転することで、PINの読み込みを確認出来た。 

なお、プルダウンを行う前のピンの状態はかなり不安定で、全ての入力は予めソフト上でプルダウンしておくべきだろう。

今回は同時に attachInterrupt の動作確認を行った。

attachInterrupt(buttonPin01, blink, RISING);

この場合、blink がインターラプトのディスティネーションで、

void blink() {
LED_ON ; // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
LED_OFF ; // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}


のように、分岐先に処理を記述しておく。分岐先のサブルーチン化の手法がいまいち解らず、これの解明が今後の課題。

9月27日追記2:

AttatchInterrupt の状態判定を HIGH / LO 何れかの継続状態に設定することでサブルーチンのループ化が可能と解った。

WS000696.JPG

これを RISING / FALLING に設定すると、サブルーチンの処理は単発に行われ、ループは発生しない模様。
posted by Yasuski at 21:32| Arduino

2016年09月25日

Arduino@USBH_MIDIが更新される

ArduinoでUSBホストを実現できるUSBH_MIDI関連のファイルが更新されたので、以前トライしてダメだったiRigのキーボードのマウントに再挑戦することにした。

スペース効率の改善を考えて、今回はLeonardoにスケッチを書き込んでみる。

IMG_6381.JPG

IMG_6383.JPG

結果は、KORG系とiRig系は問題なく認識できたが、LaunchPadMiniは相変わらず沈黙状態だった。

LaunchPad系では、LaunchPad"S"専用のスケッチが発表されており、期待値が高かったのだが、残念ながら前述したようにUSBH_MIDIでは未だ認識が行えず、LaunchPadMiniのスタンドアロン化はまたもや見送りとなった。

ただ、Hubを通すと認識できるという話もあるので、とりあえず激安い2又のHubを購入して様子を見ることになる。

今回、iRigが使用可能になったことは大きな進歩で、以後、動作する機種は限定されてはいるものの、USB系の楽器をワイヤレスで使えることになった。
posted by Yasuski at 19:11| Arduino

2016年09月23日

ArduinoベースのPitchToMidi回路に関する覚え書き

数年前に作り掛けて放置していた案件を今一度検討する。

元ネタはこの記事で、Arduinoを使ってPitch検出を行い、対応する midi note を出力する仕掛けで、作者からコードと製作マニュアルのセットを購入した。

製作マニュアルではシリアル出力ポートに関する言及が曖昧だったので、コードを調べ直したところ AFSoftSerial SSerial(9); という記述がそれに該当する。 要は、D9(チップの 15番ピンに相当する) からLCD駆動用のシリアルデータが出力されている。 

なお、Arduinoのスケッチは拡張子が .pde の時代の産物なので、現行版ではコンパイル不能。 コードを書き換えるのが億劫なのでこのまま放置しているが、チップを焼く場合は、旧アルファ版 arduino0023 のIDEをインストールしなければならない。 複数台を製作するような場合は、念のためにコンパイル済のバイナリコードを保持しておいたほうが良いだろう。

今回は、製造に手間がかかるプリント基板を自作せずに、ユニバーサル基板に回路を組む方向で作業を進めている。

WS000688.JPG

ユニバーサル基板で回路を製作する場合、電源関連とグランドの配線が煩雑になってしまうが、単品を製造する場合はエッチングと孔開けを省略できるこの方法が一番だろう。

WS000689.JPG



posted by Yasuski at 16:39| Arduino

2015年12月28日

OledOscilloscope@RotaryEncoderの実装



RotaryEncoderのテストは未了だが、デフォルト設定下の動作は安定している模様。
posted by Yasuski at 09:42| Arduino

2015年12月27日

Oscilloscope@text表示の調整

IMG_5974.JPG

Oscilloscopeに表示するTextの位置がやっと決まった。

mydisp.setTextPosAbs(x,y);
mydisp.print(strings);
mydisp.nextTextLine();

の組み合わせで、表示位置が決まる。

nextTextLine(); で一旦区切らないと、y軸の設定が無視されることに注意。

あと、コード内のGLED関数は無効なので、これをOLED用に置き換える必要がある。

残るは、アナログ端子1ch分にまとめられている設定関連の端子を、複数のVRでコントロールを分担させるという手間の掛かりそうな作業だか、年内の貫徹は無理か、、、。
posted by Yasuski at 05:49| Arduino

2015年12月20日

ArduinoDue@Digole製OLEDのドライヴ



Kathminに搭載する予定のオシロスコープ製作の一貫で、OLEDのドライヴを実験している。

Adafruite製のOLEDとは仕様が違って、カラーの設定は8bit。しかも、色の指定は別途、指令の直前に行う必要がある。
posted by Yasuski at 23:48| Arduino

2015年11月18日

Teensy@Portへのダイレクト・アクセスを行う

Teensyが到着したので、Port直結のテストを行った。

その前に、ドライバーのインストールが必要だが、実機を接続せずにアプリをインストールした場合、USB/Serialが認識できずに躓く。 対処法は、アプリのインストーラーを管理者権限で起動して、ドライバーをインストールすることで解決する。

で、Port管理の実験。

まず、出力系は問題なく動いたが、入力系はDueと同様にアウトだった。もしかすると、IDE1.6.5特有の問題かもしれない。

記述は、(GPIOD_PDIR & (1 << 7)) としたが、全く反応無し。

試しに、digitalReadFast(portNumber) を試したところ、こちらはまともに反応した。

ということで、当面の間、読み出しはdigitalReadFastを使わざるを得ない雰囲気だ。
posted by Yasuski at 10:27| Arduino

2015年11月11日

ArduinoDue@IDEのバグが疑われる案件

実験の結果、最新IDE環境下のArduinoDueにおいて、 REG_PIOD_PDSR が稼働しないことが判明。 

#define buttonState1 (REG_PIOD_PDSR & (1 << 7))

では、入力信号は認識されない。

Teensyで使用不能な g_APinDescription を使った実験では、データを拾えていることから、ハードウエア上の問題は発生していないことが確定している。

一方、REG_PIOx_SODR / REG_PIOx_CODR を使った出力コントロールは以下のコードで問題なく行えていて、 

#define _ON REG_PIOA_SODR = (1 << 13) // LED pin D13
#define _OFF REG_PIOA_CODR = (1 << 13) // LED pin D1
3

ポートや、= (1 << n) を変更して、出力端子の指定をやり直した場合も、動作を確認出来ている。 以下に、Buttonスケッチを改定したテスト用のスケッチを記す。

const int buttonPin = 11; // the number of the pushbutton pin
const int ledPin = 13; // the number of the LED pin

const int bufPin = 16;  // buffers for testing the output routine
const int buf2Pin = 8;

// testing the g_APinDescription

inline void digitalWriteDirect(int pin, boolean val){
if(val) g_APinDescription[pin].pPort -> PIO_SODR = g_APinDescription[pin].ulPin;
else g_APinDescription[pin].pPort -> PIO_CODR = g_APinDescription[pin].ulPin;
}

inline int digitalReadDirect(int pin){
return !!(g_APinDescription[pin].pPort -> PIO_PDSR & g_APinDescription[pin].ulPin);
}

#define LED_ON REG_PIOB_SODR = (1 << 27) // direct assign to LED pin D13
#define LED_OFF REG_PIOB_CODR = (1 << 27) // direct assign to LED pin D13

#define _ON REG_PIOA_SODR = (1 << 13) // direct assign to test pin out
#define _OFF REG_PIOA_CODR = (1 << 13) //

//#define buttonState1 (REG_PIOD_PDSR & (1 << 7)) // does not works

int buttonState = 0; // variable for reading the pushbutton status
int buttonState1 = 0;
int buf = 0;
int buf2 = 0;

void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);

pinMode(buf2Pin, INPUT); // additional data buffers
pinMode(bufPin, OUTPUT);
}

void loop(){
buf = digitalReadDirect(11); // reading the data directly from the ports
buf2 = digitalReadDirect(8);

buttonState1 = buf2; // testing the external pin routine
buttonState = buttonState1;

// buttonState = (REG_PIOD_PDSR & (1 << 7)); //does not work

if (buf == HIGH) {
// digitalWriteDirect(ledPin, HIGH); // pin assignment with g_APinDescription
_ON;
}
else {
// digitalWriteDirect(ledPin, LOW); // pin assignment with g_APinDescription
_OFF;
}
if (buttonState == HIGH) {
// digitalWriteDirect(ledPin, HIGH); // pin assignment with g_APinDescription
LED_ON;
}
else {
// digitalWriteDirect(ledPin, LOW); // pin assignment with g_APinDescription
LED_OFF;
}
}



やはり、Teensyは実機で実験しないと、結果がわからないが、IDE側で発生している問題の可能性が高い。
posted by Yasuski at 19:01| Arduino

Teensy@導入前のまとめ:

昨日からリサーチしているTeensy関連のトピックをまとめた。

1)命令セットはM3とは別物で互換性はない。 

2)なので、当然ながらダイレクトアクセスな命令は以下の様に書き直し。

#define led 13 // LED on D13
#define LED_ON GPIOC_PSOR = (1 << 5) //Teency3.2 GPIOC 5
#define LED_OFF GPIOC_PCOR = (1 << 5) //Teency3.2

#define buttonPin01 5 // Button Pin on D5
#define buttonState GPIOD_PDIR & (1 << 7)


3)その他、Dueとは微妙に関数が異なる。

便利な g_APinDescription は使用不可だった。

4)スペース(ASCIIコード)に敏感。 Arduino本家系で無視されてたのが、Teensyでは不具合を指摘される。

不用意にタイプしている場合は、

warning: backslash and newline separated by space

と、即座にerrorが出される。

5)電源は3.3Vだが、デジタル系の入力だけ5Vまで許容出来る。

6)速読み(書き)関数、digitalRead(Write)Fastは実装済みな模様。

7)ASM命令でNOPが可能。 1NOPあたり45ns程度のディレイが発生する。

__asm__ __volatile__("NOP");

8)本家と同じく、端子の連番とポートの並びに関係性はない。

schematic32.gif

9)回路図によるポートの確認が必須だが、本家のような表は用意されていない。

teensy32_front_pinout.png

10)インターラプトの遅延が気になる場合は、こちらも直アクセスが可能だが、使用頻度の高そうな4bit幅のアドレスの設定方法がイマイチわからず。(多分、オフセットを掛けるのだろうが)

WS000528c.JPG

11)とりあえず、LEDチカチカで、直アクセス系の命令セットの動作確認を行い、、、

#define led 13 // LED on D13
#define LED_ON GPIOC_PSOR = (1 << 5) //Teency3.2 GPIOC 5
#define LED_OFF GPIOC_PCOR = (1 << 5) //Teency3.2

#define buttonPin01 5 // Button Pin on D5
#define buttonState GPIOD_PDIR & (1 << 7)

uint8_t state1 = 0;
volatile int state = LOW;
 
void setup() {
 
pinMode(led, OUTPUT);
pinMode(buttonPin01, INPUT);
attachInterrupt(buttonPin01, blink, RISING);
}
void blink() {
state = !state;
} 

void loop() {
state1 = buttonState;
if(state1 == HIGH) {LED_ON;}
else {LED_OFF;};

// if(state == HIGH) {LED_ON;}
// else {LED_OFF;};

LED_ON ; // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
LED_OFF ; // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}


12)次に手持ちのDACを接続して、単純な信号源をソースとしたバースト信号伝達の実験にトライする。

/*---------------------------------------------------------*/
/* AD420 Serial Input 16bit DAC example */
/* original code written by Vincenzo Pacella - www.shaduzlabs.com */
/*---------------------------------------------------------*/

//arduino output pins
#define LATCH 7
#define CLOCK 8
#define DATA 9

uint16_t j=0;

void setup()
{
pinMode(DATA, OUTPUT);
pinMode(CLOCK,OUTPUT);
pinMode(LATCH,OUTPUT);

digitalWriteFast(DATA,LOW);
digitalWriteFast(CLOCK,LOW);
digitalWriteFast(LATCH,LOW);
}

void writeValue(uint16_t value){
     //start of sequence
digitalWriteFast(LATCH,LOW);
digitalWriteFast(CLOCK,LOW);

//send the 16 bit sample data
for(int i=15;i>=0;i--){
digitalWriteFast(DATA,((value&(1<>i); //tck > 300ns

__asm__ __volatile__("NOP");
__asm__ __volatile__("NOP");
__asm__ __volatile__("NOP");
__asm__ __volatile__("NOP");
__asm__ __volatile__("NOP");
__asm__ __volatile__("NOP");
__asm__ __volatile__("NOP");
__asm__ __volatile__("NOP");
__asm__ __volatile__("NOP");
__asm__ __volatile__("NOP");

digitalWriteFast(CLOCK,HIGH);

;
__asm__ __volatile__("NOP");
__asm__ __volatile__("NOP");
__asm__ __volatile__("NOP");
__asm__ __volatile__("NOP");
__asm__ __volatile__("NOP");
__asm__ __volatile__("NOP");
__asm__ __volatile__("NOP");
__asm__ __volatile__("NOP");
__asm__ __volatile__("NOP");
__asm__ __volatile__("NOP");

digitalWriteFast(CLOCK,LOW);
}
   //latch enable, DAC output is set
digitalWriteFast(DATA,LOW);
digitalWriteFast(CLOCK,LOW);
digitalWriteFast(LATCH,HIGH); //tll > 80ns

__asm__ __volatile__("NOP");
__asm__ __volatile__("NOP");
__asm__ __volatile__("NOP");
__asm__ __volatile__("NOP");

digitalWriteFast(LATCH,LOW);
}

void loop()
{
//a 0 to 5V triangular waveform
for(j=0;j<65535;j+=5){
writeValue(j);
}
for(j=0;j<65535;j+=5){
writeValue(65535-j);
}
}

13)ADATとFPGAとの連携を、これも単純な信号源をソースとしたバースト信号を使って実験するが、信号管理のタイミングは外部供給によるSCK/WCKで行う。

といった感じでしょうか。
posted by Yasuski at 07:27| Arduino

2015年11月09日

Arduino@MidiLibraryの仕様変更について

Arduino/1.01時代に書いたスケッチが、最新版では動かなくなった。

アラートは以下のように表示された。

midiReader2x24e.ino: In function 'void setup()':
midiReader2x24e:27: error: 'MIDI' was not declared in this scope
midiReader2x24e.ino: In function 'void loop()':
midiReader2x24e:38: error: 'MIDI' was not declared in this scope
'MIDI' was not declared in this scope

解決法は、void setup(); の前に

MIDI_CREATE_DEFAULT_INSTANCE();

と記述すれば良い。

事前にインクルードファイルの記述を、

#include <midi_Namespace.h>
#include <midi_Settings.h>
#include <midi_Defs.h>
#include <MIDI.h>
#include <midi_Message.h>

としておくと、なにかと便利そうではある。

接続するLCDについて、一部電源端子の極性が異なっているものが存在することに注意。仕様を確かめないで接続した場合、LCDコントローラーが損壊する。

参考までにebayで安価に仕入れられる中国製LCDの仕様を以下に記録しておく。 このモデルはMotorMix等に使用した実績があるが、端子の配列はより一般的なものと思われる。

WS000552c.JPG




posted by Yasuski at 20:34| Arduino

2015年10月29日

ArduinoDue@DirectAccessのコマンドの間違いが発覚する。

今日はDueTimerを使ったSamplingClock生成実験の過程でLEDチカを行っていたのだが、実効速度の向上を目指してポートへのダイレクトアクセスを試みたところ、コレがどうやっても上手く行かない。 

とりあえず、LEDの点滅は行えたということで、ポートへのダイレクトな書き込みは問題なく行えていたものの、配置したスイッチに動作が反応しない。 これは、現状のコードではアサインを失敗しているということになるので、

#define BUTTON_STATE REG_PIOC_PSDR = 0x1 << 26

Dueのポートにダイレクトアクセスを行う記事の検索をかけたところ、ここで以下のように表記を単純化出来るコードを発見した。 

//accessing from the ports by digitalReadDirect/digitalWriteDirect.

inline void digitalWriteDirect(int pin, boolean val){
if(val) g_APinDescription[pin].pPort -> PIO_SODR = g_APinDescription[pin].ulPin;
else g_APinDescription[pin].pPort -> PIO_CODR = g_APinDescription[pin].ulPin;
}

inline int digitalReadDirect(int pin){
return !!(g_APinDescription[pin].pPort -> PIO_PDSR & g_APinDescription[pin].ulPin);
}


digitalRead(Write)Directと表記することで、簡単に高速化が行える。 コンパイルも通ったが、いろいろとやらかしてそうなので、頭を冷やした後にコードを精査しなければならない。

ついでにTimerを使ったTheremin用のReferenceOscillatorの実験を行った。 スイッチングをダイレクトアクセスで行うことで、400kHz前後の周波数に対応させている。 映像では200kHzから500kHzの間をsweepさせているが、高調波の存在が少々気になった。 オシロスコープで波形を観測していないのでなんとも言えないが、やや怪しげな雰囲気ではある。

TimerをOscillatorとして使うのには目的があって、温度/湿度センサーとの組み合わせによって、搭載しているアナログなOscillatorの周波数ドリフトを相殺できないか?という発想だ。理想はDDSだが、そこまでの精度を要求しないレベルで、実用度を確かめていきたい。

posted by Yasuski at 17:06| Arduino